如何从java客户端正确使用Prometheus Histogram来跟踪大小而不是延迟?

Vit*_*liy 5 performance monitoring prometheus

我有一个处理集合的 API。这个API的执行时间与集合大小有关(集合越大,占用的时间越多)。

我正在研究如何使用 prometheus 执行此操作,但不确定我是否正确地做事(这方面的文档有点缺乏)。

我做的第一件事是定义一个摘要指标来衡量 API 的执行时间。我正在使用规范的 rate(sum)/rate(count) 解释here

现在,由于我知道延迟可能受输入大小的影响,我还想在平均执行时间上叠加请求大小。由于我不想测量每个可能的尺寸,我想我会使用直方图。像这样:

Histogram histogram = Histogram.build().buckets(10, 30, 50)
        .name("BULK_REQUEST_SIZE")
        .help("histogram of bulk sizes to correlate with duration")
        .labelNames("method", "entity")
        .register();
Run Code Online (Sandbox Code Playgroud)

注意:术语“大小”与字节大小无关,而是与需要处理的集合的长度有关。2 件、5 件、50 件……

在执行中我做(简化):

@PUT
void process(Collection<Entity> entitiesToProcess, string entityName){
   Timer t = summary.labels("PUT_BULK", entityName).startTimer()

      // process...

   t.observeDuration();
   histogram.labels("PUT_BULK", entityName).observe(entitiesToProcess.size())
}
Run Code Online (Sandbox Code Playgroud)

题:

  • 后来当我查看 Grafana 中的 BULK_REQUEST_SIZE_bucket 时,我看到所有存储桶都具有相同的值,所以很明显我做错了什么。
  • 有没有更规范的方法来做到这一点?

bri*_*zil 1

您的代码是正确的(尽管bulk_request_size_bytes这将是一个更好的指标名称)。

问题可能是您的存储桶不是最理想的,因为 10、30 和 50 字节对于大多数请求大小来说都非常小。我会尝试更大的存储桶尺寸来覆盖更典型的值。