oxidecomputer / oxidecomputer/maghemite
Fill in IPv6 and BGP unnumbered support in oxstats
Nobody has claimed this yet.
- Dominant language
- Rust
- Stars
- 94
- Forks
- 6
- Avg merge
- 1d 8h
- Merged PRs (30d)
- 12
Description
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.
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Read oxstats.rs, focusing on bgp_stats(), static_stats(), and rib_stats(), plus the BgpSession, StaticRoutingConfig, and SwitchRib targets described in the issue. Trace how PeerId and AddressFamily values reach the metrics, then determine how unnumbered peers and IPv4/IPv6 dimensions should be represented. Done means BGP, static-route, and RIB statistics expose the missing peers and address-family distinctions without losing existing metrics.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- rust
- Domain
- networking, observability-sre
- Issue type
- Feature
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 38/100