FabricTransportServiceRemotingClientFactory TraceId, как получить к нему доступ на стороне сервиса?

У меня есть проект сервисной фабрики — есть APIGateway (фасад), на котором размещен общедоступный слой webapi. Он общается с несколькими различными микросервисами (не публикуемыми публично) через Fabric Remoting v2.

Теперь я хочу передать TraceId (в основном HttpContext.TraceIdentifier) ​​из службы APIGateway в микрослужбы для целей отслеживания/регистрации. Я вижу, что объект FabricTransportServiceRemotingClientFactory (который является прокси-сервером svc на стороне клиента) принимает 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);
    }

person Sat Thiru    schedule 24.04.2018    source источник
comment
Если вам это все еще нужно, взгляните на этот репозиторий . Вы можете добавить свои собственные настраиваемые заголовки сообщений, содержащие самостоятельно сгенерированный идентификатор трассировки для целей ведения журнала.   -  person Peter Bons    schedule 03.07.2018


Ответы (1)


У ServiceContext есть свойство TraceId, которое вы можете использовать. См. документацию

Пример:

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))
        };
    }
}
person Peter Bons    schedule 24.04.2018
comment
Я хотел бы, чтобы это работало, как ожидалось, но это не так. Context.TraceId в этом случае — это ТО ЖЕ ЗНАЧЕНИЕ, которое было задано в начале во время создания службы без сохранения состояния. Таким образом, даже если я передам новый идентификатор трассировки со стороны клиента через return new FabricTransportServiceRemotingClientFactory( traceId: traceIdentifier // ‹--- из HttpContext, для ведения журнала); call, на стороне службы он по-прежнему будет удерживать самый первый полученный идентификатор трассировки. :( - person Sat Thiru; 24.04.2018
comment
Чтобы было ясно, я бы хотел, чтобы traceid был значением, которое я передаю из нового FabricTransportServiceRemotingClientFactory( traceId: вызов traceIdentifier. Таким образом, он изменяется для каждого выполненного удаленного вызова (в результате изменения httpcontext.traceidentifier) - person Sat Thiru; 24.04.2018