์„œ๋น„์Šค ์ถ”์ , OpenTracing ๋ฐ Jaeger

์„œ๋น„์Šค ์ถ”์ , OpenTracing ๋ฐ Jaeger

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

์ˆ˜์ž‘์—…์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ถ”์  ๋„๊ตฌ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ถ”์ ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ด์œ  ๋ฐ ์ถ”์  ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ด ๋ฌธ์„œ์—์„œ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ถ”์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ

  1. ๋‹จ์ผ ์„œ๋น„์Šค ๋‚ด์—์„œ ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ์ฐธ์—ฌ ์„œ๋น„์Šค ์‚ฌ์ด์˜ ์ „์ฒด ์‹คํ–‰ ํŠธ๋ฆฌ์—์„œ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์ฐพ์œผ์‹ญ์‹œ์˜ค. ์˜ˆ๋ฅผ ๋“ค์–ด:
    • ์˜ˆ๋ฅผ ๋“ค์–ด ์ง€์˜ค์ฝ”๋”ฉ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์„œ๋น„์Šค ๊ฐ„ ์งง์€ ์—ฐ์† ํ˜ธ์ถœ์ด ๋งŽ์Šต๋‹ˆ๋‹ค.
    • ๋„คํŠธ์›Œํฌ ์ „์†ก ๋˜๋Š” ๋””์Šคํฌ ์ฝ๊ธฐ์™€ ๊ฐ™์€ ๊ธด I/O ๋Œ€๊ธฐ.
    • ๊ธด ๋ฐ์ดํ„ฐ ๊ตฌ๋ฌธ ๋ถ„์„.
    • CPU๊ฐ€ ํ•„์š”ํ•œ ๊ธด ์ž‘์—….
    • ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š” ๋ฐ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ์ง€์—ฐํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ ์„น์…˜์ž…๋‹ˆ๋‹ค.
  2. ์–ด๋–ค ์ˆœ์„œ๋กœ ๋ฌด์—‡์ด ํ˜ธ์ถœ๋˜๊ณ  ์ž‘์—…์ด ์ˆ˜ํ–‰๋  ๋•Œ ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.
    ์„œ๋น„์Šค ์ถ”์ , OpenTracing ๋ฐ Jaeger
    ์˜ˆ๋ฅผ ๋“ค์–ด Request๊ฐ€ WS ์„œ๋น„์Šค์— ์™”๋‹ค -> WS ์„œ๋น„์Šค๊ฐ€ R ์„œ๋น„์Šค๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค -> ๊ทธ ํ›„ V ์„œ๋น„์Šค์— ์š”์ฒญ์„ ๋ณด๋ƒˆ๋‹ค -> V ์„œ๋น„์Šค๊ฐ€ R ์„œ๋น„์Šค์—์„œ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ–ˆ๋‹ค -> P ์„œ๋น„์Šค๋กœ ๊ฐ”๋‹ค -> P ์„œ๋น„์Šค๊ฐ€ ๋‹ค์‹œ R ์„œ๋น„์Šค๋กœ ๊ฐ”๋‹ค -> V ์„œ๋น„์Šค๊ฐ€ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฌด์‹œํ•˜๊ณ  J ์„œ๋น„์Šค๋กœ ๊ฐ”๋‹ค -> ๊ทธ ๋‹ค์Œ์—๋งŒ WS ์„œ๋น„์Šค์— ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด์„œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋‹ค๋ฅธ ๊ฒƒ์„ ๊ณ„์† ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
    ์ „์ฒด ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•œ ์ด๋Ÿฌํ•œ ์ถ”์ ์ด๋‚˜ ์ž์„ธํ•œ ๋ฌธ์„œ๊ฐ€ ์—†์œผ๋ฉด ์ฝ”๋“œ๋ฅผ ์ฒ˜์Œ ๋ณผ ๋•Œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต๊ณ  ์ฝ”๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ์„œ๋น„์Šค์— ํฉ์–ด์ ธ ์žˆ๊ณ  ๋งŽ์€ ๋นˆ๊ณผ ์ธํ„ฐํŽ˜์ด์Šค ๋’ค์— ์ˆจ๊ฒจ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ํ›„์† ์ง€์—ฐ ๋ถ„์„์„ ์œ„ํ•œ ์‹คํ–‰ ํŠธ๋ฆฌ์— ๋Œ€ํ•œ ์ •๋ณด ์ˆ˜์ง‘. ์‹คํ–‰์˜ ๊ฐ ๋‹จ๊ณ„์—์„œ ์ด ๋‹จ๊ณ„์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ถ”์ ์— ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•œ ๋‹ค์Œ ์œ ์‚ฌํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋กœ ์ด์–ด์ง„ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:
    • ์‚ฌ์šฉ์ž ์•„์ด๋””
    • ๊ถŒ๋ฆฌ
    • ์„ ํƒํ•œ ๋ฐฉ๋ฒ•์˜ ์œ ํ˜•
    • ๋กœ๊ทธ ๋˜๋Š” ์‹คํ–‰ ์˜ค๋ฅ˜
  4. ์ถ”์ ์„ ์ง€ํ‘œ์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์œผ๋กœ ์ „ํ™˜ํ•˜๊ณ  ์ด๋ฏธ ์ง€ํ‘œ ํ˜•ํƒœ๋กœ ์ถ”๊ฐ€ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ์ถ”์ ์„ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๊ฐ„

์ถ”์ ์—๋Š” ๋ฒ”์œ„์˜ ๊ฐœ๋…์ด ์žˆ์œผ๋ฉฐ ์ด๋Š” ์ฝ˜์†”์— ๋Œ€ํ•œ ํ•˜๋‚˜์˜ ๋กœ๊ทธ์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ŠคํŒŒ์—๋Š” ๋‹ค์Œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ด๋ฆ„, ์ผ๋ฐ˜์ ์œผ๋กœ ์‹คํ–‰๋œ ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„
  • ์ŠคํŒฌ์ด ์ƒ์„ฑ๋œ ์„œ๋น„์Šค์˜ ์ด๋ฆ„
  • ์ž์‹ ์˜ ๊ณ ์œ  ID
  • ๋กœ๊ทธ์ธ๋œ ํ‚ค/๊ฐ’ ํ˜•์‹์˜ ์ผ์ข…์˜ ๋ฉ”ํƒ€ ์ •๋ณด์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฉ”์„œ๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์˜ค๋ฅ˜๋กœ ์ข…๋ฃŒ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€
  • ์ด ๊ธฐ๊ฐ„์˜ ์‹œ์ž‘ ๋ฐ ์ข…๋ฃŒ ์‹œ๊ฐ„
  • ์ƒ์œ„ ์ŠคํŒฌ ID

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

์„œ๋น„์Šค ์ถ”์ , OpenTracing ๋ฐ Jaeger

Opentrace, Jagger ๋ฐ ์ด๋ฅผ ํ”„๋กœ์ ํŠธ์— ๊ตฌํ˜„ํ•œ ๋ฐฉ๋ฒ•

๊ณตํ†ต๋œ ๊ธฐ์ค€์ด ์žˆ์Šต๋‹ˆ๋‹ค ์˜คํ”ˆํŠธ๋ ˆ์ด์Šค, ์–ด๋–ค ์–ธ์–ด๋กœ๋“  ํŠน์ • ๊ตฌํ˜„์„ ์ถ”์ ํ•˜์ง€ ์•Š๊ณ  ์ˆ˜์ง‘ํ•ด์•ผ ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋Œ€์ƒ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Java์—์„œ ์ถ”์ ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ž‘์—…์€ ์ผ๋ฐ˜์ ์ธ Opentrace API๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰๋˜๋ฉฐ ์˜ˆ๋ฅผ ๋“ค์–ด Jaeger ๋˜๋Š” ์•„๋ฌด๊ฒƒ๋„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ๋นˆ ๊ธฐ๋ณธ ๊ตฌํ˜„์„ ์ˆจ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๋Š” ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค ์‚ฌ๋ƒฅ๊พผ Opentrace์˜ ๊ตฌํ˜„์œผ๋กœ. ์—ฌ๋Ÿฌ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์„œ๋น„์Šค ์ถ”์ , OpenTracing ๋ฐ Jaeger

  • Jaeger-agent๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ ์‹œ์Šคํ…œ์— ์„ค์น˜๋˜๋Š” ๋กœ์ปฌ ์—์ด์ „ํŠธ์ด๋ฉฐ ์„œ๋น„์Šค๋Š” ๋กœ์ปฌ ๊ธฐ๋ณธ ํฌํŠธ์— ๋กœ๊ทธ์ธ๋ฉ๋‹ˆ๋‹ค. ์—์ด์ „ํŠธ๊ฐ€ ์—†์œผ๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ์ด ์‹œ์Šคํ…œ์˜ ๋ชจ๋“  ์„œ๋น„์Šค ์ถ”์ ์ด ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.
  • Jaeger-collector - ๋ชจ๋“  ์—์ด์ „ํŠธ๊ฐ€ ์ˆ˜์ง‘๋œ ์ถ”์ ์„ ๋ณด๋‚ด๊ณ  ์„ ํƒํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๊ทธ๋“ค์ด ์„ ํ˜ธํ•˜๋Š” cassandra์ด์ง€๋งŒ ์šฐ๋ฆฌ๋Š” elasticsearch๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ๊ตฌํ˜„๊ณผ ๋””์Šคํฌ์— ์•„๋ฌด๊ฒƒ๋„ ์ €์žฅํ•˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ๊ตฌํ˜„์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • Jaeger-query๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ด๋™ํ•˜์—ฌ ๋ถ„์„์„ ์œ„ํ•ด ์ด๋ฏธ ์ˆ˜์ง‘๋œ ํŠธ๋ ˆ์ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.
  • Jaeger-ui๋Š” ์ถ”์ ์„ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๋ณด๊ธฐ ์œ„ํ•œ ์›น ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฉฐ jaeger-query๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

์„œ๋น„์Šค ์ถ”์ , OpenTracing ๋ฐ Jaeger

๋ณ„๋„์˜ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ํŠน์ • ์–ธ์–ด์— ๋Œ€ํ•œ opentrace jaeger ๊ตฌํ˜„์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋ฅผ ํ†ตํ•ด ์ŠคํŒฌ์ด jaeger-agent๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
Java์—์„œ Jagger ์—ฐ๊ฒฐ io.opentracing.Tracer ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์œผ๋กœ ๊ท€๊ฒฐ๋˜๋ฉฐ, ์ดํ›„ ์ด๋ฅผ ํ†ตํ•œ ๋ชจ๋“  ์ถ”์ ์ด ์‹ค์ œ ์—์ด์ „ํŠธ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

์„œ๋น„์Šค ์ถ”์ , OpenTracing ๋ฐ Jaeger

๋˜ํ•œ ์Šคํ”„๋ง ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ฒฝ์šฐ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜คํ”ˆ ํŠธ๋ ˆ์ด์‹ฑ-์Šคํ”„๋ง-ํด๋ผ์šฐ๋“œ-์Šคํƒ€ํ„ฐ Jaeger์˜ ๊ตฌํ˜„ ์˜คํ”ˆ ํŠธ๋ ˆ์ด์‹ฑ-์Šคํ”„๋ง-jaeger-ํด๋ผ์šฐ๋“œ-์Šคํƒ€ํ„ฐ ์ปจํŠธ๋กค๋Ÿฌ์— ๋Œ€ํ•œ http ์š”์ฒญ, jdbc๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์š”์ฒญ ๋“ฑ๊ณผ ๊ฐ™์ด ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ†ต๊ณผํ•˜๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ถ”์ ์„ ์ž๋™์œผ๋กœ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

Java์—์„œ ์ถ”์  ๋กœ๊ทธ์ธ

์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ ์–ด๋”˜๊ฐ€์— ์ฒซ ๋ฒˆ์งธ Span์ด ์ƒ์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์˜ˆ๋ฅผ ๋“ค์–ด ์š”์ฒญ์ด ์ˆ˜์‹ ๋  ๋•Œ ์Šคํ”„๋ง ์ปจํŠธ๋กค๋Ÿฌ์— ์˜ํ•ด ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰๋˜๊ฑฐ๋‚˜ ์š”์ฒญ์ด ์—†๋Š” ๊ฒฝ์šฐ ์ˆ˜๋™์œผ๋กœ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดํ›„ ์•„๋ž˜ Scope๋ฅผ ํ†ตํ•ด ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๊ฐ€ Span์„ ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ Scope์—์„œ ํ˜„์žฌ activeSpan์„ ๊ฐ€์ ธ์™€์„œ ์ƒˆ Span์„ ์ƒ์„ฑํ•˜๊ณ  ๋ถ€๋ชจ๊ฐ€ ๊ฒฐ๊ณผ activeSpan์ด๋ผ๊ณ  ๋งํ•˜๊ณ  ์ƒˆ Span์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ์™ธ๋ถ€ ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ˜„์žฌ ํ™œ์„ฑ ์ŠคํŒฌ์ด ์ „๋‹ฌ๋˜๊ณ  ํ•ด๋‹น ์„œ๋น„์Šค๋Š” ์ด ์ŠคํŒฌ์„ ์ฐธ์กฐํ•˜์—ฌ ์ƒˆ ์ŠคํŒฌ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
๋ชจ๋“  ์ž‘์—…์€ Tracer ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฑฐ์น˜๋ฉฐ DI ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ DI ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ GlobalTracer.get()์„ ์ „์—ญ ๋ณ€์ˆ˜๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ํŠธ๋ ˆ์ด์„œ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ NoopTracer๋Š” ์•„๋ฌด ์ž‘์—…๋„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ ScopeManager๋ฅผ ํ†ตํ•ด ํŠธ๋ ˆ์ด์„œ๋กœ๋ถ€ํ„ฐ ํ˜„์žฌ ์Šค์ฝ”ํ”„๋ฅผ ํš๋“ํ•˜๊ณ , ํ˜„์žฌ ์Šค์ฝ”ํ”„์—์„œ ์ƒˆ ์ŠคํŒฌ์„ ๋ฐ”์ธ๋”ฉํ•˜์—ฌ ์ƒˆ ์Šค์ฝ”ํ”„๋ฅผ ์ƒ์„ฑํ•œ ํ›„ ์ƒ์„ฑ๋œ ์Šค์ฝ”ํ”„๋ฅผ ๋‹ซ๊ณ  ์ƒ์„ฑ๋œ ์ŠคํŒฌ์„ ๋‹ซ๊ณ  ์ด์ „ ์Šค์ฝ”ํ”„๋ฅผ ํ™œ์„ฑ ์ƒํƒœ๋กœ ๋˜๋Œ๋ฆฝ๋‹ˆ๋‹ค. ์Šค์ฝ”ํ”„๋Š” ์Šค๋ ˆ๋“œ์— ๋ฌถ์—ฌ ์žˆ์œผ๋ฏ€๋กœ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹œ ํ™œ์„ฑ ์ŠคํŒฌ์„ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋กœ ์ „์†กํ•˜์—ฌ ์ด ์ŠคํŒฌ์„ ์ฐธ์กฐํ•˜์—ฌ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์˜ ์Šค์ฝ”ํ”„๋ฅผ ์ถ”๊ฐ€๋กœ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋ง์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

io.opentracing.Tracer tracer = ...; // GlobalTracer.get()

void DoSmth () {
   try (Scope scope = tracer.buildSpan("DoSmth").startActive(true)) {
      ...
   }
}
void DoOther () {
    Span span = tracer.buildSpan("someWork").start();
    try (Scope scope = tracer.scopeManager().activate(span, false)) {
        // Do things.
    } catch(Exception ex) {
        Tags.ERROR.set(span, true);
        span.log(Map.of(Fields.EVENT, "error", Fields.ERROR_OBJECT, ex, Fields.MESSAGE, ex.getMessage()));
    } finally {
        span.finish();
    }
}

void DoAsync () {
    try (Scope scope = tracer.buildSpan("ServiceHandlerSpan").startActive(false)) {
        ...
        final Span span = scope.span();
        doAsyncWork(() -> {
            // STEP 2 ABOVE: reactivate the Span in the callback, passing true to
            // startActive() if/when the Span must be finished.
            try (Scope scope = tracer.scopeManager().activate(span, false)) {
                ...
            }
        });
    }
}

๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ฒฝ์šฐ ๋น„๋™๊ธฐ ์ž‘์—…์ด ์‹œ์ž‘๋  ๋•Œ ์ž๋™์œผ๋กœ ํ˜„์žฌ ๋ฒ”์œ„๋ฅผ ์Šค๋ ˆ๋“œ๋กœ ์ „๋‹ฌํ•˜๋Š” TracedExecutorService ๋ฐ ์œ ์‚ฌํ•œ ๋ž˜ํผ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

private ExecutorService executor = new TracedExecutorService(
    Executors.newFixedThreadPool(10), GlobalTracer.get()
);

์™ธ๋ถ€ http ์š”์ฒญ์˜ ๊ฒฝ์šฐ HttpClient ์ถ”์ 

HttpClient httpClient = new TracingHttpClientBuilder().build();

์šฐ๋ฆฌ๊ฐ€ ์ง๋ฉดํ•œ ๋ฌธ์ œ

  • ์„œ๋น„์Šค ๋˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ์ถ”์  ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด Bean ๋ฐ DI๊ฐ€ ํ•ญ์ƒ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ž๋™ ์œ ์„  Tracer๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ GlobalTracer.get()์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฃผ์„์€ ๊ตฌ์„ฑ ์š”์†Œ ๋˜๋Š” ์„œ๋น„์Šค๊ฐ€ ์•„๋‹ˆ๊ฑฐ๋‚˜ ๋™์ผํ•œ ํด๋ž˜์Šค์˜ ์ธ์ ‘ ๋ฉ”์„œ๋“œ์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. @Traced๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฌด์—‡์ด ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์ˆ˜๋™ ์ถ”์  ์ƒ์„ฑ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Java ์ฃผ์„์„ ์œ„ํ•œ ์ถ”๊ฐ€ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ชจ๋“  ๊ณณ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด์ „ ์Šคํ”„๋ง ๋ฐ ์Šคํ”„๋ง ๋ถ€ํŠธ์—์„œ DI์˜ ๋ฒ„๊ทธ๋กœ ์ธํ•ด opentraing ์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ ์ž๋™ ๊ตฌ์„ฑ์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์Šคํ”„๋ง ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ถ”์ ์ด ์ž๋™์œผ๋กœ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์œ ์ถ”ํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. github.com/opentracing-contrib/java-spring-jaeger/blob/master/opentracing-spring-jaeger-starter/src/main/java/io/opentracing/contrib/java/spring/jaeger/starter/JaegerAutoConfiguration.java
  • ์ž์› ์‹œ๋„๋Š” Groovy์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ try finally๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ ์„œ๋น„์Šค์—๋Š” ์ถ”์ ์ด ๊ธฐ๋ก๋  ์ž์ฒด spring.application.name์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•จ๊ป˜ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๋„๋ก ํŒ๋งค ๋ฐ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ ๋ณ„๋„์˜ ์ด๋ฆ„์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
  • GlobalTracer์™€ tomcat์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด tomcat์—์„œ ์‹คํ–‰๋˜๋Š” ๋ชจ๋“  ์„œ๋น„์Šค์—๋Š” ํ•˜๋‚˜์˜ GlobalTracer๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋ชจ๋‘ ๋™์ผํ•œ ์„œ๋น„์Šค ์ด๋ฆ„์„ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฉ”์„œ๋“œ์— ์ถ”์ ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ๋ฃจํ”„์—์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ž‘์—… ์‹œ๊ฐ„์„ ๋ณด์žฅํ•˜๋Š” ๋ชจ๋“  ํ†ตํ™”์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ๊ณตํ†ต ์ถ”์ ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ดˆ๊ณผ ๋ถ€ํ•˜๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ๊ฑฐ์˜ ํ•œ ๋ฒˆ์€ ๋„ˆ๋ฌด ๋งŽ์€ ์ถ”์ ์„ ๋„ˆ๋ฌด ๋งŽ์ด ์š”์ฒญํ–ˆ๊ณ  ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์‹œ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ jaeger-query๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์žก์•„๋จน๊ณ  ํƒ„์„ฑ์„ ๋Šฆ์ถ”๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. jaeger-query๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜์—ฌ ๋„์›€์„ ๋ฐ›์Œ

ํŠธ๋ ˆ์ด์Šค ์ƒ˜ํ”Œ๋ง, ์ €์žฅ ๋ฐ ๋ณด๊ธฐ

์„ธ ๊ฐ€์ง€ ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค ์ƒ˜ํ”Œ๋ง ํŠธ๋ ˆ์ด์Šค:

  1. ๋ชจ๋“  ์ถ”์ ์„ ๋ณด๋‚ด๊ณ  ์ €์žฅํ•˜๋Š” Const.
  2. ์ฃผ์–ด์ง„ ํ™•๋ฅ ๋กœ ํŠธ๋ ˆ์ด์Šค๋ฅผ ํ•„ํ„ฐ๋งํ•˜๋Š” ํ™•๋ฅ ์ ์ž…๋‹ˆ๋‹ค.
  3. ์ดˆ๋‹น ์ถ”์  ์ˆ˜๋ฅผ ์ œํ•œํ•˜๋Š” ์†๋„ ์ œํ•œ. jaeger-agent ๋˜๋Š” ์ˆ˜์ง‘๊ธฐ์˜ ํด๋ผ์ด์–ธํŠธ์—์„œ ์ด๋Ÿฌํ•œ ์„ค์ •์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์š”์ฒญ์ด ๋งŽ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ‰๊ฐ€์ž ์Šคํƒ์—์„œ const 1์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ์ด๊ฒƒ์ด ์‹œ์Šคํ…œ์— ๊ณผ๋„ํ•œ ๋ถ€ํ•˜๋ฅผ ์ค„ ๊ฒฝ์šฐ ์ด๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

cassandra๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ XNUMX์ผ ๋™์•ˆ๋งŒ ์ถ”์ ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค ํƒ„์„ฑ ๊ฒ€์ƒ‰ ์ถ”์ ์€ ํ•ญ์ƒ ์ €์žฅ๋˜๋ฉฐ ์‚ญ์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งค์ผ ๋ณ„๋„์˜ ์ธ๋ฑ์Šค๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค(์˜ˆ: jaeger-service-2019-03-04). ์•ž์œผ๋กœ๋Š” ์ด์ „ ์ถ”์ ์˜ ์ž๋™ ์ •๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ถ”์ ์„ ๋ณด๋ ค๋ฉด ๋‹ค์Œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • ์ถ”์ ์„ ํ•„ํ„ฐ๋งํ•  ์„œ๋น„์Šค๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: tomcat์—์„œ ์‹คํ–‰ ์ค‘์ด๊ณ  ์ž์ฒด ์ด๋ฆ„์„ ๊ฐ€์งˆ ์ˆ˜ ์—†๋Š” ์„œ๋น„์Šค์˜ ๊ฒฝ์šฐ tomcat7-default).
  • ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ธด ์‹คํ–‰๋งŒ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ์ž‘์—…, ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ ๋ฐ ์ตœ์†Œ ์ž‘์—… ์‹œ๊ฐ„(์˜ˆ: 10์ดˆ)์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    ์„œ๋น„์Šค ์ถ”์ , OpenTracing ๋ฐ Jaeger
  • ํ”์  ์ค‘ ํ•˜๋‚˜๋กœ ์ด๋™ํ•˜์—ฌ ์†๋„๊ฐ€ ๋Š๋ ค์ง€๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
    ์„œ๋น„์Šค ์ถ”์ , OpenTracing ๋ฐ Jaeger

๋˜ํ•œ ์–ด๋–ค request id๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ์ด id๊ฐ€ trace span์— ๊ธฐ๋ก๋˜์–ด ์žˆ๋‹ค๋ฉด ํƒœ๊ทธ ๊ฒ€์ƒ‰์„ ํ†ตํ•ด ์ด id๋กœ trace๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ะ”ะพะบัƒะผะตะฝั‚ะฐั†ะธั

์กฐํ•ญ

๋น„๋””์˜ค

  • www.youtube.com/watch?v=qg0ENOdP1Lo Jaeger์™€ Prometheus๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒˆ๊ฐœ์ฒ˜๋Ÿผ ๋น ๋ฅธ ์‚ฌ์šฉ์ž ์ฟผ๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ• โ€” Bryan Boreham
  • www.youtube.com/watch?v=WRntQsUajow ์†Œ๊ฐœ: Jaeger - Yuri Shkuro, Uber & Pavol Loffay, Red Hat
  • www.youtube.com/watch?v=fsHb0qK37bc Serghei Iakovlev, "ํฐ ์Šน๋ฆฌ์˜ ์ž‘์€ ์ด์•ผ๊ธฐ: OpenTracing, AWS ๋ฐ Jaeger"

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€