Monitoring

Tempo를 사용하여 Service Graph 만들기

황동리 2025. 11. 5. 18:42
반응형

Tempo로 서비스 간 호출 관계(Service Graph)를 시각화 하려면 단순히 Tempo 하나만 설치하면 끝이 아닙니다.


Trace → Metric 변환 → Grafana 시각화 의 전체 파이프라인을 이해해야 합니다.


아키텍처를 살펴보면 아래와 같습니다.

Tempo가 하는 일

Tempo는 Trace 저장소 입니다.


각 서비스(ex: API 서버, 프론트 등) 에서 발생한 Trace / Span 데이터를 OLTP 포맷으로 받아 저장합니다.

  • Trace = 한 요청의 전체 호출 흐름 (예: Front → API → DB)
  • Span = 각각의 단계 (예: API → DB 호출)

Tempo는 이 데이터들을 시계열로 저장하고,


Grafana에서 TraceQL로 검색하거나 트리뷰로 볼 수 있습니다.


👉 이것이 “분산 트레이싱 시각화” 기능이에요.


다만, “Service Graph는 Trace 만으로는 만들 수 없습니다.”


이유는, Tempo 안의 Trace 데이터만 봐서는 “얼마나 자주 API가 DB를 호출했는가” 같은 관계 그래프를 직접 그릴 수 없습니다.


그래서 Tempo는 Metrics Generator 라는 내장 기능을 제공합니다.


Metrics Generator 란

단계 역할
1 Tempo에 저장된 span을 주기적으로 스캔
2 각 trace에서 “client ↔ server” 관계를 찾아냄
3 Prometheus-compatible metrics으로 변환 (traces_service_graph_request_total, traces_spanmetrics_calls_total)
4 Prometheus로 remote_write로 푸시

결과적으로 Grafana는 아래와 같은 메트릭 값을 보고 service-aservice-b 의 관계를 알 수 있습니다.


traces_service_graph_request_total{client="service-a", server="service-b"} 42

Grafana가 tempo와 prometheus 데이터소스를 함께 써야하는 이유

  • Trace(Tempo): “어떤 요청이 어떤 span을 거쳤는가?”
  • Metrics(Prometheus): “어떤 서비스가 어떤 서비스를 얼마나 자주 호출했는가?”

이 내용으로 Service Graph는 Metrics로 그려진다는 것을 알 수 있습니다.



이제 Service Graph를 만드려면 어떻게 해야하는지 알아보겠습니다.

Tempo의 valules.yaml 파일 수정

(저는 tempo-distributed helm 차트가 아닌 tempo(모놀리식) helm 차트를 사용하여 설치하였습니다.)

values.yaml 파일을 아래와 같이 수정해주었습니다.

tempo:
  metricsGenerator:
    enabled: true
    # 여기서 꼭 포트 뒤에 /api/v1/write 경로를 넣어주어야 합니다.
    remoteWriteUrl: "http://<prometheus 서버의 주소>:9090/api/v1/write" 
  overrides:
    defaults: 
      metrics_generator:
        # metrics generator가 데이터 수집 시점의 시간 범위를 조절 하는 옵션
        # 따라서, Tempo가 metrics를 생성할 때, 현재 시간 기준으로 최대 15분 늦게 도착한 trace까지 포함하겠다는 의미
        ingestion_time_range_slack: 15m 
        processors:
          - service-graphs
          - span-metrics

여기서 제가 겪었던 상황을 설명을 조금 하자면,

처음에 ingestion_time_range_slack: 15m 옵션을 설정해주지 않았을 때는, metrics generator가 늦게 도착한 스팬들을 metric으로 변환을 안시켜줘서 prometheus 쪽으로 데이터를 못보내줬었습니다.

혹여, 저와 같은 상황을 겪었던 분이 계시다면, ingestion_time_range_slack 시간을 늘려보시는 것을 추천합니다.

Prometheus의 values.yaml 파일 수정

(저는 kube-prometheus-stack helm 차트를 사용하여 설치하였습니다.)
prometheus:
  prometheusSpec:
    enableFeatures: 
      - remote-write-receiver
    enableRemoteWriteReceiver: true
  • remote-write-receiver 기능을 활성화하면, 다른 시스템이 해당 Prometheus에 metric 데이터를 “PUSH” 할 수 있게 됩니다.

Grafana에서 Service Graph 만들기

그러면 이제 설정은 완료되었고 Grafana에서 Tempo를 데이터 소스로 지정을 했을 때,


Service Graph가 나오는지 확인해보겠습니다.


먼저 Grafana 접속해서 Explore 메뉴를 클릭 해줍니다.


그리고 이제 데이터 소스를 tempo로 설정하고 Service Graph 메뉴를 클릭해서 확인해보면,


정상적으로 나오는 것을 확인할 수 있습니다.

반응형