Ответы пользователя по тегу .NET
  • Где искать TraceId из OpenTelemetry в Jaeger и как связывать микросервисы?

    Razbezhkin
    @Razbezhkin Автор вопроса
    программист, преподаватель
    В общем, не все так просто как казалось.
    Пришлось скачать исходники opentelemetry https://github.com/open-telemetry/opentelemetry-dotnet и посмотреть, как устроено распространение трассировочной информации в инструментарии AspNetCore.

    Сохранение, передача и восстановление TraceID (и доп информации) называется Propogation.
    В пакете OpenTelemetry Есть специальный класс:
    OpenTelemetry.Context.Propagation.Propagators
    Который возвращает этих пропогаторов с помощью которых производиться внедрение и извлечение контекстной информации (информации о трассировке).

    Чтобы куда-нибудь внедрить данные о трассировке, можно использовать примерно такой код:

    //достаем текстового распространителя
    var textMapPropagator = Propagators.DefaultTextMapPropagator;
    //формируем контекст распространения
    var propContext = new OpenTelemetry.Context.Propagation.PropagationContext(Activity.Current.Context, Baggage.Current);
    //этот метод вызывает для каждого необходимого значения их контекста распространения ваш же метод, который сохраняет пару ключ-значения для последующего восстановления
    textMapPropagator.Inject(propContext,context, (ctx, name, val) =>
    {
        ctx.Headers.Set(name,val);
    });


    На другой стороне нужно контекст трассировки восстановить. код примерно такой:

    //извлекаем из среды распространяемую трейс-информацию
            var propagator = Propagators.DefaultTextMapPropagator;
            PropagationContext propagationContext = propagator.Extract(default, context,
                (ctx, name) => { return new string[] { ctx.Headers.Get<string>(name) }; });
    
            if (propagationContext.ActivityContext.IsValid())
            {
                //формируем новый спан.
                newOne = new Activity("Consumer");
                newOne.SetParentId(propagationContext.ActivityContext.TraceId,
                    propagationContext.ActivityContext.SpanId,
                    propagationContext.ActivityContext.TraceFlags);
                newOne.TraceStateString = propagationContext.ActivityContext.TraceState;
                newOne.Start();
                newOne.IsAllDataRequested = false;
    
                Baggage.Current = propagationContext.Baggage;
            }


    в результате контекст трассировки восстанавливается и в Jaeger попадает в связанном виде.
    Единственная проблема в том, что именно этот Span не сохраняется (хотя все последующие в цепочке - да) и появляется Warning вида: "invalid parent span IDs=b3f757a84de75eda; skipping clock skew adjustment"
    Что с ним делать - пока не знаю. чего-то все такие не хватает
    Ответ написан
    1 комментарий
  • Как переделать аутентификацию в asp.net mvc3?

    Razbezhkin
    @Razbezhkin Автор вопроса
    программист, преподаватель
    authenticate меня смущает тем, что он выполняется при каждом http запросе. Формировать контекст безопасности при каждом http запросе мне кажется неразумным с точки зрения производительности.

    Альтернативный вариант — использовать Session_Start в Global.asax. Если ли в этом случае противопоказания?
    Ответ написан
    Комментировать
  • Как переделать аутентификацию в asp.net mvc3?

    Razbezhkin
    @Razbezhkin Автор вопроса
    программист, преподаватель
    Спасибо.
    С использованием WIF я пока решил повременить.
    Если смотреть в сторону использования IPrincipal, то в нем нет места для UserID, но можно сделать собственный класс, реализующий IPrincipal, который будет содержать необходимые свойства, или можно хранить в сессии пользователя дополнительный объект для хранения этих сведений.

    Вот тут возникает интересный (для меня) момент: в какой момент эту информацию сохранть в сессии или в HttpContext. Если аутентификация выполняется методом Form, то на странице ввода логина и пароля, но есть еще один интересный момент: пользователь может попросить «запомнить» его, чтобы не вводить в следующий раз логин и пароль, при этом пользователь в следующей сессии будет залогиненым, хотя никакой проверки подлинности произведено не будет и даже пользователя может уже не быть такого на сайте.

    В каком месте в этом случае лучше всего формировать контекстную информацию пользователя?
    Ответ написан