Telemetry & Monitoring
Prerequisites: Quick Start with
telemetry_enable: true.
Endpoints
| Endpoint | Description |
|---|---|
http://localhost:48123/metrics | Prometheus metrics |
http://localhost:48123/api/v1/self_info | Gateway identity and peer info for CL client connection |
http://localhost:48123/api/v1/version | Version and commit |
Version endpoint – GET /api/v1/version returns JSON: {"commitHash":"<short-sha>","version":"<semver>"} (e.g. {"commitHash":"e62711c","version":"v0.0.1-rc11"}).
Self Info (CL Client Connection)
CL clients (Prysm, Lighthouse) use /api/v1/self_info to get the gateway's multiaddr and peer ID for P2P connection.
Example response (with CL peer connected):
{
"ab_testing_enable": true,
"chain": "hoodi",
"commit_hash": "e62711c",
"fork_digest": "c6ecb76c",
"gateway_id": "optimum-prod-hoodi-spot-us-central-hermes-1",
"libp2p": {
"direct_peers": {
"16Uiu2HAmVB9aMmUoqoab8FYFKj84WthbjoeBWDGdyVw4Nfd5oKBY": {
"ID": "16Uiu2HAmVB9aMmUoqoab8FYFKj84WthbjoeBWDGdyVw4Nfd5oKBY",
"Addrs": ["/ip4/127.0.0.1/tcp/9010"]
}
},
"multiaddrs": ["/ip4/10.30.0.28/tcp/33212", "/ip4/34.57.43.128/tcp/33212", "/ip4/172.17.0.1/tcp/33212"],
"peer_ids": ["16Uiu2HAmVB9aMmUoqoab8FYFKj84WthbjoeBWDGdyVw4Nfd5oKBY"],
"peer_ids_per_topic": { "/eth2/c6ecb76c/beacon_block/ssz_snappy": ["16Uiu2HAmVB9aMmUoqoab8FYFKj84WthbjoeBWDGdyVw4Nfd5oKBY"] },
"peers_per_topic": { "/eth2/c6ecb76c/beacon_block/ssz_snappy": 1 },
"total_peers": 1
},
"mump2p": {
"peer_ids": ["12D3KooWPrkjYqSHpULwES7NBcLDer4GMGVUzSKwF71r1GwBnkAQ", "..."],
"peer_ids_per_topic": {
"/eth2/c6ecb76c/beacon_block/ssz_snappy": ["12D3KooWETZHYN6rChNftz42BHM16aAVyXKpk2sFGHHDU6wpvGCh", "..."],
"mump2p_aggregated_messages": ["12D3KooWGhG7EniNjaGq1fQt1NXJy7BvPfDoebxJtH6r3TNuDgME", "..."]
},
"peers_per_topic": { "/eth2/c6ecb76c/beacon_block/ssz_snappy": 49, "mump2p_aggregated_messages": 49 },
"total_peers": 49
},
"peer_id": "12D3KooWBh1tptA4uaJBLcEP5NtN2CXSnVvqhYjp2i6roWmjiysG",
"rlnc_config": {
"forward_shard_threshold": 0,
"publisher_shard_multiplier": 2,
"random_message_size_bytes": 512,
"rlnc_shard_factor": 16
},
"skip_messages_from_self": false
}Use a multiaddr from libp2p.multiaddrs that is reachable from your CL host (e.g. public IP or host IP when gateway runs in Docker) and peer_id when configuring your CL client: --peer=/ip4/YOUR_IP/tcp/33212/p2p/YOUR_PEER_ID.
Gateway Metrics
Endpoint: http://localhost:48123/metrics
Metrics are labeled with gateway_id. See Metrics Reference for the full list.
CL connected: When a CL client connects, optp2p_gateway_optimum_gateway_cl_peers goes from 0 to ≥1. optp2p_gateway_optimum_gateway_libp2p_total_messages increments as messages arrive. optp2p_gateway_optimum_gateway_optimum_total_messages increments as messages are forwarded to mump2p.
Logs
Gateway logs are JSON lines. Use docker logs optimum-gateway to inspect them. Key fields: fork_digest (e.g. c6ecb76c for hoodi) appears in startup, bootstrap update, and topic names (/eth2/<fork_digest>/<topic_name>/ssz_snappy). The gateway gets the digest from Bootstrap.
Setting Up the Monitoring Dashboard
This section walks through deploying a local Prometheus + Grafana stack that scrapes your gateway and loads the Partner Dashboard automatically.
Prerequisites
- Docker and Docker Compose installed
- Optimum Gateway running with
telemetry_enable: true - Ports 3000 (Grafana) and 9090 (Prometheus) available
Step 1: Create Monitoring Directory
mkdir -p optimum-monitoring/{prometheus,grafana-provisioning/datasources,grafana-provisioning/dashboards,grafana-dashboards}
cd optimum-monitoringYour final structure:
optimum-monitoring/
├── docker-compose.yml
├── prometheus/
│ ├── prometheus.yml
│ └── targets.json
├── grafana-provisioning/
│ ├── datasources/
│ │ └── prometheus.yaml
│ └── dashboards/
│ └── dashboards.yml
└── grafana-dashboards/
└── partner-dashboard.jsonStep 2: Docker Compose
Create docker-compose.yml:
services:
prometheus:
image: prom/prometheus:latest
volumes:
- ./prometheus:/etc/prometheus
- prometheus-data:/prometheus
ports:
- "9090:9090"
restart: unless-stopped
command:
- "--config.file=/etc/prometheus/prometheus.yml"
- "--storage.tsdb.path=/prometheus"
- "--storage.tsdb.retention.time=1h"
- "--storage.tsdb.retention.size=2GB"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9090/-/healthy"]
interval: 30s
timeout: 10s
retries: 3
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
volumes:
- ./grafana-provisioning:/etc/grafana/provisioning:ro
- ./grafana-dashboards:/var/lib/grafana/dashboards:ro
- grafana-data:/var/lib/grafana
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=admin
restart: unless-stopped
depends_on:
- prometheus
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/api/health"]
interval: 30s
timeout: 10s
retries: 3
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
volumes:
prometheus-data:
grafana-data:Step 3: Prometheus Configuration
Create prometheus/prometheus.yml:
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'gateway'
file_sd_configs:
- files:
- /etc/prometheus/targets.jsonCreate prometheus/targets.json (choose your platform):
Docker Desktop (macOS / Windows):
[
{
"targets": ["host.docker.internal:48123"],
"labels": { "job": "gateway" }
}
]Linux Docker:
[
{
"targets": ["172.17.0.1:48123"],
"labels": { "job": "gateway" }
}
]Host networking:
[
{
"targets": ["localhost:48123"],
"labels": { "job": "gateway" }
}
]Step 4: Grafana Provisioning
Create grafana-provisioning/datasources/prometheus.yaml:
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
url: http://prometheus:9090
access: proxy
isDefault: trueCreate grafana-provisioning/dashboards/dashboards.yml:
apiVersion: 1
providers:
- name: 'optimum-gateway'
orgId: 1
folder: 'Default'
type: file
disableDeletion: false
updateIntervalSeconds: 10
allowUiUpdates: true
options:
path: /var/lib/grafana/dashboards
foldersFromFilesStructure: trueStep 5: Add the Partner Dashboard
Copy the JSON below into grafana-dashboards/partner-dashboard.json:
Click to expand: Partner Dashboard JSON (v0.0.1-rc11)
{
"annotations": {
"list": [
{
"builtIn": 1,
"datasource": {
"type": "grafana",
"uid": "-- Grafana --"
},
"enable": true,
"hide": true,
"iconColor": "rgba(0, 211, 255, 1)",
"name": "Annotations & Alerts",
"type": "dashboard"
}
]
},
"description": "Partner-facing dashboard for Optimum Gateway. All metrics sourced from the gateway /metrics endpoint. Select your gateway from the dropdown.",
"editable": true,
"fiscalYearStartMonth": 0,
"graphTooltip": 1,
"id": null,
"links": [],
"panels": [
{
"collapsed": false,
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 0
},
"id": 1,
"panels": [],
"title": "Gateway Info",
"type": "row"
},
{
"datasource": {
"type": "prometheus",
"uid": "${ds_prometheus}"
},
"description": "ON when both CL and mump2p peers are connected to the gateway.",
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [
{
"options": {
"0": {
"color": "red",
"index": 1,
"text": "OFF"
},
"1": {
"color": "green",
"index": 0,
"text": "ON"
}
},
"type": "value"
}
],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "red",
"value": 0
},
{
"color": "green",
"value": 1
}
]
}
},
"overrides": []
},
"gridPos": {
"h": 4,
"w": 5,
"x": 0,
"y": 1
},
"id": 2,
"options": {
"colorMode": "value",
"graphMode": "none",
"justifyMode": "auto",
"orientation": "auto",
"percentChangeColorMode": "standard",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"showPercentChange": false,
"textMode": "auto",
"wideLayout": true
},
"pluginVersion": "12.3.1",
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${ds_prometheus}"
},
"editorMode": "code",
"expr": "(max by(gateway_id) (last_over_time(optp2p_gateway_optimum_gateway_cl_peers{gateway_id=\"$gateway\"}[$__rate_interval])) > bool 0) * (max by(gateway_id) (last_over_time(optp2p_gateway_optimum_gateway_opt_peers{gateway_id=\"$gateway\"}[$__rate_interval])) > bool 0)",
"instant": true,
"legendFormat": "__auto",
"range": false,
"refId": "A"
}
],
"title": "Status",
"type": "stat"
},
{
"datasource": {
"type": "prometheus",
"uid": "${ds_prometheus}"
},
"description": "Gateway version, commit, Go version, and public IP.",
"fieldConfig": {
"defaults": {
"color": {
"fixedColor": "text",
"mode": "fixed"
},
"custom": {
"align": "auto",
"cellOptions": {
"type": "auto"
},
"filterable": false,
"footer": {
"reducers": []
},
"inspect": false
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": 0
}
]
}
},
"overrides": []
},
"gridPos": {
"h": 8,
"w": 7,
"x": 5,
"y": 1
},
"id": 5,
"options": {
"cellHeight": "sm",
"frameIndex": 0,
"showHeader": false
},
"pluginVersion": "12.3.1",
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${ds_prometheus}"
},
"editorMode": "code",
"expr": "optp2p_gateway_optimum_gateway_app_build_info{gateway_id=\"$gateway\"}",
"instant": true,
"legendFormat": "__auto",
"range": false,
"refId": "A"
}
],
"title": "Build Info",
"transformations": [
{
"id": "labelsToFields",
"options": {
"keepLabels": [
"version",
"commit",
"go",
"public_ip"
],
"mode": "rows"
}
}
],
"type": "table"
},
{
"datasource": {
"type": "prometheus",
"uid": "${ds_prometheus}"
},
"description": "Latest slot from genesis (2025-03-17 12:10 UTC, 12s slots).",
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": 0
}
]
}
},
"overrides": []
},
"gridPos": {
"h": 4,
"w": 6,
"x": 12,
"y": 1
},
"id": 11,
"options": {
"colorMode": "none",
"graphMode": "none",
"justifyMode": "auto",
"orientation": "auto",
"percentChangeColorMode": "standard",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"showPercentChange": false,
"textMode": "value_and_name",
"wideLayout": true
},
"pluginVersion": "12.3.1",
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${ds_prometheus}"
},
"editorMode": "code",
"expr": "floor(vector((time() - 1742213400) / 12))",
"instant": true,
"legendFormat": "Slot",
"range": false,
"refId": "A"
}
],
"title": "Hoodi slot",
"type": "stat"
},
{
"datasource": {
"type": "prometheus",
"uid": "${ds_prometheus}"
},
"description": "peers connected to the gateway.",
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "red",
"value": 0
},
{
"color": "green",
"value": 1
}
]
}
},
"overrides": []
},
"gridPos": {
"h": 4,
"w": 5,
"x": 0,
"y": 5
},
"id": 3,
"options": {
"colorMode": "value",
"graphMode": "area",
"justifyMode": "auto",
"orientation": "auto",
"percentChangeColorMode": "standard",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"showPercentChange": false,
"textMode": "value_and_name",
"wideLayout": true
},
"pluginVersion": "12.3.1",
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${ds_prometheus}"
},
"editorMode": "code",
"expr": "optp2p_gateway_optimum_gateway_cl_peers{gateway_id=\"$gateway\"}",
"legendFormat": "CL Peers",
"range": true,
"refId": "A"
},
{
"datasource": {
"type": "prometheus",
"uid": "${ds_prometheus}"
},
"editorMode": "code",
"expr": "optp2p_gateway_optimum_gateway_opt_peers{gateway_id=\"$gateway\"}",
"hide": false,
"instant": false,
"legendFormat": "mump2p Peers",
"range": true,
"refId": "B"
}
],
"title": "Peers",
"type": "stat"
},
{
"datasource": {
"type": "prometheus",
"uid": "${ds_prometheus}"
},
"description": "Current epoch index in Hoodi (32 slots per epoch).",
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": 0
}
]
}
},
"overrides": []
},
"gridPos": {
"h": 4,
"w": 6,
"x": 12,
"y": 5
},
"id": 12,
"options": {
"colorMode": "none",
"graphMode": "none",
"justifyMode": "auto",
"orientation": "auto",
"percentChangeColorMode": "standard",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"showPercentChange": false,
"textMode": "value_and_name",
"wideLayout": true
},
"pluginVersion": "12.3.1",
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${ds_prometheus}"
},
"editorMode": "code",
"expr": "floor(vector((time() - 1742213400) / (12 * 32)))",
"instant": true,
"legendFormat": "Epoch",
"range": false,
"refId": "A"
}
],
"title": "Hoodi epoch",
"type": "stat"
},
{
"collapsed": false,
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 9
},
"id": 200,
"panels": [],
"title": "Gateway Performance (${gateway})",
"type": "row"
},
{
"datasource": {
"type": "prometheus",
"uid": "${ds_prometheus}"
},
"description": "Median block arrival time via mump2p from slot start for this gateway (lower is better). Median over last ~25 slots (5m window), not a single slot.",
"fieldConfig": {
"defaults": {
"color": {
"fixedColor": "white",
"mode": "fixed"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "white",
"value": null
}
]
},
"unit": "ms"
},
"overrides": []
},
"gridPos": {
"h": 8,
"w": 6,
"x": 0,
"y": 10
},
"id": 203,
"options": {
"colorMode": "value",
"graphMode": "area",
"justifyMode": "auto",
"orientation": "auto",
"percentChangeColorMode": "standard",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"showPercentChange": false,
"textMode": "value_and_name",
"wideLayout": true
},
"pluginVersion": "12.3.1",
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${ds_prometheus}"
},
"editorMode": "code",
"expr": "histogram_quantile(0.5, sum by(le) (rate(optp2p_gateway_optimum_gateway_block_arrival_mump2p_ms_bucket{gateway_id=\"$gateway\"}[5m])))",
"instant": true,
"legendFormat": "mump2p",
"range": false,
"refId": "A"
},
{
"datasource": {
"type": "prometheus",
"uid": "${ds_prometheus}"
},
"expr": "",
"hide": false,
"instant": false,
"range": true,
"refId": "B"
}
],
"title": "arrival via mump2p (median)",
"type": "stat"
},
{
"datasource": {
"type": "prometheus",
"uid": "${ds_prometheus}"
},
"description": "Median block arrival time via mump2p from slot start for this gateway over time. Only mump2p is shown (slots where we have a mump2p measurement). Aggregated over 5m.",
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"custom": {
"axisBorderShow": false,
"axisCenteredZero": false,
"axisColorMode": "text",
"axisLabel": "Arrival time (ms)",
"axisPlacement": "auto",
"barAlignment": 0,
"barWidthFactor": 0.6,
"drawStyle": "line",
"fillOpacity": 15,
"gradientMode": "none",
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"insertNulls": false,
"lineInterpolation": "smooth",
"lineWidth": 2,
"pointSize": 5,
"scaleDistribution": {
"type": "linear"
},
"showPoints": "auto",
"showValues": false,
"spanNulls": false,
"stacking": {
"group": "A",
"mode": "none"
},
"thresholdsStyle": {
"mode": "off"
}
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": 0
}
]
},
"unit": "ms"
},
"overrides": [
{
"matcher": {
"id": "byName",
"options": "mump2p"
},
"properties": [
{
"id": "color",
"value": {
"fixedColor": "green",
"mode": "fixed"
}
}
]
}
]
},
"gridPos": {
"h": 8,
"w": 18,
"x": 6,
"y": 10
},
"id": 206,
"interval": "30s",
"options": {
"legend": {
"calcs": [
"mean",
"lastNotNull"
],
"displayMode": "table",
"placement": "bottom",
"showLegend": true
},
"tooltip": {
"hideZeros": false,
"mode": "multi",
"sort": "none"
}
},
"pluginVersion": "12.3.1",
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${ds_prometheus}"
},
"editorMode": "code",
"expr": "histogram_quantile(0.5, sum by(le) (rate(optp2p_gateway_optimum_gateway_block_arrival_mump2p_ms_bucket{gateway_id=\"$gateway\"}[$prom_interval])))",
"legendFormat": "mump2p",
"range": true,
"refId": "A"
}
],
"title": "mump2p arrival over time (median)",
"type": "timeseries"
},
{
"datasource": {
"type": "prometheus",
"uid": "${ds_prometheus}"
},
"description": "Percentage of slots where mump2p saw the block strictly before libp2p for this gateway. Equal timestamps are not counted as accelerated.",
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "text",
"value": 0
}
]
},
"unit": "percent"
},
"overrides": []
},
"gridPos": {
"h": 8,
"w": 6,
"x": 0,
"y": 18
},
"id": 307,
"options": {
"colorMode": "value",
"graphMode": "none",
"justifyMode": "auto",
"orientation": "auto",
"percentChangeColorMode": "standard",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"showPercentChange": false,
"textMode": "value",
"wideLayout": true
},
"pluginVersion": "12.3.1",
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${ds_prometheus}"
},
"editorMode": "code",
"expr": "sum(rate(optp2p_gateway_optimum_gateway_blocks_first_seen_mump2p_total{gateway_id=\"$gateway\"}[$prom_interval]))\n/\n(\n sum(rate(optp2p_gateway_optimum_gateway_blocks_first_seen_mump2p_total{gateway_id=\"$gateway\"}[$prom_interval]))\n +\n sum(rate(optp2p_gateway_optimum_gateway_blocks_first_seen_libp2p_total{gateway_id=\"$gateway\"}[$prom_interval]))\n) * 100",
"instant": true,
"legendFormat": "mump2p first",
"range": false,
"refId": "A"
},
{
"datasource": {
"type": "prometheus",
"uid": "${ds_prometheus}"
},
"editorMode": "code",
"expr": "sum(rate(optp2p_gateway_optimum_gateway_blocks_first_seen_libp2p_total{gateway_id=\"$gateway\"}[$prom_interval]))\n/\n(\n sum(rate(optp2p_gateway_optimum_gateway_blocks_first_seen_mump2p_total{gateway_id=\"$gateway\"}[$prom_interval]))\n +\n sum(rate(optp2p_gateway_optimum_gateway_blocks_first_seen_libp2p_total{gateway_id=\"$gateway\"}[$prom_interval]))\n) * 100",
"hide": true,
"instant": true,
"legendFormat": "libp2p first",
"range": false,
"refId": "B"
}
],
"title": "Accelerated slots (last 5m)",
"type": "stat"
},
{
"datasource": {
"type": "prometheus",
"uid": "${ds_prometheus}"
},
"description": "Percentage of slots where mump2p was strictly faster than libp2p over time for this gateway. Greener = higher share. Equal timestamps are not accelerated.",
"fieldConfig": {
"defaults": {
"custom": {
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"scaleDistribution": {
"type": "linear"
}
},
"unit": "percent"
},
"overrides": [
{
"matcher": {
"id": "byName",
"options": "mump2p first"
},
"properties": []
},
{
"matcher": {
"id": "byName",
"options": "libp2p first"
},
"properties": []
}
]
},
"gridPos": {
"h": 8,
"w": 18,
"x": 6,
"y": 18
},
"id": 304,
"interval": "30s",
"options": {
"calculate": false,
"cellGap": 1,
"color": {
"exponent": 0.5,
"fill": "dark-orange",
"max": 100,
"min": 0,
"mode": "scheme",
"reverse": true,
"scale": "exponential",
"scheme": "Greens",
"steps": 64
},
"exemplars": {
"color": "rgba(255,0,255,0.7)"
},
"filterValues": {
"le": 1e-09
},
"legend": {
"show": true
},
"rowsFrame": {
"layout": "auto"
},
"tooltip": {
"mode": "single",
"showColorScale": false,
"yHistogram": false
},
"yAxis": {
"axisPlacement": "left",
"reverse": false
}
},
"pluginVersion": "12.3.1",
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${ds_prometheus}"
},
"editorMode": "code",
"expr": "100 * sum (rate(optp2p_gateway_optimum_gateway_blocks_first_seen_mump2p_total{gateway_id=\"$gateway\"}[5m])) / (sum(rate(optp2p_gateway_optimum_gateway_blocks_first_seen_mump2p_total{gateway_id=\"$gateway\"}[5m])) + sum(rate(optp2p_gateway_optimum_gateway_blocks_first_seen_libp2p_total{gateway_id=\"$gateway\"}[5m])))",
"legendFormat": "mump2p boost",
"range": true,
"refId": "A"
},
{
"datasource": {
"type": "prometheus",
"uid": "${ds_prometheus}"
},
"editorMode": "code",
"expr": "100 * sum(rate(optp2p_gateway_optimum_gateway_blocks_first_seen_libp2p_total{gateway_id=\"$gateway\"}[5m])) / (sum(rate(optp2p_gateway_optimum_gateway_blocks_first_seen_mump2p_total{gateway_id=\"$gateway\"}[5m])) + sum(rate(optp2p_gateway_optimum_gateway_blocks_first_seen_libp2p_total{gateway_id=\"$gateway\"}[5m])))",
"hide": true,
"legendFormat": "libp2p first",
"range": true,
"refId": "B"
}
],
"title": "Accelerated slots over time",
"type": "heatmap"
}
],
"preload": false,
"refresh": "5s",
"schemaVersion": 42,
"tags": [
"optimum",
"partner",
"v0.0.1-rc11"
],
"templating": {
"list": [
{
"current": {},
"includeAll": false,
"label": "Prometheus",
"name": "ds_prometheus",
"options": [],
"query": "prometheus",
"refresh": 1,
"regex": "",
"type": "datasource",
"hide": 0
},
{
"current": {},
"datasource": {
"type": "prometheus",
"uid": "${ds_prometheus}"
},
"definition": "label_values(optp2p_gateway_optimum_gateway_block_arrival_mump2p_ms_bucket, gateway_id)",
"includeAll": false,
"label": "Gateway",
"name": "gateway",
"options": [],
"query": {
"qryType": 1,
"query": "label_values(optp2p_gateway_optimum_gateway_block_arrival_mump2p_ms_bucket, gateway_id)",
"refId": "PrometheusVariableQueryEditor-VariableQuery"
},
"refresh": 2,
"regex": "",
"sort": 1,
"type": "query"
},
{
"current": {
"text": "5m",
"value": "5m"
},
"hide": 2,
"label": "Prometheus Interval",
"name": "prom_interval",
"query": "5m",
"skipUrlSync": true,
"type": "constant"
}
]
},
"time": {
"from": "now-15m",
"to": "now"
},
"timepicker": {},
"timezone": "browser",
"title": "Optimum Gateway - Partner Dashboard (v0.0.1-rc11)",
"uid": "partner-gateway-rc11"
}Step 6: Start the Stack
docker compose up -dVerify:
docker compose psYou should see both prometheus and grafana with status Up.
Step 7: Access Grafana
- Open
http://localhost:3000 - Login:
admin/admin(skip password change) - Go to Dashboards > Default > Optimum Gateway - Partner Dashboard (v0.0.1-rc11)
The dashboard auto-selects your Prometheus datasource and discovers gateway(s) via the gateway_id label.
Dashboard Panels
The Partner Dashboard includes the following sections:
Gateway Info
- Status - ON/OFF based on CL + mump2p peer connectivity
- CL Peers / mump2p Peers - current peer counts
- Hoodi Slot - live slot number from Hoodi genesis
- Hoodi Epoch - epoch index (32 slots per epoch)
- Build Info - version, commit, Go, public IP
Gateway Performance
- Arrival via mump2p (median) - median block arrival time via mump2p from slot start
- mump2p arrival over time (median) - arrival time trend for this gateway
- Accelerated slots - percentage of slots where mump2p delivered the block strictly before libp2p
- Accelerated slots over time - heatmap of accelerated slot percentage over time (greener = higher)
Prometheus Queries (Quick Reference)
All queries use gateway-local metrics from the /metrics endpoint.
| What | PromQL |
|---|---|
| CL peers | optp2p_gateway_optimum_gateway_cl_peers{gateway_id="$gateway"} |
| mump2p peers | optp2p_gateway_optimum_gateway_opt_peers{gateway_id="$gateway"} |
| Block arrival p50 via mump2p | histogram_quantile(0.50, sum by(le) (rate(optp2p_gateway_optimum_gateway_block_arrival_mump2p_ms_bucket{gateway_id="$gateway"}[5m]))) |
| Block arrival p50 via libp2p | histogram_quantile(0.50, sum by(le) (rate(optp2p_gateway_optimum_gateway_block_arrival_libp2p_ms_bucket{gateway_id="$gateway"}[5m]))) |
| Accelerated slots % | rate(optp2p_gateway_optimum_gateway_blocks_first_seen_mump2p_total{gateway_id="$gateway"}[5m]) / (rate(optp2p_gateway_optimum_gateway_blocks_first_seen_mump2p_total{gateway_id="$gateway"}[5m]) + rate(optp2p_gateway_optimum_gateway_blocks_first_seen_libp2p_total{gateway_id="$gateway"}[5m])) * 100 |
| Blocks first seen via mump2p | rate(optp2p_gateway_optimum_gateway_blocks_first_seen_mump2p_total{gateway_id="$gateway"}[5m]) |
| Blocks first seen via libp2p | rate(optp2p_gateway_optimum_gateway_blocks_first_seen_libp2p_total{gateway_id="$gateway"}[5m]) |
Stopping the Stack
docker compose down # stop, keep data
docker compose down -v # stop, delete all dataReferences
- Metrics Reference - metric names and types
- Metrics Methodology - why and how we measure
- Configuration - gateway settings
- Troubleshooting - fixing dashboard / gateway issues

