Oxstats currently has no awareness of the PeerId enum (allowing IP and interface based peers to coexist) and only queries the IPv4 Unicast address family. This needs to be updated for full (and correct) stats exposure into oxstats.
Asking Claude to summarize the gaps in oxstats for ipv6 and bgp unnumbered functionality:
Oxstats IPv6 / BGP Unnumbered Gaps
Gap 1: BGP unnumbered sessions are completely excluded from metrics
oxstats.rs:287-293 — The bgp_stats() method explicitly skips unnumbered sessions:
if let PeerId::Ip(addr) = key {
session_counters.insert(*addr, session.counters.clone());
session_count += 1;
}
PeerId::Interface(String) sessions (unnumbered peers discovered via NDP on an interface) are silently dropped. All 29 BGP counters (keepalives, opens, updates, prefixes, transitions, errors, etc.) are missing for unnumbered peers.
Root cause: The BgpSession oximeter target struct has a peer field that's typed as an IpAddr. An interface name like "eth0" can't be represented. The timeseries schema itself would need updating to support a string-based peer identifier, or a parallel timeseries for unnumbered sessions.
Gap 2: Static route stats only report IPv4
oxstats.rs:689-722 — The static_stats() method only queries IPv4:
self.db.get_static_count(AddressFamily::Ipv4)
// ...
self.db.get_static_nexthop_count(AddressFamily::Ipv4)
IPv6 static routes (AddressFamily::Ipv6) are completely ignored. The StaticRoutingConfig target doesn't differentiate by address family either, so even if you added IPv6 counts, there's no way to distinguish them in the current schema — the counts would need separate metrics or an address-family field on the target.
Gap 3: RIB stats are aggregated without AF breakdown
oxstats.rs:727-744 — The rib_stats() method calls full_rib(None), which merges IPv4 and IPv6 RIBs into a single ActiveRoutes gauge. There's no way to see IPv4 vs IPv6 active route counts independently. The SwitchRib target has no address-family dimension.
Summary
┌───────────────────────┬────────────────────────────┬──────────────────────────────────┬──────────────┐
│ Area │ IPv4 │ IPv6 │ Unnumbered │
├───────────────────────┼────────────────────────────┼──────────────────────────────────┼──────────────┤
│ BGP session counters │ Reported │ Reported (if numbered IPv6 peer) │ Not reported │
├───────────────────────┼────────────────────────────┼──────────────────────────────────┼──────────────┤
│ Static route counts │ Reported │ Not reported │ N/A │
├───────────────────────┼────────────────────────────┼──────────────────────────────────┼──────────────┤
│ Static nexthop counts │ Reported │ Not reported │ N/A │
├───────────────────────┼────────────────────────────┼──────────────────────────────────┼──────────────┤
│ RIB active routes │ Merged into single count │ Merged into single count │ N/A │
├───────────────────────┼────────────────────────────┼──────────────────────────────────┼──────────────┤
│ BFD │ Reported (keyed by IpAddr) │ Reported (keyed by IpAddr) │ N/A │
├───────────────────────┼────────────────────────────┼──────────────────────────────────┼──────────────┤
│ mg-lower │ Reported (no AF dimension) │ Same │ N/A │
└───────────────────────┴────────────────────────────┴──────────────────────────────────┴──────────────┘
The most significant gap is #1 — unnumbered BGP sessions have zero observability through oximeter. This is a blind spot for any deployment using BGP unnumbered, since you can't see session state transitions, keepalive health, or prefix exchange rates for those peers.
Oxstats currently has no awareness of the PeerId enum (allowing IP and interface based peers to coexist) and only queries the IPv4 Unicast address family. This needs to be updated for full (and correct) stats exposure into oxstats.
Asking Claude to summarize the gaps in oxstats for ipv6 and bgp unnumbered functionality: