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

완료됨

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

앱에 OpenTelemetry 추가

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

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

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

범주 패키지 설명
Core API OpenTelemetry 핵심 OpenTelemetry 기능을 제공하는 기본 라이브러리입니다.
Core 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 Core WebApplicationBuilder에 서비스로 추가할 수 있는 IServiceCollection 클래스를 반환합니다.

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

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

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

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

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

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

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

진단 프로젝트가 완료되면 프로젝트에 대한 참조를 추가하고 서비스에 코드 한 줄만 추가하면 됩니다. 예를 들어, 제품 서비스에 OpenTelemetry를 포함하려면 Product.csproj 파일에 프로젝트 참조를 추가합니다.

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

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

var builder = WebApplication.CreateBuilder(args);

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

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