Experiment Metrics KO - k-p2p-lab/kpl-v3 GitHub Wiki

์‹คํ—˜ ์ง€ํ‘œ ์ •์˜

Wiki home โ€บ ํ•œ๊ตญ์–ด ๋ฌธ์„œ ยท ์˜์–ด ์›๋ฌธ

๋ฌธ์„œ ์•ˆ๋‚ด ยท ์†Œ์Šค ์ €์žฅ์†Œ

์ด ๊ฐ€์ด๋“œ๋Š” v3๊ฐ€ ๊ตฌํ˜„ํ•œ ๊ณ„์‚ฐ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์ธ Metricsยท์ €์žฅ ์—ฐ๊ตฌ ๊ทธ๋ฆผยท๋Œ€์—ญํญ์€ ์•„๋ž˜์—์„œ ๊ตฌ๋ถ„ํ•œ ์ •์˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ๊ณตํ†ต ์—ฐ๊ตฌ ๋ฐฐ๊ฒฝ์€ ์—ฐ๊ตฌ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค. Grafana๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง, ๋‚ด๋ณด๋‚ด๊ธฐยท๋ณด์กดยท์‚ญ์ œ๋Š” ์ €์žฅ ๊ฒฐ๊ณผ์—์„œ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

Churn ๋„๋‹ฌ๋ฅ : session-window-v1

์ฃผ ์ง€ํ‘œ์˜ ์งˆ๋ฌธ์€ **๊ณ ์ • ์ˆ˜์‹  ๊ธฐ๊ฐ„ ์ „์ฒด์— ๊ฑธ์ณ ๊ณ„์† ๊ตฌ๋…ํ•œ ์›๊ฒฉ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ธ์…˜ ์ค‘ ๋ช‡ ๊ฐœ๊ฐ€ ๋งˆ๊ฐ ์ „์— ์ˆ˜์‹ ํ–ˆ๋Š”๊ฐ€?**์ž…๋‹ˆ๋‹ค. ์ง€์† ๊ตฌ๋…์„ ์กฐ๊ฑด์œผ๋กœ ํ•˜๋ฏ€๋กœ ์ตœ์ดˆ ๋Œ€์ƒ ๋ชจ๋‘๊ฐ€ churn์„ ๊ฒฌ๋””๊ณ  ์ˆ˜์‹ ํ•  ํ™•๋ฅ ๊ณผ๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋ฐœํ–‰ ์‹œ์  ๋Œ€์ƒ ๋„๋‹ฌ๋ฅ , ์•ˆ์ • ์„ธ์…˜ coverage, ๊ด€์ธก ํ’ˆ์งˆ์„ ํ•จ๊ป˜ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๊ด€์ธก ๋‹จ์œ„๋Š” (run, topic, message, ์ˆ˜์‹  ์„ธ์…˜) ์Œ์ž…๋‹ˆ๋‹ค. ๊ฐ™์€ node ID๋ฅผ ์žฌ์‚ฌ์šฉํ•ด๋„ ํ”„๋กœ์„ธ์Šค ์žฌ์‹œ์ž‘์€ ์ƒˆ ์„ธ์…˜์ž…๋‹ˆ๋‹ค. ์„ฑ๊ณต ๋ฐœํ–‰์˜ publish ์ด๋ฒคํŠธ๊ฐ€ ์ˆ˜์ง‘๋œ ๋ฉ”์‹œ์ง€๋งŒ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ ์‹คํŒจ๋Š” ์ž‘์—… ์‹คํŒจ์ด๋ฉฐ, RPC ์‘๋‹ต์ด ๋ถˆ๋ช…ํ™•ํ•ด๋„ ์‹ค์ œ ๋ฐœํ–‰ ํ›„ telemetry๊ฐ€ ๋„์ฐฉํ–ˆ๋‹ค๋ฉด ์„ฑ๊ณต ๋ฐœํ–‰์„ ๊ด€์ธกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณ ์ • ๊ธฐ๊ฐ„๊ณผ ๊ตฌ๋… ์ฆ๊ฑฐ

publish phase์˜ deliveryWindow๋Š” 0๋ณด๋‹ค ํฌ๊ณ  1์‹œ๊ฐ„ ์ดํ•˜์ธ Go duration์ด๋ฉฐ ๊ธฐ๋ณธ๊ฐ’์€ 10s์ž…๋‹ˆ๋‹ค. ์‹คํ—˜ ์ „์— ์ง€์ •ํ•˜๊ณ  ๋น„๊ตํ•˜๋Š” ์‹คํ—˜์—๋Š” ๊ฐ™์€ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

t๋Š” ๋ฐœํ–‰์ž๊ฐ€ ๋กœ์ปฌ ๋ฐœํ–‰ ์ž ๊ธˆ์„ ํš๋“ํ•œ ๋’ค payload๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ธ์ฝ”๋”ฉํ•˜๊ธฐ ์ „์— ์ธก์ •ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ๊ฐ์ž…๋‹ˆ๋‹ค. Peer๋Š” Topic.Publish๊ฐ€ ์„ฑ๊ณตํ•œ ๋’ค์—๋งŒ ์ด ์‹œ๊ฐ์˜ publish ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๋งˆ๊ฐ์€ d = t + deliveryWindow์ด๋ฏ€๋กœ payload ์ค€๋น„์™€ ๋กœ์ปฌ PubSub ์ฒ˜๋ฆฌ ์‹œ๊ฐ„๋„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. Controller ์š”์ฒญ ์‹œ๊ฐ์ด๋‚˜ ํ˜„์žฌ ํ™”๋ฉด์˜ Peer ์ˆ˜๋กœ ๋Œ€์ƒ์„ ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Peer๋Š” ์‹ค์ œ ๊ตฌ๋… ์„ค์ •์„ ์™„๋ฃŒํ•œ ๋’ค measurement_start์— sessionId์™€ ์ •ํ™•ํ•œ fields.subscribedTopics๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค์—์„œ 2์ดˆ๋งˆ๋‹ค measurement_checkpoint๋ฅผ ๋ณด๋‚ด๋ฉฐ ์ •์ƒ์ ์ธ ์„ธ์…˜ ์ข…๋ฃŒ ๋•Œ measurement_stop์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ณ„์ธก๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ธ์…˜์˜ ์ฆ๊ฑฐ์ด๋ฉฐ ๋ฌผ๋ฆฌ์  uptime์„ ์ธก์ •ํ•˜๋Š” ์žฅ์น˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. checkpoint ์ฃผ๊ธฐ๋Š” ์ˆ˜์‹  ๋งˆ๊ฐ์˜ ์œ ์˜ˆ ์‹œ๊ฐ„์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋ฉ”์‹œ์ง€๋งˆ๋‹ค ๋™์ผ runยทtopic์˜ ๊ธฐ๋ก๋œ ์„ธ์…˜์—์„œ ๋ฐœํ–‰์ž๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋‹ค์Œ ์ง‘ํ•ฉ์„ ์žฌ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • ํ™•์ธ๋œ ๋ฐœํ–‰ ์‹œ์  ๋Œ€์ƒ K: t ์ด์ „ ๋˜๋Š” ๊ฐ™์€ ์‹œ๊ฐ์— ๊ตฌ๋…์„ ์‹œ์ž‘ํ•˜๊ณ , checkpoint ๋˜๋Š” stop์ด ๋™์ผ ์„ธ์…˜์˜ t๊นŒ์ง€ ์ง€์†์„ ์ฆ๋ช…ํ•ฉ๋‹ˆ๋‹ค. t ์ดํ›„ ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜ t ์ด์ „ยท๊ฐ™์€ ์‹œ๊ฐ์— ์ข…๋ฃŒ๊ฐ€ ํ™•์ธ๋œ ์„ธ์…˜์€ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.
  • ์•ˆ์ • ๋Œ€์ƒ S: K ์ค‘ d ์ดํ›„ ๋˜๋Š” ๊ฐ™์€ ์‹œ๊ฐ์˜ checkpoint/stop์ด ์žˆ์œผ๋ฉฐ d ์ „์—๋Š” ๊ตฌ๋… ์„ธ์…˜์ด ์ข…๋ฃŒ๋˜์ง€ ์•Š์€ ๋Œ€์ƒ์ž…๋‹ˆ๋‹ค.
  • ์ดํƒˆ D: K ์ค‘ d ์ „์— stop์ด ๊ธฐ๋ก๋œ ์„ธ์…˜์ž…๋‹ˆ๋‹ค. ๋– ๋‚˜๊ธฐ ์ „์— ์ˆ˜์‹ ํ–ˆ๋”๋ผ๋„ ์•ˆ์ • ๋Œ€์ƒ์˜ ๋ถ„์ž์™€ ๋ถ„๋ชจ์—์„œ ๋ชจ๋‘ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ํ™•์ธ๋œ ๋ฐœํ–‰ ์‹œ์  ๋Œ€์ƒ์—๋Š” ๋‚จ์Šต๋‹ˆ๋‹ค.
  • ์ง€์† ์—ฌ๋ถ€ ๋ถˆ๋ช… C: K์— ์†ํ•˜์ง€๋งŒ d ์ „ ์ดํƒˆ๊ณผ d๊นŒ์ง€์˜ ์ง€์† ์–ด๋А ์ชฝ๋„ ๋กœ๊ทธ๋กœ ์ฆ๋ช…ํ•˜์ง€ ๋ชปํ•œ ๋Œ€์ƒ์ž…๋‹ˆ๋‹ค.
  • ๋ฐœํ–‰ ์‹œ์  ๊ฐ€์šฉ์„ฑ ๋ถˆ๋ช…: t ์ „์— ์‹œ์ž‘ํ•œ ํ›„๋ณด ์„ธ์…˜์ด์ง€๋งŒ t์—๋„ ์กด์žฌํ–ˆ๋Š”์ง€ ๊ธฐ๋ก์œผ๋กœ ์ฆ๋ช…ํ•˜์ง€ ๋ชปํ•œ ๋Œ€์ƒ์ž…๋‹ˆ๋‹ค. K ๋ฐ–์— ๋‘๊ณ  ๊ด€์ธก ํ’ˆ์งˆ๋กœ ๋ณ„๋„ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค.

ํ™•์ธ๋œ ๋ฐœํ–‰ ์‹œ์  ์Œ์—๋Š” ์œ„ ์„ธ ๊ฐ€์ง€ ์ง€์† ๊ฒฐ๊ณผ ์ค‘ ์ •ํ™•ํžˆ ํ•˜๋‚˜๊ฐ€ ๋Œ€์‘ํ•˜๋ฏ€๋กœ K = S + D + C๊ฐ€ ์„ฑ๋ฆฝํ•ฉ๋‹ˆ๋‹ค. ๊ฐ•์ œ ์ข…๋ฃŒ๋Š” ๋‘ ์ข…๋ฅ˜์˜ ๋ถˆ๋ช… ๊ผฌ๋ฆฌ ๊ตฌ๊ฐ„์„ ๋‚จ๊ธธ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ์ดํƒˆ์ด๋‚˜ ์ˆ˜์‹  ์‹คํŒจ๋กœ ์ž๋™ ๋ถ„๋ฅ˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Agent๋Š” ํ”„๋กœ์„ธ์Šคยท์ปจํ…Œ์ด๋„ˆ ์ข…๋ฃŒ๋ฅผ ํ™•์ธํ•˜๋ฉด measurement_terminated๋„ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Controller๋Š” ์ด Agent ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์„ ๋•Œ Agent ํ˜ธ์ŠคํŠธ์˜ ์‹œ๊ฐ์„ Controller ์ˆ˜์‹  ์‹œ๊ฐ์œผ๋กœ ๋ฐ”๊พธ๊ณ  ์›๋ž˜ ๊ฐ’์€ fields.sourceTimestamp์— ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค. ์ด ์ˆ˜์‹  ์‹œ๊ฐ์€ ํ˜ธ์ŠคํŠธ ๊ฐ„ ๋น„๊ต ๊ฐ€๋Šฅํ•œ ์ข…๋ฃŒ ์‹œ๊ฐ์˜ ์ƒํ•œ์ด๋ฉฐ ์ •ํ™•ํ•œ ์‚ฌ๋ง ์‹œ๊ฐ์ด๋‚˜ ์ˆ˜์‹  checkpoint๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ฐœํ–‰ ์ „ ์ข…๋ฃŒ๊ฐ€ ํ™•์‹คํ•œ ์„ธ์…˜์„ ์ œ์™ธํ•˜๊ฑฐ๋‚˜, ๋ณ„๋„ Peer checkpoint๋กœ ๋ฐœํ–‰ ์‹œ ์ƒ์กด์ด ์ด๋ฏธ ์ฆ๋ช…๋œ ๊ฒฝ์šฐ ๋งˆ๊ฐ ์ „ ์ดํƒˆ์„ ํ™•์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถˆ๋ช… ๊ผฌ๋ฆฌ ๊ตฌ๊ฐ„์ด ๋งˆ๊ฐ๊นŒ์ง€ ์‚ด์•„ ์žˆ์—ˆ์Œ์„ ์ฆ๋ช…ํ•˜์ง€๋Š” ๋ชปํ•ฉ๋‹ˆ๋‹ค. Docker churn์€ ๊ฐ•์ œ ์ œ๊ฑฐ๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ ๊ฐ•์ œ ์ข…๋ฃŒ๋Š” Peer์˜ ์ •์ƒ ์ข…๋ฃŒ telemetry drain์„ ์‹คํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Transport ๋‹จ์ ˆ, GRAFT/PRUNE, mesh ์ œ๊ฑฐ, ์˜ค๋ž˜๋œ inventory, offline Agent๋Š” ๊ตฌ๋… ์„ธ์…˜์˜ stop ์ฆ๊ฑฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํ† ํด๋กœ์ง€์—์„œ ์›์„ ์ง€์›Œ๋„ ์ง€ํ‘œ๊ฐ€ ์ข‹์•„์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ดํ›„ ๋„์ฐฉํ•œ ๋™์ผ ์„ธ์…˜์˜ ์ฆ๊ฑฐ๋Š” ์ด์ „์˜ ๋ถˆ๋ช… ๋ถ„๋ฅ˜๋ฅผ ์ •์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ๋… ๊ธฐ๊ฐ„์€ [t, d)์ž…๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ d์—์„œ ์ข…๋ฃŒํ•œ ์„ธ์…˜์€ ํ•ด๋‹น ๊ธฐ๊ฐ„ ๋™์•ˆ ๊ณ„์† ๊ตฌ๋…ํ•œ ๊ฒƒ์œผ๋กœ ๋ณด๊ณ , ์ •ํ™•ํžˆ d์— ์ˆ˜์‹ ํ•œ ๋ฉ”์‹œ์ง€๋Š” ๊ธฐํ•œ ๋‚ด ์„ฑ๊ณต์ž…๋‹ˆ๋‹ค. t์—์„œ ์ด๋ฏธ ์ข…๋ฃŒํ•œ ์„ธ์…˜์€ ๋ฐœํ–‰ ๋‹น์‹œ ๋Œ€์ƒ์—์„œ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๊ฐ„ ์™„๋ฃŒ, ์ˆ˜์‹ , ๊ด€์ธก ๋ถˆ๋ช…

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

Peer ์ด๋ฒคํŠธ์—๋Š” ์›๋ณธ sessionId, ์ฆ๊ฐ€ํ•˜๋Š” sequence, ์žฌ์‹œ๋„์—๋„ ์œ ์ง€๋˜๋Š” eventId๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜์‹  ๊ธฐ๋ก์ด ์—†์„ ๋•Œ๋Š” measurement_start๋ถ€ํ„ฐ ํ•ด๋‹น ๊ธฐ๊ฐ„์„ ๋ฎ๋Š” ์„ธ์…˜ ์ฆ๊ฑฐ๊นŒ์ง€ ์›๋ณธ sequence prefix๊ฐ€ ์—ฐ์†์ธ ๊ฒฝ์šฐ์—๋งŒ ํ™•์ธ๋œ ๋ฏธ๋„๋‹ฌ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ค‘๊ฐ„ ๋ฒˆํ˜ธ ๋ˆ„๋ฝ์ด๋‚˜ ์ž˜๋ชป๋œ ์‹œ๊ฐ ์ˆœ์„œ๊ฐ€ ์žˆ์œผ๋ฉด ์ˆ˜์‹  ์—ฌ๋ถ€๋Š” unknown์ž…๋‹ˆ๋‹ค. ์žฌ์‹œ๋„๋กœ ๊ฐ„๊ฒฉ์ด ์ฑ„์›Œ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆ๊ฐ ๊ฒฝ๊ณผ๋Š” telemetry ์ˆ˜์ง‘ ์™„๋ฃŒ๋ฅผ ๋œปํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ™•์ • ์ง‘๊ณ„๋„ ๋Šฆ์€ ๋ฐฐ์น˜๋กœ ์ •์ •๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ™•์ธ๋œ ์•ˆ์ • ์Œ ์ˆ˜๋ฅผ S, ๊ธฐํ•œ ๋‚ด ์„ฑ๊ณต์„ R, ์ˆ˜์‹  ์—ฌ๋ถ€ ๋ถˆ๋ช…์„ U, ํ™•์ธ๋œ ๋ฏธ๋„๋‹ฌ์„ F๋ผ ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

S = R + U + F
์•ˆ์ • ๋Œ€์ƒ ๋„๋‹ฌ๋ฅ  ํ•˜ํ•œ = R / S
์•ˆ์ • ๋Œ€์ƒ ๋„๋‹ฌ๋ฅ  ์ƒํ•œ = (R + U) / S

U๊ฐ€ 0์ด๋ฉด ์ƒยทํ•˜ํ•œ์ด ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ˆ„๋ฝ๋œ ๊ด€์ธก์œผ๋กœ๋ถ€ํ„ฐ ๊ณ„์‚ฐํ•œ ๋…ผ๋ฆฌ์  ๋ฒ”์œ„์ด๋ฉฐ ํ†ต๊ณ„์  ์‹ ๋ขฐ๊ตฌ๊ฐ„์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ถ„๋ชจ๊ฐ€ 0์ด๋ฉด N/A์ž…๋‹ˆ๋‹ค. ๋น„์œจ์„ ๋†’์ด๋ ค๊ณ  unknown์„ ๋ถ„๋ชจ์—์„œ ์ œ๊ฑฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ€์šฉ์„ฑ ๋ถˆ๋ช…์€ ๋ณ„๊ฐœ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ด ๋ฒ”์œ„๋Š” ํ™•์ธ๋œ ์•ˆ์ • ์„ธ์…˜์— ๋Œ€ํ•œ ๊ฐ’์ด๋ฉฐ ๋ฏธ์ง€์˜ ์ „์ฒด ๋ชจ์ง‘๋‹จ๊นŒ์ง€ ์„ค๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

lateDeliveries๋Š” ๊ธฐํ•œ ๋‚ด ์„ฑ๊ณต์ด ์—†๋Š” ์•ˆ์ • ์Œ์˜ ๋ณ„๋„ ์ง„๋‹จ๊ฐ’์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ์Œ์€ ๊ด€์ธก ์™„์ „์„ฑ์— ๋”ฐ๋ผ ํ™•์ธ๋œ ๋ฏธ๋„๋‹ฌ์ด๋‚˜ ์ˆ˜์‹  ๋ถˆ๋ช… ์ค‘ ํ•˜๋‚˜์— ์ด๋ฏธ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. S = R + U + F์— late๋ฅผ ๋„ค ๋ฒˆ์งธ ๊ฒฐ๊ณผ๋กœ ๋”ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

ํ™•์ธ๋œ ๋ฐœํ–‰ ์‹œ์  ๋Œ€์ƒ ๋„๋‹ฌ๋ฅ ์€ ์ดํƒˆ๊ณผ ์ง€์† ์—ฌ๋ถ€ ๋ถˆ๋ช… ์Œ์„ ๋ถ„๋ชจ์— ์œ ์ง€ํ•˜๋ฉฐ ์ดํƒˆ ์„ธ์…˜์˜ ๊ธฐํ•œ ๋‚ด ์ˆ˜์‹ ๋„ ๋ถ„์ž์— ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. K์˜ ๊ธฐํ•œ ๋‚ด ์„ฑ๊ณต์„ Rk, ์ˆ˜์‹  ์—ฌ๋ถ€ ๋ถˆ๋ช…์„ Uk๋ผ ํ•˜๋ฉด ํ‘œ์‹œ ๋ฒ”์œ„๋Š” Rk / K๋ถ€ํ„ฐ (Rk + Uk) / K๊นŒ์ง€์ž…๋‹ˆ๋‹ค.

์•ˆ์ • coverage๋„ ๋‹ค์Œ ๋…ผ๋ฆฌ์  ๋ฒ”์œ„๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

์•ˆ์ • coverage ํ•˜ํ•œ = S / K
์•ˆ์ • coverage ์ƒํ•œ = (S + C) / K

๋‘ ๋ณด์กฐ ์ง€ํ‘œ๋Š” K > 0์ด๋ฉด ์ œ๊ณตํ•˜๋ฉฐ, ํ™•์ธ๋œ ๋ฐœํ–‰ ์‹œ์  ๋Œ€์ƒ์ด ํ•˜๋‚˜๋„ ์—†์„ ๋•Œ๋งŒ N/A์ž…๋‹ˆ๋‹ค. ๋ฐœํ–‰ ์‹œ์  ๊ฐ€์šฉ์„ฑ ๋ถˆ๋ช… ์Œ์€ K ๋ฐ–์— ๋‘๊ณ  measurementIncomplete์™€ ํ•จ๊ป˜ ๊ด€์ธก ํ’ˆ์งˆ ๊ฒฝ๊ณ ๋กœ ๊ณ„์† ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ’๋“ค์ด 0์ด ์•„๋‹ˆ์–ด๋„ ํ™•๋ณดํ•œ ์ฆ๊ฑฐ์˜ ๊ฒฐ๊ณผ๋ฅผ ์ˆจ๊ธฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฒ”์œ„๋Š” ํ™•์ธ๋œ ์ง‘๋‹จ์„ ์กฐ๊ฑด์œผ๋กœ ํ•˜๋ฉฐ ๋ณด์ด์ง€ ์•Š๋Š” ๋ชจ์ง‘๋‹จ ์ „์ฒด๋ฅผ ์„ค๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ด€์ธก๋œ sequence stream์˜ ์ธก์ • ๋ฒ”์œ„๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์—†์œผ๋ฉด measurementIncomplete๋ฅผ ์„ค์ •ํ•˜์ง€๋งŒ, ์•„์˜ˆ ๊ด€์ธก๋˜์ง€ ์•Š์€ ์„ธ์…˜์ด๋‚˜ stream์€ ์ˆ˜์‹  ๋กœ๊ทธ๋งŒ์œผ๋กœ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ false๋„ ์‹ค์ œ ๋ชจ๋“  Peer๋ฅผ ๋น ์ง์—†์ด ์ธก์ •ํ–ˆ๋‹ค๋Š” ์ฆ๋ช…์€ ์•„๋‹™๋‹ˆ๋‹ค.

metrics.json์—์„œ publicationAvailabilityUnknownPairs๋Š” K ๋ฐ–์˜ ํ›„๋ณด ์ˆ˜, continuityUnknownPairs๋Š” C, stableCoverage๋Š” ํ•˜ํ•œ, stableCoverageUpperBound๋Š” ์ƒํ•œ์ž…๋‹ˆ๋‹ค. ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด availabilityUnknownPairs๋Š” ๋‘ unknown ๋ฒ”์ฃผ์˜ ํ•ฉ๊ณ„๋ฅผ ๊ณ„์† ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

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

์˜ˆ๋ฅผ ๋“ค์–ด ์ฒ˜์Œ ๊ตฌ๋…์ž 10๋ช…์˜ ๊ธฐ๋ก์„ ๋ชจ๋‘ ํ™•๋ณดํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งˆ๊ฐ ์ „์— 2๋ช…์ด ๋– ๋‚ฌ๊ณ  ๊ทธ์ค‘ 1๋ช…์€ ๋– ๋‚˜๊ธฐ ์ „์— ์ˆ˜์‹ ํ–ˆ์Šต๋‹ˆ๋‹ค. 8๋ช…์€ ๊ธฐ๊ฐ„ ๋‚ด๋‚ด ๊ตฌ๋…ํ–ˆ๊ณ  ์ด ์ค‘ 7๋ช…์ด ์ œ๋•Œ ์ˆ˜์‹ ํ–ˆ์Šต๋‹ˆ๋‹ค. telemetry๊ฐ€ ์™„์ „ํ•˜๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์•ˆ์ • ๋Œ€์ƒ ์กฐ๊ฑด๋ถ€ ๋„๋‹ฌ๋ฅ  = 7 / 8 = 87.5%
๋ฐœํ–‰ ์‹œ์  ๋Œ€์ƒ ๋„๋‹ฌ๋ฅ    = 8 / 10 = 80%
์•ˆ์ • coverage          = 8 / 10 = 80%

์ผ์ฐ ์ˆ˜์‹ ํ•œ ์ดํƒˆ์ž๋„ ์•ˆ์ • ๋Œ€์ƒ์˜ ๋ถ„์ž์™€ ๋ถ„๋ชจ์—์„œ ํ•จ๊ป˜ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์„ฑ๊ณต๋งŒ ๋‚จ๊ธฐ๊ณ  ์ˆ˜์‹ ํ•˜์ง€ ๋ชปํ•œ ์ดํƒˆ์ž๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ๋Œ€์ƒ ์ž๊ฒฉ์ด ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

์ง‘๊ณ„๋Š” ์ˆ˜์‹  ๋Œ€์ƒ ์Œ ๊ฐ€์ค‘์ž…๋‹ˆ๋‹ค. ๊ธฐ๊ฐ„์ด ์ง€๋‚œ ๋ฉ”์‹œ์ง€๋“ค์˜ ์„ฑ๊ณต ์ˆ˜์™€ ๋Œ€์ƒ ์ˆ˜๋ฅผ ๊ฐ๊ฐ ํ•ฉํ•œ ๋’ค ๋‚˜๋ˆ„๋ฉฐ ๋ฉ”์‹œ์ง€๋ณ„ ๋ฐฑ๋ถ„์œจ์„ ๋‹จ์ˆœ ํ‰๊ท ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์ƒ 1๋ช… ์ค‘ 1๋ช… ์„ฑ๊ณต, ๋‹ค์Œ ๋ฉ”์‹œ์ง€๋Š” 3๋ช… ์ค‘ 1๋ช… ์„ฑ๊ณต์ด๋ฉด 2 / 4 = 50%์ด๋ฉฐ 66.7%๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ˆ˜์‹  ๊ธฐ๊ฐ„์„ ๋ฐ”๊พธ๋ฉด ๊ธฐํ•œ ๋‚ด ์„ฑ๊ณต๋ฟ ์•„๋‹ˆ๋ผ ๋๊นŒ์ง€ ๋‚จ๋Š” ์ง‘๋‹จ๋„ ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ ๊ฐ™์€ ๊ธฐ๊ฐ„์„ ๋น„๊ตํ•˜๊ณ  coverage๋ฅผ ๋ณ‘๊ธฐํ•˜์‹ญ์‹œ์˜ค.

์‹œ๊ณ„์™€ ์ˆ˜์ง‘ ํ•œ๊ณ„

๋ฐœํ–‰ยท๊ตฌ๋…ยทcheckpointยทstopยท์ˆ˜์‹  ์‹œ๊ฐ์€ ์„œ๋กœ ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ์—์„œ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ๊ฐ Peer๋Š” ์‹œ์ž‘ํ•  ๋•Œ ์ตœ๋Œ€ 5์ดˆ ๋™์•ˆ Controller health ํ‘œ๋ณธ์„ ์ตœ๋Œ€ 7๊ฐœ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค. ๋น ๋ฅธ ์‹คํŒจ๊ฐ€ ๋ชจ๋“  ์‹œ๋„๋ฅผ ์ฆ‰์‹œ ์†Œ์ง„ํ•˜์ง€ ์•Š๋„๋ก ์‹คํŒจํ•œ ์‹œ๋„ ์‚ฌ์ด๋ฅผ 250ms ๋„์›๋‹ˆ๋‹ค. RTT์—๋Š” timestamp ์‘๋‹ต ๋ณธ๋ฌธ์˜ ์ˆ˜์‹ ยท๋””์ฝ”๋”ฉ๊นŒ์ง€ ํฌํ•จํ•˜๋ฏ€๋กœ ๋ณธ๋ฌธ ์ „์†ก ์ง€์—ฐ๋„ ์˜ค์ฐจ ๋ฒ”์œ„์— ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. RTT๊ฐ€ ๊ฐ€์žฅ ์ž‘์€ ํ‘œ๋ณธ์˜ ์š”์ฒญ ์ค‘๊ฐ„์ ์œผ๋กœ ์ธก์ • ์‹œ๊ฐ์„ Controller ์‹œ๊ณ„์— ๋งž์ถฅ๋‹ˆ๋‹ค. ์ด ์ž‘์—…์ด ์‹คํŒจํ•ด๋„ Peer๋Š” ๋ฏธ๋™๊ธฐํ™” ์ƒํƒœ๋กœ Ready๊นŒ์ง€ ์ง„ํ–‰ํ•˜๊ณ  5์ดˆ๋งˆ๋‹ค ๋‹ค์‹œ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ๋™๊ธฐํ™”๋œ ๋’ค์—๋Š” 30์ดˆ๋งˆ๋‹ค ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.

์„ฑ๊ณตํ•œ ํ‘œ๋ณธ์˜ ์‹ ๋ขฐ ๊ธฐ๊ฐ„์€ 2๋ถ„์ž…๋‹ˆ๋‹ค. ๊ณ„์†๋œ ๊ฐฑ์‹  ์‹คํŒจ๋กœ ์ด ๊ธฐ๊ฐ„์ด ์ง€๋‚˜๋ฉด timestamp ์—ฐ์†์„ฑ์„ ์œ„ํ•ด ๋งˆ์ง€๋ง‰ offset์€ ์œ ์ง€ํ•˜์ง€๋งŒ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ณ„ metadata๋Š” ๋” ์ด์ƒ ๋ถ™์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ดํ›„ ์„ฑ๊ณตํ•˜๋ฉด metadata๋ฅผ ๋‹ค์‹œ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์œ ํšจํ•œ ํ‘œ๋ณธ์ด ์žˆ์„ ๋•Œ ์ด๋ฒคํŠธ์— clockBasis, clockOffsetMs, clockUncertaintyMs๋ฅผ ๊ธฐ๋กํ•˜๋ฉฐ, ๊ธฐ๋ณธ uncertainty๋Š” RTT์˜ ์ ˆ๋ฐ˜์ž…๋‹ˆ๋‹ค. ์ˆ˜์‹ ๊ณผ ์ธก์ • ๊ฒฝ๊ณ„์˜ timestamp๋Š” ๊ฐ™์€ Peer ์„ธ์…˜ ์•ˆ์—์„œ ํ•ญ์ƒ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ณ„ ๋ณด์ •๊ฐ’์ด ๋’ค๋กœ ์ด๋™ํ•ด ๊ด€์ธก ์ˆœ์„œ๋ฅผ ์ง€ํ‚ค๋ ค๊ณ  timestamp๋ฅผ ์•ž์œผ๋กœ ์กฐ์ •ํ•˜๋ฉด, ์ƒˆ ์ถ”์ • ์‹œ๊ฐ๊ณผ์˜ ์ฐจ์ด ์ „์ฒด๋ฅผ ํ•ด๋‹น ๊ด€์ธก์˜ uncertainty์— ๋”ํ•ฉ๋‹ˆ๋‹ค. clockOffsetMs๋Š” ํ‘œ๋ณธ์—์„œ ์–ป์€ offset์„ ๊ทธ๋Œ€๋กœ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. Envelope๋Š” ๋ฐœํ–‰์ž uncertainty๋ฅผ ์šด๋ฐ˜ํ•˜๊ณ  ์ˆ˜์‹ ์ž๋Š” ์–‘์ชฝ ๊ฐ’์„ ๋”ํ•œ latencyUncertaintyMs๋ฅผ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค.

Controller๋Š” ๋‹จ๋ฐฉํ–ฅ ์ง€์—ฐ ์ถ”์ •์ด 0์ด๋‚˜ ์ˆ˜์‹  ๋งˆ๊ฐ ๊ฒฝ๊ณ„๋ฅผ ๋„˜์„ ๋•Œ ์ด ๋ฒ”์œ„๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์•ฝ๊ฐ„ ์Œ์ˆ˜์ธ ์ถ”์ •๋„ uncertainty ๋ฒ”์œ„ ์•ˆ์—์„œ ์ธ๊ณผ์ ์œผ๋กœ ๊ฐ€๋Šฅํ•˜๊ณ  ํ™•์‹คํžˆ ๊ธฐํ•œ ๋‚ด๋ผ๋ฉด ์ˆ˜์‹  ์„ฑ๊ณต์œผ๋กœ ์ธ์ •ํ•˜๋˜, ์Œ์ˆ˜ ๊ฐ’์€ ์ง€์—ฐ histogram์—์„œ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ๋ฒ”์œ„ ์ „์ฒด๊ฐ€ ๋ฐœํ–‰ ์ „์ด๋ฉด ๋ฌดํšจ, ์ „์ฒด๊ฐ€ ๋งˆ๊ฐ ํ›„๋ฉด late, ๋งˆ๊ฐ์„ ๊ฑธ์น˜๋ฉด unknown์ž…๋‹ˆ๋‹ค. ์ฃผ๊ธฐ์  ์ธก์ •์€ Controller์— ์—ฐ๊ฒฐ๋œ ๋™์•ˆ drift๋ฅผ ์ค„์ด์ง€๋งŒ ์š”์ฒญ ์ค‘๊ฐ„์  ์ถ”์ •๊ณผ ์ผ์‹œ์  ๋‹จ์ ˆ์ด ํ˜ธ์ŠคํŠธ ์‹œ๊ณ„ ๋™๊ธฐํ™”๋ฅผ ๋Œ€์ฒดํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์žฅ์‹œ๊ฐ„ churn ์‹คํ—˜์—์„œ๋Š” ๋ชจ๋“  ํ˜ธ์ŠคํŠธ์˜ chrony/NTP๋ฅผ ๊ณ„์† ํ™œ์„ฑํ™”ํ•˜์‹ญ์‹œ์˜ค. ๊ณ„์ธก๋œ ์„ธ์…˜์˜ ์—ฐ์†์„ฑ์ด ๋ฌผ๋ฆฌ์  ์—ฐ๊ฒฐ์˜ ์—ฐ์†์„ฑ์„ ๋ณด์žฅํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์ด uncertainty ๊ณ„์‚ฐ์€ ๋ฐœํ–‰์ž์™€ ์ˆ˜์‹ ์ž์˜ ์‹ ๋ขฐ ์‹œ๊ณ„ metadata๋ฅผ ๋ชจ๋‘ ๊ฐ€์ง„ envelope ์ˆ˜์‹ ์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. Raw ์ˆ˜์‹ ๊ณผ ๋ฏธ๋™๊ธฐํ™” envelope ์ˆ˜์‹ ์€ ๊ธฐ๋ก๋œ point timestamp๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ๊ตฌ๋… ๋Œ€์ƒ ํŒ์ •๊ณผ ์ค‘๋ณต์˜ ์ˆ˜์‹  ๊ธฐ๊ฐ„ ๊ฒ€์‚ฌ๋„ point timestamp๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. ์ด ํŒ์ •์€ ์‹œ๊ณ„ uncertainty๋ฅผ ๋Œ€์ƒ ์ง‘ํ•ฉ์˜ ๊ฒฝ๊ณ„๊นŒ์ง€ ์ „ํŒŒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. join, stop์ด๋‚˜ ๋งˆ๊ฐ์— ๊ฐ€๊นŒ์šด ๊ฒฐ๊ณผ๋ฅผ ํ•ด์„ํ•  ๋•Œ ์ด ํ•œ๊ณ„๋ฅผ ํ•จ๊ป˜ ๋ณด๊ณ ํ•˜์‹ญ์‹œ์˜ค.

Peer telemetry๋Š” ํ•œ๋„๊ฐ€ ์žˆ๋Š” ์žฌ์‹œ๋„์™€ ์ •์ƒ ์ข…๋ฃŒ ์‹œ drain์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Agent๋Š” ํ๊ฐ€ ๊ฐ€๋“ ์ฐจ๋ฉด ์„ฑ๊ณต ์‘๋‹ต ํ›„ ๋ฐฐ์น˜๋ฅผ ๋ฒ„๋ฆฌ๋Š” ๋Œ€์‹  backpressure๋ฅผ ์ ์šฉํ•˜๋ฉฐ ์ •์ƒ ์ข…๋ฃŒ ๋•Œ Peer ์ •๋ฆฌ๋ฅผ ํ—ˆ์šฉํ•œ ๋’ค ์ œํ•œ ์‹œ๊ฐ„ ๋‚ด ์ตœ์ข… drain์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ ์ดˆ๊ณผ, ์ข…๋ฃŒ ์œ ์˜ˆ ์†Œ์ง„, ํ”„๋กœ์„ธ์ŠคยทAgentยทController ์‹คํŒจ๋กœ ๊ด€์ธก์ด ๋ˆ„๋ฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. sequence๋Š” ์ผ๋ถ€ ๋ˆ„๋ฝ๊ณผ ํ™•์ธ๋œ ๋ฏธ๋„๋‹ฌ์„ ๊ตฌ๋ถ„ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต๊ตฌํ•˜๊ฑฐ๋‚˜ ์•„์˜ˆ ๋ณด์ด์ง€ ์•Š์€ ์„ธ์…˜์˜ ์กด์žฌ๋ฅผ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. scope: all์€ ๊ณ„์ธก ๊ฒฝ๋กœ๋„ ํ›ผ์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์™€ ํ•จ๊ป˜ ์œ ์‹ค ์นด์šดํ„ฐ ๋ฐ incomplete/unknown ํ‘œ์‹œ๋ฅผ ๋ณด์กดํ•˜์‹ญ์‹œ์˜ค.

์ฒซ ์ˆ˜์‹  ๋„๋‹ฌ์‹œ๊ฐ„

๊ธฐ๊ฐ„์ด ์ง€๋‚ฌ๊ณ  ์•ˆ์ • ๋Œ€์ƒ์— ์†ํ•˜๋ฉฐ ์ œ๋•Œ ์„ฑ๊ณตํ•œ ์›๊ฒฉ ์Œ๋งŒ ์ง€์—ฐ ํ‘œ๋ณธ์— ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๊ธฐํ•œ ๋‚ด ์ฒซ ์œ ํšจ Subscription.Next ์ˆ˜์‹  ์‹œ๊ฐ์—์„œ ๋ฐœํ–‰์ž๊ฐ€ ๋กœ์ปฌ ๋ฐœํ–‰ ์ž ๊ธˆ ํš๋“ ํ›„ ์ค€๋น„ํ•œ envelope ์‹œ๊ฐ์„ ๋บ๋‹ˆ๋‹ค. payload ์ƒ์„ฑ, ์ง๋ ฌํ™”, PubSub ์ฒ˜๋ฆฌ, ๋„คํŠธ์›Œํฌ์™€ ์ˆ˜์‹  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ๋ฅผ ํฌํ•จํ•˜๊ณ  Controllerโ†’Agent ์ „๋‹ฌ ๋ฐ ๋กœ์ปฌ ๋ฐœํ–‰ ์ž ๊ธˆ ๋Œ€๊ธฐ๋Š” ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.

raw์—๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐœํ–‰ ์‹œ๊ฐ์ด ์—†์œผ๋ฏ€๋กœ ์„ธ์…˜ ๊ธฐ๊ฐ„ ๋„๋‹ฌ๋ฅ ์—๋Š” ํฌํ•จํ•˜๋˜ ์ง€์—ฐ์€ N/A์ž…๋‹ˆ๋‹ค. ๋กœ์ปฌยทํ›„์† ์ˆ˜์‹ , ์ดํƒˆยท๋Šฆ์€ join, ์ง€์—ฐ ๋ฏธ์ธก์ •์€ ๋ถ„ํฌ์—์„œ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. uncertainty ๋ฒ”์œ„๋กœ ๊ธฐํ•œ ๋‚ด ์ˆ˜์‹ ์„ ์ธ์ •ํ•œ ๊ฒฝ์šฐ์—๋„ ์Œ์ˆ˜ point estimate๋Š” invalidLatencySamples์— ๊ธฐ๋กํ•˜๊ณ  ์ง€์—ฐ ๋ถ„ํฌ์—์„œ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.

UI์™€ metrics.json์€ ์‚ฐ์ˆ ํ‰๊ท , nearest-rank P95, latencySamples๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฏธ์ˆ˜์‹ ์ด๋‚˜ unknown์€ 0ms๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ด€์ธก๋œ ๊ธฐํ•œ ๋‚ด ์„ฑ๊ณต๊ณผ ์•ˆ์ • ๊ตฌ๋…์„ ์กฐ๊ฑด์œผ๋กœ ํ•œ ์ง€์—ฐ์ด๋ฏ€๋กœ ๋„๋‹ฌ๋ฅ  ๋ฒ”์œ„์™€ coverage๋ฅผ ๋ฐ˜๋“œ์‹œ ํ•จ๊ป˜ ๋ณด์‹ญ์‹œ์˜ค.

invalidLatencySamples๋Š” ์•ˆ์ • ์Œ์—์„œ ์„ ํƒํ•œ ๊ธฐํ•œ ๋‚ด envelope์˜ ์ง€์—ฐ ๊ฐ’์ด ๋ฌดํšจ์ด๊ฑฐ๋‚˜, ์œ ํšจํ•œ ๊ธฐํ•œ ๋‚ด ์ˆ˜์‹ ์ด ์—†์œผ๋ฉด์„œ ๊ด€์ธก ์ˆ˜์‹ ์ด ์‹œ๊ฐยท์„ธ์…˜ ์ˆœ์„œ ๊ฒ€์‚ฌ์— ์‹คํŒจํ•œ ๊ฒฝ์šฐ ํ•ด๋‹น ์Œ์„ ์…‰๋‹ˆ๋‹ค. ๋งˆ๊ฐ์„ ๊ฑธ์น˜๋Š” uncertainty ๊ตฌ๊ฐ„๋„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋‹จ์ˆœํžˆ histogram์—์„œ ์ œ์™ธํ•œ ์Œ์ˆ˜ ํ‘œ๋ณธ ์ˆ˜๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

ํ‰๊ท  ์ค‘๋ณต ๋ฉ”์‹œ์ง€

์ถ”๊ฐ€ ๋ณต์‚ฌ๋ณธ์€ ์ˆ˜์‹  ์ธก GossipSub RawTracer.DuplicateMessage๊ฐ€ ๊ด€์ธกํ•œ PubSub ๋ฉ”์‹œ์ง€ ์บ์‹œ hit์ž…๋‹ˆ๋‹ค. TCP ์žฌ์ „์†ก, ๋ฐ˜๋ณต IHAVE, ๋ฐ”์ดํŠธ ์ˆ˜, ๋‘ ๋ฒˆ์งธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ˆ˜์‹ ์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ‰๊ท ์€ ์•ˆ์ • ๋Œ€์ƒ์˜ ๊ธฐํ•œ ๋‚ด ์„ฑ๊ณต ์Œ์—์„œ ๊ฐ™์€ ์ˆ˜์‹  ๊ธฐ๊ฐ„ ์•ˆ์— ๊ด€์ธกํ•œ ์ถ”๊ฐ€ ๋ณต์‚ฌ๋ณธ ์ˆ˜๋ฅผ ์„ฑ๊ณต ์Œ ์ˆ˜๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค. ๋ณต์‚ฌ๋ณธ์ด ์—†๋Š” ์„ฑ๊ณต ์Œ์€ 0์œผ๋กœ ํฌํ•จํ•˜๊ณ  ์„ฑ๊ณต ์Œ์ด ์—†์œผ๋ฉด N/A์ž…๋‹ˆ๋‹ค. ๋กœ์ปฌยท์ดํƒˆยท๋Šฆ์€ join ์ˆ˜์‹ ์ž ๋ฐ ๊ธฐ๊ฐ„ ๋ฐ–์˜ ๋ณต์‚ฌ๋ณธ์€ ์ „์ฒด ์ด๋ฒคํŠธ ์ˆ˜์—๋Š” ๋‚จ์ง€๋งŒ ํ‰๊ท ์—์„œ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ์„ฑ๊ณต ์Œ์˜ ์ถ”๊ฐ€ ๋ณต์‚ฌ๋ณธ์ด 0, 1, 5๊ฐœ์ด๋ฉด ํ‰๊ท ์€ 6 / 3 = 2์ž…๋‹ˆ๋‹ค. ์ค‘๋ณต telemetry ๋ˆ„๋ฝ์€ ์ด ๊ด€์ธก ํ‰๊ท ๋„ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

envelope ์ด๋ฒคํŠธ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฉ”์‹œ์ง€ ID๋กœ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. raw๋Š” pubsub-<hex native message ID>๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  fields.pubsubMessageId์—๋Š” ํ•ด๋‹น native ID์˜ 16์ง„์ˆ˜ ์ธ์ฝ”๋”ฉ์„ ๋‹ด์Šต๋‹ˆ๋‹ค. ID๋Š” ์„ค์ •๋œ ์ „์—ญ ๋˜๋Š” topic๋ณ„ ๋ฉ”์‹œ์ง€ ID ์ •์ฑ…์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋ฐœ์‹ ์ž+sequence ์ •์ฑ…์€ ๊ฐ™์€ ๋ฐ”์ดํŠธ์˜ ๋ณ„๋„ ๋ฐœํ–‰์„ ๊ตฌ๋ถ„ํ•˜์ง€๋งŒ sha256ยทtopic-sha256์€ ๊ฐ™์€ ๋‚ด์šฉ์„ ๋™์ผ PubSub ๋ฉ”์‹œ์ง€๋กœ ํ•ฉ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Telemetry ์ƒ๊ด€๊ด€๊ณ„ ์ฒ˜๋ฆฌ๋Š” raw ๋ฉ”์‹œ์ง€์— ๋ฐ”์ดํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์›๋ณธ sequence๋Š” ๋ณ„๋„ ์นด์šดํ„ฐ์ž…๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ID๋Š” ์žฌ์‹œ๋„์—๋„ ์œ ์ง€ํ•˜์—ฌ Controller๊ฐ€ ํ•œ ๋ฒˆ๋งŒ ์ €์žฅยท์ง‘๊ณ„ํ•ฉ๋‹ˆ๋‹ค.

GossipSub ์ œ์–ด ํŠธ๋ž˜ํ”ฝ

KPL์€ GossipSub SEND_RPC, RECV_RPC, DROP_RPC trace์— ํฌํ•จ๋œ ์ œ์–ด metadata๋ฅผ ๊ด€์ธกํ•ฉ๋‹ˆ๋‹ค. Peer๋Š” RPC๋งˆ๋‹ค ๊ทธ ์•ˆ์— ์กด์žฌํ•˜๋Š” ๊ฐ ์ œ์–ด ํƒ€์ž…์— ๋Œ€ํ•ด send_*, recv_*, drop_* ์ด๋ฒคํŠธ๋ฅผ ํ•˜๋‚˜์”ฉ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ง€์› suffix๋Š” ihave, iwant, idontwant, graft, prune์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ IHAVE์™€ IWANT๋ฅผ ํ•จ๊ป˜ ๋‹ด์€ ํ˜ผํ•ฉ RPC๋Š” ๋‘ ์‹œ๊ณ„์—ด์— ๋ชจ๋‘ ํ•œ ๋ฒˆ์”ฉ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

์„ธ ์ˆ˜์น˜๋Š” ๋‹จ์œ„๊ฐ€ ์„œ๋กœ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

  • RPC ์ˆ˜๋Š” ํ•ด๋‹น ์ œ์–ด ํƒ€์ž…์„ ํฌํ•จํ•œ envelope ์ˆ˜์ž…๋‹ˆ๋‹ค. ํƒ€์ž… ์ „์ฒด๋ฅผ ํ•ฉํ•˜๋ฉด ํ•˜๋‚˜์˜ ํ˜ผํ•ฉ envelope๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Entry ์ˆ˜๋Š” RPC ์•ˆ์˜ repeated protobuf control entry ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • ๋ฉ”์‹œ์ง€ ID ์ˆ˜๋Š” IHAVE, IWANT, IDONTWANT entry ์•ˆ์˜ ID ์ฐธ์กฐ ์ถœํ˜„ ํšŸ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ฐ™์€ ID์˜ ๋ฐ˜๋ณต ์ฐธ์กฐ๋„ ๋ฐ˜๋ณตํ•ด ์„ธ๋ฉฐ unique ๋ฉ”์‹œ์ง€ ์ˆ˜๋‚˜ ์ „๋‹ฌ ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

PRUNE peer-exchange record๋Š” ๋ณ„๋„๋กœ ์ง‘๊ณ„ํ•ฉ๋‹ˆ๋‹ค. IHAVE, GRAFT, PRUNE์—๋Š” topic ํ•„๋“œ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์›์‹œ ์ด๋ฒคํŠธ์˜ fields.topics, fields.topicEntryCounts, IHAVE์˜ fields.topicMessageIdCounts์— ์ •๋ ฌ๋œ topic๋ณ„ ์ •๋ณด๋ฅผ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค. ํ•œ RPC๊ฐ€ ์—ฌ๋Ÿฌ topic์„ ๋‹ด์„ ์ˆ˜ ์žˆ๊ณ  IWANT/IDONTWANT์—๋Š” wire topic์ด ์—†์œผ๋ฏ€๋กœ ์ตœ์ƒ์œ„ ์ด๋ฒคํŠธ topic์€ ๋น„์›Œ ๋‘ก๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Prometheus counter๋Š” topic label ์—†์ด run, Agent, ๋ฐฉํ–ฅ, ์ œ์–ด ํƒ€์ž…์œผ๋กœ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์šด๋กœ๋“œํ•œ metrics.json์—๋„ ์ •ํ™•ํžˆ ๊ฐ™์€ events.jsonl ๊ฒฝ๊ณ„์—์„œ ์žฌ๊ตฌ์„ฑํ•œ Agent๋ณ„ ๋‚ด์—ญ์ด ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.

send๋Š” ๋กœ์ปฌ outbound queue๊ฐ€ RPC๋ฅผ ์ˆ˜๋ฝํ–ˆ๋‹ค๋Š” ๋œป์ด๋ฉฐ stream write๋‚˜ ์›๊ฒฉ ์ˆ˜์‹ ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. recv๋Š” ์ดํ›„ router admission๊ณผ flood limit ํŒ๋‹จ ์ „์˜ inbound ๊ด€์ธก์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฐฉํ–ฅ์„ ๋”ํ•˜๋ฉด ๊ฐ™์€ ์ „์†ก์˜ ์–‘ ๋ ๊ด€์ธก์„ ์ค‘๋ณตํ•ด ์…€ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ณ ์œ  wire RPC ์ด์ˆ˜๋กœ ํ•ด์„ํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. drop์€ queue ํฌํ™”๋‚˜ oversized RPC ๊ฐ™์€ ๋กœ์ปฌ ์†ก์‹  ์ „ ํ๊ธฐ์ด๋ฉฐ netem ํŒจํ‚ท ์†์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ธฐ์กด์˜ ๋‹จ์ˆœ graft์™€ prune ์ด๋ฒคํŠธ๋Š” ๋กœ์ปฌ mesh ์ „์ด๋ฅผ ๋œปํ•˜๋ฏ€๋กœ wire send_graft/recv_graft, send_prune/recv_prune์™€ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

v2 ์žฌํ˜„ ๊ฐ€์ด๋“œ์—์„œ ์ œ์–ด trace์˜ ํ˜ธํ™˜์„ฑ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. IDONTWANT ๋ฐœ์ƒ์—๋Š” GossipSub v1.2 ์ง€์›๊ณผ ๋ฉ”์‹œ์ง€ ํฌ๊ธฐ๋„ ์˜ํ–ฅ์„ ์ค๋‹ˆ๋‹ค. ๊ณ ์ •๋œ ๊ธฐ๋ณธ๊ฐ’์—์„œ๋Š” ๋ณดํ†ต data๊ฐ€ 1,024๋ฐ”์ดํŠธ ์ด์ƒ์ผ ๋•Œ ์ƒ์„ฑ๋˜๋ฏ€๋กœ ์ด๋ฅผ ์‹œํ—˜ํ•˜๋ ค๋ฉด payload๋ฅผ ํ‚ค์šฐ๊ฑฐ๋‚˜ gossipsub.params.iDontWantMessageThreshold๋ฅผ ๋‚ฎ์ถ”์‹ญ์‹œ์˜ค.

P2P ์ŠคํŠธ๋ฆผ ๋Œ€์—ญํญ

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

metrics.bandwidth, ์ €์žฅ ๋ถ„์„ ์ฐจํŠธ, kpl_p2p_* ์ง€ํ‘œ๋Š” ์ „์†ก๋Ÿ‰ยท๊ตฌ๊ฐ„ ์ „์†ก๋ฅ ยท์ข…๋ฃŒ ํ‘œ๋ณธ ํ’ˆ์งˆ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์„ค์ • ์ œํ•œ์ธ network.rateMbps๋‚˜ publish/deliver ์ด๋ฒคํŠธ์˜ PubSub data ํฌ๊ธฐ๋ฅผ ๋”ํ•˜๋Š” kpl_message_bytes_total๊ณผ๋Š” ๋‹ค๋ฅธ ๊ฐ’์ž…๋‹ˆ๋‹ค. ๋‹จ์œ„ยทํ”„๋กœํ† ์ฝœ ๊ท€์†ยทํ‘œ๋ณธ ๋ˆ„๋ฝยท์žฌ์‹œ์ž‘ ๋™์ž‘์€ Bandwidth ์ธก์ •์„ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

์ €์žฅ ๊ฒฐ๊ณผ ์—ฐ๊ตฌ ์ง€ํ‘œ

์ €์žฅ ๋ถ„์„ ์‘๋‹ต์—๋Š” ๋‘ ์ •์˜ ์˜์—ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. metrics ๊ฐ์ฒด๋Š” ์œ„์˜ ์„ธ์…˜ ๊ธฐ๊ฐ„ ๋˜๋Š” ๊ณผ๊ฑฐ ์ง€ํ‘œ ์ •์˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , research ๊ฐ์ฒด๋Š” ์ถ”๊ฐ€ v2 ์—ฐ๊ตฌ ๊ทธ๋ฆผ์„ ์œ„ํ•ด definition: "v2-corrected-observations-v1"์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. FRTยทreachabilityยทDRC๋ผ๋Š” ์ด๋ฆ„์ด ๊ฐ™์•„๋„ ๋‘ ๊ฐ’์€ ์„œ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์—ฐ๊ตฌ ์ง€ํ‘œ๋Š” ๋ฉ”์ธ Metrics ์นด๋“œ๋‚˜ kpl_window_* Prometheus ๊ณ„์—ด์— ์ถ”๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•ญ๋ชฉ ๋ฉ”์ธ ์„ธ์…˜ ๊ธฐ๊ฐ„ Metrics ์ €์žฅ research
์ˆ˜์‹ ์ž ๋‹จ์œ„ ๋ฉ”์‹œ์ง€ ร— ๊ตฌ๋… ์„ธ์…˜ ๋ฉ”์‹œ์ง€ ร— Node ID, ๋น„๋ฐœํ–‰ ๋…ธ๋“œ์˜ ๊ธฐ๋ก๋œ ์ตœ์ดˆ ์ˆ˜์‹ 
๋ชจ์ง‘๋‹จ๊ณผ ์‹œ๊ฐ ๊ณ ์ • ๋ฐœํ–‰ยท๋งˆ๊ฐ ๊ธฐ๊ฐ„์˜ ๊ตฌ๋… ์ฆ๊ฑฐ ์ตœ์ดˆ ์ˆ˜์‹  ์‹œ์ ๋“ค์— ๊ตฌ๋…ํ•œ ๋น„๋ฐœํ–‰ ๋…ธ๋“œ์˜ ํ•ฉ์ง‘ํ•ฉ. ์ˆ˜์‹ ์ด ์—†์œผ๋ฉด ๋ฐœํ–‰ ์‹œ์ 
์‹คํ–‰ ๋„๋‹ฌ๋ฅ  ์ง‘๊ณ„ ์ˆ˜์‹  ์Œ ์„ฑ๊ณต ์ˆ˜์™€ ๋ถ„๋ชจ๋ฅผ ํ•ฉ์‚ฐํ•˜๊ณ  unknown ๋ฒ”์œ„ ํ‘œ์‹œ ๋ฉ”์‹œ์ง€๋ณ„ ์—ฐ๊ตฌ ๋„๋‹ฌ๋ฅ ์˜ ํ‰๊ท . ๋ˆ„์  ์ „ํŒŒ ๊ณก์„ ์€ ์ „์ฒด ์ ๊ฒฉ ์ˆ˜์‹  ์ˆ˜ / ๋ฉ”์‹œ์ง€๋ณ„ ๋ชจ์ง‘๋‹จ ํ•ฉ
์ง€์—ฐ ์•ˆ์ • ์›๊ฒฉ ์Œ์˜ ์œ ํšจํ•œ ๊ธฐ๊ฐ„ ๋‚ด envelope ์ˆ˜์‹ , UI๋Š” ๋ฐ€๋ฆฌ์ดˆ ๋ฉ”์ธ ๊ธฐ๊ฐ„ยท์ง‘ํ•ฉ ์ œํ•œ ์—†์ด ์–ป์€ ์Œ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ตœ์ดˆ ์ˆ˜์‹  ๊ฐ’, ์ดˆ ๋‹จ์œ„
์ค‘๋ณต ์„ฑ๊ณตํ•œ ์•ˆ์ • ์›๊ฒฉ ์Œ์˜ ๊ธฐ๊ฐ„ ๋‚ด ์ถ”๊ฐ€ ์‚ฌ๋ณธ ํ‰๊ท  ๋ฉ”์‹œ์ง€๋ณ„ ๊ธฐ๋ก๋œ ๋น„๋กœ์ปฌ ์ถ”๊ฐ€ ์‚ฌ๋ณธ ์ˆ˜. drc_per_node_count๋Š” ๊ด€์ธก GossipSub ํ‰๊ท  ๋…ธ๋“œ ์ˆ˜, drc_per_target์€ ํ•ด๋‹น ๋ฉ”์‹œ์ง€์˜ ์ˆ˜์‹  ๋ชจ์ง‘๋‹จ์œผ๋กœ ๋‚˜๋ˆ”

์—ฐ๊ตฌ ๋ชจ์ง‘๋‹จ์€ JOIN/LEAVE์™€ ์ธก์ • ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€์ธก์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ํ† ํ”ฝ์˜ ๊ตฌ๋… ์ด๋ ฅ์ด ์—†์„ ๋•Œ๋งŒ dispatch targetNodeIds๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋ถ„๋ชจ๊ฐ€ 0์ด๊ฑฐ๋‚˜ ์—†์œผ๋ฉด N/A์ž…๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€๋ณ„ population๊ณผ populationBasis๋ฅผ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ์ง‘๋‹จ์€ ํ‘œ๋ณธ ์‹œ๊ฐ์ด ์ˆ˜์‹  ๊ธฐ๋ก์— ๋”ฐ๋ผ ์ •ํ•ด์ง€๋Š” ๊ด€์ธก ์กฐ๊ฑด๋ถ€ ์ง‘ํ•ฉ์ด๋ฏ€๋กœ ๋ฉ”์ธ ์„ธ์…˜ ์ง€ํ‘œ์˜ ์ „๋‹ฌ ์„ฑ๊ณต๊ณผ ๋…๋ฆฝ์ ์ธ ๋Œ€์ƒ ์„ ์ • ๊ทœ์น™์„ ๋งŒ์กฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ ์—ฐ๊ตฌ ์งˆ๋ฌธ์—๋Š” ๋ฉ”์ธ ๋„๋‹ฌ ๋ฒ”์œ„์™€ coverage๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , v2 ๋ฐฉ์‹ ๊ณก์„ ์„ ๋น„๊ตํ•  ๋•Œ๋Š” ์ด ์‚ฌํ›„ ์ •์˜๋ฅผ ๋ช…์‹œํ•˜์‹ญ์‹œ์˜ค. ์—ฐ๊ตฌ ๊ธฐ๋ก์€ ์„ธ์…˜ ์†Œ์Šค sequence์˜ ์™„์ „ํ•œ prefix๋กœ ๋ฏธ์ˆ˜์‹ ์„ ํ™•์ •ํ•˜๋Š” ๊ฒ€์‚ฌ๋„ ์ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—ฐ๊ตฌ FRT๋Š” ๊ธฐ๋ก๋œ ์Œ์ˆ˜๊ฐ€ ์•„๋‹Œ envelope ์ง€์—ฐ์„ ์šฐ์„  ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์—†์œผ๋ฉด ๋ฐœํ–‰ยท์ˆ˜์‹  ์–‘์ชฝ์— ์œ ํšจํ•œ ์‹œ๊ฐ ๋™๊ธฐํ™” ํ‘œ์‹œ๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ๊ฐ™์€ ๋น„์–ด ์žˆ์ง€ ์•Š์€ Agent ID๋ฅผ ๊ฐ€์งˆ ๋•Œ๋งŒ ๋กœ๊ทธ ์‹œ๊ฐ ์ฐจ์ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฉ”์ธ raw ์ง€์—ฐ์ด N/A์—ฌ๋„ ์—ฐ๊ตฌ ๋ถ„์„์—๋Š” raw ๋ฉ”์‹œ์ง€์˜ ๋กœ๊ทธ ์‹œ๊ฐ ์ถ”์ •์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์‹œ๊ฐ ์ฐจ์ด์™€ ๋ชจ์ง‘๋‹จ ๊ฒฝ๊ณ„ยท์ค‘๋ณต ์‹œ๊ณ„์—ดยท์ถœ์ฒ˜ ์—ฐ๊ด€์—๋Š” ์‹œ๊ฐ ๋ถˆํ™•์‹ค์„ฑ ๊ตฌ๊ฐ„์„ ์ „ํŒŒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐœํ–‰ ๊ธฐ๋ก์ด ์—†๋Š” ์ˆ˜์‹ ์€ orphanReceipts๋กœ ์ง‘๊ณ„ํ•˜๋ฉฐ ๋ฐœํ–‰์ด๋‚˜ 0 ์ง€์—ฐ์„ ๋งŒ๋“ค์–ด ๋„ฃ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฉ”์‹œ์ง€ ๋‚ด๋ถ€์˜ average, deviation, median, count๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ‘œ๋ณธ์˜ ํ‰๊ท ยท๋ชจ์ง‘๋‹จ SDยท์ค‘์•™๊ฐ’ยท๊ฐœ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ง์ˆ˜ ์ค‘์•™๊ฐ’์€ ๊ฐ€์šด๋ฐ ๋‘ ๊ฐ’์˜ ํ‰๊ท ์ž…๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€ ํ†ต๊ณ„์˜ ์‹คํ–‰ ์—ฐ๊ตฌ ์š”์•ฝ์€ ๋ฉ”์‹œ์ง€ ํ‰๊ท ์— ๋™์ผ ๊ฐ€์ค‘์น˜๋ฅผ, ๊ทธ๋ž˜ํ”„ ์š”์•ฝ์€ ๋ถ„์„์— ๋‚จ๊ธด snapshot์— ๋™์ผ ๊ฐ€์ค‘์น˜๋ฅผ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. Control ์š”์•ฝ์€ ๊ธฐ๋ก ๋ฒ”์œ„์˜ ์ „์ฒด ํšŸ์ˆ˜์ด๋ฉฐ RPCยทentryยทID ์ฐธ์กฐยทmesh ์ „์ด๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์‹คํ–‰ ๊ฐ„ ๋น„๊ต ๋ง‰๋Œ€๋Š” ํ‘œ๋ณธ SD์ด๋ฉฐ ๋ฐ˜๋ณต 1ํšŒ์—๋Š” SD๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ „ํŒŒยท์ค‘๋ณต ์ •๊ทœํ™” ๊ณก์„ ์€ ๋™์ผํ•œ ์ ๊ฒฉ ๋ฉ”์‹œ์ง€โ€“๋…ธ๋“œ ์ง‘ํ•ฉ์„ ์“ฐ๋ฉฐ, ๋ชจ์ง‘๋‹จ๋‹น ์ค‘๋ณต ์‚ฌ๋ณธ์€ 1์„ ๋„˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Hop ๊ณก์„ ์€ ๋ฏธ๋ณต์› hop์„ ์ œ์™ธํ•˜๊ณ , eager/lazy ์ง€์—ฐ CDF๋Š” ๋ถ„๋ฅ˜๋˜๊ณ  ์œ ํšจํ•œ ์‹œ๊ฐ์ด ์žˆ๋Š” ์ˆ˜์‹ ์— ์กฐ๊ฑด๋ถ€์ž…๋‹ˆ๋‹ค. ๊ณก์„ ๊ณผ ํ•จ๊ป˜ ๋ฏธ๋ถ„๋ฅ˜ ์ˆ˜๋ฅผ ๋ณด๊ณ ํ•˜์‹ญ์‹œ์˜ค.

์ˆ˜์‹  ๊ทธ๋ฃน๋ณ„ ์ง‘๊ณ„

Delivery & Propagation ์ฐจํŠธ๋Š” All Peers์™€ Group: ์ด๋ฆ„์„ ํ•จ๊ป˜ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋ฐœํ–‰์ž์™€ ๊ด€๊ณ„์—†์ด ์ˆ˜์‹  ๋…ธ๋“œ์˜ ๊ทธ๋ฃน์„ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋ฉฐ, research.receiverGroups์— ํ†ต๊ณ„์™€ ๊ฒฝ๋Ÿ‰ ์ฐจํŠธ ์ž๋ฃŒ๋ฅผ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค. ์ „ํŒŒยท๋„๋‹ฌ๋ฅ ์˜ ๋ถ„๋ชจ๋Š” ๊ฐ ๊ทธ๋ฃน์˜ ์ˆ˜์‹  ๋Œ€์ƒ ๋ฉ”์‹œ์ง€โ€“๋…ธ๋“œ ์Œ์ด๋ฉฐ ์ค‘๋ณต๋„ ์ˆ˜์‹  ๋…ธ๋“œ์— ๊ท€์†ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ทธ๋ฃน์— ์ˆ˜์‹  ๋Œ€์ƒ ๋˜๋Š” ๋น„๋ฐœํ–‰์ž์˜ ์ˆ˜์‹ ยท์ค‘๋ณต ๊ธฐ๋ก์ด ์žˆ๋Š” ๋ฉ”์‹œ์ง€๋งŒ ๊ทธ๋ฃน ํ‰๊ท ์— ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ† ํ”ฝ์ด๋‚˜ ๊ทธ๋ฃน์ด ์ฐธ์—ฌํ•˜์ง€ ์•Š์€ ๊ธฐ๊ฐ„์€ ์ธ์œ„์ ์ธ 0์œผ๋กœ ๋„ฃ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ˆ˜์‹  ๋Œ€์ƒ์ด ์žˆ์ง€๋งŒ ์ˆ˜์‹ ์ด ์—†์œผ๋ฉด ๋„๋‹ฌ๋ฅ ยท์ˆ˜์‹  ์ˆ˜๋Š” 0์ด๊ณ , ์‹œ๊ฐ„ยทํ™‰ ๊ทผ๊ฑฐ๊ฐ€ ์—†๋Š” ๊ฐ’์€ ๊ฒฐ์ธก์œผ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฝ๋กœ์™€ eager/lazy ์ถ”์ •์€ ์ „์ฒด ๋„คํŠธ์›Œํฌ์—์„œ ๋จผ์ € ๊ณ„์‚ฐํ•œ ๋’ค ์ˆ˜์‹ ์ž๋ฅผ ๊ทธ๋ฃน๋ณ„๋กœ ๋‚˜๋ˆ„๋ฏ€๋กœ ๋‹ค๋ฅธ ๊ทธ๋ฃน์„ ๊ฑฐ์น˜๋Š” ํ™‰๋„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฃน FRTยท์กฐ๊ฑด๋ถ€ ๊ณก์„ ์€ ์œ„์˜ ์—ฐ๊ตฌ ์ง€ํ‘œ ์ •์˜๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ First-delivery Latency CDFยทHistogram์€ ๊ธฐ๋ณธ ์ง€ํ‘œ์˜ ๋™์ผํ•œ ์œ ํšจ ํ‘œ๋ณธ์„ ๊ทธ๋ฃน๋ณ„๋กœ ๋ถ„ํ• ํ•˜๋ฉฐ ํžˆ์Šคํ† ๊ทธ๋žจ ๊ตฌ๊ฐ„๋„ All Peers์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. drc_per_node_count๋Š” ํ•ด๋‹น ๊ทธ๋ฃน์˜ ๊ด€์ธก๋œ GossipSub ํ‰๊ท  ๋…ธ๋“œ ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ทผ๊ฑฐ๊ฐ€ ์—†์œผ๋ฉด ๊ฒฐ์ธก์ž…๋‹ˆ๋‹ค. ์›์‹œ Message Activity๋Š” ๋ฐœํ–‰ยท๋กœ์ปฌยท์ง€์—ฐ ์ด๋ฒคํŠธ๋ฅผ ํฌํ•จํ•˜๋Š” ์ „์ฒด ์‹คํ–‰ ์นด์šดํ„ฐ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์ƒˆ Peer ์ด๋ฒคํŠธ์—๋Š” ๋…ธ๋“œ์˜ group์„ ๋‚จ๊น๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ ๊ฒฐ๊ณผ๋Š” ํ™”๋ฉด์šฉ ๋‹ค์šด์ƒ˜ํ”Œ๋ง์—์„œ ์ œ์™ธ๋œ ๊ฒƒ์„ ํฌํ•จํ•œ ์ €์žฅ ๊ทธ๋ž˜ํ”„์—์„œ ๊ทธ๋ฃน์„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค. ์ •๋ณด ๋ˆ„๋ฝยท์ถฉ๋Œ์€ Unknown Group์œผ๋กœ ํ‘œ์‹œํ•˜๊ณ  ๋…ธ๋“œ ID์—์„œ ๊ทธ๋ฃน์„ ์ถ”์ธกํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐฐ์น˜ ์ฐจํŠธ๋Š” ๊ทธ๋ฃน ์ด๋ฆ„์„ ๋Œ€์‘์‹œ์ผœ ์œ ํšจ run์„ ๋™์ผ ๊ฐ€์ค‘์น˜๋กœ ํ‰๊ท ํ•˜๋ฉฐ, ์ธก์ •๋œ 0์€ ํฌํ•จํ•˜๊ณ  ์—†๋Š” ๊ทธ๋ฃน์€ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. PNGยทCSV์—๋„ ๊ทธ๋ฃน ์‹œ๋ฆฌ์ฆˆ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ž˜๋œ ๋ถ„์„ ์บ์‹œ๋Š” ํ˜„์žฌ ๊ณ„์‚ฐ ๋ฒ„์ „์—์„œ ์—ด ๋•Œ ์žฌ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์—ฐ๊ตฌ ๊ทธ๋ž˜ํ”„ ๊ด€์ธก

Controller๋Š” ์‹ ์„ ํ•œ ๋ณด๊ณ ์—์„œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” transportยทKademliaยทGossipSub ๊ด€๊ณ„๋ฅผ observations.jsonl์— ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”„๋Š” ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” isolate๋ฅผ ํฌํ•จํ•˜๊ณ  ๋ฌด๋ฐฉํ–ฅ ๊ณ ์œ  ๊ฐ„์„ ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ๋œ ํ”„๋กœํ† ์ฝœ๋ณ„ ๊ทธ๋ž˜ํ”„์—์„œ๋Š” ๊ฐ™์€ GossipSub Peer ์Œ์˜ ์—ฌ๋Ÿฌ ํ† ํ”ฝ์„ ํ•˜๋‚˜์˜ ์Œ์œผ๋กœ ํ•ฉ์นฉ๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ API๋Š” ํ† ํ”ฝ๋ณ„ ๊ฐ„์„ ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋ณด๊ณ ๋œ ๊ด€๊ณ„์ด๋ฉฐ ํŒจํ‚ท ์ „์†ก์ด๋‚˜ ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด์˜ ์›์ž์  snapshot ์ฆ๊ฑฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํ† ํด๋กœ์ง€๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

๋ถ„์„์€ ๊ด€์ธก ํ‘œ๋ณธ์„ ์ตœ๋Œ€ 1,440๊ฐœ๋กœ ์ค„์ด๋˜ ๋งˆ์ง€๋ง‰ ํ‘œ๋ณธ์„ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”„ ํ‰๊ท ๊ณผ snapshot๋ณ„ ์ฐจ์ˆ˜ ํ™•๋ฅ  ํ‰๊ท ์€ ๋ถ„์„์— ๋‚จ๊ธด ํ‘œ๋ณธ์— ๋™์ผ ๊ฐ€์ค‘์น˜๋ฅผ ์ฃผ๋ฉฐ, ์‹œ๊ฐ„ ๊ธธ์ด๋‚˜ ๋…ธ๋“œ ์ˆ˜๋กœ ๊ฐ€์ค‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์›๋ณธ ๊ด€์ธก ํŒŒ์ผ์€ ๊ฒฐ๊ณผ ZIP์— ๋‚จ์Šต๋‹ˆ๋‹ค. research.summary์˜ ์ผ๋ฐ˜ ๊ทธ๋ž˜ํ”„ ํ‚ค์™€ degreeDistribution, degreeFit์€ ์ „์ฒด ๊ทธ๋ฃน์˜ GossipSub ๋ ˆ์ด์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœํ† ์ฝœยท๊ทธ๋ฃน๋ณ„ ์‹œ๊ณ„์—ด์€ observations[].groups[].layers[]์— ์žˆ์Šต๋‹ˆ๋‹ค.

ํ†ต๊ณ„ ์ •์˜
ํ‰๊ท  ์ฐจ์ˆ˜ isolate๋ฅผ ํฌํ•จํ•œ 2E/N. average_degree_excluding_leaves๋Š” v2์ฒ˜๋Ÿผ ์ „์ฒด ์ฐจ์ˆ˜ ํ•ฉ / degree > 1์ธ ๋…ธ๋“œ ์ˆ˜. ๋ถ„๋ชจ๊ฐ€ ์—†์œผ๋ฉด N/A
์ง๊ฒฝ / ํ‰๊ท  ์ตœ๋‹จ ๊ฒฝ๋กœ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ์„œ๋กœ ๋‹ค๋ฅธ ๋…ธ๋“œ ์Œ๋งŒ ์‚ฌ์šฉ. connected_pair_fraction์€ ๊ทธ ๋น„์œจ์ด๋ฉฐ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ์Œ์ด ์—†์œผ๋ฉด ๊ฑฐ๋ฆฌ๋Š” N/A
Clustering ์ง€์—ญ ์‚ผ๊ฐํ˜• ๋น„์œจ ํ‰๊ท . degree < 2๋Š” 0
Degree / betweenness / closeness ์ค‘์‹ฌ์„ฑ degree / N-1, ์ •๊ทœํ™” Brandes betweenness, ๋„๋‹ฌ ๋…ธ๋“œ ์ˆ˜๋กœ ๋ณด์ •ํ•œ closeness
PageRank / eigenvector ์ค‘์‹ฌ์„ฑ ๊ฐ์‡  0.85์™€ dangling ์งˆ๋Ÿ‰ ๊ท ๋“ฑ ๋ฐฐ๋ถ„, A+I ๋ฐ˜๋ณต์˜ L2 ์ •๊ทœํ™” ๊ณ ์œ ๋ฒกํ„ฐ. ๋ฏธ์ˆ˜๋ ด์€ N/A์ด๋ฉฐ ๊ฐ„์„ ์ด ์—†๋Š” ๊ณ ์œ ๋ฒกํ„ฐ ํ†ต๊ณ„๋„ N/A
Assortativity / modularity ์–‘ ๋ ์ฐจ์ˆ˜์˜ ์ƒ๊ด€์œผ๋กœ ๋ถ„์‚ฐ 0์ด๋ฉด N/A. ํ•ด์ƒ๋„ 1ยทseed 1์˜ Louvain modularity

๊ทธ๋ฃน ์ค‘์‹ฌ์„ฑ์€ ์ „์ฒด ๊ทธ๋ž˜ํ”„ ๊ฒฝ๋กœ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•ด๋‹น ๊ทธ๋ฃน ๋…ธ๋“œ๋ฅผ ํ‰๊ท ํ•˜๋ฉฐ ๊ทธ๋ฃน ์œ ๋„ ๊ทธ๋ž˜ํ”„์—์„œ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฃน ์ฐจ์ˆ˜ยทclustering ์š”์•ฝ๋„ ์ œ๊ณตํ•˜์ง€๋งŒ ์ „์ฒด ๊ทธ๋ž˜ํ”„์˜ ์ง๊ฒฝยทassortativityยทmodularity๋ฅผ ๊ทธ๋ฃน๋งˆ๋‹ค ๊ณ„์‚ฐํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ ์ฐจ์ˆ˜ ์š”์•ฝ๋งŒ์œผ๋กœ ๋ˆ„๋ฝ๋œ ๊ฐ„์„ ๊ณผ ๊ฐ„์„  ๊ธฐ๋ฐ˜ ์ง€ํ‘œ๋ฅผ ๋ณต์›ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Student-t๋Š” ์ „์ฒด ๊ทธ๋ฃน GossipSub์˜ ์ฐจ์ˆ˜ ํ™•๋ฅ ์— ์ง์ ‘ ๊ฐ€์ค‘ ์ตœ๋Œ€์šฐ๋„ ์ ํ•ฉํ•˜๋ฉฐ ์„œ๋กœ ๋‹ค๋ฅธ ์ฐจ์ˆ˜๊ฐ€ 3๊ฐœ ์ด์ƒ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜๋ ด๊ณผ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฒฝ๊ณ„ ์ƒํƒœ๋ฅผ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์—ฐ์† ์ ํ•ฉ ๋ฐ€๋„์™€ ์ •์ˆ˜ ์ฐจ์ˆ˜์˜ ํ™•๋ฅ  ์งˆ๋Ÿ‰์€ ์„œ๋กœ ๋‹ค๋ฅธ ์–‘์ž…๋‹ˆ๋‹ค. ์ด์ฐจ ํŒŒ๋ผ๋ฏธํ„ฐ ์˜ˆ์ธก๊ณผ ์ค‘๋ณต ํšŒ๊ท€๋Š” ์„ ํƒํ•œ case ํ‰๊ท ์— ์ ํ•ฉํ•˜๊ณ  rankยทํ•™์Šต ์ž๋ฃŒ Rยฒ๋ฅผ ํ‘œ์‹œํ•˜๋ฉฐ, ์‹๋ณ„๋˜์ง€ ์•Š๋Š” ๋ชจ๋ธ์˜ ๊ณ„์ˆ˜๋Š” ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž…๋ ฅยทํŒŒ๋ผ๋ฏธํ„ฐ ์„ ํƒ์€ ๋น„๊ต ๋„๊ตฌ๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

์ ์ˆ˜ ๊ตฌ์„ฑ์š”์†Œ ์‹œ๊ณ„์—ด

์ ์ˆ˜ ๊ด€์ธก์—๋Š” ์„ ํƒ์ ์œผ๋กœ groups[].scoreComponents์— P1~P7, P3b, topic ์ƒํ•œ ์กฐ์ •๊ฐ’๊ณผ ๊ฐ™์€ ํ‘œ๋ณธ์˜ ์ด์ ์— ๋Œ€ํ•œ count/mean/min/max๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์‹ ์„ ํ•œ ๊ตฌ์„ฑ ํ•ญ๋ชฉ ํ‘œ๋ณธ๋งŒ ์‚ฌ์šฉํ•˜๋ฉฐ ๊ด€์ธก์ž ๊ทธ๋ฃน ์•ˆ์—์„œ ๊ด€์ธก์žโ€“์ƒ๋Œ€ Peer ์Œ ์ˆ˜๋กœ ๊ฐ€์ค‘ํ•ฉ๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ ๊ธฐ๋ก์˜ ๋ˆ„๋ฝ ํ•ญ๋ชฉ์€ ์ธก์ • ๋ถˆ๊ฐ€๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ํ•ญ๋ชฉ ์ •์˜์™€ ์ˆ˜์ง‘ ํ•œ๊ณ„๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

๋ถ„์„ ๋ฒ„์ „ 8์€ ์ผ๋ฐ˜ ๊ด€์ธก ๋ชฉ๋ก์„ ์ค„์ด๊ธฐ ์ „์— ๋ชจ๋“  ์›๋ณธ ๊ด€์ธก์—์„œ scoreTimeline์„ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ํ•ญ๋ชฉ์€ group๊ณผ points๋ฅผ ๊ฐ€์ง€๋ฉฐ ๊ฐ ์ ์€ ์›๋ž˜ at๊ณผ components ํ†ต๊ณ„๊ฐ’์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋นˆ ๊ทธ๋ฃน์€ ๊ด€์ธก์ž ์ „์ฒด์˜ ์ง‘๊ณ„์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฃน๋งˆ๋‹ค ๊ฐ ๊ตฌ์„ฑ์š”์†Œ์˜ ์ฒซ ๋ฒˆ์งธยท๋งˆ์ง€๋ง‰ ๊ธฐ๋ก ํ‘œ๋ณธ์„ ํฌํ•จํ•ด ์ตœ๋Œ€ 720๊ฐœ ์ ์„ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค. ๊ด€์ธก์ด๋‚˜ ๊ตฌ์„ฑ์š”์†Œ ๊ฐ’์ด ๋น ์ง„ ๊ตฌ๊ฐ„์€ ๋‹ค์Œ ์ธก์ •์ ์˜ breakBefore๋กœ ํ‘œ์‹œํ•˜๊ณ , ์ ์„ ์ค„์—ฌ๋„ ๋‹จ์ ˆ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ณต๋ฐฑ์„ ์ด์ „ ๊ฐ’์œผ๋กœ ์ฑ„์šฐ๊ฑฐ๋‚˜ 0์œผ๋กœ ๋ฐ”๊พธ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ์ด ์—ญ์ „๋˜๊ฑฐ๋‚˜ ์ค‘๋ณต๋˜๋ฉด ์—ฐ์†์„ฑ์„ ํ™•์ •ํ•  ์ˆ˜ ์—†์–ด ํ•ด๋‹น ๊ทธ๋ฃน์˜ ์ ๋“ค์„ ์„œ๋กœ ์—ฐ๊ฒฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ณ„ ์ „์ฒด ๋ถ„์„๊ณผ ๋ฐฐ์น˜์˜ ๊ฐ ์••์ถ• Run์—๋Š” scoreTimeline์„ ๋ณด์กดํ•˜๊ณ , ๊ฐœ๋ณ„ ๋น„๊ต์šฉ /summary์—์„œ๋Š” ์ ์„ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ์ฐจํŠธ๋Š” ์ด ์‹œ๊ณ„์—ด์„ ์šฐ์„  ์‚ฌ์šฉํ•˜๋ฉฐ ๊ณผ๊ฑฐ ๋ถ„์„์—์„œ๋Š” observations๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฃน๋ณ„ ์ธก์ •๊ฐ’์ด ์žˆ์œผ๋ฉด ์ด๋ฅผ ํ‘œ์‹œํ•˜๊ณ , ํ•ด๋‹น ๊ตฌ์„ฑ์š”์†Œ์˜ ๊ทธ๋ฃน๋ณ„ ์ธก์ •๊ฐ’์ด ์ „ํ˜€ ์—†์œผ๋ฉด ๊ธฐ๋ก๋œ ์ „์ฒด ์ง‘๊ณ„๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ์น˜ ํ‰๊ท ์€ Run๋ณ„ ๋™์ผ ๊ฐ€์ค‘์น˜๋ฅผ ์œ ์ง€ํ•˜๊ณ  ๊ฒฐ์ธก ํ‘œ๋ณธ์„ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ Run์˜ ๊ฐ™์€ ์‹œ๊ฐ์— ์—ฌ๋Ÿฌ ์ ์ด ์žˆ์œผ๋ฉด ๋งˆ์ง€๋ง‰ ์œ ํ•œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋’ค์˜ ๊ฒฐ์ธก๊ฐ’์ด ์‹ค์ธก๊ฐ’์„ ์ง€์šฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์ „ ๋ถ„์„์„ ์žฌ๊ณ„์‚ฐํ•˜๋ฉด ์ผ๋ฐ˜ ๊ด€์ธก ์ถ•์•ฝ ๊ณผ์ •์—์„œ ์ œ์™ธ๋๋”๋ผ๋„ ์›๋ณธ ๊ด€์ธก์— ๋‚จ์•„ ์žˆ๋Š” ์ƒ์„ธ ์ธก์ •๊ฐ’์„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋กํ•˜์ง€ ์•Š์€ ํ‘œ๋ณธ์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ด์ ์œผ๋กœ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์ถ”์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Eager Push์™€ Lazy Pull ์ถ”์ •

์„ ํƒ์  HopWave wire ๋ณด๊ณ ๊ฐ’์€ Peer ๋กœ๊ทธ์— ๋ณ„๋„๋กœ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค. ์ˆœํ™˜ ์นด์šดํ„ฐ์™€ ์„œ๋ช…ํ•˜์ง€ ์•Š๋Š” ๋งˆ์ง€๋ง‰ ์†ก์‹  ํ‘œ์‹์€ ๋ณต์› hop ์ˆ˜๋‚˜ ์•„๋ž˜ ์ถ”์ •์„ ๋Œ€์‹ ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ํ•ด๋‹น ํ•„๋“œ๊ฐ€ ์žˆ์–ด๋„ ๊ณผ๊ฑฐ ๋ถ„์„ ์ •์˜๋ฅผ ๋ฐ”๊พธ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋ฐฉ๋ฒ•์€ originMethod: "message-id-preferred-graft-ihave-iwant-estimate-v2"์ž…๋‹ˆ๋‹ค. linkEstimate๋Š” ๊ด€์ธก ๋ฐœ์‹ ์ž์—์„œ ์ˆ˜์‹ ์ž๋กœ ํ–ฅํ•˜๋Š” ๋งˆ์ง€๋ง‰ ๊ฐ„์„ , source๋Š” ๋ฐœํ–‰์ž๋ถ€ํ„ฐ ๋ณต์›ํ•œ ๊ฒฝ๋กœ์˜ ๋ถ„๋ฅ˜์ด๋ฉฐ evidence์— ๊ทผ๊ฑฐ๊ฐ€ ๋‚จ์Šต๋‹ˆ๋‹ค. Upstream trace ๋ฉ”ํƒ€์ •๋ณด์— ๋”ฐ๋ฅธ ์ถ”์ •์ด๋ฉฐ ์ง์ ‘ ๊ด€์ธกํ•œ ๋ฐœ์‹  ํ ์›์ธ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๊ด€์ธกํ•œ topology_applied๋Š” ํ•ด๋‹น Peerยทํ† ํ”ฝ์˜ ์ด์ „ mesh/control ๊ทผ๊ฑฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋ช…์‹œ์  ๊ทธ๋ž˜ํ”„ ์„ค์น˜๋Š” GRAFT/PRUNE ๊ตํ™˜ ์—†์ด ๋ฉค๋ฒ„์‹ญ์„ ๋ฐ”๊พธ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์˜ˆ์ •๋œ topology_assignment๋Š” ๊ด€์ธก ๋งํฌ๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐํ™” ์‹œ๊ฐ ์ดํ•˜์˜ control์€ ์ดํ›„ ๋ถ„๋ฅ˜์˜ ๊ทผ๊ฑฐ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์ƒˆ IHAVE/IWANT ๊ด€์ธก์€ ์ƒˆ pull ๊ทผ๊ฑฐ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค์ •ํ•œ ๊ฐ„์„ ๋งŒ์œผ๋กœ eager ์†ก์‹ ์„ ํ™•์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ถ„์„ ํ˜•์‹ ๋ฒ„์ „ 7์— ์ด ๊ทœ์น™์„ ํฌํ•จํ•˜๋ฉฐ, ๋Œ€์ฒด ๋ถ„์„ ์‹คํ–‰ ์ค‘์—๋Š” ๊ธฐ์กด ์™„๋ฃŒ ๋ถ„์„์„ ๊ณ„์† ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • ์ตœ์ดˆ ์ˆ˜์‹  ๋•Œ ํ™œ์„ฑ GRAFT๋Š” eager ํ›„๋ณด์ž…๋‹ˆ๋‹ค. PRUNE์€ ๊ทธ mesh ๊ทผ๊ฑฐ๋ฅผ ํ•ด์ œํ•˜๊ณ , ์—ฐ๊ฒฐ ํ•ด์ œยท๊ตฌ๋… ํ•ด์ œยท์ธก์ • ์ข…๋ฃŒ๋Š” ๊ด€๋ จ๋œ ์ด์ „ ๊ทผ๊ฑฐ๋ฅผ ๋ฌดํšจํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ™์€ ๋ฐฉํ–ฅ์˜ ๋ฐœ์‹ ์žยท์ˆ˜์‹ ์ž ์Œ๊ณผ ํ† ํ”ฝ์—์„œ IHAVE๋ณด๋‹ค ์—„๊ฒฉํžˆ ๋‚˜์ค‘์ธ IWANT๋Š” lazy ํ›„๋ณด์ž…๋‹ˆ๋‹ค. ํƒ์ƒ‰ ๊ตฌ๊ฐ„์€ ๋ฐœํ–‰ ์‹œ์ , ํ•ด๋‹น ์ดˆ๊ธฐํ™” ์‹œ์ , ์ˆ˜์‹  5์ดˆ ์ „ ์ค‘ ๊ฐ€์žฅ ๋‚˜์ค‘๋ถ€ํ„ฐ ์ˆ˜์‹  ์ง์ „๊นŒ์ง€์ž…๋‹ˆ๋‹ค. 5์ดˆ๋Š” ๋ถ„์„ ๊ทœ์น™์ด๋ฉฐ ํ”„๋กœํ† ์ฝœ timeout์ด ์•„๋‹™๋‹ˆ๋‹ค.
  • ์ƒ์„ธ ID ๋ชฉ๋ก์€ ์ „๋‹ฌ๋œ pubsubMessageId์™€ ์ผ์น˜ํ•ด์•ผ ํ•˜๋ฉฐ, ์˜› ๊ฐœ์ˆ˜ ์ „์šฉ ๊ธฐ๋ก์€ ์‹œ๊ฐ ์—ฐ๊ด€์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋™์ผ ๋ฉ”์‹œ์ง€์˜ ๋ฐ์ดํ„ฐ RPC๋Š” ๋ณด์กฐ ๊ทผ๊ฑฐ์ž…๋‹ˆ๋‹ค. ๋กœ์ปฌ ์ „์†ก ์ „ drop์€ ์„ฑ๊ณตํ•œ control ์—ฐ๊ด€์—์„œ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.
  • Push/pull ์ถฉ๋Œ, Peer ๋ˆ„๋ฝ, ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” IDยท์‹œ๊ฐ๊ณผ ๋ฏธ๋ณต์› ๊ฒฝ๋กœ๋Š” unknown์ž…๋‹ˆ๋‹ค. ์ž˜๋ฆฐ ID ๋ชฉ๋ก์€ ์š”์ฒญ์ด ์—†์—ˆ๋‹ค๋Š” ์ฆ๊ฑฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์™„์ „ํžˆ ๋ณต์›ํ•œ ๊ฒฝ๋กœ์˜ ๋ชจ๋“  ๊ฐ„์„ ์ด eager ์ถ”์ •์ด๋ฉด eager, lazy ์ถ”์ • ๊ฐ„์„ ์ด ์žˆ์œผ๋ฉด lazy์ž…๋‹ˆ๋‹ค. ๋ฏธ๋ณต์›ยท์ˆœํ™˜ ๊ฒฝ๋กœ๋Š” ๊ฐ„์„  ๊ทผ๊ฑฐ๋งŒ ๋‚จ๊ธฐ๊ณ  ์ „์ฒด ๊ฒฝ๋กœ๋ฅผ ๋ถ„๋ฅ˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

eager_count, lazy_count๋Š” ๋ถ„๋ฅ˜๋œ ์ˆ˜์‹ ๋งŒ ์„ธ๋ฏ€๋กœ ๋‘˜ ๋‹ค 0์ด์–ด๋„ unknown_count๊ฐ€ ์–‘์ˆ˜์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ์ „ํŒŒ ๋ฐฉ์‹์ด ์—†์—ˆ๋‹ค๋Š” ๋œป์ด ์•„๋‹™๋‹ˆ๋‹ค. ์กฐ๊ฑด๋ถ€ FRTยทreachability์™€ lazy-on/off ๊ธฐ์—ฌ ๊ทธ๋ฆผ๋„ ์ด ๋ถ„๋ฅ˜ ๋ฒ”์œ„์˜ ์˜ํ–ฅ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๊ธฐ์ค€ ์‹คํ—˜๊ณผ์˜ ์ฐจ์ด๋Š” ๊ด€์ธก ์ถ”์ •์ด๋ฉฐ ์ธ๊ณผ ํšจ๊ณผ์˜ ์ฆ๋ช…์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ˆ˜์ง‘ ํ•„๋“œ์™€ ์ƒ๋žต ํ•œ๋„๋Š” ์ƒ์„ธ Peer ๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

์ง‘๊ณ„ ๋ฒ”์œ„, ๋‚ด๋ณด๋‚ด๊ธฐ, ๋ชจ๋‹ˆํ„ฐ๋ง

์ƒˆ ์š”์•ฝ์€ definition: "session-window-v1"์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฐœํ–‰์€ fields.measurementDefinition๊ณผ fields.deliveryWindow๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ๋œ ์„ธ์…˜ ์ฆ๊ฑฐ, ๋ฐœํ–‰ยท์ˆ˜์‹  ์‹œ๊ฐ, ์›๋ณธ sequence๋กœ ๊ฐ™์€ ๊ณ„์‚ฐ์„ ์žฌ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • ์›น ์นด๋“œ๋Š” ๊ฐ€์žฅ ์ตœ๊ทผ ์‹œ์ž‘ํ•œ ์‹คํ–‰ ์ค‘ ์‹คํ—˜์„ ํ‘œ์‹œํ•˜๋ฉฐ ์นด๋“œ ์œ„์— run์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๊ธฐ ํšŒ์ฐจ๊ฐ€ ์ด๋ฅผ ๋ฎ์–ด์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹คํ–‰ ์ค‘์ธ run์ด ์—†์œผ๋ฉด ์นด๋“œ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ์‹คํ—˜ ์ˆ˜์น˜๋ฅผ ์ดˆ๊ธฐ N/Aยท0์œผ๋กœ ๋˜๋Œ๋ฆฝ๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ ์ˆ˜์น˜๋Š” ์‹ค์‹œ๊ฐ„ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. Snapshot API์—๋Š” ๊ฐ€์žฅ ์ตœ๊ทผ ์‹œ์ž‘ํ•œ ์ข…๋ฃŒ ์‹คํ—˜์˜ ์š”์•ฝ์ด ๋‚จ์œผ๋ฉฐ ์ €์žฅ ๊ฒฐ๊ณผ์™€ ๋‚ด๋ณด๋‚ด๊ธฐ์˜ ์ธก์ •๊ฐ’๋„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ์ตœ๊ทผ ์ด๋ฒคํŠธ 300๊ฐœยทํ‘œ์‹œ ํ–‰ 40๊ฐœ์™€ ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€์ธกํ•œ ์‹คํ—˜ ์ „์ฒด๋ฅผ ์ง‘๊ณ„ํ•ฉ๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค๋Š” ์„ธ์…˜ยท๋ฉ”์‹œ์ง€ยท์ˆ˜์‹  ์Œยท์ด๋ฒคํŠธ ID์— ๋น„๋ก€ํ•ด ์ฆ๊ฐ€ํ•˜๋ฉฐ ๊ฒฐ๊ณผ ์‚ญ์ œ ๋˜๋Š” ํ”„๋กœ์„ธ์Šค ์žฌ์‹œ์ž‘ ๋•Œ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.
  • published, delivered, duplicates๋Š” ์ „์ฒด ์ด๋ฒคํŠธ ์ˆ˜๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์‹ ์—๋Š” ๋กœ์ปฌยท๋Šฆ์€ join๋„ ํฌํ•จ๋˜๋ฏ€๋กœ ์ˆ˜์‹  ์ˆ˜๋ฅผ ๋ฐœํ–‰ ์ˆ˜๋กœ ๋‚˜๋ˆˆ ๊ฐ’์€ ๋„๋‹ฌ๋ฅ ์ด๋‚˜ ํŒจํ‚ท ์†์‹ค๋ฅ ์ด ์•„๋‹™๋‹ˆ๋‹ค.
  • ZIP metrics.json์€ ์ •ํ™•ํžˆ ๊ฐ™์€ ๊ฒฝ๊ณ„์˜ events.jsonl์—์„œ ์žฌ๊ณ„์‚ฐํ•˜๋ฉฐ Controller ์žฌ์‹œ์ž‘ ํ›„์—๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ธฐํ•œ ๊ฒฝ๊ณผ ํŒ๋‹จ์—๋Š” manifest์— ๊ณ ์ •ํ•œ exportedAt์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์žฌํ˜„ ๊ณ„์‚ฐ์—๋„ ๊ฐ™์€ ์‹œ๊ฐ์„ ์ ์šฉํ•˜์‹ญ์‹œ์˜ค. deliveryWindows์—๋Š” ๊ด€์ธกํ•œ ์œ ํšจ ์ˆ˜์‹  ๊ธฐ๊ฐ„ ์„ค์ •๋“ค์ด ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ์ดํ›„ telemetry๋Š” ํ•ด๋‹น ๋‹ค์šด๋กœ๋“œ์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ถˆ์™„์ „ํ•œ ๊ด€์ธก์€ unknown/incomplete๋กœ ํ‘œ์‹œํ•˜๋ฉฐ ํ˜•์‹์ด ์†์ƒ๋œ ์ด๋ฒคํŠธ ๋กœ๊ทธ๋Š” ์ˆ˜์น˜๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ์‹คํŒจ์‹œํ‚ต๋‹ˆ๋‹ค.
  • Prometheus kpl_window_* gauge๋Š” run๋ณ„ ์•ˆ์ •ยทํ™•์ธ๋œ ๋ฐœํ–‰ ์‹œ์  ๋Œ€์ƒ ์ˆ˜, ๋„๋‹ฌ๋ฅ  ๋ฒ”์œ„, coverage ๋ฒ”์œ„, pending, ์ดํƒˆ, ์ง€์† ์—ฌ๋ถ€ ๋ถˆ๋ช…, ๋ฐœํ–‰ ์‹œ์  ๊ฐ€์šฉ์„ฑ ๋ถˆ๋ช…๊ณผ ๊ด€์ธก ํ’ˆ์งˆ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Grafana ์„ธ์…˜ ํŒจ๋„์—๋Š” Run ํ•„ํ„ฐ๋งŒ ์ ์šฉํ•˜๊ณ  ์—ฌ๋Ÿฌ run์€ ์ˆ˜์‹  ์Œ์œผ๋กœ ๊ฐ€์ค‘ํ•ฉ๋‹ˆ๋‹ค. ๋ฐœํ–‰ ์‹œ์  ๋„๋‹ฌ๋ฅ ๊ณผ coverage๋Š” ํ’ˆ์งˆ ๊ฒฝ๊ณ ๊ฐ€ 0์ด ์•„๋‹ˆ์–ด์„œ๊ฐ€ ์•„๋‹ˆ๋ผ ํ™•์ธ๋œ ๋ฐœํ–‰ ์‹œ์  ๋ถ„๋ชจ๊ฐ€ 0์ผ ๋•Œ๋งŒ N/A์ž…๋‹ˆ๋‹ค.
  • kpl_window_propagation_latency_seconds๋Š” ๊ฐ™์€ ์„ฑ๊ณต ์Œ์„ runยท์ˆ˜์‹  Agentยทtopic์œผ๋กœ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. Grafana๋Š” ์‹คํ—˜ ์ „์ฒด histogram ๋ถ„์œ„์ˆ˜๋ฅผ ๊ทผ์‚ฌํ•˜๋ฉฐ ์›น P95๋Š” ์ •ํ™•ํ•œ nearest rank์ž…๋‹ˆ๋‹ค. ๋Šฆ์€ telemetry๋กœ gauge์™€ ๋ฒ„ํ‚ท์ด ์ •์ •๋  ์ˆ˜ ์žˆ์–ด rate/increase ๋Œ€์‹  ์ง์ ‘ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. ํŠธ๋ž˜ํ”ฝ ์ด๋ฒคํŠธ ์นด์šดํ„ฐ์˜ rate ์˜๋ฏธ๋Š” ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๊ณผ๊ฑฐ ๊ฒฐ๊ณผ

dispatch-cohort-v1์€ Controller ์š”์ฒญ ์ง์ „์˜ ready/online ๊ตฌ๋…์ž ID๋ฅผ ๊ณ ์ •ํ•˜๊ณ  ์ดํ›„ ์ดํƒˆ์„ ๋ถ„๋ชจ์— ์œ ์ง€ํ–ˆ์œผ๋ฉฐ ๋ฉ”์‹œ์ง€๋ณ„ ๋งˆ๊ฐ์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋” ์˜ค๋ž˜๋œ ๋ฐ์ดํ„ฐ์—๋Š” ๋Œ€์ƒ ์ˆซ์ž๋งŒ ์žˆ๊ณ  ์ˆ˜์‹ ์ž ID๊ฐ€ ์—†์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘ ๊ณผ๊ฑฐ ์ •์˜์ด๋ฉฐ ์ง€์† ๊ตฌ๋… ์„ธ์…˜ ์ธก์ •์œผ๋กœ ์žฌํ•ด์„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์ „ kpl_delivery_*/kpl_propagation_latency_seconds๋ฅผ ์ƒˆ ๊ธฐ๊ฐ„ ์ง€ํ‘œ์™€ ํ•ฉ์‚ฐํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์›์‹œ ์ด๋ฒคํŠธ๋Š” ๋ณด์กดํ•˜๊ณ  ํ˜ผํ•ฉ ๋กœ๊ทธ์˜ legacy/unscoped ๋ฐœํ–‰ ์ˆ˜๋Š” ์ œ์™ธ๋œ ๊ธฐ๋ก์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์šด๋กœ๋“œ๋กœ ์›๋ž˜ ์—†๋˜ ์„ธ์…˜ ์ฆ๊ฑฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ƒˆ Grafana ์„ธ์…˜ ํŒจ๋„์€ ๊ณผ๊ฑฐ ๊ฒฐ๊ณผ๋งŒ ์„ ํƒํ•˜๋ฉด ํ‘œ์‹œํ•  ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค.

๊ตฌํ˜„๊ณผ ๊ด€๋ จ ๊ฐ€์ด๋“œ

์ง€์† ๊ตฌ๋… ๊ธฐ๊ฐ„, ์ฆ๊ฑฐ ๊ทœ์น™, ์Œ ๊ฐ€์ค‘, unknown ๋ฒ”์œ„์™€ ์„ฑ๊ณต๋‹น ์ค‘๋ณต ๊ณ„์‚ฐ์€ v3์˜ ๋ช…์‹œ์  ์„ค๊ณ„ ์„ ํƒ์ž…๋‹ˆ๋‹ค. ๊ด€๋ จ ๋ฌธํ—Œ๊ณผ ๊ฐœ๋… ๋น„๊ต๋Š” ์—ฐ๊ตฌ ๊ฐ€์ด๋“œ์—์„œ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด ์ˆ˜์‹์€ ํ˜„์žฌ ๊ตฌํ˜„์„ ์„ค๋ช…ํ•˜๋ฉฐ v2 ํ˜ธํ™˜์„ฑ๊ณผ๋Š” ๋…๋ฆฝ์ ์ž…๋‹ˆ๋‹ค.

๊ตฌํ˜„ ๋‹ด๋‹น ๋‚ด์šฉ
Peer ๋ฐœํ–‰๊ณผ ์—ฐ๊ฒฐ Envelope/raw ID, payload ์ค€๋น„, ์ˆ˜์‹  ์ง€์—ฐ๊ณผ ์ค‘๋ณต ์—ฐ๊ฒฐ
Peer telemetry์™€ ์‹œ๊ณ„ ํ‘œ๋ณธ ์„ธ์…˜ ์ƒ๋ช…์ฃผ๊ธฐ, ์›๋ณธ sequence, ์žฌ์‹œ๋„์™€ ์‹œ๊ณ„ metadata
์„ธ์…˜ ๊ธฐ๊ฐ„ ์ง‘๊ณ„ ๋Œ€์ƒ ์ง‘ํ•ฉ, ์ˆ˜์‹  ๋ฒ”์œ„, coverage, ์ง€์—ฐ๊ณผ ์ค‘๋ณต ์š”์•ฝ
๊ธฐ๊ฐ„ ์ง€ํ‘œ ํšŒ๊ท€ ์‚ฌ๋ก€ ๋งˆ๊ฐ ๊ฒฝ๊ณ„, ์ฆ๊ฑฐ ๋ˆ„๋ฝ, churn๊ณผ ์ˆœ์„œ๊ฐ€ ๋’ค๋ฐ”๋€ telemetry ์‚ฌ๋ก€
Prometheus collector Run gauge์™€ ์žฌ๊ตฌ์„ฑํ•œ ์ง€์—ฐ histogram
์—ฐ๊ตฌ ์ง‘๊ณ„, ๊ทธ๋ž˜ํ”„, ์ถœ์ฒ˜ ์ถ”์ • ์ €์žฅ ๊ฒฐ๊ณผ์˜ ๋ณ„๋„ ์—ฐ๊ตฌ ์ •์˜ยทํ‘œ๋ณธ ๊ทธ๋ž˜ํ”„ยท๋ฉ”ํƒ€์ •๋ณด ์ถ”์ •
๊ฒฐ๊ณผ ๋‚ด๋ณด๋‚ด๊ธฐ ๋‹ค์šด๋กœ๋“œ์˜ ์ด๋ฒคํŠธ ๋กœ๊ทธ ๊ฒฝ๊ณ„์™€ ์ง€ํ‘œ ์žฌ๊ณ„์‚ฐ

๊ทธ๋ž˜ํ”„ ๋ ˆ์ด์–ด, Agent ๋ฒˆํ˜ธ์™€ ํ™”๋ฉด ์กฐ์ž‘์€ ํ† ํด๋กœ์ง€ ๊ฐ€์ด๋“œ์—์„œ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํ™”๋ฉด ๋ณ€๊ฒฝ์€ ์ธก์ • ๋Œ€์ƒ ์ง‘ํ•ฉ์„ ๋ฐ”๊พธ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ €์žฅ ๊ฒฐ๊ณผ์—์„œ ์ €์žฅ ํŒŒ์ผ์˜ ๋ณด์กดยท์‚ญ์ œ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ, ๊ฒฐ๊ณผ ์‚ญ์ œ๋Š” ํ•ด๋‹น ์ง€ํ‘œ ์ธ๋ฑ์Šค๋ฅผ ํ•ด์ œํ•˜์ง€๋งŒ Peer๋ฅผ ์ข…๋ฃŒํ•˜๊ฑฐ๋‚˜ Prometheus ์ด๋ ฅ์„ ์‚ญ์ œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์šด๋กœ๋“œยท์‚ญ์ œ endpoint๋Š” REST API ๊ฐ€์ด๋“œ์—์„œ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ™์€ ์‹œ๋‚˜๋ฆฌ์˜ค ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰

์ ˆ์ฐจ๋Š” ์‹คํ–‰๊ณผ ๋ฐ˜๋ณต์œผ๋กœ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค.

์‹คํŒจ ํ›„ ๋‚จ์€ ํšŒ์ฐจ ์ด์–ด์„œ ์‹คํ–‰

๋ฏธ์‹œ์ž‘ ํšŒ์ฐจ ์ด์–ดํ•˜๊ธฐ์™€ ๋ฏธ์™„๋ฃŒ ํšŒ์ฐจ ์žฌ์‹œ๋„๋Š” ๋ณต๊ตฌ ๋ฐฉ์‹์„ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.