Application Insights - Как установить пользовательский идентификатор операции - PullRequest
1 голос
/ 02 августа 2020

В нашей текущей локальной настройке у нас есть 20+. net приложений API ядра 3.1 (отдельные ASP. NET приложения Core API). Мы начали перенос двух приложений APi в Azure App Service, помеченный одним экземпляром Application Insights.

В локальной среде мы используем другую структуру журналов, в которую входят остальные 18 приложений. Все эти приложения API взаимодействуют друг с другом, и все журналы привязаны к какому-то unique_id в локальной среде.

Теперь для apis, который находится в Azure, нам нужно использовать тот же unique_Id и co- связать все.

Чтобы достичь этого, я начал изучать функциональность установки одного и того же идентификатора операции для двух приложений, которые размещены в azure.

Создан TelemetrInitializer в обоих API . и если я установил Operational Id, как показано ниже в обоих API, он работает. Все журналы привязаны к одиночному идентификатору операции «12345»

      telemetry.Context.Operation.Id = "12345";

Однако, поскольку очевидно, что идентификатор операции должен быть динамическим c, я изменил его на приведенный ниже в моем первом API

  telemetry.Context.Operation.Id = "CR" + Guid.NewGuid().ToString();

Итак, следующая задача: мне нужно ie этот новый идентификатор операции в моем втором API TelemetryInitiializer. Для этого я попытался получить заголовок Request-Id в TelemetryInitializer 2-го API. Это всегда NULL.

Есть ли способ добиться этого?

Спасибо, Правин Шрирам.

1 Ответ

0 голосов
/ 07 августа 2020

tldr: это возможно, отключив встроенное отслеживание зависимостей в. NET Core and App Insights и обработав его самостоятельно. В большинстве случаев лучше всего позволить. NET Core и App Insights отслеживают.

Я загрузил простое приложение WebAPI с кодом, который собираюсь go, на Github: https://github.com/SamaraSoucy-MSFT/customoperationid

Есть две вещи, которые необходимо переопределить, чтобы получить как заголовки, так и App Insights для получения идентификатора настраиваемой операции. Первый - это Activity, который обертывает HttpClient, поскольку он управляет заголовками корреляции. Второй - это отслеживание зависимостей в App Insights.

Можно полностью отключить действия в ваших HttpClients, но для минимизации побочных эффектов вы можете просто удалить один в клиенте, установив Activity.Current = null

var operationId = "CR" + Guid.NewGuid().ToString();
var url = "https://www.microsoft.com";
using (var client = new HttpClient())
{
    using (var requestMessage =
        new HttpRequestMessage(HttpMethod.Get, url))
    {
        //Makes the headers configurable
        Activity.Current = null;

        //set correlation header manually
        requestMessage.Headers.Add("Request-Id", operationId);
        await client.SendAsync(requestMessage);
    }
}

Следующим шагом является удаление отслеживания App Insights по умолчанию для этого запроса . Опять же, вы можете полностью отключить отслеживание зависимостей или отфильтровать телеметрию по умолчанию для этого запроса. Процессоры регистрируются внутри класса Startup точно так же, как инициализаторы.

services.AddApplicationInsightsTelemetryProcessor<CustomFilter>();

public class CustomFilter : ITelemetryProcessor
{
    private ITelemetryProcessor Next { get; set; }

    // next will point to the next TelemetryProcessor in the chain.
    public CustomFilter(ITelemetryProcessor next)
    {
        this.Next = next;
    }

    public void Process(ITelemetry item)
    {
        // To filter out an item, return without calling the next processor.
        if (!OKtoSend(item)) { return; }

        this.Next.Process(item);
    }

    // Example: replace with your own criteria.
    private bool OKtoSend(ITelemetry item)
    {
        var dependency = item as DependencyTelemetry;

        if (dependency == null) return true;

        if (dependency.Type == "Http"
            && dependency.Data.Contains("microsoft.com")
            //This key is just there to help identify the custom tracking
            && !dependency.Context.GlobalProperties.ContainsKey("keep"))
        {
            return false;
        }
        return true;
    }
}

Наконец, в методе, который выполняет удаленный вызов, вам необходимо внедрить клиент телеметрии и вызвать TelemetryClient.TrackDependency()

var operationId = "CR" + Guid.NewGuid().ToString();

//setup telemetry client
telemetry.Context.Operation.Id = operationId;
if (!telemetry.Context.GlobalProperties.ContainsKey("keep"))
{
    telemetry.Context.GlobalProperties.Add("keep", "true");
}
var startTime = DateTime.UtcNow;
var timer = System.Diagnostics.Stopwatch.StartNew();
//continue setting up context if needed

var url = "https:microsoft.com";
using (var client = new HttpClient())
{
    //Makes the headers configurable
    Activity.Current = null;

    using (var requestMessage =
        new HttpRequestMessage(HttpMethod.Get, url))
    {
        //Makes the headers configurable
        Activity.Current = null;

        //set header manually
        requestMessage.Headers.Add("Request-Id", operationId);
        await client.SendAsync(requestMessage);
    }
}

//send custom telemetry 
telemetry.TrackDependency("Http", url, "myCall", startTime, timer.Elapsed, true);
...