有没有办法使用 Prometheus 记录经过的时间

Posted

技术标签:

【中文标题】有没有办法使用 Prometheus 记录经过的时间【英文标题】:Is there a way to record elapsed time using Prometheus 【发布时间】:2018-06-01 07:24:28 【问题描述】:

我有一个 spring-boot 应用程序,我使用Prometheus 来收集指标数据。 Prometheus 具有诸如 Counter 之类的指标,它可以很好地计算某事发生的次数,Gauge 也可以计数,但可以减少等等。是否有一个指标可以让我跟踪某事的请求持续时间?例如,假设我想记录从进行 api 调用到 api 返回响应之间所花费的时间。我将如何跟踪拨打电话和收到 api 响应之间的时间?然后,是否可以在Y 坐标上创建一个图表,我可以列出响应所花费的时间长度(以秒或毫秒为单位);然后在X 轴上,是否显示时间戳(收集指标的时间)?

【问题讨论】:

【参考方案1】:

对于时间事件大小,例如 api 延迟,您可能需要Summary

然后您可以计算aggregate average latency:

  sum without (instance)(rate(my_summary_latency_seconds_sum[5m]))
/
  sum without (instance)(rate(my_summary_latency_seconds_count[5m])

【讨论】:

... 并使用 Summary#startTimer() 获取计时器,并使用 Summary.Timer#observeDuration() 获取经过的时间【参考方案2】:

正如你提到的spring-boot,你真的应该看看Micrometer 项目。它提供了一个供应商中立的指标 API,支持 Prometheus。 Micrometer 有一个特定的计时器原语:

Timer
   .builder("my.timer")
   .tags("uri", "/api/endpoint")
   .register(registry)
   .record(() -> 
     /* do something */
   );

// or
registry.timer("my.timer", "uri", "api/endpoint").record(() -> 
  /* do something */
);

对于 Spring-Boot 1.5 项目,您将使用 micrometer-spring-legacy 依赖项。对于 Spring-Boot 2(撰写本文时为 2.0.0.M7),千分尺支持包含在 OOTB 中,spring-boot-starter-actuator

当您提到定时 API 请求时,我假设您使用的是 Spring MVC。自动支持这些时间。 (每个 URI 都有一个 count,请求持续时间的 sum 以及一个额外的 max 用于跟踪时间窗口内的滚动最大值。)

如果您还不想计算服务器端请求延迟百分比,您也可以启用直方图桶的生成。

看看documentation。

【讨论】:

以上是关于有没有办法使用 Prometheus 记录经过的时间的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在使用 Prometheus 的 IIS 站点出现故障时产生警报?

prometheus遇到的大坑

有没有办法用 Prometheus 和 Grafana 监控 Apache 服务器?

有没有办法配置要使用 jmx_exporter/prometheus 捕获的 kafka-connect jmx 指标?

当猫鼬模型是新的时,有没有办法自动生成 ObjectId?

有没有办法将 Micrometer @Timed 注释捕获到 Prometheus 指标存储/注册表中? [复制]