매일 업데이트
2022-11-20 16:11 7 min

Grafana Tempo 시작하기

분산 추적 백엔드 시스템인 Grafana Tempo의 핵심 내용을 자세히 살펴보겠습니다.

분산 추적은 시스템의 성능을 분석하고 깊이 있는 통찰력을 얻는 데 유용한 방법입니다. 이는 애플리케이션을 통과하는 요청의 전체 과정을 시각적으로 보여줍니다. 애플리케이션은 단일 서버에서 작동하거나 여러 서버에 분산된 다양한 서비스로 구성될 수 있습니다.

분산 추적을 활용하면 모든 서비스에 대한 통합된 시각을 확보할 수 있습니다. 그리고 Grafana Tempo는 바로 이러한 기능을 제공합니다.

Grafana Tempo란 무엇인가?

최근 ObservabilityCon 컨퍼런스에서 Grafana Labs는 여러 주요 업데이트를 발표했으며, 그중 하나가 Grafana Tempo였습니다. Grafana Labs는 "Grafana Tempo"라는 새로운 프로젝트를 오픈 소스 포트폴리오에 추가했습니다.

Grafana Tempo는 확장성이 뛰어나고 사용하기 간편한 오픈 소스 분산 추적 백엔드입니다. Tempo는 Zipkin, Jaeger, OpenTelemetry 및 OpenCensus와 같은 다양한 추적 프로토콜과 완벽하게 호환됩니다. 현재 Loki의 Tempo 데이터 검색 엔진, Prometheus, Grafana와 같은 모니터링 플랫폼을 지원합니다. 특히 Grafana 7.3 이상 버전에서는 Grafana와 Tempo 간의 매끄러운 통합 경험을 제공합니다.

Tempo를 사용하는 이유는 무엇인가?

Tempo는 메트릭, 추적, 로그 간의 연결성을 강화하는 데 사용됩니다. 동일한 오류가 반복적으로 발생하는 상황에서, 발생 원인을 명확히 파악하려면 정확한 추적을 분석해야 합니다. 하지만 기존 방식에서는 다운샘플링으로 인해 중요한 정보가 손실될 수 있었습니다. Tempo를 사용하면 분산 추적 데이터를 다운샘플링할 필요 없이, 전체 추적 데이터를 S3 또는 GCS와 같은 객체 저장소에 보관할 수 있으므로 비용 효율성이 매우 높습니다.

또한 Tempo를 통해 메트릭에서 특정 문제점을 발견한 후, 관련 로그를 기반으로 해당 추적으로 빠르게 이동할 수 있어 디버깅 및 문제 해결 속도를 높일 수 있습니다.

Tempo에서 사용되는 주요 구성 요소는 다음과 같습니다.

  • 배포자: 스팬을 받아 수집기로 전송하는 수신 옵션을 설정하는 데 사용됩니다.
  • 수집기: 추적 배치를 생성하고 저장소인 TempoDB로 전송하는 역할을 합니다.
  • 압축기: S3 또는 GCS와 같은 저장소에서 블록을 가져와 결합한 후 다시 저장소에 쓰는 작업을 수행합니다.
  • 저장소: TempoDB 구성을 설정합니다. 저장소 백엔드 이름(S3 또는 GCS)과 다른 매개변수를 지정합니다.
  • 멤버 목록: Tempo 구성 요소 간의 조정을 담당합니다.
  • 인증/서버: Tempo는 Weaveworks/Common 서버를 사용하며, 서버 구성을 설정하는 데 활용됩니다.

Tempo 아키텍처

아래 그림은 Grafana Tempo의 아키텍처를 보여줍니다.

먼저, 배포자는 Zipkin, Jaeger, OpenTelemetry, OpenCensus 등 다양한 소스에서 스팬을 수신합니다. 이 스팬들은 추적 ID를 기준으로 해싱되어 수집기로 전송됩니다. 수집기는 이러한 스팬을 묶어 추적 배치인 '블록'을 생성합니다.

생성된 블록은 백엔드 저장소(S3/GCS)에 저장됩니다. 특정 문제를 해결하고자 추적 ID를 알고 있다면, Grafana UI를 통해 해당 추적 ID를 검색하면 됩니다. 이때 쿼리기는 입력된 추적 ID에 대한 정보를 수집기나 객체 저장소에서 가져오는 역할을 합니다.

쿼리기는 먼저 수집기에 해당 추적 ID가 있는지 확인하고, 없다면 저장소를 확인합니다. 추적 정보는 HTTP 엔드포인트를 통해 노출됩니다. 한편 압축기는 저장소에서 블록을 가져와 결합하고, 다시 저장소로 보내 저장소의 블록 수를 줄이는 역할을 합니다.

Docker를 사용하여 Tempo 설정하기

이 섹션에서는 Docker를 사용하여 Grafana Tempo를 설정하는 과정을 단계별로 설명합니다. 우선 Tempo 백엔드를 설정하기 위해 Docker 네트워크를 생성합니다.

docker network create docker-tempo

다음으로 Tempo 구성 파일을 다운로드합니다.

curl -o tempo.yaml https://raw.githubusercontent.com/grafana/tempo/master/example/docker-compose/etc/tempo-local.yaml

다음은 지원되는 프로토콜 옵션 목록입니다.

프로토콜 포트
OpenTelemetry 55680
Jaeger - Thrift Compact 6831
Jaeger - Thrift Binary 6832
Jaeger - Thrift HTTP 14268
Jaeger - GRPC 14250
Zipkin 9411

이제 Tempo 구성 파일을 사용하여 Docker 컨테이너를 실행합니다. 이 예에서는 Jaeger의 Thrift Compact 형식(포트 6831)을 사용하여 추적을 전송합니다.

docker run -d --rm -p 6831:6831/udp --name tempo -v $(pwd)/tempo.yaml:/etc/tempo.yaml --network docker-tempo grafana/tempo:latest -config.file=/etc/tempo.yaml

Tempo 쿼리 컨테이너를 실행하려면 먼저 쿼리 구성 파일을 다운로드해야 합니다.

curl -o tempo-query.yaml https://raw.githubusercontent.com/grafana/tempo/master/example/docker-compose/etc/tempo-query.yaml

이제 템포 쿼리 구성 파일을 사용하여 Docker 컨테이너를 실행합니다.

docker run -d --rm -p 16686:16686 -v $(pwd)/tempo-query.yaml:/etc/tempo-query.yaml --network docker-tempo grafana/tempo-query:latest --grpc-storage-plugin.configuration-file=/etc/tempo-query.yaml

이제 Jaeger UI는 http://localhost:16686에서 접속할 수 있습니다.

검색 창에 추적 ID를 입력하면 해당 로그의 추적을 확인할 수 있습니다.

Tempo에서 데모 애플리케이션 실행하기

이제 Grafana Tempo에서 제공하는 데모 예제를 실행해 보겠습니다. docker-compose 예제를 사용할 예정이므로, docker-compose가 시스템에 설치되어 있어야 합니다.

먼저 Grafana Tempo zip 파일을 다음 링크에서 다운로드합니다: https://github.com/grafana/tempo

다운로드한 파일을 홈 폴더에 압축 해제하고 docker-compose 디렉토리로 이동합니다. 여러 docker-compose 예제를 찾을 수 있습니다. 여기서는 애플리케이션 데이터가 로컬에 저장되는 예제를 사용합니다.

cd tempo-master/example/docker-compose/
ls

다음 명령을 실행하여 스택을 시작합니다.

docker-compose up -d

이제 Grafana, Loki, Tempo, Tempo-query, Prometheus 컨테이너가 시작된 것을 확인할 수 있습니다.

docker ps

브라우저를 통해 Grafana, Jaeger UI 및 Prometheus가 정상적으로 작동하는지 확인할 수 있습니다.

컨테이너 내부에서 실행되는 합성 부하 생성기가 Tempo에 데이터를 전송할 추적 ID를 생성합니다. 다음 명령을 실행하여 로그를 확인할 수 있습니다.

docker-compose logs -f synthetic-load-generator

생성된 로그에서 추적 ID를 확인할 수 있습니다.

생성된 추적 ID 중 하나를 복사하여 Jaeger UI 검색창에 입력합니다.

입력한 추적 ID와 관련된 추적이 성공적으로 생성된 것을 확인할 수 있습니다.

결론

지금까지 Grafana Tempo에 대한 기본적인 내용을 살펴보았습니다. Tempo를 사용하여 추적을 생성하고 로그에 대한 메트릭과 문제점을 상세하게 분석해 보십시오.

Tempo는 모든 추적 데이터를 캡처하므로 다운샘플링으로 인한 정보 손실을 방지할 수 있습니다. 또한, Tempo는 개발팀이나 운영팀이 로그에서 발생하는 오류나 경고의 근본 원인을 파악하는 데 매우 유용합니다.

저자
Korea

기술 트렌드와 실용적인 팁을 전하는 लेखक입니다.