我有一个服务结构项目 - 有一个主持公共webapi层的APIGateway(Facade)。它通过Fabric Remoting v2与几个不同的微服务(不公开)进行对话。
现在,我想将一个TraceId(基本上是HttpContext.TraceIdentifier)从APIGateway服务传递给Microservice进行跟踪/记录。我看到FabricTransportServiceRemotingClientFactory对象(它是客户端svc代理)采用TraceId,这很棒。但是,如何在侦听器端访问此traceId ,以便记录器可以发出该traceid,这样我最终可以使用相同的traceId在同一个Http请求中跨多个服务搜索所有日志。
APIGateway(客户端)代码
public MyController()
{
// explicitly create V2 remoting client (as listener is V2)
var proxyFactory = new ServiceProxyFactory((c) =>
{
return new FabricTransportServiceRemotingClientFactory(
traceId: traceIdentifier // <--- from HttpContext, for logging
);
});
_svcProxy = proxyFactory.CreateServiceProxy<IMyService>(
ServiceUri,
listenerName: MyMicroservice.Models.Constants.ListenerName);
}
答案 0 :(得分:0)
ServiceContext
有一个你可以使用的属性TraceId
。见the docs
示例:
public sealed class Stateless1 : StatelessService, IStateless1
{
public Stateless1(StatelessServiceContext context)
: base(context)
{ }
public string SayHello()
{
return $"Hello World (traceid: {Context.TraceId}";
}
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
return new[]
{
new ServiceInstanceListener((c) => new FabricTransportServiceRemotingListener(c, this))
};
}
}