Azure Service Fabric 参与者 - 未处理的异常?
Azure Service Fabric Actors - unhandled exceptions?
现在我们的 ASF 集群是 运行:
- Web API 项目 - 无状态且 public 面向
- Actor 项目 - 主要是不稳定的,将数据保存在内存中,由某些 APIs
使用
我们正在试用 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 框架中没有全局位置可以获取 actor 抛出的异常。框架本身确实捕获了由 actor 运行时管理的方法抛出的异常 - 这些是您的 actor 接口方法(可从 ActorProxy 调用的方法)、计时器回调、提醒回调和基本 actor 覆盖,如 OnActivateAsync - 但它们'不通过演员曝光API.
您有几个选择:
Actor 确实有一个 built-in ETW 提供程序 (Microsoft-ServiceFabric-Actors
),它有一个 ActorMethodThrewException
事件。您可以:
- 使用外部进程收集 ETW 事件并将它们转发到 Application Insights(例如使用 SLAB 或 Azure 诊断)
- 使用
EventListener
class 监听事件 in-process 并将其转发到 App Insights(可靠性稍差,但更简单)
使用自定义 ActorServiceRemotingDispatcher
,这是 class 负责将操作分派给 actor
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;
}
}
}
要使用此 class,您需要创建自定义 ActorService
class 并覆盖 CreateServiceReplicaListeners
方法。请注意,这将覆盖您可能正在使用的任何 ActorRemotingProviderAttribute
。
旁注:
- 您也可以使用此方法阅读您自己的 headers(您还需要 client-side 自定义
IServiceRemotingClientFactory
来添加它们)
- 可以将相同的技术应用于 Reliable Services(使用
ServiceRemotingDispatcher
class)
现在我们的 ASF 集群是 运行:
- Web API 项目 - 无状态且 public 面向
- Actor 项目 - 主要是不稳定的,将数据保存在内存中,由某些 APIs 使用
我们正在试用 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 框架中没有全局位置可以获取 actor 抛出的异常。框架本身确实捕获了由 actor 运行时管理的方法抛出的异常 - 这些是您的 actor 接口方法(可从 ActorProxy 调用的方法)、计时器回调、提醒回调和基本 actor 覆盖,如 OnActivateAsync - 但它们'不通过演员曝光API.
您有几个选择:
Actor 确实有一个 built-in ETW 提供程序 (
Microsoft-ServiceFabric-Actors
),它有一个ActorMethodThrewException
事件。您可以:- 使用外部进程收集 ETW 事件并将它们转发到 Application Insights(例如使用 SLAB 或 Azure 诊断)
- 使用
EventListener
class 监听事件 in-process 并将其转发到 App Insights(可靠性稍差,但更简单)
使用自定义
ActorServiceRemotingDispatcher
,这是 class 负责将操作分派给 actorclass 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; } } }
要使用此 class,您需要创建自定义
ActorService
class 并覆盖CreateServiceReplicaListeners
方法。请注意,这将覆盖您可能正在使用的任何ActorRemotingProviderAttribute
。旁注:
- 您也可以使用此方法阅读您自己的 headers(您还需要 client-side 自定义
IServiceRemotingClientFactory
来添加它们) - 可以将相同的技术应用于 Reliable Services(使用
ServiceRemotingDispatcher
class)
- 您也可以使用此方法阅读您自己的 headers(您还需要 client-side 自定义