{ "annotations": {"list": [{"builtIn": 1,"datasource": {"type": "datasource","uid": "grafana"},"enable": true,"hide": true,"iconColor": "rgba(0, 211, 255, 1)","name": "Annotations & Alerts","type": "dashboard"}]}, "description": "Geographic view of the routes in the RIB — prefixes and origin ASes plotted by IP-geolocation (geo_ip). Shows the injected real-IP prefixes, not the lab fabric (lab routers use 10.x loopbacks that do not geolocate — see the BGP/IGP node-graph maps for the fabric). Manual refresh — the geo_ip containment join is heavy.", "editable": true, "fiscalYearStartMonth": 0, "graphTooltip": 0, "id": null, "links": [{"asDropdown": true,"icon": "external link","includeVars": true,"keepTime": true,"tags": ["obmp-nav"],"title": "OBMP Dashboards","type": "dashboards"}], "liveNow": false, "panels": [ { "datasource": {"type": "postgres","uid": "obmp_postgres"}, "gridPos": {"h": 4,"w": 24,"x": 0,"y": 0}, "id": 10, "options": {"code": {"language": "plaintext","showLineNumbers": false,"showMiniMap": false},"content": "## Geographic Prefix & Origin-AS Map\n\nThese maps plot RIB routes by **IP geolocation** (`geo_ip`). The CML lab routers use `10.x` loopback addressing, which does **not** geolocate — so this dashboard visualises the **injected real-IP prefixes** and their **origin ASes**, not the lab fabric itself. For the lab topology see **BGP Peer Map** and **IGP / Link-State Topology Map**.\n\nQueries are bounded by the **Sample size** variable and run on **manual refresh** only — the `geo_ip` containment join scans ~20M rows.","mode": "markdown"}, "pluginVersion": "9.1.7", "title": "", "type": "text" }, { "datasource": {"type": "postgres","uid": "obmp_postgres"}, "description": "Each marker is a RIB prefix placed at the location of a covering geo_ip block. Bounded by the Sample size variable.", "fieldConfig": {"defaults": {"color": {"mode": "continuous-GrYlRd"},"custom": {"hideFrom": {"legend": false,"tooltip": false,"viz": false}}},"overrides": []}, "gridPos": {"h": 16,"w": 12,"x": 0,"y": 4}, "id": 1, "options": { "basemap": {"config": {},"name": "Layer 0","type": "default"}, "controls": {"mouseWheelZoom": true,"showAttribution": true,"showDebug": false,"showMeasure": false,"showScale": false,"showZoom": true}, "layers": [{"config": {"showLegend": false,"style": {"color": {"fixed": "blue"},"opacity": 0.4,"size": {"fixed": 4},"symbol": {"fixed": "img/icons/marker/circle.svg","mode": "fixed"}}},"location": {"latitude": "latitude","longitude": "longitude","mode": "coords"},"name": "Prefixes","tooltip": true,"type": "markers"}], "tooltip": {"mode": "details"}, "view": {"id": "zero","lat": 25,"lon": 0,"zoom": 2} }, "pluginVersion": "9.1.7", "targets": [ { "datasource": {"type": "postgres","uid": "obmp_postgres"}, "format": "table", "rawSql": "WITH p AS (\n SELECT DISTINCT prefix FROM ip_rib\n WHERE iswithdrawn = false AND isipv4 = true AND family(prefix) = 4\n AND NOT (prefix << '10.0.0.0/8')\n LIMIT $sample_limit\n)\nSELECT host(p.prefix) AS prefix, g.latitude, g.longitude\nFROM p CROSS JOIN LATERAL (\n SELECT latitude, longitude FROM geo_ip WHERE ip >>= p.prefix LIMIT 1\n) g", "refId": "A" } ], "title": "RIB Prefix Geolocation", "type": "geomap" }, { "datasource": {"type": "postgres","uid": "obmp_postgres"}, "description": "One marker per origin AS, placed at the geolocation of one of its prefixes and enriched with whois name.", "fieldConfig": {"defaults": {"color": {"mode": "continuous-BlPu"},"custom": {"hideFrom": {"legend": false,"tooltip": false,"viz": false}}},"overrides": []}, "gridPos": {"h": 16,"w": 12,"x": 12,"y": 4}, "id": 2, "options": { "basemap": {"config": {},"name": "Layer 0","type": "default"}, "controls": {"mouseWheelZoom": true,"showAttribution": true,"showDebug": false,"showMeasure": false,"showScale": false,"showZoom": true}, "layers": [{"config": {"showLegend": false,"style": {"color": {"fixed": "orange"},"opacity": 0.6,"size": {"fixed": 6},"symbol": {"fixed": "img/icons/marker/circle.svg","mode": "fixed"}}},"location": {"latitude": "latitude","longitude": "longitude","mode": "coords"},"name": "Origin ASes","tooltip": true,"type": "markers"}], "tooltip": {"mode": "details"}, "view": {"id": "zero","lat": 25,"lon": 0,"zoom": 2} }, "pluginVersion": "9.1.7", "targets": [ { "datasource": {"type": "postgres","uid": "obmp_postgres"}, "format": "table", "rawSql": "WITH oa AS (\n SELECT origin_as, MIN(prefix) AS prefix\n FROM ip_rib\n WHERE iswithdrawn = false AND isipv4 = true AND family(prefix) = 4\n AND NOT (prefix << '10.0.0.0/8') AND origin_as IS NOT NULL\n GROUP BY origin_as\n)\nSELECT 'AS' || oa.origin_as AS \"AS\",\n COALESCE(NULLIF(ia.as_name,''),'AS'||oa.origin_as) AS as_name,\n g.latitude, g.longitude\nFROM oa\nLEFT JOIN info_asn ia ON ia.asn = oa.origin_as\nCROSS JOIN LATERAL (\n SELECT latitude, longitude FROM geo_ip WHERE ip >>= oa.prefix LIMIT 1\n) g", "refId": "A" } ], "title": "Origin-AS Geographic Distribution", "type": "geomap" }, { "datasource": {"type": "postgres","uid": "obmp_postgres"}, "description": "Origin ASes grouped by whois country. ASes with no whois enrichment show as (unknown). Fast — no geo_ip join.", "fieldConfig": {"defaults": {"custom": {"align": "auto","displayMode": "auto"}},"overrides": [{"matcher": {"id": "byName","options": "Origin ASes"},"properties": [{"id": "custom.displayMode","value": "gradient-gauge"},{"id": "color","value": {"mode": "continuous-BlPu"}}]}]}, "gridPos": {"h": 10,"w": 24,"x": 0,"y": 20}, "id": 3, "options": {"showHeader": true,"sortBy": [{"desc": true,"displayName": "Origin ASes"}]}, "targets": [ { "datasource": {"type": "postgres","uid": "obmp_postgres"}, "format": "table", "rawSql": "SELECT COALESCE(NULLIF(ia.country,''),'(unknown)') AS \"Country\",\n COUNT(DISTINCT r.origin_as) AS \"Origin ASes\"\nFROM (SELECT DISTINCT origin_as FROM ip_rib WHERE iswithdrawn = false AND origin_as IS NOT NULL) r\nLEFT JOIN info_asn ia ON ia.asn = r.origin_as\nGROUP BY 1\nORDER BY 2 DESC", "refId": "A" } ], "title": "Origin-AS by Country", "type": "table" } ], "schemaVersion": 36, "style": "dark", "tags": ["obmp", "obmp-nav", "obmp-maps", "geo"], "templating": { "list": [ {"name": "sample_limit","type": "custom","label": "Sample size","description": "Number of distinct prefixes to geolocate on the RIB Prefix map. Larger = slower (the geo_ip join scans ~20M rows).","query": "2000,5000,10000","current": {"text": "2000","value": "2000"},"options": [{"text": "2000","value": "2000","selected": true},{"text": "5000","value": "5000","selected": false},{"text": "10000","value": "10000","selected": false}],"hide": 0} ] }, "time": {"from": "now-6h","to": "now"}, "timepicker": {}, "timezone": "", "title": "Geographic Prefix Map", "uid": "geo-prefix-map", "version": 1, "weekStart": "" }