ApplicationInsights - CustomProperties не обновляются между запросами - PullRequest
0 голосов
/ 14 марта 2019

Я хочу сообщить о некоторых свойствах через Azure-ApplicationInsights для каждого маршрута, как показано на рисунке ниже: enter image description here

Проблема в том, что даже если я делаю второй вызов, по тому же маршруту или по другому маршруту, эти значения не меняются. Только при третьем вызове значение изменяется, но даже тогда не является текущим. Пример:

  1. Я https://localhost:5001/api/testobject/7 "Проприетный обычай" = "valoare custom" 7"
  2. Я https://localhost:5001/api/testobject/8 "Проприетный обычай" = "valoare custom" 7 "
  3. Я делаю https://localhost:5001/api/testobject/9 "Проприетарский обычай" = "valoare custom" 8 "

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

[Route("api/[controller]")]
[ApiController]
public class TestObjectController
{
    private TelemetryClient telemetryClient;

    public TestObjectController(TelemetryClient telemetryClient)
    {
        this.telemetryClient = telemetryClient;
    }

    // GET api/values/5
    [HttpGet("{id}")]
    public ActionResult<string> Get(int id)
    {
        telemetryClient.Context.Properties.Clear(); 
        telemetryClient.Context.GlobalProperties["TestObjectController"] = "nok";
        telemetryClient.Context.Properties["proprietate custom"] = $"valoare custom {id}";
        return "value";
    }
}

Есть идеи, как сохранить точность?

Ответы [ 2 ]

2 голосов
/ 14 марта 2019

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());
}
0 голосов
/ 15 марта 2019

@ [Дмитрий Матвеев] спасибо, но ваше предложение частично работает, но мне было больше интересно добавить определенную информацию из содержимого запроса (например, имя арендатора).Для этого я добавил информацию в HttpContext.Items, а затем получил к ней доступ через MyTelemetryInitializer, как описано в этой ссылке: https://github.com/Microsoft/ApplicationInsights-aspnetcore/wiki/Custom-Configuration#track-custom-traceeventmetric

Код, который добавляет информацию в маршрут:

    [HttpGet("{id}/details")]
    public ActionResult<string> GetDetails(int id)
    {
        HttpContext.Items.Add("custom property2", id);
        return "value";
    }

Часть метода инициализации MyTelemetryInitializer:

    foreach (var prop in httpContextAccessor.HttpContext.Items)
    {
        if (prop.Key is string)
            requestTelemetry.Context.GlobalProperties[prop.Key.ToString()] = prop.Value.ToString();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...