연습 - 클라우드 네이티브 애플리케이션에 OpenTelemetry 추가
이 연습에서는 솔루션에 새 진단 프로젝트를 추가합니다 eShopLite . OpenTelemetry NuGet 패키지를 포함하고 제품 서비스에 가시성을 추가하는 방법을 확인할 수 있습니다 .
개발 환경을 열고 Azure 리소스 만들기
연습을 호스트하는 GitHub 코드스페이스를 사용하거나 Visual Studio Code에서 로컬로 연습을 완료하도록 선택할 수 있습니다.
코드스페이스를 사용하려면 이 Codespace 만들기 템플릿을 사용하여 미리 구성된 GitHub 코드 스페이스를 만듭니다.
이 단계는 GitHub가 코드스페이스를 만들고 구성하는 동안 몇 분 정도 걸립니다. 프로세스가 완료되면 연습에 대한 코드 파일이 표시됩니다. 이 모듈의 나머지 부분에 사용되는 코드는 /dotnet-observability 디렉터리에 있습니다.
Visual Studio Code를 사용하려면 https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative 리포지토리를 로컬 컴퓨터에 복제합니다. 그러면:
- Visual Studio Code에서 Dev Container를 실행하기 위한 시스템 요구 사항을 설치합니다.
- Docker가 실행 중인지 확인합니다.
- 새 Visual Studio Code 창에서 복제된 리포지토리의 폴더를 엽니다.
- 명령 팔레트를 열려면 Ctrl+Shift+P를 누릅니다.
- 검색: >개발 컨테이너: 컨테이너에서 다시 빌드 및 다시 열기.
- 드롭다운에서 eShopLite - dotnet-observability 를 선택합니다. Visual Studio Code는 개발 컨테이너를 로컬로 만듭니다.
솔루션에 진단 프로젝트 추가
앱에 관찰성을 eShopLite 추가하는 첫 번째 단계는 솔루션에 새 진단 프로젝트를 도입하는 것입니다. 이 프로젝트에는 앱에 가시성을 추가하는 데 사용할 모든 OpenTelemetry 패키지 및 구성이 포함되어 있습니다.
- Codespace 명령 팔레트에서 .NET: Open Solution을 입력>합니다.
- dotnet-observability/eShopLite/eShopLite.sln 선택합니다.
- 솔루션 탐색기의탐색기 창 아래쪽에서 eShopLite 솔루션을 마우스 오른쪽 단추로 클릭한 다음 새 프로젝트를 선택합니다.
- 새 .NET 프로젝트 대화 상자를 만들 템플릿 선택 대화 상자에서 클래스 라이브러리(일반, 라이브러리)를 선택합니다.
- 이름 필드에 진단을 입력합니다.
- 프로젝트가 생성될 드롭다운에서 파일 경로 디렉터리가 /workspaces/mslearn-dotnet-cloudnative/dotnet-observability/eShopLite/인지 확인합니다.
OpenTelemetry 패키지 추가
이제 OpenTelemetry 패키지를 새 진단 프로젝트에 추가합니다.
Codespace 아래쪽의 터미널 창을 사용하여 진단 프로젝트 폴더로 이동합니다.
cd dotnet-observability/eShopLite/Diagnostics
다음
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
탐색기 창에서 진단 폴더를 확장한 다음 Diagnostics.csproj를 선택합니다.
위쪽의
Project Sdk
값을 다음으로 변경합니다.<Project Sdk="Microsoft.NET.Sdk.Web">
위의 코드를 사용하면 코드에서 클래스를
IConfiguration
사용할 수 있습니다.에서
<PropertyGroup>
출력 형식을 추가합니다.<OutputType>Library</OutputType>
위의 코드는 프로젝트가 라이브러리로 빌드되도록 합니다. 그렇지 않은 경우, 컴파일러는
Program.cs
메서드가 있는main
파일을 예상합니다.
OpenTelemetry를 사용하는 코드 추가
OpenTelemetry 패키지가 추가되면 이제 사용할 코드를 소개합니다.
탐색기 창에서 Class1.cs 파일을 마우스 오른쪽 단추로 클릭한 다음 이름 바꾸기를 선택합니다.
파일 이름을 DiagnosticServiceCollectionExtensions.cs로 변경하십시오.
파일의 코드를 다음 코드로 바꿉다.
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; } }
터미널 창에서 다음 명령을 실행하여 프로젝트를 빌드합니다.
dotnet build
다음 예시와 유사한 출력이 표시됩니다.
Build succeeded. 0 Warning(s) 0 Error(s)
이제 Products 서비스에서 진단 프로젝트를 사용할 준비가 되었습니다.
탐색기 창의 솔루션 탐색기에서 제품 프로젝트를 마우스 오른쪽 단추로 클릭한 다음 프로젝트 참조 추가를 선택합니다.
진단을 선택합니다.
탐색기 창에서 Products 폴더를 확장한 다음 Program.cs 선택합니다.
코드 주석
// Add observability code here
아래에서 Diagnostics 메서드에 대한 호출을 추가합니다.builder.Services.AddObservability("Products", builder.Configuration);
터미널 창에서 Products 폴더로 이동합니다.
cd ../Products
다음 명령을 실행하여 프로젝트를 빌드합니다.
dotnet build
다음 예시와 유사한 출력이 표시됩니다.
Build succeeded. 0 Warning(s) 0 Error(s)
Docker 설정 업데이트 및 앱 실행
터미널 창에서 dotnet-observability 폴더의 루트로 이동합니다.
cd .. dotnet publish /p:PublishProfile=DefaultContainer
다음 Docker 명령을 실행합니다.
cd /workspaces/mslearn-dotnet-cloudnative/dotnet-observability/ docker compose up
백 엔드(제품 서비스) 및 프런트 엔드(Store 서비스) 컨테이너가 빌드되어야 합니다. 그런 다음 앱이 시작됩니다.
코드스페이스에서 이 연습을 수행하는 경우 Visual Studio Code 창 아래쪽에 있는 포트 탭을 선택합니다. 프런트 엔드 서비스 옆에 있는 브라우저에서 열기 링크를 선택합니다.
Visual Studio Code에서 이 연습을 로컬로 수행하는 경우 새 브라우저 탭에서 앱
http://localhost:32000
으로 이동합니다.앱의 탐색 모음에서 제품을 선택합니다.
여러 제품에 대해 재고 업데이트를 선택합니다. 그런 다음 대화 상자에서 주식 값을 변경하고 업데이트를 선택합니다.
터미널 탭을 선택하고 메시지를 스크롤합니다. 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
Ctrl+C를 눌러 앱을 중지합니다.
Products 서비스에 OpenTelemetry를 성공적으로 추가했습니다. 다음 단원에서는 Prometheus 및 Grafana와 같은 도구에서 원격 분석 데이터를 확인하여 원격 분석 데이터를 더 잘 활용하는 방법을 알아보세요.