๊ฐ์
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: ๋ก๊ทธ๋ฅผ ์ค์์ ๋ชจ์ ๊ฒ์ํ๊ณ ๋ถ์ํฉ๋๋ค. ์ค์ ํด๋ฌ์คํฐ์ ์ค์นํฉ๋๋ค.
์ค์น ์ ์ฃผ์์ฌํญ
- Alloy
- ๋ชจ๋ ๋ ธ๋์ ๋ฐฐํฌ๋์ด์ผ ํ๋ฏ๋ก ๋ชจ๋ Taint๋ฅผ ๋ฌด์ํ ์ ์๋๋ก Toleration์ ์ถ๊ฐํฉ๋๋ค.
alloy.configMap.config์์ ๋ก๊ทธ ์์ง Flow์ ์ ์ฒ๋ฆฌ๋ฅผ ์ค์ ํฉ๋๋ค.
- Loki
- Object Storage(S3 ๋ฑ) ์ค์ ๊ณผ ๋ฆฌ์์ค ์ค์ ์ด ํต์ฌ์ ๋๋ค.
- S3 Secret ์ค์ ์ Grafana Community ๊ฐ์ด๋๋ฅผ ์ฐธ๊ณ ํฉ๋๋ค.
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 ๋ญ๋น๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด ๋ฐ๋์ ํํฐ๋ง์ด ํ์ํฉ๋๋ค.
- K8s API๋ฅผ ํตํด ๋ก๊ทธ๋ฅผ ์์งํ๋ฏ๋ก,
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 ํ
- Sampling ์ ๋ต: ๋ชจ๋ trace๋ฅผ ์ ์ฅํ๋ฉด ๋น์ฉ์ด ๊ธ์ฆํฉ๋๋ค.
- Head Sampling: ์์ฒญ ์์ ์์ ์ ์ํ๋ง ์ฌ๋ถ ๊ฒฐ์ . ๊ตฌํ์ด ๋จ์ํ์ง๋ง ์๋ฌ trace๋ฅผ ๋์น ์ ์์ต๋๋ค.
- Tail Sampling: ์์ฒญ ์๋ฃ ํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ์ํ๋ง. ์๋ฌ๋ ๋๋ฆฐ ์์ฒญ์ ํ์คํ ์ก์ง๋ง ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ ์ฌ์ฉํฉ๋๋ค.
- OpenTelemetry Collector๋ Alloy์์ tail sampling์ ์ค์ ํ ์ ์์ต๋๋ค.
- Span ํฌ๊ธฐ ์ ํ:
max_attribute_bytes๊ธฐ๋ณธ๊ฐ์ 2048์ ๋๋ค. ํฐ attribute๋ฅผ ๋ณด๋ด๋ ์๋น์ค๊ฐ ์์ผ๋ฉด OOM์ ์์ธ์ด ๋ฉ๋๋ค. - Alloy ์ฐ๋: Alloy๋ ๋ก๊ทธ๋ฟ ์๋๋ผ OTLP๋ก trace๋ ์์งํ์ฌ Tempo์ ์ ์กํ ์ ์์ต๋๋ค. ๋ก๊ทธ์ ํธ๋ ์ด์ค๋ฅผ ํ๋์ agent๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- Metrics Generator: Tempo๊ฐ trace ๋ฐ์ดํฐ๋ก๋ถํฐ RED ๋ฉํธ๋ฆญ(Rate, Error, Duration)์ ์๋ ์์ฑํ์ฌ Prometheus์ ์ ๋ฌํ ์ ์์ต๋๋ค. ๋ณ๋์ ๊ณ์ธก ์์ด ์๋น์ค ์์ค ๋ฉํธ๋ฆญ์ ์ป์ ์ ์์ต๋๋ค.
- Trace-Log ์ฐ๊ฒฐ: ๋ก๊ทธ์
traceID๋ฅผ ํฌํจ์ํค๋ฉด Grafana์์ ๋ก๊ทธ โ trace, trace โ ๋ก๊ทธ ๊ฐ ์ด๋์ด ๊ฐ๋ฅํฉ๋๋ค. ์ฅ์ ๋ถ์ ์๋๊ฐ ํฌ๊ฒ ํฅ์๋ฉ๋๋ค.
UI: Grafana
kube-prometheus-stack์์ Grafana๋ฅผ ํ์ฑํํ์ฌ ์ฌ์ฉํฉ๋๋ค. Loki์ Tempo๊ฐ ์ค์ํ๋์ด ์๋ค๋ฉด Grafana๋ 1๊ณณ์๋ง ์ค์นํ๋ฉด ๋ฉ๋๋ค.
๋์๋ณด๋๋ Grafana Dashboards์์ ์ปค๋ฎค๋ํฐ ๋์๋ณด๋๋ฅผ ๊ฐ์ ธ์ ์์ ํ๋ ๊ฒ์ด ํจ์จ์ ์ ๋๋ค.