java - 在 Micrometer 中设置动态指标描述的简洁方法是什么?

标签 java prometheus metrics micrometer

这可能听起来很愚蠢,而且可能有一个非常简单的答案,但我还没有找到任何答案。

对于以下形式的每个度量类型,Micrometer 都有 Builder 类:

<MetricType>.builder(<metricName>).description(<description>).tags(<tagsArray>).register(<meterRegistry>)

让我们以计数器指标为例。它可以按如下方式递增:

<meterRegistry>.Counter(<counterName>, <Pairs of labels and their values>).increment()

当你想设置描述时,问题就出现了。如果标签的值本质上是动态的,即值是在运行时决定的,或者如果标签的可能组合太多,比如 10+,那么您应该如何设置描述?

我能想到的唯一解决方案是在启动指标服务时将描述存储在某处。然后围绕增量方法创建一个包装器。现在,当用户调用包装器时,调用 register 方法(使用存储的描述),然后调用 increment 方法。并且 afaik register 方法创建一个新的指标,如果它不存在,否则返回现有的指标。

同样的问题可以在 Prometheus 中轻松解决,因为它们有一个注册方法,可以让您设置所有标签(即仅键)和描述。然后增量方法只需要这些标签的值。

千分尺是否提供类似的功能?为一个简单的应用程序创建一个包装器似乎非常不方便。考虑到千分尺已经是普罗米修斯(和其他仪器服务)的包装器,我不想再围绕它创建包装器。

如果问题没有意义,以下示例可能会有所帮助:

让我们考虑一个带有标签 type 的计数器指标 requests ,其值可以是 alpha, beta, gamma 并且描述是 tracks来自客户的请求

作为解决方案,我可以在启动指标服务时调用的注册函数中添加以下行。

Counter.builder("requests")
    .description("tracks requests from clients)
    .tags("type", "alpha")
    .register(meterRegistry);

然后无论我想在何处使用此指标,我都可以运行以下代码:

meterRegistry.Counter("request", "type", <valueOfType>).increment()

我担心的是,在这个解决方案中,我只启动了 alpha 类型,这似乎不正确,因为这是唯一的类型。另一种选择是注册所有 3 种类型,但是,这是假设所有可能的值在运行时都是已知的。如果在运行时发现这些值,则此解决方案将完全失败,现在您必须如上所述使用带有包装器的解决方案或完全忘记描述。

最佳答案

我在尝试使用计数器和单个标签的多个值时遇到了类似的问题。

这是我的解决方案:

@RestController
public class HelloController {

    private final Counter.Builder counter;
    private MeterRegistry registry;

    public HelloController(MeterRegistry registry) {
        this.counter = Counter.builder("counter").description("A description");
        this.registry = registry;
    }

    @GetMapping("/count")
    public String count1() {
        counter.tag("tag2", "value1").register(registry).increment();
// I don't provide more description here, but I need to use .register('registry') at each call.
        return "Count";
    }

    @GetMapping("/count2")
    public String count2() {
        counter.tag("tag2", "value2").register(registry).increment();
        return "Count";
    }

}
  • 注意:我必须调用 counter...register(registry) 才能获得单个描述和标签的多个值。

关于java - 在 Micrometer 中设置动态指标描述的简洁方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63189732/

相关文章:

java - 如何在没有关联窗口的情况下使图像出现在屏幕上

java - 约束连接/绳索/线以避免拉伸(stretch)

prometheus - 替换 Prometheus 标签值中的字符

javascript - 使用 JavaScript 记录热图的用户数据

machine-learning - 如何评估平均倒数排名(mrr)是一个很好的模型

java - 错误: Selected item of spinner is not coverting to string

java - 速记变量赋值

java - 使用Prometheus监控Kubernetes集群中的Spring Boot应用程序

grafana - 普罗米修斯与正则表达式查询不匹配

java - 如何查看jar文件中的文件数量