现在我们的 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
类)
- 您也可以使用此方法读取自己的 header (您还需要客户端自定义
关于c# - Azure Service Fabric 参与者 - 未处理的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37191068/