Azure Service Fabric Actors – 未处理的exception?
现在我们的ASF集群正在运行:
- Web API项目 – 无状态和面向公众
- Actor项目 – 主要是volatile,将数据保存在内存中,由某些API使用
我们正在尝试Application Insights,我可以设置未处理的错误跟踪,就像他们的文档对我们的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
,它是负责向actor调度操作的类class CustomActorServiceRemotingDispatcher : ActorServiceRemotingDispatcher { public CustomActorServiceRemotingDispatcher(ActorService actorService) : base(actorService) { } public override async Task
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
来添加它们) - 相同的技术可以应用于Reliable Services(使用
ServiceRemotingDispatcher
类)
- 您也可以使用此方法来读取您自己的标题(您还需要一个客户端自定义
不,今天没有全球的地方可以从演员框架中的演员抛出exception。 框架本身确实捕获了由actor运行时管理的方法引发的exception – 这些是您的actor接口方法(可从ActorProxy调用的方法),计时器回调,提醒回调和基本actor重写,如OnActivateAsync – 但它们’不会通过actor API公开。