0

我有一个简单的 Spring Boot 应用程序,配置如下(该项目GitHub 上可用):

management:
  metrics:
    export:
      simple:
        mode: step
  endpoints:
    web:
      exposure:
        include: "*"

上述配置创建SimpleMeterRegistry并将其指标配置为基于步骤的,步长为 60 秒。我有一个脚本每秒向服务虚拟端点发送 50-100 个请求,还有另一个脚本/actuator/metrics/http.server.requests每 X 秒轮询一次数据。当我每 60 秒运行后一个脚本时,一切都按预期工作,但是当脚本每 120 秒运行一次时,响应总是包含和指标。TOTAL_TIMECOUNT

谁能解释这种行为?

我已阅读此处的文档。下图 在此处输入图像描述 可能表明,只有在当前间隔期间调用 pollAsRate 时,注册表才会尝试聚合前一个间隔的数据。这将解释为什么它在 120 秒间隔内不起作用。但这只是我的假设,有人知道这里到底发生了什么吗?

春季启动版本:2.1.7.RELEASE

更新

我做了一个类似的测试management.metrics.export.simple.step=10s,当轮询间隔为 10s 时它工作正常,而当它是 20s 时它不工作。对于 15 秒的间隔,它偶尔会起作用。因此,它肯定与步长和轮询频率有关。

4

2 回答 2

0

MAX, TOTAL_TIME,COUNTStatistic的属性。

如果过去2 分钟(120 秒)没有发出请求, DistributionStatisticConfig.expiry(Duration.ofMinutes(2))会将某些测量值设置为 0

诸如public TimeWindowMax(Clock clock,...),之类的方法private void rotate()已经被编写为相同的。你可以在这里看到实现

更详细的答案

于 2019-08-19T15:12:28.390 回答
0

终于搞清楚是怎么回事了。

对 的每个请求/actuator/metricsMetricsEndpoint都将合并措施(请参见此处)。这是通过收集所有仪表的值来完成的measurement.getValue()StepMeasurement.getValue()不会简单地返回值,它会更新当前和以前的间隔和计数,并滚动计数(参见此处此处

StepMeasurement.getValue

public double getValue() {
  double absoluteCount = (Double)this.f.get();
  double inc = Math.max(0.0D, absoluteCount - this.lastCount.sum());
  this.lastCount.add(inc);
  this.value.getCurrent().add(inc);
  return this.value.poll();
}

StepDouble.poll

public double poll() {
    rollCount(clock.wallTime());
    return previous;
}

这与轮询间隔有何关系?如果您不轮询/actuator/metrics端点,则不会更新当前和以前的时间间隔,从而导致当前时间间隔不是最新的并且指标被记录为“错误”时间间隔。

于 2019-08-20T08:17:47.970 回答