연습 - 클라우드 네이티브 애플리케이션에 OpenTelemetry 추가

완료됨

이 연습에서는 eShopLite 솔루션에 새 진단 프로젝트를 추가합니다. OpenTelemetry NuGet 패키지를 포함하고 Products 서비스에 가시성을 추가하는 방법을 알아보세요.

개발 환경을 열고 Azure 리소스 만들기

연습을 호스팅하는 GitHub 코드 공간을 사용하거나 Visual Studio Code에서 로컬로 연습을 완료하도록 선택할 수 있습니다.

codespace를 사용하려면 이 Codespace 만들기 링크를 사용하여 사전 구성된 GitHub Codespace를 만듭니다.

이 단계는 GitHub가 코드스페이스를 만들고 구성하는 동안 몇 분 정도 걸립니다. 프로세스가 완료되면 연습에 대한 코드 파일이 표시됩니다. 이 모듈의 나머지 부분에 사용되는 코드는 /dotnet-observability 디렉터리에 있습니다.

Visual Studio Code를 사용하려면 https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative 리포지토리를 로컬 컴퓨터에 복제합니다. 다음 작업:

  1. Visual Studio Code에서 Dev Container를 실행하려면 시스템 요구 사항을 설치합니다.
  2. Docker가 실행 중인지 확인합니다.
  3. 새 Visual Studio Code 창에서 복제된 리포지토리의 폴더를 엽니다.
  4. 명령 팔레트를 열려면 Ctrl+Shift+P를 누릅니다.
  5. 검색: >개발 컨테이너: 다시 빌드 및 컨테이너에서 다시 열기
  6. 드롭다운에서 eShopLite - dotnet-observability를 선택합니다. Visual Studio Code는 개발 컨테이너를 로컬로 만듭니다.

솔루션에 진단 프로젝트 추가

eShopLite 앱에 관찰성을 추가하는 첫 번째 단계는 솔루션에 새 진단 프로젝트를 도입하는 것입니다. 이 프로젝트에는 앱에 가시성을 추가하는 데 사용할 모든 OpenTelemetry 패키지 및 구성이 포함되어 있습니다.

  1. Visual Studio Code 명령 팔레트에서 >.NET을 입력합니다. 솔루션 열기.
  2. dotnet-observability/eShopLite/eShopLite.sln를 선택합니다.
  3. 솔루션 탐색기에서 탐색기 창 아래쪽에서 eShopLite 솔루션을 마우스 오른쪽 단추로 클릭한 다음 새 프로젝트를 선택합니다.
  4. 템플릿을 선택하여 새 .NET 프로젝트 대화 상자를 만들고 클래스 라이브러리(일반, 라이브러리)를 선택합니다.
  5. 이름 필드에 Diagnostics을 입력합니다.
  6. 다음 위치에서 프로젝트 생성 드롭다운에서 기본 디렉터리를 선택합니다.

OpenTelemetry 패키지 추가

이제 OpenTelemetry 패키지를 새 진단 프로젝트에 추가합니다.

  1. Visual Studio Code 아래쪽의 터미널 창을 사용하여 Diagnostics 프로젝트 폴더로 이동합니다.

    cd dotnet-observability/eShopLite/Diagnostics
    
  2. 다음 dotnet add 명령을 실행합니다.

    dotnet add package OpenTelemetry.Exporter.Console
    dotnet add package OpenTelemetry.Extensions.Hosting
    dotnet add package OpenTelemetry.Instrumentation.AspNetCore
    dotnet add package OpenTelemetry.Instrumentation.EventCounters --prerelease
    dotnet add package OpenTelemetry.Instrumentation.Runtime
    dotnet add package OpenTelemetry.Instrumentation.SqlClient --prerelease
    dotnet add package OpenTelemetry.Instrumentation.Http
    
  3. 탐색기 창에서 Diagnostics 폴더를 확장한 다음 Diagnostics.csproj를 선택합니다.

  4. 위쪽의 Project Sdk 값을 다음으로 변경합니다.

    <Project Sdk="Microsoft.NET.Sdk.Web">
    

    위의 코드를 사용하면 코드에서 IConfiguration 클래스를 사용할 수 있습니다.

  5. <PropertyGroup>에서 출력 형식을 추가합니다.

    <OutputType>Library</OutputType>
    

    위의 코드는 프로젝트가 라이브러리로 빌드되도록 합니다. 그렇지 않은 경우 컴파일러는 main 메서드가 있는 Program.cs 파일을 예상합니다.

OpenTelemetry를 사용하는 코드 추가

OpenTelemetry 패키지가 추가되면 이제 사용할 코드를 소개합니다.

  1. 탐색기 창에서 Class1.cs 파일을 마우스 오른쪽 단추로 클릭한 다음 이름 바꾸기를 선택합니다.

  2. 파일 이름을 DiagnosticServiceCollectionExtensions.cs으로 바꿉니다.

  3. 파일의 코드를 다음 코드로 바꿉니다.

    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;
      }
    }
    
  4. 터미널 창에서 다음 명령을 실행하여 프로젝트를 빌드합니다.

    dotnet build
    

    다음 예시와 유사한 출력이 표시됩니다.

    Build succeeded.
        0 Warning(s)
        0 Error(s)
    
  5. 이제 Diagnostics 프로젝트가 Products 서비스에서 사용할 준비가 되었습니다.

  6. 탐색기 창의 솔루션 탐색기에서 Products 프로젝트를 마우스 오른쪽 단추로 클릭한 다음 프로젝트 참조 추가를 선택합니다.

  7. 진단을 선택합니다.

  8. 탐색기 창에서 Product 폴더를 확장한 다음 Program.cs를 선택합니다.

  9. 코드 주석 // Add observability code here 아래에 Diagnostics 메서드에 대한 호출을 추가합니다.

    builder.Services.AddObservability("Products", builder.Configuration);
    
  10. 터미널 창에서 Products 폴더로 이동합니다.

    cd ../Products
    
  11. 다음 명령을 실행하여 프로젝트를 빌드합니다.

    dotnet build
    

    다음 예시와 유사한 출력이 표시됩니다.

    Build succeeded.
        0 Warning(s)
        0 Error(s)
    

Docker 설정 업데이트 및 앱 실행

  1. 터미널 창에서 dotnet-observability 폴더의 루트로 이동합니다.

    cd ..
    dotnet publish /p:PublishProfile=DefaultContainer
    
  2. 다음 Docker 명령을 실행합니다.

    cd /workspaces/mslearn-dotnet-cloudnative/dotnet-observability/
    docker compose up 
    

    백 엔드(Products 서비스) 및 프런트 엔드(Store 서비스) 컨테이너가 빌드되어야 합니다. 그런 다음 앱이 시작됩니다.

  3. codespace에서 이 연습을 수행하는 경우 Visual Studio Code 창 아래쪽의 포트 탭을 선택합니다. 프런트 엔드 서비스 옆에 있는 브라우저 열기 링크를 선택합니다.

  4. Visual Studio Code에서 이 연습을 로컬로 수행하는 경우 새 브라우저 탭에서 http://localhost:32000에서 앱으로 이동합니다.

  5. 앱의 탐색 모음에서 제품을 선택합니다.

    eShopLite 앱의 제품 페이지를 보여 주는 스크린샷. 이 페이지에는 이름, 설명, 가격이 포함된 제품 목록과 재고 업데이트 단추가 표시됩니다.

  6. 몇 가지 제품에 대한 재고 업데이트를 선택합니다. 그런 다음 대화 상자에서 주식 값을 변경하고 업데이트를 선택합니다.

  7. 터미널 탭을 선택하고 메시지를 스크롤합니다. OpenTelemetry의 메시지는 다음과 같습니다.

    backend-1   | Export ec.Microsoft-AspNetCore-Server-Kestrel.connection-queue-length, Meter: OpenTelemetry.Instrumentation.EventCounters/1.5.1.1
    backend-1   | (2023-11-09T19:55:14.8933518Z, 2023-11-09T20:04:44.8596671Z] http.request.method: PUT http.response.status_code: 200 http.route: /api/Stock/{id} network.protocol.name: http network.protocol.version: 1.1 url.scheme: http Histogram      
    backend-1   | Value: Sum: 0.05144170000000001 Count: 4 Min: 0.0039736 Max: 0.0359739
    
  8. 앱을 중지하려면 Ctrl+C를 누릅니다.

Products 서비스에 OpenTelemetry를 성공적으로 추가했습니다. 다음 단원에서는 Prometheus 및 Grafana와 같은 도구에서 원격 분석 데이터를 확인하여 원격 분석 데이터를 더 잘 활용하는 방법을 알아보세요.