FabricTransportServiceRemotingClientFactory TraceId - 如何在服务端访问它?

时间:2018-04-24 04:39:51

标签: azure-service-fabric .net-remoting

我有一个服务结构项目 - 有一个主持公共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);
    }

1 个答案:

答案 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))
        };
    }
}