OpenTelemetry to Grafana¶
이전 글에서는 OpenTelemetry 기반의 전통적인 오픈소스 컴포넌트를 활용한 관측 가능성에 대해 소개하고 시연했습니다. 최근 2년간 관측 가능성이 대중화되면서 Grafana도 관측 가능성 분야에 진출하기 시작했습니다.
개념¶
OTEL
OTEL은 OpenTelemetry의 약칭으로, CNCF의 관측 가능성 프로젝트입니다. 관측 가능성 분야의 표준화 방안을 제공하고, 관측 데이터의 데이터 모델, 수집, 처리, 내보내기 등의 표준화 문제를 해결하며, 특정 vendor에 종속되지 않는 서비스를 제공하는 것을 목표로 합니다.
OpenTelemetry는 Trace, Metrics, Logs 등(향후 새로운 관측 데이터 유형이 등장할 수 있음)의 관측 데이터를 관리하기 위한 표준 및 도구의 집합입니다. 현재 업계 표준이 되었습니다.
Tempo
Grafana Tempo는 오픈소스로, 사용하기 쉽고 대규모 분산 추적 백엔드입니다. Tempo는 비용 효율적으로 객체 스토리지만 있으면 실행 가능하며, Grafana, Prometheus, Loki와 긴밀하게 통합됩니다. Tempo는 Jaeger, Zipkin, OpenTelemetry를 포함한 모든 오픈소스 추적 프로토콜과 함께 사용할 수 있습니다.
Tempo 프로젝트는 2020년 Grafana Labs에서 시작되었으며, 10월 Grafana ObservabilityCON에서 발표되었습니다. Tempo는 AGPLv3 라이선스로 배포됩니다.
Loki
Loki는 Grafana Labs 팀의 최신 오픈소스 프로젝트로, 수평 확장 가능, 고가용성, 멀티 테넌트 로그 집계 시스템입니다. 로그 콘텐츠 자체를 인덱싱하지 않고 각 로그 스트림에 대해 태그 집합을 인덱싱하도록 설계되어 매우 경제적이고 운영이 간편합니다. 프로젝트는 Prometheus에서 영감을 받았으며, 공식 소개는 "Like Prometheus, but for logs.", 즉 Prometheus와 유사한 로그 시스템입니다.
아키텍처¶
실행 흐름
- OTEL이 Springboot 애플리케이션의 Trace 데이터를 수집하고 내보내며, 해당 로그에 Traceid, Spanid 태그를 추가합니다.
- Tempo가 OTEL 데이터를 수집 및 처리하여 로컬에 저장합니다. Tempo Query는 Tempo의 검색 백엔드 서비스입니다.
- Loki가 Springboot 애플리케이션의 로그 데이터를 수집합니다.
- Grafana Dashboard를 통해 Tempo Traces 데이터와 로그 데이터를 표시하고 조회합니다.
설치 및 구성¶
1. docker-compose.yaml 구성¶
version: '3.3'
services:
server:
image: registry.cn-shenzhen.aliyuncs.com/lr_715377484/springboot-server:latest
container_name: springboot_server
ports:
- 8080:8080
environment:
- OTEL_EXPORTER=otlp_span,prometheus
- OTEL_EXPORTER_OTLP_ENDPOINT=http://tempo:55680
- OTEL_EXPORTER_OTLP_INSECURE=true
- OTEL_RESOURCE_ATTRIBUTES=service.name=springboot-server
- JAVA_OPTS=-javaagent:/opentelemetry-javaagent.jar
logging:
driver: loki
options:
loki-url: 'http://localhost:3100/api/prom/push'
loki:
image: grafana/loki:2.2.0
container_name: loki
command: -config.file=/etc/loki/local-config.yaml
ports:
- "3100:3100"
logging:
driver: loki
options:
loki-url: 'http://localhost:3100/api/prom/push'
tempo:
image: grafana/tempo:0.6.0
container_name: tempo
command: ["--target=all", "--storage.trace.backend=local", "--storage.trace.local.path=/var/tempo", "--auth.enabled=false"]
ports:
- 8081:80
- 55680:55680
tempo-query:
image: grafana/tempo-query:0.6.0
container_name: tempo-query
#command: ["--grpc-storage-plugin.configuration-file=/etc/tempo-query.yaml"]
environment:
- BACKEND=tempo:80
volumes:
- ./etc/tempo-query.yaml:/etc/tempo-query.yaml
ports:
- "16686:16686" # jaeger-ui
depends_on:
- tempo
logging:
driver: loki
options:
loki-url: 'http://localhost:3100/api/prom/push'
grafana:
image: grafana/grafana:7.3.7
container_name: grafana
volumes:
- ./config/grafana:/etc/grafana/provisioning/datasources
environment:
- GF_AUTH_ANONYMOUS_ENABLED=true
- GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
- GF_AUTH_DISABLE_LOGIN_FORM=true
ports:
- "3000:3000"
logging:
driver: loki
options:
loki-url: 'http://localhost:3100/api/prom/push'
2. Grafana 구성¶
프로그램을 배포한 후 Grafana에서 데이터 소스를 구성할 수 있습니다. 새 버전의 Grafana는 yaml 방식을 사용하여 데이터 소스를 미리 편리하게 구성할 수 있도록 지원합니다.
apiVersion: 1
deleteDatasources:
- name: Prometheus
- name: Tempo
datasources:
- name: Tempo
type: tempo
access: proxy
orgId: 1
url: http://tempo-query:16686
basicAuth: false
isDefault: false
version: 1
editable: false
apiVersion: 1
uid: tempo
- name: Loki
type: loki
access: proxy
orgId: 1
url: http://loki:3100
basicAuth: false
isDefault: false
version: 1
editable: false
apiVersion: 1
jsonData:
derivedFields:
- datasourceUid: tempo
matcherRegex: (?:traceID|trace_id)=(\w+)
name: TraceID
url: $${__value.raw}
Loki는 로그를 파싱하여 일치하는 traceid에 URL을 설정합니다. 이를 통해 로그를 통해 직접 연결 관련 정보를 조회할 수 있으므로 로그와 트레이스의 연동이 가능합니다.
3. docker에 loki 플러그인 설치¶
docker plugin install grafana/loki-docker-driver:latest --alias loki --grant-all-permissions
4. 시작¶
docker-compose up -d
5. 시작 상태 확인¶
docker-compose ps
6. 접속하여 트레이스 정보 및 로그 정보 생성¶
curl http://localhost:8080/gateway
관측¶
Grafana를 통해 애플리케이션의 필터 조건을 입력하면 해당 애플리케이션의 로그 정보를 조회할 수 있습니다. 현재 로그 레벨이 Error인 경우 Grafana에 빨간색으로 표시되어 한눈에 파악할 수 있습니다.
로그 레코드를 클릭하면 로그 관련 태그를 확인할 수 있습니다. 현재 로그에 traceid가 존재하는 경우 Grafana가 자동으로 Tempo에 매칭하며, Tempo 버튼을 클릭하면 현재 로그 Trace의 트레이스 상세 정보로 이동할 수 있습니다. 이 방식을 통해 문제를 신속하게 파악할 수 있습니다.
Tempo 뷰로 전환하면 traceId를 통해 트레이스 상세 정보를 조회할 수 있습니다.
확장¶
Tempo는 추적 데이터를 저장하고 검색하는 백엔드 서비스입니다. Tempo는 동시에 Jaeger, Zipkin, OTLP 등 다른 분산 추적 프로토콜과 함께 사용해야 합니다. Tempo는 Traces 수집기라기보다는 중계소 역할을 하며, Jaeger, Zipkin 등의 프로토콜을 사용하여 데이터를 Tempo로 집계합니다.
Tempo는 Grafana Labs의 새로운 인큐베이팅 제품으로 아직 성숙하지 않았습니다. Tempo 사용 중 발생하는 일부 문제는 Grafana 팀 커뮤니티의 지원에 크게 의존해야 하므로 커뮤니케이션 비용이 증가합니다.
Loki는 새로운 유형의 로그 저장 도구로서 장단점이 있습니다.
장점
- Loki의 아키텍처는 매우 간단하며, Prometheus와 동일한 레이블을 인덱스로 사용합니다. 이러한 레이블을 통해 로그 내용을 조회할 수 있을 뿐만 아니라 모니터링 데이터도 조회할 수 있으므로, 두 가지 조회 간 전환 비용을 줄이고 로그 인덱스 저장 공간을 크게 절약합니다.
- ELK와 비교하여 비용이 적게 들고 경제적입니다.
- 로그 수집 및 시각화에 Grafana를 함께 사용할 수 있어 로그 필터링 및 상하위 행 확인 기능을 구현할 수 있습니다.
단점:
- 기술이 비교적 새롭고, 관련 커뮤니티가 활발하지 않습니다.
- 기능이 단순하며, 로그 조회 및 필터링에 특화되어 있습니다. 데이터 처리 및 정제 측면에서는 ELK만큼 강력하지 않습니다. 또한 장기적으로 ELK는 다양한 기술을 연계하여 로그 빅데이터 처리가 가능하지만 Loki는 불가능합니다.
이 글의 데모 소스 코드 https://github.com/lrwh/observable-demo/blob/main/opentelemetry-to-grafana
다음 글에서는 OpenTelemetry를 기반으로 Guance 플랫폼의 관측 가능성에 대해 소개하고 시연합니다.




