【发布时间】:2020-07-31 10:02:27
【问题描述】:
这听起来很傻,可能有一个非常简单的答案,但我还没有找到。
Micrometer 具有以下形式的每种度量类型的 Builder 类:
<MetricType>.builder(<metricName>).description(<description>).tags(<tagsArray>).register(<meterRegistry>)
让我们以计数器指标为例。可以按如下方式递增:
<meterRegistry>.Counter(<counterName>, <Pairs of labels and their values>).increment()
当你想设置描述时,问题就出现了。如果标签的值本质上是动态的,即值是在运行时确定的,或者标签的可能组合太多,比如 10+,那么你应该如何设置描述?
我能想到的唯一解决方案是在启动度量服务时将描述存储在某处。然后围绕增量方法创建一个包装器。现在,当用户调用包装器时,调用 register 方法(带有存储的描述),然后调用 increment 方法。如果注册方法不存在,则注册方法会创建一个新指标,否则返回现有指标。
同样的问题可以在 Prometheus 中轻松解决,因为它们有一个注册方法,可让您设置所有标签(即仅键)和描述。增量方法只需要这些标签的值。
千分尺是否提供类似的功能?为简单的应用程序创建包装器似乎非常不方便。考虑到千分尺已经是 Prometheus(和其他检测服务)的包装器,我也不想围绕它创建一个包装器。
如果问题没有意义,以下示例可能会有所帮助:
让我们考虑一个带有标签type 的计数器指标requests,其值可以是alpha, beta, gamma,描述为tracks requests from clients
然后作为解决方案,我可以在启动度量服务时调用的注册函数中添加以下行。
Counter.builder("requests")
.description("tracks requests from clients)
.tags("type", "alpha")
.register(meterRegistry);
然后无论我想在哪里使用这个指标,我都可以运行以下代码:
meterRegistry.Counter("request", "type", <valueOfType>).increment()
我担心的是,在这个解决方案中,我只启动了 alpha 类型,这似乎不正确,因为这是唯一的类型。另一种选择是注册所有 3 种类型,但是,这是假设所有可能的值在运行时都是已知的。如果在运行时发现这些值,则此解决方案将完全失败,现在您必须使用带有上述包装器的解决方案,或者完全忘记描述。
【问题讨论】:
标签: java prometheus metrics micrometer