Chapter 5.1 추적에서 메트릭을 생성하는 방법

이번 데모는 추적에서 메트릭을 생성하는 방법입니다.

관찰가능성을 학습하는 가장 좋은 방법은 다양한 어플리케이션을 실행하면서, 결과를 보면서 이해하는 것입니다. 본 블로그를 다양한 예제를 포함하고 있으며, 독자들이 학습하는 데 도움이 될 것입니다.

초당 처리 개수, 평균 처리 시간, 서비스 그래프 등 메트릭은 시스템을 이해하는 데 유용합니다.

운영을 위해서는 메트릭과 추적이 필수적입니다. 하지만 개발자가 메트릭도 개발하고, 추적도 개발하려면 일이 너무 많습니다.

개발자는 바쁘고, 일정은 항상 빡빡합니다. 이 글에서 설명하는 Metrics-generator은 좋은 대안이라고 생각됩니다.

동일한 소스를 사용해서,

  1. 커스텀 메트릭을 통해서 직접 메트릭을 개발합니다.
  2. 메트릭 생성기를 사용해서, 메트릭을 자동 생성합니다.

Metrics-generator 설명

Metrics-generator는 추적에서 메트릭을 자동으로 생성합니다. Metrics-generator는 수집된 추적에서 메트릭을 파생(derives)시키는 Tempo 컴포넌트입니다.

  1. distributor 는 수신된 span을 ingester와 Metrics-generator 모두에 기록합니다.
  2. Metrics-generator는 span을 처리하고, Prometheus remote write 프로토콜을 사용하여 Prometheus 데이터 소스에 메트릭을 기록합니다.

Metrics-generator는 내부적으로 다수 processors를 실행합니다. 각 processors 는 span을 수집하고, 메트릭을 생성합니다. 아래의 processors를 사용할 수 있습니다.

  1. Service graphs는 그라파나 대시보드에서 서비스 간의 관계를 시각적으로 표현합니다.
  2. Span metrics는 프로메테우스에서 중요 메트릭을 자동으로 생성합니다.

스팬 메트릭

Span mterics는 간단하게 추적과 메트릭 간 관계를 구현하기 위한 방법을 제공합니다. Span metrics는 요청, 오류 및 기간(RED) 메트릭을 포함하여 수집된 추적 데이터에서 메트릭을 생성합니다.

Span metrics가 자동으로 생성하는 Metrics은 아래와 같습니다.

  1. traces_spanmetrics_latency 는 요청 기간(durations of all requests)을 계산하는 히스토그램입니다.
  2. traces_spanmetrics_calls_total 는 요청을 계산하는 카운터입니다.

Span metrics은 아주 중요합니다. 업무 개발에 바쁜 개발자들에게, 커스텀 메트릭 개발해 달라고 요청하기 어렵습니다. 운영팀이 당장 모니터링하려면 메트릭이 필요한 것은 사실이지만, 개발팀의 우선 순위가 있고 스케줄에 반영되어야 하기 때문이죠.

Span metrics을 사용하면, 개발자 도움 없이도 중요한 메트릭을 자동 생성할 수 있습니다. 물론 Exemplar도 지원합니다.

서비스 그래프

서비스 그래프는 노드와 에지로 구성되며, 네트워크와 마이크로서비스의 상호작용을 표시하기에 유용합니다.

데모 구성

데모는 가상머신에서 진행하고, 쿠버네티스는 사용하지 않습니다. 본 데모에 필요한 어플리케이션은 템포와 프로메테우스입니다.

2대의 호스트가 필요합니다.

1번 서버에는 프로메테우스, 프롬테일, 템포가 설치됩니다.

2번 서버에는 로키가 설치됩니다.

1번 서버에서 그라파나를 시작합니다.

systemctl start grafana-server

템포를 시작합니다.

./binary/tempo -config.file ./binary/config.yaml

프로메테우스를 시작합니다.

./binary/prometheus-2.39.1.linux-amd64/prometheus --config.file=./binary/prometheus-2.39.1.linux-amd64/prometheus.yml --enable-feature=exemplar-storage --storage.tsdb.max-block-duration=1m --storage.tsdb.min-block-duration=1m

템포를 시작합니다.

./binary/tempo -config.file ./binary/tempo_config.yaml

프롬테일을 시작합니다.

./binary/promtail-local-config.yaml

어플리케이션을 시작합니다.

./tracing-example 2>&1 | tee tracing-example.log

2번에서 로키를 시작합니다.

./binary/loki-linux-amd64 --config.file=./binary/loki-local-config.yaml

그라파나 데이터소스 설정

로키의 설정은 아래와 같습니다.

프로메테우스 설정은 아래와 같습니다.

템포의 설정은 아래와 같습니다.

결과 확인

메트릭 생성기를 통해서 생성된 메트릭을 확인할 수 있습니다.

메트릭에서 Exemplar가 생성되는 것을 확인합니다.

메트릭에서 추적으로 이동할 수 있습니다.

로그에서 추적으로 이동할 수 있습니다.

설정 파일

Tempo 구성 파일을 작성합니다.

multitenancy_enabled: false
search_enabled: true
metrics_generator_enabled: true

server:
http_listen_port: 3200

distributor:
receivers:
jaeger:
protocols:
thrift_http:
grpc:
thrift_binary:
thrift_compact:
zipkin:
otlp:
protocols:
http:
grpc:

storage:
trace:
backend: local
local:
path: /tmp/tempo/blocks

metrics_generator:
storage:
path: /tmp/tempo/generator/wal
remote_write:
- url: http://localhost:9090/api/v1/write

overrides:
metrics_generator_processors: [service-graphs, span-metrics]

Prometheus 구성 파일을 작성합니다.

# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: "prometheus"

# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.

static_configs:
- targets: ["localhost:9090"]


- job_name: 'tracing-example'
static_configs:
- targets: ["localhost:8000"]

Prometheus 결과를 확인합니다.

요약하면 메트릭 생성기는

  1. 서비스 그래프와 스팬 메트릭을 지원하며, 이를 통해 마이크로서비스의 중요 메트릭을 자동으로 생성할 수 있습니다. 그라파나는 이러한 기능을 추가 개발없이 사용할 수 있도록 지원해 줍니다.
  2. 한 가지 더 말씀드리면, 오픈텔레메트리도 이제는 서비스 그래프와 스팬 메트릭을 지원합니다. 그라파나 등 특정 솔루션에 종속되지 않는다는 장점이 있습니다.

--

--

모니터링의 새로운 미래 관측 가능성

모니터링의 새로운 미래 관측 가능성의 소스를 설명합니다.