아키텍처
https://github.com/blueswen/fastapi-observability 레포를 참고하여 아래와 같은 아키텍처를 가진 로깅 시스템을 구현한다.

개념 및 역할

- OpenTelemetry: OpenTelemetry(약자 OTel)은 CNCF(Cloud Naive Computing Foundation) 인큐베이팅 프로젝트에 있는 오픈소스다. Traces, Metrics, Logs 같은 데이터 instrumenting, generating, collecting, exporting 할 수 있는 Observability framework이다.
- 여기서는 FastAPI App 내에서 OpenTelemetry python SDK를 통해, 요청 및 응답에 대한 세부 정보를 수집하고 추적하는 역할을 한다. 이러한 Trace 정보들을 gRPC 프로토콜을 통해
Tempo로 보낸다.
호환성이 높은 시스템을 구축하기 위해 사용된 모든 도구와 라이브러리들은 오픈소스이며, 대부분의 표준 프로토콜을 지원합니다. 따라서 이 시스템은 다양한 환경과 기술 스택과 잘 통합될 수 있다. 그러나 특정 환경에서는 추가적인 설정이나 최적화가 필요할 수 있다. 이러한 상황에 대비하여 시스템의 유연성을 높이기 위해, 모듈화된 아키텍처를 사용하였다.
- Tempo: 분산 추적 데이터를 저장하고 검색하는
백엔드 시스템으로서 역할을 한다.
- Prometheus: 시스템 모니터링과 경고를 위한 오픈 소스 시스템이며, 미터링 데이터를 수집하고 저장한다.
- Loki: 로그 데이터를 저장하고, 이를 쿼리하기 위한 시스템입니다. 사용자는 Grafana와 같은 시각화 도구를 사용하여 저장된 로그 데이터를 조회하고 분석할 수 있습니다. Loki는 인덱싱에 라벨(label)을 사용하여, 전통적인 로그 관리 시스템에 비해 더 효율적으로 데이터를 저장하고 검색할 수 있도록 설계되었습니다.
- Grafana: Loki와 연동하여 Web UI를 통해 시각화를 할 수 있도록 도와준다.
- Promtail: Daemonset 방식으로 로그 데이터를 수집하고 Loki로 전송하는 에이전트다. 여기서는 Tempo에 있는 로그데이터를 Loki에 전송해준다. https://github.com/blueswen/fastapi-observability 레포에서는 Loki Docker Driver를 이용하여 Loki로 전송하지만, 여기서는 Kubernetes를 이용하여 시스템을 구성할 것이기 때문에 Loki Docker Driver대신 Promtail를 사용한다.
<aside>
💡 Prometheus와 Loki는 모두 시스템 모니터링 및 분석을 위한 강력한 도구다. 하지만 Prometheus는 시계열 메트릭 데이터의 모니터링과 알림에, Loki는 로그 데이터의 수집과 분석에 각각 최적화되어 있다.
</aside>
개념
Tempo를 이용하여 데이터를 Tracing하면 Trace ID와 Span ID라는 개념이 생긴다. 이 두 개념은 분산 추적(distributed tracing)에서 사용되는 핵심적인 요소들이다.
**span ID**와 **trace ID**는 분산 추적(distributed tracing)에서 사용되는 개념들이다.
- Trace ID: 하나의 요청이 시스템을 통과할 때 따라붙는 고유 식별자. 이를 통해 하나의 요청이 시스템의 여러 부분을 어떻게 통과하는지 전체적인 경로를 볼 수 있다.
- Span ID: 특정 작업이나 요청의 일부분을 나타내는 식별자. 이를 통해 각 작업의 세부적인 수행 과정을 볼 수 있으며, 이들 span들이 모여 전체 요청의 경로를 이루게 된다.
Prometheus client SDK
prometheus_client 라이브러리를 사용하여 다양한 메트릭(Counter, Gauge, Histogram)을 정의한다. 이 메트릭들은 FastAPI 애플리케이션의 요청 수, 응답 수, 요청 처리 시간, 예외 수 등을 측정하기 위해 설정된다.