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

๋ชจ๋‹ˆํ„ฐ๋งยท์ ‘๊ทผ ๋กœ๊ทธยท์—ฐ๊ฒฐ ์ง„๋‹จ

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

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

Swarm ๋ฐฐํฌ ๊ฐ€์ด๋“œ์— ๋”ฐ๋ผ stack์„ ๋ฐฐํฌํ•˜์‹ญ์‹œ์˜ค. Controller, ์„ ํƒํ•œ ๋…ธ๋“œ๋งˆ๋‹ค Agent ํ•˜๋‚˜, Prometheus์™€ Grafana๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ ์†Œ์Šค์™€ KP2PLab Experiment Analysis ๋Œ€์‹œ๋ณด๋“œ๋Š” ์ž๋™ ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค. sh scripts/swarm.sh access๋กœ control ๋…ธ๋“œ์˜ ๊ฒŒ์‹œ ์ฃผ์†Œ๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ์•„๋ž˜ ์˜ˆ์ œ์˜ control-node๋Š” ํ•ด๋‹น ํ˜ธ์ŠคํŠธ ์ฃผ์†Œ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

๋Œ€์‹œ๋ณด๋“œ๋Š” ์˜์–ด๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, Swarm stack์€ GF_USERS_DEFAULT_LANGUAGE=en-US๋กœ Grafana UI ๊ธฐ๋ณธ ์–ธ์–ด๋ฅผ ์˜์–ด๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋‚˜ ์กฐ์ง์˜ ์–ธ์–ด ์„ค์ •์ด ์žˆ์œผ๋ฉด ํ•ด๋‹น UI ๊ธฐ๋ณธ๊ฐ’๋ณด๋‹ค ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค. Grafana ์–ธ์–ด ์„ค์ • ๋ฌธ์„œ

Grafana๋Š” ์ตœ์ดˆ ์‹คํ–‰ ์‹œ SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋ฏ€๋กœ ๋””์Šคํฌ ์„ฑ๋Šฅ์— ๋”ฐ๋ผ ์ค€๋น„๊นŒ์ง€ ์ˆ˜ ๋ถ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. sh scripts/swarm.sh logs grafana์—์„œ ์ดˆ๊ธฐํ™” ์ง„ํ–‰ ์ƒํ™ฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ดํ›„ ์‹œ์ž‘์—์„œ๋Š” ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋กœ์ปฌ SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋Š” WAL ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ WAL ํŒŒ์ผ์€ ๊ฐ™์€ Grafana named volume์— ๋ณด์กด๋ฉ๋‹ˆ๋‹ค. Grafana ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์ •

ํ™”๋ฉด ๊ธฐ๋ณธ ์ฃผ์†Œ
KPL Dashboard http://control-node:8080
Grafana ์‹คํ—˜ ๋ถ„์„ http://control-node:3000/d/kpl-experiments
Prometheus ์ฟผ๋ฆฌ/์ˆ˜์ง‘ ์ƒํƒœ http://control-node:9090
Controller ์ง€ํ‘œ ์›๋ฌธ http://control-node:8080/metrics

Swarm stack์€ Grafana ์ต๋ช… ์ ‘์†์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  GRAFANA_ADMIN_PASSWORD๋ฅผ ํ•„์ˆ˜๋กœ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ์„ค์ • helper๊ฐ€ manager ์„ค์ •์— ์ž๊ฒฉ ์ฆ๋ช…์„ ์ €์žฅํ•˜๋ฉฐ sh scripts/swarm.sh credentials๋กœ ์„ค์ •๋œ ๋กœ๊ทธ์ธ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด stack์€ ์‹œ์ž‘ํ•  ๋•Œ ์›๋ž˜ Grafana ๊ด€๋ฆฌ์ž ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์„ค์ •๊ฐ’์œผ๋กœ ๋™๊ธฐํ™”ํ•˜๋ฉฐ ๊ธฐ์กด ์‚ฌ์šฉ์ž๋ช…๊ณผ ๋ฐ์ดํ„ฐ๋Š” ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

Swarm์€ Prometheus/Grafana ํฌํŠธ๋ฅผ control ๋…ธ๋“œ์— ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ฐ Agent์˜ ์ „์šฉ metrics listener๋„ ํ•ด๋‹น ๋…ธ๋“œ์˜ KPL_AGENT_METRICS_PORT(๊ธฐ๋ณธ 9091)๋กœ ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค. scripts/swarm.sh configure๋กœ PROMETHEUS_PORT, GRAFANA_PORT ๋˜๋Š” Agent metrics ํฌํŠธ๋ฅผ ๋ณ€๊ฒฝํ•œ ๋’ค ๋‹ค์‹œ ๋ฐฐํฌํ•ด ์ ์šฉํ•˜์‹ญ์‹œ์˜ค.

๋Œ€์‹œ๋ณด๋“œ ์ƒ๋‹จ ๋ฉ”๋‰ด๋Š” Prometheus์™€ Grafana๋ฅผ ์ƒˆ ํƒญ์œผ๋กœ ์—ฝ๋‹ˆ๋‹ค. ํ˜„์žฌ Dashboard์˜ scheme๊ณผ ํ˜ธ์ŠคํŠธ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์„ค์ •๋œ ๊ฒŒ์‹œ ํฌํŠธ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ํฌํŠธ๊ฐ€ ์„ค์ •๊ฐ’๊ณผ ๊ฐ™์œผ๋ฉด ์ง์ ‘ ์ ‘์†๊ณผ SSH ํ„ฐ๋„์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. Proxy๊ฐ€ scheme/path๋ฅผ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ๋กœ์ปฌ forwarding์— ๋‹ค๋ฅธ ํฌํŠธ๋ฅผ ์“ฐ๋ฉด ์‹ค์ œ ๋ชจ๋‹ˆํ„ฐ๋ง ์ฃผ์†Œ๋ฅผ ๋ณ„๋„๋กœ ์—ฌ์‹ญ์‹œ์˜ค.

ํ™”๋ฉด ์กฐ์ž‘์€ ๋Œ€์‹œ๋ณด๋“œ, ์‹คํ–‰ ๋ณต๊ตฌ๋Š” ์‹คํ—˜, ์›๋ณธ ๋‚ด๋ณด๋‚ด๊ธฐ์™€ ๋ฐฑ์—…์€ ์ €์žฅ ๊ฒฐ๊ณผ๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

์‹คํ–‰๊ณผ ๋ถ„์„

  1. ๋Œ€์‹œ๋ณด๋“œ์˜ Run experiment์—์„œ examples/monitoring.yaml์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. envelope ๋ฐœํ–‰๊ณผ raw ๋ฐœํ–‰์„ ํ•จ๊ป˜ ํ™•์ธํ•˜๋Š” ์ž‘์€ ์‹คํ—˜์ž…๋‹ˆ๋‹ค. Run ์˜† Runs๋ฅผ 1~100์œผ๋กœ ์ง€์ •ํ•˜๋ฉด ์ˆœ์ฐจ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค. ํšŒ์ฐจ๋งˆ๋‹ค ๋ณ„๋„ ๊ฒฐ๊ณผ๋ฅผ ๋‚จ๊ธฐ๋ฉฐ ์‹คํŒจ ๋˜๋Š” Stop batch๋Š” ๋‚˜๋จธ์ง€๋ฅผ ์ทจ์†Œํ•ฉ๋‹ˆ๋‹ค. ์‹คํ–‰๊ณผ ๋ฐ˜๋ณต๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.
  2. Grafana์—์„œ Run(run_id), Agent, Topic์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ run์„ ๊ณ ๋ฅด๋ฉด ์„ ํƒํ•œ ์‹คํ—˜์˜ ํŠธ๋ž˜ํ”ฝยท์ง€์—ฐ์„ ํ•ฉ์‚ฐํ•˜๋ฉฐ, ๋„คํŠธ์›Œํฌ ์„ค์ •ยท๋Œ€์—ญํญ ์‹œ๊ณ„์—ด์€ ๋ฒ”๋ก€์—์„œ run๋ณ„๋กœ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์„ธ์…˜ ๋„๋‹ฌ๋ฅ  ํŒจ๋„์€ Run๋งŒ, ๋Œ€์—ญํญยทcontrol ํŒจ๋„์€ Topic ์—†์ด Run๊ณผ Agent๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  3. ์‹คํ—˜์ด ๋๋‚œ ๋’ค์—๋„ ์‹œ๊ฐ„ ๋ฒ”์œ„๋ฅผ ํ•ด๋‹น ์‹คํ–‰ ๊ตฌ๊ฐ„์œผ๋กœ ์ง€์ •ํ•˜๋ฉด ์‹œ๊ณ„์—ด์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์ƒˆ๋กœ๊ณ ์นจ์€ 5์ดˆ์ž…๋‹ˆ๋‹ค.

Prometheus๋Š” Controller์™€ Agent์˜ /metrics๋ฅผ 5์ดˆ๋งˆ๋‹ค ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค. Controller๊ฐ€ ๋“ฑ๋ก๋œ Agent์˜ metrics URL์„ HTTP service discovery๋กœ ๋ฐ˜ํ™˜ํ•˜๊ณ , Prometheus๊ฐ€ service VIP ๋Œ€์‹  ๊ฐ Agent์˜ host-mode ํฌํŠธ์— ์ง์ ‘ ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค. Peer๋ฅผ ์ง์ ‘ scrapeํ•˜๊ฑฐ๋‚˜ ๊ฐ ์ปจํ…Œ์ด๋„ˆ์— exporter๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Controller๋Š” ๊ธฐ์กด Peer telemetry๋ฅผ ๋ˆ„์  ์ง‘๊ณ„ํ•˜๋ฏ€๋กœ scope: all์—์„œ telemetry๊ฐ€ ์†์‹ค๋˜๋ฉด Controller๊ฐ€ ๋งŒ๋“œ๋Š” Peer ์ง€ํ‘œ๋„ ์˜ํ–ฅ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๋ชจ๋‹ˆํ„ฐ๋ง ์„œ๋น„์Šค๋Š” ๋ณ„๋„ Docker network์— ์žˆ์œผ๋ฉฐ Peer์—๋Š” ์ถ”๊ฐ€ ๋„คํŠธ์›Œํฌยท๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ง€ํ‘œ์˜ ์˜๋ฏธ

์ง€ํ‘œ ์˜๋ฏธ
kpl_events_total Controller๊ฐ€ ์ˆ˜์‹ ํ•œ ์ด๋ฒคํŠธ ๋ˆ„์  ์ˆ˜. run_id, agent_id, event_type, topic์œผ๋กœ ๊ตฌ๋ถ„
kpl_message_bytes_total ๋ฐœํ–‰/์ˆ˜์‹  ์ด๋ฒคํŠธ์˜ fields.wireBytes ํ•ฉ๊ณ„. Envelope ์‚ฌ์šฉ ์‹œ JSON/base64๋ฅผ ํฌํ•จํ•œ PubSub data์ด๋ฉฐ libp2p framing ๋ฐ TCP/IP ํ—ค๋” ์ œ์™ธ
kpl_p2p_stream_bytes_total, kpl_p2p_protocol_stream_bytes_total RunยทAgentยท๋ฐฉํ–ฅ๋ณ„ ์‹ค์ œ libp2p ์ŠคํŠธ๋ฆผ ๋ˆ„์  ๋ฐ”์ดํŠธ. ์ „์ฒด ๋ฐ negotiated protocol๋ณ„ ๊ฐ’
kpl_p2p_stream_bits_per_second, kpl_p2p_protocol_stream_bits_per_second ์†Œ์Šค ์ˆ˜์ง‘ ๊ตฌ๊ฐ„์˜ ํ‰๊ท  bit/s gauge. rate() ์—†์ด ์ง์ ‘ ์กฐํšŒ
kpl_p2p_bandwidth_sample_timestamp_seconds, kpl_p2p_bandwidth_sessions ์ตœ๊ทผ ์†Œ์Šค ํ‘œ๋ณธ ์‹œ๊ฐ๊ณผ ์ •์ƒ host ์ข…๋ฃŒ ํ›„ ํ‘œ๋ณธ ์ˆ˜์‹ ยท๋ฏธ์ˆ˜์‹  ์„ธ์…˜ ์ˆ˜. ๋Œ€์—ญํญ ํ’ˆ์งˆ๊ณผ ํ•œ๊ณ„ ์ฐธ๊ณ 
kpl_gossipsub_control_rpcs_total ๊ฐ GossipSub ์ œ์–ด ํƒ€์ž…์„ ํฌํ•จํ•œ RPC envelope ์ˆ˜. send, recv, ๋กœ์ปฌ ์†ก์‹  ์ „ drop์œผ๋กœ ๊ตฌ๋ถ„
kpl_gossipsub_control_entries_total ํ•ด๋‹น RPC์— ๋‹ด๊ธด repeated protobuf control entry ์ˆ˜
kpl_gossipsub_control_message_ids_total IHAVE, IWANT, IDONTWANT entry ์•ˆ์˜ ์ค‘๋ณต ์ œ๊ฑฐํ•˜์ง€ ์•Š์€ ๋ฉ”์‹œ์ง€ ID ์ฐธ์กฐ ์ถœํ˜„ ํšŸ์ˆ˜
kpl_gossipsub_control_peer_exchange_records_total PRUNE entry์— ๋‹ด๊ธด peer-exchange record ์ˆ˜
kpl_window_stable_pairs, kpl_window_reached_pairs ๊ธฐ๊ฐ„์ด ์ง€๋‚œ ๋ฉ”์‹œ์ง€ ์ค‘ ์ˆ˜์‹  ๊ธฐ๊ฐ„ ์ „์ฒด์˜ ๊ตฌ๋…์ด ์ฆ๋ช…๋œ ์ˆ˜์‹  ์„ธ์…˜ ์Œ ๋ฐ ๊ธฐํ•œ ๋‚ด ์„ฑ๊ณต. run_id๋กœ ๊ตฌ๋ถ„
kpl_window_unknown_pairs, kpl_window_missed_pairs, kpl_window_late_pairs ์•ˆ์ • ์Œ์˜ ์ˆ˜์‹  ๋ถˆ๋ช…ยทํ™•์ธ๋œ ๋ฏธ๋„๋‹ฌ. ๊ธฐํ•œ ๋‚ด ์ˆ˜์‹ ์ด ์—†๋Š” late ์ˆ˜๋Š” ์•ž์˜ ๋‘ ๊ฒฐ๊ณผ ์ค‘ ํ•˜๋‚˜์™€ ๊ฒน์นจ
kpl_window_delivery_ratio (bound: lower / upper) ์•ˆ์ • ๋Œ€์ƒ ์กฐ๊ฑด๋ถ€ ๋„๋‹ฌ๋ฅ ์˜ ๋…ผ๋ฆฌ์  ์ƒยทํ•˜ํ•œ. ์•ˆ์ • ์Œ์ด ์—†์œผ๋ฉด ์ƒ๋žตํ•˜๋ฉฐ ์‹ ๋ขฐ๊ตฌ๊ฐ„์ด ์•„๋‹˜
kpl_window_initial_pairs, kpl_window_initial_reached_pairs, kpl_window_initial_unknown_pairs ํ™•์ธ๋œ ๋ฐœํ–‰ ์‹œ์  ๋Œ€์ƒ, ์ดํƒˆ์ž๋ฅผ ํฌํ•จํ•œ ๊ธฐํ•œ ๋‚ด ์„ฑ๊ณต, ์ˆ˜์‹  ๋ถˆ๋ช… ์ˆ˜
kpl_window_initial_delivery_ratio (bound: lower / upper) ํ™•์ธ๋œ ๋ฐœํ–‰ ์‹œ์  ๋Œ€์ƒ ์•ˆ์˜ ๋…ผ๋ฆฌ์  ๋„๋‹ฌ๋ฅ  ๋ฒ”์œ„. ํ•ด๋‹น ์ง‘๋‹จ์ด ๋น„์—ˆ์„ ๋•Œ๋งŒ ์ƒ๋žต
kpl_window_stable_coverage, kpl_window_stable_coverage_upper_bound coverage ํ•˜ํ•œ์ธ ์•ˆ์ •/ํ™•์ธ๋œ ๋ฐœํ–‰ ์‹œ์  ๋Œ€์ƒ๊ณผ ์ƒํ•œ์ธ (์•ˆ์ • + ์ง€์† ์—ฌ๋ถ€ ๋ถˆ๋ช…)/ํ™•์ธ๋œ ๋ฐœํ–‰ ์‹œ์  ๋Œ€์ƒ. ํ™•์ธ๋œ ์ง‘๋‹จ์ด ๋น„์—ˆ์„ ๋•Œ๋งŒ ์ƒ๋žต
kpl_window_departed_pairs, kpl_window_continuity_unknown_pairs ๋งˆ๊ฐ ์ „ ์ดํƒˆ์ด ํ™•์ธ๋œ ๋ฐœํ–‰ ์‹œ์  ์Œ๊ณผ, ์ดํƒˆยท๋งˆ๊ฐ๊นŒ์ง€ ์ง€์† ์–ด๋А ์ชฝ๋„ ์ฆ๋ช…ํ•˜์ง€ ๋ชปํ•œ ์Œ ์ˆ˜
kpl_window_publication_availability_unknown_pairs, kpl_window_availability_unknown_pairs ๋ฐœํ–‰ ์‹œ์  ์ƒ์กด์„ ์ฆ๋ช…ํ•˜์ง€ ๋ชปํ•œ ํ›„๋ณด ์Œ๊ณผ ๋ฐœํ–‰ ์‹œ์ ยท์ง€์† ๋ถˆ๋ช…์˜ ํ•ฉ๊ณ„
kpl_window_pending_publications, kpl_window_finalized_publications ๋งˆ๊ฐ ์ „ ๋ฉ”์‹œ์ง€์™€ ๊ธฐ๊ฐ„์ด ์ง€๋‚œ ๋ฉ”์‹œ์ง€. ํ™•์ • ๊ฒฐ๊ณผ๋„ ๋Šฆ์€ telemetry๋กœ ์ •์ • ๊ฐ€๋Šฅ
kpl_window_measurement_incomplete, kpl_window_legacy_publications ๊ด€์ธก๋œ ์ธก์ • ๋ฒ”์œ„ ๋ถˆ๋ช… stream ์—ฌ๋ถ€(0/1)์™€ ๊ณผ๊ฑฐ ์ •์˜ ๋ฐœํ–‰ ์ˆ˜. 0๋„ ์•„์˜ˆ ๋ณด์ด์ง€ ์•Š์€ telemetry๋Š” ๊ฒ€์ถœํ•˜์ง€ ๋ชปํ•จ
kpl_window_propagation_latency_seconds ์•ˆ์ • ๋Œ€์ƒ์˜ ๊ธฐํ•œ ๋‚ด ์ฒซ ์›๊ฒฉ envelope ์ˆ˜์‹  ์ง€์—ฐ. run_id, ์ˆ˜์‹  agent_id, topic์œผ๋กœ ๊ตฌ๋ถ„. rawยท๋กœ์ปฌยท๋งˆ๊ฐ ํ›„ยท์ดํƒˆยท๋ถˆ๋ช…ยท๋ฌดํšจ ํ‘œ๋ณธ ์ œ์™ธ
kpl_window_duplicate_copies, kpl_window_duplicates_per_reached_pair ์•ˆ์ • ๋Œ€์ƒ์˜ ์›๊ฒฉ ์„ฑ๊ณต ์Œ์—์„œ ๊ธฐ๊ฐ„ ์•ˆ์— ๊ด€์ธกํ•œ ์ถ”๊ฐ€ PubSub ๋ณต์‚ฌ๋ณธ ๋ฐ ์„ฑ๊ณต๋‹น ํ‰๊ท 
kpl_operation_failures_total onError: continue ์ •์ฑ…์—์„œ ๊ธฐ๋กํ•œ publish/leave ์‹คํŒจ
kpl_telemetry_dropped_events_total ๋ณด๊ณ ๋œ telemetry ์œ ์‹ค. P2P ํŒจํ‚ท ์†์‹ค์ด๋‚˜ ๋ฏธ๋ณด๊ณ  ์œ ์‹ค์ด 0์ด๋ผ๋Š” ์ฆ๊ฑฐ๊ฐ€ ์•„๋‹˜
kpl_nodes ์‹คํ—˜ยทAgentยท๊ทธ๋ฃนยท์—ญํ• ยทํƒ€์ž…ยท์ƒํƒœ๋ณ„ ํ”ผ์–ด ์ˆ˜
kpl_agent_* Controller์—์„œ ๊ด€์ธกํ•œ Agent ์ƒํƒœยท์šฉ๋Ÿ‰ยทheartbeat ๋ฐ Agent + Peer CPU/๋ฉ”๋ชจ๋ฆฌ gauge
kpl_experiment_* ์‹คํ—˜ ์ƒํƒœ, ๋‹จ๊ณ„, job ์ƒํƒœ
kpl_network_configured_* starting/ready ํ”ผ์–ด์˜ ํ™•์ • ์„ค์ •์„ ๊ทธ๋ฃน๋ณ„ ์ง‘๊ณ„. delay๋Š” ํ‰๊ท /์ตœ์†Œ/์ตœ๋Œ€, jitter/loss๋Š” ํ‰๊ท 
kpl_local_* ๊ฐ Agent์˜ ๋กœ์ปฌ ํ”ผ์–ด ์ƒํƒœ, ์šฉ๋Ÿ‰, ์ •๋ฆฌ ๋Œ€๊ธฐ, telemetry ํ ๊ธธ์ด
go_*, process_* scrape ๋Œ€์ƒ Controller/Agent ํ”„๋กœ์„ธ์Šค์˜ ๋Ÿฐํƒ€์ž„ยทCPUยท๋ฉ”๋ชจ๋ฆฌ. Peer ์ปจํ…Œ์ด๋„ˆ ์ „์ฒด ์ž์› ์‚ฌ์šฉ๋Ÿ‰์€ ์•„๋‹˜

kpl_network_configured_loss_ratio๋Š” ์„ค์ •ํ•œ ํŒจํ‚ท ์†์‹ค๋ฅ ์ด๋ฉฐ ์‹ค์ œ ๊ด€์ธก ์†์‹ค๋ฅ ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์„ค์ • delay๋„ ์‹ค์ œ RTT์™€ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. graft/prune/remove_peer ์ด๋ฒคํŠธ๋Š” PubSub mesh ๋ณ€ํ™”๋ฅผ ๋ถ„์„ํ•˜๋Š” ์ž๋ฃŒ์ด๋ฉฐ TCP ์—ฐ๊ฒฐ ๊ทธ๋ž˜ํ”„๋‚˜ ์™„์ „ํ•œ mesh snapshot์„ ๋œปํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ์•ฝ ๋„คํŠธ์›Œํฌ ๋ณ€๊ฒฝ์˜ configured gauge๋Š” Peer๊ฐ€ ์ ์šฉ ์„ฑ๊ณต์„ ๋ณด๊ณ ํ•œ ์ตœ์‹  ์กฐ๊ฑด์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. networkPending: "true"์ธ Peer๋Š” ๋ณด๊ณ  ์ „๊นŒ์ง€ ์ง‘๊ณ„์—์„œ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ ๋ณด๊ณ ยทAgent heartbeatยทPrometheus scrape๋งŒํผ ๊ด€์ธก ์ง€์—ฐ์ด ์žˆ์œผ๋ฉฐ, scope: all์€ ๋กœ์ปฌ ์˜ˆ์•ฝ์ด ๊ณ„์† ๋™์ž‘ํ•˜๋Š” ์ค‘์—๋„ ๋ณด๊ณ ๋ฅผ ๋” ๋Šฆ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์•ฝ Peer๋Š” ์ดˆ๊ธฐ ์ ์šฉ๊ณผ ์ดํ›„ ๋ณ€๊ฒฝ๋งˆ๋‹ค network_config_applied์— fields.network, reference, after, revision, initial, lateByMs๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ์ด๋ฒคํŠธ๋Š” ์‹œ์ž‘ ์กฐ๊ฑด์˜ ์ ์šฉ์„ ํ™•์ธํ•˜๋ฉฐ ์ดํ›„ ์ด๋ฒคํŠธ๋Š” tc ์„ฑ๊ณต ์งํ›„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์ง€์—ฐ์€ ์„ ํƒํ•œ ์˜ˆ์•ฝ ์‹œ์  ๊ธฐ์ค€์œผ๋กœ ๊ณ„์‚ฐํ•˜๋ฉฐ ์ดˆ๊ธฐ ์ด๋ฒคํŠธ์—๋Š” ์ดˆ๊ธฐํ™” ์‹œ๊ฐ„๋„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ค‘๊ฐ„ revision์„ ๊ฑด๋„ˆ๋›ฐ๋ฉด ๋Šฆ์€ ์ž…์žฅ ๋˜๋Š” ํƒ€์ด๋จธ ์ง€์—ฐ์„ ๋”ฐ๋ผ์žก์€ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. Clock basisยทoffsetยทuncertainty๋Š” ๊ธฐ์กด ์‹œ๊ณ„ ๋™๊ธฐํ™” ์ด๋ฒคํŠธ ๊ทœ์น™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. network_config_failed์—๋Š” ์‹คํŒจํ•œ revisionยท๊ธฐ์ค€ยท์˜ˆ์ • ๊ฒฝ๊ณผ ์‹œ๊ฐ„ยท์˜ค๋ฅ˜๋ฅผ ๊ธฐ๋กํ•˜๊ณ , Peer๋Š” ํ™•์ธ๋˜์ง€ ์•Š์€ ์กฐ๊ฑด์œผ๋กœ ๊ณ„์† ์ง„ํ–‰ํ•˜์ง€ ์•Š๊ณ  ์˜ค๋ฅ˜๋กœ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ์ด ์ด๋ฒคํŠธ๋Š” events.jsonl์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์‹œ๋‚˜๋ฆฌ์˜ค ์ „์ฒด๊ฐ€ ์ดํ›„ ์‹คํŒจํ•˜๋Š”์ง€๋Š” readinessยทpublishยท์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ phase์—๋„ ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์•ฝ ๋„คํŠธ์›Œํฌ ๋ณ€๊ฒฝ์„ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

์ œ์–ด counter๋Š” run_id, agent_id, direction, control_type label๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. IWANT์™€ IDONTWANT์—๋Š” topic์ด ์—†๊ณ  ํ•˜๋‚˜์˜ RPC๊ฐ€ ์—ฌ๋Ÿฌ topic์„ ๋‹ด์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ Topic filter๋Š” ์ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. send๋Š” ์›๊ฒฉ ์ˆ˜์‹ ์ด ์•„๋‹Œ outbound queue ์ˆ˜๋ฝ, recv๋Š” ์ดํ›„ router ์ •์ฑ… ๊ฒ€์‚ฌ ์ „ ๊ด€์ธก, drop์€ netem ์†์‹ค์ด ์•„๋‹Œ ๋กœ์ปฌ queue/ํฌ๊ธฐ ๊ฑฐ๋ถ€์ž…๋‹ˆ๋‹ค. RPC, entry, ๋ฉ”์‹œ์ง€ ID ์ฐธ์กฐ, PRUNE peer-exchange ์ˆ˜๋ฅผ ์„œ๋กœ ๋‹ค๋ฅธ ๋‹จ์œ„๋กœ ์ฝ์œผ์‹ญ์‹œ์˜ค. RPC๋ณ„ ์ •ํ™•ํ•œ topic ์ˆ˜์™€ metrics.json์˜ Agent๋ณ„ ๋ˆ„์ ์น˜๋Š” ๊ฒฐ๊ณผ ZIP์— ๋‚จ์Šต๋‹ˆ๋‹ค. ์‹คํ—˜ ์ง€ํ‘œ ์ •์˜๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

ํ˜„์žฌ ๊ด€๊ณ„๋Š” Dashboard์˜ ๋Œ€ํ™”ํ˜• ํ† ํด๋กœ์ง€๊ฐ€ Peer ์ƒํƒœ snapshot์œผ๋กœ transportยทKademlia ๋ผ์šฐํŒ… ํ…Œ์ด๋ธ”ยทGossipSub mesh๋ฅผ ๊ฐ๊ฐ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. Controller๋Š” observations.jsonl์—๋„ ํ‘œ๋ณธ ํ”„๋กœํ† ์ฝœ ๊ทธ๋ž˜ํ”„๋ฅผ ์ €์žฅํ•˜๋ฉฐ, ์ด ๊ทธ๋ž˜ํ”„๋Š” ํ”„๋กœํ† ์ฝœ ์•ˆ์—์„œ ํ† ํ”ฝ ๊ฐ„์„ ์„ ํ•ฉ์น˜๊ณ  ์ค‘๊ฐ„ ์ „์ด ์ „๋ถ€๋‚˜ ๊ฐœ๋ณ„ ์ ์ˆ˜ ์Œ์„ ๋ณด์กดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Prometheus์—๋Š” ์ด์— ๋Œ€์‘ํ•˜๋Š” ์ „์ฒด ๊ทธ๋ž˜ํ”„ ์ด๋ ฅ์ด ์—†์Šต๋‹ˆ๋‹ค.

Grafana ์„ธ์…˜ ํŒจ๋„์—๋Š” Run ํ•„ํ„ฐ๋งŒ ์ ์šฉํ•˜๊ณ  ๋ฐฑ๋ถ„์œจ ํ‰๊ท ์ด ์•„๋‹Œ ์ˆ˜์‹  ์Œ ํ•ฉ๊ณ„๋กœ ์ง‘๊ณ„ํ•ฉ๋‹ˆ๋‹ค. ๋ฒ”์œ„๋Š” ๊ด€์ธก๋œ ์ง‘๋‹จ์— ๋Œ€ํ•œ ๊ฐ’์ด๋ฉฐ ๋ณด์ด์ง€ ์•Š๋Š” ๋ชจ์ง‘๋‹จ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐœํ–‰ ์‹œ์  ๊ฐ€์šฉ์„ฑ ๊ฒฝ๊ณ ๋‚˜ measurementIncomplete๊ฐ€ ์žˆ์–ด๋„ ํ™•์ธ๋œ ๋ฐœํ–‰ ์‹œ์  ๋„๋‹ฌ๋ฅ ๊ณผ ์•ˆ์ • coverage๋ฅผ ํ‘œ์‹œํ•˜๋ฉฐ, ์„ ํƒํ•œ run ์ „์ฒด์— ํ™•์ธ๋œ ๋ฐœํ–‰ ์‹œ์  ์Œ์ด ํ•˜๋‚˜๋„ ์—†์„ ๋•Œ๋งŒ N/A์ž…๋‹ˆ๋‹ค. ๊ฐ ์ง‘๊ณ„์—์„œ ํ™•์ธ๋œ ๋ฐœํ–‰ ์‹œ์  ๋Œ€์ƒ = ์•ˆ์ • + ์ดํƒˆ + ์ง€์† ์—ฌ๋ถ€ ๋ถˆ๋ช…์ด ์„ฑ๋ฆฝํ•ฉ๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ ๋ฐœํ–‰ ํŒจ๋„์€ ์ƒˆ ๊ฒฐ๊ณผ์—์„œ ์ œ์™ธํ•œ ๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ํŒจ๋„์€ kpl_window_*๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์ด์ „ kpl_delivery_*ยทkpl_propagation_latency_seconds๋Š” ๊ณผ๊ฑฐ ์˜๋ฏธ๋ฅผ ์œ ์ง€ํ•˜๋ฏ€๋กœ ์„ž์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

์ „์ฒด deliver์—๋Š” ๋กœ์ปฌ ์ˆ˜์‹ ๋„ ํฌํ•จ๋˜๋ฏ€๋กœ ๋ฐœํ–‰ ์ˆ˜๋กœ ๋‚˜๋ˆ„์–ด ๋„๋‹ฌ๋ฅ ์„ ๊ตฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. TCP ์žฌ์ „์†ก์€ ํŒจํ‚ท ์†์‹ค์„ ์ง€์—ฐ์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€ํ‘œ ์ •์˜์™€ ์ˆ˜์‹์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ๋Šฆ์€ ๋ฐฐ์น˜๊ฐ€ ๊ธฐ๊ฐ„ gauge์™€ histogram ๋ฒ„ํ‚ท์„ ์ •์ •ํ•  ์ˆ˜ ์žˆ์–ด rate/increase ๋Œ€์‹  ์ง์ ‘ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. Grafana ์ง€์—ฐ์€ ์‹คํ—˜ ์ „์ฒด ๋ˆ„์  ๋ถ„์œ„์ˆ˜์ด๋ฉฐ ์„ ํƒ ์‹œ๊ฐ„ ๋ฒ”์œ„๋งŒ์˜ ๋ถ„์œ„์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋ˆ„์  ์นด์šดํ„ฐ๋Š” ์ตœ๊ทผ 300๊ฐœ ์›น ์ด๋ฒคํŠธ ๋ฒ„ํผ์™€ ๋…๋ฆฝ์ ์ž…๋‹ˆ๋‹ค. Controller ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žฌ์‹œ์ž‘๋˜๋ฉด ์นด์šดํ„ฐ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜๋ฉฐ ๊ณผ๊ฑฐ events.jsonl์„ ์ž๋™ ์žฌ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Prometheus์— ์ด๋ฏธ ์ €์žฅ๋œ ์‹œ๊ณ„์—ด์€ ์œ ์ง€๋˜๊ณ  rate/increase๋Š” ๊ด€์ธก๋œ ์นด์šดํ„ฐ ์žฌ์„ค์ •์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, scrape ์ „์— ์‚ฌ๋ผ์ง„ ์ด๋ฒคํŠธ๋‚˜ telemetry ์ „์†ก ์‹คํŒจ๋ฅผ ๋ณต๊ตฌํ•˜๋Š” ๊ธฐ๋Šฅ์€ ์•„๋‹™๋‹ˆ๋‹ค. increase๋Š” scrape ํ‘œ๋ณธ์œผ๋กœ ์ถ”์ •ํ•œ ๊ตฌ๊ฐ„ ์ฆ๊ฐ€๋Ÿ‰์ด๋ฏ€๋กœ ๋ˆ„์  ์ •์ˆ˜ ์ด๋ฒคํŠธ ์ˆ˜์™€ ํ•ญ์ƒ ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์ €์žฅ Run์„ ์‚ญ์ œํ•˜๋ฉด Controller์˜ ํ•ด๋‹น ์ด๋ฒคํŠธ ์นด์šดํ„ฐ, ์ง€ํ‘œ ์ดˆ๊ธฐํ™” ์บ์‹œ, ์ƒ์„ธ live ์ง‘๊ณ„, phase ํƒ€์ด๋ฐ ์ด๋ ฅ๊ณผ ์ตœ๊ทผ ์ด๋ฒคํŠธ ์ฐธ์กฐ๋ฅผ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค. ์˜์† ์‚ญ์ œ ํ‘œ์‹์€ ์žฌ์‹œ์ž‘ ํ›„์—๋„ ๋Šฆ์€ telemetry๋‚˜ heartbeat ์ดˆ๊ธฐํ™”๊ฐ€ ํ•ด๋‹น ์นด์šดํ„ฐ๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค์ง€ ๋ชปํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ข…๋ฃŒ Peer ์ธ๋ฒคํ† ๋ฆฌ๋Š” ์ˆ˜๋ช…์ฃผ๊ธฐ ์ฐจ๋‹จ์„ ์œ„ํ•ด ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. Prometheus๊ฐ€ ์ด๋ฏธ scrapeํ•œ ํ‘œ๋ณธ์€ ์ž์ฒด ๋ณด์กด ์ •์ฑ…์— ๋”ฐ๋ผ ๋‚จ์Šต๋‹ˆ๋‹ค. ์‚ญ์ œํ•˜์ง€ ์•Š์€ ์™„๋ฃŒ Run์˜ live ์ง‘๊ณ„๋Š” Run ์‚ญ์ œ ๋˜๋Š” Controller ์žฌ์‹œ์ž‘๊นŒ์ง€ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

KPL CPU์™€ ๋ฉ”๋ชจ๋ฆฌ

KPL ์‚ฌ์šฉ๋Ÿ‰์€ ๊ฐ Agent ์ปจํ…Œ์ด๋„ˆ์™€ ์†Œ์† ์‹คํ–‰ ์ค‘ Peer ์ปจํ…Œ์ด๋„ˆ์˜ ํ•ฉ๊ณ„์ž…๋‹ˆ๋‹ค. CPU๋Š” Docker ํ˜ธ์ŠคํŠธ์˜ ์ „์ฒด ๋…ผ๋ฆฌ CPU ์šฉ๋Ÿ‰์„ 100%๋กœ ํ‘œ์‹œํ•˜๋ฉฐ ๊ณต์‹์€ 100 ร— ์‚ฌ์šฉ ์ฝ”์–ด ์ˆ˜ / ํ˜ธ์ŠคํŠธ ๋…ผ๋ฆฌ CPU ์ˆ˜์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 16์ฝ”์–ด ํ˜ธ์ŠคํŠธ์—์„œ 4์ฝ”์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด 25%์ž…๋‹ˆ๋‹ค. Agent๋Š” Docker stats์˜ online_cpus ๋˜๋Š” ๊ตฌํ˜• per-CPU ๋ฐฐ์—ด์„ ์ฝ๊ณ , ์—†์œผ๋ฉด ์ œํ•œ์‹œ๊ฐ„๊ณผ ์บ์‹œ๋ฅผ ์ ์šฉํ•œ /info ์กฐํšŒ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ถ„๋ชจ๋Š” ํ˜ธ์ŠคํŠธ ์ „์ฒด ์šฉ๋Ÿ‰์ด๋ฉฐ Agent ์ปจํ…Œ์ด๋„ˆ์˜ CPU quota๋‚˜ Peer capacity ์„ค์ •์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ถ„์ž๋Š” KPL ์ปจํ…Œ์ด๋„ˆ๋งŒ ํฌํ•จํ•˜๋ฉฐ ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ ํ”„๋กœ์„ธ์Šค๋Š” ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ๋Š” cgroup ์‚ฌ์šฉ๋Ÿ‰ ํ•ฉ๊ณ„์ด๋ฉฐ ๊ธฐ๋ณธ ํ‘œ์‹œ๋Š” inactive file cache๋ฅผ ์ œ์™ธํ•œ working set, ์บ์‹œ ํฌํ•จ ์›๋ณธ ์‚ฌ์šฉ๋Ÿ‰๋„ ๋ณ„๋„๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Agent + Peers(๊ธฐ์กด ํ•ฉ๊ณ„), Agent only(Agent ์ปจํ…Œ์ด๋„ˆ), Peers only(์†Œ์† ์‹คํ–‰ ์ค‘ Peer ์ปจํ…Œ์ด๋„ˆ ํ•ฉ๊ณ„)๋ฅผ ํ•จ๊ป˜ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ Docker ์ฝ๊ธฐยทํ‘œ๋ณธ ์‹œ๊ฐยทํ˜ธ์ŠคํŠธ CPU ์ˆ˜๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋ถ„๋ฆฌ ์ธก์ •์„ ์œ„ํ•œ ์ถ”๊ฐ€ ํด๋ง์ด๋‚˜ Docker ์š”์ฒญ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ ๋ฒ”์œ„๋Š” ์ธก์ •/๋Œ€์ƒ ์ปจํ…Œ์ด๋„ˆ ์ˆ˜์™€ ์œ ํšจ์„ฑ์„ ๋ณ„๋„๋กœ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค. Agent ์ปจํ…Œ์ด๋„ˆ ์‚ฌ์šฉ๋Ÿ‰์€ ๊ธฐ์กด process_*์˜ ํ”„๋กœ์„ธ์Šค CPUยทresident memory์™€ ๊ตฌ๋ถ„ํ•˜๋ฉฐ, ๊ธฐ์กด ํ”„๋กœ์„ธ์Šค ์ „์šฉ ํŒจ๋„๋„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์ „์ฒด Agent CPU๋Š” ์ตœ์‹  ํ‘œ๋ณธ๊ณผ CPU ์ˆ˜๊ฐ€ ์žˆ๋Š” Agent์— ๋Œ€ํ•ด 100 ร— ์‚ฌ์šฉ ์ฝ”์–ด ํ•ฉ๊ณ„ / ํ˜ธ์ŠคํŠธ ๋…ผ๋ฆฌ CPU ํ•ฉ๊ณ„๋กœ ์šฉ๋Ÿ‰ ๊ฐ€์ค‘ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฐฑ๋ถ„์œจ์˜ ํ•ฉ์ด๋‚˜ ๋‹จ์ˆœ ํ‰๊ท ์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ‘œ์ค€ ๋ฐฐํฌ์ฒ˜๋Ÿผ ํ˜ธ์ŠคํŠธ๋งˆ๋‹ค Agent ํ•˜๋‚˜๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์ฐธ์—ฌ ํ˜ธ์ŠคํŠธ ์ „์ฒด ์šฉ๋Ÿ‰์—์„œ KPL์ด ์ฐจ์ง€ํ•˜๋Š” ๋น„์œจ์ž…๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ธก์ • ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  Agent๋ฅผ ํ•ฉ์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๊ตฌํ˜• Agent์ฒ˜๋Ÿผ ํ˜ธ์ŠคํŠธ CPU ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋Š” ํ‘œ์‹œํ•˜๊ณ  CPU ๋ฐฑ๋ถ„์œจ์€ ๋ฏธ์ƒ์œผ๋กœ ๋‚จ๊ธฐ๋ฉฐ, ์ „์ฒด CPU ์ธก์ • Agent ์ˆ˜๋„ ๋ณ„๋„๋กœ ์•Œ๋ฆฝ๋‹ˆ๋‹ค. ๊ธฐ์กด ์›์‹œ ์ฝ”์–ด gauge์™€ process counter๋Š” ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. Grafana์˜ Agent ํ”„๋กœ์„ธ์Šค ์ „์šฉ CPU ํŒจ๋„๋„ ํ˜ธ์ŠคํŠธ ์ „์ฒด๋ฅผ 100%๋กœ ํ™˜์‚ฐํ•˜๋ฉฐ, ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ๋Š” KPL ํ•ฉ๊ณ„์™€ ๋ณ„๋„๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

Agent๋Š” ๋ณ„๋„ ๋ฃจํ”„์—์„œ ์•ฝ 10์ดˆ๋งˆ๋‹ค ๋กœ์ปฌ Docker Engine์„ ์ฝ์œผ๋ฉฐ ๋™์‹œ ์ฝ๊ธฐ 4๊ฐœ, ํ•œ ์ฃผ๊ธฐ ์ œํ•œ์‹œ๊ฐ„ 8์ดˆ๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. one-shot ์ฝ๊ธฐ์™€ ์ด์ „ CPU ์นด์šดํ„ฐ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ณ  ์ฒ˜์Œ ๊ด€์ธกํ•œ ์ปจํ…Œ์ด๋„ˆ๋งŒ ๊ณตํ†ต 1์ดˆ ๋Œ€๊ธฐ ํ›„ ๋‹ค์‹œ ์ฝ์Šต๋‹ˆ๋‹ค. ํ‘œ๋ณธ์ด๋‚˜ Peer๋งˆ๋‹ค Docker CLI ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์œผ๋ฉฐ Prometheus scrape์™€ heartbeat๋„ Docker ์ฝ๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฃผ๊ธฐ ์‹œ์ž‘ ์‹œ ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ ๋ชฉ๋ก์„ ์ธก์ • ๋Œ€์ƒ์œผ๋กœ ์‚ผ์œผ๋ฏ€๋กœ, ํ‘œ๋ณธ ์‚ฌ์ด์— ์ƒ์„ฑยท์ข…๋ฃŒ๋œ ์ปจํ…Œ์ด๋„ˆ๋‚˜ ์งง์€ ํ”ผํฌ๋Š” ๋ณต์›ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ผ๋ถ€ ์ธก์ •์ด ๋น ์ ธ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ’์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. 47๊ฐœ ์ค‘ 46๊ฐœ๋ฅผ ์ธก์ •ํ–ˆ๋‹ค๋ฉด ํ•ด๋‹น 46๊ฐœ์˜ CPUยท๋ฉ”๋ชจ๋ฆฌ ํ•ฉ๊ณ„๋ฅผ ํ‘œ์‹œํ•˜๊ณ  Partial ยท 46/47 containers๋ฅผ ํ•จ๊ป˜ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋ˆ„๋ฝ ์ปจํ…Œ์ด๋„ˆ์˜ ์‚ฌ์šฉ๋Ÿ‰์€ ์ถ”์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ „์ฒด ์ธก์ • ์‹คํŒจ, Offline Agent, 30์ดˆ๋ณด๋‹ค ์˜ค๋ž˜๋œ ํ‘œ๋ณธ์€ ํ˜„์žฌ ํ•ฉ๊ณ„์— ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋Œ€์ƒ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์žˆ๋Š”๋ฐ ์ธก์ •๋œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ 0๊ฐœ๋ฉด N/A๋กœ ๋‚จ๊น๋‹ˆ๋‹ค. ์ •์ƒ ์กฐํšŒ ๊ฒฐ๊ณผ ์‹คํ–‰ ์ค‘ Peer๊ฐ€ 0๊ฐœ๋ผ๋ฉด Peers ๋ฒ”์œ„๋Š” CPUยท๋ฉ”๋ชจ๋ฆฌ 0์˜ ์™„๋ฃŒ ํ‘œ๋ณธ์œผ๋กœ ๊ธฐ๋กํ•˜๋ฉฐ, ์ธ๋ฒคํ† ๋ฆฌ ์กฐํšŒ ์‹คํŒจ๋ฅผ ๋นˆ ๋ชฉ๋ก์œผ๋กœ ์ทจ๊ธ‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Agent ์ปจํ…Œ์ด๋„ˆ ์ธก์ •๋งŒ ์‹คํŒจํ•ด๋„ ์ธก์ • ๊ฐ€๋Šฅํ•œ Peer ๊ฐ’์€ ์œ ์ง€ํ•˜๊ณ  ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ๋„ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฒ”์œ„๋ณ„ ์ „์ฒด ํ•ฉ๊ณ„๋Š” ๊ฐ๊ฐ์˜ ์ธก์ • Agent ์ˆ˜์™€ CPU ๋ถ„๋ชจ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋ˆ„๋ฝ๋œ ํ‘œ๋ณธ์ด ์„œ๋กœ ๋‹ค๋ฅด๋ฉด ์ „์ฒด ๋ฐฑ๋ถ„์œจ์˜ ํ•ฉ์ด ๊ธฐ์กด ํ•ฉ๊ณ„์™€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. churn ์ค‘ ์‚ฌ์šฉ๋Ÿ‰ ๊ฐ์†Œ๋ฅผ ํ•ด์„ํ•  ๋•Œ ์ธก์ • ๋น„์œจ๋„ ํ•จ๊ป˜ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

Controller๋Š” agent_id gauge๋กœ kpl_agent_cpu_usage_percent(ํ˜ธ์ŠคํŠธ ๋ฐฑ๋ถ„์œจ), kpl_agent_cpu_capacity_cores(๋ถ„๋ชจ), kpl_agent_cpu_usage_cores(์›์‹œ ์‚ฌ์šฉ ์ฝ”์–ด ์ˆ˜), kpl_agent_memory_working_set_bytes, kpl_agent_memory_usage_bytes, kpl_agent_resource_sample_timestamp_seconds, kpl_agent_resource_sample_complete, kpl_agent_resource_containers(kind="expected" ๋˜๋Š” "measured")๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ถ€๋ถ„ ์ธก์ •์€ ๊ฐ’์„ ๋‚ด๋ณด๋‚ด๋”๋ผ๋„ complete flag๊ฐ€ 0์ด๋ฉฐ, stale/offline/์ธก์ • ๋ถˆ๊ฐ€ ์ƒํƒœ์˜ measured ์ปจํ…Œ์ด๋„ˆ ์ˆ˜๋Š” 0์ž…๋‹ˆ๋‹ค. Grafana๋Š” Agent๋ณ„ยท์ „์ฒด ๊ฐ€์ค‘ CPU, ๋ฉ”๋ชจ๋ฆฌ ํ•ฉ๊ณ„์™€ ์ปจํ…Œ์ด๋„ˆ ์ธก์ • ๋น„์œจ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด 5์ดˆ Controller scrape๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ปจํ…Œ์ด๋„ˆ๋ณ„ TSDB label์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ƒˆ kpl_agent_component_* gauge๋Š” ์œ„ CPUยท๋ฉ”๋ชจ๋ฆฌยทํ‘œ๋ณธ ์‹œ๊ฐยท์™„๋ฃŒ ์—ฌ๋ถ€ยท์ปจํ…Œ์ด๋„ˆ ์ˆ˜ suffix๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ agent_id, component="agent" ๋˜๋Š” component="peers" label์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค(์ปจํ…Œ์ด๋„ˆ ์ˆ˜์—๋Š” kind๋„ ํฌํ•จ). ๊ธฐ์กด ํ•ฉ๊ณ„ kpl_agent_* ์ด๋ฆ„๊ณผ label์€ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. Grafana์—๋Š” Agent ์ปจํ…Œ์ด๋„ˆยทPeer ์ปจํ…Œ์ด๋„ˆ๋ณ„ CPU/๋ฉ”๋ชจ๋ฆฌ, ๋ฒ”์œ„๋ณ„ ์ „์ฒด ํ•ฉ๊ณ„, ๋Œ€์ƒ/์ธก์ • ์ปจํ…Œ์ด๋„ˆ ์ˆ˜ ํŒจ๋„์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. Agent๋งˆ๋‹ค ๊ณ ์ •๋œ ๋‘ ๋ฒ”์œ„์ด๋ฉฐ Peer๋งˆ๋‹ค ์‹œ๋ฆฌ์ฆˆ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Agent Status โ†’ Current CSV๋Š” ํ˜„์žฌ๊ฐ’, complete/partial ์ƒํƒœ, ์ธก์ • ๋ฒ”์œ„์™€ ์ „์ฒด ํ•ฉ๊ณ„๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. CPU๋Š” cpu_percent_host, ๋ถ„๋ชจ๋Š” cpu_capacity_cores์ž…๋‹ˆ๋‹ค. 5๋ถ„๋ถ€ํ„ฐ 24์‹œ๊ฐ„๊นŒ์ง€ ๊ธฐ๊ฐ„์„ ์„ ํƒํ•ด History CSV ๋˜๋Š” Summary CSV๋กœ ํ‘œ๋ณธ ์ˆ˜ยทํ‰๊ท ยท์ตœ์†Ÿ๊ฐ’ยท์ตœ๋Œ“๊ฐ’ยท์ฒซ/๋งˆ์ง€๋ง‰ ์‹œ๊ฐ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ด๋ ฅ CPU๋Š” cpu_percent ์ง€ํ‘œ์™€ percent_host ๋‹จ์œ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ๋Š” bytes์ž…๋‹ˆ๋‹ค. ์ธก์ • ๋ฒ”์œ„๋„ containers_expected, containers_measured ์‹œ๋ฆฌ์ฆˆ๋กœ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค. ํ‰๊ท ์—๋Š” ๋ถ€๋ถ„ ์ธก์ •๊ฐ’๋„ ํฌํ•จํ•˜๋ฉฐ ๋ˆ„๋ฝ ์‚ฌ์šฉ๋Ÿ‰์„ ์ถ”์ •ํ•˜๊ฑฐ๋‚˜ ๋ณด๊ฐ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ‰๊ท ์€ ์ •ํ™•ํ•œ ์‹œ๊ฐ„ ์ ๋ถ„์ด ์•„๋‹™๋‹ˆ๋‹ค. CPU ๋ฐฑ๋ถ„์œจ์€ ๋ณ„๋„ ์ƒˆ gauge๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ด์ „ 1์ฝ”์–ด ๊ธฐ์ค€ ๊ฐ’์„ ์„ž๊ฑฐ๋‚˜ ๊ณผ๊ฑฐ ๊ฐ’์„ ํ˜„์žฌ CPU ์ˆ˜๋กœ ๋‚˜๋ˆ„์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ CPU ์ด๋ ฅ์€ AgentยทController ์—…๊ทธ๋ ˆ์ด๋“œ ํ›„ ๋ณด๊ณ ๋˜๋Š” ์‹œ์ ๋ถ€ํ„ฐ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์ด๋ ฅ์€ Prometheus์—๋งŒ ๋ณด์กดํ•˜๊ณ  ์‹คํ—˜ ZIPยทSSEยทNAS ์‹คํ–‰ ๋กœ๊ทธ์—๋Š” ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌยท์ด๋ ฅยท์š”์•ฝยท๊ตฌ๊ฐ„ CSV๋Š” scope๊ฐ€ agent_and_peers, agent, peers์ธ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ธฐ๋ก์„ ํ•จ๊ป˜ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค. ๋‹ค์šด๋กœ๋“œ ๋ถ„์„ ์‹œ scope๋ณ„๋กœ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•˜๋ฉฐ ์„ธ ๋ฒ”์œ„๋ฅผ ์ „๋ถ€ ๋”ํ•˜๋ฉด ๊ฐ™์€ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค‘๋ณต ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๋ถ„๋ฆฌ ์ด๋ ฅ์€ AgentยทController ์—…๊ทธ๋ ˆ์ด๋“œ ํ›„ Prometheus๊ฐ€ ์ƒˆ gauge๋ฅผ ์ˆ˜์ง‘ํ•œ ์‹œ์ ๋ถ€ํ„ฐ ์ƒ๊น๋‹ˆ๋‹ค. ๊ตฌํ˜• Agent์™€ ๊ณผ๊ฑฐ ํ•ฉ๊ณ„ ์ „์šฉ ๊ธฐ๋ก์˜ ๋ถ„๋ฆฌ๊ฐ’์„ 0์œผ๋กœ ์ฑ„์šฐ๊ฑฐ๋‚˜ ํ”„๋กœ์„ธ์Šค counter๋กœ ์ถ”์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Agent Status์˜ Interval measurement์—์„œ Start measurement๋กœ Controller์˜ ํ˜„์žฌ ์‹œ๊ฐ์„ ์‹œ์ž‘์ ์œผ๋กœ ์ €์žฅํ•˜๊ณ  Stop measurement๋กœ ์ข…๋ฃŒ ์‹œ๊ฐ์„ ํ™•์ •ํ•ฉ๋‹ˆ๋‹ค. ์™„๋ฃŒ ๊ตฌ๊ฐ„์„ ์„ ํƒํ•ด Interval CSV ๋˜๋Š” Interval summary CSV๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ง„ํ–‰ ์ค‘์ธ ๊ตฌ๊ฐ„ ํ•˜๋‚˜๋ฅผ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ณต์œ ํ•˜๋ฉฐ ํŽ˜์ด์ง€๋ฅผ ๋‹ซ์•„๋„ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. Controller ๋ฐ์ดํ„ฐ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋ณด์กดํ•˜๋ฉด ์žฌ์‹œ์ž‘ ํ›„์—๋„ ๋ณต์›๋ฉ๋‹ˆ๋‹ค. 24์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ์ž๋™ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ์ตœ๊ทผ 100๊ฐœ ๊ตฌ๊ฐ„์€ runs ๋ฐ–์˜ <data-dir>/agent-resource-measurements.json์— ๋ณด์กดํ•˜๋ฉฐ, ํ•œ๋„์— ๋„๋‹ฌํ•œ ๋’ค ์ƒˆ ๊ตฌ๊ฐ„์„ ์‹œ์ž‘ํ•˜๋ฉด ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ๊ตฌ๊ฐ„ ๊ธฐ๋ก์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ๊ฐ’๊ณผ ์ตœ๊ทผ ์ด๋ ฅ ๋‚ด๋ณด๋‚ด๊ธฐ๋„ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ๊ฐ„ ๋‹ค์šด๋กœ๋“œ ์˜†์˜ Delete interval๋กœ ์„ ํƒํ•œ ์™„๋ฃŒ ์ธก์ •์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ์ง„ํ–‰ ์ค‘ ์ธก์ •์€ ๋จผ์ € ์ข…๋ฃŒํ•˜์‹ญ์‹œ์˜ค. ์‚ญ์ œ๋Š” ์žฌ์‹œ์ž‘ ํ›„์—๋„ ์œ ์ง€๋˜๋ฉฐ ์ €์žฅ ๊ตฌ๊ฐ„ยท๋‹ค์šด๋กœ๋“œ ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ๊ณต์šฉ Prometheus ์ด๋ ฅ๊ณผ ์ด๋ฏธ ๋ฐ›์€ CSV๋Š” ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

Agent Status โ†’ โš™๏ธ โ†’ Disable Agent์—์„œ ID๋ณ„ ์ฐธ์—ฌ ์—ฌ๋ถ€๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋น„ํ™œ์„ฑ Agent์˜ ํ•˜๋“œ์›จ์–ด ์‚ฌ์šฉ๋Ÿ‰์€ Excluded๋กœ ํ‘œ์‹œํ•˜๋ฉฐ ์ „์ฒด ํ•ฉ๊ณ„์˜ ์‚ฌ์šฉ๋Ÿ‰๊ณผ CPU ๋ถ„๋ชจ์—์„œ ๋ชจ๋‘ ์ œ์™ธํ•˜๊ณ  ํ† ํด๋กœ์ง€ ๋ฐ ์ƒˆ ๋ฐฐ์น˜ ํ›„๋ณด์—์„œ๋„ ์ˆจ๊น๋‹ˆ๋‹ค. Agent์™€ ๊ธฐ์กด Peer๋Š” ๊ณ„์† ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ scrape๋ถ€ํ„ฐ Controller ๋ฆฌ์†Œ์Šค gauge์—์„œ ์ œ์™ธํ•˜๊ณ  ๋‹ค์Œ discovery ๊ฐฑ์‹ ๋ถ€ํ„ฐ ํ”„๋กœ์„ธ์Šค ์ „์šฉ Agent target๋„ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ ์ด๋ ฅ์€ ์†Œ๊ธ‰ํ•ด์„œ ์ œ์™ธํ•˜๊ฑฐ๋‚˜ ์ง€์šฐ์ง€ ์•Š์œผ๋ฉฐ, ๋น„ํ™œ์„ฑํ™” ์‹œ์ ์„ ํฌํ•จํ•œ ๊ตฌ๊ฐ„์—๋Š” ํ•ด๋‹น Agent๊ฐ€ ์ง‘๊ณ„ ๋Œ€์ƒ์ด๋˜ ์‹œ์ ์˜ ํ‘œ๋ณธ์ด ๋‚จ์Šต๋‹ˆ๋‹ค. ์žฌํ™œ์„ฑํ™”ํ•˜๋ฉด ์ฐธ์—ฌ๋ฅผ ์žฌ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ๊ฐ„์€ Prometheus scrape ์‹œ๊ฐ์ด (startedAt, endedAt]์— ์†ํ•˜๋Š” ํ‘œ๋ณธ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์ง‘๊ธฐ๋ฅผ ์ถ”๊ฐ€ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ Agent ์ˆ˜์ง‘ ์ฃผ๊ธฐ๋ฅผ ๋ฐ”๊พธ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. CPU ๊ฐ’์€ ์ง์ „ Agent ์ˆ˜์ง‘ ๊ธฐ๊ฐ„(๋ณดํ†ต ์•ฝ 10์ดˆ)์„ ์š”์•ฝํ•˜๋ฏ€๋กœ ์‹œ์ž‘ ๊ฒฝ๊ณ„ ์ด์ „์˜ ์ผ๋ถ€ ์‹œ๊ฐ„์ด ๋ฐ˜์˜๋  ์ˆ˜ ์žˆ๊ณ , ์—ฌ๋Ÿฌ scrape์— ๊ฐ™์€ ์ตœ์‹  Agent ํ‘œ๋ณธ์ด ๊ธฐ๋ก๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ์งง์€ ๊ตฌ๊ฐ„์€ ํ‘œ๋ณธ์ด ์—†์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Controller ์ข…๋ฃŒยท์žฌ์‹œ์ž‘ ๋“ฑ์˜ ๋ˆ„๋ฝ ๊ตฌ๊ฐ„์€ ํ†ต๊ณ„์—์„œ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ์ข…๋ฃŒ๋Š” Prometheus ์—†์ด๋„ ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋‹ค์šด๋กœ๋“œ๋Š” Prometheus ๋ณต๊ตฌ ํ›„ ์žฌ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ๊ฐ„ ์ธ๋ฑ์Šค๋Š” ์‹œ๊ฐ๋งŒ ๋ณด๊ด€ํ•˜๋ฏ€๋กœ ์‹ค์ œ ๋‹ค์šด๋กœ๋“œ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋Š” Prometheus ๋ณด์กด ๊ธฐ๊ฐ„๊ณผ ๋‚ด๋ณด๋‚ด๊ธฐ ํฌ๊ธฐ ์ œํ•œ์— ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์žฅ๊ธฐ ๋ณด๊ด€ํ•˜๋ ค๋ฉด CSV๋ฅผ ์ €์žฅํ•˜์‹ญ์‹œ์˜ค.

Swarm์€ KPL_SWARM_TASK_NAME์˜ task ์ด๋ฆ„์œผ๋กœ Agent ์ž์‹ ์„ ์‹๋ณ„ํ•˜๊ณ  ๊ธฐ์กด Docker socket mount์—์„œ ์ฝ๊ธฐ ์ „์šฉ ์กฐํšŒ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ณ„๋„ ์‹คํ–‰์—์„œ๋Š” --self-container <container-name>, --docker-socket <socket-path>๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹๋ณ„์ž๋‚˜ socket์ด ์—†์œผ๋ฉด Peer๋งŒ ํ•ฉ์‚ฐํ•ด ํ‘œ์‹œํ•˜์ง€ ์•Š๊ณ  KPL ์ธก์ •์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์•Œ๋ฆฝ๋‹ˆ๋‹ค. Controller์˜ ์ด๋ ฅ ์กฐํšŒ ์ฃผ์†Œ๋Š” --prometheus-url / KPL_PROMETHEUS_URL์ด๋ฉฐ stack์€ http://prometheus:9090, ๋ณ„๋„ Controller์˜ ๊ธฐ๋ณธ๊ฐ’์€ http://127.0.0.1:9090์ž…๋‹ˆ๋‹ค. Prometheus๊ฐ€ ์—†์–ด๋„ ํ˜„์žฌ๊ฐ’์€ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ฅ ๋‹ค์šด๋กœ๋“œ๋Š” ๋Œ€์‹œ๋ณด๋“œ ๋กœ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋ฉฐ ๋™์‹œ ์š”์ฒญ 2๊ฐœยท15์ดˆยท์‘๋‹ต 16 MiBยท250,000๊ฐœ ํ‘œ๋ณธ์œผ๋กœ ์ œํ•œํ•˜๋ฏ€๋กœ ํฐ ์š”์ฒญ์€ ๊ธฐ๊ฐ„์„ ์ค„์ด์‹ญ์‹œ์˜ค. ์ˆ˜์ง‘์„ ์ ์šฉํ•˜๋ ค๋ฉด ControllerยทAgent๋ฅผ ์žฌ๋นŒ๋“œยท์žฌ๋ฐฐํฌํ•˜๊ณ  ๋ฒ„์ „์ด ๋ถ™์€ Grafana dashboard config๋„ ๋ฐ˜์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ์— ์ˆ˜์ง‘ํ•˜์ง€ ์•Š์€ ๊ฐ’์€ ์†Œ๊ธ‰ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Controller ๋ฉ”๋ชจ๋ฆฌ์™€ ์š”์ฒญ ๋ถ€ํ•˜

Controller๋Š” ๋ณธ๋ฌธ ๋””์ฝ”๋”ฉ ์ „์— telemetry ์ˆ˜๋ฝ ์ˆ˜๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ ์ œํ•œ๊ณผ ์žฌ์‹œ๋„ ๊ณ„์•ฝ์€ API์— ์žˆ์Šต๋‹ˆ๋‹ค. kpl_controller_telemetry_inflight_requests๋Š” ๋””์ฝ”๋”ฉยท์ €์žฅ ์ค‘ ์š”์ฒญ, kpl_controller_telemetry_waiting_requests๋Š” ๋ณธ๋ฌธ์„ ์ฝ์ง€ ์•Š์€ ๋Œ€๊ธฐ ์š”์ฒญ, kpl_controller_telemetry_rejected_total์€ ๋””์ฝ”๋”ฉ ์ „์— ๊ฑฐ์ ˆํ•œ ์š”์ฒญ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ฑฐ์ ˆ์ด ์ด๋ฏธ ์ˆ˜๋ฝํ•œ telemetry์˜ ํ๊ธฐ๋ฅผ ๋œปํ•˜์ง€๋Š” ์•Š์œผ๋ฏ€๋กœ Agent spool ์ ์ฒดยท์ €์žฅ ์ง€์—ฐ๊ณผ ํ•จ๊ป˜ ํ•ด์„ํ•˜์‹ญ์‹œ์˜ค. /metrics๋Š” ๋™์‹œ ์ˆ˜์ง‘ ๋‘ ๊ฐœ๋ฅผ ํ—ˆ์šฉํ•˜๊ณ  ์ดˆ๊ณผ ์š”์ฒญ์—๋Š” 503์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์ง‘ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋˜์–ด๋„ ์ˆ˜์ง‘๊ณผ ์‘๋‹ต์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ํ•ด๋‹น ์Šฌ๋กฏ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

Live session-window-v1 ์ง€ํ‘œ๋Š” ์„ธ์…˜ ์ฆ๊ฑฐ๋ฅผ ๋ณด์กดํ•˜๋ฉด์„œ ๋ณ„๋„์˜ legacy ์ˆ˜์‹ ์žยทcohort ์ธ๋ฑ์Šค๋ฅผ ์ค‘๋ณต ๋ณด๊ด€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์บ์‹œ๋Š” ์ „ํŒŒ ํ‘œ๋ณธ ์ „์ฒด์˜ ๋ณต์‚ฌ๋ณธ ๋Œ€์‹  ์ง‘๊ณ„ํ•œ ์ง€์—ฐ histogram bucket์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ ๋ถ„์„์€ ์›๋ณธ ๋กœ๊ทธ์—์„œ ์ˆ˜์‹  ๊ทธ๋ฃนยทํ‘œ๋ณธ ์ƒ์„ธ๋ฅผ ๊ณ„์† ์žฌ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋Šฆ์€ ์ฆ๊ฑฐ์™€ ๋„๋‹ฌ ๊ธฐํ•œ ๊ฒฝ๊ณผ์—๋„ ๊ฐ™์€ ์ •ํ™•ํ•œ ์ธก์ •์„ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค. ์ง‘๊ณ„๋Š” Run๋ณ„ ์ž ๊ธˆ์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋А๋ฆฐ ์ง‘๊ณ„๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ์ธ๋ฒคํ† ๋ฆฌยท์˜๊ตฌ ์ €์žฅ ์ž ๊ธˆ์„ ์ ์œ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Dashboard SSE๋Š” ์ œํ•œ๋œ snapshot ๊ณ„์‚ฐ์„ ๊ณต์œ ํ•˜๊ณ  ์ทจ์†Œ๋œ ์กฐํšŒ๋ฅผ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ณ€๊ฒฝ์ด Controller ์ „์ฒด heap์˜ ์ƒํ•œ์„ ์ •ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. Run ์ธก์ • ์ฆ๊ฑฐ๋Š” ๊ฒฐ๊ณผ ์‚ญ์ œ ์ „๊นŒ์ง€ ๋Šฆ์€ ๋ณด์ •์„ ์œ„ํ•ด ๋ณด์กดํ•˜๊ณ , ์ข…๋ฃŒ Peer ์‹๋ณ„์ž๋Š” ์ƒ๋ช…์ฃผ๊ธฐ ์ฐจ๋‹จ์„ ์œ„ํ•ด ์œ ์ง€ํ•˜๋ฏ€๋กœ ๋ณด๊ด€ํ•œ Runยท๊ด€์ธก ์ˆ˜์— ๋”ฐ๋ผ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Controller ํ˜ธ์ŠคํŠธ์˜ MemAvailableยทํŒŒ์ผ/slab ์บ์‹œ๋ฅผ Controller ํ”„๋กœ์„ธ์Šค RSSยทGo heapยท์ปจํ…Œ์ด๋„ˆ working set๊ณผ ๋น„๊ตํ•˜๊ณ  PrometheusยทGrafana๋„ ๋ณ„๋„๋กœ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. MemFree๊ฐ€ ๋‚ฎ๋‹ค๋Š” ์‚ฌ์‹ค๋งŒ์œผ๋กœ Go ๋ˆ„์ˆ˜๋ฅผ ํ™•์ •ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ •์ƒ ์šด์˜์— ๊ฐ•์ œ GC๋‚˜ ์ปค๋„ ์บ์‹œ ์ดˆ๊ธฐํ™”๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์žฅ๊ธฐ ์‹คํ—˜ ์ค‘ Agent ๋ฉ”๋ชจ๋ฆฌ

Agent๋Š” Peer ์ปจํ…Œ์ด๋„ˆ ์ œ๊ฑฐ๊ฐ€ ํ™•์ธ๋˜๋ฉด ์‹คํŒจํ•œ ํ”„๋กœ์„ธ์Šค๊นŒ์ง€ ํฌํ•จํ•ด ํ† ํด๋กœ์ง€ยท์ ์ˆ˜ snapshot์„ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค. Controller๊ฐ€ ํ™•์ธํ•œ ์ข…๋ฃŒ ์ด๋ ฅ์€ ์ตœ๊ทผ 64๊ฐœ๋งŒ ๋ฉ”๋ชจ๋ฆฌ์— ๋‚จ๊ธฐ๊ณ  ์˜ค๋ž˜๋œ ์ถ•์•ฝ ์‹๋ณ„์ž์™€ ์‹คํ–‰ ์„ธ๋Œ€ ์ฐจ๋‹จ ์ •๋ณด๋Š” Agent ๋กœ์ปฌ peer-history/์— ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค. runs ์•„๋ž˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ข…๋ฃŒ Peer๋Š” ๊ฐœ๋ณ„ JSON ํŒŒ์ผ ๋Œ€์‹  bbolt DB ํŒŒ์ผ ํ•˜๋‚˜์ธ peer-history/nodes์— ๋ณด๊ด€ํ•˜๊ณ , runs/์™€ fences/์—๋Š” ์‹คํ–‰๋ณ„ ์ •๋ณด๋งŒ ๋‘ก๋‹ˆ๋‹ค. ๋””์Šคํฌ ํ‚ค๋กœ ์กฐํšŒํ•˜๋ฉฐ Controller ์žฌ๋“ฑ๋ก ์‹œ์—๋„ ์ „์ฒด ์ด๋ ฅ์„ Go heap์— ๋‹ค์‹œ ์˜ฌ๋ฆฌ์ง€ ์•Š๊ณ  ์ œํ•œ๋œ ํŽ˜์ด์ง€๋กœ ๋ณต๊ตฌํ•ฉ๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ์ „์†ก ์ค‘์—๋Š” DB ํŠธ๋žœ์žญ์…˜์„ ์œ ์ง€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฏธํ™•์ธ ์ข…๋ฃŒ ๊ธฐ๋ก๊ณผ ์ œ๊ฑฐ ์‹คํŒจ ์ปจํ…Œ์ด๋„ˆ๋Š” ๋ฒ„๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ •๋ฆฌ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์™„๋ฃŒ ๊ธฐ๋ก ๋˜๋Š” ์ด๋ฒคํŠธ ํ ์ง„์ž…์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ข…๋ฃŒ ํ‘œ์‹์ด ๊ฐ๊ฐ 4,096๊ฐœ์— ๋„๋‹ฌํ•˜๋ฉด ์ „๋‹ฌ/์ €์žฅ์†Œ ๋ณต๊ตฌ ์ „๊นŒ์ง€ ์‹ ๊ทœ ์ƒ์„ฑ์— 503์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๊ธฐ์กด Peer๋Š” ๊ณ„์† ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ค‘๋ณต ID ๋ฐ ์„ธ๋Œ€ ์ฐจ๋‹จ ๊ฒ€์‚ฌ๋ฅผ ์œ ์ง€ํ•˜๋ ค๋ฉด Agent ๋ฐ์ดํ„ฐ ๋ณผ๋ฅจ์„ ๋ณด์กดํ•˜์‹ญ์‹œ์˜ค.

์ฒซ ์‹œ์ž‘ ์‹œ ๊ธฐ์กด peer-history/nodes/ JSON์„ ์ œํ•œ๋œ batch๋กœ ๋ณต์‚ฌยท๊ฒ€์ฆํ•˜๊ณ  ๊ฒฝ๋กœ๋ฅผ ์›์ž์ ์œผ๋กœ ๊ตํ™˜ํ•˜์—ฌ DB๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ณ€ํ™˜์—๋Š” rename-exchange๋ฅผ ์ง€์›ํ•˜๋Š” Linux ํŒŒ์ผ์‹œ์Šคํ…œ์ด ํ•„์š”ํ•˜๋ฉฐ ์‹คํŒจํ•˜๋ฉด ์›๋ณธ์„ ๋‚จ๊ธฐ๊ณ  ์‹œ์ž‘ ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ๋””๋ ‰ํ„ฐ๋ฆฌ๋Š” nodes.migrating/๊ฐ€ ๋˜๋ฉฐ ์œ ์ง€๋ณด์ˆ˜ ์ž‘์—…์ด DB์™€ ๋Œ€์กฐํ•˜์—ฌ ์ผ์น˜ํ•˜๋Š” ํŒŒ์ผ์„ ํšŒ๋‹น ์ตœ๋Œ€ 128๊ฐœ์”ฉ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์žฌ์‹œ์ž‘ ํ›„์—๋„ ์ •๋ฆฌ๋ฅผ ์ด์–ด๊ฐ‘๋‹ˆ๋‹ค. ๋ณ€ํ™˜๋œ nodes ๊ฒฝ๋กœ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ตฌ๋ฒ„์ „ Agent์˜ ์‹œ์ž‘์„ ๋ง‰์•„ ์ค‘๋ณต ID ์ฐจ๋‹จ ์ •๋ณด๊ฐ€ ์กฐ์šฉํžˆ ๋ˆ„๋ฝ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ˜•์‹์„ ์ง€์›ํ•˜๋Š” Agent๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฉฐ telemetry ์ „๋‹ฌ์„ ๋๋‚ด๋”๋ผ๋„ ๋ณ€ํ™˜๋œ ์ด๋ ฅ์„ ๊ตฌ๋ฒ„์ „ ์ด๋ฏธ์ง€๋กœ ์ฝ์„ ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

Agent /metrics์—์„œ kpl_local_history_records{kind="peers"|"run_fences"}, kpl_local_history_retired_total{kind="peers"|"run_fences"}, kpl_local_history_cleanup_errors_total์„ ์ œ๊ณตํ•˜๋ฉฐ ๋ชจ๋‘ agent_id ๋ผ๋ฒจ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ •์ƒ ์ƒํƒœ์—์„œ ํ™•์ธ๋œ ๊ธฐ๋ก์€ Peer 64๊ฐœยท์ฐจ๋‹จ ์บ์‹œ 128๊ฐœ๋กœ ์ •๋ฆฌ๋˜๊ณ  ์ง„ํ–‰ ์ค‘์ธ ํ™•์ธ/์ •๋ฆฌ ์ž‘์—…๋งŒํผ ์ผ์‹œ์ ์œผ๋กœ ๋Š˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. kpl_local_cleanup_pending, kpl_local_telemetry_queue_events, go_memstats_heap_alloc_bytes, process_resident_memory_bytes๋ฅผ ํ•จ๊ป˜ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. Go์˜ ์‚ฌ์šฉ ์ค‘ heap, ํ”„๋กœ์„ธ์Šค RSS, ์ปจํ…Œ์ด๋„ˆ working set์€ ๋‹ค๋ฅธ ๊ฐ’์ด๋ฏ€๋กœ ๊ฐ์ฒด๋ฅผ ํ•ด์ œํ•ด๋„ RSS/working set์ด ์ฆ‰์‹œ ๋–จ์–ด์ง€์ง€๋Š” ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜์น˜๋ฅผ ์ˆจ๊ธฐ๊ธฐ ์œ„ํ•œ ๊ฐ•์ œ GC๋‚˜ ์ž„์˜์˜ 0 ํ‘œ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•ฉ์„ฑ churn ํšŒ๊ท€ ๊ฒ€์ฆ์„ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

Peer ์ข…๋ฃŒ ๋Œ€๊ธฐ๋Š” Peer๋งˆ๋‹ค docker wait ํ”„๋กœ์„ธ์Šค๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋Œ€์‹  ๋กœ์ปฌ Docker Engine API ์—ฐ๊ฒฐ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ž์› ์ธก์ •๊ณผ ๋ณ„๋„ ์—ฐ๊ฒฐ ํ’€์„ ์‚ฌ์šฉํ•˜๊ณ  Peer ์ƒ์กด ์‹œ๊ฐ„์— ์ œํ•œ์„ ๋‘์ง€ ์•Š์œผ๋ฉฐ, ์ทจ์†Œํ•˜๋ฉด ๊ธฐ์กด ์ปจํ…Œ์ด๋„ˆ ์ œ๊ฑฐ ์ ˆ์ฐจ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. --docker-socket์€ ์ธก์ •๊ณผ ์ข…๋ฃŒ ๋Œ€๊ธฐ ์–‘์ชฝ์— ์‚ฌ์šฉํ•˜๋ฏ€๋กœ Peer๋ฅผ ์ƒ์„ฑํ•˜๋Š” Docker CLI์™€ ๊ฐ™์€ daemon์„ ๊ฐ€๋ฆฌ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ์ œ๊ฑฐ์™€ ์ตœ์ข… heartbeat ํ™•์ธ์ด ๋๋‚œ Peer์˜ ์„ค์ • ํŒŒ์ผ์€ ์ตœ๊ทผ ๊ธฐ๋ก์„ ํฌํ•จํ•˜์—ฌ history ์œ ์ง€๋ณด์ˆ˜์—์„œ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํŒŒ์ผยท์ˆ˜๋ช… ์ด๋ ฅยท์ œ๊ฑฐ ์‹คํŒจ ๊ธฐ๋ก์€ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ Agent ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‚จ๊ธด ๊ณ ์•„ ์„ค์ • ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์†Œ๊ธ‰ํ•˜์—ฌ ์ „์ฒด ์‚ญ์ œํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์ˆ˜๋ฝํ•œ telemetry ๋ณธ๋ฌธ์€ ๋กœ์ปฌ ๋””์Šคํฌ spool์— ๋‘๊ณ  ๋ฉ”๋ชจ๋ฆฌ์—๋Š” ํŒŒ์ผ ์œ„์น˜/Run ์ธ๋ฑ์Šค์™€ ์ „์†กํ•  ์ตœ๋Œ€ 5,000๊ฐœ / ์ง๋ ฌํ™” ๊ธฐ์ค€ 1 MiB ๊ตฌ๊ฐ„๋งŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ณ„์ ์œผ๋กœ ์œ ํšจํ•œ ํฐ ์ด๋ฒคํŠธ ํ•˜๋‚˜๋Š” ์˜ˆ์™ธ์ ์œผ๋กœ ์ด ๊ตฌ๊ฐ„์„ ๋„˜์„ ์ˆ˜ ์žˆ์œผ๋‚˜ ๊ธฐ์กด batch envelope ํฌํ•จ 10 MiB ์ „์†ก ์ œํ•œ์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์ด๋Š” ์ง๋ ฌํ™” ๋ฐ์ดํ„ฐ ํ•œ๋„์ด๋ฉฐ Go heap ์ž์ฒด์˜ ์ƒํ•œ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์žฌ์‹œ์ž‘ ๋ณต๊ตฌ๋„ ๊ธฐ์กด spool ๋ฐฐ์—ด์„ ์ˆœ์ฐจ ์ฝ๊ณ  ์ด ๊ตฌ๊ฐ„๋งŒ ์ ์žฌํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์‹  ๋””์ฝ”๋”ฉยท์ €์žฅ์€ ๋™์‹œ 2๊ฐœ๋กœ ์ œํ•œํ•˜๊ณ , ์ตœ๋Œ€ 64๊ฐœ ์š”์ฒญ๋งŒ ๋ณธ๋ฌธ์„ ์ฝ์ง€ ์•Š์€ ์ฑ„ 1์ดˆ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ๋Œ€๊ธฐ์—ด์ด ๊ฐ€๋“ ์ฐจ๊ฑฐ๋‚˜ ์‹œ๊ฐ„์ด ์ง€๋‚˜๊ฑฐ๋‚˜ ์ƒˆ batch๊ฐ€ ๋Œ€๊ธฐ๋Ÿ‰ 50,000๊ฐœ / 256 MiB๋ฅผ ๋„˜๊ธฐ๋ฉด 503๊ณผ Retry-After๋กœ ์žฌ์‹œ๋„๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ๋””์Šคํฌ ๋ฐ ์ „์†ก ์ค‘ ์ด๋ฒคํŠธ๋„ ๋Œ€๊ธฐ๋Ÿ‰์— ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋“ ์ฐฌ ๋™์•ˆ ์ƒˆ Peer ๋ฐฐ์น˜๋„ ์ผ์‹œ ์ค‘๋‹จํ•˜์—ฌ churn์œผ๋กœ ์ข…๋ฃŒ ๊ธฐ๋ก์ด ๊ณ„์† ๋Š˜์–ด๋‚˜๋Š” ๊ฒƒ์„ ๋ง‰๊ณ , ์ด๋ฏธ ์‹คํ–‰ ์ค‘์ธ Peer์˜ ์ตœ์ข… ์ฆ๊ฑฐ๋Š” ์œ ์ง€ํ•˜๋ฏ€๋กœ ์ผ์‹œ์ ์œผ๋กœ ์ •์ƒ ํ•œ๋„๋ฅผ ๋„˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ํ•œ๋„ ์ดˆ๊ณผ ์ ์ฒด๋Š” ์‚ญ์ œํ•˜์ง€ ์•Š๊ณ  ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์‹คํ—˜ ์ข…๋ฃŒ ํ™•์ธ์€ ํ•ด๋‹น Run์˜ ๋””์Šคํฌ ๋Œ€๊ธฐ๋Ÿ‰๊ณผ ์ „์†ก ์ค‘ ์ž๋ฃŒ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ ์žฌ์‹œ๋„ ์‹œ ์ด๋ฒคํŠธ ID์™€ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์ข…๋ฃŒ ์ฆ๊ฑฐ์˜ ํ ์ง„์ž…๊ณผ telemetry backlog ํ™•์ธ ๋Œ€๊ธฐ๋Š” Agent ์ƒํƒœ ์ž ๊ธˆ ๋ฐ–์—์„œ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. spool ์“ฐ๊ธฐ๊ฐ€ ์ง€์—ฐ๋˜์–ด๋„ heartbeat snapshot๊ณผ ๋‹ค๋ฅธ Peer์˜ ์ˆ˜๋ช… ๋งŒ๋ฃŒ ์ทจ์†Œ ์ฒ˜๋ฆฌ๋Š” ๊ณ„์† ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ admission์€ ์šฉ๋Ÿ‰์„ ์˜ˆ์•ฝํ•˜๊ธฐ ์ „์— ์ทจ์†Œ์™€ Run ์„ธ๋Œ€ ์ฐจ๋‹จ์„ ๋‹ค์‹œ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ ํ—ˆ์šฉ๊ณผ ์ •๋ฆฌ๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

์ž‘์€ batch๋Š” 4 MiB๋ฅผ ๋ชฉํ‘œ๋กœ ๊ต์ฒดํ•˜๋Š” append-only .jsonl ํŒŒ์ผ์„ ๊ณต์œ ํ•˜๊ณ , ACK๋„ ์ฒดํฌ์„ฌ์ด ์žˆ๋Š” journal์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ํฐ batch ํ•˜๋‚˜๋Š” ๊ธฐ์กด segment ์ œํ•œ ์•ˆ์—์„œ ๋ชฉํ‘œ ํฌ๊ธฐ๋ฅผ ๋„˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „๋ถ€ ํ™•์ธ๋œ ํ™œ์„ฑ ํŒŒ์ผ ํ•˜๋‚˜๋Š” ์žฌ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋Œ€๊ธฐ ์ด๋ฒคํŠธ๊ฐ€ 0์ด์–ด๋„ spool ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ๋น„์–ด ์žˆ์ง€๋Š” ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. batch๋งˆ๋‹ค payloadยทcursor ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ๋ฐ”๊พธ๋Š” ์ž‘์—…์„ ์ค„์—ฌ inode/dentry ์ƒ์„ฑ ๋ฐ ์ปค๋„ ์บ์‹œ ๋ถ€๋‹ด์„ ์ค„์ž…๋‹ˆ๋‹ค. ์ „์†ก์€ ์ €์žฅ๋œ JSON์„ Fields map์œผ๋กœ ๋‹ค์‹œ ํ’€์ง€ ์•Š๊ณ  ๋ฐ”์ดํŠธ ํ•œ๋„ ๋‚ด์—์„œ ์ง์ ‘ ๋ณต์‚ฌํ•˜๊ณ , ๋ณต๊ตฌ ์‹œ์—๋„ ํŒŒ์ผ ์œ„์น˜ ์ธ๋ฑ์Šค๋งŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ์ˆ˜ ์ œํ•œ์„ 250๊ฐœ์—์„œ 5,000๊ฐœ๋กœ ๋Š˜๋ ค ์ž‘์€ ์ด๋ฒคํŠธ๋„ ๊ธฐ์กด 1 MiB ํ•œ๋„๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ž…์žฅ ์ „์— ๊ฑฐ์ ˆ๋œ 503์€ Controller๊ฐ€ ์•ˆ์ „ํ•˜๊ฒŒ ์žฌ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. Agent ๋ฏธ์ง€์ • ๋ฐฐ์น˜๋Š” Retry-After ๋™์•ˆ ํ•ด๋‹น Agent๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋‹ค๋ฅธ ๊ฐ€๋Šฅํ•œ Agent์— ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŠน์ • Agent ์ง€์ • ๋˜๋Š” single-agent ๋ฐฐ์น˜๋Š” ์„ ํƒํ•œ Agent๋ฅผ ์œ ์ง€ํ•˜์—ฌ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ์‹œ๋‚˜๋ฆฌ์˜ค context๊ฐ€ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์ œํ•œํ•˜๊ณ  ์ค‘์ง€ยท์ทจ์†Œํ•˜๋ฉด ์˜ˆ์•ฝ์„ ์ฆ‰์‹œ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ ์—ฌ๋ถ€๊ฐ€ ๋ถˆํ™•์‹คํ•œ ์ผ๋ฐ˜ 503ยท์—ฐ๊ฒฐ ์˜ค๋ฅ˜ยทtimeout์€ ๋‹ค๋ฅธ Agent์— ๋ฌด์กฐ๊ฑด ์žฌ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€๊ธฐ๋Š” Run/Agent ID์™€ ํ•จ๊ป˜ ๋กœ๊ทธ์— ๋‚จ์œผ๋ฉฐ ์ง€์†์ ์ธ ๊ณผ๋ถ€ํ•˜์—์„œ๋Š” ์ž…์žฅ ์‹œ๊ฐ์ด ์ง€์—ฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด .json spool ๋ฐฐ์—ด๋„ ๋ณต๊ตฌํ•ฉ๋‹ˆ๋‹ค. format-v2.json์€ ๊ตฌ๋ฒ„์ „ Agent๊ฐ€ ๋กค๋ฐฑ ๋•Œ ๋Œ€๊ธฐ ์ค‘์ธ .jsonl ์ž๋ฃŒ๋ฅผ ๋ฌด์‹œํ•˜์ง€ ์•Š๋„๋ก ์‹œ์ž‘์„ ๋ง‰๋Š” ํ˜•์‹ ํ‘œ์‹์ž…๋‹ˆ๋‹ค. ์ „๋‹ฌ์„ ๋๋‚ด๊ณ  ์ •์ƒ ์ข…๋ฃŒํ•˜๋ฉด ๋นˆ ํ™œ์„ฑ ํŒŒ์ผ๊ณผ ํ‘œ์‹์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ํ•ด์ œ๋˜๋Š” ๊ฒƒ์€ spool ๋ณดํ˜ธ ์žฅ์น˜๋ฟ์ด๋ฉฐ, ๋ณ€ํ™˜๋œ Peer ์ด๋ ฅ DB๋Š” ๊ณ„์† ํ˜ธํ™˜๋˜๋Š” Agent ์ด๋ฏธ์ง€๋ฅผ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธยท๋ณต๊ตฌ ์ค‘์—๋„ Agent volume์€ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Agent ๋ฉ”๋ชจ๋ฆฌ ์ฆ๊ฐ€ ์›์ธ์„ ๊ตฌ๋ถ„ํ•˜๋Š” ์ง€ํ‘œ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ง€ํ‘œ ํ•ด์„
kpl_local_agent_memory_bytes{kind="โ€ฆ"} (usage, working_set, anonymous, file, inactive_file, kernel, slab, slab_reclaimable, slab_unreclaimable, kernel_stack, page_tables, socket) ๊ธฐ์กด ์ž์› ํ‘œ๋ณธ์˜ Agent ์ปจํ…Œ์ด๋„ˆ cgroup ์ˆ˜์น˜์ด๋ฉฐ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋ฏธ์ง€์› ํ•ญ๋ชฉ์€ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค. ํ•ญ๋ชฉ๋ผ๋ฆฌ ์ค‘๋ณต๋˜๋ฏ€๋กœ ํ•ฉ์‚ฐํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
kpl_local_agent_memory_sample_timestamp_seconds ์›๋ณธ ํ‘œ๋ณธ ์‹œ๊ฐ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ์„ฑ์„ ํ™•์ธํ•˜๊ณ  ํ•ด์„ํ•˜์‹ญ์‹œ์˜ค. ์ž๊ธฐ ์ปจํ…Œ์ด๋„ˆ ์ธก์ •์ด ์‹คํŒจํ•˜๋ฉด ์ƒ์„ธ ํ•ญ๋ชฉ์„ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค.
kpl_local_peer_wait_connections Docker CLI ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š” Engine ์ข…๋ฃŒ ๋Œ€๊ธฐ ์—ฐ๊ฒฐ ์ˆ˜์ž…๋‹ˆ๋‹ค.
kpl_local_telemetry_backlog_bytes, kpl_local_telemetry_window_bytes ์ง๋ ฌํ™”๋œ ์ „์ฒด ๋Œ€๊ธฐ๋Ÿ‰๊ณผ ๋ฉ”๋ชจ๋ฆฌ ์ ์žฌ/์ „์†ก ๊ตฌ๊ฐ„ ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค. Go heap ์ธก์ •๊ฐ’์€ ์•„๋‹ˆ๋ฉฐ ์ „์ฒด ๋Œ€๊ธฐ๋Ÿ‰์—๋Š” ๋””์Šคํฌ ์ž๋ฃŒ๋„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
kpl_local_telemetry_decoders, kpl_local_telemetry_decoder_waiters, kpl_local_telemetry_decoder_rejected_total ํ˜„์žฌ ๋””์ฝ”๋”ฉยท์ €์žฅ ์š”์ฒญ ์ˆ˜(์ตœ๋Œ€ 2๊ฐœ), ๋ณธ๋ฌธ์„ ์ฝ์ง€ ์•Š์€ ๋Œ€๊ธฐ ์š”์ฒญ ์ˆ˜(์ตœ๋Œ€ 64๊ฐœ), ๋””์ฝ”๋”ฉ ์ „ ๊ฑฐ๋ถ€ ํšŸ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ฑฐ๋ถ€๋œ batch๋Š” ์žฌ์‹œ๋„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
go_threads, go_memstats_stack_sys_bytes Go ๋Ÿฐํƒ€์ž„์˜ OS ์Šค๋ ˆ๋“œ ์ˆ˜์™€ ์Šคํƒ์šฉ ์˜ˆ์•ฝ ๋ฉ”๋ชจ๋ฆฌ์ž…๋‹ˆ๋‹ค. cgroup kernel_stack๊ณผ ํ•จ๊ป˜ ์ดˆ๊ธฐ ๋Ÿฐํƒ€์ž„ ์ฆ๊ฐ€์™€ ์ด๋ ฅยท์บ์‹œ ๋ˆ„์  ๋น„์šฉ์„ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.
go_gc_heap_live_bytes, go_gc_heap_goal_bytes, go_gc_cycles_total_gc_cycles_total ๋งˆ์ง€๋ง‰ GC์˜ live heapยท๋‹ค์Œ heap ๋ชฉํ‘œยทGC ํšŸ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด go_memstats_*, go_gc_duration_seconds์™€ ํ•จ๊ป˜ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
go_cpu_classes_gc_total_cpu_seconds_total, go_cpu_classes_gc_mark_assist_cpu_seconds_total, go_memory_classes_* Go ๋Ÿฐํƒ€์ž„์˜ GC CPU ์ถ”์ •์น˜ยทํ• ๋‹น ์‹œ GC ๋ณด์กฐ ๋น„์šฉยทheap/metadata ๊ตฌ๋ถ„์ž…๋‹ˆ๋‹ค. Agent Go ํ”„๋กœ์„ธ์Šค๋ฅผ ์ธก์ •ํ•ฉ๋‹ˆ๋‹ค.

์ฒซ ์‹คํ—˜ ํ›„ ์ฆ๊ฐ€๋Š” ๋Ÿฐํƒ€์ž„ ์Šคํƒ, ์—ฐ๊ฒฐ ํ’€, ์žฌ์‚ฌ์šฉ ๋ฒ„ํผ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™œ์„ฑ Peer ์ˆ˜๊ฐ€ ๋น„์Šทํ•˜๊ณ  telemetry ํ๊ฐ€ ๋นˆ ํœด์ง€ ๊ตฌ๊ฐ„๋ผ๋ฆฌ ๋น„๊ตํ•˜์‹ญ์‹œ์˜ค. ์Šค๋ ˆ๋“œ ์ˆ˜์™€ live heap์ด ์•ˆ์ •์ ์ธ๋ฐ ๋ˆ„์  ์ข…๋ฃŒ Peer์™€ ํ•จ๊ป˜ slab_reclaimable์ด ๋Š˜๋ฉด Go ๊ฐ์ฒด๋ณด๋‹ค ํŒŒ์ผ์‹œ์Šคํ…œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋น„์šฉ์„ ์˜์‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ ํŒŒ์ผ ์ด๋ ฅ ์ €์žฅ์†Œ๋Š” Peer๋ณ„ inode ์ฆ๊ฐ€๋ฅผ ์—†์• ์ง€๋งŒ DB ํŒŒ์ผ ํฌ๊ธฐ, OS ํŽ˜์ด์ง€ ์บ์‹œ, ์ „์ฒด ์ปจํ…Œ์ด๋„ˆ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒํ•œ์„ ๋‘์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๊ด€์ธกํ•œ ์ด๋ ฅยท์บ์‹œ ์ถ”์„ธ๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

Agent only working set, process_resident_memory_bytes, Go live heap์„ ๋น„๊ตํ•˜์‹ญ์‹œ์˜ค. ํ”„๋กœ์„ธ์Šค RSS๋Š” ๋‚ฎ์€๋ฐ ์ปจํ…Œ์ด๋„ˆ ์ˆ˜์น˜๊ฐ€ ํฌ๋‹ค๋ฉด cgroup file/kernel ํ•ญ๋ชฉ์„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ•์ œ GC๋กœ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜๊ฑฐ๋‚˜ ์ปค๋„ ์‚ฌ์šฉ๋Ÿ‰ ์ „์ฒด๋ฅผ ์„ค๋ช…ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ํšŒ๊ท€ ๊ฒ€์ฆ์€ ์šด์˜ ์ค‘ ๊ฐ•์ œ GC ์—†์ด ํ ๋ณต๊ตฌยท์ „๋‹ฌ ๋ณด์กด์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

Controller ๋ฐ ๊ด€๋ฆฌ ์„œ๋น„์Šค

Agent Status โ†’ Controller & services๋Š” Agent ๋ชฉ๋ก ์œ„์— Controller, Prometheus, Grafana์™€ ์ž์› ์ˆ˜์ง‘๊ธฐ์˜ ์ƒํƒœ๋ฅผ ๋ณ„๋„๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ํ‘œ ํ–‰์—๋Š” ์„œ๋น„์Šค๋ช…๊ณผ Docker ํ˜ธ์ŠคํŠธ, ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ์ƒํƒœ, ํ˜ธ์ŠคํŠธ ์ „์ฒด๋ฅผ 100%๋กœ ๊ณ„์‚ฐํ•œ CPU, working-set ๋ฉ”๋ชจ๋ฆฌ, ์ธก์ •/๋Œ€์ƒ ์ปจํ…Œ์ด๋„ˆ ์ˆ˜๊ฐ€ ํ‘œ์‹œ๋˜๋ฉฐ Controller ๊ฐ€๋™ ์‹œ๊ฐ„๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Controller & services์™€ Agents & Peers ํ‘œ๋Š” ๋ชจ๋‘ ๋งจ ์œ„์— Total ํ–‰์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์„œ๋น„์Šค ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ธก์ •๊ฐ’์„ ํ•ฉ์‚ฐํ•˜๊ณ , ์„œ๋น„์Šค CPU๋Š” ์ธก์ •๋œ CPU ์‚ฌ์šฉ๋Ÿ‰ ํ•ฉ๊ณ„๋ฅผ ํ•ด๋‹น ํ˜ธ์ŠคํŠธ๋“ค์˜ CPU ์šฉ๋Ÿ‰ ํ•ฉ๊ณ„๋กœ ๋‚˜๋ˆ„๋ฉฐ ๊ฐ™์€ ํ˜ธ์ŠคํŠธ์˜ ์šฉ๋Ÿ‰์„ ์ค‘๋ณต ๊ณ„์‚ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ธก์ • ๋ˆ„๋ฝ์ด๋‚˜ ๋ถ€๋ถ„ ์ธก์ •์€ ์ปค๋ฒ„๋ฆฌ์ง€๋กœ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. Agent ํ•ฉ๊ณ„๋Š” ์ „์ฒดยทAgent๋งŒยทPeers๋งŒ ๊ตฌ๋ถ„์„ ์œ ์ง€ํ•˜๋ฉฐ ๋น„ํ™œ์„ฑ Agent๋ฅผ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. Peer ์ˆ˜์™€ ์šฉ๋Ÿ‰์€ ํ™œ์„ฑํ™”๋œ ์˜จ๋ผ์ธ Agent๋งŒ ํ•ฉ์‚ฐํ•ฉ๋‹ˆ๋‹ค. Running์€ Docker ์ปจํ…Œ์ด๋„ˆ์˜ ์‹คํ–‰ ์ƒํƒœ์ด๋ฉฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ค€๋น„ ์™„๋ฃŒ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„œ๋น„์Šค ์ค‘๋‹จ, ์ธ๋ฒคํ† ๋ฆฌ ์กฐํšŒ ์‹คํŒจ, ์˜ค๋ž˜๋œ ์ˆ˜์ง‘๊ธฐ ๋ณด๊ณ ๋ฅผ CPUยท๋ฉ”๋ชจ๋ฆฌ 0์œผ๋กœ ๊ธฐ๋กํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€๋งŒ ์ธก์ •๋˜๋ฉด ์„ฑ๊ณตํ•œ ์ปจํ…Œ์ด๋„ˆ ๊ฐ’์„ ํ‘œ์‹œํ•˜๊ณ , 30์ดˆ๊ฐ€ ์ง€๋‚œ ๋ณด๊ณ ๋Š” stale๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์Šคํƒ์€ ๋Œ€์ƒ Linux Swarm ๋…ธ๋“œ๋งˆ๋‹ค resource-monitor ํƒœ์Šคํฌ๋ฅผ ํ•˜๋‚˜ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค. Agent ๋ฐฐ์น˜ ๋ผ๋ฒจ์ด๋‚˜ UI์˜ Agent ํ™œ์„ฑํ™” ์„ค์ •๊ณผ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด Docker ์ƒ˜ํ”Œ๋Ÿฌ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์—ฌ ์•ฝ 10์ดˆ ๊ฐ„๊ฒฉ, ๋™์‹œ GET ์š”์ฒญ ์ตœ๋Œ€ 4๊ฐœ, ์ƒ˜ํ”Œ๋ง ์ œํ•œ ์‹œ๊ฐ„ 8์ดˆ๋กœ ์ˆ˜์ง‘ํ•˜๋ฉฐ ์ƒˆ ์ปจํ…Œ์ด๋„ˆ์˜ CPU ์นด์šดํ„ฐ ์ค€๋น„ ๋Œ€๊ธฐ๋Š” ํ•จ๊ป˜ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ž์‹ ์˜ ์Šคํƒ์— ์†ํ•˜๋ฉฐ ์ปจํ…Œ์ด๋„ˆ ๋ผ๋ฒจ io.kpl.resource-monitor=true๊ฐ€ ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๋งŒ ์„ ํƒํ•˜๊ณ  ์†Œ์œ ๊ถŒ์„ ์žฌํ™•์ธํ•ฉ๋‹ˆ๋‹ค. Agent์™€ managed Peer๋Š” ์ค‘๋ณต ์ง‘๊ณ„๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋ผ๋ฒจ ๋Œ€์ƒ์€ ControllerยทPrometheusยทGrafanaยท์ˆ˜์ง‘๊ธฐ ์ž์ฒด์ด๋ฉฐ ์ˆ˜์ง‘๊ธฐ ๋น„์šฉ์€ monitor ๋ฒ”์œ„์— ๋”ฐ๋กœ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์„ค์ •๋œ ์ œ์–ด ๋…ธ๋“œ๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹คํ–‰๋˜์ง€ ๋ชปํ•œ ๊ธฐ๋ณธ ์„œ๋น„์Šค๋„ ๋ˆ„๋ฝ ์ƒํƒœ๋กœ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ์Šคํƒ์˜ ๋‹ค๋ฅธ ๊ด€๋ฆฌ ์„œ๋น„์Šค๋„ ์ด ์ปจํ…Œ์ด๋„ˆ ๋ผ๋ฒจ๋กœ ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ์˜ ๋ณต์ œ๋ณธ์€ ๋ณ„๋„ ๋ ˆ์ฝ”๋“œ๋กœ, ๊ฐ™์€ ํ˜ธ์ŠคํŠธ์˜ ๋ณต์ œ๋ณธ์€ ํ•ด๋‹น ํ˜ธ์ŠคํŠธ CPU ๋ถ„๋ชจ๋กœ ํ•ฉ์‚ฐํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜์ง‘๊ธฐ๋Š” ๋กœ์ปฌ Docker ์†Œ์ผ“๊ณผ ํด๋Ÿฌ์Šคํ„ฐ ๋ณด๊ณ ์šฉ ์ธ์ฆ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์›น Controller์—๋Š” Docker ์†Œ์ผ“์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ  ๊ธฐ์กด ์‚ฌ์šฉ์ž ๊ถŒํ•œ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ฝ๊ธฐ ์ „์šฉ ์†Œ์ผ“ ๋งˆ์šดํŠธ ์ž์ฒด๊ฐ€ Docker API ๋ฉ”์„œ๋“œ๋ฅผ ์ œํ•œํ•˜์ง€๋Š” ์•Š์œผ๋ฉฐ, ์ˆ˜์ง‘ ์ฝ”๋“œ์—์„œ GET ์š”์ฒญ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ œํ•œ๋œ ํฌ๊ธฐ์˜ ์ธ์ฆ ๋ณด๊ณ ๋ฅผ monitoring ์˜ค๋ฒ„๋ ˆ์ด๋กœ ๋ณด๋‚ด๊ณ  Controller๋Š” ๋…ธ๋“œ๋ณ„ ์ตœ์‹  ๋ณด๊ณ ๋งŒ ์บ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ฅ์€ runs๊ฐ€ ์•„๋‹Œ Prometheus์— ๋‚จ์Šต๋‹ˆ๋‹ค. UI๋Š” Agent ํƒญ์ด ๋ณด์ผ ๋•Œ๋งŒ ์„œ๋น„์Šค ํ˜„์žฌ ๊ฐ’์„ ์กฐํšŒํ•˜๋ฉฐ SSE์— ์„œ๋น„์Šค ์ด๋ ฅ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 10๋ถ„ ๋™์•ˆ ๋ณด๊ณ ํ•˜์ง€ ์•Š์€ ํ˜ธ์ŠคํŠธ๋Š” ์‹ค์‹œ๊ฐ„ ๋ชฉ๋ก์—์„œ ๋งŒ๋ฃŒ๋˜๊ณ  Prometheus ์ด๋ ฅ์€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

Controller /metrics์— kpl_service_cpu_usage_percent, kpl_service_cpu_usage_cores, kpl_service_cpu_capacity_cores, kpl_service_memory_working_set_bytes, kpl_service_memory_usage_bytes, kpl_service_resource_containers (kind=expected|measured), kpl_service_resource_sample_complete, kpl_service_resource_sample_timestamp_seconds๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ผ๋ฒจ์€ service, node_id, scope (controller, third_party, monitor)์ž…๋‹ˆ๋‹ค. kpl_service_running์€ ์‹ ์„ ํ•œ ์ธ๋ฒคํ† ๋ฆฌ์—์„œ ์‹คํ–‰/๋ถ€์žฌ๋ฅผ 1/0์œผ๋กœ ๊ธฐ๋กํ•˜๋ฉฐ unknownยทstale์—์„œ๋Š” ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค. kpl_service_resource_report_fresh๋Š” ์ •์ƒยท์‹ ์„ ํ•œ ๋ณด๊ณ ์™€ ์‹คํŒจยท์˜ค๋ž˜๋œ ๋ณด๊ณ ๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ง€ํ‘œ๋Š” Agent ๋น„ํ™œ์„ฑํ™” ๋ฐ Grafana Agent ํ•„ํ„ฐ์™€ ๋…๋ฆฝ์ ์ž…๋‹ˆ๋‹ค. Grafana์˜ Controller and supporting services ์˜์—ญ์— CPU, ๋‘ ๋ฉ”๋ชจ๋ฆฌ ์ง€ํ‘œ, ์ปค๋ฒ„๋ฆฌ์ง€, ์‹คํ–‰ ์ƒํƒœ, ๋ณด๊ณ  ์ƒํƒœ ๊ทธ๋ž˜ํ”„๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๊ธฐ์กด Start measurement / Stop measurement๊ฐ€ ์ €์žฅํ•˜๋Š” ๊ฐ™์€ ๊ตฌ๊ฐ„์— ์„œ๋น„์Šค์™€ Agent/Peer ์„ธ ๋ฒ”์œ„๊ฐ€ ํ•จ๊ป˜ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ฐ’ยท์ตœ๊ทผ ์ด๋ ฅยท๊ตฌ๊ฐ„ยท์š”์•ฝ CSV๋Š” ๊ธฐ์กด ์—ด์„ ์œ ์ง€ํ•˜๊ณ  entity_type, service, node_id, node_name์„ ๋’ค์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. Agent ํ–‰์€ entity_type=agent (ํ˜„์žฌ ํ•ฉ๊ณ„๋Š” agent_total), ์„œ๋น„์Šค ํ–‰์€ service์ด๋ฉฐ Agent ์‹๋ณ„์ž ์—ด์€ ๋น„์›Œ ๋‘ก๋‹ˆ๋‹ค. ์ด๋ ฅ์€ ์•ˆ์ •์ ์ธ ๋…ธ๋“œ ID๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  node_name์€ ๋น„์›Œ ๋‘ก๋‹ˆ๋‹ค. ์œ ํ˜•ยท์„œ๋น„์Šคยท๋…ธ๋“œยท๋ฒ”์œ„๋ฅผ ํ•จ๊ป˜ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•˜๋ฉฐ scope=third_party๊ฐ€ ๊ฐ™๋‹ค๊ณ  ์„œ๋กœ ๋‹ค๋ฅธ ์„œ๋น„์Šค๋ฅผ ํ•ฉ์น˜๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ์˜ CPU ๋ฐฑ๋ถ„์œจ์„ ๋”ํ•˜๊ฑฐ๋‚˜, ์ค‘๋ณต๋˜๋Š” Agent ์„ธ ๋ฒ”์œ„๋ฅผ ๋”ํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์‹คํ–‰ยท๋ณด๊ณ  ์ƒํƒœ๋Š” ๋‹จ์œ„๊ฐ€ boolean์ธ ์ด๋ ฅ ์ง€ํ‘œ์ด๋ฉฐ ํ‰๊ท ์€ ํ™•๋ณด๋œ scrape ํ‘œ๋ณธ ์ค‘ 1์˜ ๋น„์œจ์ž…๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ ๊ฐ€๋™๋ฅ ์ด ์•„๋‹ˆ๊ณ  ์ˆ˜์ง‘ ๊ณต๋ฐฑ์€ ๋ˆ„๋ฝ์œผ๋กœ ๋‚จ์Šต๋‹ˆ๋‹ค.

KPL ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์‹œ ๋นŒ๋“œยท๊ฒŒ์‹œํ•˜๊ณ  ์Šคํƒ์„ ์žฌ๋ฐฐํฌํ•˜๋ฉด ์ˆ˜์ง‘๊ธฐ, ์„œ๋น„์Šค ์ปจํ…Œ์ด๋„ˆ ๋ผ๋ฒจ, Controller ์ง€ํ‘œ, ๋ฒ„์ „์ด ๊ฐฑ์‹ ๋œ Grafana ์„ค์ •์ด ํ•จ๊ป˜ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ๊ตฌ๊ฐ„์€ ์œ ์ง€๋˜์ง€๋งŒ ์„œ๋น„์Šค ์ด๋ ฅ์€ ์—…๋ฐ์ดํŠธ ์ดํ›„ scrape๋ถ€ํ„ฐ ์Œ“์ž…๋‹ˆ๋‹ค. ์ˆ˜์ง‘๊ธฐ๋Š” ์œ„ ๋ผ๋ฒจ์ด ์žˆ๋Š” Swarm ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ์ˆ˜์ง‘๊ธฐ๊ฐ€ ์—†๋Š” ๋‹จ๋…ยท์‚ฌ์šฉ์ž ์ •์˜ ๋ฐฐํฌ์—์„œ๋Š” ์„œ๋น„์Šค ๊ฐ’์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋กœ๊ทธ๋Š” sh scripts/swarm.sh logs resource-monitor --tail 100์œผ๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์›น ์ ‘๊ทผยท์ธ์ฆ ๋กœ๊ทธ

Controller๋Š” <data-dir>/logs ์•„๋ž˜์— ํ•œ ์ค„๋‹น JSON ๊ฐ์ฒด ํ•˜๋‚˜๋ฅผ ์ž๋™ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ ๊ธฐ๋ณธ ๊ฒฝ๋กœ๋Š” data/logs, Swarm์—์„œ๋Š” ์˜์† controller-data volume์˜ /var/lib/kpl/data/logs์ž…๋‹ˆ๋‹ค.

ํŒŒ์ผ ๊ธฐ๋ก ๋Œ€์ƒ
access.jsonl ๋Œ€์‹œ๋ณด๋“œยท์ •์  ํŒŒ์ผยทAPI ์ ‘๊ทผ, ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ, ์‹คํŒจ ์‘๋‹ต, SSE ์—ฐ๊ฒฐ ์‹œ์ž‘ยท์ข…๋ฃŒ
auth.jsonl ๋กœ๊ทธ์ธ ์„ฑ๊ณตยท์‹คํŒจ, ๋กœ๊ทธ์•„์›ƒ ์‹œ๋„, ์„ธ์…˜ ๋ถ€์žฌยท๋งŒ๋ฃŒ๋กœ ๊ฑฐ์ ˆ๋œ ์ ‘๊ทผ๊ณผ ๋™์ผ ์ถœ์ฒ˜ ๊ฒ€์‚ฌ ๊ฑฐ์ ˆ

UTC timestamp, event, ์„œ๋ฒ„๊ฐ€ ์ƒ์„ฑํ•œ requestId, remoteIp, HTTP methodยทpath, ์‘๋‹ต status, ๋ณธ๋ฌธ bytes, ์ฒ˜๋ฆฌ ์‹œ๊ฐ„ durationMs, userAgent, ์ธ์ฆ ๋ฐฉ์‹ authentication(anonymousยทsessionยทinternal)๊ณผ ํ™•์ธ ๊ฐ€๋Šฅํ•œ user๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์ธ์ฆ ๊ธฐ๋ก์—๋Š” outcome๊ณผ invalid_credentials, rate_limited, invalid_request, origin_denied, login_required ๋“ฑ์˜ ์ด์œ ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์œ ํšจํ•œ JSON ๋กœ๊ทธ์ธ ์š”์ฒญ์—์„œ๋Š” ์‹คํŒจํ•˜๋”๋ผ๋„ ์ž…๋ ฅํ•œ ๊ณ„์ •๋ช…์„ ๋‚จ๊น๋‹ˆ๋‹ค. ๊ฐ™์€ ์š”์ฒญ์˜ ์ ‘๊ทผยท์ธ์ฆ ๊ธฐ๋ก์€ request ID๋กœ ์—ฐ๊ฒฐํ•˜๋ฉฐ, SSE๋Š” ์‘๋‹ต ์‹œ์ž‘ ์ฆ‰์‹œ sse_open, ์ข…๋ฃŒ ์‹œ sse_close๋ฅผ ๋‚จ๊น๋‹ˆ๋‹ค.

๋น„๋ฐ€๋ฒˆํ˜ธ, ์„ธ์…˜ ์ฟ ํ‚ค, Authorization ํ—ค๋”, ์š”์ฒญยท์‘๋‹ต ๋ณธ๋ฌธ, Referer์™€ URL ์ฟผ๋ฆฌ๋Š” ๊ธฐ๋กํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž…๋ ฅ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋ฅผ ์ œํ•œํ•˜๊ณ  JSON escaping์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. remoteIp๋Š” ์‹ค์ œ ์—ฐ๊ฒฐ ์ฃผ์†Œ์ด๋ฉฐ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ ForwardedยทX-Forwarded-For๋ฅผ ์‹ ๋ขฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. reverse proxy ๋’ค์—์„œ๋Š” proxy ์ฃผ์†Œ๊ฐ€ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ์‹คํ—˜ ์ค‘ ์ด๋ฒคํŠธ๋งˆ๋‹ค ๋””์Šคํฌ์— ์“ฐ์ง€ ์•Š๋„๋ก ์ธ์ฆ์— ์„ฑ๊ณตํ•œ ์ •์ƒ AgentยทPeer ํ†ต์‹ ๊ณผ ์ •์ƒ healthยทmetricsยทPrometheus target ์ ๊ฒ€์€ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์š”์ฒญ์˜ ์˜ค๋ฅ˜์™€ ์ธ์ฆ ์‹คํŒจ๋Š” ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

๊ฐ ํŒŒ์ผ์€ 10 MiB๋ฅผ ๋„˜๊ธฐ๊ธฐ ์ „์— ํšŒ์ „ํ•˜๋ฉฐ ํ˜„์žฌ ํŒŒ์ผ๊ณผ ๋ฐฑ์—… 5๊ฐœ(.1์ด ์ตœ์‹ , .5๊ฐ€ ๊ฐ€์žฅ ์˜ค๋ž˜๋จ), ๋‘ ์ข…๋ฅ˜ ํ•ฉ๊ณ„ ์•ฝ 120 MiB๊นŒ์ง€ ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค. ์žฌ์‹œ์ž‘ํ•ด๋„ ๊ธฐ์กด ํŒŒ์ผ์— ์ด์–ด ์”๋‹ˆ๋‹ค. ๋””๋ ‰ํ„ฐ๋ฆฌ๋Š” 0700, ํŒŒ์ผ์€ 0600 ๊ถŒํ•œ์ž…๋‹ˆ๋‹ค. ์‹œ์ž‘ ์‹œ ๋กœ๊ทธ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉด ์˜ค๋ฅ˜๋กœ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ์‹คํ–‰ ์ค‘ ์“ฐ๊ธฐ ์‹คํŒจ๋Š” Controller์˜ ์ผ๋ฐ˜ ์„œ๋น„์Šค ๋กœ๊ทธ์— ์•Œ๋ฆฌ๊ณ  HTTP ์š”์ฒญ ์ฒ˜๋ฆฌ๋Š” ์œ ์ง€ํ•˜๋ฉฐ ์ดํ›„ ์š”์ฒญ์—์„œ ๊ธฐ๋ก์„ ์žฌ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ํ ์—†์ด ํŒŒ์ผ์— appendํ•˜์ง€๋งŒ ๊ฑด๋งˆ๋‹ค fsyncํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์ ‘๊ทผ ๊ธฐ๋ก์„ ๋ณด์กดํ•˜๋ ค๋ฉด Controller volume ๋ฐฑ์—…์— logs๋ฅผ ํฌํ•จํ•˜์‹ญ์‹œ์˜ค. ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์ด ํŒŒ์ผ์„ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜ ์‹คํ—˜ ZIP์— ๋„ฃ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

๋กœ์ปฌ Controller์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‘ ํŒŒ์ผ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

tail -F data/logs/access.jsonl data/logs/auth.jsonl

Swarm์—์„œ๋Š” manager helper๋กœ ์ตœ๊ทผ 100์ค„์„ JSONL ์›๋ฌธ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

sh scripts/swarm.sh logs access
sh scripts/swarm.sh logs auth
sh scripts/swarm.sh logs access --tail 500
sh scripts/swarm.sh logs auth --tail all > auth.jsonl

--tail์€ ์–‘์˜ ์ •์ˆ˜ ๋˜๋Š” all์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ํŒŒ์ผ๋งŒ ์กฐํšŒํ•˜๋ฉฐ ํšŒ์ „๋œ .1~.5 ๋ฐฑ์—…์€ Controller volume์— ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช…๋ น ์‹คํ–‰ ์‹œ์ ์˜ ๋‚ด์šฉ์„ ์ถœ๋ ฅํ•˜๋ฏ€๋กœ jq ๊ฐ™์€ ๋„๊ตฌ๋กœ ํŒŒ์ดํ”„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด logs controller, logs agent, logs prometheus, logs grafana๋Š” ํƒ€์ž„์Šคํƒฌํ”„๊ฐ€ ์žˆ๋Š” ์„œ๋น„์Šค ๋กœ๊ทธ๋ฅผ ๊ณ„์† ์กฐํšŒํ•˜๋ฉฐ --tail๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Helper๋Š” ํ˜„์žฌ manager Docker context์—์„œ ์‹คํ–‰ ์ค‘์ธ Controller task๋ฅผ ์ฐพ๊ณ , docker exec๋กœ ํŒŒ์ผ์„ ์ฝ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ํ˜„์žฌ Docker daemon์ด ํ•ด๋‹น task๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋…ธ๋“œ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. Controller๊ฐ€ ๋‹ค๋ฅธ ๋…ธ๋“œ(worker ํฌํ•จ)์— ์žˆ์œผ๋ฉด ๊ทธ ๋…ธ๋“œ์˜ Docker context๋ฅผ ๋งŒ๋“ค๊ณ  ํŒŒ์ผ ์กฐํšŒ์šฉ์œผ๋กœ๋งŒ ์ง€์ •ํ•˜์‹ญ์‹œ์˜ค.

# user์™€ control-node๋ฅผ ์‹ค์ œ SSH ๊ณ„์ •๊ณผ Controller ํ˜ธ์ŠคํŠธ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
docker context create kpl-control --docker "host=ssh://user@control-node"
sh scripts/swarm.sh logs access --context kpl-control
sh scripts/swarm.sh logs auth --context kpl-control --tail 500

ํ˜ธ์ถœ์ž์˜ Docker context๋Š” manager์— ์—ฐ๊ฒฐ๋œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์œ„ ๋‘ ๋ช…๋ น์˜ --context๋Š” ๋…ธ๋“œ ํ™•์ธ๊ณผ ํŒŒ์ผ ์กฐํšŒ์—๋งŒ ์ ์šฉ๋˜๋ฉฐ, task ํƒ์ƒ‰์€ manager์—์„œ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒํ•œ daemon์ด task์˜ ์‹ค์ œ ์‹คํ–‰ ๋…ธ๋“œ์ธ์ง€ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์›น ๋กœ๊ทธ ๊ธฐ๋Šฅ์ด ํฌํ•จ๋œ Controller๊ฐ€ ์‹คํ–‰ ์ค‘์ด์–ด์•ผ ํ•˜๋ฉฐ, ํŒŒ์ผ ๋ถ€์žฌยทtask ์‹คํ–‰ ๋ถˆ๊ฐ€ยท์ž˜๋ชป๋œ ๋…ธ๋“œ๋Š” ์˜ค๋ฅ˜๋กœ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒˆ๋กœ ๋„์šฐ๊ฑฐ๋‚˜ stack์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ์ถ”์ ์ด๋‚˜ ํšŒ์ „๋œ ๋ฐฑ์—… ์กฐํšŒ๋Š” Controller ๋…ธ๋“œ์—์„œ ํŒŒ์ผ์„ ์ง์ ‘ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๋Œ€์‹œ๋ณด๋“œ ์ŠคํŠธ๋ฆผ ์ „์†ก๋Ÿ‰

๋Œ€์‹œ๋ณด๋“œ๊ฐ€ ๋ณด์ด๋Š” ๋™์•ˆ Overview๊ฐ€ Off(ํŽ˜์ด์ง€๋ฅผ ์—ด ๋•Œ์˜ ๊ธฐ๋ณธ๊ฐ’)์ด๋ฉด /api/v1/stream?view=dashboard&topology=0, On์ด๋ฉด topology=1์„ ์‚ฌ์šฉํ•˜๋ฉฐ ์ฒซ snapshot ์ดํ›„ snapshot_delta ๋˜๋Š” ์œ ํœด heartbeat๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. Off์—์„œ๋Š” ์ƒ์„ธ ๊ทธ๋ž˜ํ”„ ๊ณ„์‚ฐยท์ „์†ก์„ ์ƒ๋žตํ•˜๋ฉด์„œ ํ”ผ์–ด ์ˆ˜์™€ ์‹คํ—˜ ์ง€ํ‘œ๋ฅผ ๊ณ„์† ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค. ํŽ˜์ด์ง€๋ฅผ ์ˆจ๊ธฐ๋ฉด ์—ฐ๊ฒฐ์„ ๋Š๊ณ  ๋‹ค์‹œ ๋ณด์ด๋ฉด ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ž˜ ์œ ์ง€ํ•œ ์—ฐ๊ฒฐ์˜ ๋ˆ„์  ๋ฐ”์ดํŠธ๋Š” ์ •์  ํŽ˜์ด์ง€ ํฌ๊ธฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ณธ๋ฌธ ํ˜•์‹, ์—ฐ๊ฒฐ ์ œํ•œ์‹œ๊ฐ„, ์žฌ์‹œ๋„์™€ ๊ธฐ์กด ํด๋ผ์ด์–ธํŠธ ๊ทœ์น™์€ Dashboard SSE๊ฐ€ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

์ „์†ก๋Ÿ‰์ด ํฌ๊ฑฐ๋‚˜ Reconnecting์ด ์ง€์†๋˜๋ฉด ๋‹ค์Œ์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

  1. ์ด๋ฏธ์ง€ ๊ฐฑ์‹  ํ›„ ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ € Network์—์„œ ์œ„์˜ dashboard view๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  2. ์ ‘๊ทผ ๋กœ๊ทธ์˜ sse_close.bytes์™€ durationMs๋ฅผ ๋น„๊ตํ•˜๊ณ  sse_openยทsse_close, /api/v1/auth/session ์‘๋‹ต ์ƒํƒœยท์‹œ๊ฐ„์„ ํ•จ๊ป˜ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  3. Controllerยท์„œ๋น„์Šค์˜ ๋ถ€ํ•˜์™€ ์—ฐ๊ฒฐ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ์ธ ๊ฑฐ์ ˆ๊ณผ ๋А๋ฆฐ ์„ธ์…˜ ์กฐํšŒ๋Š” ๋‹ค๋ฅด๋ฉฐ ๋ธŒ๋ผ์šฐ์ € ์—ฐ๊ฒฐ ํ•ด์ œ๋งŒ์œผ๋กœ ์‹คํ—˜ ์‹คํŒจ๋ฅผ ํŒ๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ €์žฅ๋œ ์‹คํ–‰ ์ƒํƒœ๋ฅผ ํ™•์ธํ•œ ๋’ค ๋ณต๊ตฌ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์กด ๋Œ€์šฉ๋Ÿ‰ trace ์ธก์ •๊ณผ churn ๋ฒค์น˜๋งˆํฌ๋Š” ๊ฒ€์ฆ ๋ฒ”์œ„์™€ ํ•จ๊ป˜ ์„ฑ๋Šฅ ๊ทผ๊ฑฐ์— ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค.

๋ณด์กด๊ณผ ์šด์˜

Prometheus ์‹œ๊ณ„์—ด์€ prometheus-data, Grafana ์„ค์ •์€ grafana-data named volume์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์ปจํ…Œ์ด๋„ˆ ์žฌ์ƒ์„ฑ ํ›„์—๋„ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. Prometheus ๋ณด์กด ์„ค์ •์€ 15์ผ/5GB์ด๋ฉฐ ๋จผ์ € ๋„๋‹ฌํ•œ ์ •์ฑ…์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. 5GB๋Š” ๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰์˜ ์—„๊ฒฉํ•œ ์ƒํ•œ์ด ์•„๋‹ˆ๋ฉฐ WALยทheadยท์••์ถ• ์ž‘์—…์—๋Š” ์ถ”๊ฐ€ ๊ณต๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Prometheus ์ €์žฅ์†Œ ๋ฌธ์„œ

Swarm config๋Š” ๋ถˆ๋ณ€์ด๋ฏ€๋กœ Prometheus์™€ dashboard ์„ค์ • ๋ณ€๊ฒฝ์€ ๋ฒ„์ „์ด ๋ถ™์€ config ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ stack์„ ๋‹ค์‹œ ๋ฐฐํฌํ•ด์•ผ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ฐฐํฌ๋œ ์›๋ณธ์€ ํŒŒ์ผ๋กœ ๊ด€๋ฆฌํ•˜๋ฉฐ ๋ณ„๋„ ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์ €์žฅํ•˜๋ ค๋ฉด ๊ด€๋ฆฌ์ž ๋กœ๊ทธ์ธ ํ›„ ๋ณต์‚ฌ๋ณธ์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. Grafana provisioning ๋ฌธ์„œ

# ์ˆ˜์ง‘ ๋Œ€์ƒ ์ƒํƒœ ํ™•์ธ
curl http://control-node:9090/api/v1/targets

# manager์—์„œ ์„œ๋น„์Šค ์ƒํƒœ์™€ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
sh scripts/swarm.sh status
sh scripts/swarm.sh logs prometheus
sh scripts/swarm.sh logs grafana

Controller target๋„ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์—ด ์ˆ˜ ์žˆ๋Š” ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. GET /api/v1/prometheus/controller-targets๋Š” control ๋…ธ๋“œ์˜ Swarm ์ฃผ์†Œ์™€ ๊ฒŒ์‹œ๋œ KPL_HTTP_PORT๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐํฌ helper๋Š” ๋งค ๋ฐฐํฌ์—์„œ KPL_CONTROLLER_METRICS_URL๊ณผ KPL_PROMETHEUS_EXTERNAL_URL์„ ์ƒ์„ฑํ•˜๋ฉฐ ์‚ฌ์šฉ์ž ์ง€์ • ํฌํŠธ์™€ IPv6๋ฅผ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค. Prometheus ์ž์ฒด ๋งํฌ์—๋Š” ํ›„์ž๋ฅผ --web.external-url๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ํƒ์ƒ‰ ์š”์ฒญ๊ณผ Grafana datasource๋Š” ๋‚ด๋ถ€ DNS๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Prometheus ์ปจํ…Œ์ด๋„ˆ์—์„œ control ๋…ธ๋“œ์˜ ๊ฒŒ์‹œ๋œ HTTP ํฌํŠธ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Controller metrics URL์ด ๋ฏธ์„ค์ •์ด๋ฉด target ๋ชฉ๋ก์€ ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

Swarm stack์€ GET /api/v1/prometheus/agent-targets์—์„œ ๋“ฑ๋ก๋œ target์„ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. sh scripts/swarm.sh access๋กœ ๊ด‘๊ณ  ์ฃผ์†Œ๋ฅผ ํ™•์ธํ•˜๊ณ , ์„ค์ •ํ•œ ํฌํŠธ๊ฐ€ ์„ ํƒ๋œ ๋ชจ๋“  Agent ๋…ธ๋“œ์—์„œ ๋น„์–ด ์žˆ์œผ๋ฉฐ control ๋…ธ๋“œ์—์„œ TCP ์ ‘๊ทผ์ด ํ—ˆ์šฉ๋˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ์šด์˜์ž๊ฐ€ Agent metrics ๋งํฌ๋ฅผ ์ง์ ‘ ์—ด ๋•Œ์—๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์†ํ•œ ์‹ ๋ขฐ ๊ด€๋ฆฌ๋ง์—์„œ๋„ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•˜๊ณ  ์‹ ๋ขฐํ•˜์ง€ ์•Š๋Š” ์ถœ๋ฐœ์ง€๋Š” ์ฐจ๋‹จํ•˜์‹ญ์‹œ์˜ค. up{job="kpl-agent"}๋ฅผ ๋ณด๋ฉด ๋“ฑ๋ก๋˜์—ˆ์ง€๋งŒ ๋ฐฉํ™”๋ฒฝ์ด๋‚˜ ์ž˜๋ชป๋œ Swarm NodeAddr ๋•Œ๋ฌธ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” target์„ ์„ฑ๊ณตํ•œ scrape์™€ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ด๋ฏธ์ง€ ๋ฒ„์ „์€ Prometheus v3.13.2์™€ Grafana 13.2.1๋กœ ๊ณ ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ ์‹œ ๊ณต์‹ Prometheus ๋‹ค์šด๋กœ๋“œ์™€ Grafana Docker ์„ค์น˜ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜๊ณ  ์„ค์ •ยท๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์žฌ๊ฒ€์ฆํ•˜์‹ญ์‹œ์˜ค.

์‹ค์ œ ์‹คํ–‰ ๊ฒ€์ฆ

Linux์—์„œ ์ƒˆ ์‹คํ–‰์„ ๊ฒ€์ฆํ•˜๊ณ  ZIP, ์ฝ”๋“œ revision ๋˜๋Š” image digest, Prometheus ์‹œ๊ฐ„ ๋ฒ”์œ„๋ฅผ ๋ณด์กดํ•˜์‹ญ์‹œ์˜ค. ์ €์žฅ์†Œ์—๋Š” ์ด์ „ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹คํ–‰ ์˜ˆ์‹œ์˜ ์›๋ณธ ZIP์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ ํ•ด๋‹น ๊ณผ๊ฑฐ ์ˆ˜์น˜๋ฅผ ํ˜„์žฌ ์„ธ์…˜ ๊ธฐ๊ฐ„ ๊ตฌํ˜„์˜ ๊ฐ์‚ฌ ๊ฐ€๋Šฅํ•œ ๊ธฐ์ค€์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

examples/monitoring.yaml์—์„œ๋Š” ๋‹ค์Œ์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

ํ™•์ธ ํ•ญ๋ชฉ ์†Œ์Šค์— ๋”ฐ๋ฅธ ๊ธฐ๋Œ€๊ฐ’
์„ฑ๊ณต ๋ฐœํ–‰ ๋ชจ๋“  ์˜ˆ์•ฝ ๋ฐœํ–‰์ด ์„ฑ๊ณตํ•˜๊ณ  telemetry๊ฐ€ ์ˆ˜์ง‘๋˜๋ฉด envelope 60 + raw 6 = 66๊ฑด
worker ๋„คํŠธ์›Œํฌ ์„ค์ • worker ์„ธ ๊ฐœ์— delay 50ms, jitter 5ms, loss 1% ์„ค์ •
๋„๋‹ฌ๋ฅ  ๋ถ„๋ชจ ์ „์ฒด deliver ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ ๋ฐœํ–‰์˜ ์ˆ˜์‹  ๊ธฐ๊ฐ„์— ํ•ด๋‹นํ•˜๋Š” ๋™์ผ run/topic ์„ธ์…˜ ์ฆ๊ฑฐ์—์„œ ์žฌ๊ตฌ์„ฑ
์ง€์—ฐ ํ‘œ๋ณธ ์•ˆ์ • ๋Œ€์ƒ์˜ ๊ธฐํ•œ ๋‚ด ์›๊ฒฉ envelope ์Œ๋งŒ ํฌํ•จ. raw์™€ ๋ฐœํ–‰์ž ๋กœ์ปฌ ์ˆ˜์‹ ์€ ์ œ์™ธ
๊ด€์ธก ํ’ˆ์งˆ pending, unknown, incomplete์™€ ๋ณด๊ณ ๋œ telemetry-drop ๊ฐ’์„ ๋ณด์กด. ๋ณด๊ณ ๋œ drop์ด 0์ด์–ด๋„ ์™„์ „ํ•œ ๋กœ๊ทธ๋ฅผ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Œ
์ •๋ฆฌ ๋งˆ์ง€๋ง‰ stop-all์ด Peer ์ œ๊ฑฐ๋ฅผ ์š”์ฒญํ•˜๋ฏ€๋กœ Agent ์ƒํƒœ์™€ ๊ฐ Linux ํ˜ธ์ŠคํŠธ์˜ ์ž”์กด Peer ์ปจํ…Œ์ด๋„ˆ ํ™•์ธ

metrics.json์„ ์ •ํ™•ํžˆ ๊ฐ™์€ events.jsonl ๊ฒฝ๊ณ„์™€ export.json.exportedAt์— ๋งž์ถฐ ๋น„๊ตํ•˜์‹ญ์‹œ์˜ค. Counter ๋น„๊ต์—๋„ ๊ฐ™์€ Controller ์ƒ๋ช…์ฃผ๊ธฐ์™€ ์ˆ˜์ง‘ ๊ฒฝ๊ณ„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Heartbeat๊ฐ€ add_peer/remove_peer์˜ 0 ๊ธฐ์ค€๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•˜์ง€๋งŒ ์ฒซ scrape ์ „ ์ด๋ฒคํŠธ๋Š” increase ์ถ”์ •์—์„œ ๋ˆ„๋ฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜์‹ ยท์ค‘๋ณตยทmesh ์ด๋ฒคํŠธยท์ง€์—ฐ ํ•ฉ๊ณ„๋Š” ์‹คํ–‰๊ณผ ๊ด€์ธก์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ ๊ณ ์ •๋œ ํ•ฉ๊ฒฉ ๊ธฐ์ค€๊ฐ’์ด ์•„๋‹™๋‹ˆ๋‹ค.

์ง€ํ‘œ ๊ตฌํ˜„๊ณผ ํšŒ๊ท€ ์‚ฌ๋ก€๋Š” ์‹คํ—˜ ์ง€ํ‘œ์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. Linux ๊ฒ€์ฆ ๋ช…๋ น์€ ๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

Dashboard ๋‚ด์žฅ ์‹œ๊ฐํ™”

์ด ๋‚ด์šฉ์€ ๋Œ€์‹œ๋ณด๋“œ๋กœ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค.

์ €์žฅ ๊ฒฐ๊ณผ ์ฐพ๊ธฐ

์ €์žฅ ๊ฒฐ๊ณผ ๊ฒ€์ƒ‰์œผ๋กœ ์ด๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŒจ๋„ ์ ‘๊ธฐ์™€ ํŽผ์น˜๊ธฐ

๋Œ€์‹œ๋ณด๋“œ ํŒจ๋„๋กœ ์ด๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

์‹คํ—˜ ๊ฒฐ๊ณผ ๋‹ค์šด๋กœ๋“œ

์ด ๋‚ด์šฉ์€ ์ €์žฅ ๊ฒฐ๊ณผ๋กœ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค.

๋ถ„์„ ํŒŒ์ผ๊ณผ ์ด๋ฏธ์ง€ ๋ณด์กด

์ด ๋‚ด์šฉ์€ ์ €์žฅ ๊ฒฐ๊ณผ๋กœ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ