Files
trade-doc/rpc/baremetal-monitoring.md

137 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Monitoring bare metalu (Solana RPC box)
Cel: mieć **twarde metryki** dla prywatnego RPC (i opcjonalnie Geysera), żeby:
- szybko wykrywać `slot lag`, spadki wydajności i problemy I/O,
- mieć “SLO” dla komponentów zależnych na VPS (DLOB / executor),
- nie zgadywać “czy to RAM/CPU/dysk/sieć”.
Wszystko poniżej zakłada, że RPC box jest **prywatny** (dostęp tylko po WireGuard).
## Co instalujemy (MVP)
### 1) Node exporter (hostowe metryki)
Pakiet: `prometheus-node-exporter`
Daje standardowe metryki hosta:
- CPU / iowait,
- RAM,
- filesystem usage,
- network,
- podstawowe statystyki procesów.
Bindujemy go na IP WireGuard (żeby nie wystawiać publicznie).
### 2) RPC probe → node_exporter textfile collector
To jest mały probe uruchamiany systemd timerem, który zapisuje plik `*.prom`
do textfile collector node_exportera.
Wystawia m.in.:
- `solana_rpc_up` (1/0),
- `solana_rpc_latency_seconds{method="getHealth|getSlot"}`,
- `solana_rpc_slot`,
- `solana_rpc_block_height`,
- `solana_rpc_slot_lag` (opcjonalnie, jeśli podasz endpoint referencyjny).
### 3) Yellowstone (Geyser) Prometheus endpoint (opcjonalnie)
Jeśli uruchamiasz plugin `yellowstone-grpc`, on sam wystawia `/metrics`
(adres/port z configu pluginu).
To jest osobny target do scrapowania w Prometheus.
## Gdzie jest IaC (Ansible)
IaC jest w `infra/baremetal-solana-rpc/`:
- playbook: `infra/baremetal-solana-rpc/ansible/playbook.yml`
- przykładowe zmienne: `infra/baremetal-solana-rpc/ansible/group_vars/solana_rpc.yml.example`
Monitoring jest domyślnie “włączony” w przykładzie. Najważniejsze zmienne:
- `node_exporter_listen` (np. `10.10.0.2:9100`)
- `node_exporter_textfile_collector_dir`
- `solana_rpc_probe_endpoint` (np. `http://10.10.0.2:8899`)
- `solana_rpc_probe_reference_endpoint` (opcjonalnie; slot lag vs referencja)
- `yellowstone_prometheus_listen` (np. `10.10.0.2:8999`)
## Jak wdrożyć (z VPS / runnera)
1) Uzupełnij inventory i vars (bez commitowania sekretów):
```bash
cd infra/baremetal-solana-rpc/ansible
cp inventory/hosts.ini.example inventory/hosts.ini
cp group_vars/solana_rpc.yml.example group_vars/solana_rpc.yml
```
2) Uruchom playbook:
```bash
ansible-playbook -i inventory/hosts.ini playbook.yml
```
## Jak sprawdzić, że działa
Z VPS (po WireGuard):
- node exporter: `curl -sS http://<rpc_wg_ip>:9100/metrics | head`
- RPC probe metryki: `curl -sS http://<rpc_wg_ip>:9100/metrics | rg "solana_rpc_" | head`
- yellowstone: `curl -sS http://<rpc_wg_ip>:8999/metrics | head` (jeśli włączone)
### Slot lag
Żeby dashboard miał metrykę `solana_rpc_slot_lag`, ustaw `solana_rpc_probe_reference_endpoint` na publiczny RPC (przykład: `https://api.mainnet-beta.solana.com`). W konfiguracji Ansible:
```yaml
solana_rpc_probe_reference_endpoint: "https://api.mainnet-beta.solana.com"
```
Po restarcie timer/probe:
- `systemctl restart solana-rpc-textfile-probe.timer`
- `systemctl start solana-rpc-textfile-probe.service`
W Prometheus/Grafanie:
- `solana_rpc_slot{job="mpabi-node-exporter",instance="<twoj-node-exporter-instance>"}`
- `solana_rpc_slot_reference{job="mpabi-node-exporter",instance="<twoj-node-exporter-instance>"}`
- `solana_rpc_slot_lag{job="mpabi-node-exporter",instance="<twoj-node-exporter-instance>"}`
### Alerty Prometheus
W `trade-deploy/kustomize/infra/monitoring-extras` dodane zostały alerty:
- `AgaveRPCDown``solana_rpc_up == 0` przez >30s
- `AgaveRPCSlotLagHigh` — lag > 50 slotów przez >2m
- `AgaveRPCSlotLagCritical` — lag > 500 slotów przez >2m
- `AgaveIOHigh` — wysoki throughput na `nvme` (read+write > 300MiB/s przez 5m)
- `AgaveIOWaitHigh``iowait > 20%` przez 5m
Po deployu ArgoCD (`monitoring-extras`) alerty są od razu aktywne.
Jeśli chcesz od razu zaciągnąć zmianę:
- `kubectl -n argocd get application monitoring-extras -o wide`
- `kubectl -n argocd annotate application monitoring-extras argocd.argoproj.io/refresh=hard --overwrite`
- `kubectl -n monitoring get prometheusrules.monitoring.coreos.com agave-rpc-alerts -o wide`
## Prometheus na VPS: co scrapować
Najprostszy wariant to statyczne targety po WG:
- `http://<rpc_wg_ip>:9100/metrics` (host + solana_rpc_*),
- `http://<rpc_wg_ip>:8999/metrics` (yellowstone, jeśli używasz).
Zasada: żadnych portów RPC/metrics na publicznym NIC.
## Minimalne alerty (polecane)
- `solana_rpc_up == 0` przez > 30s
- `solana_rpc_slot_lag > 50` przez > 12 min (jeśli liczysz lag)
- `node_filesystem_avail_bytes` < 1015% (ledger/accounts szybko zjadają dysk)
- wysokie `node_cpu_seconds_total{mode="iowait"}` (NVMe bottleneck)