Azure Service Fabric Actors - 未处理的异常?

时间:2016-05-12 15:15:23

标签: c# .net asp.net-web-api azure-service-fabric

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

  • Web API项目 - 无国籍且面向公众
  • Actor项目 - 主要是volatile,将数据保存在内存中,由某些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;
    }
}

2 个答案:

答案 0 :(得分:6)

您有几个选择:

  • 演员确实有一个内置的ETW提供程序(Microsoft-ServiceFabric-Actors),它有ActorMethodThrewException个事件。你可以:

    • 使用外部流程收集ETW事件并将其转发到Application Insights(例如,使用SLAB或Azure诊断)
    • 使用EventListener类收听正在处理的事件并将其转发到App Insights(稍微不那么可靠,但更简单)
  • 使用自定义ActorServiceRemotingDispatcher,这是负责向演员分派操作的类

    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

    附注:

    • 您也可以使用此方法来阅读自己的标题(您还需要一个客户端自定义IServiceRemotingClientFactory来添加它们)
    • 可以将相同的技术应用于可靠服务(使用ServiceRemotingDispatcher类)

答案 1 :(得分:1)

不,今天没有全球的地方可以从actor框架中的actor中抛出异常。框架本身确实捕获了由actor运行时管理的方法引发的异常 - 这些是您的actor接口方法(可从ActorProxy调用的方法),计时器回调,提醒回调和基本actor重写,如OnActivateAsync - 但它们'不会通过actor API公开。