๊ฐœ์š”

Observability๋Š” ์‹œ์Šคํ…œ์˜ ์ƒํƒœ๋ฅผ ์™ธ๋ถ€์—์„œ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์„ ์˜๋ฏธํ•˜๋ฉฐ, ์„ธ ๊ฐ€์ง€ ํ•ต์‹ฌ ์‹ ํ˜ธ(Pillar)๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

Pillar์„ค๋ช…ํŠน์ง•์˜ˆ์‹œ
Metric์‹œ๊ฐ„์— ๋”ฐ๋ฅธ ์ˆ˜์น˜ ๋ฐ์ดํ„ฐ์ง‘๊ณ„๋œ ๋ฐ์ดํ„ฐ, ๊ฒฝ๋Ÿ‰, ์•Œ๋ฆผ์— ์ ํ•ฉCPU ์‚ฌ์šฉ๋ฅ , ์š”์ฒญ ์ˆ˜, ์—๋Ÿฌ์œจ
Log๊ฐœ๋ณ„ ์ด๋ฒคํŠธ์˜ ์ƒ์„ธ ๊ธฐ๋ก๋น„์ •ํ˜•/์ •ํ˜• ํ…์ŠคํŠธ, ๋””๋ฒ„๊น…์— ์ ํ•ฉ์—๋Ÿฌ ์ŠคํƒํŠธ๋ ˆ์ด์Šค, ์š”์ฒญ ๋กœ๊ทธ
Trace๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ์š”์ฒญ์˜ ์ „์ฒด ๊ฒฝ๋กœSpan์˜ ํŠธ๋ฆฌ ๊ตฌ์กฐ, ๋ณ‘๋ชฉ ์ง€์  ํŒŒ์•…์— ์ ํ•ฉ์„œ๋น„์Šค A โ†’ B โ†’ C ํ˜ธ์ถœ ํ๋ฆ„

์„ธ ๊ฐ€์ง€๋ฅผ ์กฐํ•ฉํ•˜๋ฉด: Metric์ด ์ด์ƒ์„ ๊ฐ์ง€ํ•˜๊ณ , Trace๊ฐ€ ์–ด๋””์„œ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ๋ณด์—ฌ์ฃผ๊ณ , Log๊ฐ€ ์™œ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

Datadog vs Grafana Stack

๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋Š” ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ์„ ํƒ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Datadog: ๊ณต์‹ ๋ฌธ์„œ๊ฐ€ ๋งค์šฐ ์ž˜ ๋˜์–ด ์žˆ๊ณ  ์‰ฌ์šด ์‚ฌ์šฉ์„ฑ๊ณผ ๊ฐ•๋ ฅํ•œ ํŽธ์˜์„ฑ์„ ์ œ๊ณตํ•˜์ง€๋งŒ ๋น„์Œ‰๋‹ˆ๋‹ค.
  • Grafana Stack: ์˜คํ”ˆ์†Œ์Šค์™€ Grafana Cloud ์ค‘ ์„ ํƒ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ๊ธฐ๋Šฅ์€ Datadog์— ๋’ค๋–จ์–ด์ง€์ง€ ์•Š์ง€๋งŒ ๋„์ž… ๋‚œ์ด๋„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜์—์„œ๋Š” Grafana ์Šคํƒ(Prometheus, Loki, Tempo, Alloy)์„ ์ค‘์‹ฌ์œผ๋กœ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


Metric: Prometheus & Thanos

์„ค์น˜

Prometheus๋Š” kube-prometheus-stack์œผ๋กœ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ๋ฉ€ํ‹ฐ ํด๋Ÿฌ์Šคํ„ฐ ํ™˜๊ฒฝ์—์„œ๋Š” ๊ฐ ํด๋Ÿฌ์Šคํ„ฐ์— Prometheus๋ฅผ ์„ค์น˜ํ•˜๊ณ , Thanos๋กœ ์ค‘์•™ ์ง‘๊ณ„ํ•ฉ๋‹ˆ๋‹ค.

์„ค์น˜ ์‹œ ์ฃผ์˜์‚ฌํ•ญ

  • Prometheus CRD๊ฐ€ ๋งค์šฐ ํฌ๊ธฐ ๋•Œ๋ฌธ์— Argo CD์—์„œ ๋™๊ธฐํ™” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Server-side Apply๋ฅผ ์ ์šฉํ•˜๋ฉด ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
  • Argo CD์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ CRD ์„ค์น˜ ํƒ€์ด๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด PreSync ๋“ฑ ์‚ฌ์ดํด์„ ์ผ๋ถ€ ๋ฆฌ์†Œ์Šค์— ์ ์šฉํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํด๋Ÿฌ์Šคํ„ฐ ๊ฐ„ gRPC ํ†ต์‹ ์ด ํ•„์š”ํ•  ๋•Œ, Azure Application Gateway ๋“ฑ HTTP/2๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” LB๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ NGINX Ingress Controller ๋“ฑ์œผ๋กœ ์šฐํšŒํ•ฉ๋‹ˆ๋‹ค.
  • Thanos์˜ Store Gateway ๋“ฑ Object Storage์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” OOM์ด ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Ÿ‰์— ๋น„๋ก€ํ•˜์—ฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”ํŠธ๋ฆญ ์ˆ˜์ง‘ ํ™•์žฅ

ํ•„์š”ํ•œ ๊ณณ์—์„œ Metric ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๊ณ , ServiceMonitor๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Prometheus์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋ฉ”ํŠธ๋ฆญ์„ ์ˆ˜์ง‘ํ•˜๋Š” ๋Œ€์ƒ:

  • Ingress Controller (Ingress NGINX)
  • Autoscaler (KEDA, HPA)
  • GitOps ๋„๊ตฌ (Argo CD, Flux)
  • ML Serving (Triton Inference Server ๋“ฑ)
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปค์Šคํ…€ ๋ฉ”ํŠธ๋ฆญ (Prometheus Client ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ)

Log: Alloy + Loki

๊ตฌ์„ฑ

๋กœ๊ทธ ์ˆ˜์ง‘์€ Alloy + Loki๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • Alloy: ๋ชจ๋“  ํด๋Ÿฌ์Šคํ„ฐ์— DaemonSet์œผ๋กœ ์„ค์น˜ํ•˜์—ฌ ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  Loki์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํŒŒ์‹ฑ๋„ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ Fluentd ๋“ฑ ์ถ”๊ฐ€ ๋„๊ตฌ๊ฐ€ ๋ถˆํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • Loki: ๋กœ๊ทธ๋ฅผ ์ค‘์•™์— ๋ชจ์•„ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. ์ค‘์•™ ํด๋Ÿฌ์Šคํ„ฐ์— ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

์„ค์น˜ ์‹œ ์ฃผ์˜์‚ฌํ•ญ

  1. Alloy
    • ๋ชจ๋“  ๋…ธ๋“œ์— ๋ฐฐํฌ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ ๋ชจ๋“  Taint๋ฅผ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋„๋ก Toleration์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    • alloy.configMap.config์—์„œ ๋กœ๊ทธ ์ˆ˜์ง‘ Flow์™€ ์ „์ฒ˜๋ฆฌ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  2. Loki
    • Object Storage(S3 ๋“ฑ) ์„ค์ •๊ณผ ๋ฆฌ์†Œ์Šค ์„ค์ •์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.
    • S3 Secret ์„ค์ •์€ Grafana Community ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ๊ณ ํ•ฉ๋‹ˆ๋‹ค.

Alloy Flow

alloy_flow

Alloy์˜ ๋กœ๊ทธ ์ˆ˜์ง‘ ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. (Alloy๋ฅผ Port-forwardํ•˜์—ฌ ํ•ด๋‹น ๋‹ค์ด์–ด๊ทธ๋žจ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

  • discovery.kubernetes: Kubernetes ์ƒ์—์„œ Pod๋ฅผ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
    • nodeName์„ ํ†ตํ•ด ๊ฐ™์€ ๋…ธ๋“œ์— ์žˆ๋Š” Pod๋งŒ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.
  • discovery.relabel: K8s ๋ผ๋ฒจ ๋“ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์žฌ์ •์˜ํ•˜๊ณ  Pod๋ฅผ ๋ถ„๋ฅ˜ํ•ฉ๋‹ˆ๋‹ค.
  • loki.source.kubernetes: ํƒ์ƒ‰ํ•œ Pod๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค.
    • K8s API๋ฅผ ํ†ตํ•ด ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ํ•˜๋ฏ€๋กœ, nodeName ํ•„ํ„ฐ๋ง ์—†์ด๋Š” ์ „์ฒด ๋…ธ๋“œ์˜ ๋กœ๊ทธ๊ฐ€ ์ค‘๋ณต ์ˆ˜์ง‘๋ฉ๋‹ˆ๋‹ค. CPU/MEM ๋‚ญ๋น„๋ฅผ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ๋ฐ˜๋“œ์‹œ ํ•„ํ„ฐ๋ง์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • loki.process: ๋กœ๊ทธ๋ฅผ ํŒŒ์‹ฑํ•˜๊ณ  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • loki.write: ๋กœ๊ทธ๋ฅผ Loki์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ์„ค์ •์€ Alloy Components Reference๋ฅผ ์ฐธ๊ณ ํ•ฉ๋‹ˆ๋‹ค.

Loki Keywords

  • Gossip Ring: memberlist ๊ธฐ๋ฐ˜ ๋…ธ๋“œ ๊ฐ„ ์ƒํƒœ ์ „ํŒŒ ํ”„๋กœํ† ์ฝœ. Consul/etcd ๋Œ€์‹  Grafana ์Šคํƒ(Loki, Mimir, Tempo)์—์„œ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
  • Replication Factor: ๊ฐ ๋กœ๊ทธ ์ŠคํŠธ๋ฆผ์„ ๋ช‡ ๊ฐœ์˜ ingester์— ๋ณต์ œํ• ์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
  • TSDB Index: Loki 2.8+๋ถ€ํ„ฐ ๊ถŒ์žฅ๋˜๋Š” ์ธ๋ฑ์Šค ๋ฐฉ์‹. (๊ธฐ์กด์€ BoltDB Shipper)
  • Structured Metadata: Loki 3.0์—์„œ ๊ธฐ๋ณธ ํ™œ์„ฑํ™”. Cardinality ๋ถ€๋‹ด ์—†์ด ์ถ”๊ฐ€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ €์žฅ/๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • OTLP Native Ingestion: Loki 3.0+๋ถ€ํ„ฐ /otlp/v1/logs ์—”๋“œํฌ์ธํŠธ๋กœ OpenTelemetry ๋กœ๊ทธ๋ฅผ ์ง์ ‘ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Trace: Tempo

Tempo๋ž€

Grafana Tempo๋Š” ๋Œ€์šฉ๋Ÿ‰ ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์‹ฑ ๋ฐฑ์—”๋“œ์ž…๋‹ˆ๋‹ค. ํ•ต์‹ฌ ํŠน์ง•์€ ์ธ๋ฑ์‹ฑ ์—†์ด Object Storage(S3, GCS, Azure Blob)์— ์ง์ ‘ ์ €์žฅํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์šด์˜์ด ๋‹จ์ˆœํ•˜๊ณ  ๋น„์šฉ์ด ๋‚ฎ์Šต๋‹ˆ๋‹ค.

์•„ํ‚คํ…์ฒ˜

     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
     โ”‚  Application โ”‚  (OTLP, Jaeger, Zipkin)
     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
            โ–ผ
     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    TraceID ํ•ด์‹ฑ
     โ”‚ Distributor  โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                  โ–ผ
                               โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                               โ”‚   Ingester   โ”‚  WAL์— ์ž„์‹œ ์ €์žฅ
                               โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                      โ–ผ
                               โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                               โ”‚Object Storageโ”‚  S3, GCS ๋“ฑ
                               โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                      โ–ผ
     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
     โ”‚Query Frontendโ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถโ”‚   Querier    โ”‚  ๋ธ”๋ก ๋ณ‘๋ ฌ ๊ฒ€์ƒ‰
     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
            โ–ฒ
     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
     โ”‚  Compactor   โ”‚  ๋ธ”๋ก ๋ณ‘ํ•ฉ, ๊ฒ€์ƒ‰ ๊ณต๊ฐ„ ์ตœ์ ํ™”
     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
  • Distributor: ์—ฌ๋Ÿฌ ํฌ๋งท(OTLP, Jaeger, Zipkin)์˜ span์„ ์ˆ˜์‹ ํ•˜๊ณ  TraceID ํ•ด์‹ฑ์œผ๋กœ Ingester์— ๋ผ์šฐํŒ…ํ•ฉ๋‹ˆ๋‹ค.
  • Ingester: span ๋ฐ์ดํ„ฐ๋ฅผ WAL์— ์ž„์‹œ ์ €์žฅ ํ›„ Object Storage์— flushํ•ฉ๋‹ˆ๋‹ค.
  • Querier: Object Storage์—์„œ ๋ธ”๋ก์„ ๋ณ‘๋ ฌ๋กœ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. Query Frontend๊ฐ€ ์š”์ฒญ์„ ๋ถ„ํ• ํ•˜์—ฌ ์—ฌ๋Ÿฌ Querier์— ๋ถ„๋ฐฐํ•ฉ๋‹ˆ๋‹ค.
  • Compactor: ๋ธ”๋ก์„ ๋ณ‘ํ•ฉํ•˜์—ฌ ๊ฒ€์ƒ‰ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค.

TraceQL

Tempo๋Š” PromQL, LogQL์— ์ด์–ด TraceQL์ด๋ผ๋Š” ์ „์šฉ ์ฟผ๋ฆฌ ์–ธ์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

// 500ms ์ด์ƒ ๊ฑธ๋ฆฐ HTTP GET ์š”์ฒญ์˜ trace ๊ฒ€์ƒ‰
{ span.http.method = "GET" && span.http.status_code >= 500 && duration > 500ms }

DevOps ํŒ

  1. Sampling ์ „๋žต: ๋ชจ๋“  trace๋ฅผ ์ €์žฅํ•˜๋ฉด ๋น„์šฉ์ด ๊ธ‰์ฆํ•ฉ๋‹ˆ๋‹ค.
    • Head Sampling: ์š”์ฒญ ์‹œ์ž‘ ์‹œ์ ์— ์ƒ˜ํ”Œ๋ง ์—ฌ๋ถ€ ๊ฒฐ์ •. ๊ตฌํ˜„์ด ๋‹จ์ˆœํ•˜์ง€๋งŒ ์—๋Ÿฌ trace๋ฅผ ๋†“์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • Tail Sampling: ์š”์ฒญ ์™„๋ฃŒ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ  ์ƒ˜ํ”Œ๋ง. ์—๋Ÿฌ๋‚˜ ๋А๋ฆฐ ์š”์ฒญ์„ ํ™•์‹คํžˆ ์žก์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋” ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • OpenTelemetry Collector๋‚˜ Alloy์—์„œ tail sampling์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. Span ํฌ๊ธฐ ์ œํ•œ: max_attribute_bytes ๊ธฐ๋ณธ๊ฐ’์€ 2048์ž…๋‹ˆ๋‹ค. ํฐ attribute๋ฅผ ๋ณด๋‚ด๋Š” ์„œ๋น„์Šค๊ฐ€ ์žˆ์œผ๋ฉด OOM์˜ ์›์ธ์ด ๋ฉ๋‹ˆ๋‹ค.
  3. Alloy ์—ฐ๋™: Alloy๋Š” ๋กœ๊ทธ๋ฟ ์•„๋‹ˆ๋ผ OTLP๋กœ trace๋„ ์ˆ˜์ง‘ํ•˜์—ฌ Tempo์— ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ๊ทธ์™€ ํŠธ๋ ˆ์ด์Šค๋ฅผ ํ•˜๋‚˜์˜ agent๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. Metrics Generator: Tempo๊ฐ€ trace ๋ฐ์ดํ„ฐ๋กœ๋ถ€ํ„ฐ RED ๋ฉ”ํŠธ๋ฆญ(Rate, Error, Duration)์„ ์ž๋™ ์ƒ์„ฑํ•˜์—ฌ Prometheus์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ๊ณ„์ธก ์—†์ด ์„œ๋น„์Šค ์ˆ˜์ค€ ๋ฉ”ํŠธ๋ฆญ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  5. Trace-Log ์—ฐ๊ฒฐ: ๋กœ๊ทธ์— traceID๋ฅผ ํฌํ•จ์‹œํ‚ค๋ฉด Grafana์—์„œ ๋กœ๊ทธ โ†’ trace, trace โ†’ ๋กœ๊ทธ ๊ฐ„ ์ด๋™์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์žฅ์•  ๋ถ„์„ ์†๋„๊ฐ€ ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

UI: Grafana

kube-prometheus-stack์—์„œ Grafana๋ฅผ ํ™œ์„ฑํ™”ํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Loki์™€ Tempo๊ฐ€ ์ค‘์•™ํ™”๋˜์–ด ์žˆ๋‹ค๋ฉด Grafana๋„ 1๊ณณ์—๋งŒ ์„ค์น˜ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋Œ€์‹œ๋ณด๋“œ๋Š” Grafana Dashboards์—์„œ ์ปค๋ฎค๋‹ˆํ‹ฐ ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ๊ฐ€์ ธ์™€ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.