Infra/AWS

[AEWS] #4์ฃผ์ฐจ ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค๋งคํŠธ๋ฆญ๊ณผ PromQL (4)

์˜ค๋ฌ˜ 2025. 3. 2. 02:59

Observability (๊ด€์ธก ๊ฐ€๋Šฅ์„ฑ)

์˜ต์ €๋ฒ„๋นŒ๋ฆฌํ‹ฐ(๊ด€์ธก๊ฐ€๋Šฅ์„ฑ)์€ ์‹œ์Šคํ…œ ๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ ์™ธ๋ถ€์—์„œ ์ดํ•ดํ•˜๊ณ  ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์„ ์˜๋ฏธํ•˜๋ฉฐ, ์„œ๋น„์Šค๊ฐ€ ์–ด๋–ค ์ƒํƒœ์ธ์ง€, ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€, ์–ด๋””์„œ ๋ฐœ์ƒํ–ˆ๋Š”์ง€๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ๋ถ„์„ํ•œ๋‹ค.์ˆ˜๋ฐฑ~์ˆ˜์ฒœ ๊ฐœ์˜ ์„œ๋น„์Šค๊ฐ€ ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ ๋™์ž‘ํ•˜๋ฏ€๋กœ ๋” ๊นŠ์ด ์žˆ๋Š” ๋ถ„์„์ด ํ•„์š”ํ•˜์—ฌ ์˜ต์ €๋ฒ„๋นŒ๋ฆฌํ‹ฐ์˜ ์ค‘์š”์„ฑ์ด ๋”์šฑ ๋†’์•„์ง€๊ณ  ์žˆ๋‹ค.

 

๊ธฐ์กด์˜ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ฐœ๋…๊ณผ ๋น„๊ตํ•ด๋ณด์•˜์„ ๋•Œ, ๋ชจ๋‹ˆํ„ฐ๋ง์€ ์‹œ์Šคํ…œ์ด ์ •์ƒ์ธ์ง€ ํ™•์ธํ•˜๋Š” ๋„๊ตฌ๋กœ์จ ์ง€๊ธˆ CPU ์‚ฌ์šฉ๋Ÿ‰์ด ๋†’์€๊ฐ€์— ๋Œ€ํ•œ ์งˆ๋ฌธ์— ๋‹ตํ•œ๋‹ค๋ฉด, ์˜ต์ €๋ฒ„๋นŒ๋ฆฌํ‹ฐ๋Š” ์‹œ์Šคํ…œ์ด ์™œ ๊ทธ๋ ‡๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ๋ถ„์„ํ•˜๋Š” ๊ฐœ๋…์œผ๋กœ CPU ์‚ฌ์šฉ๋Ÿ‰์ด ๋†’์•„์ง„ ์›์ธ์€ ๋ฌด์—‡์ธ๊ฐ€๋ฅผ ํŒŒ์•…ํ•œ๋‹ค.

์ฆ‰ ์˜ต์ €๋ฒ„๋นŒ๋ฆฌํ‹ฐ๋Š” ์—ฌ๋Ÿฌ ์†Œ์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์‹œ์Šคํ…œ ๋™์ž‘์˜ ์ƒ๊ด€ ๊ด€๊ณ„๋ฅผ ํŒŒ์•…ํ•˜๊ณ  ์ง€์†์ ์œผ๋กœ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ๋‘”๋‹ค.

 

ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค๋ž€

 

ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค๋Š” ๊ณ ๋Œ€ ์‹ ํ™”์— ๋‚˜์˜ค๋Š” ์‹  ์ด๋ฆ„์ธ๋ฐ ๋ถˆ์„ ๊ฐ€์ ธ๋‹ค ์ค€ ์ž๋ผ๋Š” ์˜๋ฏธ๊ฐ€ ์ง€์‹์„ ๊ฐ€์ ธ๋‹ค ์ฃผ๋Š” ๋„๊ตฌ๋กœ์จ ๋ณด์ด์ง€ ์•Š๋Š” ์‹œ์Šคํ…œ ๋‚ด๋ถ€์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ๋‹ค ์ค€๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ํฌํ•จํ•œ ๊ฒƒ ๊ฐ™๋‹ค. ๋‹ค๋ฅธ ์˜คํ”ˆ์†Œ์Šค๋“ค๋„ ์‹ ํ™”์—์„œ ์ด๋ฆ„์„ ๋งŽ์ด ์ฐจ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

 

ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค๋Š” ์‹œ๊ณ„์—ด(time-series) ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜์˜ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๊ฒฝ๊ณ (alerting) ์‹œ์Šคํ…œ์œผ๋กœ ์„œ๋ฒ„, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ๋„คํŠธ์›Œํฌ ์žฅ๋น„ ๋“ฑ์—์„œ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ๋ณ€ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ์ €์žฅํ•œ ํ›„, ๋ถ„์„ํ•˜๊ณ  ์•Œ๋žŒ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ์ด๋‹ค.

์ฒ˜์Œ์—” SoundCloud์—์„œ ๋‚ด๋ถ€ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•ด ๊ฐœ๋ฐœ๋˜์—ˆ๋Š”๋ฐ ์ง€๊ธˆ์€ CNCF(Cloud Native Computing Foundation) ํ”„๋กœ์ ํŠธ๋กœ ์„ฑ์žฅํ•ด์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค(Kubernetes)๋ฅผ ๋น„๋กฏํ•œ ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ํ™˜๊ฒฝ์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค.

 

ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค ๋งคํŠธ๋ฆญ

๋งคํŠธ๋ฆญ์€ ํ‚ค-๋ฐธ๋ฅ˜ ๊ฐ’์œผ๋กœ ์ €์žฅ๋˜์–ด ์žˆ์œผ๋ฉฐ ํ‘œ๊ธฐ ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

<metric name>{<label name>=<label value>, ...}
ex) api_http_requests_total{method="POST", handler="/messages"}

 

 

๋งคํŠธ๋ฆญ ๋„ค์ž„, ๋ผ๋ฒจ, ํƒ€์ž„์Šคํƒฌํ”„๊ฐ€ ํ‚ค๋กœ ์ €์žฅ๋˜๊ณ  ๋ฐธ๋ฅ˜๋กœ ๊ทธ ์‹œ์ ์—์„œ ๋ฐ์ดํ„ฐ ๊ฐ’์ด ์ €์žฅ๋˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

 

๋งคํŠธ๋ฆญ ํƒ€์ž…

์นด์šดํ„ฐ

์ฆ๊ฐ€ํ•˜๋Š” ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ฉ”ํŠธ๋ฆญ ํƒ€์ž…

  • ์ฃผ๋กœ ์ด๋ฒคํŠธ ๋ฐœ์ƒ ํšŸ์ˆ˜๋ฅผ ์ธก์ •ํ•  ๋•Œ ์‚ฌ์šฉ
  • ์‚ฌ์šฉ ์˜ˆ์‹œ
    • HTTP ์š”์ฒญ ์ˆ˜ (http_requests_total)
    • ํ”„๋กœ์„ธ์Šค ํฌ๋ž˜์‹œ ํšŸ์ˆ˜ (process_crashes_total)
    • ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•œ ํšŸ์ˆ˜ (user_logins_total)

๊ฒŒ์ด์ง€

์ฆ๊ฐ€ / ๊ฐ์†Œํ•˜๋Š” ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ฉ”ํŠธ๋ฆญ ํƒ€์ž…

  • ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์ธก์ •ํ•˜๋Š” ๋ฉ”ํŠธ๋ฆญ.
  • ๊ฐ’์ด ์ฆ๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ฐ์†Œํ•  ์ˆ˜ ์žˆ์Œ.
  • ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉ๋จ.
  • ์‚ฌ์šฉ ์˜ˆ์‹œ
    • ํ˜„์žฌ ์‚ฌ์šฉ ์ค‘์ธ ๋ฉ”๋ชจ๋ฆฌ (memory_usage_bytes)
    • CPU ์‚ฌ์šฉ๋Ÿ‰ (cpu_usage_percentage)
    • ํ˜„์žฌ ํ™œ์„ฑํ™”๋œ ์‚ฌ์šฉ์ž ์ˆ˜ (active_users)

ํžˆ์Šคํ† ๊ทธ๋žจ

๋ฐ์ดํ„ฐ์˜ ๋ถ„ํฌ๋ฅผ ์ธก์ •ํ•˜๋Š” ๋ฉ”ํŠธ๋ฆญ ํƒ€์ž…

  • ๊ฐ’์˜ ๋ถ„ํฌ๋ฅผ ๋ฒ„ํ‚ท(bucket)์œผ๋กœ ๋‚˜๋ˆ„์–ด ์ €์žฅ
  • ํŠน์ • ๊ฐ’ ์ดํ•˜์ธ ์š”์ฒญ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ธก์ •ํ•  ์ˆ˜ ์žˆ์Œ
  • ํ‰๊ท ๊ฐ’(average), 95th, 99th ํผ์„ผํƒ€์ผ(percentile) ๊ฐ™์€ ํ†ต๊ณ„๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ ์‚ฌ์šฉ
  • ์‚ฌ์šฉ ์˜ˆ์‹œ
    • HTTP ์š”์ฒญ ์ง€์—ฐ ์‹œ๊ฐ„ (http_request_duration_seconds)
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ ์‹œ๊ฐ„ (db_query_duration_seconds)
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‘๋‹ต ์†๋„ (app_response_time_seconds)

์„œ๋จธ๋ฆฌ

Histogram๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ, ์ง์ ‘ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ฉ”ํŠธ๋ฆญ ํƒ€์ž…

  • Histogram๊ณผ ๋‹ฌ๋ฆฌ, ๋ฏธ๋ฆฌ ๊ณ„์‚ฐ๋œ ํผ์„ผํƒ€์ผ(percentile) ๊ฐ’์„ ์ €์žฅ
  • ๊ฐœ๋ณ„ ์š”์ฒญ๋“ค์˜ ํ‰๊ท (mean), ์ตœ์†Œ(min), ์ตœ๋Œ€(max), ํผ์„ผํƒ€์ผ(percentile) ๋“ฑ์„ ๊ณ„์‚ฐ
  • ํผ์„ผํƒ€์ผ ๊ฐ’์ด ์ด๋ฏธ ๊ณ„์‚ฐ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋ฐ์ดํ„ฐ๋Ÿ‰์ด ๋งŽ์•„์ง€๋ฉด ๋ถ€๋‹ด์ด ํด ์ˆ˜ ์žˆ์Œ.
  • ์‚ฌ์šฉ ์˜ˆ์‹œ
    • API ์‘๋‹ต ์†๋„ (api_response_time_seconds)
    • ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋Œ€๊ธฐ ์‹œ๊ฐ„ (user_input_delay_seconds)

 

Job, instance

์žก์€ ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค๊ฐ€ ๋ฉ”ํŠธ๋ฆญ์„ ์ˆ˜์ง‘ํ•˜๋Š” ๋Œ€์ƒ ๊ทธ๋ฃน์œผ๋กœ, ํ•˜๋‚˜ ์ด์ƒ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฉ”ํŠธ๋ฆญ ์ˆ˜์ง‘ ๋‹จ์œ„์ด๋‹ค.

scrape_configs:
  - job_name: "node_exporter"  # Job ์ด๋ฆ„ (์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค ํฌํ•จ ๊ฐ€๋Šฅ)
    static_configs:
      - targets: ["192.168.1.10:9100", "192.168.1.11:9100"]

 

์ธ์Šคํ„ด์Šค๋Š” ์‹ค์ œ ๋ฉ”ํŠธ๋ฆญ์„ ์ œ๊ณตํ•˜๋Š” ๊ฐœ๋ณ„์ ์ธ ์—”๋“œํฌ์ธํŠธ๋กœ ์žก ์•ˆ์—์„œ ๊ฐœ๋ณ„์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ์„œ๋น„์Šค์˜ ์‹ค์ œ ์„œ๋ฒ„์ด๋‹ค.

scrape_configs:
  - job_name: "web_server"
    static_configs:
      - targets: ["192.168.1.20:8080", "192.168.1.21:8080"]

 

์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ(Time-Series Data)

์‹œ๊ฐ„์— ๋”ฐ๋ผ ๋ณ€ํ™”ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ถ„์„ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํŠน์ • ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์„ ๋‘๊ณ  ์—ฐ์†์ ์œผ๋กœ ๊ด€์ธก๋œ ๊ฐ’์„ ์˜๋ฏธํ•œ๋‹ค.

  • CPU ์‚ฌ์šฉ๋Ÿ‰ (10์‹œ 30๋ถ„ - 50%, 10์‹œ 31๋ถ„ - 52%)
  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ (10์‹œ 30๋ถ„ - 4GB, 10์‹œ 31๋ถ„ - 4.2GB)
  • ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ (10์‹œ 30๋ถ„ - 1Gbps, 10์‹œ 31๋ถ„ - 1.2Gbps)

 

์žฅ์ 

  • ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ๋ถ„์„์ด ๊ฐ€๋Šฅ -> ์ง€๋‚œ 24์‹œ๊ฐ„ ๋™์•ˆ CPU ์‚ฌ์šฉ๋Ÿ‰์ด ์–ด๋–ป๊ฒŒ ๋ณ€ํ–ˆ๋Š”๊ฐ€?
  • ์ถ”์„ธ ์˜ˆ์ธก ๊ฐ€๋Šฅ -> ํŠธ๋ž˜ํ”ฝ ์ฆ๊ฐ€ ํŒจํ„ด์„ ๋ณด๋ฉด 3์ผ ํ›„์— ์„œ๋ฒ„๊ฐ€ ํ„ฐ์งˆ ๊ฐ€๋Šฅ์„ฑ
  • ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง & ์•Œ๋žŒ -> ์‘๋‹ต ์‹œ๊ฐ„์ด 1์ดˆ๋ฅผ ๋„˜์œผ๋ฉด ์•Œ๋žŒ ์ „์†ก

๋‹จ์ 

  • 1์ดˆ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋ฉด ์—„์ฒญ๋‚œ ์–‘์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์Œ“์ด๊ฒŒ ๋œ๋‹ค.
  • ์ผ๋ฐ˜์ ์ธ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(SQL)๋กœ๋Š” ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— TSDB๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 

์ต์Šคํฌํ„ฐ

ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค ์ต์Šคํฌํ„ฐ(Exporter)๋Š” ๋ฉ”ํŠธ๋ฆญ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ์‹œ์Šคํ…œ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค๊ฐ€ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š”๋ฐ, ๋ฐ์ดํ„ฐ๋ฅผ ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

 

 

์ฆ‰ ์ต์Šคํฌํ„ฐ๋Š” ์™ธ๋ถ€ ์‹œ์Šคํ…œ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ , HTTP ์—”๋“œํฌ์ธํŠธ(/metrics) ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋…ธ์ถœํ•˜์—ฌ, ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค๊ฐ€ ์ฃผ๊ธฐ์ ์œผ๋กœ(Pull ๋ฐฉ์‹) ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ๊ฐ€๋„๋ก ํ•œ๋‹ค.

๋‚˜๋Š” ์ฃผ๋กœ ๋…ธ๋“œ ์ต์Šคํฌํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ๋ˆ…์Šค ์‹œ์Šคํ…œ์˜ CPU, ๋ฉ”๋ชจ๋ฆฌ, ๋””์Šคํฌ, ๋„คํŠธ์›Œํฌ ์ƒํƒœ ์ˆ˜์ง‘ํ•˜๋Š” ์šฉ๋„๋กœ ํ™œ์šฉํ•˜์˜€์—ˆ๋‹ค.

 

CPU ์‚ฌ์šฉ๋Ÿ‰์„ ์ธก์ •ํ•˜๋Š” ์ต์Šคํฌํ„ฐ ์˜ˆ์‹œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

pip install prometheus_client

 

from prometheus_client import start_http_server, Gauge
import psutil
import time

# ๊ฒŒ์ด์ง€ ํƒ€์ž…์˜ ๋งคํŠธ๋ฆญ ํƒ€์ž…
cpu_usage = Gauge("custom_cpu_usage", "Current CPU usage percentage")

def collect_metrics():
    while True:
        cpu_usage.set(psutil.cpu_percent())  # ํ˜„์žฌ CPU ์‚ฌ์šฉ๋Ÿ‰์„ ๋ฉ”ํŠธ๋ฆญ์œผ๋กœ ์„ค์ •
        time.sleep(5)  # 5์ดˆ๋งˆ๋‹ค ์—…๋ฐ์ดํŠธ

if __name__ == "__main__":
    start_http_server(8000)  # ์ต์Šคํฌํ„ฐ HTTP ์„œ๋ฒ„
    collect_metrics()  # ๋ฉ”ํŠธ๋ฆญ ์ˆ˜์ง‘

 

์ด๋ ‡๊ฒŒ ์ปค์Šคํ…€์œผ๋กœ ์ƒ์„ฑํ•œ ์ต์Šคํฌํ„ฐ๋ฅผ ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค๊ฐ€ ์ˆ˜์ง‘ํ•˜๋„๋ก ์„ค์ •ํ•˜๋ ค๋ฉด, prometheus.yaml ํŒŒ์ผ์— ์ƒ์„ฑํ•œ ์ปค์Šคํ…€ ์ต์Šคํฌํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

scrape_configs:
  - job_name: "custom_exporter"
    static_configs:
      - targets: ["localhost:8000"]

 

PromQL

PromQL(Prometheus Query Language)์€ ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค์—์„œ ๋ฉ”ํŠธ๋ฆญ์„ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๋ถ„์„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์ฟผ๋ฆฌ ์–ธ์–ด๋กœ
๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋ง, ์ง‘๊ณ„(Aggregation), ๋ณ€ํ™˜ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Grafana ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์‹œ๊ฐํ™”ํ•  ๋•Œ๋„ ์‚ฌ์šฉ๋œ๋‹ค.

 

SQL๊ณผ ๋น„๊ตํ•ด์„œ ๋ณด๋ฉด ์ข€ ๋” ๋น ๋ฅด๊ฒŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ด์„œ ์ •๋ฆฌํ•˜์˜€๋‹ค.

๊ธฐ๋Šฅ SQL PromQL
๋ฐ์ดํ„ฐ ์กฐํšŒ SELECT column FROM table; <metric_name>
์กฐ๊ฑด ํ•„ํ„ฐ๋ง SELECT column FROM table WHERE column = 'value' <metric_name>{label="value"}
์—ฌ๋Ÿฌ ์กฐ๊ฑด ํ•„ํ„ฐ SELECT column FROM table WHERE col1 = 'val1' AND col2 = 'val2' <metric_name>{label1="val1", label2="val2"}
๋ฐ์ดํ„ฐ ๊ทธ๋ฃนํ™” SELECT column, SUM(value) FROM table GROUP BY column; sum(<metric_name>) by (label)
์ง‘๊ณ„ SELECT SUM(column) FROM table; sum(<metric_name>)
์ง‘๊ณ„ + ๊ทธ๋ฃนํ™” SELECT col, SUM(value) FROM table GROUP BY col; sum(<metric_name>) by (label)
์ •๋ ฌ SELECT column FROM table ORDER BY column DESC LIMIT N; topk(N, <metric_name>)
์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ํ•„ํ„ฐ๋ง SELECT column FROM table WHERE time > NOW() - INTERVAL '5 minutes'; <metric_name>[5m]
๋ฐ์ดํ„ฐ ์ฆ๊ฐ€๋Ÿ‰ SELECT (column2 - column1) FROM table WHERE time BETWEEN NOW() - INTERVAL '5 minutes' AND NOW(); increase(<metric_name>[5m])
์ดˆ๋‹น ๋ณ€ํ™”์œจ SELECT (column2 - column1) / time_diff FROM table WHERE time BETWEEN NOW() - INTERVAL '5 minutes' AND NOW(); rate(<metric_name>[5m])
ํผ์„ผํƒ€์ผ ๊ณ„์‚ฐ SELECT PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY column) FROM table; histogram_quantile(0.95, <metric_name>)

 

promql์„ ๋ณด๋ฉด์„œ ํŠนํžˆ ํ—ท๊ฐˆ๋ ธ๋˜.. rate, irate, increase์— ๋Œ€ํ•ด์„œ ์ข€ ๋” ์ž์„ธํžˆ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค.

3๊ฐ€์ง€ ํ•จ์ˆ˜ ๋ชจ๋‘ ์นด์šดํ„ฐ ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

rate (์ดˆ๋‹น ํ‰๊ท  ์ฆ๊ฐ€์œจ)

 

rate(nginx_http_requests_total[10m]) ํ•จ์ˆ˜๋Š” ์ตœ๊ทผ 10๋ถ„ ๋™์•ˆ์˜ nginx HTTP ์š”์ฒญ ์ด์ˆ˜ ์นด์šดํ„ฐ(nginx_http_requests_total)๊ฐ€ ์ดˆ๋‹น ์–ผ๋งˆ๋‚˜ ์ฆ๊ฐ€ํ–ˆ๋Š”์ง€ ํ‰๊ท ๊ฐ’์„ ๊ณ„์‚ฐํ•œ๋‹ค.

 

[10m]๋Š” ์ตœ๊ทผ 10๋ถ„ ๋™์•ˆ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฒ”์œ„ ๋ฒกํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์ด ๋ฒกํ„ฐ์—๋Š” ์ง€์ •๋œ ์‹œ๊ณ„์—ด์˜ ์—ฌ๋Ÿฌ ์‹œ์ ์˜ ๊ฐ’๋“ค์ด ํฌํ•จ๋œ๋‹ค.

๋ฒ”์œ„ ๋‚ด์˜ ์ฒซ ๋ฒˆ์งธ์™€ ๋งˆ์ง€๋ง‰ ์ƒ˜ํ”Œ ๊ฐ’์„ ํ™•์ธํ•˜์—ฌ (๋งˆ์ง€๋ง‰ ๊ฐ’ - ์ฒซ ๋ฒˆ์งธ ๊ฐ’)์„ ๊ตฌํ•˜๊ณ , ์ด ๊ฐ’์ด ์ „์ฒด ์‹œ๊ฐ„(10๋ถ„, ์ฆ‰ 600์ดˆ) ๋™์•ˆ ์–ผ๋งˆ๋‚˜ ์ฆ๊ฐ€ํ–ˆ๋Š”์ง€๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.

 

irate (์ดˆ๋‹น ์ˆœ๊ฐ„ ์ฆ๊ฐ€์œจ)

 

๊ฐ€์žฅ ์ตœ๊ทผ ๋‘ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ดˆ๋‹น ์ฆ๊ฐ€์œจ์„ ๊ณ„์‚ฐํ•œ๋‹ค.

 

๋งŒ์•ฝ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐ’์ด ์ €์žฅ๋˜์–ด ์žˆ์—ˆ๋‹ค๋ฉด

  • 10:04:00 1500
  • 10:05:00 1700

์ดˆ๋‹น ์š”์ฒญ ์ฆ๊ฐ€์œจ์€ (1700 - 1500) / 60์ดˆ = 3.33 req/sec ์ด ๋œ๋‹ค.

irate๋กœ ๊ฐ‘์ž‘์Šค๋Ÿฌ์šด ๊ธ‰์ฆ์ด๋‚˜ ๊ฐ์†Œ ๊ฐ’์„ ๋ณผ ๋•Œ ์œ ์šฉํ•˜๋‹ค.

 

increase (์ง€์ •๋œ ๊ธฐ๊ฐ„ ๋™์•ˆ์˜ ์ด ์ฆ๊ฐ€๋Ÿ‰)

 

์ง€์ •๋œ ์‹œ๊ฐ„ ๋ฒ”์œ„ ๋™์•ˆ ์ „์ฒด ์ฆ๊ฐ€๋Ÿ‰(์ดํ•ฉ)์ด๋ฉฐ ํ•ด๋‹น ์‹œ๊ฐ„๋™์•ˆ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์š”์ฒญ์ด ๋ฐœ์ƒํ–ˆ๋Š”๋”” ๋ถ„์„์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์žฅ๊ธฐ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•  ๋•Œ ์ ํ•ฉํ•˜๋‹ค.