Skip to content

Telemetry & Monitoring

Prerequisites: Quick Start with telemetry_enable: true.

Endpoints

EndpointDescription
http://localhost:48123/metricsPrometheus metrics
http://localhost:48123/api/v1/self_infoGateway identity and peer info for CL client connection
http://localhost:48123/api/v1/versionVersion and commit

Version endpointGET /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):

json
{
  "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

bash
mkdir -p optimum-monitoring/{prometheus,grafana-provisioning/datasources,grafana-provisioning/dashboards,grafana-dashboards}
cd optimum-monitoring

Your final structure:

text
optimum-monitoring/
├── docker-compose.yml
├── prometheus/
│   ├── prometheus.yml
│   └── targets.json
├── grafana-provisioning/
│   ├── datasources/
│   │   └── prometheus.yaml
│   └── dashboards/
│       └── dashboards.yml
└── grafana-dashboards/
    └── partner-dashboard.json

Step 2: Docker Compose

Create docker-compose.yml:

yaml
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:

yaml
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'gateway'
    file_sd_configs:
      - files:
          - /etc/prometheus/targets.json

Create prometheus/targets.json (choose your platform):

Docker Desktop (macOS / Windows):

json
[
  {
    "targets": ["host.docker.internal:48123"],
    "labels": { "job": "gateway" }
  }
]

Linux Docker:

json
[
  {
    "targets": ["172.17.0.1:48123"],
    "labels": { "job": "gateway" }
  }
]

Host networking:

json
[
  {
    "targets": ["localhost:48123"],
    "labels": { "job": "gateway" }
  }
]

Step 4: Grafana Provisioning

Create grafana-provisioning/datasources/prometheus.yaml:

yaml
apiVersion: 1

datasources:
  - name: Prometheus
    type: prometheus
    url: http://prometheus:9090
    access: proxy
    isDefault: true

Create grafana-provisioning/dashboards/dashboards.yml:

yaml
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: true

Step 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)
json
{
  "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

bash
docker compose up -d

Verify:

bash
docker compose ps

You should see both prometheus and grafana with status Up.

Step 7: Access Grafana

  1. Open http://localhost:3000
  2. Login: admin / admin (skip password change)
  3. 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.

WhatPromQL
CL peersoptp2p_gateway_optimum_gateway_cl_peers{gateway_id="$gateway"}
mump2p peersoptp2p_gateway_optimum_gateway_opt_peers{gateway_id="$gateway"}
Block arrival p50 via mump2phistogram_quantile(0.50, sum by(le) (rate(optp2p_gateway_optimum_gateway_block_arrival_mump2p_ms_bucket{gateway_id="$gateway"}[5m])))
Block arrival p50 via libp2phistogram_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 mump2prate(optp2p_gateway_optimum_gateway_blocks_first_seen_mump2p_total{gateway_id="$gateway"}[5m])
Blocks first seen via libp2prate(optp2p_gateway_optimum_gateway_blocks_first_seen_libp2p_total{gateway_id="$gateway"}[5m])

Stopping the Stack

bash
docker compose down        # stop, keep data
docker compose down -v     # stop, delete all data

References