Identify OpenConfig YANG paths for interface IN/OUT bytes, errors, drops, and oper-status
Identify paths for BGP session state and prefix counts (underlay + overlay)
Identify VXLAN paths: MAC count per VNI, VTEP tunnel state
Add system paths: CPU and memory utilization
Cross-reference selected paths against what the weathermap-ng panel visually represents (link throughput, node status)
Document final path list as the gnmic subscription config source of truth
Packet count (weathermap-ng)
Covered by the existing interface counters path — no separate path needed:
interfaces/interface[name=<if>]/state/counters
in-unicast-pkts, out-unicast-pkts
in-multicast-pkts, out-multicast-pkts
in-broadcast-pkts, out-broadcast-pkts
in-discards, out-discards
in-errors, out-errors
Link throughput for weathermap-ng visual (thickness/color) is computed in Prometheus via rate(in-octets[5m]) / rate(out-octets[5m]), not from the raw packet counters. The pkt/discard/error counters are for a separate health panel.
Labels: source (device), neighbor_neighbor_address (note: double-prefixed due to OpenConfig path flattening, not neighbor_address), network_instance_name, protocol_identifier, protocol_name, subscription_name (eos-bgp)
network_instance_name includes both default and gold (VRF/overlay tenant) — multi-tenant EVPN correctly represented
core1/core2 confirmed present in the BGP data (e.g. 10.0.14.1 source=core1) — core site BGP collection works end-to-end
Raw value is a string enum (ESTABLISHED, IDLE, ACTIVE, CONNECT, OPENSENT, OPENCONFIRM...), not usable directly by the Prometheus exporter. Transformed to 1 (UP/ESTABLISHED) / 0 (anything else) via a gnmic state-to-int event-processor (see #48 for the exact processor config) — same transform also applied to oper-status, so link status can use the same 0/1 pattern as BGP node status.
System metrics — VALIDATED ✅
Confirmed live: system_memory_state_used{source="<device>",subscription_name="eos-system"} streaming correctly across all sites (dc-leaf, dc-spine, core, campus).
gnmic Prometheus exporter — endpoint confirmed
Address: 172.16.0.70:9273 (not 9804 — default assumption was wrong, corrected after live test)
Accessible via plain curl http://172.16.0.70:9273/metrics
VXLAN (MAC count per VNI) — VALIDATED metrics, join is broken, moved out of weathermap
Two independent gnmic subscriptions (VTEP nodes only, eos-vxlan), joined at query time in Prometheus:
1. VLAN→VNI mapping — path /interfaces/interface[name=Vxlan1]/arista-exp-eos-vxlan:arista-vxlan/vlan-to-vnis/vlan-to-vni. VNI is the sample value, not a label:
Confirmed broken (validated during #48 provisioning, 2026-07-09): the vlan label doesn't correlate between the two metric families on any VTEP. E.g. campus-leaf1's VLAN-to-VNI mapping is keyed vlan="50", but its FDB entries show vlan="60"/"1006"/"1007"/"4090"/"4091" — zero overlap. Likely an Arista internal-VLAN-vs-front-panel-VLAN translation that the OpenConfig paths don't reconcile. Root cause not yet understood — needs investigation (possibly a third path exposing the internal↔front-panel VLAN mapping) before the join can work.
Architecture decision: VXLAN MAC/VNI is dropped from the weathermap-ng tooltip entirely (was going to be a decorative tooltipMetrics entry in #48, removed there). Instead it'll get its own dedicated Grafana table panel, separate from the weathermap — cleaner separation of concerns (weathermap = topology/link-status/traffic only), and a raw table doesn't require the join to be fixed to be useful. No separate issue opened for this yet; tracked here as a note until it's picked up.
OSPF (core1/core2)
Deferred — out of scope for this pass. Will revisit in a future iteration.
- Identify OpenConfig YANG paths for interface IN/OUT bytes, errors, drops, and oper-status
- Identify paths for BGP session state and prefix counts (underlay + overlay)
- Identify VXLAN paths: MAC count per VNI, VTEP tunnel state
- Add system paths: CPU and memory utilization
- Cross-reference selected paths against what the weathermap-ng panel visually represents (link throughput, node status)
- Document final path list as the gnmic subscription config source of truth
## Packet count (weathermap-ng)
Covered by the existing interface counters path — no separate path needed:
`interfaces/interface[name=<if>]/state/counters`
- `in-unicast-pkts`, `out-unicast-pkts`
- `in-multicast-pkts`, `out-multicast-pkts`
- `in-broadcast-pkts`, `out-broadcast-pkts`
- `in-discards`, `out-discards`
- `in-errors`, `out-errors`
Link throughput for weathermap-ng visual (thickness/color) is computed in Prometheus via `rate(in-octets[5m])` / `rate(out-octets[5m])`, not from the raw packet counters. The pkt/discard/error counters are for a separate health panel.
## BGP status — VALIDATED ✅
`/network-instances/network-instance[name=default]/protocols/protocol[identifier=BGP][name=BGP]/bgp/neighbors/neighbor[neighbor-address=<ip>]/state/session-state`
Plus prefix counts:
`.../afi-safis/afi-safi[afi-safi-name=<AFI_SAFI>]/state/prefixes/{received,sent,installed}`
Covers underlay eBGP (IPV4_UNICAST) and overlay EVPN (L2VPN_EVPN).
Confirmed live against the gnmic Prometheus exporter (`curl http://172.16.0.70:9273/metrics`):
- Exact metric name: `network_instances_network_instance_protocols_protocol_bgp_neighbors_neighbor_state_session_state`
- Labels: `source` (device), `neighbor_neighbor_address` (note: double-prefixed due to OpenConfig path flattening, not `neighbor_address`), `network_instance_name`, `protocol_identifier`, `protocol_name`, `subscription_name` (`eos-bgp`)
- `network_instance_name` includes both `default` and `gold` (VRF/overlay tenant) — multi-tenant EVPN correctly represented
- **core1/core2 confirmed present** in the BGP data (e.g. `10.0.14.1` source=`core1`) — core site BGP collection works end-to-end
- Raw value is a string enum (`ESTABLISHED`, `IDLE`, `ACTIVE`, `CONNECT`, `OPENSENT`, `OPENCONFIRM`...), not usable directly by the Prometheus exporter. Transformed to `1` (UP/ESTABLISHED) / `0` (anything else) via a gnmic `state-to-int` event-processor (see #48 for the exact processor config) — same transform also applied to `oper-status`, so link status can use the same 0/1 pattern as BGP node status.
## System metrics — VALIDATED ✅
Confirmed live: `system_memory_state_used{source="<device>",subscription_name="eos-system"}` streaming correctly across all sites (dc-leaf, dc-spine, core, campus).
## gnmic Prometheus exporter — endpoint confirmed
- Address: `172.16.0.70:9273` (not `9804` — default assumption was wrong, corrected after live test)
- Accessible via plain `curl http://172.16.0.70:9273/metrics`
## VXLAN (MAC count per VNI) — VALIDATED metrics, join is broken, moved out of weathermap
Two independent gnmic subscriptions (VTEP nodes only, `eos-vxlan`), joined at query time in Prometheus:
**1. VLAN→VNI mapping** — path `/interfaces/interface[name=Vxlan1]/arista-exp-eos-vxlan:arista-vxlan/vlan-to-vnis/vlan-to-vni`. VNI is the **sample value**, not a label:
```
interfaces_interface_arista_vxlan_vlan_to_vnis_vlan_to_vni_state_vni{device="dc-leaf5",interface="Vxlan1",vlan="40"} 110040
```
**2. FDB/MAC table entries** — path `/network-instances/network-instance/fdb/mac-table/entries/entry`. No VNI at all, only VLAN + MAC:
```
network_instances_network_instance_fdb_mac_table_entries_entry_state_vlan{device="dc-border-leaf2",entry_mac_address="aa:c1:ab:23:52:71",vlan="1008",network_instance_name="default"}
```
**3. Join query (currently broken on live data):**
```promql
count by (device, vlan) (network_instances_network_instance_fdb_mac_table_entries_entry_vlan)
* on(device, vlan) group_left(vlan_to_vni_state_vni)
interfaces_interface_arista_vxlan_vlan_to_vnis_vlan_to_vni_state_vni
```
**Confirmed broken (validated during #48 provisioning, 2026-07-09):** the `vlan` label doesn't correlate between the two metric families on any VTEP. E.g. `campus-leaf1`'s VLAN-to-VNI mapping is keyed `vlan="50"`, but its FDB entries show `vlan="60"/"1006"/"1007"/"4090"/"4091"` — zero overlap. Likely an Arista internal-VLAN-vs-front-panel-VLAN translation that the OpenConfig paths don't reconcile. Root cause not yet understood — needs investigation (possibly a third path exposing the internal↔front-panel VLAN mapping) before the join can work.
**Architecture decision:** VXLAN MAC/VNI is dropped from the weathermap-ng tooltip entirely (was going to be a decorative `tooltipMetrics` entry in #48, removed there). Instead it'll get its own dedicated Grafana table panel, separate from the weathermap — cleaner separation of concerns (weathermap = topology/link-status/traffic only), and a raw table doesn't require the join to be fixed to be useful. No separate issue opened for this yet; tracked here as a note until it's picked up.
## OSPF (core1/core2)
Deferred — out of scope for this pass. Will revisit in a future iteration.
Validated all paths live against dc-leaf1 (gnmic ... capabilities + gnmic ... get --path <path>) and wired them into configs/gnmic/gnmic-config.yml. Findings:
Interfaces — already covered by #43: /interfaces/interface/state/{oper-status,counters}.
BGP — as specified:
.../bgp/neighbors/neighbor/state/session-state
.../bgp/neighbors/neighbor/afi-safis/afi-safi/state/prefixes — confirmed both IPV4_UNICAST and L2VPN_EVPN afi-safi entries exist, each with received/sent/installed/received-pre-policy (+ Arista-augmented best-paths/best-ecmp-paths).
VXLAN — no single OpenConfig path gives "MAC count per VNI" or a dedicated "VTEP tunnel state" leaf. Used instead:
/interfaces/interface[name=Vxlan1]/arista-exp-eos-vxlan:arista-vxlan/vlan-to-vnis/vlan-to-vni (native Arista augment) for the VLAN↔VNI mapping.
/network-instances/network-instance/fdb/mac-table/entries/entry for MAC entries, tagged by VLAN.
MAC count per VNI is a Prometheus-side join (VLAN→VNI mapping × count of MAC entries per VLAN), not a raw device counter.
"VTEP tunnel state" has no dedicated leaf either — inferred from remote-learned mac-table entries (interface = remote VTEP) rather than a standalone list. Only applied to VTEP-capable nodes (leafs + border-leafs in both fabrics), not spines/access/core.
System — /system/cpus/cpu/state (per-core), /system/memory/state. Both plain OpenConfig, no surprises.
Gotcha worth flagging: oper-status and session-state are string enums (UP/DOWN, ESTABLISHED/IDLE/...). gnmic's Prometheus output silently drops non-numeric leaf values — they were missing from /metrics entirely until I added a state-to-int event-processor mapping them to 1/0. This also fixes a latent gap in the #43 config (oper-status was never actually exported).
Full metric list validated end-to-end via containerlab deploy --node-filter dc-leaf1,gnmic + scraping :9273/metrics, then torn down cleanly. OSPF still deferred per the issue description.
Validated all paths live against `dc-leaf1` (`gnmic ... capabilities` + `gnmic ... get --path <path>`) and wired them into `configs/gnmic/gnmic-config.yml`. Findings:
**Interfaces** — already covered by #43: `/interfaces/interface/state/{oper-status,counters}`.
**BGP** — as specified:
- `.../bgp/neighbors/neighbor/state/session-state`
- `.../bgp/neighbors/neighbor/afi-safis/afi-safi/state/prefixes` — confirmed both `IPV4_UNICAST` and `L2VPN_EVPN` afi-safi entries exist, each with `received`/`sent`/`installed`/`received-pre-policy` (+ Arista-augmented `best-paths`/`best-ecmp-paths`).
**VXLAN** — no single OpenConfig path gives "MAC count per VNI" or a dedicated "VTEP tunnel state" leaf. Used instead:
- `/interfaces/interface[name=Vxlan1]/arista-exp-eos-vxlan:arista-vxlan/vlan-to-vnis/vlan-to-vni` (native Arista augment) for the VLAN↔VNI mapping.
- `/network-instances/network-instance/fdb/mac-table/entries/entry` for MAC entries, tagged by VLAN.
- MAC count per VNI is a Prometheus-side join (VLAN→VNI mapping × count of MAC entries per VLAN), not a raw device counter.
- "VTEP tunnel state" has no dedicated leaf either — inferred from remote-learned mac-table entries (interface = remote VTEP) rather than a standalone list. Only applied to VTEP-capable nodes (leafs + border-leafs in both fabrics), not spines/access/core.
**System** — `/system/cpus/cpu/state` (per-core), `/system/memory/state`. Both plain OpenConfig, no surprises.
**Gotcha worth flagging**: `oper-status` and `session-state` are string enums (`UP`/`DOWN`, `ESTABLISHED`/`IDLE`/...). gnmic's Prometheus output silently drops non-numeric leaf values — they were missing from `/metrics` entirely until I added a `state-to-int` event-processor mapping them to `1`/`0`. This also fixes a latent gap in the #43 config (oper-status was never actually exported).
Full metric list validated end-to-end via `containerlab deploy --node-filter dc-leaf1,gnmic` + scraping `:9273/metrics`, then torn down cleanly. OSPF still deferred per the issue description.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Packet count (weathermap-ng)
Covered by the existing interface counters path — no separate path needed:
interfaces/interface[name=<if>]/state/countersin-unicast-pkts,out-unicast-pktsin-multicast-pkts,out-multicast-pktsin-broadcast-pkts,out-broadcast-pktsin-discards,out-discardsin-errors,out-errorsLink throughput for weathermap-ng visual (thickness/color) is computed in Prometheus via
rate(in-octets[5m])/rate(out-octets[5m]), not from the raw packet counters. The pkt/discard/error counters are for a separate health panel.BGP status — VALIDATED ✅
/network-instances/network-instance[name=default]/protocols/protocol[identifier=BGP][name=BGP]/bgp/neighbors/neighbor[neighbor-address=<ip>]/state/session-statePlus prefix counts:
.../afi-safis/afi-safi[afi-safi-name=<AFI_SAFI>]/state/prefixes/{received,sent,installed}Covers underlay eBGP (IPV4_UNICAST) and overlay EVPN (L2VPN_EVPN).
Confirmed live against the gnmic Prometheus exporter (
curl http://172.16.0.70:9273/metrics):network_instances_network_instance_protocols_protocol_bgp_neighbors_neighbor_state_session_statesource(device),neighbor_neighbor_address(note: double-prefixed due to OpenConfig path flattening, notneighbor_address),network_instance_name,protocol_identifier,protocol_name,subscription_name(eos-bgp)network_instance_nameincludes bothdefaultandgold(VRF/overlay tenant) — multi-tenant EVPN correctly represented10.0.14.1source=core1) — core site BGP collection works end-to-endESTABLISHED,IDLE,ACTIVE,CONNECT,OPENSENT,OPENCONFIRM...), not usable directly by the Prometheus exporter. Transformed to1(UP/ESTABLISHED) /0(anything else) via a gnmicstate-to-intevent-processor (see #48 for the exact processor config) — same transform also applied tooper-status, so link status can use the same 0/1 pattern as BGP node status.System metrics — VALIDATED ✅
Confirmed live:
system_memory_state_used{source="<device>",subscription_name="eos-system"}streaming correctly across all sites (dc-leaf, dc-spine, core, campus).gnmic Prometheus exporter — endpoint confirmed
172.16.0.70:9273(not9804— default assumption was wrong, corrected after live test)curl http://172.16.0.70:9273/metricsVXLAN (MAC count per VNI) — VALIDATED metrics, join is broken, moved out of weathermap
Two independent gnmic subscriptions (VTEP nodes only,
eos-vxlan), joined at query time in Prometheus:1. VLAN→VNI mapping — path
/interfaces/interface[name=Vxlan1]/arista-exp-eos-vxlan:arista-vxlan/vlan-to-vnis/vlan-to-vni. VNI is the sample value, not a label:2. FDB/MAC table entries — path
/network-instances/network-instance/fdb/mac-table/entries/entry. No VNI at all, only VLAN + MAC:3. Join query (currently broken on live data):
Confirmed broken (validated during #48 provisioning, 2026-07-09): the
vlanlabel doesn't correlate between the two metric families on any VTEP. E.g.campus-leaf1's VLAN-to-VNI mapping is keyedvlan="50", but its FDB entries showvlan="60"/"1006"/"1007"/"4090"/"4091"— zero overlap. Likely an Arista internal-VLAN-vs-front-panel-VLAN translation that the OpenConfig paths don't reconcile. Root cause not yet understood — needs investigation (possibly a third path exposing the internal↔front-panel VLAN mapping) before the join can work.Architecture decision: VXLAN MAC/VNI is dropped from the weathermap-ng tooltip entirely (was going to be a decorative
tooltipMetricsentry in #48, removed there). Instead it'll get its own dedicated Grafana table panel, separate from the weathermap — cleaner separation of concerns (weathermap = topology/link-status/traffic only), and a raw table doesn't require the join to be fixed to be useful. No separate issue opened for this yet; tracked here as a note until it's picked up.OSPF (core1/core2)
Deferred — out of scope for this pass. Will revisit in a future iteration.
Validated all paths live against
dc-leaf1(gnmic ... capabilities+gnmic ... get --path <path>) and wired them intoconfigs/gnmic/gnmic-config.yml. Findings:Interfaces — already covered by #43:
/interfaces/interface/state/{oper-status,counters}.BGP — as specified:
.../bgp/neighbors/neighbor/state/session-state.../bgp/neighbors/neighbor/afi-safis/afi-safi/state/prefixes— confirmed bothIPV4_UNICASTandL2VPN_EVPNafi-safi entries exist, each withreceived/sent/installed/received-pre-policy(+ Arista-augmentedbest-paths/best-ecmp-paths).VXLAN — no single OpenConfig path gives "MAC count per VNI" or a dedicated "VTEP tunnel state" leaf. Used instead:
/interfaces/interface[name=Vxlan1]/arista-exp-eos-vxlan:arista-vxlan/vlan-to-vnis/vlan-to-vni(native Arista augment) for the VLAN↔VNI mapping./network-instances/network-instance/fdb/mac-table/entries/entryfor MAC entries, tagged by VLAN.System —
/system/cpus/cpu/state(per-core),/system/memory/state. Both plain OpenConfig, no surprises.Gotcha worth flagging:
oper-statusandsession-stateare string enums (UP/DOWN,ESTABLISHED/IDLE/...). gnmic's Prometheus output silently drops non-numeric leaf values — they were missing from/metricsentirely until I added astate-to-intevent-processor mapping them to1/0. This also fixes a latent gap in the #43 config (oper-status was never actually exported).Full metric list validated end-to-end via
containerlab deploy --node-filter dc-leaf1,gnmic+ scraping:9273/metrics, then torn down cleanly. OSPF still deferred per the issue description.