.NET Application Insights SDK에서 Azure Monitor OpenTelemetry로 마이그레이션

이 가이드에서는 다양한 .NET 애플리케이션을 Application Insights SDK(소프트웨어 개발 키트) 사용에서 Azure Monitor OpenTelemetry로 마이그레이션하는 단계별 지침을 제공합니다.

Application Insights SDK와 마찬가지로 Azure Monitor OpenTelemetry 계측과 비슷한 환경을 기대합니다. 자세한 내용과 기능별 비교는 기능 릴리스 상태를 참조하세요.

Application Insights를 시작하고 클래식 API에서 마이그레이션할 필요가 없는 경우 Azure Monitor OpenTelemetry 사용을 참조하세요.

필수 조건

  • 사용자 지정 없이 Application Insights로 이미 계측된 ASP.NET Core 웹 애플리케이션
  • 적극적으로 지원되는 .NET 버전

제품 그룹은 이 설명서에 대한 피드백을 적극적으로 구하고 있습니다. otel@microsoft.com에 피드백을 제공하거나 지원 섹션을 참조하세요.

Application Insights SDK 제거

참고 항목

이러한 단계를 계속하기 전에 애플리케이션의 현재 백업이 있는지 확인해야 합니다.

  1. NuGet 패키지 제거

    csproj에서 Microsoft.ApplicationInsights.AspNetCore 패키지를 제거합니다.

    dotnet remove package Microsoft.ApplicationInsights.AspNetCore
    
  2. 초기화 코드 및 사용자 지정 제거

    코드베이스에서 Application Insights 형식에 대한 참조를 제거합니다.

    Application Insights 패키지를 제거한 후 애플리케이션을 다시 빌드하여 제거해야 하는 참조 목록을 가져올 수 있습니다.

    • 다음 줄을 삭제하여 ServiceCollection에서 Application Insights를 제거합니다.

      builder.Services.AddApplicationInsightsTelemetry();
      
    • appsettings.json에서 ApplicationInsights 섹션을 제거합니다.

      {
          "ApplicationInsights": {
              "ConnectionString": "<Your Connection String>"
          }
      }
      
  3. 정리 및 빌드

    bin 디렉터리를 검사하여 Microsoft.ApplicationInsights.*에 대한 모든 참조가 제거되었는지 확인합니다.

  4. 애플리케이션 테스트

    애플리케이션에 예기치 않은 결과가 없는지 확인합니다.

제품 그룹은 이 설명서에 대한 피드백을 적극적으로 구하고 있습니다. otel@microsoft.com에 피드백을 제공하거나 지원 섹션을 참조하세요.

OpenTelemetry 사용

이러한 지침에 따라 개발 리소스를 만들고 연결 문자열을 사용하는 것이 좋습니다.

Application Insights 개요 및 연결 문자열을 보여 주는 스크린샷.

마이그레이션이 성공적임을 확인한 후 원래 리소스에 원격 분석을 보내도록 연결 문자열을 업데이트하도록 계획합니다.

  1. Azure Monitor Distro 설치

    Azure Monitor Distro는 추적, 메트릭, 로그, 예외를 수집하기 위한 OpenTelemetry 계측 라이브러리를 포함하여 자동 원격 분석을 활성화하고 사용자 지정 원격 분석을 수집할 수 있습니다.

    Azure Monitor Distro 설치는 OpenTelemetry SDK를 종속성으로 지정됩니다.

    dotnet add package Azure.Monitor.OpenTelemetry.AspNetCore
    
  2. OpenTelemetry 및 Azure Monitor 추가 및 구성

    OpenTelemery SDK는 애플리케이션 시작 시 ServiceCollection의 일부로, 일반적으로 Program.cs에서 구성되어야 합니다.

    OpenTelemetry에는 추적, 메트릭, 로그라는 세 가지 신호의 개념이 있습니다. Azure Monitor Distro는 이러한 각 신호를 구성합니다.

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에 피드백을 제공하거나 지원 섹션을 참조하세요.

계측 라이브러리 설치 및 구성

계측 라이브러리를 프로젝트에 추가하여 특정 구성 요소 또는 종속성에 대한 원격 분석을 자동으로 수집할 수 있습니다.

다음 라이브러리는 Distro에 포함되어 있습니다.

계측 라이브러리 사용자 지정

Azure Monitor Distro에는 ASP.NET Core, HttpClient, SQLClient에 대한 .NET OpenTelemetry 계측이 포함되어 있습니다. 이러한 포함된 계측을 사용자 지정하거나 OpenTelemetry API를 사용하여 수동으로 추가 계측을 추가할 수 있습니다.

계측을 사용자 지정하는 방법의 몇 가지 예는 다음과 같습니다.

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 얼터너티브
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 코드 조각 제거

    Application Insights .NET SDK에서 제공하는 코드 조각을 사용한 경우 이를 제거해야 합니다. 제거할 항목에 대한 전체 코드 샘플은 웹 애플리케이션에 대한 클라이언트 쪽 원격 분석 사용 가이드를 검토하세요.

    클라이언트 쪽 원격 분석을 수집하기 위해 JavaScript SDK를 추가한 경우 이는 .NET SDK 없이 계속 작동하지만 제거할 수도 있습니다. 제거할 항목에 대한 전체 코드 샘플은 JavaScript SDK에 대한 온보딩 가이드를 검토하세요.

  • Visual Studio Artifacts 제거

    Visual Studio를 사용하여 Application Insights에 온보딩한 경우 프로젝트에 남은 파일이 더 많을 수 있습니다.

    • Properties/ServiceDependencies 디렉터리에 Application Insights 리소스에 대한 참조가 있을 수 있습니다.

제품 그룹은 이 설명서에 대한 피드백을 적극적으로 구하고 있습니다. otel@microsoft.com에 피드백을 제공하거나 지원 섹션을 참조하세요.

자주 묻는 질문

이 섹션은 원격 분석 이니셜라이저 또는 프로세서를 사용하거나 클래식 Application Insights API에 대한 사용자 지정 코드를 작성하여 사용자 지정 원격 분석을 만드는 고객을 위한 것입니다.

SDK API는 OpenTelemetry 개념에 어떻게 매핑하나요?

OpenTelemetry는 공급업체 중립적인 가시성 프레임워크입니다. OpenTelemetry SDK 또는 라이브러리에는 Application Insights API가 없습니다. 마이그레이션하기 전에 OpenTelemetry의 몇 가지 개념을 이해하는 것이 중요합니다.

  • Application Insights에서 모든 원격 분석은 단일 TelemetryClientTelemetryConfiguration을 통해 관리되었습니다. 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 DataType .NET 구현
customEvents EventTelemetry 해당 없음 해당 없음
customMetrics MetricTelemetry 메트릭 System.Diagnostics.Metrics.Meter
종속성 DependencyTelemetry 범위(클라이언트, 내부, 소비자) System.Diagnostics.Activity
예외 ExceptionTelemetry 예외 System.Exception
requests RequestTelemetry 범위(서버, 생산자) System.Diagnostics.Activity
traces TraceTelemetry 로그 Microsoft.Extensions.Logging.ILogger

다음 문서에서는 자세한 정보를 제공합니다.

Application Insights 샘플링 개념은 OpenTelemetry에 어떻게 매핑되나요?

Application Insights는 샘플링을 구성하는 여러 옵션을 제공하지만 Azure Monitor Exporter 또는 Azure Monitor Distro는 고정 속도 샘플링만 제공합니다. 요청종속성(OpenTelemetry Traces)만 샘플링할 수 있습니다.

샘플링을 구성하는 방법을 자세히 설명하는 코드 샘플은 샘플링 사용 가이드를 참조하세요.

원격 분석 프로세서 및 이니셜라이저는 OpenTelemetry에 어떻게 매핑하나요?

Application Insights .NET SDK에서 원격 분석 프로세서를 사용하여 원격 분석을 필터링 및 수정하거나 삭제합니다. 원격 분석 이니셜라이저를 사용하여 사용자 지정 속성을 추가하거나 수정합니다. 자세한 내용은 Azure Monitor 설명서를 참조하세요. OpenTelemetry는 이러한 개념을 원격 분석을 보강하고 필터링하는 활동 또는 로그 프로세서로 대체합니다.

추적 필터링

OpenTelemetry에서 원격 분석 데이터를 필터링하려면 활동 프로세서를 구현할 수 있습니다. 이 예제는 Azure Monitor 설명서에 설명된 대로 원격 분석 데이터를 필터링하는 Application Insights 예제와 동일합니다. 이 예제에서는 실패한 종속성 호출이 필터링되는 위치를 보여 줍니다.

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에 대한 별칭입니다.

다음 예제에서는 “오류”를 기본값 LogLevel로 정의하고 사용자 정의 범주에 대한 최소 LogLevel로 “경고”를 정의합니다. 정의된 이러한 규칙은 OpenTelemetryLoggerProvider에만 적용됩니다.

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

자세한 내용은 로그에 대한 OpenTelemetry .NET 설명서를 참조하세요.

추적에 사용자 지정 속성 추가

OpenTelemetry에서 활동 프로세서를 사용하여 더 많은 속성으로 원격 분석 데이터를 보강할 수 있습니다. 원격 분석 속성을 수정할 수 있는 Application Insights에서 원격 분석 이니셜라이저를 사용하는 것과 비슷합니다.

기본적으로 Azure Monitor Exporter는 실패한 경우 응답 코드가 400 이상인 HTTP 요청에 플래그를 지정합니다. 그러나 400을 성공으로 처리하려는 경우 활동의 성공을 설정하고 더 많은 원격 분석 속성을 포함하도록 태그를 추가하는 보강 활동 프로세서를 추가할 수 있습니다. Azure Monitor 설명서에 설명된 대로 Application Insights에서 이니셜라이저를 사용하여 속성을 추가하거나 수정하는 것과 비슷합니다.

다음은 사용자 지정 속성을 추가하고 특정 응답 코드에 대한 기본 동작을 재정의하는 방법의 예입니다.

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의 추적은 RequestTelemetryDependencyTelemetry로 저장됩니다. OpenTelemetry에서 추적은 Activity 클래스를 사용하는 Span으로 모델링됩니다.

OpenTelemetry .NET은 .NET 런타임의 일부인 추적에 대한 ActivitySource 클래스와 Activity 클래스를 사용합니다. 이 방법은 .NET 구현이 추적 API를 런타임 자체에 직접 통합하기 때문에 고유합니다. 이 System.Diagnostics.DiagnosticSource 패키지를 사용하면 개발자가 Activity 인스턴스를 만들고 관리하는 데 ActivitySource를 사용할 수 있습니다. 이 메서드는 .NET 에코시스템의 기본 제공 기능을 적용하여 외부 라이브러리에 의존하지 않고 .NET 애플리케이션에 추적을 추가하는 원활한 방법을 제공합니다. 자세한 내용은 분산 추적 계측 연습을 참조하세요.

수동 추적을 마이그레이션하는 방법은 다음과 같습니다.

참고 항목

Application Insights에서 역할 이름 및 역할 인스턴스는 원격 분석 수준별로 설정할 수 있습니다. 그러나 Azure Monitor Exporter를 사용하면 원격 분석 수준별로 사용자 지정할 수 없습니다. 역할 이름 및 역할 인스턴스는 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에서 StartOperationStopOperation 메서드를 사용하여 사용자 지정 작업을 추적합니다. OpenTelemetry .NET에서 ActivitySourceActivity를 사용하여 구현합니다. ActivityKind.ServerActivityKind.Consumer를 사용하는 작업의 경우 Azure Monitor Exporter는 RequestTelemetry를 생성합니다. ActivityKind.Client, ActivityKind.Producer, ActivityKind.Internal의 경우 DependencyTelemetry를 생성합니다. 사용자 지정 작업 추적에 대한 자세한 내용은 Azure Monitor 설명서를 참조하세요. .NET에서 ActivitySourceActivity를 사용하는 방법에 대한 자세한 내용은 .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의 로그는 TraceTelemetryExceptionTelemetry로 저장됩니다.

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에서 메트릭은 System.Diagnostics.DiagnosticSource 패키지에서 Meter로 모델링됩니다.

Application Insights에는 비사전 집계(TrackMetric()) 및 사전 집계(GetMetric().TrackValue()) 메트릭 API가 모두 있습니다. 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로 마이그레이션하려면 모든 Application Insights 메트릭 API 사용을 OpenTelemetry API로 바꿔야 합니다. 다양한 OpenTelemetry 계측과 해당 의미 체계를 이해해야 합니다.

히스토그램은 가장 기능이 많으며 Application Insights GetMetric().TrackValue() API와 가장 유사합니다. Application Insights 메트릭 API를 히스토그램으로 바꿔 동일한 목적을 달성할 수 있습니다.

기타 원격 분석 유형

CustomEvents

OpenTelemetry에서 지원되지 않습니다.

Application Insights 예제:

TelemetryClient.TrackEvent()
AvailabilityTelemetry

OpenTelemetry에서 지원되지 않습니다.

Application Insights 예제:

TelemetryClient.TrackAvailability()
PageViewTelemetry

OpenTelemetry에서 지원되지 않습니다.

Application Insights 예제:

TelemetryClient.TrackPageView()

콘솔 및 작업자 서비스 애플리케이션에 대한 라이브 메트릭을 가져올 수 있나요?

라이브 메트릭을 포함하지 않는 콘솔 및 작업자 서비스 애플리케이션에는 Azure Monitor OpenTelemetry Exporter를 사용하는 것이 좋습니다.

다음 단계

제품 그룹은 이 설명서에 대한 피드백을 적극적으로 구하고 있습니다. otel@microsoft.com에 피드백을 제공하거나 지원 섹션을 참조하세요.

지원