如何重置System.Diagnostics.Metrics中的ObservableGauge指标?
我想了解是否有方法可以清除或重置System.Diagnostics.Metrics中已有的ObservableGauge。
以下是问题详情:我创建了一个带有observeValues参数的ObservableGauge,该参数类型为Func<IEnumerable<Measurement<T>>>。随后我从字典生成了IEnumerable<Measurement<T>>并添加了一些值,Prometheus采集到了这些值,但即使我清空了字典,指标端点仍然返回这些值。请问有人能告诉我如何重置这些指标吗?
public static void CreateCounters(ConcurrentDictionary<int, int> registry) { Meter.CreateObservableGauge("registry_total", () => GetCount(registry)); } private static IEnumerable<Measurement<int>> GetCount(ConcurrentDictionary<int, int> registry) { return registry.Select(kv => new Measurement<int>(kv.Value, new KeyValuePair<string, object?>("region", kv.Key))); }
当然,我可以手动将所有值设为0,但这会让代码变得更复杂,而且字典中会留下我不再关心的项。
解决方案
方法1:手动Dispose旧实例并重新创建ObservableGauge
ObservableGauge的实例属于IDisposable类型,你可以保存这个实例的引用,当需要重置指标时,先释放旧的实例,再创建新的。这样旧的指标定义会被彻底移除,新的实例会基于当前空字典返回空的测量集合,采集器下次获取时就不会再返回旧值。
修改后的代码示例:
// 保存ObservableGauge的引用 private static IDisposable _registryGauge; public static void InitializeOrResetRegistryGauge(ConcurrentDictionary<int, int> registry) { // 释放旧的Gauge实例 _registryGauge?.Dispose(); // 创建新的Gauge _registryGauge = Meter.CreateObservableGauge("registry_total", () => GetCount(registry)); } private static IEnumerable<Measurement<int>> GetCount(ConcurrentDictionary<int, int> registry) { return registry.Select(kv => new Measurement<int>(kv.Value, new KeyValuePair<string, object?>("region", kv.Key))); }
当你清空字典后,调用InitializeOrResetRegistryGauge方法即可完成重置。
方法2:配置Prometheus采集器的指标过期策略
如果使用的是.NET Prometheus exporter(比如prometheus-net),可以配置指标的自动过期规则,让采集器自动移除一段时间内没有更新的指标。例如在prometheus-net中,可以通过设置MetricServer的相关参数,或者在指标注册时配置过期时间,这样即使不手动处理,旧的指标也会在指定时间后被清理。
内容的提问来源于stack exchange,提问作者Evgeniy Senetskiy

