Поделиться через


Миграция из пакетов SDK для .NET Application Insights в Azure Monitor OpenTelemetry

В этом руководстве приведены пошаговые инструкции по переносу различных приложений .NET с помощью комплектов средств разработки программного обеспечения Application Insights в Azure Monitor OpenTelemetry.

Ожидается аналогичный опыт инструментирования OpenTelemetry в Azure Monitor, как и с пакетами SDK Application Insights. Дополнительные сведения и сравнение функций по функциям см. в разделе о состоянии выпуска компонентов.

  • ASP.NET миграция Core в дистрибутив OpenTelemetry в Azure Monitor. (Azure.Monitor.OpenTelemetry.AspNetCore Пакет NuGet)
  • миграция ASP.NET, консоли и WorkerService в экспортер OpenTelemetry в Azure Monitor. (Azure.Monitor.OpenTelemetry.Exporter Пакет NuGet)

Если вы начинаете работу с Application Insights и не хотите переноситься из классического API, см. статью "Включить Azure Monitor OpenTelemetry".

Необходимые компоненты

  • Веб-приложение ASP.NET Core уже инструментировано с помощью Application Insights без каких-либо настроек
  • Активно поддерживаемая версия .NET

Совет

Наша группа продуктов активно ищет отзывы об этой документации. Предоставьте отзыв или otel@microsoft.com просмотрите раздел поддержки.

Удаление пакета SDK Application Insights

Примечание.

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

  1. Удаление пакетов NuGet

    Microsoft.ApplicationInsights.AspNetCore Удалите пакет из вашего csprojприложения.

    dotnet remove package Microsoft.ApplicationInsights.AspNetCore
    
  2. Удаление кода и настройки инициализации

    Удалите все ссылки на типы Application Insights в базе кода.

    Совет

    После удаления пакета Application Insights вы можете повторно создать приложение, чтобы получить список ссылок, которые необходимо удалить.

    • Удалите Application Insights из вашей ServiceCollection строки, удалив следующую строку:

      builder.Services.AddApplicationInsightsTelemetry();
      
    • ApplicationInsights Удалите раздел из вашего appsettings.jsonприложения.

      {
          "ApplicationInsights": {
              "ConnectionString": "<Your Connection String>"
          }
      }
      
  3. Очистка и сборка

    Проверьте каталог bin, чтобы убедиться, что все ссылки были удалены Microsoft.ApplicationInsights.* .

  4. Тестирование приложения

    Убедитесь, что приложение не имеет непредвиденных последствий.

Совет

Наша группа продуктов активно ищет отзывы об этой документации. Предоставьте отзыв или otel@microsoft.com просмотрите раздел поддержки.

Включение OpenTelemetry

Мы рекомендуем создать ресурс разработки и использовать его строка подключения при выполнении этих инструкций.

Снимок экрана: обзор и строка подключения Application Insights.

Запланируйте обновление строка подключения отправки телеметрии исходному ресурсу после подтверждения успешной миграции.

  1. Установка дистрибутива Azure Monitor

    Наш дистрибутив Azure Monitor обеспечивает автоматическую телеметрию, включая библиотеки инструментирования OpenTelemetry для сбора трассировок, метрик, журналов и исключений, а также позволяет собирать пользовательские данные телеметрии.

    Установка дистрибутива Azure Monitor предоставляет пакет SDK OpenTelemetry в качестве зависимости.

    dotnet add package Azure.Monitor.OpenTelemetry.AspNetCore
    
  2. Добавление и настройка OpenTelemetry и Azure Monitor

    Пакет SDK OpenTelemery должен быть настроен при запуске приложения в рамках вашей ServiceCollectionобычной Program.csверсии.

    OpenTelemetry имеет концепцию трех сигналов; Трассировки, метрики и журналы. Дистрибутив Azure Monitor настраивает каждый из этих сигналов.

Program.cs

В следующем примере кода показаны основы.

using Azure.Monitor.OpenTelemetry.AspNetCore;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;

public class Program
{
    public static void Main(string[] args)
    {
        var builder = WebApplication.CreateBuilder(args);

        // Call AddOpenTelemetry() to add OpenTelemetry to your ServiceCollection.
        // Call UseAzureMonitor() to fully configure OpenTelemetry.
        builder.Services.AddOpenTelemetry().UseAzureMonitor();

        var app = builder.Build();
        app.MapGet("/", () => "Hello World!");
        app.Run();
    }
}

Мы рекомендуем задать строку подключения в переменной среды:

APPLICATIONINSIGHTS_CONNECTION_STRING=<Your Connection String>

Дополнительные параметры настройки строки подключения подробно описаны здесь: настройка строки подключения Application Insights.

Совет

Наша группа продуктов активно ищет отзывы об этой документации. Предоставьте отзыв или otel@microsoft.com просмотрите раздел поддержки.

Установка и настройка библиотек инструментирования

Библиотеки инструментирования можно добавить в проект для автоматического сбора данных телеметрии о конкретных компонентах или зависимостях.

В дистрибутив включены следующие библиотеки.

Настройка библиотек инструментирования

Дистрибутив Azure Monitor включает инструментирование .NET OpenTelemetry для ASP.NET Core, HttpClient и SQLClient. Эти включенные инструментирования можно настроить или вручную добавить дополнительные инструментирования самостоятельно с помощью API OpenTelemetry.

Ниже приведены некоторые примеры настройки инструментирования.

Настройка AspNetCoreTraceInstrumentationOptions
builder.Services.AddOpenTelemetry().UseAzureMonitor();
builder.Services.Configure<AspNetCoreTraceInstrumentationOptions>(options =>
{
    options.RecordException = true;
    options.Filter = (httpContext) =>
    {
        // only collect telemetry about HTTP GET requests
        return HttpMethods.IsGet(httpContext.Request.Method);
    };
});
Настройка HttpClientTraceInstrumentationOptions
builder.Services.AddOpenTelemetry().UseAzureMonitor();
builder.Services.Configure<HttpClientTraceInstrumentationOptions>(options =>
{
    options.RecordException = true;
    options.FilterHttpRequestMessage = (httpRequestMessage) =>
    {
        // only collect telemetry about HTTP GET requests
        return HttpMethods.IsGet(httpRequestMessage.Method.Method);
    };
});
Настройка SqlClientInstrumentationOptions

Мы поставщиком инструментирования SQLClient в нашем пакете, пока он все еще находится в бета-версии. Когда он достигает стабильного выпуска, мы включаем его в качестве стандартной ссылки на пакет. До тех пор, чтобы настроить инструментирование SQLClient, добавьте OpenTelemetry.Instrumentation.SqlClient ссылку на пакет в проект и используйте его общедоступный API.

dotnet add package --prerelease OpenTelemetry.Instrumentation.SqlClient
builder.Services.AddOpenTelemetry().UseAzureMonitor().WithTracing(builder =>
{
    builder.AddSqlClientInstrumentation(options =>
    {
        options.SetDbStatementForStoredProcedure = false;
    });
});

Настройка Azure Monitor

Application Insights предлагает множество дополнительных параметров конфигурации с помощью ApplicationInsightsServiceOptions.

Параметр Application Insights OpenTelemetry Alternative
AddAutoCollectedMetricExtractor Н/П
ApplicationVersion Задайте значение "service.version" в ресурсе
ConnectionString См . инструкции по настройке строки подключения.
DependencyCollectionOptions Недоступно Чтобы настроить зависимости, просмотрите доступные параметры конфигурации для применимых библиотек инструментирования.
DeveloperMode Н/П
EnableActiveTelemetryConfigurationSetup Н/П
EnableAdaptiveSampling Недоступно Поддерживается только выборка фиксированной частоты.
EnableAppServicesHeartbeatTelemetryModule Н/П
EnableAuthenticationTrackingJavaScript Н/П
EnableAzureInstanceMetadataTelemetryModule Н/П
EnableDependencyTrackingTelemetryModule Инструкции по фильтрации трассировок.
EnableDiagnosticsTelemetryModule Н/П
EnableEventCounterCollectionModule Н/П
EnableHeartbeat Н/П
EnablePerformanceCounterCollectionModule Н/П
EnableQuickPulseMetricStream AzureMonitorOptions.EnableLiveMetrics
EnableRequestTrackingTelemetryModule Инструкции по фильтрации трассировок.
EndpointAddress Используйте ConnectionString.
InstrumentationKey Используйте ConnectionString.
RequestCollectionOptions Недоступно См. параметры OpenTelemetry.Instrumentation.AspNetCore.

Удаление пользовательских конфигураций

Следующие сценарии являются необязательными и применяются только к расширенным пользователям.

  • Если у вас есть дополнительные ссылки на TelemetryClientданные телеметрии, которые можно использовать для ручной записи телеметрии, их следует удалить.

  • Если вы добавили любую пользовательскую фильтрацию или обогащение в виде пользовательского TelemetryProcessor или TelemetryInitializerих следует удалить. Их можно найти в вашем ServiceCollection.

    builder.Services.AddSingleton<ITelemetryInitializer, MyCustomTelemetryInitializer>();
    
    builder.Services.AddApplicationInsightsTelemetryProcessor<MyCustomTelemetryProcessor>();
    
  • Удаление фрагмента кода JavaScript

    Если вы использовали фрагмент кода, предоставленный пакетом SDK для .NET Application Insights, он также должен быть удален. Полные примеры кода для удаления см. в руководстве по включению телеметрии на стороне клиента для веб-приложений.

    Если вы добавили пакет SDK JavaScript для сбора данных телеметрии на стороне клиента, его также можно удалить, хотя он продолжает работать без пакета SDK для .NET. Полные примеры кода для удаления см. в руководстве по подключению пакета SDK для JavaScript.

  • Удаление артефактов Visual Studio

    Если вы использовали Visual Studio для подключения к Application Insights, в проекте может быть больше файлов.

    • Properties/ServiceDependencies В каталоге может быть ссылка на ресурс Application Insights.

Совет

Наша группа продуктов активно ищет отзывы об этой документации. Предоставьте отзыв или otel@microsoft.com просмотрите раздел поддержки.

Часто задаваемые вопросы

Этот раздел предназначен для клиентов, использующих инициализаторы телеметрии или процессоры, или напишите пользовательский код в классическом API Application Insights для создания пользовательской телеметрии.

Как API пакета SDK сопоставляется с концепциями OpenTelemetry?

OpenTelemetry — это нейтральная платформа наблюдения поставщика. Api Application Insights отсутствуют в пакете SDK или библиотеках OpenTelemetry. Перед миграцией важно понимать некоторые понятия OpenTelemetry.

  • В Application Insights все данные телеметрии управляются одним TelemetryClient и TelemetryConfiguration. В OpenTelemetry каждый из трех сигналов телеметрии (трассировки, метрики и журналы) имеет собственную конфигурацию. Вы можете вручную создать данные телеметрии с помощью среды выполнения .NET без внешних библиотек. Дополнительные сведения см. в руководствах .NET по распределенной трассировке, метрикам и ведению журнала.

  • Application Insights используется TelemetryModules для автоматического сбора данных телеметрии для приложения. Вместо этого OpenTelemetry использует библиотеки инструментирования для сбора данных телеметрии из определенных компонентов (например , AspNetCore для запросов и HttpClient для зависимостей).

  • Application Insights используется TelemetryInitializers для обогащения телеметрии дополнительными сведениями или переопределения свойств. С помощью OpenTelemetry можно написать обработчик для настройки определенного сигнала. Кроме того, многие библиотеки инструментирования OpenTelemetry предлагают Enrich метод настройки телеметрии, созданной этим конкретным компонентом.

  • Application Insights используется TelemetryProcessors для фильтрации данных телеметрии. Обработчик OpenTelemetry также можно использовать для применения правил фильтрации по конкретному сигналу.

Как типы телеметрии Application Insights сопоставляются с OpenTelemetry?

Эта таблица сопоставляет типы данных Application Insights с концепциями OpenTelemetry и их реализацией .NET.

Таблица Azure Monitor Application Insights DataType Тип данных OpenTelemetry Реализация .NET
customEvents EventTelemetry Неприменимо Неприменимо
customMetrics MetricTelemetry Метрики System.Diagnostics.Metrics.Meter
dependencies DependencyTelemetry Диапазоны (клиент, внутренний, потребитель) System.Diagnostics.Activity
exceptions ExceptionTelemetry Исключения System.Exception
requests RequestTelemetry Диапазоны (сервер, производитель) System.Diagnostics.Activity
traces TraceTelemetry Журналы Microsoft.Extensions.Logging.ILogger

Дополнительные сведения см. в следующих документах.

Как понятия выборки Application Insights сопоставляются с OpenTelemetry?

Хотя Application Insights предлагает несколько вариантов настройки выборки, экспортер Azure Monitor или дистрибутив Azure Monitor предлагает только выборку фиксированной частоты. Можно использовать пример только запросов и зависимостей (трассировки OpenTelemetry).

Дополнительные сведения о настройке выборки см. в руководстве по включению выборки

Как процессоры и инициализаторы телеметрии сопоставляются с OpenTelemetry?

В пакете SDK для Application Insights для .NET используйте процессоры телеметрии для фильтрации и изменения или отмены данных телеметрии. Инициализаторы телеметрии используются для добавления или изменения настраиваемых свойств. Дополнительные сведения см. в документации по Azure Monitor. OpenTelemetry заменяет эти понятия действиями или обработчиками журналов, которые расширяют и фильтруют данные телеметрии.

Фильтрация трассировок

Чтобы фильтровать данные телеметрии в OpenTelemetry, можно реализовать обработчик действий. Этот пример эквивалентен примеру Application Insights для фильтрации данных телеметрии, как описано в документации по Azure Monitor. В примере показано, где отфильтровываются неудачные вызовы зависимостей.

using System.Diagnostics;
using OpenTelemetry;

internal sealed class SuccessfulDependencyFilterProcessor : BaseProcessor<Activity>
{
    public override void OnEnd(Activity activity)
    {
        if (!OKtoSend(activity))
        {
            activity.ActivityTraceFlags &= ~ActivityTraceFlags.Recorded;
        }
    }

    private bool OKtoSend(Activity activity)
    {
        return activity.Kind == ActivityKind.Client && activity.Status == ActivityStatusCode.Ok;
    }
}

Чтобы использовать этот процессор, необходимо создать TracerProvider и добавить процессор до AddAzureMonitorTraceExporterэтого.

using OpenTelemetry.Trace;

public static void Main()
{
    var tracerProvider = Sdk.CreateTracerProviderBuilder()
        .AddProcessor(new SuccessfulDependencyFilterProcessor())
        .AddAzureMonitorTraceExporter()
        .Build();
}

Фильтрация журналов

Реализации ILogger имеют встроенный механизм для применения фильтрации журналов. Эта фильтрация позволяет управлять журналами, отправленными каждому зарегистрированным поставщику, включая OpenTelemetryLoggerProviderжурналы. OpenTelemetry — это псевдоним , OpenTelemetryLoggerProviderиспользуемый при настройке правил фильтрации.

Следующий пример определяет "Error" в качестве значения по умолчанию LogLevel , а также определяет "Предупреждение" как минимум LogLevel для определяемой пользователем категории. Эти правила, как определено, применяются только к OpenTelemetryLoggerProvider.

builder.AddFilter<OpenTelemetryLoggerProvider>("*", LogLevel.Error);
builder.AddFilter<OpenTelemetryLoggerProvider>("MyProduct.MyLibrary.MyClass", LogLevel.Warning);

Дополнительные сведения см. в документации openTelemetry .NET по журналам.

Добавление настраиваемых свойств в трассировки

В OpenTelemetry можно использовать обработчики действий для обогащения данных телеметрии с дополнительными свойствами. Аналогично использованию инициализаторов телеметрии в Application Insights, где можно изменить свойства телеметрии.

По умолчанию служба "Экспортер Azure Monitor" помечает любой HTTP-запрос с кодом ответа 400 или выше, так как произошел сбой. Однако если вы хотите рассматривать 400 как успешный, можно добавить обогащенный обработчик действий, который задает успешное выполнение действия и добавляет тег для включения дополнительных свойств телеметрии. Аналогично добавлению или изменению свойств с помощью инициализатора в Application Insights, как описано в документации по Azure Monitor.

Ниже приведен пример добавления настраиваемых свойств и переопределения поведения по умолчанию для определенных кодов ответов:

using System.Diagnostics;
using OpenTelemetry;

/// <summary>
/// Custom Processor that overrides the default behavior of treating response codes >= 400 as failed requests.
/// </summary>
internal class MyEnrichingProcessor : BaseProcessor<Activity>
{
    public override void OnEnd(Activity activity)
    {
        if (activity.Kind == ActivityKind.Server)
        {
            int responseCode = GetResponseCode(activity);

            if (responseCode >= 400 && responseCode < 500)
            {
                // If we set the Success property, the SDK won't change it
                activity.SetStatus(ActivityStatusCode.Ok);

                // Allow to filter these requests in the portal
                activity.SetTag("Overridden400s", "true");
            }

            // else leave the SDK to set the Success property
        }
    }

    private int GetResponseCode(Activity activity)
    {
        foreach (ref readonly var tag in activity.EnumerateTagObjects())
        {
            if (tag.Key == "http.response.status_code" && tag.Value is int value)
            {
                return value;
            }
        }

        return 0;
    }
}

Чтобы использовать этот процессор, необходимо создать TracerProvider и добавить процессор до AddAzureMonitorTraceExporterэтого.

using OpenTelemetry.Trace;

public static void Main()
{
    var tracerProvider = Sdk.CreateTracerProviderBuilder()
        .AddSource("Company.Product.Name")
        .AddProcessor(new MyEnrichingProcessor())
        .AddAzureMonitorTraceExporter()
        .Build();
}

Разделы справки вручную отслеживать данные телеметрии с помощью OpenTelemetry?

Отправка трассировок вручную

Трассировки в Application Insights хранятся как RequestTelemetry и DependencyTelemetry. В OpenTelemetry трассировки моделиируются как Span использование Activity класса.

OpenTelemetry .NET использует ActivitySource классы и Activity классы для трассировки, которые являются частью среды выполнения .NET. Этот подход отличается, так как реализация .NET интегрирует API трассировки непосредственно в саму среду выполнения. Пакет System.Diagnostics.DiagnosticSource позволяет разработчикам создавать ActivitySource экземпляры и управлять ими Activity . Этот метод позволяет легко добавлять трассировку в приложения .NET без использования внешних библиотек, применяя встроенные возможности экосистемы .NET. Дополнительные сведения см. в пошаговом руководстве по инструментированию распределенной трассировки.

Вот как перенести трассировку вручную:

Примечание.

В Application Insights имя роли и экземпляр роли можно задать на уровне телеметрии. Однако при использовании экспортера Azure Monitor нельзя настроить на уровне телеметрии. Имя роли и экземпляр роли извлекаются из ресурса OpenTelemetry и применяются ко всем данным телеметрии. Дополнительные сведения см. в этом документе: задание имени облачной роли и экземпляра облачной роли.

DependencyTelemetry

Application Insights DependencyTelemetry используется для моделирования исходящих запросов. Вот как преобразовать его в OpenTelemetry:

Пример Application Insights:

DependencyTelemetry dep = new DependencyTelemetry
{
   Name = "DependencyName",
   Data = "https://www.example.com/",
   Type = "Http",
   Target = "www.example.com",
   Duration = TimeSpan.FromSeconds(10),
   ResultCode = "500",
   Success = false
};

dep.Context.Cloud.RoleName = "MyRole";
dep.Context.Cloud.RoleInstance = "MyRoleInstance";
dep.Properties["customprop1"] = "custom value1";
client.TrackDependency(dep);

Пример OpenTelemetry:

var activitySource = new ActivitySource("Company.Product.Name");
var resourceAttributes = new Dictionary<string, object>
{
   { "service.name", "MyRole" },
   { "service.instance.id", "MyRoleInstance" }
};

var resourceBuilder = ResourceBuilder.CreateDefault().AddAttributes(resourceAttributes);

using var tracerProvider = Sdk.CreateTracerProviderBuilder()
  .SetResourceBuilder(resourceBuilder)
  .AddSource(activitySource.Name)
  .AddAzureMonitorTraceExporter()
  .Build();

// Emit traces
using (var activity = activitySource.StartActivity("DependencyName", ActivityKind.Client))
{
  activity?.SetTag("url.full", "https://www.example.com/");
  activity?.SetTag("server.address", "www.example.com");
  activity?.SetTag("http.request.method", "GET");
  activity?.SetTag("http.response.status_code", "500");
  activity?.SetTag("customprop1", "custom value1");
  activity?.SetStatus(ActivityStatusCode.Error);
  activity?.SetEndTime(activity.StartTimeUtc.AddSeconds(10));
}

RequestTelemetry

Application Insights RequestTelemetry моделирует входящие запросы. Вот как перенести его в OpenTelemetry:

Пример Application Insights:

RequestTelemetry req = new RequestTelemetry
{
   Name = "RequestName",
   Url = new Uri("http://example.com"),
   Duration = TimeSpan.FromSeconds(10),
   ResponseCode = "200",
   Success = true,
   Properties = { ["customprop1"] = "custom value1" }
};

req.Context.Cloud.RoleName = "MyRole";
req.Context.Cloud.RoleInstance = "MyRoleInstance";
client.TrackRequest(req);

Пример OpenTelemetry:

var activitySource = new ActivitySource("Company.Product.Name");
var resourceAttributes = new Dictionary<string, object>
{
   { "service.name", "MyRole" },
   { "service.instance.id", "MyRoleInstance" }
};

var resourceBuilder = ResourceBuilder.CreateDefault().AddAttributes(resourceAttributes);

using var tracerProvider = Sdk.CreateTracerProviderBuilder()
  .SetResourceBuilder(resourceBuilder)
  .AddSource(activitySource.Name)
  .AddAzureMonitorTraceExporter()
  .Build();

// Emit traces
using (var activity = activitySource.StartActivity("RequestName", ActivityKind.Server))
{
  activity?.SetTag("url.scheme", "https");
  activity?.SetTag("server.address", "www.example.com");
  activity?.SetTag("url.path", "/");
  activity?.SetTag("http.response.status_code", "200");
  activity?.SetTag("customprop1", "custom value1");
  activity?.SetStatus(ActivityStatusCode.Ok);
}

Отслеживание пользовательских операций

В Application Insights отслеживайте пользовательские операции с помощью StartOperation и StopOperation методами. ActivitySource Activity Используйте и в OpenTelemetry .NET. Для операций с ActivityKind.Server ActivityKind.Consumerazure Monitor Экспортер создает RequestTelemetry. Для ActivityKind.Client, ActivityKind.Producerи ActivityKind.Internal, он создает DependencyTelemetry. Дополнительные сведения об отслеживании пользовательских операций см. в документации по Azure Monitor. Дополнительные сведения об использовании и Activity использовании ActivitySource .NET см. в пошаговом руководстве по инструментированию распределенной трассировки .NET.

Ниже приведен пример запуска и остановки действия для пользовательских операций:

using System.Diagnostics;
using OpenTelemetry;

var activitySource = new ActivitySource("Company.Product.Name");

using var tracerProvider = Sdk.CreateTracerProviderBuilder()
    .AddSource(activitySource.Name)
    .AddAzureMonitorTraceExporter()
    .Build();

// Start a new activity
using (var activity = activitySource.StartActivity("CustomOperation", ActivityKind.Server))
{
    activity?.SetTag("customTag", "customValue");

    // Perform your custom operation logic here

    // No need to explicitly call Activity.Stop() because the using block automatically disposes the Activity object, which stops it.
}

Отправка журналов

Журналы в Application Insights хранятся как TraceTelemetry и ExceptionTelemetry.

TraceTelemetry

В OpenTelemetry ведение журнала интегрируется через ILogger интерфейс. Вот как выполнить миграцию TraceTelemetry:

Пример Application Insights:

TraceTelemetry traceTelemetry = new TraceTelemetry
{
   Message = "hello from tomato 2.99",
   SeverityLevel = SeverityLevel.Warning,
};

traceTelemetry.Context.Cloud.RoleName = "MyRole";
traceTelemetry.Context.Cloud.RoleInstance = "MyRoleInstance";
client.TrackTrace(traceTelemetry);

Пример OpenTelemetry:

var resourceAttributes = new Dictionary<string, object>
{
   { "service.name", "MyRole" },
   { "service.instance.id", "MyRoleInstance" }
};

var resourceBuilder = ResourceBuilder.CreateDefault().AddAttributes(resourceAttributes);

using var loggerFactory = LoggerFactory.Create(builder => builder
   .AddOpenTelemetry(logging =>
   {
       logging.SetResourceBuilder(resourceBuilder);
       logging.AddAzureMonitorLogExporter();
   }));

// Create a new instance `ILogger` from the above LoggerFactory
var logger = loggerFactory.CreateLogger<Program>();

// Use the logger instance to write a new log
logger.FoodPrice("tomato", 2.99);

internal static partial class LoggerExtensions
{
    [LoggerMessage(LogLevel.Warning, "Hello from `{name}` `{price}`.")]
    public static partial void FoodPrice(this ILogger logger, string name, double price);
}
ExceptionTelemetry

Application Insights используется ExceptionTelemetry для журналов исключений. Вот как выполнить миграцию в OpenTelemetry:

Пример Application Insights:

ExceptionTelemetry exceptionTelemetry = new ExceptionTelemetry(new Exception("Test exception"))
{
    SeverityLevel = SeverityLevel.Error
};

exceptionTelemetry.Context.Cloud.RoleName = "MyRole";
exceptionTelemetry.Context.Cloud.RoleInstance = "MyRoleInstance";
exceptionTelemetry.Properties["customprop1"] = "custom value1";
client.TrackException(exceptionTelemetry);

Пример OpenTelemetry:

var resourceAttributes = new Dictionary<string, object>
{
   { "service.name", "MyRole" },
   { "service.instance.id", "MyRoleInstance" }
};

var resourceBuilder = ResourceBuilder.CreateDefault().AddAttributes(resourceAttributes);

using var loggerFactory = LoggerFactory.Create(builder => builder
   .AddOpenTelemetry(logging =>
   {
       logging.SetResourceBuilder(resourceBuilder);
       logging.AddAzureMonitorLogExporter();
   }));

// Create a new instance `ILogger` from the above LoggerFactory.
var logger = loggerFactory.CreateLogger<Program>();

try
{
    // Simulate exception
    throw new Exception("Test exception");
}
catch (Exception ex)
{
    logger?.LogError(ex, "An error occurred");
}

Отправка метрик

Метрики в Application Insights хранятся как MetricTelemetry. В OpenTelemetry метрики моделиируются как Meter из System.Diagnostics.DiagnosticSource пакета.

Application Insights имеет api-интерфейсы метрик, отличные от предварительной агрегирования (TrackMetric()) и предварительной агрегирования (GetMetric().TrackValue()). В отличие от OpenTelemetry, Application Insights не имеет понятия "Инструменты". Application Insights имеет один и тот же API для всех сценариев метрик.

С другой стороны, OpenTelemetry требует, чтобы пользователи сначала выбрали правильный инструмент метрик на основе фактической семантики метрики. Например, если намерение состоит в том, чтобы подсчитать что-то (например, количество полученных общих запросов сервера и т. д.), следует использовать счетчик OpenTelemetry. Если намерение состоит в вычислении различных процентилей (например, значения задержки сервера P99), следует использовать инструмент гистограммы OpenTelemetry. Из-за этого фундаментального различия между Application Insights и OpenTelemetry между ними не производится прямое сравнение.

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

Кроме того, OpenTelemetry не поддерживает отправку необработанных метрик напрямую, так как функции, найденные в Application Insights, отсутствуют TrackMetric() .

Миграция из Application Insights в OpenTelemetry включает замену всех использования API метрик Application Insights с ПОМОЩЬЮ API OpenTelemetry. Для этого требуется понимание различных инструментов OpenTelemetry и их семантики.

Совет

Гистограмма является наиболее универсальным и ближайшим эквивалентом API Application Insights GetMetric().TrackValue() . Вы можете заменить API метрик Application Insights на гистограмму для достижения той же цели.

Другие типы телеметрии

CustomEvents

Не поддерживается в OpenTelemetry.

Пример Application Insights:

TelemetryClient.TrackEvent()
AvailabilityTelemetry

Не поддерживается в OpenTelemetry.

Пример Application Insights:

TelemetryClient.TrackAvailability()
PageViewTelemetry

Не поддерживается в OpenTelemetry.

Пример Application Insights:

TelemetryClient.TrackPageView()

Можно ли получить динамические метрики для консольных и рабочих приложений службы?

Мы рекомендуем microsoft Azure Monitor OpenTelemetry Exporter для консольных и рабочих приложений службы, которые не включают динамические метрики.

Следующие шаги

Совет

Наша группа продуктов активно ищет отзывы об этой документации. Предоставьте отзыв или otel@microsoft.com просмотрите раздел поддержки.

Поддержка