Skip to content
Published on

분산 추적 & OpenTelemetry 2026 — OTel / Jaeger / Tempo / Zipkin / Honeycomb / Lightstep / SigNoz / SkyWalking / Datadog APM 심층 비교

Authors

프롤로그 — "왜 결제가 느린가요?"라는 질문에서 시작한다

2026년 어느 금요일 저녁, 결제팀 슬랙 채널에 알람이 울린다.

"p99 결제 지연 4.2초. 평소 600ms. 무엇이 느려졌나?"

이런 질문에 5분 안에 답하기 위해 인류는 지난 10년간 **분산 추적(distributed tracing)**을 만들어 왔다. 한 요청이 게이트웨이를 지나, 인증을 거쳐, 결제 코어로 들어가서, 외부 PG를 호출하고, 영수증 큐에 쌓이는 — 그 모든 홉(hop)을 한 줄의 트레이스로 본다.

2020년만 해도 이 분야는 OpenTracing, OpenCensus, Jaeger 클라이언트, Zipkin 라이브러리, 각 APM 벤더의 에이전트가 난립했다. 같은 회사 안에서도 자바는 Datadog 에이전트, Go는 Jaeger 클라이언트, Node는 New Relic을 쓰는 식이었다. 2026년에는 답이 단순해졌다 — OpenTelemetry.

이 글은 2026년 분산 추적의 지도를 그린다. OTel 사양과 Collector, 전파 표준, OSS 백엔드(Jaeger/Tempo/Zipkin), observability 2.0 진영(Honeycomb/SigNoz), 인수된 거물(Lightstep), APM 슈퍼리그(Datadog/New Relic/Dynatrace/Splunk), eBPF 자동 계측(Pixie/Beyla), 그리고 샘플링과 비용까지. 한국·일본 회사들이 실제로 어떻게 마이그레이션했는지도.


1장 · 2026년 분산 추적 지도 — 4분류

분산 추적 생태계는 거칠게 네 묶음으로 나뉜다.

묶음대표성격
표준/계측OpenTelemetry공통 사양·SDK·Collector. 거의 모두가 이걸 통한다
OSS 셀프호스팅 백엔드Jaeger, Tempo, Zipkin, SigNoz, SkyWalking직접 운영. 라이선스 비용 없음
APM SaaSDatadog, New Relic, Dynatrace, Splunk, AppDynamics, Sentry, Elastic매니지드. 통합 UI + 알람 + AIOps
observability 2.0Honeycomb, Lightstep(ServiceNow)와이드 이벤트·고카디널리티 분석
eBPF 자동 계측Pixie, Beyla, Coroot코드 변경 없이 커널/네트워크에서

세 축을 동시에 보면 좋다.

              OSS                              SaaS
        ┌──────────────┐              ┌─────────────────┐
계측    │ OTel SDK     │  ─── 호환 ──▶ │ OTel SDK         │
        │ (벤더-중립)   │              │ (벤더 어댑터)     │
        └──────┬───────┘              └────────┬────────┘
               │                                │
        ┌──────▼─────────────────────────────────▼─────────┐
        │            OpenTelemetry Collector               │
        │   receivers ──▶ processors ──▶ exporters         │
        └──────┬─────────────────────────────────┬─────────┘
               │                                  │
       ┌───────▼────────┐                ┌────────▼────────┐
       │ Jaeger / Tempo │                │  Datadog APM    │
       │ Zipkin / SigNoz│                │  New Relic APM  │
       │ SkyWalking     │                │  Honeycomb 등   │
       └────────────────┘                └─────────────────┘

핵심: 계측은 OTel에 통일하고, 백엔드는 갈아끼울 수 있게 한다. 이게 2026년의 표준 자세다.


2장 · OpenTelemetry — CNCF 졸업 (2024)

OpenTelemetry(OTel)는 OpenTracing(2016)과 OpenCensus(2018)의 합병으로 2019년에 출발했다. 2021년 CNCF 인큐베이팅, **2024년 11월 CNCF 졸업(graduated)**으로 사실상 산업 표준이 됐다. Kubernetes 다음으로 CNCF 활동이 활발한 프로젝트다.

OTel이 제공하는 것:

  • 사양(Specification): 무엇이 트레이스이고, 무엇이 스팬이고, 어떤 속성을 가지는가.
  • API: 언어별 계측 API (Java, Go, Python, .NET, Node.js, Ruby, PHP, Rust, C++, Swift…).
  • SDK: API의 참조 구현 — 샘플링, 배치, 익스포터 포함.
  • Collector: 별도 프로세스로 도는 텔레메트리 파이프라인.
  • Semantic Conventions: HTTP, DB, 메시징 등의 표준 속성 이름.
  • OTLP(OpenTelemetry Protocol): gRPC/HTTP 기반 와이어 포맷.

핵심 데이터 모델: 트레이스 = 스팬의 트리. 각 스팬은 trace_id, span_id, parent_span_id, start/end, 속성, 이벤트, 링크를 가진다.

from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter

trace.set_tracer_provider(TracerProvider())
trace.get_tracer_provider().add_span_processor(
    BatchSpanProcessor(OTLPSpanExporter(endpoint="otel-collector:4317"))
)

tracer = trace.get_tracer("checkout")
with tracer.start_as_current_span("charge_card") as span:
    span.set_attribute("user.id", user_id)
    span.set_attribute("amount", amount)
    result = pg.charge(...)
    span.set_attribute("pg.response_code", result.code)

OTel의 진짜 가치는 메트릭·로그·트레이스를 같은 SDK로 다룬다는 점이다. 트레이스가 졸업 안정이고, 메트릭이 안정, 로그가 2024~2025년에 대부분 언어에서 안정으로 진행됐다. 이제 OTel은 단순한 트레이스 표준이 아니라 통합 텔레메트리 표준이다.


3장 · OTel Collector — Receivers · Processors · Exporters

OTel SDK가 앱 안에 들어간다면, Collector는 앱 밖에 도는 별도 프로세스다. 별도로 떼낸 이유:

  1. 앱이 백엔드 SDK를 직접 들이지 않아도 됨 — 의존성 관리가 쉬워짐.
  2. 샘플링·필터링·라우팅을 중앙에서 적용.
  3. 백엔드를 바꿔도 앱은 재시작 안 함.
  4. 트래픽 폭주 시 큐잉·재시도.

Collector의 핵심 3축:

컴포넌트역할
Receivers수신 — 외부에서 텔레메트리 받기otlp, jaeger, zipkin, prometheus, kafka, filelog
Processors가공 — 변환·필터링·샘플링batch, memory_limiter, tail_sampling, attributes
Exporters송신 — 백엔드로 내보내기otlp, jaeger, prometheus, datadog, honeycomb, logging

이 3축이 파이프라인으로 연결된다.

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318

processors:
  batch:
    timeout: 5s
    send_batch_size: 1024
  memory_limiter:
    check_interval: 1s
    limit_mib: 1500
  tail_sampling:
    decision_wait: 30s
    policies:
      - name: errors
        type: status_code
        status_code: { status_codes: [ERROR] }
      - name: slow
        type: latency
        latency: { threshold_ms: 1000 }
      - name: sample_10
        type: probabilistic
        probabilistic: { sampling_percentage: 10 }

exporters:
  otlp/tempo:
    endpoint: tempo:4317
    tls: { insecure: true }
  datadog:
    api: { site: datadoghq.com, key: ENV_DD_API_KEY }

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [memory_limiter, tail_sampling, batch]
      exporters: [otlp/tempo, datadog]

같은 트레이스를 OSS 백엔드(Tempo)와 SaaS(Datadog)로 동시에 보낼 수 있다. 이게 Collector가 마이그레이션 도구로 쓰이는 이유다 — 새 백엔드를 한 줄 추가로 병렬 비교, 검증 후 기존 것을 끈다.

Collector의 두 가지 모드:

  • Agent: 각 호스트/노드/Pod 사이드카에 1개. 트래픽이 작고 가까이서 수집.
  • Gateway: 클러스터/리전당 몇 개. 큐잉·테일 샘플링·중앙 정책에 적합.

대규모는 Agent → Gateway → 백엔드의 2단 구성을 많이 쓴다.


4장 · 전파 표준 — W3C Trace Context · B3 · Baggage

분산 추적이 "분산"인 이유는 같은 trace_id서비스 경계를 넘어 전파되기 때문이다. 전파는 보통 HTTP 헤더로 한다.

W3C Trace Context (2020 권고)

2020년 W3C가 표준화한 두 헤더가 2026년 사실상 디폴트다.

traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01
             │   │                                │                │
             │   trace-id (16 byte hex)            parent-span-id   trace-flags
             version

tracestate: vendor1=value1,vendor2=value2
  • traceparent: 모든 OTel SDK가 기본으로 송수신.
  • tracestate: 벤더별 부가 정보 (예: 샘플링 결정).

OTel SDK는 이 헤더를 HTTP·gRPC·메시징(Kafka, RabbitMQ 헤더)·심지어 일부 SQL 주석에까지 자동으로 주입한다.

B3 Propagation (Zipkin 출신)

Zipkin이 만든 멀티헤더 포맷.

X-B3-TraceId: 4bf92f3577b34da6a3ce929d0e0e4736
X-B3-SpanId: 00f067aa0ba902b7
X-B3-ParentSpanId: 05e3ac9a4f6e3b90
X-B3-Sampled: 1

OTel는 W3C와 B3를 동시 지원한다. 레거시 시스템과 섞일 때 양쪽을 다 받게 설정한다.

Baggage — "다음 서비스에 같이 가져가는 컨텍스트"

Baggage는 trace_id와는 별개의 키-값을 트레이스 전파와 함께 운반한다. 예: user.tier=gold, tenant=acme, experiment=ab_42.

baggage: user.tier=gold,tenant=acme

쓸 곳:

  • 모든 다운스트림 스팬에 같은 라벨을 자동으로 붙이고 싶을 때.
  • 샘플링 결정을 baggage 값에 따라 바꾸고 싶을 때 (예: "tenant=enterprise는 100% 샘플").
  • 다운스트림에서 권한·로깅·라우팅에 참조.

주의: baggage는 비밀이 아니다. 다음 홉이 외부 시스템이면 누구나 헤더를 본다. PII는 절대 baggage에 넣지 않는다.


5장 · Jaeger — CNCF 졸업, Uber 출신 클래식

Jaeger는 Uber가 2015년에 만든 분산 추적 시스템이다. 2017년 CNCF 인큐베이팅, 2019년 CNCF 졸업. OTel 이전 시대의 사실상 표준이었다.

특징:

  • Go로 작성, 백엔드 모듈식.
  • 저장소: Cassandra, Elasticsearch/OpenSearch, ClickHouse, Badger(임베디드).
  • UI: 트레이스 뷰, 의존성 그래프, 비교 뷰.
  • 인입: 자체 SDK(deprecated)·Zipkin 프로토콜·OTLP(OpenTelemetry Protocol).

2024년 이후 Jaeger 프로젝트는 명시적으로 **"OTel 우선"**으로 방향을 틀었다. Jaeger 자체 SDK는 deprecated이고, 신규 사용자는 OTel SDK로 보내고 Jaeger를 "백엔드 + UI"로만 쓰는 게 권장 경로다. v2 백엔드는 내부적으로 OTel Collector를 빌드 베이스로 쓴다.

배포 모양:

  • AllInOne: 데모/개발용. agent + collector + query + UI + memory storage 한 컨테이너.
  • Production: collector + storage + query/UI 분리, agent는 호스트별.
  • Kubernetes Operator: jaegertracing/jaeger-operator로 CR 한 줄.

장점: 가볍고, OSS이고, 잘 깔린다. UI가 직관적이다.

한계: 메트릭/로그는 안 한다(트레이스 전용). 고카디널리티 분석은 약하다 — UI는 trace_id로 찾기·시간 범위 필터까지가 강점.


6장 · Grafana Tempo — Parquet 기반, "object storage가 hot path"

Grafana Tempo는 2020년에 Grafana Labs가 만든 트레이스 백엔드다. 컨셉이 명료하다 — "인덱스 없는 추적 저장소".

기존 Jaeger/Zipkin은 모든 스팬에 인덱스를 만든다(서비스·오퍼레이션·태그). 인덱스가 트레이스 본문보다 더 크고 더 비싸다. Tempo는 인덱스 없이 trace_id로만 검색한다 — 단, 메트릭(Prometheus)·로그(Loki)에서 trace_id를 뽑아서 연결한다는 전제다. "exemplar에서 클릭하면 트레이스가 나오는" UX.

저장은 S3/GCS/Azure Blob 같은 오브젝트 스토리지에 직접 한다. 인덱스 없으니 저장이 싸다. 2023년 이후 Parquet 포맷으로 통일됐다. 컬럼 저장 + 압축이 잘 되고, 외부 도구(Athena, DuckDB)로도 읽힌다.

쿼리 언어 TraceQL도 있다 — 트레이스 본문에서 패턴을 찾는다.

{ resource.service.name = "checkout"
  && span.http.status_code = 500
  && duration > 1s
}

장점:

  • 저장 비용이 가장 싸다 — 오브젝트 스토리지 직저장.
  • Loki·Mimir·Grafana와 자연스럽게 연동.
  • Parquet이라 외부 분석 도구로도 끌고 갈 수 있다.

한계:

  • "메트릭/로그와 트레이스를 잇는 exemplar 워크플로"가 안 갖춰져 있으면 효용이 줄어든다.
  • 일반 검색(서비스명·태그)은 Jaeger보다 약하다(대신 TraceQL).

대규모/장기 저장이 우선이면 Tempo가 답이다.


7장 · Zipkin — Twitter 원조, 살아있는 클래식

Zipkin은 Twitter가 2012년 오픈소스한 분산 추적 시스템이다. Google Dapper 논문의 가장 영향력 있는 OSS 구현체로, 이후 모든 트레이스 시스템의 출발점이 됐다.

특징:

  • Java 기반(브레이브 인스트루멘테이션).
  • 저장소: 메모리(개발용), Cassandra, Elasticsearch, MySQL.
  • 단순함 — 단일 jar로 떨어진다.
  • B3 전파의 원조.

2026년에는 신규 도입이 많지 않지만, 다음 경우에 여전히 쓴다.

  • 이미 깔린 B3/Brave 자바 코드베이스의 백엔드.
  • "Jaeger도 너무 크다" 싶은 작은 시스템.
  • OTel Collector의 zipkin receiver/exporter로 변환 허브 역할.

Jaeger와 비교하면 — UI가 더 소박하지만, 셋업이 더 간단하다.


8장 · Honeycomb — Charity Majors의 "observability 2.0"

Honeycomb는 2016년 Charity Majors와 Christine Yen이 설립한 SaaS 옵저버빌리티 회사다. 이들이 만든 표현 **"observability 2.0"**이 업계 어휘를 바꿨다.

핵심 주장: 기존 모니터링(메트릭·로그·트레이스 분리)은 미리 정한 차원만 본다. 진짜 디버깅에 필요한 건 고카디널리티(user_id, request_id, k8s_pod 등) 차원을 자유롭게 슬라이스/다이스할 수 있는 **와이드 이벤트(wide event)**다.

Honeycomb의 데이터 모델: 모든 스팬은 사실상 "이벤트". 자유롭게 속성을 붙이고, 쿼리는 BubbleUp(이상치 자동 분해)·heatmap·trace 뷰를 자유롭게 오간다.

BubbleUp 결과 예:
  느린 요청(p95)의 73%가 user.tier=enterprise 이면서
  db.host=replica-3 이고
  client_country=JP 이다.
  ← 이런 결합을 사람이 미리 정하지 않아도 자동으로 찾는다.

차별점:

  • 모든 차원을 인덱싱하지 않는다 — 자체 컬럼 스토리지(Retriever).
  • 샘플링 SDK(Refinery) — 테일 샘플링의 사실상 표준.
  • OTel 100% 호환 인입.
  • 가격: 이벤트 수(스팬 수)·보존 기간.

장점: 디버깅 속도가 다르다. "왜 느린가"를 인덱스 없이 1~2분 안에 좁힌다.

한계: SaaS-only(셀프호스팅 없음). 고카디널리티 풀세트가 필요 없는 단순한 모니터링에는 과하다.


9장 · Lightstep → ServiceNow Cloud Observability

Lightstep은 Google Dapper 원저자 중 한 명인 Ben Sigelman이 2014년에 창업한 회사다. "통계 기반 분석"·"메트릭과 트레이스 결합"을 일찍부터 강조했다.

2021년 ServiceNow가 인수. 현재는 ServiceNow Cloud Observability로 리브랜딩됐다. 단독 제품으로는 자취를 감추고 있지만, ServiceNow의 ITSM/AIOps와 묶여 엔터프라이즈 시장(특히 ITIL·CMDB와 묶인 곳)에서 살아남았다.

기술적 유산:

  • OTel 초기 표준화에 핵심 역할(Sigelman은 OTel 거버넌스 위원회 멤버였다).
  • 트레이스에 통계적 노이즈 감소를 처음 강조.

2026년 평가: ServiceNow 생태계 안에 있는 회사면 검토. 그렇지 않으면 Honeycomb·Datadog·OSS 진영이 더 활발하다.


10장 · SigNoz — OSS 풀스택 옵저버빌리티

SigNoz는 2020년 인도에서 출발한 OSS APM이다. ClickHouse 위에 트레이스·메트릭·로그를 다 얹는다. **"Datadog의 OSS 대안"**을 표방한다.

특징:

  • 100% OTel 네이티브 — OTel Collector를 SDK처럼 쓴다.
  • 단일 UI에서 트레이스/메트릭/로그/예외 모두.
  • ClickHouse 기반 — 쿼리가 빠르고 저장이 압축된다.
  • 2024년 Series B 펀딩 — LogStream·Anomaly Detection·메트릭 V2 출시.

docker-compose up 한 줄로 풀스택이 뜨고, OTel 호환이라 마이그레이션이 비교적 무탈하다.

2024~2025 업데이트:

  • LogStream: 로그도 같은 UI에서 검색/필터.
  • Anomaly Detection: ML 기반 이상치 탐지(베이스라인 자동).
  • Trace Funnels: 결제 같은 다단계 흐름의 단계별 성공률.

장점: OSS인데도 UI가 단정하고 풀스택이다. 클라우드 SaaS도 있어 셀프호스팅이 부담스러우면 그쪽으로.

한계: ClickHouse 의존이 강해 대규모 운영 노하우가 필요하다. 엔터프라이즈 기능(SSO·SOC2 보고 등)은 클라우드 플랜에 몰린다.


11장 · Apache SkyWalking — APM + 트레이스, 중국 주도

Apache SkyWalking은 2017년 Apache 인큐베이팅, 2019년 졸업한 OSS APM이다. 중국 화웨이/알리바바/텐센트 출신 컨트리뷰터가 많고, 동아시아에서 사용자가 두텁다.

특징:

  • 자체 에이전트(자바·.NET·Node) + OTel 호환.
  • 트레이스만이 아니라 서비스 토폴로지·메트릭·로그·이벤트 전부.
  • 백엔드: 자체 OAP 서버 + Elasticsearch/BanyanDB(자체 시계열 DB).
  • UI: 토폴로지 시각화가 강하다.
  • 서비스 메시(Istio) 가시화·이벤트 기반 자가복구(SkyWalking-Rover, eBPF) 등 확장.

2026년의 자리: 중국·인도·동남아 OSS 진영의 메인 선택지. 한국·일본에서는 상대적으로 적지만, 중국법인을 운영하는 회사면 자연스레 만난다.


12장 · Datadog APM · New Relic APM · Elastic APM · Sentry Performance

상업 APM 슈퍼리그의 트레이스 라인업.

Datadog APM

  • 가장 큰 시장 점유. UI 완성도가 압도적.
  • OTel 네이티브 입출력 — dd-trace도 있지만 OTel SDK 직접도 지원.
  • 트레이스 + APM 메트릭(throughput·error·latency) + 프로파일링 연결.
  • 가격: 호스트당 + 인입 스팬당 분리 과금. 트래픽 큰 곳은 청구서가 무서워질 수 있다.
  • Watchdog(AIOps), Continuous Profiler, Database Monitoring으로 연결.

New Relic APM

  • 1세대 APM(2008)의 원조. 2020년대 들어 **"Telemetry Data Platform"**으로 리포지셔닝.
  • 2020년 가격 정책 대수술 — 사용자당 + 인입 GB 과금으로 단순화.
  • OTel 호환, OTel-only 운영도 가능.
  • AI 분석(New Relic AI), 로그-트레이스 자동 결합.

Elastic APM

  • Elasticsearch 위에 얹은 APM. 이미 ELK 스택을 쓰는 곳이면 자연스럽다.
  • 셀프호스팅·Elastic Cloud 둘 다 가능.
  • 가격이 OTel + OSS 백엔드보다 비싸지 않으면서, 검색·대시보드·머신러닝이 통합된다.

Sentry Performance

  • Sentry는 본래 에러 모니터링 회사. 2020년경 **Performance(분산 추적)**를 추가했다.
  • 강점: 프론트엔드와의 결합. React/Vue 등 클라이언트 SDK 트레이스가 그대로 백엔드까지 이어진다.
  • 백엔드 전용 APM으로는 약하지만, 풀스택(특히 SPA 프런트엔드)은 강하다.

13장 · Dynatrace · AppDynamics(Splunk) · Splunk Observability Cloud

엔터프라이즈 무거운 진영.

Dynatrace

  • 1993년부터 시작한 오스트리아 회사. 엔터프라이즈 APM의 거인.
  • 자체 에이전트 OneAgent가 깐 즉시 자동 토폴로지·메트릭·트레이스를 만든다 — 사람이 손댈 일이 거의 없다.
  • AI 엔진 Davis가 원인 후보를 자동 제시.
  • OTel 입력도 지원.
  • 가격: 엔터프라이즈. ROI가 큰 환경(글로벌 대형 운영)에 적합.

AppDynamics (now Splunk-acquired)

  • 시스코가 2017년 인수, 2024년 시스코가 Splunk를 인수하면서 Splunk 우산 아래로 다시 묶였다.
  • 자바·.NET 강세. 비즈니스 트랜잭션 중심 뷰.
  • 2025~2026년 로드맵상으로는 Splunk Observability Cloud로 점진 통합 방향.

Splunk Observability Cloud

  • 2019년 SignalFx 인수로 만든 라인. 메트릭·트레이스·로그 + RUM(real-user monitoring).
  • 시스코의 Splunk 인수(2024) 이후 SignalFx 유산 + AppDynamics 유산을 같은 SKU로 합치는 작업이 진행 중.
  • 시스코+Splunk를 이미 쓰는 곳에는 강한 후보.

14장 · eBPF 트레이스 — Pixie와 Beyla, 코드 변경 없는 자동 계측

eBPF는 리눅스 커널 안에서 안전하게 코드를 실행하는 기술이다. 네트워크 패킷·시스템 콜·HTTP 요청을 커널 레벨에서 잡을 수 있다 — 앱 코드를 한 줄도 바꾸지 않고.

Pixie

  • 2019년 시작, 2021년 New Relic이 인수. 그 후 OSS로 CNCF 샌드박스(2021), 2023년 인큐베이팅.
  • 쿠버네티스에 데몬셋으로 깔면 HTTP/HTTPS/gRPC/DNS/MySQL/Postgres/Redis 등의 요청을 자동 캡처.
  • 데이터는 노드 안의 인메모리에 머무르고(기본 24h), 필요할 때만 외부로 보낸다 — 프라이버시·비용에 유리.
  • 데이터 쿼리는 PxL(Python-like).

Beyla — Grafana의 eBPF 자동 계측기

  • Grafana Labs가 2023년 발표. 2024년 GA.
  • 단일 바이너리·사이드카로 깔리고, eBPF로 HTTP/gRPC 통신을 잡아 OTel 스팬으로 내보낸다.
  • 셀프호스팅 OTel + Tempo 스택에 가장 매끄럽게 끼워진다.

eBPF 트레이스의 위치

  • 코드 변경 없는 빠른 가시화가 필요한 곳 — 폴리글랏 환경, 레거시 코드, "지금 당장 어디가 느린지" 추정.
  • 단점: **비즈니스 컨텍스트(user_id 등)**는 못 잡는다. eBPF는 네트워크 페이로드를 본다 — 앱이 그 안에 ID를 안 넣으면 보이지 않는다.

결론: eBPF + OTel SDK 둘 다 쓰는 게 정석이다. eBPF로 인프라/네트워크 레벨 자동 가시화, OTel SDK로 비즈니스 스팬·고카디널리티 속성.


15장 · 샘플링 — head vs tail vs ratio

트레이스 비용 = 만든 스팬 수 × 단가. 비용 곡선의 80% 이상은 샘플링 전략에 달렸다.

세 가지 전략:

Head-based sampling (헤드 샘플링)

  • 트레이스의 시작 지점에서 결정. 시작 시 결정한 결과를 traceparent의 trace-flags로 전파.
  • 결정에 쓸 정보가 적다(아직 무슨 일이 일어날지 모름).
  • 장점: 단순, 비용 예측 쉬움, SDK만으로 가능.
  • 보통 1~10% 고정 비율로 흘려보낸다.

Ratio sampling (확률 샘플링)

  • Head 샘플링의 하위 분류. 예: sample_ratio=0.1 (10%).
  • OTel SDK 디폴트 (TraceIdRatioBased).
  • 일관성 보장: trace_id 해시로 결정 → 같은 trace는 모든 서비스에서 같은 결정.

Tail-based sampling (테일 샘플링)

  • 트레이스가 다 끝난 후(또는 일정 시간 대기 후) 결정.
  • 모든 스팬을 일단 Collector로 모아서 본다 — 결정에 풍부한 정보(에러 여부, 총 지연, 특정 속성) 활용.
  • 장점: 에러·느린 트레이스만 100% 보관, 정상은 1%만. 비용 대 가치가 최고.
  • 단점: 결정까지 큐잉 필요(보통 30초~수 분), 메모리·CPU 소모, 같은 trace의 모든 스팬이 같은 Collector 인스턴스로 가야 함(load balancer exporter로 trace_id 해싱 라우팅).

OTel Collector tail_sampling processor 예:

processors:
  tail_sampling:
    decision_wait: 30s
    num_traces: 100000
    policies:
      - name: keep_errors
        type: status_code
        status_code: { status_codes: [ERROR] }
      - name: keep_slow
        type: latency
        latency: { threshold_ms: 1500 }
      - name: keep_pii_tenant
        type: string_attribute
        string_attribute: { key: tenant.tier, values: [enterprise] }
      - name: random_2pct
        type: probabilistic
        probabilistic: { sampling_percentage: 2 }

이 정책은: 에러 100% + 1.5초 초과 100% + enterprise 테넌트 100% + 나머지의 2%만 유지.

어떤 걸 골라야 하나

상황추천
트래픽 작음(~수백 rps)Head 100% 또는 ratio 50%
일반적 SaaS(~수천 rps)Head 10% + 에러 100% (SDK에서 분기)
대규모(수만수십만 rps)Tail-based + 에러/느림/특정 테넌트 100%
비용 폭주 중Tail-based 즉시 도입 — 대개 5~10배 절감

16장 · 비용 — tail-based 샘플링 프록시와 청구서

분산 추적의 청구서가 무서워지는 두 패턴.

  1. 트래픽 증가에 비례한 청구서 — 100% 샘플 + 대형 트래픽.
  2. 고카디널리티 속성 폭발 — 모든 스팬에 user_id, request_id, k8s_pod, container_id를 다 박음.

해법:

  • 테일 샘플링을 게이트웨이 Collector에 둔다. SaaS에 인입되기 전에 자른다. 같은 트레이스의 모든 스팬을 같은 Collector로 라우팅하기 위해 loadbalancing exporter를 앞단에 둔다.
  • 저장은 OSS, "Hot" 트레이스만 SaaS. 모든 트레이스를 Tempo에 보내고, 에러·느림만 Honeycomb/Datadog에 추가 보냄.
  • 속성 화이트리스트. attributes processor로 안 쓰는 속성을 제거한다.
  • 로그 트레이스 연결로 트레이스 본문을 슬림화. 길고 큰 속성은 로그에 두고, 스팬에는 log_id 참조만.

실전 경험치(저자의 보수적 추정):

  • 무리한 100% → 1% head 샘플 = 청구서 90% 감소, 디버깅 품질 30% 감소.
  • 1% head → 테일 샘플(에러 100% + 정상 1%) = 청구서 같지만 디버깅 품질 200% 증가.
  • 게이트웨이 Collector + 화이트리스트 추가 = 청구서 추가 30% 감소.

17장 · 한국 / 일본 — 실전 사례

한국

  • 토스(Toss) — 자체 트레이스 인프라(KafkaConsumer + Spring Sleuth 기반)에서 2023~2024년 사이 OTel + Tempo + Grafana 스택으로 점진 마이그레이션. 결제·송금 트래픽의 테일 샘플링으로 비용을 잡았다. 토스 SLASH 컨퍼런스에서 관련 발표가 나온다.
  • 카카오(Kakao) — 사내 APM에서 OTel 표준화로 이전. 카카오톡 백엔드는 자바 스택이라 OTel Java agent 자동 계측 + 일부 핵심 서비스만 수동 계측의 조합. if(kakao) 컨퍼런스에 트레이싱 사례가 종종 등장.
  • NAVER — 사내 모니터링 플랫폼 nLog, Pinpoint 같은 자체 도구에서 OTel 호환 인터페이스를 추가하는 방향. Pinpoint는 NAVER가 만든 OSS APM(자바 바이트코드 계측 강점)이라 그 자체로 OTel exporter를 추가하며 표준에 합류.

일본

  • メルカリ(Mercari) — Datadog에서 OTel + 자체 백엔드 조합으로 이행한 사례를 Mercari Engineering 블로그가 공개. 트래픽 비용이 핵심 동인이었고, OTel Collector + tail sampling으로 청구서를 잡았다.
  • NTT Communications — 사내 멀티 클라우드 모니터링 플랫폼에 OTel 채택. Datadog/New Relic/SkyWalking 혼재 환경을 OTel로 일원화. 한국으로 치면 SK텔레콤·KT 같은 통신사 모니터링 부서의 무거운 사례.
  • CyberAgent / DeNA / LINE — 게임·미디어·메신저 트래픽 특성상 테일 샘플링·고카디널리티 분석 요구가 높아, Honeycomb/Datadog + OSS 셀프호스팅(Tempo·Jaeger) 혼합.

공통 패턴: 벤더 락인을 피하려면 SDK는 OTel, 백엔드는 갈아끼울 수 있게. SaaS 단가 협상도 OTel 호환이 무기다.


18장 · 누가 무엇을 골라야 하나

작은 팀 / 사이드 프로젝트

  • OTel SDK + Jaeger(AllInOne) 또는 SigNoz (셀프호스팅) 또는 Honeycomb Free / Sentry Performance.
  • 깔리는 데 30분, 비용 0~수만 원.

중간 규모 (수십 명, 수만~수십만 rps)

  • OTel SDK + Collector + Tempo + Grafana (OSS 풀스택). 비용은 인프라 비용만.
  • 또는 Datadog/New Relic APM(SaaS, 빠른 적용·통합 알람).
  • 둘을 OTel Collector로 병행 운영하다가 한쪽으로 정리하는 게 안전한 마이그레이션 패턴.

엔터프라이즈

  • Dynatrace / Splunk Observability Cloud / Datadog — 자동 토폴로지·AIOps·전사 알람·감사 로깅.
  • OTel 호환이 필수 조건. 벤더가 OTel만 입력 받아도 되도록 협상.

디버깅 우선 (고카디널리티·온디맨드 분석)

  • Honeycomb — observability 2.0 자세. 비용은 이벤트 수·보존.
  • SigNoz도 비슷한 방향을 OSS로 따라가는 중.

셀프호스팅 강제 (규제·보안)

  • OTel + Tempo/Jaeger/SigNoz/SkyWalking. SigNoz는 풀스택(트레이스+메트릭+로그+이벤트), Tempo+Loki+Mimir는 Grafana 진영의 분리형.

Kubernetes 폴리글랏 + 코드 변경 어려움

  • Pixie 또는 Beyla — eBPF로 자동 가시화. 비즈니스 스팬은 OTel SDK로 추가.

19장 · 안티패턴 10가지

  1. OTel 안 쓰고 벤더 SDK 직결 — 벤더 바꿀 때 코드를 다 고친다.
  2. 계측은 했는데 샘플링은 100% 그대로 — 청구서가 폭발한다.
  3. 테일 샘플링 없이 "에러는 다 보고 싶다" — head 1% 샘플로는 에러 99%가 사라진다.
  4. 모든 스팬에 user_id·request_id 무차별 박기 — 고카디널리티 청구로 직결.
  5. W3C와 B3 동시 운영을 안 챙김 — 레거시 서비스 경계에서 trace가 끊긴다.
  6. Baggage에 PII 박기 — 다음 홉에서 헤더로 누출.
  7. 메트릭·로그·트레이스 백엔드가 따로 놀고 trace_id 연결 안 됨 — exemplar 워크플로 깨짐.
  8. Collector를 안 두고 SDK에서 직접 SaaS로 — 백엔드 바꾸면 앱 전체 재배포.
  9. Tail sampling의 trace_id 라우팅을 무시 — 같은 트레이스가 여러 Collector로 흩어져 결정이 잘못된다.
  10. 트레이스만 보고 메트릭/로그를 안 챙김 — 트레이스는 "특정 요청의 이야기", 메트릭은 "전체의 추세"다. 둘 다 필요.

에필로그 — OTel 위에 자유를 짓는다

2026년의 가르침은 한 문장이다.

계측은 OTel로 통일하고, 백엔드는 갈아끼울 수 있게 한다.

OTel은 단순한 트레이스 표준이 아니라, 벤더 락인을 끊는 인터페이스다. 그 위에 — Jaeger·Tempo의 OSS 자유든, Honeycomb의 디버깅 깊이든, Datadog의 통합 UX든, Dynatrace의 AIOps든 — 각자에게 맞는 백엔드를 얹는다. 갈아끼우는 비용이 코드 한 줄이 아니라 Collector 설정 한 줄이 되는 순간, 협상력도, 비용 관리도, 디버깅 품질도 다 손에 들어온다.

다음 글 후보: OpenTelemetry 메트릭 심층 — exemplar과 trace-metric 연결, 로그를 트레이스로 연결하기 — Loki·OpenSearch·OpenTelemetry Logs, 테일 샘플링 실전 — load-balancing exporter 토폴로지와 비용 곡선.

— 분산 추적 & OpenTelemetry 2026 심층 비교, 끝.


참고 / References