Add ExaBGP route injector, Grafana dashboards, and full documentation
- Add exabgp/ container: ExaBGP 5.x + Flask REST API for on-demand BGP
route injection into CML IOS-XR lab (AS 65020 via eBGP from AS 65100)
- Add 6 injection scenarios: internet_sample, churn, blackhole, anycast,
full_table, lab_prefixes
- Add inject.py CLI wrapper for the ExaBGP API
- Add iosxr_bgp_config.md with IOS-XR neighbor config and NETCONF script
- Add obmp-grafana/ dashboards and provisioning (17 dashboards)
- Update docker-compose.yml: add exabgp service, fix Kafka external
listener IP, extend log retention from 90min to 720min
- Add DOCS.md: full project documentation including architecture, setup,
user guide, sanity checks, troubleshooting, and command reference
- Update .gitignore: exclude .env and .claude/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 14:46:37 -07:00
{
"annotations" : {
"list" : [
{
"builtIn" : 1 ,
"datasource" : {
"type" : "datasource" ,
"uid" : "grafana"
} ,
"enable" : true ,
"hide" : true ,
"iconColor" : "rgba(0, 211, 255, 1)" ,
"name" : "Annotations & Alerts" ,
"target" : {
"limit" : 100 ,
"matchAny" : false ,
"tags" : [ ] ,
"type" : "dashboard"
} ,
"type" : "dashboard"
}
]
} ,
2026-05-18 20:55:03 -07:00
"description" : "L3VPN RIB browser combined with the per-prefix Looking Glass: route counts by RD, prefix visibility, geolocation and ASN ownership." ,
Add ExaBGP route injector, Grafana dashboards, and full documentation
- Add exabgp/ container: ExaBGP 5.x + Flask REST API for on-demand BGP
route injection into CML IOS-XR lab (AS 65020 via eBGP from AS 65100)
- Add 6 injection scenarios: internet_sample, churn, blackhole, anycast,
full_table, lab_prefixes
- Add inject.py CLI wrapper for the ExaBGP API
- Add iosxr_bgp_config.md with IOS-XR neighbor config and NETCONF script
- Add obmp-grafana/ dashboards and provisioning (17 dashboards)
- Update docker-compose.yml: add exabgp service, fix Kafka external
listener IP, extend log retention from 90min to 720min
- Add DOCS.md: full project documentation including architecture, setup,
user guide, sanity checks, troubleshooting, and command reference
- Update .gitignore: exclude .env and .claude/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 14:46:37 -07:00
"editable" : true ,
"fiscalYearStartMonth" : 0 ,
"graphTooltip" : 0 ,
"id" : 21 ,
2026-05-18 20:55:03 -07:00
"links" : [
{
"asDropdown" : true ,
"icon" : "external link" ,
"includeVars" : true ,
"keepTime" : true ,
"tags" : [
"obmp-nav"
] ,
"title" : "OBMP Dashboards" ,
"type" : "dashboards"
}
] ,
Add ExaBGP route injector, Grafana dashboards, and full documentation
- Add exabgp/ container: ExaBGP 5.x + Flask REST API for on-demand BGP
route injection into CML IOS-XR lab (AS 65020 via eBGP from AS 65100)
- Add 6 injection scenarios: internet_sample, churn, blackhole, anycast,
full_table, lab_prefixes
- Add inject.py CLI wrapper for the ExaBGP API
- Add iosxr_bgp_config.md with IOS-XR neighbor config and NETCONF script
- Add obmp-grafana/ dashboards and provisioning (17 dashboards)
- Update docker-compose.yml: add exabgp service, fix Kafka external
listener IP, extend log retention from 90min to 720min
- Add DOCS.md: full project documentation including architecture, setup,
user guide, sanity checks, troubleshooting, and command reference
- Update .gitignore: exclude .env and .claude/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 14:46:37 -07:00
"liveNow" : false ,
"panels" : [
2026-05-18 20:55:03 -07:00
{
"collapsed" : false ,
"gridPos" : {
"h" : 1 ,
"w" : 24 ,
"x" : 0 ,
"y" : 0
} ,
"id" : 20 ,
"panels" : [ ] ,
"title" : "RIB Browser" ,
"type" : "row"
} ,
Add ExaBGP route injector, Grafana dashboards, and full documentation
- Add exabgp/ container: ExaBGP 5.x + Flask REST API for on-demand BGP
route injection into CML IOS-XR lab (AS 65020 via eBGP from AS 65100)
- Add 6 injection scenarios: internet_sample, churn, blackhole, anycast,
full_table, lab_prefixes
- Add inject.py CLI wrapper for the ExaBGP API
- Add iosxr_bgp_config.md with IOS-XR neighbor config and NETCONF script
- Add obmp-grafana/ dashboards and provisioning (17 dashboards)
- Update docker-compose.yml: add exabgp service, fix Kafka external
listener IP, extend log retention from 90min to 720min
- Add DOCS.md: full project documentation including architecture, setup,
user guide, sanity checks, troubleshooting, and command reference
- Update .gitignore: exclude .env and .claude/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 14:46:37 -07:00
{
"datasource" : {
"type" : "postgres" ,
"uid" : "obmp_postgres"
} ,
"description" : "" ,
"fieldConfig" : {
"defaults" : {
"color" : {
"mode" : "thresholds"
} ,
"custom" : {
"axisLabel" : "" ,
"axisPlacement" : "auto" ,
"axisSoftMin" : 0 ,
"fillOpacity" : 80 ,
"gradientMode" : "none" ,
"hideFrom" : {
"legend" : false ,
"tooltip" : false ,
"viz" : false
} ,
"lineWidth" : 1 ,
"scaleDistribution" : {
"type" : "linear"
}
} ,
"decimals" : 0 ,
"displayName" : "Routes" ,
"mappings" : [ ] ,
"thresholds" : {
"mode" : "absolute" ,
"steps" : [
{
"color" : "green" ,
"value" : null
}
]
} ,
"unit" : "none"
} ,
"overrides" : [ ]
} ,
"gridPos" : {
"h" : 8 ,
"w" : 11 ,
"x" : 0 ,
2026-05-18 20:55:03 -07:00
"y" : 1
Add ExaBGP route injector, Grafana dashboards, and full documentation
- Add exabgp/ container: ExaBGP 5.x + Flask REST API for on-demand BGP
route injection into CML IOS-XR lab (AS 65020 via eBGP from AS 65100)
- Add 6 injection scenarios: internet_sample, churn, blackhole, anycast,
full_table, lab_prefixes
- Add inject.py CLI wrapper for the ExaBGP API
- Add iosxr_bgp_config.md with IOS-XR neighbor config and NETCONF script
- Add obmp-grafana/ dashboards and provisioning (17 dashboards)
- Update docker-compose.yml: add exabgp service, fix Kafka external
listener IP, extend log retention from 90min to 720min
- Add DOCS.md: full project documentation including architecture, setup,
user guide, sanity checks, troubleshooting, and command reference
- Update .gitignore: exclude .env and .claude/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 14:46:37 -07:00
} ,
"id" : 5 ,
"options" : {
"barRadius" : 0 ,
"barWidth" : 0.97 ,
"groupWidth" : 0.7 ,
"legend" : {
"calcs" : [
"sum"
] ,
"displayMode" : "table" ,
"placement" : "bottom"
} ,
"orientation" : "auto" ,
"showValue" : "always" ,
"stacking" : "none" ,
"tooltip" : {
"mode" : "single" ,
"sort" : "none"
} ,
"xTickLabelRotation" : 0 ,
"xTickLabelSpacing" : 0
} ,
2026-05-18 20:55:03 -07:00
"pluginVersion" : "9.1.7" ,
Add ExaBGP route injector, Grafana dashboards, and full documentation
- Add exabgp/ container: ExaBGP 5.x + Flask REST API for on-demand BGP
route injection into CML IOS-XR lab (AS 65020 via eBGP from AS 65100)
- Add 6 injection scenarios: internet_sample, churn, blackhole, anycast,
full_table, lab_prefixes
- Add inject.py CLI wrapper for the ExaBGP API
- Add iosxr_bgp_config.md with IOS-XR neighbor config and NETCONF script
- Add obmp-grafana/ dashboards and provisioning (17 dashboards)
- Update docker-compose.yml: add exabgp service, fix Kafka external
listener IP, extend log retention from 90min to 720min
- Add DOCS.md: full project documentation including architecture, setup,
user guide, sanity checks, troubleshooting, and command reference
- Update .gitignore: exclude .env and .claude/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 14:46:37 -07:00
"targets" : [
{
"datasource" : {
"type" : "postgres" ,
"uid" : "obmp_postgres"
} ,
"format" : "table" ,
"rawQuery" : true ,
"rawSql" : "select\n count(*) as count,\n rd\n from l3vpn_rib\n where\n peer_hash_id in ($peer_hash)\n and ('$rd' = '-' or rd = '$rd')\n and iswithdrawn = false\n group by rd\n" ,
2026-05-18 20:55:03 -07:00
"refId" : "A"
Add ExaBGP route injector, Grafana dashboards, and full documentation
- Add exabgp/ container: ExaBGP 5.x + Flask REST API for on-demand BGP
route injection into CML IOS-XR lab (AS 65020 via eBGP from AS 65100)
- Add 6 injection scenarios: internet_sample, churn, blackhole, anycast,
full_table, lab_prefixes
- Add inject.py CLI wrapper for the ExaBGP API
- Add iosxr_bgp_config.md with IOS-XR neighbor config and NETCONF script
- Add obmp-grafana/ dashboards and provisioning (17 dashboards)
- Update docker-compose.yml: add exabgp service, fix Kafka external
listener IP, extend log retention from 90min to 720min
- Add DOCS.md: full project documentation including architecture, setup,
user guide, sanity checks, troubleshooting, and command reference
- Update .gitignore: exclude .env and .claude/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 14:46:37 -07:00
}
] ,
"title" : "Routes Advertised/Active" ,
"type" : "barchart"
} ,
{
"datasource" : {
"type" : "postgres" ,
"uid" : "obmp_postgres"
} ,
"description" : "" ,
"fieldConfig" : {
"defaults" : {
"color" : {
"mode" : "thresholds"
} ,
"custom" : {
"axisLabel" : "" ,
"axisPlacement" : "auto" ,
"axisSoftMin" : 0 ,
"fillOpacity" : 80 ,
"gradientMode" : "none" ,
"hideFrom" : {
"legend" : false ,
"tooltip" : false ,
"viz" : false
} ,
"lineWidth" : 1 ,
"scaleDistribution" : {
"type" : "linear"
}
} ,
"decimals" : 0 ,
"displayName" : "Routes" ,
"mappings" : [ ] ,
"thresholds" : {
"mode" : "absolute" ,
"steps" : [
{
"color" : "semi-dark-orange" ,
"value" : null
}
]
} ,
"unit" : "none"
} ,
"overrides" : [
{
"__systemRef" : "hideSeriesFrom" ,
"matcher" : {
"id" : "byNames" ,
"options" : {
"mode" : "exclude" ,
"names" : [
"count"
] ,
"prefix" : "All except:" ,
"readOnly" : true
}
} ,
"properties" : [
{
"id" : "custom.hideFrom" ,
"value" : {
"legend" : false ,
"tooltip" : false ,
"viz" : true
}
}
]
}
]
} ,
"gridPos" : {
"h" : 8 ,
2026-05-18 20:55:03 -07:00
"w" : 13 ,
Add ExaBGP route injector, Grafana dashboards, and full documentation
- Add exabgp/ container: ExaBGP 5.x + Flask REST API for on-demand BGP
route injection into CML IOS-XR lab (AS 65020 via eBGP from AS 65100)
- Add 6 injection scenarios: internet_sample, churn, blackhole, anycast,
full_table, lab_prefixes
- Add inject.py CLI wrapper for the ExaBGP API
- Add iosxr_bgp_config.md with IOS-XR neighbor config and NETCONF script
- Add obmp-grafana/ dashboards and provisioning (17 dashboards)
- Update docker-compose.yml: add exabgp service, fix Kafka external
listener IP, extend log retention from 90min to 720min
- Add DOCS.md: full project documentation including architecture, setup,
user guide, sanity checks, troubleshooting, and command reference
- Update .gitignore: exclude .env and .claude/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 14:46:37 -07:00
"x" : 11 ,
2026-05-18 20:55:03 -07:00
"y" : 1
Add ExaBGP route injector, Grafana dashboards, and full documentation
- Add exabgp/ container: ExaBGP 5.x + Flask REST API for on-demand BGP
route injection into CML IOS-XR lab (AS 65020 via eBGP from AS 65100)
- Add 6 injection scenarios: internet_sample, churn, blackhole, anycast,
full_table, lab_prefixes
- Add inject.py CLI wrapper for the ExaBGP API
- Add iosxr_bgp_config.md with IOS-XR neighbor config and NETCONF script
- Add obmp-grafana/ dashboards and provisioning (17 dashboards)
- Update docker-compose.yml: add exabgp service, fix Kafka external
listener IP, extend log retention from 90min to 720min
- Add DOCS.md: full project documentation including architecture, setup,
user guide, sanity checks, troubleshooting, and command reference
- Update .gitignore: exclude .env and .claude/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 14:46:37 -07:00
} ,
"id" : 6 ,
"options" : {
"barRadius" : 0 ,
"barWidth" : 0.97 ,
"groupWidth" : 0.7 ,
"legend" : {
"calcs" : [
"sum"
] ,
"displayMode" : "table" ,
"placement" : "bottom"
} ,
"orientation" : "auto" ,
"showValue" : "always" ,
"stacking" : "none" ,
"tooltip" : {
"mode" : "single" ,
"sort" : "none"
} ,
"xTickLabelRotation" : 0 ,
"xTickLabelSpacing" : 0
} ,
2026-05-18 20:55:03 -07:00
"pluginVersion" : "9.1.7" ,
Add ExaBGP route injector, Grafana dashboards, and full documentation
- Add exabgp/ container: ExaBGP 5.x + Flask REST API for on-demand BGP
route injection into CML IOS-XR lab (AS 65020 via eBGP from AS 65100)
- Add 6 injection scenarios: internet_sample, churn, blackhole, anycast,
full_table, lab_prefixes
- Add inject.py CLI wrapper for the ExaBGP API
- Add iosxr_bgp_config.md with IOS-XR neighbor config and NETCONF script
- Add obmp-grafana/ dashboards and provisioning (17 dashboards)
- Update docker-compose.yml: add exabgp service, fix Kafka external
listener IP, extend log retention from 90min to 720min
- Add DOCS.md: full project documentation including architecture, setup,
user guide, sanity checks, troubleshooting, and command reference
- Update .gitignore: exclude .env and .claude/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 14:46:37 -07:00
"targets" : [
{
"datasource" : {
"type" : "postgres" ,
"uid" : "obmp_postgres"
} ,
"format" : "table" ,
"rawQuery" : true ,
"rawSql" : "select\n count(*) as count,\n rd\n from l3vpn_rib\n where\n peer_hash_id in ($peer_hash)\n and ('$rd' = '-' OR rd = '$rd')\n and iswithdrawn = true\n group by rd\n" ,
2026-05-18 20:55:03 -07:00
"refId" : "A"
Add ExaBGP route injector, Grafana dashboards, and full documentation
- Add exabgp/ container: ExaBGP 5.x + Flask REST API for on-demand BGP
route injection into CML IOS-XR lab (AS 65020 via eBGP from AS 65100)
- Add 6 injection scenarios: internet_sample, churn, blackhole, anycast,
full_table, lab_prefixes
- Add inject.py CLI wrapper for the ExaBGP API
- Add iosxr_bgp_config.md with IOS-XR neighbor config and NETCONF script
- Add obmp-grafana/ dashboards and provisioning (17 dashboards)
- Update docker-compose.yml: add exabgp service, fix Kafka external
listener IP, extend log retention from 90min to 720min
- Add DOCS.md: full project documentation including architecture, setup,
user guide, sanity checks, troubleshooting, and command reference
- Update .gitignore: exclude .env and .claude/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 14:46:37 -07:00
}
] ,
"title" : "Routes Withdrawn/Inactive" ,
"type" : "barchart"
} ,
{
"datasource" : {
"type" : "postgres" ,
"uid" : "obmp_postgres"
} ,
"fieldConfig" : {
"defaults" : {
"color" : {
"mode" : "thresholds"
} ,
"custom" : {
"align" : "auto" ,
"displayMode" : "auto" ,
"filterable" : true ,
"inspect" : false
} ,
"decimals" : 0 ,
"displayName" : "" ,
"mappings" : [ ] ,
"thresholds" : {
"mode" : "absolute" ,
"steps" : [
{
"color" : "green" ,
"value" : null
}
]
} ,
"unit" : "locale"
} ,
"overrides" : [
{
"matcher" : {
"id" : "byName" ,
"options" : "lastmodified"
} ,
"properties" : [
{
"id" : "displayName" ,
"value" : "Time"
} ,
{
"id" : "unit" ,
"value" : "time: YYYY-MM-DD HH:mm:ss.SSS"
} ,
{
"id" : "custom.align"
}
]
} ,
{
"matcher" : {
"id" : "byName" ,
"options" : "prefix"
} ,
"properties" : [
{
"id" : "displayName" ,
"value" : "Prefix"
} ,
{
"id" : "unit" ,
"value" : "short"
} ,
{
"id" : "decimals" ,
"value" : 2
} ,
{
"id" : "links" ,
"value" : [
{
"targetBlank" : true ,
"title" : "Prefix History " ,
"url" : "/d/l3vpn-prefix-hist/prefix-history-by-prefix-l3vpn?orgId=1&var-limit=$limit&var-input=${__value.text}&var-rd=$rd"
}
]
} ,
{
"id" : "custom.align"
}
]
} ,
{
"matcher" : {
"id" : "byName" ,
"options" : "origin_as"
} ,
"properties" : [
{
"id" : "displayName" ,
"value" : "Origin"
} ,
{
"id" : "unit" ,
"value" : "none"
} ,
{
"id" : "links" ,
"value" : [
{
"targetBlank" : true ,
"title" : "ASN View" ,
"url" : "/grafana/d/asnview/asn-view?orgId=1&var-asn_num=${__value.text}"
}
]
} ,
{
"id" : "custom.align"
}
]
} ,
{
"matcher" : {
"id" : "byName" ,
"options" : "iswithdrawn"
} ,
"properties" : [
{
"id" : "displayName" ,
"value" : "Withdrawn"
} ,
{
"id" : "unit" ,
"value" : "bool"
} ,
{
"id" : "custom.displayMode" ,
"value" : "color-background-solid"
} ,
{
"id" : "custom.align" ,
"value" : "auto"
} ,
{
"id" : "color" ,
"value" : {
"mode" : "continuous-GrYlRd"
}
}
]
} ,
{
"matcher" : {
"id" : "byName" ,
"options" : "Time"
} ,
"properties" : [
{
"id" : "custom.width" ,
"value" : 194
}
]
}
]
} ,
"gridPos" : {
2026-05-18 20:55:03 -07:00
"h" : 18 ,
Add ExaBGP route injector, Grafana dashboards, and full documentation
- Add exabgp/ container: ExaBGP 5.x + Flask REST API for on-demand BGP
route injection into CML IOS-XR lab (AS 65020 via eBGP from AS 65100)
- Add 6 injection scenarios: internet_sample, churn, blackhole, anycast,
full_table, lab_prefixes
- Add inject.py CLI wrapper for the ExaBGP API
- Add iosxr_bgp_config.md with IOS-XR neighbor config and NETCONF script
- Add obmp-grafana/ dashboards and provisioning (17 dashboards)
- Update docker-compose.yml: add exabgp service, fix Kafka external
listener IP, extend log retention from 90min to 720min
- Add DOCS.md: full project documentation including architecture, setup,
user guide, sanity checks, troubleshooting, and command reference
- Update .gitignore: exclude .env and .claude/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 14:46:37 -07:00
"w" : 24 ,
"x" : 0 ,
2026-05-18 20:55:03 -07:00
"y" : 9
Add ExaBGP route injector, Grafana dashboards, and full documentation
- Add exabgp/ container: ExaBGP 5.x + Flask REST API for on-demand BGP
route injection into CML IOS-XR lab (AS 65020 via eBGP from AS 65100)
- Add 6 injection scenarios: internet_sample, churn, blackhole, anycast,
full_table, lab_prefixes
- Add inject.py CLI wrapper for the ExaBGP API
- Add iosxr_bgp_config.md with IOS-XR neighbor config and NETCONF script
- Add obmp-grafana/ dashboards and provisioning (17 dashboards)
- Update docker-compose.yml: add exabgp service, fix Kafka external
listener IP, extend log retention from 90min to 720min
- Add DOCS.md: full project documentation including architecture, setup,
user guide, sanity checks, troubleshooting, and command reference
- Update .gitignore: exclude .env and .claude/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 14:46:37 -07:00
} ,
"id" : 3 ,
"links" : [ ] ,
"options" : {
"footer" : {
"fields" : "" ,
"reducer" : [
"sum"
] ,
"show" : false
} ,
"showHeader" : true ,
"sortBy" : [ ]
} ,
2026-05-18 20:55:03 -07:00
"pluginVersion" : "9.1.7" ,
Add ExaBGP route injector, Grafana dashboards, and full documentation
- Add exabgp/ container: ExaBGP 5.x + Flask REST API for on-demand BGP
route injection into CML IOS-XR lab (AS 65020 via eBGP from AS 65100)
- Add 6 injection scenarios: internet_sample, churn, blackhole, anycast,
full_table, lab_prefixes
- Add inject.py CLI wrapper for the ExaBGP API
- Add iosxr_bgp_config.md with IOS-XR neighbor config and NETCONF script
- Add obmp-grafana/ dashboards and provisioning (17 dashboards)
- Update docker-compose.yml: add exabgp service, fix Kafka external
listener IP, extend log retention from 90min to 720min
- Add DOCS.md: full project documentation including architecture, setup,
user guide, sanity checks, troubleshooting, and command reference
- Update .gitignore: exclude .env and .claude/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 14:46:37 -07:00
"targets" : [
{
"datasource" : {
"type" : "postgres" ,
"uid" : "obmp_postgres"
} ,
"format" : "table" ,
"rawQuery" : true ,
"rawSql" : "select distinct ip.*, \n \tFIRST_VALUE(geo_ip.city) OVER (PARTITION BY ip.prefix ORDER BY geo_ip.ip DESC) as city,\n \tFIRST_VALUE(geo_ip.stateprov) OVER (PARTITION BY ip.prefix ORDER BY geo_ip.ip DESC) as stateprov,\n \tFIRST_VALUE(geo_ip.country) OVER (PARTITION BY ip.prefix ORDER BY geo_ip.ip DESC) as country,\n ls.local_router_name\n\tFROM (SELECT lastmodified,peername,rd,prefix,\n \tiswithdrawn,origin_as,med,localpref,nh,as_path,communities,extcommunities\n from v_l3vpn_routes\n \t\twhere \n \t\t peer_hash_id in ($peer_hash)\n \t\t AND ('$rd' = '-' OR rd = '$rd')\n \t\t AND (iswithdrawn in ($state))\n \t\tlimit $limit\n \t) ip\n\t\tLEFT JOIN geo_ip on (geo_ip.ip >>= ip.prefix AND geo_ip.ip != '0.0.0.0/0')\n LEFT JOIN v_ls_prefixes ls ON (ls.prefix >>= ip.nh and length(ls.local_router_name) > 0)" ,
2026-05-18 20:55:03 -07:00
"refId" : "A"
}
] ,
"title" : "Looking Glass (RD = $rd)" ,
"transformations" : [
{
"id" : "merge" ,
"options" : {
"reducers" : [ ]
}
}
] ,
"type" : "table"
} ,
{
"collapsed" : false ,
"gridPos" : {
"h" : 1 ,
"w" : 24 ,
"x" : 0 ,
"y" : 27
} ,
"id" : 21 ,
"panels" : [ ] ,
"title" : "Looking Glass - Prefix Lookup ($input)" ,
"type" : "row"
} ,
{
"datasource" : {
"type" : "postgres" ,
"uid" : "obmp_postgres"
} ,
"description" : "Prefix found in router's RIB." ,
"fieldConfig" : {
"defaults" : {
"color" : {
"mode" : "palette-classic"
} ,
"custom" : {
"hideFrom" : {
"legend" : false ,
"tooltip" : false ,
"viz" : false
}
} ,
"decimals" : 0 ,
"mappings" : [ ] ,
"unit" : "none"
} ,
"overrides" : [ ]
} ,
"gridPos" : {
"h" : 8 ,
"w" : 6 ,
"x" : 0 ,
"y" : 28
} ,
"id" : 9 ,
"links" : [ ] ,
"maxDataPoints" : 3 ,
"options" : {
"legend" : {
"calcs" : [ ] ,
"displayMode" : "table" ,
"placement" : "right" ,
"values" : [
"value" ,
"percent"
]
} ,
"pieType" : "pie" ,
"reduceOptions" : {
"calcs" : [
"sum"
] ,
"fields" : "" ,
"values" : false
} ,
"tooltip" : {
"mode" : "single" ,
"sort" : "none"
}
} ,
"pluginVersion" : "9.1.7" ,
"targets" : [
{
"datasource" : {
"type" : "postgres" ,
"uid" : "obmp_postgres"
} ,
"format" : "time_series" ,
"rawQuery" : true ,
"rawSql" : "SELECT\n floor(extract(epoch from max(r.timestamp))) as time,\n CASE WHEN v.router_hash_id is null THEN 'Not in Router RIB' ELSE 'In Router Rib' END as metric,\n 1 as value\nFROM routers r\n left join (select distinct router_hash_id\n from v_l3vpn_routes\n where prefix = '$prefix'\n and ('$rd' = '-' OR rd = '$rd')\n and iswithdrawn = false group by router_hash_id) v \n on (r.hash_id = v.router_hash_id)\nWHERE r.state = 'up'\nGROUP BY r.hash_id,v.router_hash_id\norder by time\n\n" ,
"refId" : "A"
}
] ,
"title" : "Router Visibility" ,
"type" : "piechart"
} ,
{
"datasource" : {
"type" : "postgres" ,
"uid" : "obmp_postgres"
} ,
"description" : "Prefix found in peer RIB's" ,
"fieldConfig" : {
"defaults" : {
"color" : {
"mode" : "palette-classic"
} ,
"custom" : {
"hideFrom" : {
"legend" : false ,
"tooltip" : false ,
"viz" : false
}
} ,
"decimals" : 0 ,
"mappings" : [ ] ,
"unit" : "none"
} ,
"overrides" : [ ]
} ,
"gridPos" : {
"h" : 8 ,
"w" : 6 ,
"x" : 6 ,
"y" : 28
} ,
"id" : 10 ,
"links" : [ ] ,
"maxDataPoints" : 3 ,
"options" : {
"legend" : {
"calcs" : [ ] ,
"displayMode" : "table" ,
"placement" : "right" ,
"values" : [
"value" ,
"percent"
]
} ,
"pieType" : "pie" ,
"reduceOptions" : {
"calcs" : [
"sum"
] ,
"fields" : "" ,
"values" : false
} ,
"tooltip" : {
"mode" : "single" ,
"sort" : "none"
}
} ,
"pluginVersion" : "9.1.7" ,
"targets" : [
{
"datasource" : {
"type" : "postgres" ,
"uid" : "obmp_postgres"
} ,
"format" : "time_series" ,
"rawQuery" : true ,
"rawSql" : "SELECT\n floor(extract(epoch from max(p.timestamp))) as time,\n CASE WHEN v.peer_hash_id is null THEN 'Not in Peers RIB' ELSE 'In Peer RIB' END as metric,\n 1 as value\nFROM bgp_peers p\n left join (select peer_hash_id,isipv4\n from l3vpn_rib \n where prefix = '$prefix' and prefix != '0.0.0.0/0'\n AND ('$rd' = '-' OR rd = '$rd')\n and iswithdrawn = false group by peer_hash_id,isipv4) v \n on (p.hash_id = v.peer_hash_id)\nWHERE p.isipv4 = CASE WHEN family('$prefix') = 4 THEN true ELSE false END\n AND p.state = 'up'\nGROUP BY p.hash_id,v.peer_hash_id,p.isipv4\norder by time\n\n" ,
"refId" : "A"
}
] ,
"title" : "Peer Visibility" ,
"type" : "piechart"
} ,
{
"datasource" : {
"type" : "postgres" ,
"uid" : "obmp_postgres"
} ,
"description" : "Geolocation of the looked-up prefix." ,
"fieldConfig" : {
"defaults" : {
"color" : {
"mode" : "thresholds"
} ,
"custom" : {
"hideFrom" : {
"legend" : false ,
"tooltip" : false ,
"viz" : false
}
} ,
"mappings" : [ ] ,
"thresholds" : {
"mode" : "absolute" ,
"steps" : [
Add ExaBGP route injector, Grafana dashboards, and full documentation
- Add exabgp/ container: ExaBGP 5.x + Flask REST API for on-demand BGP
route injection into CML IOS-XR lab (AS 65020 via eBGP from AS 65100)
- Add 6 injection scenarios: internet_sample, churn, blackhole, anycast,
full_table, lab_prefixes
- Add inject.py CLI wrapper for the ExaBGP API
- Add iosxr_bgp_config.md with IOS-XR neighbor config and NETCONF script
- Add obmp-grafana/ dashboards and provisioning (17 dashboards)
- Update docker-compose.yml: add exabgp service, fix Kafka external
listener IP, extend log retention from 90min to 720min
- Add DOCS.md: full project documentation including architecture, setup,
user guide, sanity checks, troubleshooting, and command reference
- Update .gitignore: exclude .env and .claude/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 14:46:37 -07:00
{
2026-05-18 20:55:03 -07:00
"color" : "green" ,
"value" : null
}
]
}
} ,
"overrides" : [ ]
} ,
"gridPos" : {
"h" : 8 ,
"w" : 12 ,
"x" : 12 ,
"y" : 28
} ,
"id" : 17 ,
"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" : "dark-orange"
} ,
"opacity" : 0.4 ,
"rotation" : {
"fixed" : 0 ,
"max" : 360 ,
"min" : -360 ,
"mode" : "mod"
} ,
"size" : {
"fixed" : 8 ,
"max" : 15 ,
"min" : 2
} ,
"symbol" : {
"fixed" : "img/icons/marker/circle.svg" ,
"mode" : "fixed"
} ,
"textConfig" : {
"fontSize" : 12 ,
"offsetX" : 0 ,
"offsetY" : 0 ,
"textAlign" : "center" ,
"textBaseline" : "middle"
}
}
} ,
"location" : {
"latitude" : "latitude" ,
"longitude" : "longitude" ,
"mode" : "coords"
} ,
"name" : "Prefix Location" ,
"tooltip" : true ,
"type" : "markers"
}
] ,
"tooltip" : {
"mode" : "details"
} ,
"view" : {
"id" : "zero" ,
"lat" : 0 ,
"lon" : 0 ,
"zoom" : 1
}
} ,
"pluginVersion" : "9.1.7" ,
"targets" : [
{
"datasource" : {
"type" : "postgres" ,
"uid" : "obmp_postgres"
} ,
"format" : "table" ,
"rawQuery" : true ,
"rawSql" : "SELECT\n 10 as value, latitude, longitude, stateprov as name\nFROM geo_ip\nWHERE\n ip && '$input'\nORDER BY ip desc limit 1" ,
"refId" : "A"
}
] ,
"title" : "Prefix Location" ,
"type" : "geomap"
} ,
{
"datasource" : {
"type" : "postgres" ,
"uid" : "obmp_postgres"
} ,
"description" : "Origin-AS ownership for the looked-up prefix." ,
"fieldConfig" : {
"defaults" : {
"color" : {
"mode" : "thresholds"
} ,
"custom" : {
"align" : "auto" ,
"displayMode" : "auto" ,
"filterable" : true ,
"inspect" : false
} ,
"mappings" : [ ] ,
"thresholds" : {
"mode" : "absolute" ,
"steps" : [
{
"color" : "green" ,
"value" : null
Add ExaBGP route injector, Grafana dashboards, and full documentation
- Add exabgp/ container: ExaBGP 5.x + Flask REST API for on-demand BGP
route injection into CML IOS-XR lab (AS 65020 via eBGP from AS 65100)
- Add 6 injection scenarios: internet_sample, churn, blackhole, anycast,
full_table, lab_prefixes
- Add inject.py CLI wrapper for the ExaBGP API
- Add iosxr_bgp_config.md with IOS-XR neighbor config and NETCONF script
- Add obmp-grafana/ dashboards and provisioning (17 dashboards)
- Update docker-compose.yml: add exabgp service, fix Kafka external
listener IP, extend log retention from 90min to 720min
- Add DOCS.md: full project documentation including architecture, setup,
user guide, sanity checks, troubleshooting, and command reference
- Update .gitignore: exclude .env and .claude/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 14:46:37 -07:00
}
]
2026-05-18 20:55:03 -07:00
} ,
"unit" : "none"
} ,
"overrides" : [ ]
} ,
"gridPos" : {
"h" : 6 ,
"w" : 24 ,
"x" : 0 ,
"y" : 36
} ,
"id" : 12 ,
"links" : [ ] ,
"options" : {
"footer" : {
"fields" : "" ,
"reducer" : [
"sum"
Add ExaBGP route injector, Grafana dashboards, and full documentation
- Add exabgp/ container: ExaBGP 5.x + Flask REST API for on-demand BGP
route injection into CML IOS-XR lab (AS 65020 via eBGP from AS 65100)
- Add 6 injection scenarios: internet_sample, churn, blackhole, anycast,
full_table, lab_prefixes
- Add inject.py CLI wrapper for the ExaBGP API
- Add iosxr_bgp_config.md with IOS-XR neighbor config and NETCONF script
- Add obmp-grafana/ dashboards and provisioning (17 dashboards)
- Update docker-compose.yml: add exabgp service, fix Kafka external
listener IP, extend log retention from 90min to 720min
- Add DOCS.md: full project documentation including architecture, setup,
user guide, sanity checks, troubleshooting, and command reference
- Update .gitignore: exclude .env and .claude/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 14:46:37 -07:00
] ,
2026-05-18 20:55:03 -07:00
"show" : false
} ,
"showHeader" : true
} ,
"pluginVersion" : "9.1.7" ,
"targets" : [
{
"datasource" : {
"type" : "postgres" ,
"uid" : "obmp_postgres"
} ,
"format" : "table" ,
"rawQuery" : true ,
"rawSql" : "select distinct origin_as,i.as_name,org_id,org_name,remarks,address,city,state_prov,country,raw_output,source\n from l3vpn_rib r LEFT JOIN info_asn i ON (i.asn = r.origin_as)\n where r.prefix = '$prefix'\n and ('$rd' = '-' OR rd = '$rd')\n and origin_as > 0\n" ,
"refId" : "A"
Add ExaBGP route injector, Grafana dashboards, and full documentation
- Add exabgp/ container: ExaBGP 5.x + Flask REST API for on-demand BGP
route injection into CML IOS-XR lab (AS 65020 via eBGP from AS 65100)
- Add 6 injection scenarios: internet_sample, churn, blackhole, anycast,
full_table, lab_prefixes
- Add inject.py CLI wrapper for the ExaBGP API
- Add iosxr_bgp_config.md with IOS-XR neighbor config and NETCONF script
- Add obmp-grafana/ dashboards and provisioning (17 dashboards)
- Update docker-compose.yml: add exabgp service, fix Kafka external
listener IP, extend log retention from 90min to 720min
- Add DOCS.md: full project documentation including architecture, setup,
user guide, sanity checks, troubleshooting, and command reference
- Update .gitignore: exclude .env and .claude/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 14:46:37 -07:00
}
] ,
2026-05-18 20:55:03 -07:00
"title" : "ASN Info" ,
"type" : "table"
} ,
{
"datasource" : {
"type" : "postgres" ,
"uid" : "obmp_postgres"
} ,
"fieldConfig" : {
"defaults" : {
"color" : {
"mode" : "thresholds"
} ,
"custom" : {
"align" : "auto" ,
"displayMode" : "auto" ,
"filterable" : true ,
"inspect" : false
} ,
"decimals" : 0 ,
"displayName" : "" ,
"mappings" : [ ] ,
"thresholds" : {
"mode" : "absolute" ,
"steps" : [
{
"color" : "green" ,
"value" : null
}
]
} ,
"unit" : "locale"
} ,
"overrides" : [
{
"matcher" : {
"id" : "byName" ,
"options" : "lastmodified"
} ,
"properties" : [
{
"id" : "displayName" ,
"value" : "Time"
} ,
{
"id" : "unit" ,
"value" : "time: YYYY-MM-DD HH:mm:ss.SSS"
} ,
{
"id" : "custom.align"
}
]
} ,
{
"matcher" : {
"id" : "byName" ,
"options" : "prefix"
} ,
"properties" : [
{
"id" : "displayName" ,
"value" : "Prefix"
} ,
{
"id" : "unit" ,
"value" : "short"
} ,
{
"id" : "decimals" ,
"value" : 2
} ,
{
"id" : "links" ,
"value" : [
{
"targetBlank" : true ,
"title" : "Prefix History " ,
"url" : "/d/l3vpn-prefix-hist/prefix-history-by-prefix-l3vpn?orgId=1&var-input=${__value.text}&var-rd=$rd"
}
]
} ,
{
"id" : "custom.align"
}
]
} ,
{
"matcher" : {
"id" : "byName" ,
"options" : "origin_as"
} ,
"properties" : [
{
"id" : "displayName" ,
"value" : "Origin"
} ,
{
"id" : "unit" ,
"value" : "none"
} ,
{
"id" : "links" ,
"value" : [
{
"targetBlank" : true ,
"title" : "ASN View" ,
"url" : "/grafana/d/asnview/asn-view?orgId=1&var-asn_num=${__value.text}"
}
]
} ,
{
"id" : "custom.align"
}
]
} ,
{
"matcher" : {
"id" : "byName" ,
"options" : "iswithdrawn"
} ,
"properties" : [
{
"id" : "displayName" ,
"value" : "Withdrawn"
} ,
{
"id" : "unit" ,
"value" : "bool"
} ,
{
"id" : "custom.displayMode" ,
"value" : "color-background-solid"
} ,
{
"id" : "custom.align" ,
"value" : "auto"
} ,
{
"id" : "color" ,
"value" : {
"mode" : "continuous-GrYlRd"
}
}
]
} ,
{
"matcher" : {
"id" : "byName" ,
"options" : "Time"
} ,
"properties" : [
{
"id" : "custom.width" ,
"value" : 194
}
]
}
]
} ,
"gridPos" : {
"h" : 18 ,
"w" : 24 ,
"x" : 0 ,
"y" : 42
} ,
"id" : 13 ,
"links" : [ ] ,
"options" : {
"footer" : {
"fields" : "" ,
"reducer" : [
"sum"
] ,
"show" : false
} ,
"showHeader" : true ,
"sortBy" : [ ]
} ,
"pluginVersion" : "9.1.7" ,
"targets" : [
{
"datasource" : {
"type" : "postgres" ,
"uid" : "obmp_postgres"
} ,
"format" : "table" ,
"rawQuery" : true ,
"rawSql" : "select distinct ip.*, \n \tFIRST_VALUE(geo_ip.city) OVER (PARTITION BY ip.prefix ORDER BY geo_ip.ip DESC) as city,\n \tFIRST_VALUE(geo_ip.stateprov) OVER (PARTITION BY ip.prefix ORDER BY geo_ip.ip DESC) as stateprov,\n \tFIRST_VALUE(geo_ip.country) OVER (PARTITION BY ip.prefix ORDER BY geo_ip.ip DESC) as country,\n ls.local_router_name\n\tFROM (SELECT lastmodified,peername,rd,prefix,\n \tiswithdrawn,origin_as,med,localpref,nh,as_path,extcommunities,communities,largecommunities\n from v_l3vpn_routes\n \t\twhere prefix && '$input' \n \t\t AND peer_hash_id in ($peer_hash)\n \t\t AND ('$rd' = '-' OR rd = '$rd')\n \t\tlimit 2000\n \t) ip\n\t\tLEFT JOIN geo_ip on (geo_ip.ip >>= ip.prefix AND geo_ip.ip != '0.0.0.0/0')\n LEFT JOIN v_ls_prefixes ls ON (ls.prefix >>= ip.nh and length(ls.local_router_name) > 0)" ,
"refId" : "A"
}
] ,
"title" : "Looking Glass (Prefix Lookup)" ,
Add ExaBGP route injector, Grafana dashboards, and full documentation
- Add exabgp/ container: ExaBGP 5.x + Flask REST API for on-demand BGP
route injection into CML IOS-XR lab (AS 65020 via eBGP from AS 65100)
- Add 6 injection scenarios: internet_sample, churn, blackhole, anycast,
full_table, lab_prefixes
- Add inject.py CLI wrapper for the ExaBGP API
- Add iosxr_bgp_config.md with IOS-XR neighbor config and NETCONF script
- Add obmp-grafana/ dashboards and provisioning (17 dashboards)
- Update docker-compose.yml: add exabgp service, fix Kafka external
listener IP, extend log retention from 90min to 720min
- Add DOCS.md: full project documentation including architecture, setup,
user guide, sanity checks, troubleshooting, and command reference
- Update .gitignore: exclude .env and .claude/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 14:46:37 -07:00
"transformations" : [
{
"id" : "merge" ,
"options" : {
"reducers" : [ ]
}
}
] ,
"type" : "table"
}
] ,
"schemaVersion" : 36 ,
"style" : "dark" ,
"tags" : [
2026-05-18 20:55:03 -07:00
"obmp-nav" ,
"l3vpn" ,
Add ExaBGP route injector, Grafana dashboards, and full documentation
- Add exabgp/ container: ExaBGP 5.x + Flask REST API for on-demand BGP
route injection into CML IOS-XR lab (AS 65020 via eBGP from AS 65100)
- Add 6 injection scenarios: internet_sample, churn, blackhole, anycast,
full_table, lab_prefixes
- Add inject.py CLI wrapper for the ExaBGP API
- Add iosxr_bgp_config.md with IOS-XR neighbor config and NETCONF script
- Add obmp-grafana/ dashboards and provisioning (17 dashboards)
- Update docker-compose.yml: add exabgp service, fix Kafka external
listener IP, extend log retention from 90min to 720min
- Add DOCS.md: full project documentation including architecture, setup,
user guide, sanity checks, troubleshooting, and command reference
- Update .gitignore: exclude .env and .claude/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 14:46:37 -07:00
"obmp-l3vpn"
] ,
"templating" : {
"list" : [
{
"current" : {
"selected" : true ,
"text" : [
"All"
] ,
"value" : [
"$__all"
]
} ,
"datasource" : {
"type" : "postgres" ,
"uid" : "obmp_postgres"
} ,
"definition" : "select routername as __text, router_hash_id as __value from v_peers where router_state = 'up' and recvcapabilities like '% afi=1 safi=128 %';" ,
"hide" : 0 ,
"includeAll" : true ,
"label" : "Router" ,
"multi" : true ,
"name" : "router_hash" ,
"options" : [ ] ,
"query" : "select routername as __text, router_hash_id as __value from v_peers where router_state = 'up' and recvcapabilities like '% afi=1 safi=128 %';" ,
"refresh" : 1 ,
"regex" : "" ,
"skipUrlSync" : false ,
"sort" : 1 ,
"tagValuesQuery" : "" ,
"tagsQuery" : "" ,
"type" : "query" ,
"useTags" : false
} ,
{
"current" : {
2026-05-18 20:55:03 -07:00
"selected" : true ,
"text" : [
"All"
] ,
"value" : [
"$__all"
]
Add ExaBGP route injector, Grafana dashboards, and full documentation
- Add exabgp/ container: ExaBGP 5.x + Flask REST API for on-demand BGP
route injection into CML IOS-XR lab (AS 65020 via eBGP from AS 65100)
- Add 6 injection scenarios: internet_sample, churn, blackhole, anycast,
full_table, lab_prefixes
- Add inject.py CLI wrapper for the ExaBGP API
- Add iosxr_bgp_config.md with IOS-XR neighbor config and NETCONF script
- Add obmp-grafana/ dashboards and provisioning (17 dashboards)
- Update docker-compose.yml: add exabgp service, fix Kafka external
listener IP, extend log retention from 90min to 720min
- Add DOCS.md: full project documentation including architecture, setup,
user guide, sanity checks, troubleshooting, and command reference
- Update .gitignore: exclude .env and .claude/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 14:46:37 -07:00
} ,
"datasource" : {
"type" : "postgres" ,
"uid" : "obmp_postgres"
} ,
"definition" : "select peername as __text, peer_hash_id as __value from v_peers where router_hash_id in ($router_hash) and recvcapabilities like '% afi=1 safi=128 %';" ,
"hide" : 0 ,
2026-05-18 20:55:03 -07:00
"includeAll" : true ,
Add ExaBGP route injector, Grafana dashboards, and full documentation
- Add exabgp/ container: ExaBGP 5.x + Flask REST API for on-demand BGP
route injection into CML IOS-XR lab (AS 65020 via eBGP from AS 65100)
- Add 6 injection scenarios: internet_sample, churn, blackhole, anycast,
full_table, lab_prefixes
- Add inject.py CLI wrapper for the ExaBGP API
- Add iosxr_bgp_config.md with IOS-XR neighbor config and NETCONF script
- Add obmp-grafana/ dashboards and provisioning (17 dashboards)
- Update docker-compose.yml: add exabgp service, fix Kafka external
listener IP, extend log retention from 90min to 720min
- Add DOCS.md: full project documentation including architecture, setup,
user guide, sanity checks, troubleshooting, and command reference
- Update .gitignore: exclude .env and .claude/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 14:46:37 -07:00
"label" : "Peer" ,
"multi" : true ,
"name" : "peer_hash" ,
"options" : [ ] ,
"query" : "select peername as __text, peer_hash_id as __value from v_peers where router_hash_id in ($router_hash) and recvcapabilities like '% afi=1 safi=128 %';" ,
"refresh" : 1 ,
"regex" : "" ,
"skipUrlSync" : false ,
"sort" : 1 ,
"tagValuesQuery" : "" ,
"tagsQuery" : "" ,
"type" : "query" ,
"useTags" : false
} ,
{
"current" : {
"selected" : true ,
"text" : "-" ,
"value" : "-"
} ,
"description" : "RD in the format of N:N. Set to - for all." ,
"hide" : 0 ,
"includeAll" : false ,
"label" : "RD" ,
"multi" : false ,
"name" : "rd" ,
"options" : [
{
"selected" : true ,
"text" : "-" ,
"value" : "-"
}
] ,
"query" : "-" ,
"queryValue" : "203:20" ,
"skipUrlSync" : false ,
"type" : "custom"
} ,
{
"current" : {
"selected" : true ,
"text" : "1000" ,
"value" : "1000"
} ,
"hide" : 0 ,
"includeAll" : false ,
"label" : "Limit" ,
"multi" : false ,
"name" : "limit" ,
"options" : [
{
"selected" : true ,
"text" : "1000" ,
"value" : "1000"
} ,
{
"selected" : false ,
"text" : "3000" ,
"value" : "3000"
} ,
{
"selected" : false ,
"text" : "5000" ,
"value" : "5000"
} ,
{
"selected" : false ,
"text" : "8000" ,
"value" : "8000"
} ,
{
"selected" : false ,
"text" : "10000" ,
"value" : "10000"
}
] ,
"query" : "1000,3000,5000,8000,10000" ,
"queryValue" : "" ,
"skipUrlSync" : false ,
"type" : "custom"
} ,
{
"current" : {
"selected" : true ,
"text" : [
"Advertised"
] ,
"value" : [
"False"
]
} ,
"hide" : 0 ,
"includeAll" : true ,
2026-05-18 20:55:03 -07:00
"label" : "State" ,
Add ExaBGP route injector, Grafana dashboards, and full documentation
- Add exabgp/ container: ExaBGP 5.x + Flask REST API for on-demand BGP
route injection into CML IOS-XR lab (AS 65020 via eBGP from AS 65100)
- Add 6 injection scenarios: internet_sample, churn, blackhole, anycast,
full_table, lab_prefixes
- Add inject.py CLI wrapper for the ExaBGP API
- Add iosxr_bgp_config.md with IOS-XR neighbor config and NETCONF script
- Add obmp-grafana/ dashboards and provisioning (17 dashboards)
- Update docker-compose.yml: add exabgp service, fix Kafka external
listener IP, extend log retention from 90min to 720min
- Add DOCS.md: full project documentation including architecture, setup,
user guide, sanity checks, troubleshooting, and command reference
- Update .gitignore: exclude .env and .claude/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 14:46:37 -07:00
"multi" : true ,
"name" : "state" ,
"options" : [
{
"selected" : false ,
"text" : "All" ,
"value" : "$__all"
} ,
{
"selected" : true ,
"text" : "Advertised" ,
"value" : "False"
} ,
{
"selected" : false ,
"text" : "Withdrawn" ,
"value" : "True"
}
] ,
"query" : "Advertised : False, Withdrawn : True" ,
"queryValue" : "" ,
"skipUrlSync" : false ,
"type" : "custom"
2026-05-18 20:55:03 -07:00
} ,
{
"current" : {
"selected" : false ,
"text" : "80.0.0.2" ,
"value" : "80.0.0.2"
} ,
"hide" : 0 ,
"label" : "Prefix/IP Lookup" ,
"name" : "input" ,
"options" : [
{
"selected" : true ,
"text" : "80.0.0.2" ,
"value" : "80.0.0.2"
}
] ,
"query" : "80.0.0.2" ,
"queryValue" : "50.227.215.188" ,
"skipUrlSync" : false ,
"type" : "textbox"
} ,
{
"current" : {
"isNone" : true ,
"selected" : false ,
"text" : "None" ,
"value" : ""
} ,
"datasource" : {
"type" : "postgres" ,
"uid" : "obmp_postgres"
} ,
"definition" : "select prefix from l3vpn_rib \nwhere prefix >>= '$input' and peer_hash_id in ($peer_hash) and ('$rd' = '-' OR rd = '$rd')\norder by prefix desc limit 1" ,
"hide" : 2 ,
"includeAll" : false ,
"multi" : false ,
"name" : "prefix" ,
"options" : [ ] ,
"query" : "select prefix from l3vpn_rib \nwhere prefix >>= '$input' and peer_hash_id in ($peer_hash) and ('$rd' = '-' OR rd = '$rd')\norder by prefix desc limit 1" ,
"refresh" : 1 ,
"regex" : "" ,
"skipUrlSync" : false ,
"sort" : 0 ,
"type" : "query"
Add ExaBGP route injector, Grafana dashboards, and full documentation
- Add exabgp/ container: ExaBGP 5.x + Flask REST API for on-demand BGP
route injection into CML IOS-XR lab (AS 65020 via eBGP from AS 65100)
- Add 6 injection scenarios: internet_sample, churn, blackhole, anycast,
full_table, lab_prefixes
- Add inject.py CLI wrapper for the ExaBGP API
- Add iosxr_bgp_config.md with IOS-XR neighbor config and NETCONF script
- Add obmp-grafana/ dashboards and provisioning (17 dashboards)
- Update docker-compose.yml: add exabgp service, fix Kafka external
listener IP, extend log retention from 90min to 720min
- Add DOCS.md: full project documentation including architecture, setup,
user guide, sanity checks, troubleshooting, and command reference
- Update .gitignore: exclude .env and .claude/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 14:46:37 -07:00
}
]
} ,
"time" : {
"from" : "now-1h" ,
"to" : "now"
} ,
"timepicker" : {
"refresh_intervals" : [
"5s" ,
"10s" ,
"30s" ,
"1m" ,
"5m" ,
"15m" ,
"30m" ,
"1h" ,
"2h" ,
"1d"
] ,
"time_options" : [
"5m" ,
"15m" ,
"1h" ,
"6h" ,
"12h" ,
"24h" ,
"2d" ,
"7d" ,
"30d"
]
} ,
"timezone" : "" ,
2026-05-18 20:55:03 -07:00
"title" : "L3VPN RIB & Looking Glass" ,
Add ExaBGP route injector, Grafana dashboards, and full documentation
- Add exabgp/ container: ExaBGP 5.x + Flask REST API for on-demand BGP
route injection into CML IOS-XR lab (AS 65020 via eBGP from AS 65100)
- Add 6 injection scenarios: internet_sample, churn, blackhole, anycast,
full_table, lab_prefixes
- Add inject.py CLI wrapper for the ExaBGP API
- Add iosxr_bgp_config.md with IOS-XR neighbor config and NETCONF script
- Add obmp-grafana/ dashboards and provisioning (17 dashboards)
- Update docker-compose.yml: add exabgp service, fix Kafka external
listener IP, extend log retention from 90min to 720min
- Add DOCS.md: full project documentation including architecture, setup,
user guide, sanity checks, troubleshooting, and command reference
- Update .gitignore: exclude .env and .claude/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 14:46:37 -07:00
"uid" : "v-cdzIBnz" ,
2026-05-18 20:55:03 -07:00
"version" : 2 ,
Add ExaBGP route injector, Grafana dashboards, and full documentation
- Add exabgp/ container: ExaBGP 5.x + Flask REST API for on-demand BGP
route injection into CML IOS-XR lab (AS 65020 via eBGP from AS 65100)
- Add 6 injection scenarios: internet_sample, churn, blackhole, anycast,
full_table, lab_prefixes
- Add inject.py CLI wrapper for the ExaBGP API
- Add iosxr_bgp_config.md with IOS-XR neighbor config and NETCONF script
- Add obmp-grafana/ dashboards and provisioning (17 dashboards)
- Update docker-compose.yml: add exabgp service, fix Kafka external
listener IP, extend log retention from 90min to 720min
- Add DOCS.md: full project documentation including architecture, setup,
user guide, sanity checks, troubleshooting, and command reference
- Update .gitignore: exclude .env and .claude/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 14:46:37 -07:00
"weekStart" : ""
2026-05-18 20:55:03 -07:00
}