Пример #1
0
        /// <summary>
        /// Получить или сгенерировать TraceId и установить контекст трейсинга.
        /// </summary>
        /// <param name="properties">Метаданные сообщения.</param>
        /// <param name="settings">Настройки трейсинга.</param>
        /// <param name="logger">Логгер.</param>
        /// <param name="stubMessage">TraceId из тела сообщения.</param>
        /// <param name="loggingScope">Скоуп.</param>
        /// <returns>Идентификатор отслеживания.</returns>
        public static void EnsureTraceId(
            this IBasicProperties properties,
            TracingSettings settings,
            ILogger logger,
            ref StubMessage stubMessage,
            Dictionary <string, object?> loggingScope
            )
        {
            if (!TryGetTraceInfo(properties, stubMessage.TraceId, out var traceId, out var traceIdSource))
            {
                if (settings.GenerateIfNotPresent)
                {
                    traceId = Guid.NewGuid();

                    if (settings.LogWhenGenerated)
                    {
                        using (logger.BeginScope(loggingScope))
                        {
                            logger.LogInformation("TraceId не указан. Сгенерирован новый {TraceId}.", traceId);
                        }
                    }
                }
            }

            TraceContext.Create(traceId, traceIdSource);

            loggingScope["TraceId"]       = traceId;
            loggingScope["TraceIdSource"] = traceIdSource;

            properties.AddTraceId();

            if (traceId.HasValue)
            {
                stubMessage.TraceId = traceId.Value;
            }
        }