2016-05-12 19 views
8

Teraz nasz klaster ASF jest uruchomiony:Azure Service Fabric Actors - nieobsługiwane wyjątki?

  • projekt API Web - bezpaństwowcem i publiczne stoi
  • projekt aktora - głównie lotne, przechowywania danych w pamięci używane przez niektórych API

Jesteśmy wypróbowanie Insightów aplikacji i mogę skonfigurować nieobsługiwane śledzenie błędów, takie jak ich dokumenty here dla naszego projektu Web API.

Problem, chcę tego również dla naszego projektu Aktora.

Czy istnieje globalne miejsce do chwytania nieobsłużonych błędów w obrębie aktora? Wiem, że jest nowy i być może dlatego nie mogę znaleźć dokumentacji na ten temat.

Teraz robię to wewnątrz każdej metody aktorem, ale nie wydaje się świetnym rozwiązaniem:

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; 
    } 
} 

Odpowiedz

3

Masz kilka opcji:

  • Aktorzy mają wbudowany dostawcy ETW (Microsoft-ServiceFabric-Actors), który ma zdarzenie ActorMethodThrewException. Można:

    • Użyj zewnętrznego procesu gromadzić zdarzenia ETW i przekazuje je do aplikacji Insights (na przykład za pomocą płytowych lub Azure Diagnostics)
    • użyć klasy EventListener wysłuchać wydarzeń w procesie i przekazuje je APP Insights (nieco mniej wiarygodne, ale prostszym)
  • użyć niestandardowego ActorServiceRemotingDispatcher, który jest odpowiedzialny za dysponowanie klasa operacje aktorów

    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; 
          } 
        } 
    } 
    

    Aby użyć tej klasy, musisz utworzyć niestandardową klasę i zastąpić metodę CreateServiceReplicaListeners. Zauważ, że spowoduje to zastąpienie wszystkich używanych przez Ciebie ActorRemotingProviderAttribute.

    notatki uboczne:

    • Można również użyć tej metody, aby czytać swoje własne nagłówki (trzeba również po stronie klienta zwyczaj IServiceRemotingClientFactory je dodać)
    • Ta sama technika może być zastosowana do niezawodne usługi (z wykorzystaniem klasę ServiceRemotingDispatcher)
+0

myślę 'ActorServiceRemotingDispatcher' wygląda najlepszym rozwiązaniem dla mnie, dam mu szansę. – jonathanpeppers

1

Nie, nie ma globalnego miejsce, aby wyjątki rzucane z aktorem w aktora ramy dzisiaj. Struktura sama w sobie przechwytuje wyjątek wyrzucony z metod zarządzanych przez środowisko wykonawcze aktora - są to metody interfejsu aktora (te, które można wywoływać z ActorProxy), wywołania czasowe, wywołania zwrotne przypomnień i nadpisania aktorów bazowych, takie jak OnActivateAsync - ale nie są odsłonięte przez API aktora.