Azure Service Fabric 参与者 - 未处理的异常?

Azure Service Fabric Actors - unhandled exceptions?

现在我们的 ASF 集群是 运行:

我们正在试用 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 框架中没有全局位置可以获取 actor 抛出的异常。框架本身确实捕获了由 actor 运行时管理的方法抛出的异常 - 这些是您的 actor 接口方法(可从 ActorProxy 调用的方法)、计时器回调、提醒回调和基本 actor 覆盖,如 OnActivateAsync - 但它们'不通过演员曝光API.

您有几个选择:

  • Actor 确实有一个 built-in ETW 提供程序 (Microsoft-ServiceFabric-Actors),它有一个 ActorMethodThrewException 事件。您可以:

    • 使用外部进程收集 ETW 事件并将它们转发到 Application Insights(例如使用 SLAB 或 Azure 诊断)
    • 使用 EventListener class 监听事件 in-process 并将其转发到 App Insights(可靠性稍差,但更简单)
  • 使用自定义 ActorServiceRemotingDispatcher,这是 class 负责将操作分派给 actor

    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;
                }
        }
    }
    

    要使用此 class,您需要创建自定义 ActorService class 并覆盖 CreateServiceReplicaListeners 方法。请注意,这将覆盖您可能正在使用的任何 ActorRemotingProviderAttribute

    旁注:

    • 您也可以使用此方法阅读您自己的 headers(您还需要 client-side 自定义 IServiceRemotingClientFactory 来添加它们)
    • 可以将相同的技术应用于 Reliable Services(使用 ServiceRemotingDispatcher class)