2025๋…„ 11์›” 10์ผยท5๋ถ„ ์ฝ๊ธฐ

์—”๋“œํˆฌ์—”๋“œ API ๊ฐ€์‹œ์„ฑ์„ ์œ„ํ•œ Go OpenTelemetry ํŠธ๋ ˆ์ด์‹ฑ

Go OpenTelemetry ํŠธ๋ ˆ์ด์‹ฑ์„ ์‹ค์ œ ๋‹จ๊ณ„๋ณ„๋กœ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. HTTP ์š”์ฒญ, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…, ์„œ๋“œํŒŒํ‹ฐ ํ˜ธ์ถœ ์ „๋ฐ˜์—์„œ ํŠธ๋ ˆ์ด์Šค, ๋ฉ”ํŠธ๋ฆญ, ๋กœ๊ทธ๋ฅผ ์ƒ๊ด€๊ด€๊ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค.

์—”๋“œํˆฌ์—”๋“œ API ๊ฐ€์‹œ์„ฑ์„ ์œ„ํ•œ Go OpenTelemetry ํŠธ๋ ˆ์ด์‹ฑ

Go API์—์„œ์˜ ์—”๋“œํˆฌ์—”๋“œ ํŠธ๋ ˆ์ด์‹ฑ ์˜๋ฏธ

ํŠธ๋ ˆ์ด์Šค๋Š” ์š”์ฒญ์ด ์‹œ์Šคํ…œ์„ ํ†ต๊ณผํ•˜๋Š” ์ „์ฒด ํƒ€์ž„๋ผ์ธ์ž…๋‹ˆ๋‹ค. API ํ˜ธ์ถœ์ด ๋„์ฐฉํ•  ๋•Œ ์‹œ์ž‘ํ•ด ์‘๋‹ต์„ ๋ณด๋‚ผ ๋•Œ ๋๋‚ฉ๋‹ˆ๋‹ค.

ํŠธ๋ ˆ์ด์Šค ์•ˆ์—๋Š” ์ŠคํŒฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ŠคํŒฌ์€ "์š”์ฒญ ํŒŒ์‹ฑ", "SQL ์‹คํ–‰", "๊ฒฐ์ œ ์ œ๊ณต์ž ํ˜ธ์ถœ"์ฒ˜๋Ÿผ ์‹œ๊ฐ„ ์ธก์ •์ด ๋˜๋Š” ํ•œ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. ์ŠคํŒฌ์€ HTTP ์ƒํƒœ ์ฝ”๋“œ, ์•ˆ์ „ํ•œ ์‚ฌ์šฉ์ž ์‹๋ณ„์ž, ์ฟผ๋ฆฌ๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ํ–‰ ์ˆ˜ ๊ฐ™์€ ์œ ์šฉํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

"์—”๋“œํˆฌ์—”๋“œ"๋Š” ํŠธ๋ ˆ์ด์Šค๊ฐ€ ์ฒซ ๋ฒˆ์งธ ํ•ธ๋“ค๋Ÿฌ์—์„œ ๋ฉˆ์ถ”์ง€ ์•Š๋Š”๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ๋ฏธ๋“ค์›จ์–ด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ, ์บ์‹œ ํ˜ธ์ถœ, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…, ์„œ๋“œํŒŒํ‹ฐ API(๊ฒฐ์ œ, ์ด๋ฉ”์ผ, ์ง€๋„), ๋‹ค๋ฅธ ๋‚ด๋ถ€ ์„œ๋น„์Šค ๋“ฑ ๋ฌธ์ œ๊ฐ€ ์ˆจ์–ด์žˆ๊ธฐ ์‰ฌ์šด ๊ณณ๋“ค์„ ๋”ฐ๋ผ๊ฐ‘๋‹ˆ๋‹ค.

ํŠธ๋ ˆ์ด์‹ฑ์€ ๋ฌธ์ œ๊ฐ€ ๊ฐ„ํ—์ ์ผ ๋•Œ ํŠนํžˆ ๊ฐ€์น˜๊ฐ€ ํฝ๋‹ˆ๋‹ค. 200๊ฐœ ์š”์ฒญ ์ค‘ ํ•œ ๋ฒˆ๋งŒ ๋А๋ ค์ง€๋Š” ๊ฒฝ์šฐ, ๋กœ๊ทธ๋งŒ ๋ณด๋ฉด ๋น ๋ฅธ ์š”์ฒญ๊ณผ ๋А๋ฆฐ ์š”์ฒญ์ด ๋™์ผํ•ด ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠธ๋ ˆ์ด์Šค๋Š” ์ฐจ์ด๋ฅผ ๋ช…ํ™•ํžˆ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค: ํ•œ ์š”์ฒญ์ด ์™ธ๋ถ€ ํ˜ธ์ถœ์„ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ 800ms๋ฅผ ์†Œ๋น„ํ–ˆ๊ณ , ๋‘ ๋ฒˆ ์žฌ์‹œ๋„ํ•œ ๋’ค ํ›„์† ์ž‘์—…์„ ์‹œ์ž‘ํ–ˆ๋‹ค๋Š” ์‹์œผ๋กœ์š”.

๋˜ํ•œ ๋กœ๊ทธ๋Š” ์„œ๋น„์Šค ๊ฐ„์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. API์— ํ•œ ์ค„, ์›Œ์ปค์— ๋‹ค๋ฅธ ์ค„์˜ ๋กœ๊ทธ๋งŒ ์žˆ๊ณ  ๊ทธ ์‚ฌ์ด์—์„œ ์•„๋ฌด ๊ฒƒ๋„ ์—†์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠธ๋ ˆ์ด์‹ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ๋Ÿฐ ์ด๋ฒคํŠธ๋“ค์ด ๋™์ผํ•œ trace ID๋ฅผ ๊ณต์œ ํ•˜๋ฏ€๋กœ ์ถ”์ธกํ•˜์ง€ ์•Š๊ณ  ์ฒด์ธ์„ ๋”ฐ๋ผ๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠธ๋ ˆ์ด์Šค, ๋ฉ”ํŠธ๋ฆญ, ๋กœ๊ทธ: ๊ฐ ์‹ ํ˜ธ์˜ ์—ญํ• 

ํŠธ๋ ˆ์ด์Šค, ๋ฉ”ํŠธ๋ฆญ, ๋กœ๊ทธ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์งˆ๋ฌธ์— ๋‹ตํ•ฉ๋‹ˆ๋‹ค.

ํŠธ๋ ˆ์ด์Šค๋Š” ํ•œ ์‹ค์ œ ์š”์ฒญ์—์„œ ๋ฌด์Šจ ์ผ์ด ์žˆ์—ˆ๋Š”์ง€๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ํ•ธ๋“ค๋Ÿฌ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ˜ธ์ถœ, ์บ์‹œ ์กฐํšŒ, ์„œ๋“œํŒŒํ‹ฐ ์š”์ฒญ์—์„œ ์‹œ๊ฐ„์ด ์–ด๋””์— ์“ฐ์˜€๋Š”์ง€ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

๋ฉ”ํŠธ๋ฆญ์€ ์ถ”์„ธ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ง‘๊ณ„๊ฐ€ ์•ˆ์ •์ ์ด๊ณ  ๋น„์šฉ์ด ๋‚ฎ์•„ ๊ฒฝ๋ณด์— ๊ฐ€์žฅ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค: ์ง€์—ฐ์˜ ํผ์„ผํƒ€์ผ, ์š”์ฒญ๋ฅ , ์˜ค๋ฅ˜์œจ, ํ ๊นŠ์ด, ํฌํ™”๋„ ๋“ฑ์ž…๋‹ˆ๋‹ค.

๋กœ๊ทธ๋Š” "์™œ"๋ฅผ ํ‰๋ฌธ์œผ๋กœ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค: ๊ฒ€์ฆ ์‹คํŒจ, ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ž…๋ ฅ, ์—ฃ์ง€ ์ผ€์ด์Šค, ์ฝ”๋“œ๊ฐ€ ๋‚ด๋ฆฐ ๊ฒฐ์ • ๋“ฑ์ž…๋‹ˆ๋‹ค.

์ง„์งœ ์ด์ ์€ ์ƒ๊ด€๊ด€๊ณ„์ž…๋‹ˆ๋‹ค. ๋™์ผํ•œ trace ID๊ฐ€ ์ŠคํŒฌ๊ณผ ๊ตฌ์กฐํ™”๋œ ๋กœ๊ทธ์— ๋‚˜ํƒ€๋‚˜๋ฉด ์˜ค๋ฅ˜ ๋กœ๊ทธ์—์„œ ์ •ํ™•ํ•œ ํŠธ๋ ˆ์ด์Šค๋กœ ๋ฐ”๋กœ ์ด๋™ํ•ด ์–ด๋–ค ์˜์กด์„ฑ์ด ๋А๋ ค์กŒ๋Š”์ง€ ๋˜๋Š” ์–ด๋–ค ๋‹จ๊ณ„๊ฐ€ ์‹คํŒจํ–ˆ๋Š”์ง€๋ฅผ ์ฆ‰์‹œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ์‚ฌ๊ณ  ๋ชจ๋ธ

๊ฐ ์‹ ํ˜ธ๋ฅผ ์ž˜ํ•  ์ˆ˜ ์žˆ๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•˜์„ธ์š”:

  • ๋ฉ”ํŠธ๋ฆญ์€ ๋ฌด์–ธ๊ฐ€ ์ž˜๋ชป๋˜์—ˆ์Œ์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.
  • ํŠธ๋ ˆ์ด์Šค๋Š” ํ•œ ์š”์ฒญ์—์„œ ์‹œ๊ฐ„์ด ์–ด๋””์— ์“ฐ์˜€๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
  • ๋กœ๊ทธ๋Š” ์ฝ”๋“œ๊ฐ€ ๋ฌด์—‡์„ ๊ฒฐ์ •ํ–ˆ๊ณ  ์™œ ๊ทธ๋Ÿฐ์ง€๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ: POST /checkout ์—”๋“œํฌ์ธํŠธ๊ฐ€ ํƒ€์ž„์•„์›ƒ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”ํŠธ๋ฆญ์€ p95 ์ง€์—ฐ์ด ๊ธ‰์ฆํ–ˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ํŠธ๋ ˆ์ด์Šค๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„์ด ๊ฒฐ์ œ ์ œ๊ณต์ž ํ˜ธ์ถœ ๋‚ด๋ถ€์— ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ํ•ด๋‹น ์ŠคํŒฌ ๋‚ด๋ถ€์˜ ์ƒ๊ด€๋œ ๋กœ๊ทธ ๋ผ์ธ์€ 502๋กœ ์ธํ•ด ์žฌ์‹œ๋„๊ฐ€ ๋ฐœ์ƒํ–ˆ์Œ์„ ๋ณด์—ฌ์ฃผ๋ฉฐ, ์ด๋Š” ๋ฐฑ์˜คํ”„ ์„ค์ •์ด๋‚˜ ์ƒ๋ฅ˜ ์žฅ์• ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

์ฝ”๋“œ ์ถ”๊ฐ€ ์ „์—: ์ด๋ฆ„ ์ง“๊ธฐ, ์ƒ˜ํ”Œ๋ง, ์ถ”์ ํ•  ํ•ญ๋ชฉ

์‚ฌ์ „ ๊ณ„ํš์ด ์žˆ์–ด์•ผ ๋‚˜์ค‘์— ํŠธ๋ ˆ์ด์Šค๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๊ณ„ํš์ด ์—†์œผ๋ฉด ๋ฐ์ดํ„ฐ๋Š” ์ˆ˜์ง‘๋˜์ง€๋งŒ ๊ธฐ๋ณธ์ ์ธ ์งˆ๋ฌธ๋“ค์ด ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค: "์ด๊ฒƒ์ด ์Šคํ…Œ์ด์ง•์ธ๊ฐ€ ํ”„๋กœ๋•์…˜์ธ๊ฐ€?" "์–ด๋–ค ์„œ๋น„์Šค๊ฐ€ ๋ฌธ์ œ๋ฅผ ์‹œ์ž‘ํ–ˆ๋Š”๊ฐ€?"

์ผ๊ด€๋œ ์‹๋ณ„๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์„ธ์š”. ๊ฐ Go API์— ๋ช…ํ™•ํ•œ service.name์„ ์ •ํ•˜๊ณ (์˜ˆ: checkout-api), deployment.environment=dev|staging|prod ๊ฐ™์€ ๋‹จ์ผ ํ™˜๊ฒฝ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ด ๊ฐ’๋“ค์„ ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€ํ•˜์„ธ์š”. ์ด๋ฆ„์ด ์ฃผ์ค‘์— ๋ฐ”๋€Œ๋ฉด ์ฐจํŠธ์™€ ๊ฒ€์ƒ‰์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

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

๋งˆ์ง€๋ง‰์œผ๋กœ ์ŠคํŒฌ์— ์–ด๋–ค ํƒœ๊ทธ๋ฅผ ๋‹ฌ์ง€, ์–ด๋–ค ๊ฒƒ์„ ์ ˆ๋Œ€ ์ˆ˜์ง‘ํ•˜์ง€ ์•Š์„์ง€ ํ•ฉ์˜ํ•˜์„ธ์š”. ์„œ๋น„์Šค ๊ฐ„ ์ด๋ฒคํŠธ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ์†์„ฑ์˜ ํ—ˆ์šฉ ๋ชฉ๋ก์„ ์งง๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ๊ฐ„๋‹จํ•œ ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ๊ทœ์น™์„ ๋งŒ๋“œ์„ธ์š”.

์ข‹์€ ํƒœ๊ทธ๋Š” ๋ณดํ†ต ์•ˆ์ •์ ์ธ ID์™€ ๋Œ€๋žต์ ์ธ ์š”์ฒญ ์ •๋ณด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค(๋ผ์šฐํŠธ ํ…œํ”Œ๋ฆฟ, ๋ฉ”์„œ๋“œ, ์ƒํƒœ ์ฝ”๋“œ). ๋ฏผ๊ฐํ•œ ํŽ˜์ด๋กœ๋“œ๋Š” ์ ˆ๋Œ€ ์ˆ˜์ง‘ํ•˜์ง€ ๋งˆ์„ธ์š”: ๋น„๋ฐ€๋ฒˆํ˜ธ, ๊ฒฐ์ œ ๋ฐ์ดํ„ฐ, ์ „์ฒด ์ด๋ฉ”์ผ, ์ธ์ฆ ํ† ํฐ, ์›์‹œ ์š”์ฒญ ๋ณธ๋ฌธ ๋“ฑ. ์‚ฌ์šฉ์ž ๊ด€๋ จ ๊ฐ’์„ ๊ผญ ํฌํ•จํ•ด์•ผ ํ•œ๋‹ค๋ฉด ํ•ด์‹œํ•˜๊ฑฐ๋‚˜ ๊ฐ€๋ฆฌ์„ธ์š”.

๋‹จ๊ณ„๋ณ„: Go HTTP API์— OpenTelemetry ํŠธ๋ ˆ์ด์‹ฑ ์ถ”๊ฐ€ํ•˜๊ธฐ

์‹œ์ž‘ ์‹œ์ ์— ํ•œ ๋ฒˆ ํŠธ๋ ˆ์ด์„œ ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ์„ค์ •์€ ์ŠคํŒฌ์ด ์–ด๋””๋กœ ์ „์†ก๋˜๋Š”์ง€์™€ ๋ชจ๋“  ์ŠคํŒฌ์— ์ฒจ๋ถ€๋  ๋ฆฌ์†Œ์Šค ์†์„ฑ์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

1) OpenTelemetry ์ดˆ๊ธฐํ™”

๋ฐ˜๋“œ์‹œ service.name์„ ์„ค์ •ํ•˜์„ธ์š”. ์ด ๊ฐ’์ด ์—†์œผ๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ์„œ๋น„์Šค์˜ ํŠธ๋ ˆ์ด์Šค๊ฐ€ ์„ž์—ฌ ์ฐจํŠธ๊ฐ€ ์ฝ๊ธฐ ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค.

// main.go (startup)
exp, _ := stdouttrace.New(stdouttrace.WithPrettyPrint())

res, _ := resource.New(context.Background(),
	resource.WithAttributes(
		semconv.ServiceName("checkout-api"),
	),
)

tp := sdktrace.NewTracerProvider(
	sdktrace.WithBatcher(exp),
	sdktrace.WithResource(res),
)

otel.SetTracerProvider(tp)

์ด๊ฒƒ์ด Go OpenTelemetry ํŠธ๋ ˆ์ด์‹ฑ์˜ ๊ธฐ์ดˆ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ๋Š” ๋“ค์–ด์˜ค๋Š” ๊ฐ ์š”์ฒญ์— ๋Œ€ํ•ด ์ŠคํŒฌ์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2) HTTP ๋ฏธ๋“ค์›จ์–ด ์ถ”๊ฐ€ ๋ฐ ์ฃผ์š” ํ•„๋“œ ์บก์ฒ˜

์ž๋™์œผ๋กœ ์ŠคํŒฌ์„ ์‹œ์ž‘ํ•˜๊ณ  ์ƒํƒœ ์ฝ”๋“œ์™€ ์ง€์† ์‹œ๊ฐ„์„ ๊ธฐ๋กํ•˜๋Š” HTTP ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ŠคํŒฌ ์ด๋ฆ„์€ ์›์‹œ URL์ด ์•„๋‹ˆ๋ผ ๋ผ์šฐํŠธ ํ…œํ”Œ๋ฆฟ(์˜ˆ: /users/:id)์„ ์‚ฌ์šฉํ•ด ์„ค์ •ํ•˜์„ธ์š”. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ˆ˜์ฒœ ๊ฐœ์˜ ๊ณ ์œ  ๊ฒฝ๋กœ๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์œผ๋กœ ๊น”๋”ํ•œ ๊ทœ์น™์„ ์ง€ํ–ฅํ•˜์„ธ์š”: ์š”์ฒญ๋‹น ์„œ๋ฒ„ ์ŠคํŒฌ ํ•˜๋‚˜, ๋ผ์šฐํŠธ ๊ธฐ๋ฐ˜ ์ŠคํŒฌ ์ด๋ฆ„, ์บก์ฒ˜๋œ HTTP ์ƒํƒœ, ํ•ธ๋“ค๋Ÿฌ ์‹คํŒจ๋Š” ์ŠคํŒฌ ์˜ค๋ฅ˜๋กœ ๋ฐ˜์˜, ์ง€์† ์‹œ๊ฐ„์€ ํŠธ๋ ˆ์ด์Šค ๋ทฐ์–ด์—์„œ ํ™•์ธ ๊ฐ€๋Šฅ.

3) ์‹คํŒจ๋ฅผ ๋ช…ํ™•ํžˆ ํ‘œ์‹œํ•˜๊ธฐ

๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ํ˜„์žฌ ์ŠคํŒฌ์„ ์‹คํŒจ๋กœ ํ‘œ์‹œํ•˜์„ธ์š”. ๊ทธ๋Ÿฌ๋ฉด ๋กœ๊ทธ๋ฅผ ๋ณด๊ธฐ ์ „์—๋„ ํŠธ๋ ˆ์ด์Šค๊ฐ€ ๋ˆˆ์— ๋•๋‹ˆ๋‹ค.

ํ•ธ๋“ค๋Ÿฌ์—์„œ ๋‹ค์Œ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

span := trace.SpanFromContext(r.Context())
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())

4) ๋กœ์ปฌ์—์„œ trace ID ํ™•์ธํ•˜๊ธฐ

API๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ˜ธ์ถœํ•ด ๋ณด์„ธ์š”. ์š”์ฒญ ์ปจํ…์ŠคํŠธ์—์„œ trace ID๋ฅผ ํ•œ ๋ฒˆ ๋กœ๊ทธ์— ๋‚จ๊ฒจ ์š”์ฒญ๋งˆ๋‹ค ๋ฐ”๋€Œ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ํ•ญ์ƒ ๋น„์–ด ์žˆ๋‹ค๋ฉด ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋ฐ›๋Š” ๋™์ผํ•œ ์ปจํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

DB์™€ ์„œ๋“œํŒŒํ‹ฐ ํ˜ธ์ถœ์—์„œ ์ปจํ…์ŠคํŠธ ์œ ์ง€ํ•˜๊ธฐ

์›ํ•˜๋Š” ํ™˜๊ฒฝ์— ๋ฐฐํฌ
๊ณ„์ธก ๋ฐฉ์‹์„ ๋ฐ”๊พธ์ง€ ์•Š๊ณ  ํด๋ผ์šฐ๋“œ๋‚˜ AppMaster Cloud์— ๋ฐฐํฌํ•˜์„ธ์š”.
์ง€๊ธˆ ๋ฐฐํฌ

context.Context๋ฅผ ์žƒ์–ด๋ฒ„๋ฆฌ๋Š” ์ˆœ๊ฐ„ ์—”๋“œํˆฌ์—”๋“œ ๊ฐ€์‹œ์„ฑ์€ ๊นจ์ง‘๋‹ˆ๋‹ค. ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ ์ปจํ…์ŠคํŠธ๋Š” ๋ชจ๋“  DB ํ˜ธ์ถœ, HTTP ํ˜ธ์ถœ, ํ—ฌํผ์— ์ „๋‹ฌํ•˜๋Š” ์‹ค๋ฐฅ(thread)์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. context.Background()๋กœ ๊ต์ฒดํ•˜๊ฑฐ๋‚˜ ์ „๋‹ฌ์„ ์žŠ์œผ๋ฉด ํŠธ๋ ˆ์ด์Šค๋Š” ๋ณ„๊ฐœ์˜ ๊ด€๋ จ ์—†๋Š” ์ž‘์—…์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

์•„์›ƒ๋ฐ”์šด๋“œ HTTP์˜ ๊ฒฝ์šฐ, ๊ณ„์ธก๋œ ํŠธ๋žœ์ŠคํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•ด Do(req)๊ฐ€ ํ˜„์žฌ ์š”์ฒญ์˜ ์ž์‹ ์ŠคํŒฌ์ด ๋˜๊ฒŒ ํ•˜์„ธ์š”. ํ•˜๋ฅ˜ ์„œ๋น„์Šค๊ฐ€ ๋™์ผํ•œ ํŠธ๋ ˆ์ด์Šค์— ์ŠคํŒฌ์„ ๋ถ™์ผ ์ˆ˜ ์žˆ๋„๋ก W3C ํŠธ๋ ˆ์ด์Šค ํ—ค๋”๋ฅผ ์ „๋‹ฌํ•˜์„ธ์š”.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ˜ธ์ถœ๋„ ๊ฐ™์€ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ณ„์ธก๋œ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ QueryContext ๋ฐ ExecContext ์ฃผ์œ„์— ์ŠคํŒฌ์„ ๋ž˜ํ•‘ํ•˜์„ธ์š”. ์•ˆ์ „ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋งŒ ๊ธฐ๋กํ•˜์„ธ์š”. ๋А๋ฆฐ ์ฟผ๋ฆฌ๋ฅผ ์ฐพ๊ณ ์ž ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ถœํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

์œ ์šฉํ•˜๋ฉด์„œ ์œ„ํ—˜์ด ์ ์€ ์†์„ฑ์€ ์ž‘์—… ์ด๋ฆ„(์˜ˆ: SELECT user_by_id), ํ…Œ์ด๋ธ” ๋˜๋Š” ๋ชจ๋ธ ์ด๋ฆ„, ํ–‰ ์ˆ˜(๊ฐœ์ˆ˜๋งŒ), ์ง€์† ์‹œ๊ฐ„, ์žฌ์‹œ๋„ ํšŸ์ˆ˜, ๊ทธ๋ฆฌ๊ณ  ๊ฑฐ์นœ ์˜ค๋ฅ˜ ์œ ํ˜•(ํƒ€์ž„์•„์›ƒ, ์ทจ์†Œ, ์ œ์•ฝ ์œ„๋ฐ˜) ๋“ฑ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

ํƒ€์ž„์•„์›ƒ์€ ๋‹จ์ง€ ์‹คํŒจ์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. DB์™€ ์„œ๋“œํŒŒํ‹ฐ ํ˜ธ์ถœ์— context.WithTimeout์„ ์„ค์ •ํ•˜๊ณ  ์ทจ์†Œ๊ฐ€ ์ „ํŒŒ๋˜๊ฒŒ ํ•˜์„ธ์š”. ํ˜ธ์ถœ์ด ์ทจ์†Œ๋˜๋ฉด ์ŠคํŒฌ์„ ์˜ค๋ฅ˜๋กœ ํ‘œ์‹œํ•˜๊ณ  deadline_exceeded ๊ฐ™์€ ์งง์€ ์ด์œ ๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”.

๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…๊ณผ ํ ํŠธ๋ ˆ์ด์‹ฑ

๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—… ์ถ”์ 
์ž‘์—…์„ ๋งŒ๋“ค๊ณ  ์ปจํ…์ŠคํŠธ๋ฅผ ์ „ํŒŒํ•ด ๋น„๋™๊ธฐ ์ž‘์—…์ด ์š”์ฒญ์— ์—ฐ๊ฒฐ๋˜๊ฒŒ ํ•˜์„ธ์š”.
์ง€๊ธˆ ์‹œ์ž‘

๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์€ ํŠธ๋ ˆ์ด์Šค๊ฐ€ ๋ฉˆ์ถ”๊ธฐ ์‰ฌ์šด ๊ณณ์ž…๋‹ˆ๋‹ค. HTTP ์š”์ฒญ์ด ๋๋‚˜๊ณ  ์›Œ์ปค๊ฐ€ ๋‹ค๋ฅธ ๋จธ์‹ ์—์„œ ๋‚˜์ค‘์— ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉด ์ปจํ…์ŠคํŠธ๊ฐ€ ๊ณต์œ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์œผ๋ฉด API ํŠธ๋ ˆ์ด์Šค์™€ ์–ด๋””์„ ๊ฐ€ ์‹œ์ž‘๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ์ž‘์—… ํŠธ๋ ˆ์ด์Šค ๋‘ ๊ฐœ๋งŒ ๋‚จ์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค: ์ž‘์—…์„ ํ์— ๋„ฃ์„ ๋•Œ ํ˜„์žฌ ํŠธ๋ ˆ์ด์Šค ์ปจํ…์ŠคํŠธ๋ฅผ ์บก์ฒ˜ํ•ด ์ž‘์—… ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(ํŽ˜์ด๋กœ๋“œ, ํ—ค๋”, ์†์„ฑ ๋“ฑ)์— ์ €์žฅํ•˜์„ธ์š”. ์›Œ์ปค๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ๊ทธ ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”์ถœํ•ด ์›๋ž˜ ์š”์ฒญ์˜ ์ž์‹์œผ๋กœ ์ƒˆ ์ŠคํŒฌ์„ ์‹œ์ž‘ํ•˜์„ธ์š”.

์ปจํ…์ŠคํŠธ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ „ํŒŒํ•˜๊ธฐ

ํŠธ๋ ˆ์ด์Šค ์ปจํ…์ŠคํŠธ๋งŒ ๋ณต์‚ฌํ•˜๊ณ  ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•˜์ง€ ๋งˆ์„ธ์š”.

  • trace ์‹๋ณ„์ž์™€ ์ƒ˜ํ”Œ๋ง ํ”Œ๋ž˜๊ทธ(W3C traceparent ์Šคํƒ€์ผ)๋งŒ ์ฃผ์ž…ํ•˜์„ธ์š”.
  • ๋น„์ฆˆ๋‹ˆ์Šค ํ•„๋“œ์™€ ๋ถ„๋ฆฌํ•ด์„œ ๋ณด๊ด€ํ•˜์„ธ์š”(์˜ˆ: ๋ณ„๋„์˜ "otel" ๋˜๋Š” "trace" ํ•„๋“œ).
  • ๋‹ค์‹œ ์ฝ์„ ๋•Œ๋Š” ์‹ ๋ขฐํ•˜์ง€ ์•Š๋Š” ์ž…๋ ฅ์œผ๋กœ ์ทจ๊ธ‰ํ•˜์„ธ์š”(ํ˜•์‹ ๊ฒ€์ฆ, ๋ˆ„๋ฝ ์ฒ˜๋ฆฌ).
  • ํ† ํฐ, ์ด๋ฉ”์ผ, ์š”์ฒญ ๋ณธ๋ฌธ์„ ์ž‘์—… ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ๋„ฃ์ง€ ๋งˆ์„ธ์š”.

๋…ธ์ด์ฆˆ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ์ถ”๊ฐ€ํ•  ์ŠคํŒฌ

์ฝ๊ธฐ ์‰ฌ์šด ํŠธ๋ ˆ์ด์Šค๋Š” ๋ณดํ†ต ๋ช‡ ๊ฐœ์˜ ์˜๋ฏธ ์žˆ๋Š” ์ŠคํŒฌ์„ ๊ฐ€์ง€๋ฉฐ, ์ˆ˜์‹ญ ๊ฐœ์˜ ์ž‘์€ ์ŠคํŒฌ์ด ์žˆ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฝ๊ณ„์™€ "๋Œ€๊ธฐ ์ง€์ " ์ฃผ์œ„์— ์ŠคํŒฌ์„ ๋งŒ๋“œ์„ธ์š”. ์‹œ์ž‘์ ์œผ๋กœ๋Š” API ํ•ธ๋“ค๋Ÿฌ์˜ enqueue ์ŠคํŒฌ๊ณผ ์›Œ์ปค์˜ job.run ์ŠคํŒฌ์ด ์ ๋‹นํ•ฉ๋‹ˆ๋‹ค.

์†Œ๋Ÿ‰์˜ ์ปจํ…์ŠคํŠธ๋งŒ ์ถ”๊ฐ€ํ•˜์„ธ์š”: ์‹œ๋„ ๋ฒˆํ˜ธ, ํ ์ด๋ฆ„, ์ž‘์—… ์ข…๋ฅ˜, ํŽ˜์ด๋กœ๋“œ ํฌ๊ธฐ(๋‚ด์šฉ ์•„๋‹˜). ์žฌ์‹œ๋„๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ฐฑ์˜คํ”„ ์ง€์—ฐ์„ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ๋ณ„๋„์˜ ์ŠคํŒฌ์ด๋‚˜ ์ด๋ฒคํŠธ๋กœ ๊ธฐ๋กํ•˜์„ธ์š”.

์˜ˆ์•ฝ๋œ ์ž‘์—…์—๋„ ๋ถ€๋ชจ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ์ด ์—†๋‹ค๋ฉด ๊ฐ ์‹คํ–‰๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๋ฃจํŠธ ์ŠคํŒฌ์„ ๋งŒ๋“ค๊ณ  ์Šค์ผ€์ค„ ์ด๋ฆ„์„ ํƒœ๊ทธํ•˜์„ธ์š”.

๋กœ๊ทธ์™€ ํŠธ๋ ˆ์ด์Šค ์ƒ๊ด€๊ด€๊ณ„(๊ทธ๋ฆฌ๊ณ  ๋กœ๊ทธ ์•ˆ์ „ ์œ ์ง€)

ํŠธ๋ ˆ์ด์Šค๋Š” ์‹œ๊ฐ„์ด ์–ด๋””์— ์“ฐ์˜€๋Š”์ง€๋ฅผ ๋งํ•ด์ฃผ๊ณ , ๋กœ๊ทธ๋Š” ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ฌ๊ณ  ์™œ์ธ์ง€ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ ๋ชจ๋“  ๋กœ๊ทธ ํ•ญ๋ชฉ์— trace_id์™€ span_id๋ฅผ ๊ตฌ์กฐํ™”๋œ ํ•„๋“œ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Go์—์„œ๋Š” context.Context์—์„œ ํ™œ์„ฑ ์ŠคํŒฌ์„ ๊ฐ€์ ธ์™€ ๊ฐ ์š”์ฒญ(๋˜๋Š” ์ž‘์—…)๋งˆ๋‹ค ๋กœ๊ฑฐ๋ฅผ ํ™•์žฅํ•˜์„ธ์š”. ๊ทธ๋Ÿฌ๋ฉด ๋ชจ๋“  ๋กœ๊ทธ ๋ผ์ธ์ด ํŠน์ • ํŠธ๋ ˆ์ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

span := trace.SpanFromContext(ctx)
sc := span.SpanContext()
logger := baseLogger.With(
  "trace_id", sc.TraceID().String(),
  "span_id",  sc.SpanID().String(),
)
logger.Info("charge_started", "order_id", orderID)

์ด ์ •๋„๋ฉด ๋กœ๊ทธ ํ•ญ๋ชฉ์—์„œ ์ •ํ™•ํ•œ ์ŠคํŒฌ์œผ๋กœ ๋ฐ”๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ปจํ…์ŠคํŠธ๊ฐ€ ์—†์œผ๋ฉด trace_id๊ฐ€ ๋น„์–ด ์žˆ์–ด ์ด๋ฅผ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PII๋ฅผ ์œ ์ถœํ•˜์ง€ ์•Š๊ณ  ๋กœ๊ทธ ์œ ์šฉ์„ฑ ์œ ์ง€ํ•˜๊ธฐ

๋กœ๊ทธ๋Š” ํŠธ๋ ˆ์ด์Šค๋ณด๋‹ค ๋” ์˜ค๋ž˜ ๋ณด๊ด€๋˜๊ณ  ๋” ๋„“๊ฒŒ ์ „ํŒŒ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์œผ๋ฏ€๋กœ ๋” ์—„๊ฒฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•ˆ์ •์ ์ธ ์‹๋ณ„์ž์™€ ๊ฒฐ๊ณผ๋ฅผ ์„ ํ˜ธํ•˜์„ธ์š”: user_id, order_id, payment_provider, status, error_code. ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๊ผญ ๋กœ๊ทธ๋กœ ๋‚จ๊ฒจ์•ผ ํ•œ๋‹ค๋ฉด ๋จผ์ € ๊ฐ€๋ฆฌ๊ณ  ๊ธธ์ด๋ฅผ ์ œํ•œํ•˜์„ธ์š”.

์˜ค๋ฅ˜ ๊ทธ๋ฃนํ™”๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ธฐ

์ผ๊ด€๋œ ์ด๋ฒคํŠธ ์ด๋ฆ„๊ณผ ์˜ค๋ฅ˜ ์œ ํ˜•์„ ์‚ฌ์šฉํ•ด ์ง‘๊ณ„ํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“œ์„ธ์š”. ๋ฌธ๊ตฌ๊ฐ€ ๋งค๋ฒˆ ๋ฐ”๋€Œ๋ฉด ๋™์ผํ•œ ์ด์Šˆ๊ฐ€ ์—ฌ๋Ÿฌ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ์ฐพ๋Š” ๋ฐ ์‹ค์ œ๋กœ ๋„์›€์ด ๋˜๋Š” ๋ฉ”ํŠธ๋ฆญ ์ถ”๊ฐ€ํ•˜๊ธฐ

์„œ๋น„์Šค ๋„ค์ด๋ฐ ํ‘œ์ค€ํ™”
์‹ค์ œ Go ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์•ฑ ์ „๋ฐ˜์—์„œ ์ด๋ฆ„๊ณผ ํ™˜๊ฒฝ ํƒœ๊ทธ๋ฅผ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•˜์„ธ์š”.
์‹œ์ž‘ํ•˜๊ธฐ

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

๋Œ€๋ถ€๋ถ„์˜ API์— ๊ฑฐ์˜ ํ•ญ์ƒ ์œ ์šฉํ•œ ์†Œ๊ทœ๋ชจ ์ง‘ํ•ฉ์œผ๋กœ ์‹œ์ž‘ํ•˜์„ธ์š”: ์š”์ฒญ ์ˆ˜, ์˜ค๋ฅ˜ ์ˆ˜(์ƒํƒœ ํด๋ž˜์Šค๋ณ„), ์ง€์—ฐ ํผ์„ผํƒ€์ผ(p50, p95, p99), ์ฒ˜๋ฆฌ ์ค‘ ์š”์ฒญ ์ˆ˜, DB ๋ฐ ์ฃผ์š” ์„œ๋“œํŒŒํ‹ฐ ํ˜ธ์ถœ์˜ ์˜์กด์„ฑ ์ง€์—ฐ.

ํŠธ๋ ˆ์ด์Šค์™€ ๋ฉ”ํŠธ๋ฆญ์„ ์ •๋ ฌํ•˜๋ ค๋ฉด ๊ฐ™์€ ๋ผ์šฐํŠธ ํ…œํ”Œ๋ฆฟ๊ณผ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ŠคํŒฌ์ด /users/{id}๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ”ํŠธ๋ฆญ๋„ ๋™์ผํ•˜๊ฒŒ ํ•˜์„ธ์š”. ๊ทธ๋Ÿฌ๋ฉด ์ฐจํŠธ์— "/checkout์˜ p95์ด ๊ธ‰์ฆ"์ด ๋ณด์ผ ๋•Œ ํ•ด๋‹น ๋ผ์šฐํŠธ๋กœ ํ•„ํ„ฐ๋ง๋œ ํŠธ๋ ˆ์ด์Šค๋กœ ๋ฐ”๋กœ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ผ๋ฒจ(์†์„ฑ)์€ ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ž˜๋ชป๋œ ๋ผ๋ฒจ ํ•˜๋‚˜๊ฐ€ ๋น„์šฉ์„ ํญ๋ฐœ์‹œํ‚ค๊ณ  ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์“ธ๋ชจ์—†๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ผ์šฐํŠธ ํ…œํ”Œ๋ฆฟ, ๋ฉ”์„œ๋“œ, ์ƒํƒœ ํด๋ž˜์Šค, ์„œ๋น„์Šค ์ด๋ฆ„์€ ๋ณดํ†ต ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ID, ์ด๋ฉ”์ผ, ์ „์ฒด URL, ์›์‹œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋Š” ๋ณดํ†ต ์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋น„์ฆˆ๋‹ˆ์Šค ์ค‘์š” ์ด๋ฒคํŠธ(์˜ˆ: checkout ์‹œ์ž‘/์™„๋ฃŒ, ๊ฒฐ์ œ ์‹คํŒจ ์œ ํ˜•๋ณ„, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—… ์„ฑ๊ณต ๋Œ€ ์žฌ์‹œ๋„)์šฉ ์ปค์Šคํ…€ ๋ฉ”ํŠธ๋ฆญ์„ ๋ช‡ ๊ฐœ ์ถ”๊ฐ€ํ•˜์„ธ์š”. ์ง‘ํ•ฉ์„ ์ž‘๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์ œ๊ฑฐํ•˜์„ธ์š”.

ํ…”๋ ˆ๋ฉ”ํŠธ๋ฆฌ ๋‚ด๋ณด๋‚ด๊ธฐ ๋ฐ ์•ˆ์ „ํ•œ ๋กค์•„์›ƒ

๋‚ด๋ณด๋‚ด๊ธฐ๋Š” OpenTelemetry๊ฐ€ ์‹ค์šฉํ™”๋˜๋Š” ์ง€์ ์ž…๋‹ˆ๋‹ค. ์„œ๋น„์Šค๋Š” ์ŠคํŒฌ, ๋ฉ”ํŠธ๋ฆญ, ๋กœ๊ทธ๋ฅผ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์œผ๋กœ ์ง€์—ฐ ์—†์ด ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋กœ์ปฌ ๊ฐœ๋ฐœ์—์„œ๋Š” ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜์„ธ์š”. ์ฝ˜์†” ์ต์Šคํฌํ„ฐ๋‚˜ ๋กœ์ปฌ ์ปฌ๋ ‰ํ„ฐ๋กœ OTLP๋ฅผ ๋ณด๋‚ด๋ฉด ํŠธ๋ ˆ์ด์Šค๋ฅผ ๋น ๋ฅด๊ฒŒ ๋ณด๊ณ  ์ŠคํŒฌ ์ด๋ฆ„๊ณผ ์†์„ฑ์„ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜์—์„œ๋Š” ์„œ๋น„์Šค ๊ทผ์ฒ˜์˜ ์—์ด์ „ํŠธ๋‚˜ OpenTelemetry Collector๋กœ OTLP๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜์„ธ์š”. ๊ทธ๋Ÿฌ๋ฉด ์žฌ์‹œ๋„, ๋ผ์šฐํŒ…, ํ•„ํ„ฐ๋ง์„ ํ•œ ๊ณณ์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐฐ์น˜ ์ „์†ก์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์งง์€ ๊ฐ„๊ฒฉ์˜ ๋ฐฐ์น˜์™€ ์—„๊ฒฉํ•œ ํƒ€์ž„์•„์›ƒ์œผ๋กœ ์ „์†กํ•ด ๋„คํŠธ์›Œํฌ๊ฐ€ ๋ง‰ํ˜€๋„ ์š”์ฒญ์„ ์ฐจ๋‹จํ•˜์ง€ ์•Š๊ฒŒ ํ•˜์„ธ์š”. ํ…”๋ ˆ๋ฉ”ํŠธ๋ฆฌ๋Š” ํฌ๋ฆฌํ‹ฐ์ปฌ ๊ฒฝ๋กœ์— ์žˆ์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ต์Šคํฌํ„ฐ๊ฐ€ ๋”ฐ๋ผ๊ฐ€์ง€ ๋ชปํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์Œ“๊ธฐ๋ณด๋‹ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฒ„๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ƒ˜ํ”Œ๋ง์œผ๋กœ ๋น„์šฉ์„ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ์œ ์ง€ํ•˜์„ธ์š”. ๋จผ์ € ํ—ค๋“œ ๊ธฐ๋ฐ˜ ์ƒ˜ํ”Œ๋ง(์˜ˆ: ์š”์ฒญ์˜ 1~10%)์œผ๋กœ ์‹œ์ž‘ํ•˜๊ณ  ๊ฐ„๋‹จํ•œ ๊ทœ์น™์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”: ์˜ค๋ฅ˜๋Š” ํ•ญ์ƒ ์ƒ˜ํ”Œ๋ง, ํŠน์ • ์ž„๊ณ„๊ฐ’ ์ด์ƒ์˜ ๋А๋ฆฐ ์š”์ฒญ์€ ํ•ญ์ƒ ์ƒ˜ํ”Œ๋ง. ๊ณ ๋นˆ๋„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์€ ๋‚ฎ์€ ๋น„์œจ๋กœ ์ƒ˜ํ”Œ๋งํ•˜์„ธ์š”.

๋กค์•„์›ƒ์€ ์ž‘์€ ๋‹จ๊ณ„๋กœ ํ•˜์„ธ์š”: ๊ฐœ๋ฐœ์—์„œ 100% ์ƒ˜ํ”Œ๋ง, ์Šคํ…Œ์ด์ง•์—์„œ ํ˜„์‹ค์ ์ธ ํŠธ๋ž˜ํ”ฝ๊ณผ ๋‚ฎ์€ ์ƒ˜ํ”Œ๋ง, ํ”„๋กœ๋•์…˜์—์„œ๋Š” ๋ณด์ˆ˜์ ์ธ ์ƒ˜ํ”Œ๋ง๊ณผ ์ต์Šคํฌํ„ฐ ์‹คํŒจ์— ๋Œ€ํ•œ ์•Œ๋ฆผ.

์—”๋“œํˆฌ์—”๋“œ ๊ฐ€์‹œ์„ฑ์„ ๋ง์น˜๋Š” ํ”ํ•œ ์‹ค์ˆ˜๋“ค

์ถ”์ ๋œ ์ฒดํฌ์•„์›ƒ ํ”„๋กœํ† ํƒ€์ž…
์ŠคํŒฌ, ์žฌ์‹œ๋„, ํƒ€์ž„์•„์›ƒ ๊ฒฝ๊ณ„๊ฐ€ ๋ช…ํ™•ํ•œ ๊ฒฐ์ œ ์„œ๋น„์Šค ํ”„๋กœํ† ํƒ€์ž…์„ ๋งŒ๋“œ์„ธ์š”.
์‹œ์ž‘ํ•˜๊ธฐ

์—”๋“œํˆฌ์—”๋“œ ๊ฐ€์‹œ์„ฑ์€ ๋Œ€๊ฐœ ๋‹จ์ˆœํ•œ ์ด์œ ๋กœ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค: ๋ฐ์ดํ„ฐ๋Š” ์กด์žฌํ•˜์ง€๋งŒ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Go์—์„œ ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์‹ฑ์„ ๊นจ๋œจ๋ฆฌ๋Š” ํ”ํ•œ ๋ฌธ์ œ๋Š” ๋Œ€๊ฐœ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • ๋ ˆ์ด์–ด ๊ฐ„์— ์ปจํ…์ŠคํŠธ๋ฅผ ๋ฒ„๋ฆผ. ํ•ธ๋“ค๋Ÿฌ๋Š” ์ŠคํŒฌ์„ ๋งŒ๋“ค์ง€๋งŒ DB ํ˜ธ์ถœ, HTTP ํด๋ผ์ด์–ธํŠธ, ๊ณ ๋ฃจํ‹ด์ด ์š”์ฒญ ์ปจํ…์ŠคํŠธ ๋Œ€์‹  context.Background()๋ฅผ ์‚ฌ์šฉํ•จ.
  • ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด์„œ ์ŠคํŒฌ์„ ํ‘œ์‹œํ•˜์ง€ ์•Š์Œ. ์˜ค๋ฅ˜๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ์ŠคํŒฌ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ํŠธ๋ ˆ์ด์Šค๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” 500์ด์ง€๋งŒ "์ •์ƒ"์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์Œ.
  • ๋ชจ๋“  ๊ฒƒ์„ ๊ณ„์ธกํ•จ. ๋ชจ๋“  ํ—ฌํผ๊ฐ€ ์ŠคํŒฌ์ด ๋˜๋ฉด ํŠธ๋ ˆ์ด์Šค๊ฐ€ ์†Œ์Œ์ด ๋˜๊ณ  ๋น„์šฉ์ด ์ฆ๊ฐ€ํ•จ.
  • ๊ณ ์นด๋””๋„๋ฆฌํ‹ฐ ์†์„ฑ ์ถ”๊ฐ€. ID๊ฐ€ ํฌํ•จ๋œ ์ „์ฒด URL, ์ด๋ฉ”์ผ, ์›์‹œ SQL ๊ฐ’, ์š”์ฒญ ๋ณธ๋ฌธ, ์›์‹œ ์˜ค๋ฅ˜ ๋ฌธ์ž์—ด์€ ์ˆ˜๋ฐฑ๋งŒ ๊ฐœ์˜ ๊ณ ์œ ๊ฐ’์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Œ.
  • ํ‰๊ท ์œผ๋กœ ์„ฑ๋Šฅ์„ ํŒ๋‹จํ•จ. ์‚ฌ๊ณ ๋Š” ํ‰๊ท ์ด ์•„๋‹ˆ๋ผ ํผ์„ผํƒ€์ผ(p95/p99)๊ณผ ์˜ค๋ฅ˜์œจ์— ๋“œ๋Ÿฌ๋‚จ.

๋น ๋ฅธ ์ ๊ฒ€์€ ํ•˜๋‚˜์˜ ์‹ค์ œ ์š”์ฒญ์„ ๊ณจ๋ผ ๊ฒฝ๊ณ„๋“ค์„ ๋”ฐ๋ผ๊ฐ€๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ธ๋ฐ”์šด๋“œ ์š”์ฒญ, DB ์ฟผ๋ฆฌ, ์„œ๋“œํŒŒํ‹ฐ ํ˜ธ์ถœ, ๋น„๋™๊ธฐ ์›Œ์ปค๋ฅผ ํ†ตํ•ด ํ•˜๋‚˜์˜ trace ID๊ฐ€ ํ๋ฅด๋Š”์ง€ ๋ณผ ์ˆ˜ ์—†๋‹ค๋ฉด ์—”๋“œํˆฌ์—”๋“œ ๊ฐ€์‹œ์„ฑ์ด ์•„์ง ํ™•๋ณด๋œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

์‹ค์šฉ์ ์ธ "์™„๋ฃŒ" ์ฒดํฌ๋ฆฌ์ŠคํŠธ

์†Œ์Šค ์ฝ”๋“œ ์†Œ์œ 
ํ”„๋กœ๋•์…˜ ์ˆ˜์ค€์˜ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ํŒ€์ด ์„ ํ˜ธํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋‚ด๋ณด๋‚ด๊ณ  ๊ณ„์ธกํ•˜์„ธ์š”.
AppMaster ์ฒดํ—˜

์‚ฌ์šฉ์ž ๋ณด๊ณ ์„œ์—์„œ ์ •ํ™•ํ•œ ์š”์ฒญ์œผ๋กœ ์ด๋™ํ•œ ๋’ค ๊ทธ ์š”์ฒญ์„ ๋ชจ๋“  ํ™‰์—์„œ ๋”ฐ๋ผ๊ฐˆ ์ˆ˜ ์žˆ์„ ๋•Œ ๊ฑฐ์˜ ์™„๋ฃŒ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ํ•˜๋‚˜์˜ API ๋กœ๊ทธ ๋ผ์ธ์„ ๊ณจ๋ผ trace_id๋กœ ์ •ํ™•ํ•œ ํŠธ๋ ˆ์ด์Šค๋ฅผ ์ฐพ์œผ์„ธ์š”. ๋™์ผํ•œ ์š”์ฒญ์˜ ๋” ๊นŠ์€ ๋กœ๊ทธ(DB, HTTP ํด๋ผ์ด์–ธํŠธ, ์›Œ์ปค)๊ฐ€ ๋™์ผํ•œ ํŠธ๋ ˆ์ด์Šค ์ปจํ…์ŠคํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.
  • ํŠธ๋ ˆ์ด์Šค๋ฅผ ์—ด์–ด ์ค‘์ฒฉ ๊ตฌ์กฐ๋ฅผ ํ™•์ธํ•˜์„ธ์š”: ์ตœ์ƒ๋‹จ์— HTTP ์„œ๋ฒ„ ์ŠคํŒฌ, ๊ทธ ์•„๋ž˜ DB ํ˜ธ์ถœ๊ณผ ์„œ๋“œํŒŒํ‹ฐ API์˜ ์ž์‹ ์ŠคํŒฌ๋“ค์ด ์žˆ๋Š”์ง€. ํ‰ํ‰ํ•œ ๋ชฉ๋ก์ด๋ฉด ์ปจํ…์ŠคํŠธ๊ฐ€ ์†์‹ค๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • API ์š”์ฒญ์—์„œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ํŠธ๋ฆฌ๊ฑฐ(์˜ˆ: ์˜์ˆ˜์ฆ ์ด๋ฉ”์ผ ์ „์†ก)ํ•˜๊ณ  ์›Œ์ปค ์ŠคํŒฌ์ด ์š”์ฒญ์œผ๋กœ ์—ฐ๊ฒฐ๋˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.
  • ๊ธฐ๋ณธ ๋ฉ”ํŠธ๋ฆญ(์š”์ฒญ ์ˆ˜, ์˜ค๋ฅ˜์œจ, ์ง€์—ฐ ํผ์„ผํƒ€์ผ)์„ ํ™•์ธํ•˜๊ณ  ๋ผ์šฐํŠธ๋‚˜ ์ž‘์—…์œผ๋กœ ํ•„ํ„ฐ๋งํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.
  • ์†์„ฑ๊ณผ ๋กœ๊ทธ์—์„œ ์•ˆ์ „์„ฑ์„ ๊ฒ€์‚ฌํ•˜์„ธ์š”: ๋น„๋ฐ€๋ฒˆํ˜ธ, ํ† ํฐ, ์ „์ฒด ์‹ ์šฉ์นด๋“œ ๋ฒˆํ˜ธ, ์›์‹œ ๊ฐœ์ธ์ •๋ณด๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

๊ฐ„๋‹จํ•œ ํ˜„์‹ค ํ…Œ์ŠคํŠธ๋Š” ๊ฒฐ์ œ ์ œ๊ณต์ž๊ฐ€ ์ง€์—ฐ๋  ๋•Œ ๋А๋ฆฐ ์ฒดํฌ์•„์›ƒ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•œ ํŠธ๋ ˆ์ด์Šค์—์„œ ์™ธ๋ถ€ ํ˜ธ์ถœ ์ŠคํŒฌ์ด ๋ช…ํ™•ํžˆ ํ‘œ์‹œ๋˜๊ณ  ์ฒดํฌ์•„์›ƒ ๋ผ์šฐํŠธ์˜ p95 ์ง€์—ฐ์ด ๊ธ‰์ฆํ•˜๋Š” ๋ฉ”ํŠธ๋ฆญ์ด ๋ณด์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ AppMaster๋กœ Go ๋ฐฑ์—”๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋ฉด(์˜ˆ: AppMaster), ์ด ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฆด๋ฆฌ์Šค ๋ฃจํ‹ด์˜ ์ผ๋ถ€๋กœ ๋งŒ๋“ค์–ด ์ƒˆ ์—”๋“œํฌ์ธํŠธ์™€ ์›Œ์ปค๊ฐ€ ์•ฑ ์„ฑ์žฅ์— ๋”ฐ๋ผ ๊ณ„์† ์ถ”์  ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ๋„์›€๋ฉ๋‹ˆ๋‹ค. AppMaster (appmaster.io)๋Š” ์‹ค์ œ Go ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฏ€๋กœ ํ•˜๋‚˜์˜ OpenTelemetry ์„ค์ •์„ ํ‘œ์ค€ํ™”ํ•ด ์„œ๋น„์Šค์™€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์— ๊ฑธ์ณ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์‹œ: ์„œ๋น„์Šค ์ „๋ฐ˜์˜ ๋А๋ฆฐ ์ฒดํฌ์•„์›ƒ ๋””๋ฒ„๊น…

๊ณ ๊ฐ์ด "์ฒดํฌ์•„์›ƒ์ด ๊ฐ€๋” ๋ฉˆ์ถฅ๋‹ˆ๋‹ค"๋ผ๊ณ  ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์žฌํ˜„์ด ์–ด๋ ต๋‹ค๋ฉด Go OpenTelemetry ํŠธ๋ ˆ์ด์‹ฑ์˜ ์ด์ ์ด ๋ฐœํœ˜๋ฉ๋‹ˆ๋‹ค.

๋จผ์ € ๋ฉ”ํŠธ๋ฆญ์œผ๋กœ ๋ฌธ์ œ์˜ ํ˜•ํƒœ๋ฅผ ํŒŒ์•…ํ•˜์„ธ์š”. ์š”์ฒญ๋ฅ , ์˜ค๋ฅ˜์œจ, ์ฒดํฌ์•„์›ƒ ์—”๋“œํฌ์ธํŠธ์˜ p95 ๋˜๋Š” p99 ์ง€์—ฐ์„ ์‚ดํŽด๋ณด์„ธ์š”. ์ง€์—ฐ์ด ์งง์€ ์‹œ๊ฐ„์—๋งŒ ๋ฐœ์ƒํ•˜๊ณ  ์ผ๋ถ€ ์š”์ฒญ์—๋งŒ ์˜ํ–ฅ์„ ์ค€๋‹ค๋ฉด ๋ณดํ†ต ์˜์กด์„ฑ, ํ์ž‰, ์žฌ์‹œ๋„ ๋™์ž‘์ด ์›์ธ์ด์ง€ CPU๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ ๊ฐ™์€ ์‹œ๊ฐ„๋Œ€์˜ ๋А๋ฆฐ ํŠธ๋ ˆ์ด์Šค๋ฅผ ์—ด์–ด๋ณด์„ธ์š”. ํ•˜๋‚˜์˜ ํŠธ๋ ˆ์ด์Šค๋ฉด ์ถฉ๋ถ„ํ•  ๋•Œ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ •์ƒ์ ์ธ ์ฒดํฌ์•„์›ƒ์€ ๋ณดํ†ต 300600ms์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ ์žˆ๋Š” ๊ฒฝ์šฐ 812์ดˆ๊ฐ€ ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„์ด ํ•˜๋‚˜์˜ ์ŠคํŒฌ ๋‚ด๋ถ€์— ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”ํ•œ ํŒจํ„ด์€ ์ด๋ ‡์Šต๋‹ˆ๋‹ค: API ํ•ธ๋“ค๋Ÿฌ๋Š” ๋น ๋ฅด์ง€๋งŒ DB ์ž‘์—…์€ ๋Œ€์ฒด๋กœ ๊ดœ์ฐฎ๊ณ , ๊ฒฐ์ œ ์ œ๊ณต์ž ์ŠคํŒฌ์—์„œ ์žฌ์‹œ๋„๊ฐ€ ๋ฐ˜๋ณต๋˜๋ฉฐ ๋‹ค์šด์ŠคํŠธ๋ฆผ ํ˜ธ์ถœ์ด ์ž ๊ธˆ์ด๋‚˜ ํ ๋’ค์—์„œ ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค. ์‘๋‹ต์ด ์—ฌ์ „ํžˆ 200์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์–ด ์˜ค๋ฅ˜ ๊ธฐ๋ฐ˜ ์•Œ๋ฆผ์€ ์ „ํ˜€ ์šธ๋ฆฌ์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒ๊ด€๋œ ๋กœ๊ทธ๋Š” ์ •ํ™•ํ•œ ๊ฒฝ๋กœ๋ฅผ ํ‰๋ฌธ์œผ๋กœ ์•Œ๋ ค์ค๋‹ˆ๋‹ค: "retrying Stripe charge: timeout" ๋‹ค์Œ์— "db tx aborted: serialization failure", ์ด์–ด์„œ "retry checkout flow" ๊ฐ™์€ ๋กœ๊ทธ๊ฐ€ ๋‚˜์˜ค๋ฉด ์ž‘์€ ๋ฌธ์ œ๋“ค์ด ๊ฒฐํ•ฉํ•ด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋ง๊ฐ€๋œจ๋ฆฌ๊ณ  ์žˆ๋‹ค๋Š” ๋ช…ํ™•ํ•œ ์‹ ํ˜ธ์ž…๋‹ˆ๋‹ค.

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

์‰ฌ์šด ์‹œ์ž‘
๋ฉ‹์ง„๋งŒ๋“ค๊ธฐ

๋ฌด๋ฃŒ ์š”๊ธˆ์ œ๋กœ AppMaster๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”.
์ค€๋น„๊ฐ€ ๋˜๋ฉด ์ ์ ˆํ•œ ๊ตฌ๋…์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•˜๋‹ค
์—”๋“œํˆฌ์—”๋“œ API ๊ฐ€์‹œ์„ฑ์„ ์œ„ํ•œ Go OpenTelemetry ํŠธ๋ ˆ์ด์‹ฑ | AppMaster