다음을 통해 공유


OpenTelemetry를 사용한 .NET 가시성

애플리케이션을 실행할 때 앱이 잘 작동하고 있는지 확인하고 잠재적인 문제가 더 심각해지기 전에 이를 알아내고자 할 것입니다. 앱에서 로그나 메트릭과 같은 원격 분석 데이터를 내보낸 다음, 해당 데이터를 모니터링하고 분석하여 그렇게 할 수 있습니다.

가시성이란?

분산 시스템의 컨텍스트에서 가시성이란 각 구성 요소의 상태에 대한 원격 분석을 모니터링하고 분석하여 성능의 변화를 관찰하고 그러한 변화가 발생하는 이유를 진단하는 기능입니다. 디버깅은 침습적이고 애플리케이션 작동에 영향을 줄 수 있는 반면에, 가시성은 기본적인 작업에 투명하고 성능에 미치는 영향이 작아 지속적으로 사용할 수 있습니다.

가시성은 일반적으로 다음의 조합을 사용하여 수행됩니다.

로그, 메트릭 및 분산 추적을 함께 관찰의 세 가지 핵심 요소라고도 합니다.

각 핵심 요소에는 다음의 원격 분석 데이터가 포함될 수 있습니다.

  • 가비지 수집기 또는 JIT 컴파일러와 같은 .NET 런타임입니다.
  • Kestrel(ASP.NET 웹 서버) 및 HttpClient와 같은 라이브러리입니다.
  • 코드에서 내보낸 애플리케이션별 원격 분석입니다.

.NET에서의 가시성 접근법

.NET 애플리케이션에서 가시성을 달성하는 방법에는 몇 가지가 있습니다.

  • OpenTelemetry와 같은 라이브러리를 참조하고 사용하여 코드에서 명시적으로 수행합니다. 소스 코드에 액세스할 수 있고 앱을 다시 빌드할 수 있는 경우 이는 가장 강력하고 구성 가능한 메커니즘입니다.
  • EventPipe를 사용하는Out of Process입니다. dotnet-monitor와 같은 도구는 로그와 메트릭을 수신 대기한 다음, 코드에 영향을 주지 않고 처리할 수 있습니다.
  • 시작 후크를 사용하여 어셈블리를 프로세스에 삽입한 다음, 계측을 수집할 수 있습니다. 이 방법의 예로 OpenTelemetry .NET 자동 계측이 있습니다.

OpenTelemetry란?

OpenTelemetry(OTel)는 원격 분석 데이터를 수집하고 내보내는 플랫폼 간 개방형 표준입니다. OpenTelemetry에는 다음이 포함됩니다.

  • 코드가 실행 중일 때 원격 분석 데이터를 기록하는 데 사용할 라이브러리용 API입니다.
  • 앱 개발자가 기록된 데이터의 어느 부분을 네트워크를 통해 전송할 것인지, 어디로 전송할 것인지, 어떻게 필터링, 버퍼링, 보강 및 변환할 수 있는지 구성하는 데 사용하는 API입니다.
  • 의미 체계 규칙은 원격 분석 데이터의 명명 및 콘텐츠에 대한 지침을 제공합니다. 원격 분석 데이터를 생성하는 앱과 데이터를 수신하는 도구가 다양한 종류의 데이터가 무엇을 의미하고 어떤 종류의 데이터가 유용한지에 대해 합의하여 도구가 효과적인 분석을 제공할 수 있도록 하는 것이 중요합니다.
  • 내보내기용 인터페이스입니다. 내보내기는 원격 분석 데이터를 특정 형식으로 다른 원격 분석 백 엔드로 전송할 수 있도록 하는 플러그 인입니다.
  • OTLP 유선 프로토콜은 원격 분석 데이터를 전송하기 위한 공급업체 중립 네트워크 프로토콜 옵션입니다. 일부 도구와 공급업체는 기존에 소유한 재산적 가치를 가지는 프로토콜 외에도 이 프로토콜을 지원합니다.

OTel을 사용하면 PrometheusGrafana, Microsoft의 Azure에 있는 APM 제품인 Azure Monitor 또는 OpenTelemetry와 협력하는 많은 APM 공급업체와 같은 오픈 소스 시스템을 비롯한 다양한 APM 시스템을 사용할 수 있습니다.

.NET을 비롯한 대부분의 언어와 플랫폼에 대한 OpenTelemetry 구현이 있습니다.

OpenTelemetry의 .NET 구현

.NET OpenTelemetry 구현은 .NET이 프레임워크에서 로깅, 메트릭, 활동 API를 제공하므로 다른 플랫폼과 약간 다릅니다. 즉, OTel은 라이브러리 작성자가 사용할 API를 제공할 필요가 없습니다. .NET OTel 구현은 계측을 위해 다음 플랫폼 API를 사용합니다.

.NET OTel 아키텍처

OTel은 계측 라이브러리를 통해 해당 API 및 기타 소스에서 원격 분석을 수집한 다음, 스토리지 및 분석을 위해 이를 APM(애플리케이션 성능 모니터링) 시스템으로 내보냅니다. OTel은 업계 표준으로서 수집에 대한 일반적인 메커니즘, 원격 분석 데이터에 대한 일반적인 스키마와 의미 체계, APM이 OTel과 통합될 수 있는 방법에 대한 API라는 이점을 제공합니다. OTel을 사용하면 애플리케이션에서 OTel 표준에 어긋나는 APM 특정 API나 데이터 구조를 사용할 필요가 없습니다. APM은 APM 특정 내보내기 구성 요소를 구현하거나 원격 분석 데이터를 APM 시스템으로 내보내는 새로운 유선 표준인 OTLP를 사용할 수 있습니다.

OpenTelemetry 패키지

.NET의 OpenTelemetry는 다음과 같은 몇 가지 범주를 구성하는 일련의 NuGet 패키지로 구현됩니다.

  • Core API
  • 계측 - 이 패키지는 런타임 및 공용 라이브러리에서 계측을 수집합니다.
  • 내보내기 - Prometheus, Jaeger, OTLP와 같은 APM 시스템을 사용하여 접속합니다.

다음 표는 기본 패키지를 보여 줍니다.

패키지 이름 설명
OpenTelemetry 핵심 OTEL 기능을 제공하는 기본 라이브러리
OpenTelemetry.Instrumentation.AspNetCore ASP.NET Core 및 Kestrel 계측
OpenTelemetry.Instrumentation.GrpcNetClient 아웃바운드 gRPC 호출을 추적하기 위한 gRPC 클라이언트 계측
OpenTelemetry.Instrumentation.Http 아웃바운드 HTTP 호출을 추적하기 위한 HttpClientHttpWebRequest 계측
OpenTelemetry.Instrumentation.SqlClient 데이터베이스 작업을 추적하는 데 사용되는 SqlClient 계측
OpenTelemetry.Exporter.Console 내보내는 원격 분석을 진단하는 데 일반적으로 사용되는 콘솔용 내보내기
OpenTelemetry.Exporter.OpenTelemetryProtocol OTLP 프로토콜을 사용하는 내보내기
OpenTelemetry.Exporter.Prometheus.AspNetCore ASP.NET Core 엔드포인트를 사용하여 구현된 Prometheus용 내보내기
OpenTelemetry.Exporter.Zipkin Zipkin 추적용 내보내기

예제

이 항목은 .NET에서 OpenTelemetry를 사용하기 위한 몇 가지 예제 연습으로 계속됩니다.

.NET Aspire의 OpenTelemetry

.NET Aspire 는 분산 애플리케이션을 쉽게 만들고 사용할 수 있도록 .NET에 대한 확장 집합입니다. .NET Aspire를 사용할 때의 이점 중 하나는 .NET용 OpenTelemetry 라이브러리를 사용하여 원격 분석이 기본 제공된다는 것입니다. .NET Aspire의 기본 프로젝트 템플릿에는 OTel을 ServiceDefaults 설치하고 구성하는 프로젝트가 포함되어 있습니다. 서비스 기본값 프로젝트는 .NET Aspire 솔루션의 각 서비스에서 참조되고 초기화됩니다.

서비스 기본값 프로젝트 템플릿에는 OTel SDK, ASP.NET, HttpClient 및 런타임 계측 패키지가 포함되며 파일에서 Extensions.cs 구성됩니다. 원격 분석 .NET Aspire 내보내기의 경우 Aspire 대시보드를 사용하여 원격 분석 시각화를 제공할 수 있도록 기본적으로 OTLP 내보내기가 포함됩니다.

Aspire 대시보드는 원격 분석 관찰을 로컬 디버그 주기로 가져오도록 설계되었으며, 이를 통해 개발자는 애플리케이션에서 원격 분석을 생성할 뿐만 아니라 해당 원격 분석을 사용하여 해당 애플리케이션을 로컬로 진단할 수 있습니다. 서비스 간의 호출을 관찰할 수 있다는 것은 프로덕션에서처럼 디버그 시와 마찬가지로 유용하다는 것을 증명합니다. .NET Aspire 대시보드는 Visual Studio 또는 dotnet run AppHost 프로젝트에서 Project를 F5 AppHost 로 실행하면 자동으로 시작됩니다.

Aspire 대시보드

.NET Aspire에 대한 자세한 내용은 다음을 참조하세요.

.NET Aspire 오케스트레이션 없이 서비스 기본값 프로젝트 다시 사용

아마도 ASP.NET 프로젝트에 OTel을 구성하는 가장 쉬운 방법은 오케스트레이션에 AppHost와 같은 나머지 .NET Aspire를 사용하지 않더라도 Aspire 서비스 기본값 프로젝트를 사용하는 것입니다. 서비스 기본값 프로젝트는 Visual Studio 또는 dotnet new.를 통해 프로젝트 템플릿으로 사용할 수 있습니다. OTel을 구성하고 OTLP 내보내기를 설정합니다. 그런 다음 OTel 환경 변수사용하여 원격 분석을 전송하도록 OTLP 엔드포인트를 구성하고 애플리케이션에 대한 리소스 속성을 제공할 수 있습니다.

.NET Aspire 외부에서 ServiceDefaults를 사용하는 단계는 다음과 같습니다.

  • Visual Studio에서 새 프로젝트 추가를 사용하여 솔루션에 ServiceDefaults 프로젝트를 추가하거나 dotnet new aspire-servicedefaults --output ServiceDefaults
  • ASP.NET 애플리케이션에서 ServiceDefaults 프로젝트를 참조합니다. Visual Studio에서 "추가 -> 프로젝트 참조"를 사용하고 ServiceDefaults 프로젝트를 선택합니다.
  • 애플리케이션 작성기 초기화의 일부로 OpenTelemetry 설치 함수를 호출합니다.
var builder = WebApplication.CreateBuilder(args);
builder.ConfigureOpenTelemetry();

var app = builder.Build();

app.MapGet("/", () => "Hello World!");

app.Run();

서비스 기본값은 필요한 경우 또는 특정 함수를 통해 AddServiceDefaults() 다음과 같은 추가 기능을 설정할 수 있습니다.

  • 엔드포인트 및 /alive 엔드포인트를 /health 사용하여 상태 검사
  • .NET Aspire의 나머지 부분 없이는 작동하지 않는 서비스 검색
  • 오류 발생 시 요청을 다시 시도하는 HttpClient에 대한 복원력 구성