diff --git a/router/fastdp.go b/router/fastdp.go index 4cb0fd49..6627cd4e 100644 --- a/router/fastdp.go +++ b/router/fastdp.go @@ -318,6 +318,11 @@ func (fastDatapathOverlay) AddFeaturesTo(features map[string]string) { // OverlaySwitch. } +type FastDPStatus struct { + Vports []VportStatus + Flows []FlowStatus +} + type FlowStatus odp.FlowInfo func (flowStatus *FlowStatus) MarshalJSON() ([]byte, error) { @@ -374,15 +379,28 @@ func (fastdp fastDatapathOverlay) Diagnostics() interface{} { flowStatuses = append(flowStatuses, FlowStatus(flow)) } - return struct { - Vports []VportStatus - Flows []FlowStatus - }{ + return FastDPStatus{ vportStatuses, flowStatuses, } } +type FastDPMetrics struct { + Flows int + TotalPackets uint64 + TotalBytes uint64 +} + +func (s FastDPStatus) Metrics() interface{} { + var m FastDPMetrics + m.Flows = len(s.Flows) + for _, flow := range s.Flows { + m.TotalPackets += flow.Packets + m.TotalBytes += flow.Bytes + } + return &m +} + func (fastdp fastDatapathOverlay) StartConsumingPackets(localPeer *mesh.Peer, peers *mesh.Peers, consumer OverlayConsumer) error { fastdp.lock.Lock() defer fastdp.lock.Unlock() diff --git a/router/overlay_switch.go b/router/overlay_switch.go index 553b9fdc..ff3e6b3d 100644 --- a/router/overlay_switch.go +++ b/router/overlay_switch.go @@ -42,14 +42,29 @@ func (osw *OverlaySwitch) AddFeaturesTo(features map[string]string) { features["Overlays"] = strings.Join(osw.overlayNames, " ") } +type OverlaySwitchDiagnostics map[string]interface{} + func (osw *OverlaySwitch) Diagnostics() interface{} { - diagnostics := make(map[string]interface{}) + diagnostics := make(OverlaySwitchDiagnostics) for name, overlay := range osw.overlays { diagnostics[name] = overlay.Diagnostics() } return diagnostics } +type MetricsReporter interface { + Metrics() interface{} +} + +func (d OverlaySwitchDiagnostics) Metrics() interface{} { + for _, entry := range d { + if fastDPEntry, ok := entry.(MetricsReporter); ok { + return fastDPEntry.Metrics() + } + } + return nil +} + func (osw *OverlaySwitch) InvalidateRoutes() { for _, overlay := range osw.overlays { overlay.InvalidateRoutes()