如何删除不再有效的仪表

How to remove no longer valid Gauges

我使用 Prometheus Java 客户端导出我的应用程序的会话信息。我们想显示会话空闲了多长时间。

问题是我们最多有 1000 个会话,会话会在一段时间后被删除。不幸的是,它们并没有从 Prometheus 中消失:

我的代码如下所示:

static final Gauge sessionInactivity = Gauge.build()
    .name("sessions_inactivity_duration")
    .labelNames("internal_key", "external_key", "browser")
    .help("Number of milliseconds a certain session has been inactive")
    .register();

sessionInactivity.labels(internalKey, externalKey, browser).set(inactivityTime);

我尝试在刮擦期间执行 sessionInactivity.clear() 但显然这不会清空仪表的内容。

这种按请求处理的方式不适合像 Prometheus 这样的度量系统。这将被视为分析,为此需要更多自定义内容。

还建议为这种事情导出时间戳,而不是多久以前的时间。这对更新时间不再更新的东西有弹性,你可以在Prometheus端做time()的减法。

Gauge class 有一个 remove 方法,它与 labels 方法具有相同的签名。对于您的具体示例,删除与该量表关联的指标将如下所示

sessionInactivity.remove(internalKey, externalKey, browser);

客户端库 documentation 声明:

Metrics with labels SHOULD support a remove() method with the same signature as labels() that will remove a Child from the metric no longer exporting it, and a clear() method that removes all Children from the metric. These invalidate caching of Children.

由于您正在注册仪表,因此需要从注册表中删除过期的仪表。

protected MeterRegistry registry;

  ...
  static final Gauge sessionInactivity = Gauge.build()
    .name("sessions_inactivity_duration")
    .labelNames("internal_key", "external_key", "browser")
    .help("Number of milliseconds a certain session has been inactive")
    .register(registry); // use registry

  ...
  // remove expired gauges from registry
  registry.remove(sessionInactivity);