๐ง ๋ค์ด๊ฐ๊ธฐ์

"์๋น์ค ์๋ต์ด ๋๋ ค์ก๋ค." "๊ฐํ์ ์ผ๋ก 504 Gateway Timeout์ด ๋ฐ์ํ๋ค." "Pod๊ฐ ์ฌ์์์ ๋ฐ๋ณตํ๋ค."
๋ถ์ฐ ํ๊ฒฝ์์ ์ด๋ฐ ์ฆ์์ ๋ง์ฃผํ์ ๋, ์์ธ์ ์ผ๋ง๋ ๋น ๋ฅด๊ฒ ํน์ ํ ์ ์๋๊ฐ? ์ฆ์์ ํ๋์ง๋ง ์์ธ์ ๋คํธ์ํฌ ์ง์ฐ, ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ, ์ธ๋ถ API ์ฅ์ , ์๋ชป๋ ์ค์ ๋ฑ ์์ญ ๊ฐ์ง๊ฐ ๋ ์ ์๋ค. Prometheus ๋์๋ณด๋์์ CPU ์ฌ์ฉ๋ฅ ์ด ์ ์์ด๊ณ , Pod ์ํ๋ Running์ด๋ผ๋ฉด ์ด๋์๋ถํฐ ์ถ์ ์ ์์ํด์ผ ํ๋๊ฐ?
์ด ์ง๋ฌธ์ ์ฒด๊ณ์ ์ผ๋ก ๋ตํ๋ ค๋ฉด ๋ ๊ฐ์ง๊ฐ ํ์ํ๋ค.
์ฒซ์งธ, ์ฅ์ ๊ฐ ์ด๋ป๊ฒ ๋ฐ์ํ๊ณ ์ ํ๋๋์ง์ ๋ํ ๊ฐ๋ ์ ์ดํด.
๋์งธ, ๊ทธ ํ๋ฆ์ ์ค์๊ฐ์ผ๋ก ๊ด์ธกํ ์ ์๋ ๋ฐ์ดํฐ ์์ง ์ฒด๊ณ.
์ ์๋ ๋ถ์ฐ ์์คํ ์ด๋ก ์์ ๋ค๋ฃจ๋ Fault/Error/Failure ๋ชจ๋ธ์ด๊ณ , ํ์๋ Observability์ ์ธ ์ถ์ธ Metrics, Logs, Traces๋ค.
์ด ๊ธ์์๋ ์ฅ์ ์ ๋ณธ์ง์ ๊ตฌ์กฐ๋ฅผ ๋จผ์ ์ ๋ฆฌํ ๋ค, ๊ฐ ๋จ๊ณ์์ ์ด๋ค Observability ๋ฐ์ดํฐ๊ฐ ํ์ง ์ญํ ์ ํ๋์ง ๋งคํํ๊ณ ์ํ๋ค. Prometheus, Loki, Tempo, OpenTelemetry๋ก ๊ตฌ์ฑ๋ ์คํ์ ๊ธฐ์ค์ผ๋ก, ์ฅ์ ๋ฐ์ ์ "๋ฌด์์ด → ์ → ์ด๋์" ์์ผ๋ก ์์ธ์ ์ถ๋ก ํ๋ ํ๋ฆ์ ๋ค๋ฃจ๊ณ ์ ํ๋ค.
๐ธ 1. Fault, Error, Failure์ ๊ตฌ๋ถ
1.1 ์ฉ์ด ์ ์์ ์ธ๊ณผ ๊ด๊ณ
๋ถ์ฐ ์์คํ ์์ ์ฅ์ ๋ฅผ ๋ ผํ ๋ Fault, Error, Failure๋ผ๋ ์ธ ์ฉ์ด๊ฐ ํผ์ฉ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ์ด ์ ์ ๋์์ด๊ฐ ์๋๋ผ ์ธ๊ณผ ๊ด๊ณ๋ก ์ฐ๊ฒฐ๋ ์๋ก ๋ค๋ฅธ ๊ฐ๋ ์ด๋ค.
| Fault | ์ฅ์ ๋ฅผ ์ ๋ฐํ๋ ๊ทผ๋ณธ ์์ธ | ์๋ชป๋ ์ค์ , ๋ฒ๊ทธ๊ฐ ์๋ ์ฝ๋, ํ๋์จ์ด ๊ฒฐํจ |
| Error | Fault๋ก ์ธํด ์์คํ ๋ด๋ถ์์ ๋ฐ์ํ ๋น์ ์ ์ํ | Null pointer exception, ๋ฉ๋ชจ๋ฆฌ ๋์, ์๋ชป๋ ์ฐ์ฐ ๊ฒฐ๊ณผ |
| Failure | Error๊ฐ ์ธ๋ถ๋ก ๋๋ฌ๋ ์์คํ ์ด ๋ช ์ธ๋๋ก ๋์ํ์ง ์๋ ์ํ | ์๋น์ค ์๋ต ๋ถ๊ฐ, ์๋ชป๋ ๋ฐ์ดํฐ ๋ฐํ, ํ๋ก์ธ์ค ํฌ๋์ |
์ด ์ธ ๋จ๊ณ์ ํต์ฌ์ ์๊ฐ์ ์์์ ๊ฐ์์ฑ์ ์ฐจ์ด๋ค.
Fault๋ ์์คํ ๋ด๋ถ์ ์ ๋ณตํด ์์ ์ ์๊ณ , ํน์ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋ ๋ Error๋ก ๋ฐํ๋๋ค. Error ์ญ์ ๋ด๋ถ ์ํ์ ๋จธ๋ฌผ ์ ์์ง๋ง, ๋ณต๊ตฌ๋์ง ์์ผ๋ฉด ๊ฒฐ๊ตญ Failure๋ก ์ด์ด์ ธ ์ฌ์ฉ์๋ ๋ค๋ฅธ ์ปดํฌ๋ํธ๊ฐ ์ธ์งํ๊ฒ ๋๋ค.
Fault (์์ธ) → Error (๋ด๋ถ ์ด์ ์ํ) → Failure (์ธ๋ถ ๊ด์ธก ๊ฐ๋ฅํ ์ฅ์ )
์ค์ ์ด์ ํ๊ฒฝ์์ ์ด ๊ตฌ๋ถ์ด ์ค์ํ ์ด์ ๋ ํ์ง ์์ ๊ณผ ๋์ ๋ฐฉ์์ด ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ด๋ค. Failure๊ฐ ๋ฐ์ํ ํ์ ๋์ํ๋ฉด ์ด๋ฏธ ์ฌ์ฉ์์๊ฒ ์ํฅ์ด ๊ฐ ์ํ๋ค. Error ๋จ๊ณ์์ ํ์งํ๋ฉด Failure๋ฅผ ๋ง์ ์ ์๊ณ , Fault๋ฅผ ์ฌ์ ์ ์ ๊ฑฐํ๋ฉด Error ์์ฒด๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
1.2 ์ฅ์ ์ ํ๋ณ ๋ถ๋ฅ
์ฅ์ ๋ ์์คํ ์ด ์ด๋ค ๋ฐฉ์์ผ๋ก ๋น์ ์ ๋์ํ๋์ง์ ๋ฐ๋ผ ๋ถ๋ฅํ ์ ์๋ค. ์ด ๋ถ๋ฅ๋ ์ฅ์ ํ์ง ๋์ด๋์ ๋ณต๊ตฌ ์ ๋ต์ ๊ฒฐ์ ํ๋ ๊ธฐ์ค์ด ๋๋ค.
| Crash Failure | ํ๋ก์ธ์ค๊ฐ ์ค๋จ๋๊ณ ๋ ์ด์ ๋์ํ์ง ์์ | ๋ฎ์ |
| Omission Failure | ์์ฒญ์ ์์ ํ๊ฑฐ๋ ์๋ต์ ์ ์กํ์ง ๋ชปํจ | ์ค๊ฐ |
| Timing Failure | ์๋ต์ด ์ง์ ๋ ์๊ฐ ๋ฒ์๋ฅผ ๋ฒ์ด๋จ | ์ค๊ฐ |
| Response Failure | ์๋ต ๊ฐ์ด ์๋ชป๋์๊ฑฐ๋ ์ํ ์ ์ด๊ฐ ๋น์ ์ | ๋์ |
| Arbitrary (Byzantine) Failure | ์์์ ์์ ์ ์์์ ์๋ชป๋ ๋์ ์ํ | ๋งค์ฐ ๋์ |
- Crash Failure:
ํ๋ก์ธ์ค๊ฐ ์์ ํ ์ค๋จ๋๋ฏ๋ก Health Check๋ ํ๋ก์ธ์ค ๋ชจ๋ํฐ๋ง์ผ๋ก ๋น๊ต์ ์ฝ๊ฒ ํ์ง๋๋ค. Kubernetes ํ๊ฒฝ์์ Pod๊ฐ CrashLoopBackOff ์ํ์ ๋น ์ง๋ ๊ฒ์ด ๋ํ์ ์ด๋ค. - Omission Failure:
์์ฒญ์ด ์ ์ค๋๊ฑฐ๋ ์๋ต์ด ์ ์ก๋์ง ์๋ ๊ฒฝ์ฐ๋ค. ๋คํธ์ํฌ ํจํท ์์ค, ๋ฒํผ ์ค๋ฒํ๋ก์ฐ, ๋๋ ์์ ์ธก ํ๊ฐ ๊ฐ๋ ์ฐฌ ์ํฉ์์ ๋ฐ์ํ๋ค. ์์ฒญ์ ๋ณด๋ธ ์ธก์์๋ ํ์์์์ผ๋ก ์ธ์งํ์ง๋ง, ์ค์ ์์ธ์ด ์ก์ ์คํจ์ธ์ง ์์ ์คํจ์ธ์ง ๊ตฌ๋ถํ๊ธฐ ์ด๋ ต๋ค. - Timing Failure:
์์คํ ์ด ๋์์ ํ์ง๋ง ์ง์ ๋ ์๊ฐ ๋ด์ ์๋ตํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๋ค. SLA ์๋ฐ, ์ฌ์ฉ์ ๊ฒฝํ ์ ํ๋ก ์ด์ด์ง๋ฉฐ, ๊ฐํ์ ์ผ๋ก ๋ฐ์ํ ๊ฒฝ์ฐ ์ฌํ๊ณผ ์์ธ ๋ถ์์ด ๊น๋ค๋กญ๋ค. - Response Failure:
์๋ต์ด ๋์์ค์ง๋ง ๊ทธ ๋ด์ฉ์ด ์๋ชป๋ ๊ฒฝ์ฐ๋ค. ๊ฐ์ด ํ๋ฆฌ๊ฑฐ๋(Value Failure), ์ํ ์ ์ด๊ฐ ๋น์ ์์ ์ผ๋ก ์ํ๋(State-transition Failure) ๊ฒฝ์ฐ๋ฅผ ํฌํจํ๋ค. ์ด ์ ํ์ ์์คํ ์ด ์ ์ ๋์ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฏ๋ก ํ์ง๊ฐ ์ด๋ ต๊ณ , ์๋ชป๋ ๋ฐ์ดํฐ๊ฐ ํ์ ์์คํ ์ผ๋ก ์ ํ๋ ์ํ์ด ์๋ค. - Arbitrary Failure(Byzantine Failure):
๊ฐ์ฅ ์ฌ๊ฐํ ์ ํ์ผ๋ก, ์์คํ ์ด ์์ธก ๋ถ๊ฐ๋ฅํ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค. ์ ์์ ์ธ ๊ณต๊ฒฉ, ํ๋์จ์ด ๊ฒฐํจ, ๋๋ ๋ณต์กํ ๋ฒ๊ทธ ์กฐํฉ์ผ๋ก ๋ฐ์ํ ์ ์๋ค. ์ผ๋ฐ์ ์ธ ๋ชจ๋ํฐ๋ง์ผ๋ก๋ ํ์ง๊ฐ ๊ฑฐ์ ๋ถ๊ฐ๋ฅํ๋ฉฐ, ํฉ์ ์๊ณ ๋ฆฌ์ฆ์ด๋ ๋ค์ค ๊ฒ์ฆ ๋ก์ง์ด ํ์ํ๋ค.
1.3 Halting ์ ํ๊ณผ ํ์ง ๊ฐ๋ฅ์ฑ
์ฅ์ ๊ฐ ๋ฐ์ํ์ ๋ ์ธ๋ถ์์ ์ด๋ฅผ ์ผ๋ง๋ ํ์คํ๊ฒ ์ธ์งํ ์ ์๋์ง๋ ์ค์ํ ๋ถ๋ฅ ๊ธฐ์ค์ด๋ค.
[Halting ์ ํ]
| Fail-stop | ํฌ๋์ ๋ฐ์ ์ ์ฆ์ ํ์ง ๊ฐ๋ฅ |
| Fail-noisy | ํฌ๋์ ๋ฐ์, ์ผ์ ์๊ฐ ํ ํ์ง ๊ฐ๋ฅ |
| Fail-silent | ํฌ๋์ ๋๋ Omission ๋ฐ์, ์์ธ ๊ตฌ๋ถ ๋ถ๊ฐ |
| Fail-safe | ์์ ๋์์ด๋ ํด๋ฅผ ๋ผ์น์ง ์์ |
| Fail-arbitrary | ์์ ๋์, ์ ์์ ๊ฒฐ๊ณผ ๊ฐ๋ฅ |
- Fail-stop:
๊ฐ์ฅ ๋ค๋ฃจ๊ธฐ ์ฌ์ด ๋ชจ๋ธ์ด๋ค. ํ๋ก์ธ์ค๊ฐ ์ค๋จ๋๋ฉด ์ฆ์ ์ ์ ์๊ณ , ์ค๋จ ์ ๊น์ง๋ ์ ์ ๋์ํ๋ค๊ณ ๊ฐ์ ํ ์ ์๋ค. Kubernetes์ Liveness Probe๊ฐ ์ด ๋ชจ๋ธ์ ์ ์ ๋ก ์ค๊ณ๋์ด ์๋ค - Fail-noisy:
Fail-stop๊ณผ ์ ์ฌํ๊ฒ ํฌ๋์๊ฐ ๋ฐ์ํ์ง๋ง, ํ์ง๊น์ง ์ผ์ ์๊ฐ์ด ์์๋๋ค. ์ฅ์ ๋ฐ์ ์ฌ์ค์ ๊ฒฐ๊ตญ ์ ์ ์์ผ๋ ์ฆ๊ฐ์ ์ด์ง ์๋ค. ํด๋ฌ์คํฐ ๋ฉค๋ฒ์ญ ํ๋กํ ์ฝ์ ํตํด ๋ ธ๋ ์ฅ์ ๋ฅผ ์ ํํ๋ ๊ฒฝ์ฐ๊ฐ ์ด์ ํด๋นํ๋ค. - Fail-silent:
๋ถ์ฐ ์์คํ ์์ ์์ฃผ ๋ง์ฃผํ๋ ํ์ค์ ์ธ ์ํฉ์ด๋ค. ๋คํธ์ํฌ ํํฐ์ ์ด ๋ฐ์ํ์ ๋, ์๋๋ฐฉ ๋ ธ๋๊ฐ ์ค์ ๋ก ์ฃฝ์ ๊ฒ์ธ์ง ๋จ์ํ ๋คํธ์ํฌ๊ฐ ๋๊ธด ๊ฒ์ธ์ง ๊ตฌ๋ถํ ์ ์๋ค. ์ด ๊ฒฝ์ฐ ํ์์์ ๊ธฐ๋ฐ ํ์ง์ ์์กดํ๊ฒ ๋๋ฉฐ, ์๋ชป๋ ํ๋จ์ผ๋ก Split-brain ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. - Fail-safe:
ํ๋ก์ธ์ค๊ฐ ์์์ ๋์์ ํ์ง๋ง, ๊ทธ ๊ฒฐ๊ณผ๊ฐ ์์คํ ์ ํด๋ฅผ ๋ผ์น์ง ์๋ ๊ฒฝ์ฐ๋ค. ์๋ชป๋ ๊ฐ์ ๋ฐํํ๋๋ผ๋ ๋ช ํํ ์๋ชป๋ ๊ฐ์์ ์ ์ ์๊ฑฐ๋, ์์ ํ ๊ธฐ๋ณธ๊ฐ์ผ๋ก fallbackํ๋ ๊ฒฝ์ฐ๊ฐ ์ด์ ํด๋นํ๋ค. - Fail-arbitrary(Byzantine Failure):
๊ฐ์ฅ ๋ค๋ฃจ๊ธฐ ์ด๋ ค์ด ๋ชจ๋ธ์ด๋ค. ํ๋ก์ธ์ค๊ฐ ์์ธก ๋ถ๊ฐ๋ฅํ ๋ฐฉ์์ผ๋ก ๋์ํ๋ฉฐ, ์ ์์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ ์ ์๋ค. ์ผ๋ฐ์ ์ธ ๋ชจ๋ํฐ๋ง์ผ๋ก๋ ํ์ง๊ฐ ๊ฑฐ์ ๋ถ๊ฐ๋ฅํ๋ฉฐ, ํฉ์ ์๊ณ ๋ฆฌ์ฆ์ด๋ ๋ค์ค ๊ฒ์ฆ ๋ก์ง์ด ํ์ํ๋ค.
ํ์ง๋ง, ๋น๋๊ธฐ ๋ถ์ฐ ์์คํ ์์๋ ํ๋ก์ธ์ค ์คํ ์๋์ ๋ฉ์์ง ์ ๋ฌ ์๊ฐ์ ๋ํ ๋ณด์ฅ์ด ์์ผ๋ฏ๋ก Crash Failure์กฐ์ฐจ ์๋ฒฝํ๊ฒ ํ์งํ ์ ์๋ค. ์ค๋ฌด์์๋ ํ์์์ ๊ฐ์ ์ ์ ํ ์ค์ ํ๊ณ ์คํ์ ๊ฐ์ํ๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค.
๐ธ 2. Observability์ ์ธ ์ถ๊ณผ ์ญํ ๋ถ๋ด
Observability: ์์คํ ์ ์ธ๋ถ ์ถ๋ ฅ์ ํตํด ๋ด๋ถ ์ํ๋ฅผ ์ถ๋ก ํ ์ ์๋ ์ ๋

๋ชจ๋ํฐ๋ง์ด "๋ฌธ์ ๊ฐ ๋ฐ์ํ๋๊ฐ?"๋ผ๋ ์ง๋ฌธ์ ๋ตํ๋ค๋ฉด, Observability๋ "์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋๊ฐ?"๋ผ๋ ์ง๋ฌธ์ ๋ตํ ์ ์๋ ๋ฅ๋ ฅ์ด๋ค.
์ด๋ฅผ ์ํด ์ธ ๊ฐ์ง ์ ํ์ ๋ฐ์ดํฐ๊ฐ ํ์ํ๋ค.
2.1 Metrics: "๋ฌด์์ด" ๋ฐ์ํ๋๊ฐ
Metrics: ์๊ฐ์ ๋ฐ๋ผ ๋ณํํ๋ ์์น ๋ฐ์ดํฐ.
Metrics์๋ CPU ์ฌ์ฉ๋ฅ , ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋, ์์ฒญ ์, ์๋ฌ์จ, ์๋ต ์๊ฐ ๋ฑ์ด ํด๋นํ๋ค. ๋ํ์ ์ผ๋ก Prometheus๋ ์ด๋ฌํ ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ณ ์ ์ฅํ๋ ๋ํ์ ์ธ ๋๊ตฌ๋ค.
# prometheus.yml ์ค์ ์์
scrape_configs:
- job_name: 'my-service'
scrape_interval: 15s
static_configs:
- targets: ['my-service:8080']
Prometheus์ ํต์ฌ ๋์ ๋ฐฉ์์ Pull ๋ชจ๋ธ์ด๋ค. ๋ชจ๋ํฐ๋ง ๋์์ด /metrics ์๋ํฌ์ธํธ๋ฅผ ๋ ธ์ถํ๋ฉด, Prometheus๊ฐ ์ฃผ๊ธฐ์ ์ผ๋ก ํด๋น ์๋ํฌ์ธํธ๋ฅผ ํธ์ถํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์์งํ๋ค.
Metrics์ ๊ฐ์ ์ ์ง๊ณ์ ๊ฒฝํฅ ํ์ ์ด๋ค. ํน์ ์์ ์ CPU ์ฌ์ฉ๋ฅ ๋ณด๋ค "์ง๋ 1์๊ฐ ๋์ CPU ์ฌ์ฉ๋ฅ ์ด ์ ์ง์ ์ผ๋ก ์์นํ๋ค"๋ ์ ๋ณด๊ฐ ๋ ์ ์ฉํ๋ค. ์ด๋ฅผ ํตํด Failure๊ฐ ๋ฐ์ํ๊ธฐ ์ ์ Error ์งํ๋ฅผ ํฌ์ฐฉํ ์ ์๋ค.
Prometheus์์ ์์ฃผ ์ฌ์ฉํ๋ ๋ฉํธ๋ฆญ ์ ํ์ ๋ค์๊ณผ ๊ฐ๋ค.
| Counter | ๋์ ์ฆ๊ฐ ๊ฐ | ์ด ์์ฒญ ์, ์ด ์๋ฌ ์ |
| Gauge | ํ์ฌ ์ํ ๊ฐ | ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋, ํ์ฑ ์ฐ๊ฒฐ ์ |
| Histogram | ๋ถํฌ ์ธก์ | ์์ฒญ ์๋ต ์๊ฐ ๋ถํฌ |
| Summary | ๋ถ์์ ๊ณ์ฐ | p99 ์๋ต ์๊ฐ |
ํ์ง๋ง Metrics์ ํ๊ณ๋ ์์ธ ํ์ ์ด ์ด๋ ต๋ค๋ ์ ์ด๋ค. ์๋ฌ์จ์ด ๋์์ก๋ค๋ ์ฌ์ค์ ์ ์ ์์ง๋ง, ์ด๋ค ์์ฒญ์ด ์ ์คํจํ๋์ง๋ ์ ์ ์๋ค. ์ด ์ง์ ์์ Logs๊ฐ ํ์ํด์ง๋ค.
2.2 Logs: "์" ๋ฐ์ํ๋๊ฐ
Logs: ํน์ ์์ ์ ๋ฐ์ํ ์ด๋ฒคํธ๋ฅผ ํ ์คํธ๋ก ๊ธฐ๋กํ ๋ฐ์ดํฐ.
Logs์๋ ์๋ฌ ๋ฉ์์ง, ์คํ ํธ๋ ์ด์ค, ์ํ ๋ณ๊ฒฝ ์ด๋ ฅ ๋ฑ์ด ํฌํจ๋๋ค.
๋ํ์ ์ผ๋ก Loki๋ Prometheus์ ์ ์ฌํ ๋ฐฉ์์ผ๋ก ๋ก๊ทธ๋ฅผ ์์งํ๊ณ ์ฟผ๋ฆฌํ ์ ์๋ ๋ก๊ทธ ์ง๊ณ ์์คํ ์ด๋ค.
# ํน์ ์๋น์ค์ ์๋ฌ ๋ก๊ทธ ์กฐํ
{app="my-service"} |= "error" | json | level="error"
# ์ต๊ทผ 5๋ถ๊ฐ ์๋ฌ ๋ก๊ทธ ์ ์ง๊ณ
count_over_time({app="my-service"} |= "error"[5m])
Loki์์ ๋ก๊ทธ๋ฅผ ์กฐํํ ๋๋ ์์ ๊ฐ์ LogQL์ ์ฌ์ฉํ๋ค.
Logs์ ๊ฐ์ ์ ๋งฅ๋ฝ ์ ๋ณด๋ค. Metrics๊ฐ "์๋ฌ๊ฐ ๋ฐ์ํ๋ค"๋ ์ฌ์ค๋ง ์๋ ค์ค๋ค๋ฉด, Logs๋ "์ฌ์ฉ์ ID 12345์ ๊ฒฐ์ ์์ฒญ์์ ์ธ๋ถ API ํธ์ถ ์ connection refused๊ฐ ๋ฐ์ํ๋ค"๋ ๊ตฌ์ฒด์ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ค.
Logs์ ํ๊ณ๋ ๋ถ์ฐ ํ๊ฒฝ์์ ์์ฒญ ํ๋ฆ์ ๋ฐ๋ผ๊ฐ๊ธฐ ์ด๋ ต๋ค๋ ์ ์ด๋ค. ํ๋์ ์ฌ์ฉ์ ์์ฒญ์ด API Gateway → Service A → Service B → Database๋ก ์ด์ด์ง ๋, ๊ฐ ์๋น์ค์ ๋ก๊ทธ๋ฅผ ์๋์ผ๋ก ์ฐ๊ฒฐํด์ผ ํ๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ด Traces๋ค.
2.3 Traces: "์ด๋์" ๋ฐ์ํ๋๊ฐ
Traces: ๋จ์ผ ์์ฒญ์ด ์ฌ๋ฌ ์๋น์ค๋ฅผ ๊ฑฐ์น๋ฉฐ ์ฒ๋ฆฌ๋๋ ์ ์ฒด ๊ฒฝ๋ก๋ฅผ ๊ธฐ๋กํ ๋ฐ์ดํฐ.
Traces๋ฅผ ํตํด ๊ฐ ์๋น์ค์์์ ์ฒ๋ฆฌ ์๊ฐ, ํธ์ถ ์์, ์ฑ๊ณต/์คํจ ์ฌ๋ถ๋ฅผ ์๊ฐ์ ์ผ๋ก ํ์ ํ ์ ์๋ค.
Documentation
OpenTelemetry, also known as OTel, is a vendor-neutral open source Observability framework for instrumenting, generating, collecting, and exporting telemetry data such as traces, metrics, and logs. As an industry-standard, OpenTelemetry is supported by mor
opentelemetry.io
OpenTelemetry๋ Traces, Metrics, Logs๋ฅผ ์์งํ๊ธฐ ์ํ ๋ฒค๋ ์ค๋ฆฝ์ ํ์ค์ด๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ OpenTelemetry SDK๋ฅผ ํตํฉํ๋ฉด, ์ฝ๋ ๋ณ๊ฒฝ ์์ด ๋๋ ์ต์ํ์ ๋ณ๊ฒฝ์ผ๋ก ํ ๋ ๋ฉํธ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ์์งํ ์ ์๋ค.
Trace์ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
| Trace | ํ๋์ ์์ฒญ์ ๋ํ ์ ์ฒด ์ฒ๋ฆฌ ํ๋ฆ |
| Span | Trace๋ฅผ ๊ตฌ์ฑํ๋ ๊ฐ๋ณ ์์ ๋จ์ |
| Trace ID | ์ ์ฒด ์์ฒญ์ ์๋ณํ๋ ๊ณ ์ ID |
| Span ID | ๊ฐ๋ณ Span์ ์๋ณํ๋ ID |
| Parent Span ID | ์์ Span๊ณผ์ ๊ด๊ณ๋ฅผ ๋ํ๋ด๋ ID |
Grafana Tempo | Grafana Tempo documentation
Manage Tempo Learn about Tempo architecture, best practices, Parquet backend, dedicated attribute columns, and more.
grafana.com
Tempo๋ Grafana Labs์์ ๊ฐ๋ฐํ ๋ถ์ฐ ํธ๋ ์ด์ฑ ๋ฐฑ์๋๋ค. Trace ID๋ง์ผ๋ก ์ธ๋ฑ์ฑํ์ฌ ์ ์ฅ ๋น์ฉ์ ๋ฎ์ถ๋ฉด์๋, Grafana์์ ํตํฉ์ ํตํด Metrics, Logs์ ์ฐ๊ณ ๋ถ์์ด ๊ฐ๋ฅํ๋ค.
OpenTelemetry Collector๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ์์ค์์ ํ ๋ ๋ฉํธ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ณ , ๋ค์ํ ๋ฐฑ์๋๋ก ์ ์กํ ์ ์๋ค.
Kubernetes ํ๊ฒฝ์์ OpenTelemetry๋ฅผ ์ ์ฉํ๋ ๋ฐฉ์์ ํฌ๊ฒ ๋ ๊ฐ์ง๋ค.
- ์ฒซ์งธ, ์ ํ๋ฆฌ์ผ์ด์ ์ SDK๋ฅผ ์ง์ ํตํฉํ๋ ๋ฐฉ์์ด๋ค. ์ธ์ด๋ณ SDK๋ฅผ ์ฌ์ฉํ์ฌ Span์ ์์ฑํ๊ณ ์ ์กํ๋ค.
- ๋์งธ, OpenTelemetry Operator๋ฅผ ์ฌ์ฉํ Auto-instrumentation์ด๋ค. Kubernetes CRD๋ฅผ ํตํด Pod์ ์๋์ผ๋ก Instrumentation์ ์ฃผ์ ํ ์ ์๋ค.
2.4 ์ธ ์ถ์ ์๊ด๊ด๊ณ์ ํ๊ณ
Metrics, Logs, Traces๋ ๊ฐ๊ฐ์ ๊ฐ์ ์ด ์์ง๋ง, ๋จ๋ ์ผ๋ก๋ ์์ ํ Observability๋ฅผ ์ ๊ณตํ์ง ๋ชปํ๋ค.
| Metrics | ์ง๊ณ, ๊ฒฝํฅ ํ์ , ์๋ฆผ | ์์ธ ํ์ ๋ถ๊ฐ |
| Logs | ์์ธ ๋งฅ๋ฝ, ์๋ฌ ๋ฉ์์ง | ๋ถ์ฐ ์์ฒญ ์ถ์ ์ด๋ ค์ |
| Traces | ์์ฒญ ํ๋ฆ ์๊ฐํ, ๋ณ๋ชฉ ์๋ณ | ์ ์ฅ ๋น์ฉ, ์ํ๋ง ํ์ |

์ธ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ณํ๋ ํต์ฌ์ Trace ID๋ค. ๋ก๊ทธ์ Trace ID๋ฅผ ํฌํจ์ํค๋ฉด, Grafana์์ ํน์ Trace๋ฅผ ์กฐํํ ๋ค ํด๋น Trace ID๋ก Loki ๋ก๊ทธ๋ฅผ ๊ฒ์ํ ์ ์๋ค. ์ด๋ฅผ ํตํด "์ด๋์ → ์"์ ํ๋ฆ์ ์์ฐ์ค๋ฝ๊ฒ ๋ฐ๋ผ๊ฐ ์ ์๋ค.
๐ธ 3. ์ฅ์ ํ๋ฆ๊ณผ Observability ๋งคํ
3.1 Fault → Error → Failure ๋จ๊ณ๋ณ ํ์ง ์ง์
์์ ์ ์ํ Fault → Error → Failure ํ๋ฆ์ Observability ๋ฐ์ดํฐ์ ๋งคํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
| Fault | ์๋ชป๋ DB ์ปค๋ฅ์ ํ ์ค์ | ์ค์ ํ์ผ, ์ฝ๋ ๋ฆฌ๋ทฐ | (์ฌ์ ์๋ฐฉ) |
| Error (์ ๋ณต) | ์ปค๋ฅ์ ํ ๊ณ ๊ฐ ์์ | ํ์ฑ ์ปค๋ฅ์ ์ ์ฆ๊ฐ | Prometheus Gauge |
| Error (๋ฐํ) | ์ปค๋ฅ์ ํ๋ ์คํจ | ์๋ฌ ๋ก๊ทธ ๋ฐ์ | Loki |
| Failure | API ์๋ต ์คํจ | ์๋ฌ์จ ์ฆ๊ฐ, Trace ์คํจ | Prometheus Counter, Tempo |
์ด ๋งคํ์์ ์ค์ํ ์ ์ Error ๋จ๊ณ๋ฅผ ์ธ๋ถํํ๋ ๊ฒ์ด๋ค. Error๊ฐ "์ ๋ณต" ์ํ์ผ ๋ ํ์งํ๋ฉด Failure๋ฅผ ์๋ฐฉํ ์ ์๋ค. ์ปค๋ฅ์ ํ ์์์์, ํ ์ฌ์ฉ๋ฅ ์ด 80%๋ฅผ ๋์ผ๋ฉด ์๋ฆผ์ ๋ฐ์กํ๋๋ก ์ค์ ํ๋ฉด ๊ณ ๊ฐ ์ ์ ๋์ํ ์ ์๋ค.
3.2 Kubernetes ํ๊ฒฝ์์์ ์ฅ์ ์๋๋ฆฌ์ค ์์
Kubernetes ํ๊ฒฝ์์ ์์ฃผ ๋ฐ์ํ๋ ์ฅ์ ์๋๋ฆฌ์ค๋ฅผ Fault → Error → Failure ํ๋ฆ์ผ๋ก ๋ถ์ํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
์๋๋ฆฌ์ค: ๋ง์ดํฌ๋ก์๋น์ค ๊ฐ ํธ์ถ์์ ๊ฐํ์ ํ์์์ ๋ฐ์

[Fault]
Service B์ ๋ฉ๋ชจ๋ฆฌ ์ค์ ์ด ์ค์ ์ฌ์ฉ๋ ๋๋น ๋ถ์กฑํ๊ฒ ์ค์ ๋จ
[Error - ์ ๋ณต]
ํธ๋ํฝ ์ฆ๊ฐ ์ Service B์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด limit์ ๊ทผ์
GC ๋น๋ ์ฆ๊ฐ, ์๋ต ์ง์ฐ ์์
[Error - ๋ฐํ]
Service B๊ฐ OOMKilled ๋๋ GC pause๋ก ์ธํด ์๋ต ์ง์ฐ
Service A์์ ํ์์์ ๋ฐ์
[Failure]
์ฌ์ฉ์ ์์ฒญ ์คํจ, 504 Gateway Timeout ๋ฐํ
์ด ์๋๋ฆฌ์ค์์ ๊ฐ ๋จ๊ณ๋ณ ํ์ง ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.

- Error (์ ๋ณต) ํ์ง - Prometheus
- Error (๋ฐํ) ํ์ง - Loki
- Failure ํ์ง - Tempo
3.3 TraceID ๊ธฐ๋ฐ ๋ก๊ทธ-ํธ๋ ์ด์ค ์ฐ๊ณ
์ ๋ฆฌํ์๋ฉด, ์ฅ์ ๋ฐ์ ์ ์ค์ ๋ถ์ ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ๋ค.

- Prometheus ์๋ฆผ ์์ : ์๋ฌ์จ ์ฆ๊ฐ ๋๋ ์๋ต ์๊ฐ ์ฆ๊ฐ ์๋ฆผ
- Grafana ๋์๋ณด๋ ํ์ธ: ์ด๋ค ์๋น์ค์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง Metrics๋ก ๋ฒ์ ์ขํ๊ธฐ
- Tempo์์ ์คํจํ Trace ์กฐํ: ํด๋น ์๊ฐ๋์ ์๋ฌ Trace๋ฅผ ๊ฒ์ํ์ฌ ์ด๋ Span์์ ์คํจํ๋์ง ํ์ธ
- Trace ID๋ก Loki ๋ก๊ทธ ๊ฒ์: ์คํจํ Span์ ์์ธ ์๋ฌ ๋ฉ์์ง์ ์คํ ํธ๋ ์ด์ค ํ์ธ
- ์์ธ ํ์ ๋ฐ ๋์: ๋ก๊ทธ์์ ํ์ธ๋ ๊ตฌ์ฒด์ ์๋ฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ ๋๋ ๋กค๋ฐฑ
๐ช ์ ๋ฆฌ
๋ถ์ฐ ์์คํ ์์ ์ฅ์ ๋ Fault → Error → Failure์ ์ธ๊ณผ ๊ด๊ณ๋ฅผ ๋ฐ๋ผ ์ ํ๋๋ค. Fault๊ฐ ์์คํ ๋ด๋ถ์ ์ ๋ณตํด ์๋ค๊ฐ ํน์ ์กฐ๊ฑด์์ Error๋ก ๋ฐํ๋๊ณ , ๋ณต๊ตฌ๋์ง ์์ผ๋ฉด Failure๋ก ์ด์ด์ ธ ์ฌ์ฉ์์๊ฒ ์ํฅ์ ๋ฏธ์น๋ค.
Observability์ ์ธ ์ถ์ ์ด ํ๋ฆ์ ๊ฐ ๋จ๊ณ๋ฅผ ํ์งํ๋ ์ญํ ์ ๋ถ๋ดํ๋ค. Metrics๋ "๋ฌด์์ด" ๋ฐ์ํ๋์ง ์์น๋ก ๋ณด์ฌ์ฃผ๊ณ , Logs๋ "์" ๋ฐ์ํ๋์ง ๋งฅ๋ฝ์ ์ ๊ณตํ๋ฉฐ, Traces๋ "์ด๋์" ๋ฐ์ํ๋์ง ์์ฒญ ํ๋ฆ์ ์๊ฐํํ๋ค.
Prometheus/Loki/Tempo์ OpenTelemetry๋ก ๊ตฌ์ฑ๋ ์คํ์์ ํต์ฌ์ Trace ID๋ฅผ ๋งค๊ฐ๋ก ์ธ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฒ์ด๋ค. ์๋ฆผ → ๋์๋ณด๋ → Trace → ๋ก๊ทธ๋ก ์ด์ด์ง๋ ๋ถ์ ํ๋ฆ์ด ๋๊ธฐ์ง ์์์ผ "์ ์ฅ์ ๊ฐ ๋ฐ์ํ๋๊ฐ"๋ผ๋ ์ง๋ฌธ์ ๋ตํ ์ ์๋ค.
Failure๊ฐ ๋ฐ์ํ ํ์ ๋์ํ๋ฉด ์ด๋ฏธ ๋ฆ๋ค. Error ๋จ๊ณ, ๋์๊ฐ Error๊ฐ ์ ๋ณตํด ์๋ ๋จ๊ณ์์ ํ์งํ ์ ์๋๋ก Observability ์ฒด๊ณ๋ฅผ ์ค๊ณํด์ผ ํ๋ค. ์ด๊ฒ์ด ๋ชจ๋ํฐ๋ง๊ณผ Observability์ ๋ณธ์ง์ ์ฐจ์ด๋ค.
๐ ์ถ์ฒ
- OpenTelemetry ๊ณต์ ๋ฌธ์: https://opentelemetry.io/docs/
- Grafana Tempo ๊ณต์ ๋ฌธ์: https://grafana.com/docs/tempo/latest/
- Grafana Loki ๊ณต์ ๋ฌธ์: https://grafana.com/docs/loki/latest/
- Prometheus ๊ณต์ ๋ฌธ์: https://prometheus.io/docs/