用千分尺查询数据
querying data with micrometer
我们有这个奇特的监控系统,我们的 spring-boot 服务正在 post 将指标发送到带有千分尺的流入数据库。有一个很好的 grafana 前端,但问题是我们现在处于这样一个阶段,我们必须在其他服务中提供其中一些指标才能进行推理。
整个系统都是我前任搞出来的,我现在对它的了解几乎为零。我可以添加 post 新指标,但我终其一生都无法从中得到任何 。
这是一个简短的例子:
我们的网关会为相机 post 拍摄的每个图像递增计数器。计数器的定义如下所示:
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")
}
}
这有两个问题:首先它总是 return 为零,所以显然我做错了。我只是不知道它是什么。
其次,即使它 return 是一个合理的值,我也没有办法按时间限制它(我通常需要当月上传的图片数量)。
让我担心的是,虽然我可以找到很多关于如何使用千分尺 post 数据的文档,但我似乎找不到任何关于如何查询的文档。 Micrometer 是不是只能post 监控数据,不能查询? .getOrPut() 方法表明它可以同时执行这两项操作,但据我所知,查询数据似乎没有记录,这可能是我的误解。
有一个用于 Java 的 influx-db 客户端,接下来我将尝试使用它,但归根结底,我不希望我的应用程序中的多个组件只因为我做同样的事情我对继承的工具不熟悉
InfluxMeterRegistry
是一个StepMeterRegistry
,所以从它创建的Counter
是一个StepCounter
。 StepCounter.increment()
增加当前步骤中的计数,但 StepCounter.count()
将 return 增加上一步中的计数。这就是为什么您在 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 服务正在 post 将指标发送到带有千分尺的流入数据库。有一个很好的 grafana 前端,但问题是我们现在处于这样一个阶段,我们必须在其他服务中提供其中一些指标才能进行推理。 整个系统都是我前任搞出来的,我现在对它的了解几乎为零。我可以添加 post 新指标,但我终其一生都无法从中得到任何 。
这是一个简短的例子: 我们的网关会为相机 post 拍摄的每个图像递增计数器。计数器的定义如下所示:
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")
}
}
这有两个问题:首先它总是 return 为零,所以显然我做错了。我只是不知道它是什么。 其次,即使它 return 是一个合理的值,我也没有办法按时间限制它(我通常需要当月上传的图片数量)。
让我担心的是,虽然我可以找到很多关于如何使用千分尺 post 数据的文档,但我似乎找不到任何关于如何查询的文档。 Micrometer 是不是只能post 监控数据,不能查询? .getOrPut() 方法表明它可以同时执行这两项操作,但据我所知,查询数据似乎没有记录,这可能是我的误解。
有一个用于 Java 的 influx-db 客户端,接下来我将尝试使用它,但归根结底,我不希望我的应用程序中的多个组件只因为我做同样的事情我对继承的工具不熟悉
InfluxMeterRegistry
是一个StepMeterRegistry
,所以从它创建的Counter
是一个StepCounter
。 StepCounter.increment()
增加当前步骤中的计数,但 StepCounter.count()
将 return 增加上一步中的计数。这就是为什么您在 count()
中看到 0,尽管您已经多次调用 increment()
。下一步可以看到,默认步长是1分钟,所以要等1分钟才能看到。
查看以下测试以了解其工作原理:https://github.com/izeye/sample-micrometer-spring-boot/blob/influx/src/test/java/com/izeye/sample/InfluxMeterRegistryTests.java