我们拥有这个花哨的监控系统,我们的春季启动服务会将其发布到带有千分尺的嵌入式DB上。有一个很好的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")
}
}
这有两个问题:首先,它总是返回零,所以很明显我做错了。我只是不知道那是什么。 其次,即使它返回一个合理的值,我也看不到一种按时间限制此值的方法(我通常需要当月上传的图像数)。
让我担心的是,尽管我可以找到很多有关如何使用千分尺发布数据的文档,但似乎找不到任何有关如何查询的文档。测微计是否仅设计为发布监视数据,而不是查询数据? .getOrPut()方法将表明它可以同时执行这两种操作,但是就我所知,由于查询数据似乎没有记载,因此对我而言可能是一种误解。
有一个Java的influx-db客户端,我将在接下来尝试,但是到最后,我不希望我的应用程序中的多个组件执行相同的操作只是因为我不熟悉我继承的工具。
答案 0 :(得分:0)
InfluxMeterRegistry
是StepMeterRegistry
,因此从其创建的Counter
是StepCounter
。 StepCounter.increment()
在当前步骤中增加计数,但是StepCounter.count()
将在上一步中返回计数。因此,尽管您已经多次调用count()
,但increment()
却显示为0。您可以在下一步中看到它,默认步骤是1分钟,因此您必须等待1分钟才能看到它。
请参阅以下测试以了解其工作原理:https://github.com/izeye/sample-micrometer-spring-boot/blob/influx/src/test/java/com/izeye/sample/InfluxMeterRegistryTests.java