У меня есть приложение 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 использует "нормальные" механизмы понимания приложений.