现在我们的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;
}
}
答案 0 :(得分:6)
您有几个选择:
演员确实有一个内置的ETW提供程序(Microsoft-ServiceFabric-Actors
),它有ActorMethodThrewException
个事件。你可以:
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公开。