TL;DR

  • Go, Java, Python, Rust, .NET, Node.js, Ruby의 동일한 서비스와 부하 조건에서 OpenTelemetry SDK 오버헤드를 비교하는 측정임.
  • 서비스는 요청마다 Valkey에서 INCR counter를 실행하고 숫자를 반환하는 단일 엔드포인트로, 실제 애플리케이션보다 오버헤드가 두드러지는 조건임.
  • 각 요청은 기본적으로 SERVER 스팬CLIENT 스팬을 생성하며, 추적 비율 100%, 50%, 20%, 0%와 SDK 미탑재 조건을 비교함.
  • 0% 추적 모드는 스팬이 기록되거나 전송되기 전 계측 자체에 드는 비용을 보여주는 조건임.
  • 앱의 CPU·메모리·네트워크, 요청 지연 시간, Coroot에 저장된 스팬 수를 측정했지만, 제공된 본문에는 언어별 결과 수치가 포함되지 않음.

측정 방법

  • 각 언어에서 해당 환경에 일반적으로 선택될 스택을 사용해 동일한 소형 서비스를 구축함. 서비스는 HTTP 서버와 단일 엔드포인트로 구성됨.
  • 엔드포인트는 Valkey에서 INCR counter를 실행하고 결과 숫자를 반환함.
  • 요청당 작업량이 적어 오버헤드가 최대한 두드러지는 구성임. 실제 애플리케이션은 요청마다 더 많은 작업을 수행하므로 상대적인 오버헤드는 여기서 관찰되는 값보다 낮을 수 있음.
  • 환경 변수로 추적을 켜고 끄므로 동일한 빌드에서 SDK 사용 여부를 비교함.
  • 일반적인 개발 환경에서 사용하는 구성을 적용함.
  • 공식 제로 코드 에이전트가 있는 Java, Python, Node.js는 해당 에이전트를 사용함.
  • 그 외에는 공식 SDK와 계측 라이브러리를 사용함.
  • OpenTelemetry 메트릭과 로그는 끄고 트레이스만 측정함.
  • 모든 요청은 정확히 두 개의 스팬, 즉 HTTP 요청용 SERVER 스팬과 Valkey 호출용 CLIENT 스팬을 생성함. 계측 라이브러리가 기본적으로 추가 스팬을 생성하는 경우 해당 스팬은 끔.
  • 스팬은 기본 설정의 배치 스팬 프로세서를 거쳐 OTLP/HTTP(Protobuf)로 Coroot에 전송함.

다섯 가지 모드

  • 모든 앱에 초당 1,000건, 킵얼라이브 연결 100개의 동일한 부하를 적용함.
  • SDK 끔: SDK를 로드하지 않으며 추적 대상도 없음.
  • 100%: SDK를 켜고 기본 샘플러로 모든 요청을 추적함.
  • 50%: SDK를 켜고 OTEL_TRACES_SAMPLER=parentbased_traceidratio, OTEL_TRACES_SAMPLER_ARG=0.5를 설정함.
  • 20%: SDK를 켜고 OTEL_TRACES_SAMPLER_ARG=0.2를 설정함.
  • 0%: SDK를 켜고 OTEL_TRACES_SAMPLER_ARG=0을 설정함. SDK는 활성 상태지만 스팬을 기록하거나 전송하지 않음.
  • 0% 모드는 스팬이 생성되기 전 계측 자체에 드는 비용을 보여주는 조건임.
  • 각 모드에서 앱을 새로 시작해 90초간 워밍업한 뒤 4분간 측정함.
  • 재현성을 확인하기 위해 다섯 모드를 두 차례 수행하고, 표의 수치는 두 차례 결과의 평균으로 계산함.
  • 차트는 가독성을 위해 두 번째 측정 결과만 표시함.

실험 환경

  • 네 대의 가상 머신을 하나의 사설 네트워크에 배치해 자원 경쟁을 방지함.
  • 앱: 전용 vCPU 4개, 메모리 16GB.
  • Valkey 8: 전용 vCPU 2개.
  • 부하 생성기: wrk2를 사용하며 -t4 -c100 -R1000 설정으로 요청률을 일정하게 유지함.
  • Coroot: 트레이스를 수신하고 측정을 수행함.
  • 앱의 CPU와 메모리는 coroot-node-agent가 수집한 컨테이너 메트릭에서 가져오며, 네트워크 트래픽은 앱 노드에서 측정함.
  • 측정 간섭을 막기 위해 앱 노드에서 coroot-node-agent 자체의 eBPF 트레이싱을 끔.
  • 지연 시간은 wrk2에서 가져오며, 전송 중 스팬 누락 여부를 확인하기 위해 Coroot 저장소의 스팬 수를 셈.

결과

  • Go
  • Java
  • Python
  • Rust
  • .NET
  • Node.js
  • Ruby

결론: 언어별 결과 비교

  • 본문에는 언어별 측정 결과 수치나 비교 결론이 제시되지 않음.