개요

본 문서는 MSA (Micro Service Architecture) 환경을 모니터링 하는데 사용하는 Jaeger(예거 또는 졔거)에 대한 문서이다.

Jaeger란

 

Jaeger는 Uber에서 개발한 분산서비스 간 트랜잭션을 추적하는 오픈소스 소프트웨어이고 MSA 환경을 모니터링하는 프로젝트이다. 다양한 마이크로 서비스의 요청 경로를 추적하고, 요청 플로우를 시각적으로 확인하며 분산 트랜잭션을 모니터링할 수 있다. 이를 통해 대기시간과 성능을 최적화하고, 문제 해결을 위한 원인을 분석할 수 있다.

Tracing이란

단어 그대로 추적이라는 뜻이고, MSA의 수가 많아지고 각 서버 간의 요청 관계가 복잡해지면서 장애 및 병목을 찾아내는 것이 어려워지고 있기 때문에 이를 추적하기 위한 개념이다. 어느 함수에서 시간을 많이 소요하는지, 어느 경우에 지연이 발생하는지 등을 확인할 수 있다. MSA 환경에서는 분산된 수많은 트랜잭션을 로깅하기 위해 Distributed Tracing이라는 개념을 이용한다.

구조 및 특징

 

  • 기본 구조

 

Jaeger Client(deprecated)

OpenTracing API로 만들어진 언어별 구현체. OpenTracing API는 CNCF(클라우드 네이티브 컴퓨팅 재단) 산하의 프로젝트로, 애플리케이션 간 분산 추적을 위한 표준처럼 사용되는 비공식 API이다. Jaeger Client는 Deprecated되었고, OpenTelemetry SDK로 대체된다.

OpenTelemetry SDK (recommended)

Jager Client가 Deprecated되면서 공식으로 사용을 권장하는 SDK이다. 위에서 설명한 OpenTracing과 비슷한 성격의 OpenCensus는 OpenTelemetry라는 CNCF프로젝트로 통합되었다. OpenTelemetry와 Jaeger는 다른 목표를 가지고 있다. OpenTelemetry는 API와 SDK를 다국어로 제공하여 응용프로그램이 프로세스에서 다양한 원격 측정 데이터를 메트릭 및 추적 백엔드로 내보낼 수 있도록 하는 것이 목표이다. Jaeger는 주로 추적 Telemetry 데이터를 수신하여 해당 데이터의 처리, 집약, 데이터 마이닝, 시각화를 제공하는 백엔드이다. OpenTracing/OpenCensus/OpenTelemetry에 대한 설명은 뒤에서 자세하게 설명한다.

Jaeger Agent

UDP를 통해 전송된 Span (분산 추적에서 기본이 되는 블록 단위, 작업 단위)을 수신하는 네트워크 데몬으로 처리한후 Collector로 trace를 전송한다. 타겟 애플리케이션과 같은 호스트에 배치한다.

Jaeger Collector

Agent로부터 Trace를 수신하여 처리 파이프라인을 통해 유효성 검사, index 생성/변환을 수행한후 DB에 저장한다.

Jaeger Query

DB에서 trace를 조회 후 UI구성에 필요한 API를 제공한다.

Storage (DB)

추천되는 DB는 엘라스틱서치 및 카산드라이다. 호환성이 검증된 Promscale를 통한 TimescaleDB(Postgresql 기반 time-series DB), ClickHouse(컬럼 기반 RDBMS) 와도 호환된다. ScyllaDB, InfluxDB, Amazon DynamoDB 등에 대한 지원을 위해 실험도 진행중이다.

 

  • Kafka 구조

Jaeger Ingester

Jaeger collector는 Trace 정보를 DB에 바로 전송하지 않고 kafka에 전송한다. Kafka는 Trace 정보를 Ingester가 데이터를 Polling하여 DB에 기록한다.

OpenTracing / OpenCensus / OpenTelemetry

 

  • OpenTracing

 

  • OpenCensus

 

  • OpenTelemetry (OTel)

특징

  • High Scalability 고려해서 설계됨
  • OpenTracing과 OpenTelemetry을 지원함
  • Modern Web UI (React 개발)
  • Cloud Native Deployment
  • Zipkin과의 역호환성도 지원
  • Topology Graphs
  • System Architecture, Deep Dependency Graph
  • Sampling

샘플을 활용한 실습

Jaeger의 도커 이미지 실행 및 HotROD 라는 샘플 코드를 이용해 테스트환경 실습이 가능하다.

 

$ docker run -d -p6831:6831/udp -p16686:16686 jaegertracing/all-in-one:latest

 

위 명령어로 Jaeger를 실행하면 localhost:16686에 Jaeger웹 서비스가 실행된다. 

$ git clone https://github.com/jaegertracing/jaeger
$ cd jaeger/examples/hotrod
$ go run ./main.go all

위 명령어로 HOT ROD 샘플을 실행시키고 localhost:8080에 접속하면 4가지 버튼이 있는 웹 서비스가 실행된다. HotROD는 jaeger에서 제공하는 데모 어플리케이션이고, OpenTracing API를 사용했다. 

HotROD는 여러 마이크로 서비스가 별도 port로 실행되어 간단한 MSA환경으로 동작한다. 8080에 frontend, 8081에 customer, 8082에 driver, 8083에 route라는 이름의 서비스가 각각 실행된다.

 

 

좌측이 Jaeger를 실행한 모습, 우측이 HotROD를 실행한 모습이다. 8080 frontend 서비스에 접속하여 각 버튼을 클릭하면 요청을 하고, 해당 요청에 대해 Jaeger에서 확인할 수 있다.

 * HotROD외에 실제 서비스에 적용하려면, spring boot의 Jaeger Dependency를 이용하여 Jager로그를 남길 수 있다.

 

'Research' 카테고리의 다른 글

AresDB  (0) 2023.04.19
PWA 개념과 react에 PWA 적용하기  (0) 2023.02.21
WEB 3.0이란?  (1) 2023.02.17
Git 활용 방법과 브랜치 전략  (1) 2022.11.30
Prometheus(프로메테우스) 개념 및 timescaleDB로 변환  (0) 2022.11.30

+ Recent posts