我们有这个奇特的监控系统,我们的 spring-boot 服务通过千分尺将指标发布到流入数据库。有一个不错的 grafana 前端,但问题是我们现在处于这样一个阶段:我们必须在其他服务中提供其中一些指标来进行推理。 整个体系是我的前任建立的,我现在对它的了解几乎为零。我可以添加和发布新指标,但我一生都无法从中获得任何东西。
这是一个简短的示例: 我们的网关会为相机向其发送的每张图像增加计数器。计数器的定义如下所示:
private val imageCounters = mutableMapOf<String, Counter>()
private val imageCounter = { camera: String ->
imageCounters.getOrPut(camera) {
registry.counter("gateway.image.counter", "camera", camera)
}
计数器在代码中递增,如下所示:
imageCounter("placeholder-id").increment()
现在我们正在改进计费,计费服务需要知道某个摄像机有多少图像通过了网关。因此,我尝试的第一件事自然是这样的:
class MonitoringService(val metrics: MeterRegistry) {
private val log = logger()
private val imageCounters = mutableMapOf<String, Counter>()
private val imageCounter = { camera: String ->
imageCounters.getOrPut(camera) {
metrics.counter("gateway.image.counter", "camera", camera)
}
}
fun test() {
val test = imageCounter("16004").count()
val bugme = true
log.info("influx test: $test")
}
}
这有两个问题:首先它总是返回零,所以显然我做错了。我就是不明白那是什么。 其次,即使它会返回一个合理的值,我也没有找到一种方法来限制时间(我通常需要当月上传的图像数量)。
令我担心的是,虽然我可以找到很多有关如何使用千分尺发布数据的文档,但我似乎找不到任何有关如何查询的文档。 Micrometer是不是只能发布监控数据,不能查询? .getOrPut() 方法表明它可以同时执行这两种操作,但据我所知,由于查询数据似乎没有记录,这可能是我的误解。
有一个 Java 的 influx-db 客户端,我接下来会尝试一下,但最终我不希望我的应用程序中的多个组件仅仅因为我不熟悉而做同样的事情我继承的工具。
最佳答案
InfluxMeterRegistry
是一个 StepMeterRegistry
,因此从中创建的 Counter
是一个 StepCounter
。 StepCounter.increment()
增加当前步骤中的计数,但 StepCounter.count()
将返回上一步中的计数。这就是为什么您在 count()
中看到 0,尽管您已经调用了 increment()
多次。您可以在下一步中看到它,默认的步骤是1分钟,所以您必须等待1分钟才能看到它。
请参阅以下测试以了解其工作原理:https://github.com/izeye/sample-micrometer-spring-boot/blob/influx/src/test/java/com/izeye/sample/InfluxMeterRegistryTests.java
关于spring-boot - 用千分尺查询数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52661701/