diff --git a/other/metrics/grafana_seaweedfs.json b/other/metrics/grafana_seaweedfs.json index 5c04a9992..7b15390a4 100644 --- a/other/metrics/grafana_seaweedfs.json +++ b/other/metrics/grafana_seaweedfs.json @@ -5175,8 +5175,8 @@ "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, - "title": "Metadata Subscription Lag", - "description": "Seconds since the filer last sent a metadata-subscription event (per client/path); only present with active subscribers", + "title": "Time Since Last Subscription Send", + "description": "Seconds since the filer last sent to a metadata subscription (real event or idle heartbeat), per client/path. Low for healthy caught-up subscribers; clients that don't request idle heartbeats show time since the last real event.", "type": "timeseries", "id": 156, "gridPos": { diff --git a/weed/server/filer_grpc_server_sub_meta.go b/weed/server/filer_grpc_server_sub_meta.go index d1dffb358..678f3629b 100644 --- a/weed/server/filer_grpc_server_sub_meta.go +++ b/weed/server/filer_grpc_server_sub_meta.go @@ -564,6 +564,14 @@ func (fs *FilerServer) maybeSendIdleHeartbeat(req *filer_pb.SubscribeMetadataReq glog.V(0).Infof("=> idle heartbeat to %s: %v", req.ClientName, err) return lastHeartbeatNs } + // A heartbeat is a send too: advance the freshness gauge so an idle but + // healthy subscriber doesn't look stale. The gauge otherwise only moves on + // real matching events, which never arrive on a quiet path. + var sourceFiler string + if fs.option != nil { + sourceFiler = fs.option.Host.String() + } + stats.FilerServerLastSendTsOfSubscribeGauge.WithLabelValues(sourceFiler, req.ClientName, req.PathPrefix).Set(float64(now)) return now }