Fix prefix URL routing to handle CIDR notation with slashes
- Use wildcard route pattern for /prefix/* endpoints - Extract prefix parameter using chi.URLParam(r, "*") - Fixes 400 error when accessing /prefix/x.x.x.x/32 directly
This commit is contained in:
@@ -30,6 +30,14 @@ type Tracker struct {
|
||||
// Route update metrics
|
||||
ipv4UpdateRate metrics.Meter
|
||||
ipv6UpdateRate metrics.Meter
|
||||
|
||||
// Announcement/withdrawal metrics
|
||||
announcementCounter metrics.Counter
|
||||
withdrawalCounter metrics.Counter
|
||||
churnRate metrics.Meter // combined announcements + withdrawals per second
|
||||
|
||||
// BGP peer tracking
|
||||
bgpPeerCount atomic.Int32
|
||||
}
|
||||
|
||||
// New creates a new metrics tracker
|
||||
@@ -37,15 +45,18 @@ func New() *Tracker {
|
||||
registry := metrics.NewRegistry()
|
||||
|
||||
return &Tracker{
|
||||
registry: registry,
|
||||
messageCounter: metrics.NewCounter(),
|
||||
byteCounter: metrics.NewCounter(),
|
||||
messageRate: metrics.NewMeter(),
|
||||
byteRate: metrics.NewMeter(),
|
||||
wireByteCounter: metrics.NewCounter(),
|
||||
wireByteRate: metrics.NewMeter(),
|
||||
ipv4UpdateRate: metrics.NewMeter(),
|
||||
ipv6UpdateRate: metrics.NewMeter(),
|
||||
registry: registry,
|
||||
messageCounter: metrics.NewCounter(),
|
||||
byteCounter: metrics.NewCounter(),
|
||||
messageRate: metrics.NewMeter(),
|
||||
byteRate: metrics.NewMeter(),
|
||||
wireByteCounter: metrics.NewCounter(),
|
||||
wireByteRate: metrics.NewMeter(),
|
||||
ipv4UpdateRate: metrics.NewMeter(),
|
||||
ipv6UpdateRate: metrics.NewMeter(),
|
||||
announcementCounter: metrics.NewCounter(),
|
||||
withdrawalCounter: metrics.NewCounter(),
|
||||
churnRate: metrics.NewMeter(),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -134,6 +145,56 @@ func (t *Tracker) RecordIPv6Update() {
|
||||
t.ipv6UpdateRate.Mark(1)
|
||||
}
|
||||
|
||||
// RecordAnnouncement records a route announcement
|
||||
func (t *Tracker) RecordAnnouncement() {
|
||||
t.announcementCounter.Inc(1)
|
||||
t.churnRate.Mark(1)
|
||||
}
|
||||
|
||||
// RecordWithdrawal records a route withdrawal
|
||||
func (t *Tracker) RecordWithdrawal() {
|
||||
t.withdrawalCounter.Inc(1)
|
||||
t.churnRate.Mark(1)
|
||||
}
|
||||
|
||||
// SetBGPPeerCount updates the current BGP peer count
|
||||
func (t *Tracker) SetBGPPeerCount(count int) {
|
||||
// BGP peer count is always small (< 1000), so int32 is safe
|
||||
if count > 0 && count < 1<<31 {
|
||||
t.bgpPeerCount.Store(int32(count)) //nolint:gosec // count is validated
|
||||
}
|
||||
}
|
||||
|
||||
// GetBGPPeerCount returns the current BGP peer count
|
||||
func (t *Tracker) GetBGPPeerCount() int {
|
||||
return int(t.bgpPeerCount.Load())
|
||||
}
|
||||
|
||||
// GetAnnouncementCount returns the total announcement count
|
||||
func (t *Tracker) GetAnnouncementCount() uint64 {
|
||||
count := t.announcementCounter.Count()
|
||||
if count < 0 {
|
||||
return 0
|
||||
}
|
||||
|
||||
return uint64(count)
|
||||
}
|
||||
|
||||
// GetWithdrawalCount returns the total withdrawal count
|
||||
func (t *Tracker) GetWithdrawalCount() uint64 {
|
||||
count := t.withdrawalCounter.Count()
|
||||
if count < 0 {
|
||||
return 0
|
||||
}
|
||||
|
||||
return uint64(count)
|
||||
}
|
||||
|
||||
// GetChurnRate returns the route churn rate per second
|
||||
func (t *Tracker) GetChurnRate() float64 {
|
||||
return t.churnRate.Rate1()
|
||||
}
|
||||
|
||||
// GetRouteMetrics returns current route update metrics
|
||||
func (t *Tracker) GetRouteMetrics() RouteMetrics {
|
||||
return RouteMetrics{
|
||||
|
||||
Reference in New Issue
Block a user