DataDog

ํ™ฉ์—ฐ์ค€ยท2024๋…„ 10์›” 8์ผ

Lambda Service ๋ฐฑ์—”๋“œ ์ธํ„ด

๋ชฉ๋ก ๋ณด๊ธฐ
2/9
post-thumbnail

eks pod๋“ค์˜ log๋ฅผ ๋‚จ๊ธฐ๊ธฐ ์œ„ํ•˜์—ฌ datadog์„ ์‚ฌ์šฉ

elastic search์™€ ๋น„์Šทํ•œ ๊ฐœ๋…

  • ๋ฐ๋ชฌ์…‹์˜ ํŠน์ง•

๋ชจ๋“  ๋…ธ๋“œ์— ํŒŒ๋“œ ์‹คํ–‰:
๋ฐ๋ชฌ์…‹์€ ์ง€์ •๋œ ๋ชจ๋“  ๋…ธ๋“œ(ํ˜น์€ ํŠน์ • ๋ ˆ์ด๋ธ”์ด ์žˆ๋Š” ๋…ธ๋“œ)์— ๋™์ผํ•œ ํŒŒ๋“œ๋ฅผ ํ•˜๋‚˜์”ฉ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Datadog ์—์ด์ „ํŠธ๋ฅผ ๋ฐ๋ชฌ์…‹์œผ๋กœ ๋ฐฐํฌํ•˜๋ฉด, ํด๋Ÿฌ์Šคํ„ฐ์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋งˆ๋‹ค Datadog ์—์ด์ „ํŠธ ํŒŒ๋“œ๊ฐ€ ํ•˜๋‚˜์”ฉ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ ์ถ”๊ฐ€ ์‹œ ์ž๋™ ๋ฐฐํฌ:
์ƒˆ๋กœ์šด ๋…ธ๋“œ๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์— ์ถ”๊ฐ€๋˜๋ฉด, ๋ฐ๋ชฌ์…‹์€ ์ž๋™์œผ๋กœ ๊ทธ ๋…ธ๋“œ์— ํŒŒ๋“œ๋ฅผ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ๋…ธ๋“œ๊ฐ€ ์‚ญ์ œ๋˜๋ฉด ํ•ด๋‹น ๋…ธ๋“œ์˜ ํŒŒ๋“œ๋„ ์ž๋™์œผ๋กœ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.

์ฃผ๋กœ ์‹œ์Šคํ…œ ๋ ˆ๋ฒจ์˜ ์ž‘์—…์— ์‚ฌ์šฉ:
๋กœ๊ทธ ์ˆ˜์ง‘: Fluentd, Logstash์™€ ๊ฐ™์€ ๋กœ๊ทธ ์ˆ˜์ง‘๊ธฐ.
๋ชจ๋‹ˆํ„ฐ๋ง ์—์ด์ „ํŠธ: Datadog, Prometheus ๋…ธ๋“œ ์ต์Šคํฌํ„ฐ.
๋„คํŠธ์›Œํ‚น: CNI ํ”Œ๋Ÿฌ๊ทธ์ธ, IP ๊ด€๋ฆฌ, ๋„คํŠธ์›Œํฌ ์ •์ฑ… ๋“ฑ.

๋ฐ๋ชฌ์…‹์˜ ์žฅ์ 

  • ์ผ๊ด€๋œ ๋ฐฐํฌ: ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ์ผ๊ด€๋œ ํŒŒ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฏ€๋กœ, ๋กœ๊ทธ ์ˆ˜์ง‘๊ธฐ๋‚˜ ๋ชจ๋‹ˆํ„ฐ๋ง ์—์ด์ „ํŠธ๋ฅผ ๋ฐฐํฌํ•  ๋•Œ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ž๋™ ๊ด€๋ฆฌ: ๋…ธ๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์‚ญ์ œ๋  ๋•Œ ์ž๋™์œผ๋กœ ํŒŒ๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ, ๋ณ„๋„๋กœ ํŒŒ๋“œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋ฐฐํฌํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ: ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ์‹œ์Šคํ…œ ์ˆ˜์ค€์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ๋•Œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

๋ฐ๋ชฌ์…‹ ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ

  • ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰: ๋ชจ๋“  ๋…ธ๋“œ๋งˆ๋‹ค ํŒŒ๋“œ๊ฐ€ ๋ฐฐํฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ๋“œ์˜ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์ด ๋งŽ์„ ๊ฒฝ์šฐ ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด์˜ ๋ฆฌ์†Œ์Šค ์†Œ๋น„๋Ÿ‰์ด ๋†’์•„์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋…ธ๋“œ ์ˆ˜์— ๋น„๋ก€ํ•œ ํŒŒ๋“œ ์ˆ˜: ํด๋Ÿฌ์Šคํ„ฐ์— ์žˆ๋Š” ๋…ธ๋“œ ์ˆ˜๋งŒํผ ํŒŒ๋“œ๊ฐ€ ๋ฐฐํฌ๋˜๋ฏ€๋กœ, ๋…ธ๋“œ ์ˆ˜๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ํŒŒ๋“œ ์ˆ˜๋„ ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค.

์™œ 'DaemonSet'์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š”๊ฐ€?

  • 'Daemon'์˜ ์˜๋ฏธ:
    Unix/Linux์—์„œ ๋ฐ๋ชฌ์€ ์‹œ์Šคํ…œ ๋ ˆ๋ฒจ์—์„œ ์ง€์†์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ, ํŠน์ • ์ž‘์—…(์˜ˆ: ๋กœ๊ทธ ์ˆ˜์ง‘, ๋„คํŠธ์›Œํฌ ์„œ๋น„์Šค ์ œ๊ณต ๋“ฑ)์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์›น ์„œ๋ฒ„์ธ httpd๋‚˜ ๋กœ๊ทธ ์ˆ˜์ง‘๊ธฐ์ธ syslogd ๊ฐ™์€ ์„œ๋น„์Šค๊ฐ€ ๋ฐ๋ชฌ์ž…๋‹ˆ๋‹ค.

  • Kubernetes์˜ 'Set':
    Set์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋™์ผํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฌถ์–ด ๊ด€๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” Kubernetes ์šฉ์–ด์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ReplicaSet์€ ๋™์ผํ•œ ํŒŒ๋“œ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์œ ์ง€ํ•˜๋Š” ๋ฐ˜๋ฉด, DaemonSet์€ ๋ชจ๋“  ๋…ธ๋“œ์— ๋™์ผํ•œ ํŒŒ๋“œ๋ฅผ ํ•˜๋‚˜์”ฉ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ, 'DaemonSet'์ด๋ผ๋Š” ์ด๋ฆ„์€ "๊ฐ ๋…ธ๋“œ๋งˆ๋‹ค ๋ฐฐํฌ๋˜๋Š” ๋ฐ๋ชฌ๊ณผ ๊ฐ™์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํŒŒ๋“œ๋ฅผ ์„ธํŠธ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค"๋Š” ์˜๋ฏธ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

datadog ELB health check

aws load balancer์—์„œ health check url ์„ค์ •์„ ์•ˆํ•ด์ฃผ๋‹ˆ datadog์—์„œ ๊ณ„์†ํ•ด์„œ 401 error ๊ฐ€ ๋‚ฌ๋‹ค.
Django health check url์„ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์ฃผ๊ณ  load balancer health check url์— ์„ค์ •ํ•ด์ฃผ์–ด ํ•ด๊ฒฐํ•˜์˜€๋‹ค.(์ด ์„œ๋ฒ„์— ํ•ด๋‹นํ•˜๋Š” pod load balancer ์ฐพ๊ธฐ ์œ„ํ•˜์—ฌ rancher์—์„œ pod IP ์ฃผ์†Œ ํ™•์ธํ•จ)
๋˜ํ•œ, health check ์ฃผ๊ธฐ๋ฅผ 300์œผ๋กœ ๋Š˜๋ฆผ์œผ๋กœ datadog์œผ๋กœ api request ๋ชจ๋‹ˆํ„ฐ๋ง ํšจ์œจ์„ฑ์ด ๋†’์•„์กŒ๋‹ค.

โ—์„œ๋น„์Šค ๋Ÿฐ์นญ์œผ๋กœ ์œ ์ €๊ฐ€ ๋Š˜์–ด๋‚˜๋ฉด health check ์ฃผ๊ธฐ ์งง๊ฒŒ ๋ฐ”๊ฟ”์•ผํ•จ.
๐Ÿ™‚llm-ops fast api ์„œ๋ฒ„๋„ ์ ์šฉ์‹œ์ผœ์คฌ๋‹ค.

@app.get("/health")
async def health_check():
    # ํ•„์š”ํ•œ ์ƒํƒœ ์ฒดํฌ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    # EX)๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ƒํƒœ๋‚˜ ์™ธ๋ถ€ ์„œ๋น„์Šค ์ƒํƒœ ํ™•์ธ ๋“ฑ.
    return JSONResponse(content={"status": "ok"}, status_code=200)

TO DO

datadog์„ ํ™œ์šฉํ•ด, 500์—๋Ÿฌ๊ฐ€ ๊ฐ์ง€๋˜์—ˆ์„ ๋•Œ slack์— ์•Œ๋ฆผ์ด ๊ฐ€๋„๋ก ํ•ด์•ผํ•œ๋‹ค.
ํ•ด๋‹น ์„œ๋น„์Šค๋Š” workflow๋ผ๋Š” ์œ ๋ฃŒ ์„œ๋น„์Šค๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
๋”ฐ๋ผ์„œ, ์ถ”ํ›„์— ์‹ค์ œ ์‚ฌ์šฉ์ž๊ฐ€ ์ƒ๊ธฐ๋ฉด pro version์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ์š”ํ•œ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€