[LGTM] Tempo: 100% 샘플링을 실현한 분산 트레이싱과 MSA 병목 추적

2026. 5. 2. 12:39·▣ Infra & DevOps/LGTM Stack🔭
728x90
반응형


- Tempo: 100% 샘플링을 실현한 분산 트레이싱과 MSA 병목 추적

메트릭(Mimir)을 통해 장애의 '발생'을 인지하고, 로그(Loki)를 통해 에러의 '원인'을 파악하는 과정까지 살펴보았습니다. 이제 관측성의 마지막 퍼즐이자, 거대한 마이크로서비스 아키텍처(MSA) 환경에서 가장 까다로운 질문인 "도대체 수많은 서비스 중 어디서 병목이 발생했는가?"를 해결할 차례입니다.

이번 포스팅에서는 LGTM 스택의 'T'를 담당하며 분산 트레이싱 백엔드의 새로운 패러다임을 제시한 Tempo(템포)에 대해 깊이 파헤쳐 보겠습니다.

1. 분산 트레이싱의 딜레마: '샘플링(Sampling)의 저주'

하나의 사용자 요청이 API 게이트웨이를 거쳐 Auth, Payment, Inventory, Database 등 수십 개의 마이크로서비스를 통과하는 환경을 상상해 보십시오. 특정 요청이 지연될 때, 어느 구간에서 병목이 발생했는지 추적하기 위해 기존에는 Jaeger나 Zipkin 같은 분산 추적 시스템을 사용해 왔습니다.

하지만 기존 시스템들은 데이터를 저장할 때 Cassandra나 Elasticsearch 같은 무겁고 값비싼 스토리지를 백엔드로 사용했습니다. 트레이스 데이터는 메트릭이나 로그보다 훨씬 방대하기 때문에, 쏟아지는 트레이스를 모두 저장하다가는 인프라 비용이 파산 수준에 이르게 됩니다. 그래서 엔지니어들은 어쩔 수 없이 샘플링(Sampling)이라는 타협안을 선택했습니다. "전체 트래픽의 1% 또는 5%만 랜덤하게 수집하자."

이로 인해 치명적인 문제가 발생합니다. 간헐적으로 발생하는 심각한 장애나 특정 결제 실패 건을 추적하려고 할 때, 정작 내가 찾고자 하는 그 요청의 트레이스 데이터는 샘플링에 걸러져 유실되어 버리는 현상입니다. 바늘을 찾기 위해 건초더미의 95%를 태워버리는 격이었습니다.

분산 트레이싱의 딜레마: 샘플링의 저주


2. Tempo의 파괴적 혁신: "버리지 말고 다 저장해라"

Grafana Labs는 Tempo를 설계하며 앞서 살펴본 Mimir, Loki와 완벽하게 동일한 철학을 적용했습니다. 바로 비용 효율적인 오브젝트 스토리지(S3, GCS)의 적극적인 활용과 인덱스 최소화(Index-free)입니다.

Tempo는 복잡한 검색을 위한 인덱스를 거의 만들지 않습니다. 오직 고유한 식별자인 TraceID만으로 데이터를 찾을 수 있도록 아키텍처를 극단적으로 단순화했습니다. 인덱싱 오버헤드가 사라지고 스토리지가 저렴해지자, 마침내 타협할 필요가 없어졌습니다.

Tempo는 100% 샘플링을 지향합니다. 버려지는 데이터 없이 모든 사용자 요청의 라이프사이클을 기록합니다. 언제 어떤 에러가 발생하든 해당 TraceID만 알고 있다면, 그 요청이 수십 개의 컨테이너와 비동기 메시지 큐(Kafka 등)를 어떻게 관통했는지 폭포수(Waterfall) 차트로 완벽하게 복원해 냅니다.

3. Tempo 아키텍처와 W3C Trace Context

분산 트레이싱이 성립하려면 여러 서비스가 동일한 맥락을 공유해야 합니다. Tempo는 CNCF의 관측성 표준인 OpenTelemetry(OTel)를 네이티브로 지원하며, W3C Trace Context 규격을 통해 서비스 간 컨텍스트를 전파합니다. 시스템 내부적인 동작 구조는 다음과 같습니다.

Tempo 아키텍처와 W3C Trace Context

 

기술적 동작 원리:

  1. Context Propagation: 첫 요청 시 생성된 고유 식별자(TraceID)가 traceparent 등의 HTTP 헤더나 이벤트 브로커(Kafka 등)의 메타데이터에 담겨 마이크로서비스의 호출 체인을 따라 전파됩니다.
  2. Span 수집 (OTLP): 각 서비스는 자신의 작업 구간(Span)을 OpenTelemetry 포맷(OTLP)으로 수집 에이전트인 Grafana Alloy에 비동기로 전송합니다.
  3. 수신 및 저장 (Distributor & Ingester): Tempo의 Distributor가 트래픽을 받아 Ingester로 분배하며, Ingester는 스팬들을 메모리에 버퍼링 후 압축하여 S3 객체 스토리지에 블록 형태로 저장합니다.
  4. O(1) 수준의 단일 조회: Grafana에서 TraceID를 입력하면, Querier는 무거운 검색을 수행하는 대신 블록 내 블룸 필터를 활용하여 해당 트레이스가 위치한 S3 오프셋을 찾아내 데이터를 가져옵니다.

4. 완성된 통합: 점과 점을 잇다

Tempo의 진정한 위력은 단독으로 쓰일 때보다 메트릭, 로그와 결합할 때 발휘됩니다. Tempo는 앞선 포스팅에서 보았던 '단일 장애 추적 파이프라인'의 핵심 연결 고리입니다.
  1. Mimir(메트릭) -> Tempo: CPU 사용량 급증 알람을 보고 대시보드에 들어가면, 메트릭 그래프 위의 점에 TraceID가 매핑되어 있습니다. 클릭 한 번으로 장애 당시의 정확한 트레이스 뷰로 넘어갑니다.
  2. Tempo -> Loki(로그): 트레이스 폭포수 차트에서 유독 오래 걸린 특정 서비스의 구간을 발견합니다. 해당 Span을 클릭하면, 그 Span 내에서 발생한 애플리케이션 로그(Loki)만 정확하게 필터링되어 나타납니다.
이러한 유기적인 연결은 이벤트 기반 아키텍처나 비동기 통신이 잦은 복잡한 시스템에서 엔지니어의 디버깅 시간을 혁신적으로 단축해 줍니다.

5. 마무리하며

파편화되어 있던 데이터들을 하나의 문맥으로 엮어내는 LGTM 스택의 컴포넌트들을 모두 살펴보았습니다. 오브젝트 스토리지를 백엔드로 삼아 무한한 확장성과 가성비를 달성한 이 관측성 파이프라인은 단순히 장애 처리를 빠르게 하는 것을 넘어섭니다. 이렇게 100% 샘플링되어 정형화된 고품질의 텔레메트리 데이터(Metrics, Logs, Traces)는, 향후 머신러닝 알고리즘이 시스템의 이상 징후를 스스로 탐지하고 근본 원인을 추론하는 AIOps(Artificial Intelligence for IT Operations) 플랫폼으로 진화하기 위한 가장 강력한 기반 데이터 셋이 됩니다.
728x90
반응형
'▣ Infra & DevOps/LGTM Stack🔭' 카테고리의 다른 글
  • [LGTM] Grafana: 관측성의 완성, 단일 창구와 대시보드 베스트 프랙티스
  • [LGTM] Loki: 인덱스 프리 아키텍처로 완성하는 압도적 가성비의 로그 중앙화
  • [LGTM] Prometheus와 Mimir: 한계 없는 TSDB와 메트릭 생태계 구축
  • [LGTM] 관측성의 핵심(MELT) & LGTM 아키텍처 개요: 파편화된 생태계를 통합하다
예르미(yermi)
예르미(yermi)
끊임없이 제 자신을 계발하는 개발자입니다👨🏻‍💻
  • 예르미(yermi)
    예르미의 코딩노트
    예르미(yermi)
  • 전체
    오늘
    어제
    • 분류 전체보기 (1024) N
      • ◎ Java (133)
        • Java☕ (93)
        • JSP📋 (26)
        • Applet🧳 (6)
        • Interview👨🏻‍🏫 (8)
      • ◎ JavaScript (48)
        • JavaScript🦎 (25)
        • jQuery🌊 (8)
        • React🌐 (2)
        • Vue.js🔰 (6)
        • Node.js🫒 (3)
        • Google App Script🐑 (4)
      • ◎ HTML5+CSS3 (17)
        • HTML5📝 (8)
        • CSS3🎨 (9)
      • ──────────── (0)
      • ▣ Framework (67)
        • Spring🍃 (36)
        • Spring Boot🍀 (12)
        • Bootstrap💜 (3)
        • Selenium🌕 (6)
        • MyBatis🐣 (10)
      • ▣ Tools (47)
        • API🎯 (18)
        • Library🎲 (15)
        • JitPack🚀 (3)
        • Jenkins👨🏻 (7)
        • Thymeleaf🌿 (4)
      • ▣ Server (30)
        • Apache Tomcat🐱 (14)
        • Apache HTTP Server🛡️ (1)
        • Nginx🧶 (7)
        • OracleXE💿 (4)
        • VisualSVN📡 (4)
      • ▣ Infra & DevOps (19) N
        • LGTM Stack🔭 (5)
        • Kafka🐦‍🔥 (0)
        • Kubernetes🚢 (8)
        • KubeCon Japan 2026⚓ (6) N
      • ▣ OS : 운영체제 (18)
        • cmd : 명령프롬프트💻 (10)
        • Linux🐧 (8)
      • ▣ SQL : Database (56)
        • Oracle SQL🏮 (26)
        • PL SQL💾 (9)
        • MySQL🐬 (6)
        • MariaDB🦦 (6)
        • H2 Database🔠 (3)
        • SQL 실전문제🐌 (6)
      • ────────── (0)
      • ◈ Human Project (86)
        • Mini : Library Service📚 (15)
        • 화면 설계 [HTML]🐯 (10)
        • 서버 프로그램 구현🦁 (15)
        • Team : 여수어때🛫 (19)
        • Custom : Student🏫 (9)
        • Custom : Board📖 (18)
      • ◈ Yermi Project (49)
        • 조사모아(Josa-moa)📬 (5)
        • Riddle-Game🧩 (6)
        • 맛있을 지도🍚 (2)
        • 어디 가! 박대리!🙋🏻‍♂️ (5)
        • 조크베어🐻‍❄️ (4)
        • Looks Like Thirty🦉 (2)
        • Toy Project💎 (12)
        • 오픈소스 파헤치기🪐 (5)
        • 오늘가챠🃏 (8)
      • ◈ Refactoring (15)
        • Mini : Library Service📚 (8)
        • 서버 프로그램 구현🦁 (1)
        • Team : 여수어때🛫 (0)
        • 쿼리 튜닝일지🔧 (6)
      • ◈ Coding Test (80)
        • 백준(BOJ)👨🏻‍💻 (71)
        • 프로그래머스😎 (2)
        • 코드트리🌳 (7)
      • ◈ Study (129)
        • 기초튼튼 개발지식🥔 (25)
        • HTTP 웹 지식💡 (4)
        • 클린코드(Clean Code)🩺 (1)
        • 디자인패턴(GoF)🥞 (12)
        • 알고리즘(Algorithm)🎡 (14)
        • 다이어그램(Diagram)📈 (4)
        • 파이썬(Python)🐍 (16)
        • 에러노트(Error Note)🧱 (34)
        • 웹 보안(Web Security)🔐 (11)
        • 인공지능 AI🛸 (8)
      • ◈ 공부모임 (57)
        • 혼공학습단⏰ (18)
        • 코드트리 챌린지👊🏻 (2)
        • 개발도서 100독👟 (8)
        • 나는 리뷰어다🌾 (17)
        • 국가기술자격 서포터즈🌻 (12)
      • ◈ 자격증 공부 (48)
        • 정보처리기사🔱 (16)
        • 정보처리산업기사🔅 (9)
        • 정보보안기사⚜️ (11)
        • 컴퓨터활용능력 1급📼 (12)
      • ─────────── (0)
      • ◐ 기타 (124)
        • 알아두면 좋은 팁(tip)✨ (46)
        • 개발자의 일상🎈 (55)
        • 개발도서 서평🔍 (10)
        • 개발관련 세미나🎤 (2)
        • 블로그 꾸미기🎀 (9)
        • 사도신경 프로젝트🎚️ (2)
  • 인기 글

  • 최근 댓글

  • 반응형
    250x250
  • 태그

    프로그래밍
    Database
    일상
    SQL
    jsp
    백준
    자바스크립트
    CSS
    spring
    Oracle
    꿀팁
    Java
    코딩
    BOJ
    spring boot
    javascript
    코딩 테스트
    백준 티어
    Project
    Error Note
  • hELLO· Designed By정상우.v4.10.3
예르미(yermi)
[LGTM] Tempo: 100% 샘플링을 실현한 분산 트레이싱과 MSA 병목 추적
상단으로

티스토리툴바