telemetryClient.Context.Properties
устанавливает контекст только для экземпляра клиента телеметрии.Это означает, что несколько телеметрических элементов могут быть созданы с предыдущим контекстом до того, как новый вступит в силу (если телеметрический элемент создан до обновления контекста).
Это, кажется, имеет место здесь - Запрос телеметрического элемента создается вмомент вызова метода и только позже внутри метода клиент обновляется, чтобы иметь новый контекст.
Я бы предложил использовать TelemetryInitializer
вместо , чтобы обновить контекст на уровне элемента телеметрии. но не клиент телеметрии:
using System;
using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.DataContracts;
using Microsoft.ApplicationInsights.Extensibility;
namespace MvcWebRole.Telemetry
{
/*
* Custom TelemetryInitializer that overrides the default SDK
* behavior of treating response codes >= 400 as failed requests
*
*/
public class MyTelemetryInitializer : ITelemetryInitializer
{
public void Initialize(ITelemetry telemetry)
{
var requestTelemetry = telemetry as RequestTelemetry;
// Is this a TrackRequest() ?
if (requestTelemetry == null) return;
int code;
bool parsed = Int32.TryParse(requestTelemetry.ResponseCode, out code);
if (!parsed) return;
if (code >= 400 && code < 500)
{
// If we set the Success property, the SDK won't change it:
requestTelemetry.Success = true;
// Allow us to filter these requests in the portal:
requestTelemetry.Context.Properties["Overridden400s"] = "true";
}
// else leave the SDK to set the Success property
}
}
}
Затем добавьте этот инициализатор в AI либо через ApplicationInsights.config, либо в коде:
<ApplicationInsights>
<TelemetryInitializers>
<!-- Fully qualified type name, assembly name: -->
<Add Type="MvcWebRole.Telemetry.MyTelemetryInitializer, MvcWebRole"/>
...
</TelemetryInitializers>
</ApplicationInsights>
protected void Application_Start()
{
// ...
TelemetryConfiguration.Active.TelemetryInitializers
.Add(new MyTelemetryInitializer());
}