Node Operators
Monitoring & Alerting Setup
30.9.1 Prometheus Configuration
Create monitoring/prometheus.yml:
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: "randproof-keeper"
static_configs:
- targets: ["keeper:9090"]
metrics_path: /metrics
# Key metrics exposed by RandProof Keeper:
# randproof_events_fulfilled_total - counter: total events fulfilled
# randproof_events_pending - gauge: events awaiting fulfillment
# randproof_fulfillment_latency_ms - histogram: time to fulfill
# randproof_entropy_fetch_latency_ms - histogram: per-source fetch time
# randproof_entropy_staleness_seconds - gauge: age of each entropy source
# randproof_bls_signatures_produced_total - counter: BLS partial sigs produced
# randproof_stake_amount - gauge: current stake per chain
# randproof_earnings_usdc_total - counter: cumulative earnings
# randproof_uptime_percent - gauge: rolling 24h uptime
# randproof_rpc_connected - gauge: 1=connected 0=disconnected
# randproof_chain_block_number - gauge: latest block per chain30.9.2 Grafana Dashboard Import
# Import the official RandProof Grafana dashboard
# Navigate to: http://localhost:3001 (admin / YOUR_GENERATED_PASSWORD)
# Go to: Dashboards > Import > Upload JSON
# Dashboard JSON: https://github.com/randproof-network/grafana-dashboard
# Or import by ID:
# Grafana Dashboard ID: 19847 (RandProof Keeper Node Overview)
# Key panels in the dashboard:
# - Events Fulfilled (24h / 7d / 30d)
# - Fulfillment Latency P50 / P95 / P99
# - Entropy Source Health (all 15 sources)
# - Chain Connection Status (all active chains)
# - Stake Balance per Chain
# - Earnings Accumulation
# - Uptime % (with slashing threshold line at 80%)
# - Peer Count (gossip network)30.9.3 Alert Rules (Prometheus Alertmanager)
Create monitoring/alerts.yml:
groups:
- name: randproof-keeper-alerts
rules:
# CRITICAL: Node offline
- alert: KeeperNodeDown
expr: up{job="randproof-keeper"} == 0
for: 2m
labels: { severity: critical }
annotations:
summary: "RandProof keeper node is DOWN"
description: "Node has been unreachable for 2+ minutes. Slashing risk after 24h."
# CRITICAL: Chain RPC disconnected
- alert: ChainRPCDisconnected
expr: randproof_rpc_connected == 0
for: 5m
labels: { severity: critical }
annotations:
summary: "Chain RPC connection lost: {{ $labels.chain }}"
# HIGH: Entropy source stale
- alert: EntropySourceStale
expr: randproof_entropy_staleness_seconds{source="nist"} > 65
for: 1m
labels: { severity: high }
annotations:
summary: "NIST beacon data is stale (>65s)"
# HIGH: Uptime below threshold
- alert: UptimeLow
expr: randproof_uptime_percent < 85
for: 30m
labels: { severity: high }
annotations:
summary: "Keeper uptime {{ $value }}% — approaching slashing threshold (80%)"
# MEDIUM: High fulfillment latency
- alert: HighFulfillmentLatency
expr: histogram_quantile(0.95, randproof_fulfillment_latency_ms) > 8000
for: 10m
labels: { severity: medium }
annotations:
summary: "P95 fulfillment latency above 8 seconds"
# LOW: Stake balance below comfortable buffer
- alert: LowStakeBalance
expr: randproof_stake_amount < 0.006
labels: { severity: low }
annotations:
summary: "Stake on {{ $labels.chain }} near minimum threshold"