콘텐츠로 이동

OpenTelemetry .NET

OpenTelemetry .NET 자동 계측(Automatic Instrumentation)은 CLR Profiler와 Startup Hook을 사용하여 런타임에 SDK와 계측 라이브러리를 로드합니다. 비즈니스 코드를 수정하지 않고도 지원되는 ASP.NET, HTTP 클라이언트, 데이터베이스 및 메시지 시스템 호출 등을 수집할 수 있습니다.

이 문서에서는 DataKit의 OpenTelemetry 수집기를 사용하여 OTLP 데이터를 수신하고 Guance로 전달합니다:

.NET 애플리케이션 + OpenTelemetry .NET 자동 계측 -> OTLP -> DataKit -> Guance

전제 조건

  • Microsoft에서 아직 지원 중인 .NET 버전 사용; .NET Framework 최소 지원 버전은 4.6.2
  • 지원되는 x86, x64 또는 ARM64 실행 환경 사용 (ARM64 지원은 아직 실험 단계)
  • DataKit이 설치되어 있고 Guance 워크스페이스에 연결되어 있어야 함
  • .NET 애플리케이션에서 DataKit으로 네트워크 접근 가능: OTLP/HTTP는 DataKit HTTP 포트 9529 사용, OTLP/gRPC는 기본적으로 4317 사용

버전 지원

원문의 버전 호환성 정보를 유지하며, 현재 공식 호환성 선언을 최종 기준으로 합니다:

.NET 버전 관련 자동 계측 버전 설명
.NET 10 v1.13.0부터 v1.13.0에서 .NET 10 지원이 명시적으로 추가되었습니다.
.NET 9 v1.13.0 포함 v1.13.0에서 .NET 9 STS 수명 주기 관련 규칙이 업데이트되었습니다.
.NET 8 v1.2.0부터 v1.2.0에서 .NET 8 지원이 명시적으로 추가되었습니다.
.NET 7 이전 버전에서 지원 .NET 7은 Microsoft 지원이 종료되었으므로 프로덕션 환경에 사용하지 않는 것이 좋습니다.
.NET Framework 4.6.2+ 일반 호환성 요구 사항 4.6.2는 현재 자동 계측이 지원하는 최소 .NET Framework 버전입니다.

설치 시 구버전 v1.2.0 모듈 주소를 고정하여 사용하지 말고, 이 문서에서 제공하는 releases/latest/download 공식 주소를 사용하여 현재 버전을 받으십시오. 업그레이드 전에 OpenTelemetry .NET Automatic Instrumentation Releases를 확인하고 테스트 환경에서 대상 애플리케이션과 종속성을 검증하는 것이 좋습니다.

1. OpenTelemetry 수집기 활성화

DataKit 설치 디렉터리의 conf.d/opentelemetry로 이동합니다. 수집기 설정이 아직 생성되지 않은 경우, 샘플 파일을 복사합니다:

cd /usr/local/datakit/conf.d/opentelemetry
sudo cp opentelemetry.conf.sample opentelemetry.conf

opentelemetry.conf에 최소한 다음 수신 설정이 포함되어 있는지 확인합니다:

[[inputs.opentelemetry]]
  # Guance에서 태그로 유지할 사용자 정의 속성을 화이트리스트에 추가합니다.
  customer_tags = ["team", "project"]

  [inputs.opentelemetry.http]
    http_status_ok = 200
    trace_api = "/otel/v1/traces"
    metric_api = "/otel/v1/metrics"
    logs_api = "/otel/v1/logs"

  [inputs.opentelemetry.grpc]
    addr = "127.0.0.1:4317"
    max_payload = 16777216

수신 주소는 다음과 같습니다:

프로토콜 데이터 유형 DataKit 수신 주소
OTLP/HTTP + Protobuf Trace http://<DataKit-IP>:9529/otel/v1/traces
OTLP/HTTP + Protobuf Metric http://<DataKit-IP>:9529/otel/v1/metrics
OTLP/HTTP + Protobuf Log http://<DataKit-IP>:9529/otel/v1/logs
OTLP/gRPC Trace, Metric, Log http://<DataKit-IP>:4317

.NET 애플리케이션이 DataKit과 동일한 호스트에 있지 않은 경우, 실제 배포에 맞게 DataKit 수신 주소, 방화벽 또는 기타 네트워크 접근 제어를 조정해야 합니다. gRPC는 addr을 애플리케이션에서 접근 가능한 수신 주소(예: 0.0.0.0:4317)로 변경할 수 있습니다. OTLP 수신 포트를 공용 네트워크에 직접 노출하지 마십시오.

DataKit을 재시작하고 서비스를 확인합니다:

sudo datakit service restart
curl http://127.0.0.1:9529/v1/ping

2. 애플리케이션에 OpenTelemetry 연동

Linux 및 macOS

OpenTelemetry 공식 GitHub 릴리스에서 최신 설치 스크립트를 다운로드하여 실행합니다:

curl -sSfL \
  https://github.com/open-telemetry/opentelemetry-dotnet-instrumentation/releases/latest/download/otel-dotnet-auto-install.sh \
  -O

sh ./otel-dotnet-auto-install.sh
chmod +x "$HOME/.otel-dotnet-auto/instrument.sh"

보고 파라미터를 설정하고 자동 계측에 필요한 변수를 현재 셸에 주입합니다:

export OTEL_SERVICE_NAME="order-service"
export OTEL_RESOURCE_ATTRIBUTES="env=prod,version=1.0.0,team=backend"

export OTEL_TRACES_EXPORTER="otlp"
export OTEL_METRICS_EXPORTER="none"
export OTEL_LOGS_EXPORTER="none"

export OTEL_EXPORTER_OTLP_PROTOCOL="http/protobuf"
export OTEL_EXPORTER_OTLP_ENDPOINT="http://127.0.0.1:9529/otel"
export OTEL_PROPAGATORS="tracecontext,baggage"

. "$HOME/.otel-dotnet-auto/instrument.sh"
./MyNetApp

dotnet을 통해 DLL을 시작하는 경우 마지막 줄을 다음과 같이 변경합니다:

dotnet MyNetApp.dll

instrument.sh는 현재 셸 및 그 하위 프로세스에만 영향을 미칩니다. systemd, Supervisor 또는 기타 프로세스 관리자 시나리오에서는 서비스 시작 환경에서 해당 스크립트를 로드하고 OTEL_*를 설정한 후 애플리케이션 프로세스를 완전히 재시작해야 합니다.

Windows PowerShell

관리자 권한의 Windows PowerShell Desktop 5.1을 사용하여 실행합니다. PowerShell Core 6.0 이상은 현재 설치 모듈에서 지원되지 않습니다:

#Requires -PSEdition Desktop

$moduleUrl = "https://github.com/open-telemetry/opentelemetry-dotnet-instrumentation/releases/latest/download/OpenTelemetry.DotNet.Auto.psm1"
$downloadPath = Join-Path $env:TEMP "OpenTelemetry.DotNet.Auto.psm1"

Invoke-WebRequest -Uri $moduleUrl -OutFile $downloadPath -UseBasicParsing
Import-Module $downloadPath -Force
Install-OpenTelemetryCore

$env:OTEL_SERVICE_NAME = "order-service"
$env:OTEL_RESOURCE_ATTRIBUTES = "env=prod,version=1.0.0,team=backend"
$env:OTEL_TRACES_EXPORTER = "otlp"
$env:OTEL_METRICS_EXPORTER = "none"
$env:OTEL_LOGS_EXPORTER = "none"
$env:OTEL_EXPORTER_OTLP_PROTOCOL = "http/protobuf"
$env:OTEL_EXPORTER_OTLP_ENDPOINT = "http://127.0.0.1:9529/otel"
$env:OTEL_PROPAGATORS = "tracecontext,baggage"

Register-OpenTelemetryForCurrentSession -OTelServiceName "order-service"
.\MyNetApp.exe

위 변수는 현재 PowerShell 세션 및 해당 세션에서 시작된 하위 프로세스에만 적용되며, 이미 실행 중인 Windows Service 또는 IIS 작업자 프로세스에는 자동으로 영향을 주지 않습니다.

Windows 전역 환경 변수

원문에서는 여러 보고 파라미터를 통합 설정해야 하는 전용 호스트에 적합한 Machine 수준 환경 변수 방안을 제공합니다. 다음 명령은 OpenTelemetry 데이터 파라미터만 설정하며, Register-OpenTelemetryForCurrentSession, Register-OpenTelemetryForWindowsService 또는 Register-OpenTelemetryForIIS가 대상 프로세스에 대해 자동 계측을 등록하는 작업을 대체하지 않습니다.

관리자 PowerShell을 사용하여 실행하십시오:

[Environment]::SetEnvironmentVariable("OTEL_SERVICE_NAME", "order-service", "Machine")
[Environment]::SetEnvironmentVariable("OTEL_RESOURCE_ATTRIBUTES", "env=prod,version=1.0.0,team=backend", "Machine")
[Environment]::SetEnvironmentVariable("OTEL_TRACES_EXPORTER", "otlp", "Machine")
[Environment]::SetEnvironmentVariable("OTEL_METRICS_EXPORTER", "none", "Machine")
[Environment]::SetEnvironmentVariable("OTEL_LOGS_EXPORTER", "none", "Machine")
[Environment]::SetEnvironmentVariable("OTEL_EXPORTER_OTLP_PROTOCOL", "http/protobuf", "Machine")
[Environment]::SetEnvironmentVariable("OTEL_EXPORTER_OTLP_ENDPOINT", "http://127.0.0.1:9529/otel", "Machine")
[Environment]::SetEnvironmentVariable("OTEL_LOG_LEVEL", "info", "Machine")
[Environment]::SetEnvironmentVariable("OTEL_DOTNET_AUTO_LOGGER", "file", "Machine")
[Environment]::SetEnvironmentVariable(
  "OTEL_DOTNET_AUTO_LOG_DIRECTORY",
  "C:\ProgramData\OpenTelemetry .NET AutoInstrumentation\logs",
  "Machine"
)

Machine 수준 변수 확인:

$names = @(
  "OTEL_SERVICE_NAME",
  "OTEL_RESOURCE_ATTRIBUTES",
  "OTEL_TRACES_EXPORTER",
  "OTEL_METRICS_EXPORTER",
  "OTEL_LOGS_EXPORTER",
  "OTEL_EXPORTER_OTLP_PROTOCOL",
  "OTEL_EXPORTER_OTLP_ENDPOINT",
  "OTEL_LOG_LEVEL",
  "OTEL_DOTNET_AUTO_LOGGER",
  "OTEL_DOTNET_AUTO_LOG_DIRECTORY"
)

foreach ($name in $names) {
  "{0} = {1}" -f $name, [Environment]::GetEnvironmentVariable($name, "Machine")
}

Machine 수준 변수는 새로 시작된 프로세스에서만 읽힙니다. 설정 후 대상 Windows Service, IIS 애플리케이션 풀 또는 IIS를 재시작해야 합니다:

Restart-WebAppPool -Name "OrderAppPool"
# 또는 영향 범위를 확인한 후 IIS 재시작
iisreset

Machine 수준 설정은 호스트의 여러 프로세스에 영향을 미치므로 공유 호스트에서는 기본 방식으로 권장되지 않습니다. 현재 세션, 특정 Windows Service 또는 특정 IIS 애플리케이션 풀에 대한 설정 방식을 우선 사용하십시오.

Windows Service

핵심 파일을 설치한 후 공식 모듈을 사용하여 특정 서비스를 등록할 수 있습니다:

Import-Module $downloadPath -Force
Install-OpenTelemetryCore

Register-OpenTelemetryForWindowsService `
  -WindowsServiceName "OrderService" `
  -OTelServiceName "order-service"

Register-OpenTelemetryForWindowsService는 대상 서비스를 재시작합니다. 또한 데이터 보고에 필요한 OTEL_* 파라미터가 해당 Windows Service의 프로세스 환경에 존재하는지 확인해야 합니다. 파라미터를 수정한 후 서비스를 다시 재시작하십시오.

IIS의 ASP.NET Framework

다음 방식은 IIS에서 호스팅되는 ASP.NET .NET Framework 애플리케이션에 적용됩니다:

Import-Module $downloadPath -Force
Install-OpenTelemetryCore
Register-OpenTelemetryForIIS

Register-OpenTelemetryForIIS는 IIS를 재시작합니다. 일반적인 보고 파라미터는 애플리케이션의 Web.config에 작성할 수 있습니다:

<configuration>
  <appSettings>
    <add key="OTEL_SERVICE_NAME" value="order-service" />
    <add key="OTEL_RESOURCE_ATTRIBUTES" value="env=prod,version=1.0.0,team=backend" />
    <add key="OTEL_TRACES_EXPORTER" value="otlp" />
    <add key="OTEL_METRICS_EXPORTER" value="none" />
    <add key="OTEL_LOGS_EXPORTER" value="none" />
    <add key="OTEL_EXPORTER_OTLP_PROTOCOL" value="http/protobuf" />
    <add key="OTEL_EXPORTER_OTLP_ENDPOINT" value="http://127.0.0.1:9529/otel" />
  </appSettings>
</configuration>

환경 변수의 우선순위는 App.config 또는 Web.config보다 높습니다. 동일한 IIS 애플리케이션 풀의 여러 .NET Framework 애플리케이션이 작업자 프로세스를 공유하는 경우, 가장 먼저 시작된 애플리케이션이 해당 프로세스에서 사용하는 OpenTelemetry SDK 설정을 결정합니다. 별도의 서비스 이름과 보고 파라미터가 필요한 경우 독립적인 애플리케이션 풀을 사용해야 합니다.

IIS 애플리케이션 풀 특정 설정

원문에서는 applicationHost.config에서 직접 특정 애플리케이션 풀에 대한 환경 변수를 설정하는 방식도 제공합니다. 이는 일부 사이트만 수집해야 하는 경우에 적합합니다. 수정 전에 백업하십시오:

C:\Windows\System32\inetsrv\config\applicationHost.config

<system.applicationHost> 아래에서 <applicationPools>를 찾아 대상 애플리케이션 풀의 <add> 노드에 다음을 추가합니다:

<applicationPools>
  <add name="OrderAppPool">
    <environmentVariables>
      <add name="OTEL_SERVICE_NAME" value="order-service" />
      <add name="OTEL_RESOURCE_ATTRIBUTES" value="env=prod,version=1.0.0,team=backend" />
      <add name="OTEL_TRACES_EXPORTER" value="otlp" />
      <add name="OTEL_METRICS_EXPORTER" value="none" />
      <add name="OTEL_LOGS_EXPORTER" value="none" />
      <add name="OTEL_EXPORTER_OTLP_PROTOCOL" value="http/protobuf" />
      <add name="OTEL_EXPORTER_OTLP_ENDPOINT" value="http://127.0.0.1:9529/otel" />
      <add name="OTEL_LOG_LEVEL" value="info" />
      <add name="OTEL_DOTNET_AUTO_LOGGER" value="file" />
      <add
        name="OTEL_DOTNET_AUTO_LOG_DIRECTORY"
        value="C:\ProgramData\OpenTelemetry .NET AutoInstrumentation\logs" />
    </environmentVariables>
  </add>
</applicationPools>

설정을 완료한 후 대상 애플리케이션 풀을 재시작합니다. 애플리케이션 풀 수준 환경 변수는 동일한 이름의 Machine 수준 변수를 덮어씁니다. 전역 값을 통일하여 사용하려면 애플리케이션 풀에서 동일한 이름의 OTEL_*를 삭제하거나 조정해야 합니다. 이 설정은 파라미터 범위만 담당하며, IIS 자동 계측은 여전히 먼저 Register-OpenTelemetryForIIS를 실행해야 합니다.

OTLP/gRPC 제한

.NET 자동 계측은 기본적으로 http/protobuf를 사용하므로, 앞서 설명한 HTTP 설정을 사용하여 DataKit에 연결하는 것을 권장합니다. .NET Framework는 OTLP/gRPC를 지원하지 않습니다. .NET 8 이상에서 gRPC를 사용하는 경우 애플리케이션에서 호환되는 Grpc.Net.Client 패키지를 참조해야 하므로, 더 이상 종속성을 변경하지 않는 방식이 아닙니다.

3. 데이터 보고 파라미터

기본 파라미터

환경 변수 설명 권장값 또는 예시
OTEL_SERVICE_NAME service.name을 설정합니다. 설정하지 않으면 자동 계측이 애플리케이션을 기반으로 이름을 생성합니다. order-service, 프로덕션 환경에서는 명시적으로 설정하는 것이 좋습니다.
OTEL_RESOURCE_ATTRIBUTES 리소스 속성, key=value를 쉼표로 구분한 형식입니다. env=prod,version=1.0.0,team=backend
OTEL_TRACES_EXPORTER Trace 내보내기 도구입니다. DataKit으로 보고할 때는 otlp로 설정합니다. 비활성화하려면 none으로 설정합니다.
OTEL_METRICS_EXPORTER Metric 내보내기 도구입니다. 메트릭을 보고해야 하는 경우 otlp로 설정하고, 그렇지 않으면 none으로 설정합니다.
OTEL_LOGS_EXPORTER Log 내보내기 도구입니다. 로그를 보고해야 하는 경우 otlp로 설정하고, 그렇지 않으면 none으로 설정합니다.
OTEL_PROPAGATORS 서비스 간 컨텍스트 전파 형식입니다. 기본값 tracecontext,baggage; b3, b3multi도 지원합니다.
OTEL_SDK_DISABLED OpenTelemetry SDK를 비활성화합니다. 기본값 false; 긴급히 비활성화해야 하는 경우 true로 설정합니다.

service.name은 Guance에서 서비스 소속을 식별하는 데 사용됩니다. envversion도 함께 설정하여 환경 및 버전별로 필터링할 수 있도록 권장합니다. 다른 사용자 정의 리소스 속성은 DataKit customer_tags 화이트리스트에 추가해야 태그로 유지되며, 속성 이름의 ._로 변환됩니다.

.NET 자동 계측 파라미터

환경 변수 설명 기본값 또는 예시
OTEL_DOTNET_AUTO_TRACES_ENABLED 자동 Trace 파이프라인을 활성화합니다. 기본값 true입니다.
OTEL_DOTNET_AUTO_METRICS_ENABLED 자동 Metric 파이프라인을 활성화합니다. 기본값 true입니다. exporter가 none이더라도 false로 설정하여 추가로 비활성화할 수 있습니다.
OTEL_DOTNET_AUTO_LOGS_ENABLED 자동 Log 파이프라인을 활성화합니다. 기본값 true입니다. OTLP Log를 수집하지 않는 경우 false로 설정할 수 있습니다.
OTEL_DOTNET_AUTO_EXCLUDE_PROCESSES 자동 계측을 로드하지 않을 프로세스를 제외합니다. 여러 실행 파일 이름은 쉼표로 구분합니다. powershell.exe,ReservedProcess.exe; 대상 애플리케이션을 호스팅하는 dotnet 프로세스는 제외하지 마십시오.
OTEL_DOTNET_AUTO_RESOURCE_DETECTOR_ENABLED 자동 계측 내장 리소스 탐지기를 활성화합니다. 기본값 true입니다.
OTEL_DOTNET_AUTO_LOGGER 자동 계측 내부 진단 로그 출력 방식입니다. 기본값 file; console, none도 지원합니다.
OTEL_DOTNET_AUTO_LOG_DIRECTORY 자동 계측 내부 로그 디렉터리입니다. Windows 기본값은 %ProgramData% 아래에 있습니다. Linux/macOS 기본값은 /var/log/opentelemetry/dotnet입니다.
OTEL_LOG_LEVEL SDK 및 자동 계측 로그 레벨입니다. 기본값 info; 문제 해결 시 일시적으로 debug를 사용합니다.

호스트의 모든 .NET 프로세스를 명확히 평가하지 않은 상태에서는 시스템 또는 사용자 수준에서 CLR Profiler를 전역적으로 활성화하지 마십시오. 전역 주입은 dotnet CLI, PowerShell 또는 기타 비대상 서비스에 영향을 줄 수 있습니다. 현재 세션, 특정 Windows Service 또는 특정 IIS 시나리오에 대한 등록 방식을 우선 사용하십시오.

OTLP 파라미터

환경 변수 설명 권장값 또는 예시
OTEL_EXPORTER_OTLP_PROTOCOL 모든 신호의 OTLP 프로토콜입니다. 자동 계측 기본값은 http/protobuf입니다. 명시적으로 설정하는 것을 권장합니다.
OTEL_EXPORTER_OTLP_ENDPOINT 모든 신호가 공유하는 기본 주소입니다. HTTP: http://datakit-host:9529/otel
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT Trace만 사용하는 주소로, 공유 주소보다 우선합니다. http://datakit-host:9529/otel/v1/traces
OTEL_EXPORTER_OTLP_METRICS_ENDPOINT Metric만 사용하는 주소로, 공유 주소보다 우선합니다. http://datakit-host:9529/otel/v1/metrics
OTEL_EXPORTER_OTLP_LOGS_ENDPOINT Log만 사용하는 주소로, 공유 주소보다 우선합니다. http://datakit-host:9529/otel/v1/logs
OTEL_EXPORTER_OTLP_HEADERS 모든 OTLP 요청에 포함되는 요청 헤더입니다. 여러 값은 쉼표로 구분합니다. x-tenant=tenant-a; DataKit expected_headers와 일치해야 합니다.
OTEL_EXPORTER_OTLP_COMPRESSION OTLP 요청 압축 방식입니다. 기본값 none; 호스트 간 보고 시 gzip으로 설정할 수 있습니다.
OTEL_EXPORTER_OTLP_TIMEOUT 단일 내보내기 제한 시간(밀리초)입니다. 기본값 10000입니다.

DataKit의 OTLP/HTTP 수집은 Protobuf만 지원하므로 http/protobuf를 사용하고 http/json은 사용하지 마십시오. 통합 endpoint와 특정 데이터 유형의 endpoint가 동시에 존재하는 경우, 특정 데이터 유형의 설정이 우선합니다.

샘플링 및 배치 보고 파라미터

환경 변수 설명 기본값 또는 예시
OTEL_TRACES_SAMPLER Trace 헤더 샘플러입니다. 기본값 parentbased_always_on; 비율 기반 샘플링은 parentbased_traceidratio를 사용합니다.
OTEL_TRACES_SAMPLER_ARG 샘플러 파라미터입니다. 0.1은 루트 Trace의 10%를 샘플링함을 의미합니다.
OTEL_BSP_SCHEDULE_DELAY Span 배치 내보내기 간격(밀리초)입니다. 기본값 5000입니다.
OTEL_BSP_MAX_QUEUE_SIZE 내보낼 Span 큐의 최대 크기입니다. 기본값 2048입니다.
OTEL_BSP_MAX_EXPORT_BATCH_SIZE 배치당 최대 내보내기 Span 수입니다. 기본값 512입니다.
OTEL_BSP_EXPORT_TIMEOUT Span 배치 내보내기 제한 시간(밀리초)입니다. 기본값 30000입니다.
OTEL_METRIC_EXPORT_INTERVAL Metric 내보내기 간격(밀리초)입니다. OTLP exporter 기본값 60000입니다.

프로덕션 환경에서는 트래픽과 데이터 예산에 따라 샘플링 비율을 설정해야 합니다. 애플리케이션 측 헤더 샘플링과 DataKit 측 샘플링을 동시에 활성화하면 최종 유지율이 중첩되어 낮아지므로, 샘플링 위치를 통일하여 계획해야 합니다.

연결 확인

지원되는 계측 라이브러리에서 처리하는 애플리케이션 라우트를 요청한 후, DataKit 호스트에서 수신 로그를 확인합니다:

curl http://127.0.0.1:8080/
sudo tail -f /usr/local/datakit/log/gin.log | grep '/otel/v1/'

/otel/v1/traces에 대한 POST 요청이 나타나고 응답 코드가 200이면, DataKit이 Trace를 수신한 것입니다. 그런 다음 Guance의 "애플리케이션 성능 모니터링(APM) > 분산 추적"으로 이동하여 service:order-service로 조회하십시오.

데이터가 없으면 다음을 순서대로 확인하십시오: 설치 스크립트가 완료되었는지, 애플리케이션을 시작한 실제 프로세스가 CLR Profiler와 OTEL_* 환경 변수를 상속했는지, 애플리케이션에서 사용하는 라이브러리가 지원 목록에 있는지, OTLP endpoint에 접근 가능한지 확인합니다. 임시로 OTEL_LOG_LEVEL=debug를 설정하고 자동 계측 내부 로그를 확인할 수 있습니다. 문제 해결 완료 후 info로 복원하십시오.

참고

문서 평가

이 페이지가 도움이 되었나요?