Ours RP Prometheus / Grafana Monitor
本目录提供本地开发监控栈,用于采集 rpki_artifact_metrics 暴露的 ours RP soak 指标。
前置条件
- Docker + Docker Compose v2;
- 宿主机已启动
rpki_artifact_metrics,并监听 Docker 网桥可访问的地址,例如0.0.0.0:9556; - Prometheus 容器通过
host.docker.internal:9556访问宿主 sidecar。
Linux Docker 下 compose 已配置:
extra_hosts:
- host.docker.internal:host-gateway
启动
cd rpki_2/rpki/monitor
docker compose up -d
默认镜像使用官方 Docker Hub 镜像:
prom/prometheus:v2.55.1
grafana/grafana:11.3.1
如需切到其它镜像源:
PROMETHEUS_IMAGE=<mirror>/prom/prometheus:v2.55.1 \
GRAFANA_IMAGE=<mirror>/grafana/grafana:11.3.1 \
docker compose up -d
默认端口:
- Prometheus: http://localhost:9090
- Grafana: http://localhost:3000
- Grafana 默认账号密码:
admin/admin
如端口冲突:
PROMETHEUS_PORT=19090 GRAFANA_PORT=13000 docker compose up -d
Prometheus 默认保留 7 天数据;可通过 PROMETHEUS_RETENTION 覆盖:
PROMETHEUS_RETENTION=7d docker compose up -d
长期稳定性测试
portable soak package 内置 run_24h_soak_with_metrics.sh,用于连续运行 ours RP、启动 metrics sidecar、启动本监控栈,并每小时生成报告:
cd /path/to/portable-soak
SOAK_DURATION_SECS=0 \
HOURLY_REPORT_INTERVAL_SECS=3600 \
SOAK_RETAIN_RUNS=100 \
CLEAN_TMP_AFTER_RUN=1 \
PROMETHEUS_RETENTION=7d \
STOP_MONITOR_STACK_ON_EXIT=0 \
FEISHU_WEBHOOK_SCRIPT=/home/yuyr/.codex/skills/user/feishu-webhook/scripts/send_feishu_text.py \
./run_24h_soak_with_metrics.sh
SOAK_DURATION_SECS=0 表示持续运行不自动停止;如需 24 小时自然停止,可设置为 86400,脚本会等当前 run 完成后退出,不会直接 kill 半轮验证。
关键产物:
runs/run_xxxx/:最近 100 个 run 原始产物;hourly_reports/hour_*.md:小时级报告;hourly_reports/hourly_summary.jsonl:小时级结构化汇总;incident_runs/run_xxxx/:异常 run 固化副本;logs/metrics.*、logs/24h-soak.*、logs/hourly-reporter.*:运行日志。
短周期联调可把 SOAK_DURATION_SECS 和 HOURLY_REPORT_INTERVAL_SECS 调小,并设置 FEISHU_DRY_RUN=1 避免真实飞书通知。
停止
cd rpki_2/rpki/monitor
docker compose down
保留数据 volume。若要清理数据:
docker compose down -v
典型本地联调命令
先启动 APNIC soak 和 metrics sidecar,例如:
# soak .env 关键配置
MAX_RUNS=-1
RIRS=apnic
RETAIN_RUNS=5
INTERVAL_SECS=0
# metrics sidecar
rpki_artifact_metrics \
--run-root /path/to/portable-soak \
--listen 0.0.0.0:9556 \
--poll-secs 5 \
--instance local-apnic-continuous
再启动监控栈:
cd rpki_2/rpki/monitor
docker compose up -d
验证
Prometheus target:
curl -s 'http://localhost:9090/api/v1/targets' | python3 -m json.tool
Prometheus query:
curl -G 'http://localhost:9090/api/v1/query' \
--data-urlencode 'query=up{job="ours-rp-artifact-metrics"}'
curl -G 'http://localhost:9090/api/v1/query' \
--data-urlencode 'query=ours_rp_run_completed_total{status="success"}'
Grafana health:
curl -s http://localhost:3000/api/health | python3 -m json.tool
Grafana dashboard:
主要指标
ours_rp_metrics_service_upours_rp_run_completed_totalours_rp_run_duration_secondsours_rp_run_max_rss_bytesours_rp_vrps{kind="total|unique"}:total为去重前 VRP 条目数,unique按(ASN, IP Prefix, Max Length)去重。ours_rp_vapsours_rp_publication_pointsours_rp_repo_sync_phase_countours_rp_large_publication_points{object_count_gt="10|50|100|..."}ours_rp_cir_objectsours_rp_ccr_state_items
Inter-RP 持续对比监控
rpki_inter_rp_metrics 用于汇总三方 RP 的最新产物:
- ours RP:读取当前 portable soak 的
runs/run_xxxx/run-summary.json、result.ccr、CSV 产物; - Routinator:读取远端200同步来的
routinator/latest/run-meta.json、vrps.csv、vaps.csv; - rpki-client 9.8:读取远端200同步来的
rpki-client/latest/run-meta.json、vrps.csv、vaps.csv、result.ccr。
远端231 启动 sidecar 示例:
rpki_inter_rp_metrics \
--ours-run-root /root/rpki_20260608_2_feature062_24h_20260608T075547Z/portable-soak \
--peer-root /root/inter-rp-aggregator/synced-from-200 \
--listen 0.0.0.0:9557 \
--poll-secs 30 \
--instance remote231-inter-rp
Prometheus 已新增 ours-rp-inter-rp-metrics scrape job,默认访问 host.docker.internal:9557。
远端200 runner 与远端231同步脚本位于:
scripts/inter_rp/run_remote200_rp_loops.sh
scripts/inter_rp/run_single_rp_with_rss.sh
scripts/inter_rp/sync_remote200_to_231.sh
scripts/inter_rp/run_inter_rp_metrics_sidecar.sh
scripts/inter_rp/inter-rp.env.example
如需从本机独立开关远端200上的 Routinator 或 rpki-client,使用:
scripts/inter_rp/control_remote200_rp.sh status all
scripts/inter_rp/control_remote200_rp.sh stop routinator
scripts/inter_rp/control_remote200_rp.sh start routinator
scripts/inter_rp/control_remote200_rp.sh restart rpki-client
默认远端为 root@43.110.128.200,可通过 REMOTE_HOST=... 覆盖;脚本只管理指定 RP 的 loop 和当前子进程,不会自动影响另一个 RP。
关键指标:
inter_rp_run_wall_seconds{rp="ours-rp|routinator|rpki-client"}inter_rp_run_max_rss_bytes{rp="...",kind="aggregate_peak"}inter_rp_vrps{rp="..."}:按(ASN, IP Prefix, Max Length)去重。inter_rp_vaps{rp="..."}:按(Customer ASN, Providers)去重,Routinator 使用--enable-aspaJSON 输出转换,rpki-client 使用-jJSON 输出转换。inter_rp_ccr_digest_match{left="ours-rp",right="rpki-client",state="overall|mfts|vrps|vaps|tas|rks"}inter_rp_sync_age_seconds
Grafana dashboard: