137 lines
4.5 KiB
Markdown
137 lines
4.5 KiB
Markdown
# 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 > 1–2 min (jeśli liczysz lag)
|
||
- `node_filesystem_avail_bytes` < 10–15% (ledger/accounts szybko zjadają dysk)
|
||
- wysokie `node_cpu_seconds_total{mode="iowait"}` (NVMe bottleneck)
|