1

我们有这个花哨的监控系统,我们的 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")
    }
}

这有两个问题:首先它总是返回零,所以很明显我做错了。我只是无法弄清楚它是什么。其次,即使它会返回一个合理的值,我也没有办法通过时间来限制它(我通常需要当月上传的图像数量)。

让我担心的是,虽然我可以找到很多关于如何用千分尺发布数据的文档,但我似乎找不到任何关于如何查询的文档。测微计是否只设计用于发布监测数据,而不是用于查询?.getOrPut() 方法表明它可以同时做这两个,但由于据我所知查询数据似乎没有记录,这可能是我的一个误解。

有一个用于 Java 的 influx-db 客户端,我接下来会尝试,但归根结底,我不希望我的应用程序中的多个组件仅仅因为我不熟悉我继承的工具而做同样的事情.

4

1 回答 1

1

InfluxMeterRegistry是 a StepMeterRegistry,所以Counter从它创建的是 a StepCounterStepCounter.increment()增加当前步骤中的计数,但StepCounter.count()将返回上一步中的计数。这就是为什么你看到 0count()虽然你已经调用increment()了几次。下一步就可以看到了,默认步长是1分钟,所以要等1分钟才能看到。

请参阅以下测试以了解其工作原理:https ://github.com/izeye/sample-micrometer-spring-boot/blob/influx/src/test/java/com/izeye/sample/InfluxMeterRegistryTests.java

于 2018-10-05T12:04:01.223 回答