2016-05-12 49 views
8

現在我們的ASF集羣正在運行:Azure服務結構參與者 - 未處理的異常?

  • 的Web API項目 - 無狀態的,面向公衆的
  • 演員項目 - 主要是揮發,保持在內存中的數據,通過某些API

我們使用試用Application Insights,我可以設置未處理的錯誤跟蹤,如他們的文檔here對於我們的Web API項目。

問題是,我也想爲我們的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; 
    } 
} 

回答

3

您有幾種選擇:

  • 演員確實有一個內置有一個ActorMethodThrewException事件ETW提供商(Microsoft-ServiceFabric-Actors)。您可以:

    • 使用外部程序來收集ETW事件,並轉發給應用洞察(例如使用板或Azure診斷)
    • 使用EventListener類聽進程的事件,並將它轉發到App洞察(略少可靠,但更簡單)
  • 使用自定義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類)
+0

我想'ActorServiceRemotingDispatcher'貌似對我來說是最好的選擇,我給它一個鏡頭。 – jonathanpeppers

1

沒有,沒有全局的地方獲得的演員,從演員拋出的異常框架今天。框架本身確實捕獲由actor運行時管理的方法拋出的異常 - 這些是您的actor actor接口方法(可從ActorProxy調用的方法),定時器回調,提醒回調以及像OnActivateAsync這樣的基本actor重寫 - 但它們通過演員API不公開。