diff --git a/plugins/govppmux/plugin_impl_govppmux.go b/plugins/govppmux/plugin_impl_govppmux.go index 1e2bb270bb..d8ae493b07 100644 --- a/plugins/govppmux/plugin_impl_govppmux.go +++ b/plugins/govppmux/plugin_impl_govppmux.go @@ -173,9 +173,10 @@ func (p *Plugin) Init() (err error) { } err := p.startProxy(NewVppAdapter(address, useShm), NewStatsAdapter(statsSocket)) if err != nil { - return err + p.Log.Warnf("VPP proxy failed to start: %v", err) + } else { + p.Log.Infof("VPP proxy ready") } - p.Log.Infof("VPP proxy ready") } // register REST API handlers diff --git a/plugins/telemetry/stats_poller.go b/plugins/telemetry/stats_poller.go index 806c0f8f1b..8844890462 100644 --- a/plugins/telemetry/stats_poller.go +++ b/plugins/telemetry/stats_poller.go @@ -31,6 +31,9 @@ func (s *statsPollerServer) PollStats(req *configurator.PollStatsRequest, svr co if req.GetPeriodSec() == 0 && req.GetNumPolls() > 1 { return status.Error(codes.InvalidArgument, "period must be > 0 if number of polls is > 1") } + if s.handler == nil { + return status.Errorf(codes.Unavailable, "VPP telemetry handler not available") + } ctx := svr.Context() diff --git a/plugins/telemetry/telemetry.go b/plugins/telemetry/telemetry.go index 1f96b9ec74..c7bc556f7f 100644 --- a/plugins/telemetry/telemetry.go +++ b/plugins/telemetry/telemetry.go @@ -159,10 +159,11 @@ func (p *Plugin) AfterInit() error { func (p *Plugin) setupStatsPoller() error { h := vppcalls.CompatibleTelemetryHandler(p.VPP) if h == nil { - return fmt.Errorf("VPP telemetry handler unavailable") + p.Log.Warnf("VPP telemetry handler unavailable") + } else { + p.statsPollerServer.handler = h } - p.statsPollerServer.handler = h - p.ifIndex = p.IfPlugin.GetInterfaceIndex() + p.statsPollerServer.ifIndex = p.IfPlugin.GetInterfaceIndex() if p.GRPC != nil && p.GRPC.GetServer() != nil { configurator.RegisterStatsPollerServiceServer(p.GRPC.GetServer(), &p.statsPollerServer) diff --git a/plugins/vpp/ifplugin/interface_state.go b/plugins/vpp/ifplugin/interface_state.go index 8f5538932e..666bf6eaa7 100644 --- a/plugins/vpp/ifplugin/interface_state.go +++ b/plugins/vpp/ifplugin/interface_state.go @@ -210,7 +210,13 @@ func (c *InterfaceStateUpdater) startReadingCounters(ctx context.Context) { for { select { case <-tick.C: - c.doInterfaceStatsRead() + statsClient := c.vppClient.Stats() + if statsClient == nil { + c.log.Warnf("VPP stats client not available") + // TODO: use retry with backoff instead of returning here + return + } + c.doInterfaceStatsRead(statsClient) case <-ctx.Done(): c.log.Debug("Interface state VPP periodic polling stopped") @@ -276,7 +282,7 @@ func (c *InterfaceStateUpdater) doUpdatesIfStateDetails() { } // doInterfaceStatsRead dumps statistics using interface filter and processes them -func (c *InterfaceStateUpdater) doInterfaceStatsRead() { +func (c *InterfaceStateUpdater) doInterfaceStatsRead(statsClient govppapi.StatsProvider) { c.access.Lock() defer c.access.Unlock() @@ -286,7 +292,7 @@ func (c *InterfaceStateUpdater) doInterfaceStatsRead() { return } - err := c.vppClient.Stats().GetInterfaceStats(&c.ifStats) + err := statsClient.GetInterfaceStats(&c.ifStats) if err != nil { // TODO add some counter to prevent it log forever c.log.Errorf("failed to read statistics data: %v", err)