OpenTelemetry, 텔레메트리 데이터 40% 절감하는 똑똑한 방법!
자동 계측(Auto-instrumentation)은 텔레메트리 데이터 수집의 강력한 도구이나, 과도한 데이터 생성으로 저장 비용 증가(Storage Cost Increase)를 유발함
HTTP 경로 템플릿화(Templated Route), 컨트롤러/뷰 스팬(Controller/View Span) 제거 등을 통해 불필요한 데이터 생성을 억제하여 데이터 볼륨 감소(Data Volume Reduction)를 달성
Java 에이전트(Java Agent), Kubernetes 메트릭(Kubernetes Metrics), 스케줄러(Scheduler) 등에서 발생하는 고유 식별자(Unique Identifiers) 문제를 해결하여 집계 효율성(Aggregation Efficiency)을 향상
업스트림(Upstream)에서의 선택적 활성화(Selective Enablement)와 다운스트림(Downstream)에서의 필터링(Filtering)을 통해 텔레메트리 낭비를 줄이는 하이브리드 전략(Hybrid Strategy) 제시
자동 계측(Auto-instrumentation)의 양날의 검
자동 계측(Auto-instrumentation)은 OpenTelemetry의 강력한 기능이지만, 기본적으로 모든 데이터를 수집하려는 경향이 있어 텔레메트리 잉여(Telemetry Surplus)를 발생시킨다. 특히, HTTP 클라이언트와 서버의 경우, `/api/users/12345`와 같이 고유한 ID를 포함하는 경로는 데이터 집계(Data Aggregation)를 방해하여 분석 효율성을 저하시킨다. 따라서, `/api/users/:id`와 같은 템플릿 경로를 사용하여 데이터 포인트를 줄이는 것이 중요하다.
Spring MVC 환경에서의 스팬(Span) 최적화
Spring MVC 환경에서 자동 계측은 Server Span, Controller Span, View Span 등 여러 스팬을 생성한다. 하지만, 마이크로서비스(Microservices) 아키텍처에서는 컨트롤러가 얇아 컨트롤러 스팬이 큰 가치를 제공하지 못하는 경우가 많다. 따라서, 실험적 플래그를 사용하여 컨트롤러 및 뷰 스팬 생성을 억제함으로써 텔레메트리 볼륨(Telemetry Volume)을 줄일 수 있다. 이는 성능 개선(Performance Improvement)과 비용 절감(Cost Reduction)에 기여한다.
Java 런타임 메트릭(Runtime Metrics)의 고유 식별자 문제
Java 런타임 메트릭, 특히 `jvm.network.io` 또는 `jvm.memory.allocation`과 같은 지표에서 `thread.name` 속성은 고유 시계열(Unique Time Series)의 폭발적인 증가를 유발할 수 있다. 이는 카디널리티(Cardinality) 문제를 야기하여 저장 공간 낭비 및 쿼리 성능 저하를 초래한다. 다행히, OpenTelemetry Java 에이전트의 최신 버전에서는 이 문제가 해결되었지만, 이전 버전을 사용하는 경우, 적절한 가드레일을 설정하거나 최신 버전으로 업데이트해야 한다.
중복 스팬(Span) 생성을 막는 Span Suppression Strategy
Java 에이전트는 애플리케이션 내 여러 계층에서 동일한 작업을 계측하여 중복 스팬(Nested Spans)을 생성할 수 있다. 예를 들어, AWS SDK를 호출하는 경우, Application Code, AWS SDK, Apache HttpClient, Java Networking 등 여러 계층에서 스팬이 생성되어 텔레메트리 볼륨이 증가한다. 이를 방지하기 위해 OpenTelemetry Java Agent는 Span Suppression Strategy를 제공하며, `otel.instrumentation.experimental.span-suppression-strategy` 속성을 통해 제어할 수 있다.
Kubernetes 및 스케줄러(Scheduler) 메트릭 최적화
Kubernetes 환경에서 `container.id`, `k8s.pod.uid`와 같은 고유 식별자는 컨테이너 재시작 시마다 새로운 시계열을 생성하여 집계(Aggregation)를 방해한다. 또한, Spring Scheduling 또는 Quartz와 같은 스케줄러는 매 초마다 불필요한 스팬을 생성하여 텔레메트리 낭비를 유발한다. 이러한 문제를 해결하기 위해, 특정 모듈을 비활성화하거나, 다운스트림에서 불필요한 스팬을 필터링하는 전략을 사용할 수 있다.