现在,我们的ASF集群正在运行:

  • Web API项目-无状态且面向公众的
  • Actor项目-大部分易失,将数据保存在内存中,由某些API使用

  • 我们正在试用Application Insights,并且我可以像他们的here文档一样为我们的Web API项目设置未处理的错误跟踪。

    问题是,我也希望我们的Actor项目也能做到这一点。

    是否存在在Actor中捕获未处理的错误的全局场所?我知道它是新的,也许这就是为什么我找不到关于此的文档。

    现在,我正在每个actor方法中执行此操作,但似乎不是一个很好的解决方案:
    public async Task DoStuff()
    {
        try
        {
            //Do all my stuff
        }
        catch (Exception exc)
        {
            //Send to Windows Event Source
            ActorEventSource.Current.ActorMessage(this, "Unhandled error in {0}: {1}", nameof(DoStuff), exc);
    
            //Send to Application Insights
            new TelemetryClient().TrackException(exc);
    
            throw exc;
        }
    }
    

    最佳答案

    您有几种选择:

  • Actor确实具有一个内置的ETW提供程序(Microsoft-ServiceFabric-Actors),该提供程序具有ActorMethodThrewException事件。您可以:
  • 使用外部过程来收集ETW事件并将其转发到Application Insights(例如,使用SLAB或Azure诊断程序)
  • 使用EventListener类监听正在进行的事件,并将其转发到App Insights(可靠性稍差,但更简单)
  • 使用自定义ActorServiceRemotingDispatcher,该类是负责向操作者分派(dispatch)操作的类
    class CustomActorServiceRemotingDispatcher : ActorServiceRemotingDispatcher
    {
        public CustomActorServiceRemotingDispatcher(ActorService actorService) : base(actorService)
        {
        }
    
        public override async Task<byte[]> RequestResponseAsync(IServiceRemotingRequestContext requestContext, ServiceRemotingMessageHeaders messageHeaders,
            byte[] requestBodyBytes)
        {
                try
                {
                    LogServiceMethodStart(...);
    
                    result = await base.RequestResponseAsync(requestContext, messageHeaders, requestBodyBytes).ConfigureAwait(false);
    
                    LogServiceMethodStop(...);
    
                    return result;
                }
                catch (Exception exception)
                {
                    LogServiceMethodException(...);
    
                    throw;
                }
        }
    }
    

    要使用此类,您需要创建一个自定义的ActorService类并覆盖CreateServiceReplicaListeners方法。请注意,这将覆盖您可能正在使用的所有ActorRemotingProviderAttribute

    旁注:
  • 您还可以使用此方法读取自己的 header (还需要客户端自定义IServiceRemotingClientFactory来添加 header )
  • 可以将相同的技术应用于可靠服务(使用ServiceRemotingDispatcher类)
  • 关于c# - Azure Service Fabric Actor-未处理的异常?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37191068/

    10-10 19:15