연습 - .NET 8에서 원격 분석 확장

완료됨

현재 eShopLite 앱은 OpenTelemetry에서 제공하는 기본 원격 분석을 사용하고 있습니다. 원격 분석 데이터에 사용자 지정 메트릭 및 사용자 지정 특성을 추가하여 원격 분석을 확장할 수 있습니다. 이 기능을 사용하면 원격 분석 데이터에 더 많은 컨텍스트를 추가하고 Application Insights에서 더 강력한 쿼리를 만들 수 있습니다.

이 연습에서는 앱에 새 메트릭을 추가하고 관찰 앱에서 해당 메트릭을 보는 방법을 확인합니다.

사용자 지정 메트릭 만들기

사용자 지정 메트릭을 만들도록 시간이 지남에 따라 주식이 어떻게 변하는지 더 자세히 파악하려고 합니다.

  1. Visual Studio Code의 탐색기 창에서 Products 폴더를 마우스 오른쪽 단추로 클릭한 다음 새 파일을 선택합니다.

  2. 파일 이름 필드에 ProductsMetrics.cs를 입력합니다.

  3. 텍스트 편집기에서 코드를 다음 예제로 바꿉다.

    using System;
    using System.Diagnostics.Metrics;
    
    public class ProductsMetrics
    {
        private readonly Counter<int> _serviceCalls;
        private readonly Counter<int> _stockChange;
    
        public ProductsMetrics(IMeterFactory meterFactory)
        {
            var meter = meterFactory.Create("eShopLite.Products");
            _stockChange = meter.CreateCounter<int>("eshoplite.products.stock_change", unit: "{stock}", description: "Amount of stock being changed through the product service.");
        }
    
        public void StockChange(int quantity)
        {
            _stockChange.Add(quantity);
        }
    }
    

    앞의 코드는 eshoplite.products.stock_change라는 새 메트릭을 만듭니다. 이 메트릭은 제품 서비스를 통해 변경되는 재고 양을 추적합니다.

  4. Ctrl+S를 선택하여 파일을 저장합니다.

  5. 탐색기 창의 Products 폴더에서 Program.cs를 선택합니다.

  6. AddObservability 코드를 다음 코드로 바꿉니다.

    builder.Services.AddObservability("Products", builder.Configuration, ["eShopLite.Products"]);
    
    // Register the metrics service.
    builder.Services.AddSingleton<ProductsMetrics>();
    

    이 코드는 종속성 주입 컨테이너에 ProductsMetrics 클래스를 추가합니다.

  7. Ctrl+S를 선택하여 파일을 저장합니다.

  8. 탐색기 창의 Products 폴더에서 엔드포인트 폴더를 확장한 다음 ProductEndpoints.cs를 선택합니다.

  9. 기존 주식 업데이트 MapPut 엔드포인트를 다음 코드로 바꿉니다.

    stock.MapPut("/{id}", async  (int id, int stockAmount, ProductDataContext db, ProductsMetrics metrics) =>
    {
        // Increment the stock change metric.
        metrics.StockChange(stockAmount);
    
        var affected = await db.Product
            .Where(model => model.Id == id)
            .ExecuteUpdateAsync(setters => setters
              .SetProperty(m => m.Stock, stockAmount)
            );
    
        return affected == 1 ? Results.Ok() : Results.NotFound();
    })      
    

    종속성 주입을 사용하여 엔드포인트에 ProductsMetrics 클래스를 추가합니다. 그런 다음 StockChange 메서드를 호출하여 새 주식 금액으로 메트릭을 증가합니다.

  10. Ctrl+S를 선택하여 파일을 저장합니다.

OpenTelemetry에 메트릭 추가

이제 메트릭을 OpenTelemetry에 추가하여 관찰 도구로 내보낼 수 있습니다.

  1. 탐색기 창의 Diagnostics 폴더에서 DiagnosticServiceCollectionExtensions을 선택합니다.

  2. 새 매개 변수를 허용하도록 AddObservability 메서드를 변경합니다.

    public static IServiceCollection AddObservability(this IServiceCollection services,
        string serviceName,
        IConfiguration configuration,
        string[]? meeterNames = null)
    
  3. Prometheus 내보내기 줄 아래에 다음 코드를 추가합니다.

    .AddPrometheusExporter();
    
    // add any additional meters provided by the caller
    if (meeterNames != null)
    {
      foreach (var name in meeterNames)
      {
        metrics.AddMeter(name);
      }
    }
    
  4. Ctrl+S를 선택하여 파일을 저장합니다.

Prometheus에서 새 메트릭 보기

  1. 하단의 터미널 창에서 dotnet-observability/eShopLite 폴더로 이동합니다.

    cd ..
    
  2. 앱 컨테이너를 업데이트합니다.

    dotnet publish /p:PublishProfile=DefaultContainer 
    
  3. dotnet-observability 폴더로 이동하고 Docker로 앱을 시작합니다.

    cd ..
    docker compose up
    
  4. eShopLite의 브라우저에서 http://localhost:32000 앱을 엽니다.

  5. 제품 페이지로 이동하여 여러 제품의 재고 금액을 변경합니다.

  6. http://localhost:9090에서 Prometheus대시보드를 엽니다.

  7. 검색 상자에 eshoplite_products_stock_change_total 메트릭을 입력한 다음 실행을 선택합니다.

    표에 나열된 것이 표시됩니다.

  8. 그래프 탭을 선택합니다. 시간이 지남에 따라 주식 금액이 변경되는 것을 볼 수 있습니다.

    Screenshot that shows Prometheus showing the new custom metric on a graph.

  9. 터미널 창에서 Ctrl+C를 눌러 앱을 중지합니다.