[Daily morning study] Observability์˜ 3์š”์†Œ (Metrics, Tracing, Logging)

#daily morning study

Image


Observability์˜ 3์š”์†Œ: Metrics, Tracing, Logging

Observability๋Š” ์‹œ์Šคํ…œ์˜ ์ƒํƒœ์™€ ๋™์ž‘์„ ํŒŒ์•…ํ•˜๊ณ , ๋ฌธ์ œ๋ฅผ ์ง„๋‹จํ•˜๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜์ ์ธ ์š”์†Œ๋‹ค. ์ด ๋ฌธ์„œ์—์„œ๋Š” Observability์˜ 3๊ฐ€์ง€ ํ•ต์‹ฌ ์š”์†Œ์ธ Metrics, Tracing, Logging์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.


1. Metrics

Metrics๋Š” ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ์„ ์ˆ˜์น˜์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋‹ค. ์ฃผ๋กœ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ๋ณ€ํ™”ํ•˜๋Š” ๊ฐ’๋“ค์„ ์ธก์ •ํ•œ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„ฑ๊ฒฉ์„ ๊ฐ€์ง„๋‹ค:

  • ์ฃผ๊ธฐ์  ์ˆ˜์ง‘: ํŠน์ • ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ๋ถ„์„ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
  • ์ง‘๊ณ„ ๋ฐ ํ‰๊ท ํ™”: ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ง‘๊ณ„ํ•˜๊ฑฐ๋‚˜ ํ‰๊ท ์„ ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ: Grafana, Prometheus ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์‹œ๊ฐํ™”ํ•˜๊ณ  ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ์‹œ

์„œ๋ฒ„์˜ CPU ์‚ฌ์šฉ๋ฅ ์„ ์ธก์ •ํ•˜๋Š” JSON ํ˜•์‹์˜ ๋ฉ”ํŠธ๋ฆญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

{
  "timestamp": "2023-10-01T12:00:00Z",
  "cpu_usage": 75.2,
  "memory_usage": 65.4
}

2. Tracing

Tracing์€ ๊ฐ๊ฐ์˜ ์š”์ฒญ์ด ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ์–ด๋–ป๊ฒŒ ํ๋ฅด๋Š”์ง€๋ฅผ ์ถ”์ ํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค. ์ฃผ๋กœ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์„ฑ์„ ๊ฐ€์ง„๋‹ค:

  • ์š”์ฒญ์˜ ๊ฒฝ๋กœ: ์š”์ฒญ์ด ์‹œ์Šคํ…œ์˜ ์–ด๋А ๋ถ€๋ถ„์„ ํ†ต๊ณผํ–ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • ์„ฑ๋Šฅ ๋ถ„์„: ๊ฐ ์„œ๋น„์Šค ํ˜ธ์ถœ์— ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜์—ฌ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์‹๋ณ„ํ•œ๋‹ค.
  • ์ƒ๊ด€ ๊ด€๊ณ„: ๋‹ค์–‘ํ•œ ์„œ๋น„์Šค ๊ฐ„์˜ ์ƒ๊ด€ ๊ด€๊ณ„๋ฅผ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ์‹œ

OpenTelemetry ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ Tracing์„ ๊ตฌํ˜„ํ•˜๋Š” ์ฝ”๋“œ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

from opentelemetry import trace

tracer = trace.get_tracer(__name__)

with tracer.start_as_current_span("process_order"):
    # ์ฃผ๋ฌธ ์ฒ˜๋ฆฌ ๋กœ์ง
    with tracer.start_as_current_span("validate_order"):
        # ์ฃผ๋ฌธ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋กœ์ง
    with tracer.start_as_current_span("charge_credit_card"):
        # ์นด๋“œ ์š”๊ธˆ ์ฒญ๊ตฌ ๋กœ์ง

3. Logging

Logging์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ, ์˜ค๋ฅ˜ ๋ฐ ์ƒํƒœ ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•˜๋Š” ํ–‰์œ„์ด๋‹ค. ์ฃผ๋กœ ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐ ์ƒํƒœ ์ง„๋‹จ์— ์‚ฌ์šฉ๋œ๋‹ค.

  • ์˜๊ตฌ์  ์ €์žฅ: ๋กœ๊ทธ๋Š” ํŒŒ์ผ์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์˜๊ตฌ์ ์œผ๋กœ ์ €์žฅ๋˜์–ด ๋‚˜์ค‘์— ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฌธ๋งฅ ์ •๋ณด: ๋กœ๊ทธ์—๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ์‹œ๊ฐ„, ์š”์ฒญ ๋ฐ์ดํ„ฐ, ์‚ฌ์šฉ์ž ์ •๋ณด ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฌธ๋งฅ ์ •๋ณด๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹ค์–‘ํ•œ ๋กœ๊ทธ ์ˆ˜์ค€: DEBUG, INFO, WARN, ERROR ๋“ฑ ๋‹ค์–‘ํ•œ ๋กœ๊ทธ ์ˆ˜์ค€์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ์‹œ

Python์—์„œ ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

logger.info("์ฃผ๋ฌธ์ด ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค.")

try:
    # ์ฃผ๋ฌธ ์ฒ˜๋ฆฌ ๋กœ์ง
    raise Exception("์ฃผ๋ฌธ ์ฒ˜๋ฆฌ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ")
except Exception as e:
    logger.error(f"์˜ค๋ฅ˜ ๋ฐœ์ƒ: {e}")

๊ฒฐ๋ก 

Metrics, Tracing, Logging์€ ์„œ๋กœ ๋ณด์™„์ ์ธ ๊ด€๊ณ„์— ์žˆ์œผ๋ฉฐ, ๊ฐ๊ฐ์˜ ์š”์†Œ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ํ™œ์šฉํ•˜๋ฉด ์‹œ์Šคํ…œ์˜ Observability๋ฅผ ๋†’์ด๊ณ , ์žฅ์• ๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ์ง„๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด 3์š”์†Œ ๋ชจ๋‘๊ฐ€ ํ•จ๊ป˜ ์ž‘๋™ํ•  ๋•Œ, ๊ฐœ๋ฐœ์ž๋Š” ๋” ๋‚˜์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜๊ณผ ์‹œ์Šคํ…œ ์‹ ๋ขฐ์„ฑ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

์ž์‹ ์˜ ์‹œ์Šคํ…œ์—์„œ ์ด ์„ธ ๊ฐ€์ง€ ์š”์†Œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ• ์ง€๋ฅผ ๊ณ ๋ฏผํ•ด๋ณด์ž.