diff --git a/controller/metrics.go b/controller/metrics.go index df73bbc4..a975a2f7 100644 --- a/controller/metrics.go +++ b/controller/metrics.go @@ -36,15 +36,22 @@ type metricsAgent struct { cfg *MetricsConfig influx influxdb2.Client writeApi api.WriteAPIBlocking + envCache map[string]*envCacheEntry zCtx ziti.Context zListener edge.Listener shutdown chan struct{} joined chan struct{} } +type envCacheEntry struct { + env string + lastAccess time.Time +} + func newMetricsAgent(cfg *MetricsConfig) *metricsAgent { ma := &metricsAgent{ cfg: cfg, + envCache: make(map[string]*envCacheEntry), shutdown: make(chan struct{}), joined: make(chan struct{}), } diff --git a/endpoints/frontend/metrics.go b/endpoints/frontend/metrics.go index 88b65db7..f8748384 100644 --- a/endpoints/frontend/metrics.go +++ b/endpoints/frontend/metrics.go @@ -80,28 +80,30 @@ func (ma *metricsAgent) pushUpdate(mu metricsUpdate) { } func (ma *metricsAgent) sendMetrics() error { - m := &model.Metrics{ - Namespace: ma.cfg.Identity, - Sessions: ma.accum, + if len(ma.accum) > 0 { + m := &model.Metrics{ + Namespace: ma.cfg.Identity, + Sessions: ma.accum, + } + metricsJson, err := bson.Marshal(m) + if err != nil { + return errors.Wrap(err, "error marshaling metrics") + } + conn, err := ma.zCtx.Dial(ma.cfg.Metrics.Service) + if err != nil { + return errors.Wrap(err, "error connecting to metrics service") + } + n, err := conn.Write(metricsJson) + if err != nil { + return errors.Wrap(err, "error sending metrics") + } + defer func() { _ = conn.Close() }() + if n != len(metricsJson) { + return errors.Wrap(err, "short metrics write") + } + logrus.Infof("sent %d bytes of metrics data", n) + ma.accum = make(map[string]model.SessionMetrics) + ma.lastSend = time.Now() } - metricsJson, err := bson.Marshal(m) - if err != nil { - return errors.Wrap(err, "error marshaling metrics") - } - conn, err := ma.zCtx.Dial(ma.cfg.Metrics.Service) - if err != nil { - return errors.Wrap(err, "error connecting to metrics service") - } - n, err := conn.Write(metricsJson) - if err != nil { - return errors.Wrap(err, "error sending metrics") - } - defer func() { _ = conn.Close() }() - if n != len(metricsJson) { - return errors.Wrap(err, "short metrics write") - } - logrus.Infof("sent %d bytes of metrics data", n) - ma.accum = make(map[string]model.SessionMetrics) - ma.lastSend = time.Now() return nil }