2016-09-14 74 views
1

對於蔚藍演員服務,Actor Method Start Stop登錄診斷窗口,如下所示。演員方法開始/停止日誌|添加附加信息

如何在每次調用方法時添加一些附加細節,如相關標識?

{ 
    "Timestamp": "2016-09-14T19:46:40.9955448+05:30", 
    "ProviderName": "Microsoft-ServiceFabric-Actors", 
    "Id": 7, 
    "Message": "Actor method is being invoked. Method name: IStore.GetStoreById, actor type: Backend.Actor.Store.Store, actor ID: STORE_6.", 
    "ProcessId": 30736, 
    "Level": "Verbose", 
    "Keywords": "0x0000F00000000002", 
    "EventName": "ActorMethod/Start", 
    "Payload": { 
    "methodName": "IStore.GetStoreById", 
    "methodSignature": "System.Threading.Tasks.Task`1[Backend.Models.Store.StoreView] GetStoreById(System.String)", 
    "actorType": "Backend.Actor.Store.Store", 
    "actorId": "STORE_6", 
    "actorIdKind": 2, 
    "replicaOrInstanceId": 131183360004211655, 
    "partitionId": "8af1c125-3666-40d0-b630-e3570c41833b", 
    "serviceName": "fabric:/MultiBannerBackend/StoreActorService", 
    "applicationName": "fabric:/MultiBannerBackend", 
    "serviceTypeName": "StoreActorServiceType", 
    "applicationTypeName": "MultiBannerBackendType", 
    "nodeName": "_Node_4" 
    } 
} 

回答

0

爲了記錄的數據給每個演員的操作,您可以使用這些方法:

protected override Task OnPreActorMethodAsync(ActorMethodContext c) 
protected override Task OnPostActorMethodAsync(ActorMethodContext c) 

爲了得到通話情況下,我發現CallContext.LogicalGetData不在這種情況下工作。演員本身幸運地知道它的上下文。你可以用一些反思來獲得它。

例如:

protected override Task OnPreActorMethodAsync(ActorMethodContext c) 
     { 
      var correlationID = this.GetActorContext() ?? Guid.Empty.ToString("N"); 
      string message = $"Actor method is being invoked. Method name: {c.MethodName}, actor type: {GetType().FullName}, actor ID: {Id}, CorrelationID:{correlationID}"; 
      ActorEventSource.Current.ActorMessage(this, message); 
      return Task.FromResult(true); 
     } 

     protected override Task OnPostActorMethodAsync(ActorMethodContext c) 
     { 
      var correlationID = this.GetActorContext() ?? Guid.Empty.ToString("N"); 
      string message = $"Actor method has completed. Method name: {c.MethodName}, actor type: {GetType().FullName}, actor ID: {Id}, CorrelationID:{correlationID}"; 
      ActorEventSource.Current.ActorMessage(this, message); 
      return Task.FromResult(true); 
     } 

結合:這

public static class ActorContextExtensions 
    { 
     public static string GetActorContext(this Actor actor) 
     { 
      var concurrencyLockProperty = GetPropertyInfo("ConcurrencyLock", typeof(ActorBase)); 
      var concurrencyLockPropertyValue = concurrencyLockProperty.GetValue(actor); 

      var currentContextProperty = GetPropertyInfo("Test_CurrentContext", concurrencyLockPropertyValue.GetType()); 
      string currentContextPropertyValue = (string)currentContextProperty.GetValue(concurrencyLockPropertyValue); 
      return currentContextPropertyValue; 
     } 

     private static PropertyInfo GetPropertyInfo(string propertyName, IReflect owner) 
     { 
      var property = owner.GetProperty(propertyName, BindingFlags.NonPublic | BindingFlags.Instance); 
      if (property == null) throw new InvalidOperationException($"Failed to find property '{propertyName}' on '{owner}'."); 
      return property; 
     } 
    } 

很明顯的不足,就是每當ActorBase變化的內部,則需要相應地改變你的反射代碼。

+0

非常感謝,這正是我一直在尋找的。 – user1800524