discovery: Introduce prometheus_sd_last_update_timestamp_seconds

The metric tracks the last update sent to SD consumers, and includes the
manager name. This allows for monitoring SD state based on far ago its
last heartbeat was.

Signed-off-by: Pranshu Srivastava <rexagod@gmail.com>
This commit is contained in:
Pranshu Srivastava 2026-02-25 18:42:06 +05:30
parent c317f9254e
commit c023066ca9
No known key found for this signature in database
GPG key ID: B9F3AE9A09013C61
3 changed files with 40 additions and 0 deletions

View file

@ -475,6 +475,7 @@ func (m *Manager) allGroups() map[string][]*targetgroup.Group {
for setName, v := range n {
m.metrics.DiscoveredTargets.WithLabelValues(setName).Set(float64(v))
m.metrics.LastUpdated.WithLabelValues(setName).SetToCurrentTime()
}
return tSets

View file

@ -1595,3 +1595,30 @@ func TestConfigReloadAndShutdownRace(t *testing.T) {
cancel()
wgBg.Wait()
}
func TestGaugeLastUpdateTimestamp(t *testing.T) {
ctx := t.Context()
reg := prometheus.NewRegistry()
_, sdMetrics := NewTestMetrics(t, reg)
discoveryManager := NewManager(ctx, promslog.NewNopLogger(), reg, sdMetrics)
require.NotNil(t, discoveryManager)
discoveryManager.updatert = 100 * time.Millisecond
go discoveryManager.Run()
c := map[string]Configs{
"prometheus": {
staticConfig("foo:9090"),
},
}
discoveryManager.ApplyConfig(c)
before := time.Now()
<-discoveryManager.SyncCh()
after := time.Now()
ts := client_testutil.ToFloat64(discoveryManager.metrics.LastUpdated.WithLabelValues("prometheus"))
require.GreaterOrEqual(t, ts, float64(before.UnixNano())/1e9, "last update timestamp should be >= time before sync")
require.LessOrEqual(t, ts, float64(after.UnixNano())/1e9, "last update timestamp should be <= time after sync")
}

View file

@ -26,6 +26,7 @@ type Metrics struct {
ReceivedUpdates prometheus.Counter
DelayedUpdates prometheus.Counter
SentUpdates prometheus.Counter
LastUpdated *prometheus.GaugeVec
}
func NewManagerMetrics(registerer prometheus.Registerer, sdManagerName string) (*Metrics, error) {
@ -72,12 +73,22 @@ func NewManagerMetrics(registerer prometheus.Registerer, sdManagerName string) (
},
)
m.LastUpdated = prometheus.NewGaugeVec(
prometheus.GaugeOpts{
Name: "prometheus_sd_last_update_timestamp_seconds",
Help: "Timestamp of the last update sent to the SD consumers.",
ConstLabels: prometheus.Labels{"name": sdManagerName},
},
[]string{"config"},
)
metrics := []prometheus.Collector{
m.FailedConfigs,
m.DiscoveredTargets,
m.ReceivedUpdates,
m.DelayedUpdates,
m.SentUpdates,
m.LastUpdated,
}
for _, collector := range metrics {
@ -97,4 +108,5 @@ func (m *Metrics) Unregister(registerer prometheus.Registerer) {
registerer.Unregister(m.ReceivedUpdates)
registerer.Unregister(m.DelayedUpdates)
registerer.Unregister(m.SentUpdates)
registerer.Unregister(m.LastUpdated)
}