You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重置System.Diagnostics.Metrics中的ObservableGauge指标?

如何清除/重置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 18:03:14