Right now our ASF cluster is running:
We are trying out Application Insights, and I can setup unhandled error tracking like their docs here have for our Web API project.
Issue is, I want this for our Actor project as well.
Is there a global place for catching unhandled errors within an Actor? I know it's new, and maybe that is why I can't find documentation on this.
Right now I'm doing this inside every actor method, but doesn't seem like a great solution:
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;
}
}
Service Fabric is an open source project and it powers core Azure infrastructure as well as other Microsoft services such as Skype for Business, Intune, Azure Event Hubs, Azure Data Factory, Azure Cosmos DB, Azure SQL Database, Dynamics 365, and Cortana.
Access the logs of a running container In a web browser, open Service Fabric Explorer from the cluster's management endpoint by navigating to http://mycluster.region.cloudapp.azure.com:19080/Explorer . Container logs are located on the cluster node that the container service instance is running on.
Azure Service Fabric is a distributed systems platform that makes it easy to package, deploy, and manage scalable and reliable microservices and containers. Service Fabric also addresses the significant challenges in developing and managing cloud native applications.
You have a few options:
Actors do have a built-in ETW provider (Microsoft-ServiceFabric-Actors
) that has an ActorMethodThrewException
event. You can either:
EventListener
class to listen to the events in-process and forward it to App Insights (slightly less reliable, but simpler)Use a custom ActorServiceRemotingDispatcher
, which is the class responsible for dispatching operations to the actors
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;
}
}
}
To use this class, you'll need to create a custom ActorService
class and override the CreateServiceReplicaListeners
method. Note this will override any ActorRemotingProviderAttribute
s you may be using.
Side notes:
IServiceRemotingClientFactory
to add them)ServiceRemotingDispatcher
class)No, there is no global place to get exceptions thrown from an actor in the actor framework today. The framework itself does catch exception that are thrown from methods that are managed by the actor runtime - these are your actor interface methods (the ones that are callable from ActorProxy), timer callbacks, reminder callbacks, and base actor overrides like OnActivateAsync - but they're not exposed through the actor API.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With