클라우드 네이티브 애플리케이션에 가시성 추가

완료됨

이제 관찰 가능성의 중요성을 이해했으므로 클라우드 네이티브 애플리케이션에 이를 포함할 수 있는 방법을 확인할 수 있습니다. 앱에 OpenTelemetry를 추가하여 이 단계를 수행합니다.

앱에 OpenTelemetry 추가

.NET에는 로깅, 메트릭 및 추적 데이터를 생성하는 기본 제공 관찰 도구의 풍부한 에코시스템이 있습니다. 이러한 도구를 사용하여 클라우드 네이티브 애플리케이션에 가시성을 추가할 수 있습니다. 이러한 라이브러리는 다음과 같습니다.

  • 로깅: Microsoft.Extensions.Logging.ILogger
  • 메트릭: System.Diagnostics.Metrics.Meter
  • 추적: System.Diagnostics.ActivitySystem.Diagnostics.ActivitySource

OpenTelemetry는 이전의 모든 원격 분석을 사용하지만 먼저 클라우드 네이티브 앱은 NuGet 패키지를 통해 OpenTelemetry 지원을 추가해야 합니다. 이러한 패키지는 다음 세 그룹으로 분류할 수 있습니다.

카테고리 패키지 설명
핵심 API OpenTelemetry 핵심 OpenTelemetry 기능을 제공하는 기본 라이브러리입니다.
핵심 API OpenTelemetry.Extensions.Hosting ASP.NET Core 호스트에서 OpenTelemetry 추적을 자동으로 시작하고 중지하기 위한 확장 메서드를 제공합니다.
계측 OpenTelemetry.Instrumentation.AspNetCore ASP.NET Core 애플리케이션에 대한 계측. 이 패키지는 코드를 작성하지 않고도 앱에 대한 많은 메트릭을 수집합니다.
수출상 OpenTelemetry.Exporter.Console 콘솔의 내보내기를 사용하면 앱이 원격 분석을 콘솔에 쓸 수 있습니다.

클라우드 네이티브 앱에 더 많은 계측 및 내보내기 패키지를 포함할 수 있습니다. 자세한 내용은 OpenTelemetry를 사용한 .NET 관찰 가능성을 참조하세요. 빌드하는 앱의 유형에 따라 가장 관련성이 큰 패키지를 추가할 수 있습니다.

이 모듈에서는 eShopLite 클라우드 네이티브 앱에서 OpenTelemetry를 사용하는 데 중점을 둡니다. 이 앱은 .NET Core 및 Blazor WebAssembly를 사용하여 빌드되므로 모든 코드 예제는 종속성 주입을 활용하기 위한 것입니다.

앱의 다양한 OpenTelemetry 구성 요소를 보여 주는 다이어그램입니다.

마이크로 서비스 앱에서 OpenTelemetry제품스토어 서비스 모두에 모든 패키지를 포함하도록 선택할 수 있습니다. 그러나 실제 앱에는 더 많은 서비스가 있습니다. 이러한 모든 패키지를 각 패키지에 추가하려면 불필요한 중복이 발생합니다. 더 나은 방법은 마이크로 서비스가 관찰할 수 있는 새 진단 프로젝트를 솔루션에 추가하는 것입니다.

다음은 마이크로 서비스에서 OpenTelemetry를 사용하기 위해 호출할 수 있는 메서드 AddObservability 를 만드는 몇 가지 예제 코드입니다.

using OpenTelemetry.Metrics;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;

namespace Microsoft.Extensions.DependencyInjection;

public static class DiagnosticServiceCollectionExtensions
{
  public static IServiceCollection AddObservability(this IServiceCollection services,
      string serviceName,
      IConfiguration configuration)
  {
    // create the resource that references the service name passed in
    var resource = ResourceBuilder.CreateDefault().AddService(serviceName: serviceName, serviceVersion: "1.0");

    // add the OpenTelemetry services
    var otelBuilder = services.AddOpenTelemetry();

    otelBuilder
        // add the metrics providers
        .WithMetrics(metrics =>
        {
          metrics
            .SetResourceBuilder(resource)
            .AddRuntimeInstrumentation()
            .AddAspNetCoreInstrumentation()
            .AddHttpClientInstrumentation()
            .AddEventCountersInstrumentation(c =>
            {
              c.AddEventSources(
                      "Microsoft.AspNetCore.Hosting",
                      "Microsoft-AspNetCore-Server-Kestrel",
                      "System.Net.Http",
                      "System.Net.Sockets");
            })
            .AddMeter("Microsoft.AspNetCore.Hosting", "Microsoft.AspNetCore.Server.Kestrel")
            .AddConsoleExporter();

        })
        // add the tracing providers
        .WithTracing(tracing =>
        {
          tracing.SetResourceBuilder(resource)
                      .AddAspNetCoreInstrumentation()
                      .AddHttpClientInstrumentation()
                      .AddSqlClientInstrumentation();
        });

    return services;
  }

  // Add the Prometheus endpoints to your service, this will expose the metrics at http://service/metrics
  public static void MapObservability(this IEndpointRouteBuilder routes)
  {
    routes.MapPrometheusScrapingEndpoint();
  }
}

이 메서드는 ASP.NET CoreWebApplicationBuilder에 서비스로 추가할 수 있는 클래스를 반환 IServiceCollection 합니다.

그런 다음 OpenTelemetry 작성기를 저장하는 변수 var otelBuilder = services.AddOpenTelemetry() 를 만듭니다. 그런 다음, 코드에서 메트릭 및 추적을 추가할 수 있습니다 otelBuilder.

예를 들어 이 구성은 다음을 위한 계측을 추가합니다.

  • ASP.NET Core
  • C# 런타임
  • HttpCLient
  • Kestrel 웹 서버

이러한 메트릭은 콘솔에 표시됩니다. 이 메서드는 .AddConsoleExporter() 작성기에서 내보내기를 추가합니다.

또한 다음을 위해 추적을 콘솔에 추가합니다.

  • ASP.NET Core
  • HttpClient
  • SQL 클라이언트

마지막 줄은 클래스를 반환합니다 IServiceCollection .

진단 프로젝트가 완료되면 프로젝트에 대한 참조와 한 줄의 코드를 서비스에 추가하는 것만큼 간단합니다. 예를 들어 Products 서비스에 OpenTelemetry를 포함하려면 파일에 프로젝트 참조를 추가합니다 Product.csproj .

<ProjectReference Include="..\Diagnostics\Diagnostics.csproj" />

그런 다음, 다음 줄을 선언 아래의 Program.cs 파일에 추가합니다 builder.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddObservability("Products", builder.Configuration);

eShopLite 앱의 Products 서비스에 이 코드를 추가해 보겠습니다.