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

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

最佳答案

您有几个选择:

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

    • 使用外部进程收集 ETW 事件并将它们转发到 Application Insights(例如使用 SLAB 或 Azure Diagnostics)
    • 使用 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 来添加它们)
    • 可以将相同的技术应用于 Reliable Services(使用 ServiceRemotingDispatcher 类)

关于c# - Azure Service Fabric 参与者 - 未处理的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37191068/

相关文章:

c# outlook 插件 - 在本地存储数据

c# - 如何在 &lt;script&gt; _Layout.cshtml 中使用 properties.settings.default

c# - 如何检查字节数组是否是有效的pdf文件

c# - 如何为每个 xUnit.net 测试方法使用单独的 AppDomain?

azure - 注销在 Microsoft Azure Web App 中不起作用

android - 在 Android 中调用 .NET Web API Post Service 发送空消息

c# - Visual Studio 2010 : dependency graph

c# - 这种嵌套锁定会导致死锁吗?

c# - 如何使用 OWIN、OAuth 和 Web API 获取授权码?

c# - 使用insert方法绕过sql注入(inject)