Bandwidth KO - k-p2p-lab/kpl-v3 GitHub Wiki

P2P Bandwidth ์ธก์ •

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

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

v3๋Š” ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•œ libp2p ์ŠคํŠธ๋ฆผ ๋Œ€์—ญํญ์„ ์ธก์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ฆฌ ํšŒ์„ ์˜ ์ตœ๋Œ€/๊ฐ€์šฉ ์šฉ๋Ÿ‰์„ ์ธก์ •ํ•˜๋Š” ๋ถ€ํ•˜ ์‹œํ—˜์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ชจ๋“  v3 ๊ตฌ์„ฑ์š”์†Œ(Controller, Agent, Peer ์ด๋ฏธ์ง€)๋ฅผ ๋‹ค์‹œ ๋นŒ๋“œํ•˜๊ณ  ์ ์šฉํ•œ ๋’ค ์‹œ์ž‘ํ•œ ์‹คํ—˜๋ถ€ํ„ฐ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. Agent์˜ ์—„๊ฒฉํ•œ ์ด๋ฒคํŠธ ๋””์ฝ”๋”๋„ ์ƒˆ ํ•„๋“œ๋ฅผ ์•Œ์•„์•ผ ํ•˜๋ฏ€๋กœ Peer๋งŒ ๊ต์ฒดํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๊ธฐ์กด ์‹คํ—˜์˜ payload ํฌ๊ธฐ์—์„œ ๊ณผ๊ฑฐ P2P ํŠธ๋ž˜ํ”ฝ์„ ์—ญ์‚ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ธก์ • ๋ฒ”์œ„์™€ ๊ณ„์‚ฐ

Peer์˜ libp2p BandwidthReporter์— ๋™๊ธฐ์‹ ์ •์ˆ˜ ์นด์šดํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์˜์กด์„ฑ์˜ swarm_stream.go๊ฐ€ ๊ฐ ์ŠคํŠธ๋ฆผ read/write์˜ ์‹ค์ œ ๋ฐ˜ํ™˜ ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ global hook๊ณผ protocol/remote hook์— ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. global hook์€ ์ด๋Ÿ‰์„, stream hook์€ ๊ท€์†๋งŒ ๊ฐฑ์‹ ํ•˜๋ฏ€๋กœ ๊ฐ™์€ ๋ฐ”์ดํŠธ๋ฅผ ๋‘ ๋ฒˆ ๋”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. libp2p ๊ธฐ๋ณธ flow meter์˜ ๋น„๋™๊ธฐ ๊ฐฑ์‹  ์‹œ์ ์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์•„ ์งง์€ ์ „์†ก์˜ ๋งˆ์ง€๋ง‰ ๋ฐ”์ดํŠธ๋„ ์ฆ‰์‹œ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๋ถ€ remote๋ณ„ ๊ท€์† ๊ธฐ๋ก์€ ์—ฐ๊ฒฐ๋œ Peer์™€ ์ตœ๊ทผ 1๋ถ„ ์•ˆ์— ์‚ฌ์šฉ๋œ remote๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. 5์ดˆ ํ‘œ๋ณธ ๋ฃจํ”„๊ฐ€ ๊ทธ๋ณด๋‹ค ์˜ค๋ž˜๋œ ์—ฐ๊ฒฐ ํ•ด์ œ ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•˜๊ณ  churn์œผ๋กœ ์ปค์ง„ map ์ €์žฅ ๊ณต๊ฐ„๋„ ํšŒ์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. ์ •๋ฆฌ๋œ remote๊ฐ€ ๋‹ค์‹œ ์—ฐ๊ฒฐ๋˜๋ฉด remote๋ณ„ ๊ธฐ๋ก์„ ์ƒˆ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์™ธ๋ถ€๋กœ ๋‚ด๋ณด๋‚ด๋Š” ์ „์ฒดยทํ”„๋กœํ† ์ฝœ๋ณ„ ์นด์šดํ„ฐ์—๋Š” ํ”„๋กœ์„ธ์Šค ์„ธ์…˜ ๋™์•ˆ ๊ด€์ธกํ•œ ๋ชจ๋“  ๋ฐ”์ดํŠธ๊ฐ€ ๋‚จ์œผ๋ฉฐ, ๊ฒฐ๊ณผ ์ด๋ฒคํŠธ์—๋Š” remote๋ณ„ ์นด์šดํ„ฐ๋ฅผ ๋‚ด๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํฌํ•จ ์ œ์™ธ
GossipSub ๋ฐ์ดํ„ฐ, ์„œ๋ช…ยทprotobuf/RPC ์ธ์ฝ”๋”ฉ, ์ „๋‹ฌ/์ค‘๋ณต ๋ณต์‚ฌ, control ๋ฉ”์‹œ์ง€ HTTP APIยทtelemetryยทbootstrap ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๋“ฑ ๊ด€๋ฆฌ ํŠธ๋ž˜ํ”ฝ
Kademlia, Identify, ping ๋“ฑ ์‹ค์ œ libp2p ์ŠคํŠธ๋ฆผ ํ”„๋กœํ† ์ฝœ TCP/IP ํ—ค๋”ยท์žฌ์ „์†ก, Noise ์•”ํ˜ธํ™” ์˜ค๋ฒ„ํ—ค๋“œ, Yamux framing, Docker overlay/VXLAN
์ŠคํŠธ๋ฆผ ํ”„๋กœํ† ์ฝœ ํ˜‘์ƒ ๋ฐ”์ดํŠธ NIC ์ „์ฒด ์‚ฌ์šฉ๋Ÿ‰, ํšŒ์„  ์ตœ๋Œ€ ์šฉ๋Ÿ‰, ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์—ฌ์œ  ์šฉ๋Ÿ‰

ํ”„๋กœํ† ์ฝœ์€ /meshsub/1.2.0 ๋“ฑ์˜ ์‹ค์ œ negotiated ID์ž…๋‹ˆ๋‹ค. ๋น„์–ด ์žˆ๋Š” ID๋Š” ๋ฏธ์ง€์ •/ํ˜‘์ƒ ์ค‘ ๋ฐ”์ดํŠธ์ž…๋‹ˆ๋‹ค. ํ˜‘์ƒ ๋‹จ๊ณ„์—์„œ ์†ก์‹  ์ธก์—๋Š” ์„ ํƒ๋œ ํ”„๋กœํ† ์ฝœ, ์ˆ˜์‹  ์ธก์—๋Š” ๋นˆ ID๋กœ ๊ท€์†๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง„ํ–‰ ์ค‘์ธ read/write์˜ ์ด๋Ÿ‰ ๊ฐฑ์‹ ๊ณผ ํ”„๋กœํ† ์ฝœ ๊ท€์† ์‚ฌ์ด์—๋Š” ์งง์€ ์ฐจ์ด๋„ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์†ก์‹  ์„ฑ๊ณต์€ libp2p ์ŠคํŠธ๋ฆผ์— ์“ด ๋ฐ”์ดํŠธ์ด๋ฉฐ, ์ƒ๋Œ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ตœ์ข… ์ „๋‹ฌ ์„ฑ๊ณต์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

libp2p host๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ๋ˆ„์ ๊ฐ’์€ 0์œผ๋กœ ์‹œ์ž‘ํ•˜๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ „์†ก๋ฅ ์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

sent bit/s     = 8 ร— (sentBytes_now - sentBytes_previous) / elapsed_seconds
received bit/s = 8 ร— (receivedBytes_now - receivedBytes_previous) / elapsed_seconds

๊ฒฝ๊ณผ์‹œ๊ฐ„์€ Peer์˜ ๋‹จ์กฐ ์‹œ๊ณ„์ž…๋‹ˆ๋‹ค. Controller ์‹œ๊ณ„ ๋™๊ธฐํ™”๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ๋น„์œจ ๊ณ„์‚ฐ์˜ ๋ถ„๋ชจ๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฒซ ํ‘œ๋ณธ์€ host ์ƒ์„ฑ ์‹œ์ ์˜ 0์—์„œ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๊ธฐ Controller ์‹œ๊ณ„ ๋™๊ธฐํ™” ์‹œ๋„ ํ›„ ์ฒซ ์ƒ˜ํ”Œ, ์ดํ›„ 5์ดˆ๋งˆ๋‹ค ์ƒ˜ํ”Œ, ์ •์ƒ host ์ข…๋ฃŒ ํ›„ ๋งˆ์ง€๋ง‰ final: true ์ƒ˜ํ”Œ์„ telemetry ์ข…๋ฃŒ flush ์ „์— ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ ๋™๊ธฐํ™”๊ฐ€ ์‹คํŒจํ•ด๋„ ์ˆ˜์ง‘์€ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ Peer์˜ ์‹œ๊ณ„์—ด ๋ฐฐ์น˜๋Š” ์ด๋ฒคํŠธ ์‹œ๊ฐ์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์‹œ๊ณ„ ๋ฏธ๋™๊ธฐํ™”ยท๋ณด์ • ์˜ค์ฐจ์˜ ์˜ํ–ฅ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ์˜ clockBasis/clockUncertaintyMs๋ฅผ ํ•จ๊ป˜ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €์žฅ๊ณผ ํ’ˆ์งˆ

๋กœ์ปฌ current-run/<id>/์— ๊ธฐ๋กํ•œ ๋’ค runs/<id>/์— ๋ณด๊ด€ํ•˜๊ณ  ๊ฒฐ๊ณผ ๋‚ด๋ณด๋‚ด๊ธฐ์˜ events.jsonl๋กœ ํ•ฉ์น˜๋Š” type: "bandwidth" ์ด๋ฒคํŠธ๋Š” ๊ธฐ์กด runId, agentId, nodeId, sessionId, sequence, timestamp์™€ ๋‹ค์Œ typed ํ•„๋“œ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

{"bandwidth":{"elapsedNs":5000000000,"receivedBytes":1000,"sentBytes":2000,"protocols":[{"protocol":"/meshsub/1.2.0","receivedBytes":1000,"sentBytes":2000}],"final":false}}
  • (nodeId, sessionId)๋งˆ๋‹ค ์ตœ์‹  ๋ˆ„์ ๊ฐ’์„ ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ์ด๋ฒคํŠธ์˜ ์žฌ์ „์†ก์€ ๊ธฐ์กด ์‹๋ณ„์ž๋กœ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์žฌ์‹œ์ž‘์€ ์ƒˆ ์„ธ์…˜์ž…๋‹ˆ๋‹ค.
  • ์ค‘๊ฐ„ ์ƒ˜ํ”Œ์ด ๋น ์ง€๋ฉด ๋‹ค์Œ ๋ˆ„์ ๊ฐ’์ด ๋ฐ”์ดํŠธ ์ด๋Ÿ‰์„ ๋ณต๊ตฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๊ตฌ๊ฐ„์˜ ์ „์†ก๋ฅ ์€ ๋” ๊ธด ๊ธฐ๊ฐ„์˜ ํ‰๊ท ์ด๋ฉฐ ์‚ฌ๋ผ์ง„ ์ˆœ๊ฐ„ ํ”ผํฌ๋ฅผ ๋ณต์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋Šฆ๊ฒŒ ๋„์ฐฉํ•œ ์ด์ „ ํ‘œ๋ณธ์€ supersededSamples์— ์ง‘๊ณ„ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ์„ธ์…˜์—์„œ ์—ญํ–‰ํ•˜๋Š” ์นด์šดํ„ฐ, ์ž˜๋ชป๋œ ํ”„๋กœํ† ์ฝœ ์นด์šดํ„ฐ, ๋ˆ„๋ฝ๋œ ์„ธ์…˜/์‹œ๊ฐ, ์ „์ฒด ์‹คํ–‰์˜ signed 64-bit ๋ˆ„์ ๋Ÿ‰์„ ๋„˜์น˜๋Š” ํ‘œ๋ณธ์€ rejectedSamples์— ์ง‘๊ณ„ํ•˜๊ณ  ๊ณ„์‚ฐ์—์„œ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๋ฝ๋œ ์†Œ์Šค ์‹œ๊ฐ์„ Controller ์ˆ˜์‹  ์‹œ๊ฐ์œผ๋กœ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • finalizedSessions / sessions๋Š” ํ•œ ๋ฒˆ์ด๋ผ๋„ ๋ณด๊ณ ํ•œ ์„ธ์…˜ ์ค‘ ์ข…๋ฃŒ ์ƒ˜ํ”Œ๊นŒ์ง€ ๋ฐ›์€ ๋น„์œจ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜ telemetry ํ์—๋Š” ๋งˆ์ง€๋ง‰ ์œ ์‹ค ์•Œ๋ฆผยท์ข…๋ฃŒ ์ฒดํฌํฌ์ธํŠธยท๋Œ€์—ญํญ ํ‘œ๋ณธ์„ ์œ„ํ•œ ์ž๋ฆฌ๋ฅผ ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค. ๊ฐ•์ œ ์ข…๋ฃŒ๋‚˜ ํ†ต์‹  ์žฅ์• ๋กœ ๋งˆ์ง€๋ง‰ ์ƒ˜ํ”Œ์ด ์œ ์‹ค๋  ์ˆ˜๋Š” ์žˆ์Šต๋‹ˆ๋‹ค. ์ข…๋ฃŒ ์ƒ˜ํ”Œ์ด ์—†๋Š” ๊ผฌ๋ฆฌ ๊ตฌ๊ฐ„์€ ๋ฏธ์ง€์ˆ˜์ž…๋‹ˆ๋‹ค. ์ „ํ˜€ ๋ณด๊ณ ํ•˜์ง€ ์•Š์€ Peer๋Š” ์ด ๋น„์œจ์˜ ๋ถ„๋ชจ์—๋„ ์—†์œผ๋ฏ€๋กœ 100%๊ฐ€ ์ „์ฒด ์‹คํ—˜์˜ ์™„์ „์„ฑ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ˆ˜์ง‘๋œ 0์€ 0์œผ๋กœ, ํ‘œ๋ณธ์ด ์—†๋Š” ์ด์ „ ๊ฒฐ๊ณผ๋Š” N/A๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์†ก์‹ ๊ณผ ์ˆ˜์‹ ์€ ๊ฐ™์€ ์ „์†ก์˜ ์–‘ ๋์„ ์…€ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•ฉ๊ณ„๋ฅผ ๊ณ ์œ  ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์œผ๋กœ ํ•ด์„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ค์ •ํ•œ payload ๋ฐ”์ดํŠธ๋ฅผ ์„ธ๋Š” ๊ธฐ์กด kpl_message_bytes_total์€ ๋ณ„๊ฐœ์˜ ์ง€ํ‘œ์ž…๋‹ˆ๋‹ค.

metrics.bandwidth์—๋Š” scope: "libp2p-stream-v1", ์ „์ฒด ๋ฐ ํ”„๋กœํ† ์ฝœ๋ณ„ ์†ก์ˆ˜์‹  ๋ˆ„์  ๋ฐ”์ดํŠธ, sessions/finalizedSessions/samples/rejectedSamples/supersededSamples/latestAt๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ ๊ฒฐ๊ณผ์—๋Š” ํ•„๋“œ๊ฐ€ ์—†์œผ๋ฉฐ, ์œ ํšจ ํ‘œ๋ณธ์ด ์—†์œผ๋ฉด ์ˆ˜์น˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ ZIP์˜ ์›๋ณธ ์ด๋ฒคํŠธ์™€ metrics.json, ๋ถ„์„ API์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ €์žฅ ๊ฒฐ๊ณผ ๋ถ„์„๊ณผ ZIP์€ Controller ์žฌ์‹œ์ž‘ ํ›„์—๋„ ์ „์ฒด ํŒŒ์ผ์„ ์žฌ์ƒํ•˜์—ฌ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด์žฅ Dashboard

Dashboard์˜ P2P B/W ยท Send / Receive ์นด๋“œ๋Š” ๊ฐ™์€ Metrics ํ–‰์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋Œ€ํ‘œ ๊ฐ’์€ ํ˜„์žฌ ์‹คํ–‰์˜ ์†ก์ˆ˜์‹  ์ „์†ก๋ฅ ์ด๋ฉฐ, ๊ฐ ์นด๋“œ๋ฅผ ํŽผ์น˜๋ฉด ๋ˆ„์  ์ „์†ก๋Ÿ‰๊ณผ ์„ค๋ช…์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์šฐ์Šคยทํ‚ค๋ณด๋“œยทํ„ฐ์น˜ ์กฐ์ž‘์€ Metrics ์‚ฌ์šฉ๋ฒ•์„ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค. ์ „์†ก๋ฅ ์€ ๊ฐ Peer์˜ ๋งˆ์ง€๋ง‰ ์†Œ์Šค ์ธก์ • ๊ตฌ๊ฐ„ ํ‰๊ท ์„ ํ•ฉ์‚ฐํ•˜๋ฉฐ, ๋‹จ์œ„๋Š” bit/sยทkbit/sยทMbit/s ๋“ฑ์œผ๋กœ ์ž๋™ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„์ ๋Ÿ‰์€ BยทKiBยทMiB ๋“ฑ์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ํ† ํด๋กœ์ง€์˜ topic/layer ํ•„ํ„ฐ์™€ ๋…๋ฆฝ์ ์ด๋ฉฐ ์ƒ๋‹จ Run metrics์— ํ‘œ์‹œ๋œ ์‹คํ–‰์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

B/W measurement๋Š” ๊ฐ™์€ ํ–‰์—์„œ ์ˆ˜์ง‘ ํ’ˆ์งˆ์„ ํ‘œ์‹œํ•˜๋ฉฐ, ํŽผ์น˜๋ฉด ์‹ ์„ ํ•œ ํ™œ์„ฑ ์„ธ์…˜ ์ˆ˜, ์ข…๋ฃŒ ํ‘œ๋ณธ ์ˆ˜, ๋งˆ์ง€๋ง‰ ํ‘œ๋ณธ ์‹œ๊ฐ๊ณผ ๊ฑฐ๋ถ€ ํ‘œ๋ณธ ์ˆ˜๋ฅผ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค. ์ผ๋ถ€ ํ™œ์„ฑ ์„ธ์…˜๋งŒ ์‹ ์„ ํ•˜๋ฉด Partial, ์ „์†ก๋ฅ ์„ ์•Œ ์ˆ˜ ์—†์œผ๋ฉด Rate unavailable, ์œ ํšจ ํ‘œ๋ณธ์ด ์—†์œผ๋ฉด N/A์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ์ธก์ •ํ•œ 0์€ 0์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. 15์ดˆ ์‹ ์„ ๋„ ๊ธฐ์ค€๊ณผ ์ •์ƒ ์ข…๋ฃŒ ํ›„ 0 ์ „์†ก๋ฅ ์€ Grafana์™€ ๊ฐ™์œผ๋ฉฐ ๋ˆ„์ ๋Ÿ‰์€ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹œ๋ณด๋“œ ์ŠคํŠธ๋ฆผ์€ trace ์ด๋ฒคํŠธ๊ฐ€ ์—†์–ด๋„ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” ๊ฐ’์„ ํ™•์ธํ•ด ๋งŒ๋ฃŒ๋œ ์ „์†ก๋ฅ ์„ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ ์Šค๋ƒ…์ƒท์˜ metrics.bandwidth.currentRates์— ์ด ์ง‘๊ณ„๊ฐ€ ํฌํ•จ๋˜๋ฉฐ, ์ €์žฅ ๊ฒฐ๊ณผ ์ง‘๊ณ„์—๋Š” ํ˜„์žฌ ์‹œ๊ฐ์— ๋”ฐ๋ฅธ ์ „์†ก๋ฅ ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Saved results โ†’ Images๋Š” ์ „์ฒดยทํ”„๋กœํ† ์ฝœ๋ณ„ ์†ก์‹ ยท์ˆ˜์‹  ์ „์†ก๋ฅ (kbit/s)๊ณผ ๋ˆ„์  ์ „์†ก๋Ÿ‰(KiB)์„ PNGยทCSV๋กœ ์ œ๊ณตํ•˜๋ฉฐ ์ „์ฒด ์ฐจํŠธ๋ฅผ ZIP์œผ๋กœ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›๋ณธ ๋ˆ„์  ์นด์šดํ„ฐ๋Š” ๊ฒฐ๊ณผ APIยทZIP๊ณผ Grafana์—๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐจํŠธ ์กฐ์ž‘๊ณผ ๋น„๊ต ๋ฐฉ๋ฒ•์€ ์‹œ๊ฐํ™”๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

API๋Š” ๊ธฐ์กด ๋ถ„์„ ์‘๋‹ต์— bandwidthTimeline, bandwidthBinSeconds๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๊ตฌ๊ฐ„์€ at, ์†ก์ˆ˜์‹  ๋ฐ”์ดํŠธ, ํ”„๋กœํ† ์ฝœ๋ณ„ ๋ฐ”์ดํŠธ, peerSeconds(๊ทธ ๊ตฌ๊ฐ„์— ๋ฐฐ๋ถ„๋œ ์ˆ˜์ง‘ ๊ธฐ๊ฐ„์˜ Peerยท์ดˆ ํ•ฉ๊ณ„)๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. peerSeconds๋Š” ์ค‘๋ณต ์—†๋Š” ๋…ธ๋“œ ์ˆ˜๋‚˜ ์ธก์ • ์™„์ „์„ฑ ๋น„์œจ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ธฐ๋ณธ 5์ดˆ, ์ตœ๋Œ€ 360๊ตฌ๊ฐ„์œผ๋กœ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๊ตฌ๊ฐ„ ๋ฐ”์ดํŠธ๋Š” ์‹œ๊ฐ„ ๊ฒน์นจ ๋น„์œจ ๋•Œ๋ฌธ์— ์†Œ์ˆ˜์ผ ์ˆ˜ ์žˆ์œผ๋‚˜ ์ „์ฒด ํ•ฉ๊ณ„๋Š” ์ •์ˆ˜ ๋ˆ„์  ์นด์šดํ„ฐ์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค(๋ถ€๋™์†Œ์ˆ˜์  ๋ฐ˜์˜ฌ๋ฆผ ์ œ์™ธ). ๊ธฐ๋ก์ด ์—†๋Š” ๊ตฌ๊ฐ„์—๋Š” ์„ ์„ ์ž‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ Peer๋งŒ ๋ณด๊ณ ํ•œ ๊ตฌ๊ฐ„์˜ ๊ฐ’์€ ๋ณด๊ณ ๋œ Peer๋“ค์˜ ์‚ฌ์šฉ๋Ÿ‰์ž…๋‹ˆ๋‹ค.

Prometheus / Grafana

์ง€ํ‘œ ์ข…๋ฅ˜ / ์ถ”๊ฐ€ ๋ผ๋ฒจ
kpl_p2p_stream_bytes_total Counter / direction (send, receive)
kpl_p2p_protocol_stream_bytes_total Counter / direction, protocol
kpl_p2p_stream_bits_per_second Gauge / direction
kpl_p2p_protocol_stream_bits_per_second Gauge / direction, protocol
kpl_p2p_bandwidth_sample_timestamp_seconds Gauge / ๊ทธ๋ฃน์˜ ๊ฐ€์žฅ ์ตœ๊ทผ ์†Œ์Šค ํ‘œ๋ณธ ์‹œ๊ฐ
kpl_p2p_bandwidth_sessions Gauge / state (open, final)๋ณ„ ์„ธ์…˜ ์ˆ˜

๊ณตํ†ต ๋ผ๋ฒจ์€ run_id, agent_id์ž…๋‹ˆ๋‹ค. ๋‚ด๋ณด๋‚ด๊ธฐ ์ „์— ์„ธ์…˜๋ณ„ ๋ˆ„์ ๋Ÿ‰๊ณผ ์œ ํšจ ์ „์†ก๋ฅ ์„ ํ•ฉ์‚ฐํ•˜์—ฌ Peer ๊ต์ฒด๊ฐ€ Prometheus ์‹œ๊ณ„์—ด์„ ๊ณ„์† ๋Š˜๋ฆฌ์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œยท์„ธ์…˜ ์ƒ์„ธ ์ •๋ณด๋Š” ์›๋ณธ ๋กœ๊ทธ์™€ ์ €์žฅ ๋ถ„์„์— ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. topic ๊ท€์†์€ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ GossipSub RPC/์ŠคํŠธ๋ฆผ์— ์—ฌ๋Ÿฌ topic๊ณผ topic ์—†๋Š” control ๋ฐ์ดํ„ฐ๊ฐ€ ์„ž์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

Grafana์˜ P2P stream bandwidth ์˜์—ญ์€ ์ „์ฒด/ํ”„๋กœํ† ์ฝœ๋ณ„ ์‚ฌ์šฉ๋ฅ , ๋ˆ„์ ๋Ÿ‰, ์ข…๋ฃŒ ํ‘œ๋ณธ ๋Œ€๊ธฐ ์„ธ์…˜ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. Run/Agent ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ Topic ํ•„ํ„ฐ๋Š” ์ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ „์†ก๋ฅ  Gauge๋Š” ๋งˆ์ง€๋ง‰ ์†Œ์Šค ์ˆ˜์ง‘ ๊ฐ„๊ฒฉ์˜ ํ‰๊ท ์ด๋ฏ€๋กœ rate()๋ฅผ ๋‹ค์‹œ ์”Œ์šฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋น„์ข…๋ฃŒ ์†Œ์Šค ํ‘œ๋ณธ์˜ ์‹œ๊ฐ์ด Controller ์‹œ๊ฐ๋ณด๋‹ค 15์ดˆ ๋„˜๊ฒŒ ๊ณผ๊ฑฐ์ด๊ฑฐ๋‚˜ ๋ฏธ๋ž˜์ด๋ฉด ์ง‘๊ณ„ ์ „์†ก๋ฅ ์—์„œ ํ•ด๋‹น ์„ธ์…˜์„ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ์ข…๋ฃŒ ํ‘œ๋ณธ์„ ๋ฐ›์€ ์„ธ์…˜์€ ํ˜„์žฌ ์‚ฌ์šฉ๋ฅ  0์œผ๋กœ ํ•ฉ์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์œ ํšจํ•œ ํ‘œ๋ณธ์ด๋‚˜ ์ข…๋ฃŒ๋œ ์„ธ์…˜์ด ํ•˜๋‚˜๋„ ์—†๋Š” ๊ทธ๋ฃน์€ ์ „์†ก๋ฅ ์„ ์ƒ๋žตํ•˜๋ฉฐ, ๋ˆ„์  ์นด์šดํ„ฐ์—๋Š” ์ข…๋ฃŒ๋œ ์„ธ์…˜์˜ ๋ฐ”์ดํŠธ๋„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์‹คํ–‰ ์„ ํƒ ์‹œ ๋ฒ”๋ก€๋กœ ์‹คํ–‰์„ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

์‹ค์‹œ๊ฐ„ ๋ฉ”๋ชจ๋ฆฌ ์ง€ํ‘œ๋Š” ํ˜„์žฌ Controller ์‹คํ–‰ ์ค‘ ๋ฐ›์€ ์„ธ์…˜์— ๋Œ€ํ•œ ๊ฐ’์ž…๋‹ˆ๋‹ค. Controller ์žฌ์‹œ์ž‘ ์‹œ ๊ณผ๊ฑฐ ๋ชจ๋“  ๋กœ๊ทธ๋ฅผ ์ž๋™์œผ๋กœ Prometheus ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด Prometheus ์ €์žฅ ์ด๋ ฅ์€ ๊ทธ ์„œ๋ฒ„์˜ ๋ณด์กด ์ •์ฑ…์„ ๋”ฐ๋ฅด๋ฉฐ, ์ €์žฅ ๊ฒฐ๊ณผ ํ™”๋ฉด/ZIP์ด ์žฌ์‹œ์ž‘ ํ›„ ์ „์ฒด ์‹คํ—˜์„ ๋ณต์›ํ•˜๋Š” ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. ์ƒˆ ๋ˆ„์  ์ƒ˜ํ”Œ์ด ๋“ค์–ด์˜ค๋ฉด ํ•ด๋‹น Peer ์„ธ์…˜์˜ ์ด์ „ ๋ฐ”์ดํŠธ๋„ ์ฆ‰์‹œ ๋ณต๊ตฌ๋ฉ๋‹ˆ๋‹ค. ์งง์€ ์‹คํ—˜์ด Prometheus scrape ์‚ฌ์ด์— ๋๋‚˜๋„ ์ตœ์ข… ๋ˆ„์ ๋Ÿ‰์€ ์ดํ›„ scrape์— ์žกํž ์ˆ˜ ์žˆ์ง€๋งŒ, ์ค‘๊ฐ„ ์ „์†ก๋ฅ  ํŒŒํ˜•์€ ์ €์žฅ ๊ฒฐ๊ณผ ๋ถ„์„์—์„œ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ €์žฅ ๊ฒฐ๊ณผ ์‹œ๊ฐํ™” ยท v2 ์ „์ฒด ๋ถ„์„ ๋Œ€์กฐ