Как я могу обогатить DependencyTelemetry? - PullRequest
0 голосов
/ 02 июня 2018

У меня есть приложение ASP.NET Core 2.0 с ApplicationInsights, включенным через Serilog, с использованием следующего в Startup.cs

        TelemetryConfiguration.Active.TelemetryInitializers.Add(new DependencyInitializer(ServiceProvider.GetService<IHttpContextAccessor>()));

        Log.Logger = new LoggerConfiguration()
            .ReadFrom.Configuration(Configuration)
            .CreateLogger();

DependencyINitializer выглядит следующим образом:

  public class DependencyInitializer : ITelemetryInitializer
    {
        private readonly IHttpContextAccessor _contextAccessor;

        public DependencyInitializer(IHttpContextAccessor contextAccessor)
        {
            _contextAccessor = contextAccessor;
        }

        public void Initialize(ITelemetry telemetry)
        {
            if (telemetry is DependencyTelemetry)
            {
                telemetry.Context.Properties.Add("RequestId", _contextAccessor.HttpContext.TraceIdentifier);
            }
        }
    }

Использование отладчикаЯ нашел ITelemetryInitializer только перехватывает TraceTelemetry и ExceptionTelemetry.Тем не менее, DependencyTelemetry записывается в insigghts приложения.Мне действительно нужно улучшить поле customDimensions, потому что сейчас оно выглядит так:

{"_ MS.ProcessedByMetricExtractors": "(Name: 'Dependencies', Ver: '1.0')","AspNetCoreEnvironment": "Production", "DeveloperMode": "true"}

Как перехватить объекты DependencyTelemetry, прежде чем они будут отправлены в понимание приложения, чтобы я мог добавить к ним customDimensions?

Я могу перехватывать запросы с помощью промежуточного программного обеспечения следующим образом:

    public static IApplicationBuilder UseCorrelationProperties(this IApplicationBuilder app)
    {
        return app.Use(async (context, next) =>
            {

                var requestTelemetry = context.Features.Get<RequestTelemetry>();
                if (requestTelemetry != null)
                {
                    requestTelemetry.Context.Properties["CorrelationId"] = correlationId;
                }

                await next.Invoke();
            });
    }

И эти свойства добавляются, поэтому я знаю, что Serilog использует "нормальные" механизмы понимания приложений.

...