Запрос данных с помощью микрометра
У нас есть эта причудливая система мониторинга, в которую наши сервисы весенней загрузки отправляют метрики в приточную БД с микрометром. Есть хороший интерфейс графана, но проблема в том, что мы сейчас находимся на этапе, когда нам нужно иметь некоторые из этих метрик в других сервисах, чтобы рассуждать. Вся система была создана моим предшественником, и мое нынешнее понимание этого практически равно нулю. Я могу добавлять и публиковать новые метрики, но я не могу ничего для себя извлечь из этого.
Вот краткий пример: наш шлюз увеличивает счетчик для каждого изображения, которое камера отправляет на него. Определение счетчика выглядит так:
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() может указывать на то, что он может выполнять и то, и другое, но поскольку запросы к данным кажутся недокументированными, насколько я могу судить, это может быть ошибочным с моей стороны.
Существует клиент Infliff-DB для Java, который я попробую позже, но в конце дня я не хочу, чтобы несколько компонентов в моем приложении делали одно и то же только потому, что я не знаком с инструментами, которые я унаследовал,
1 ответ
InfluxMeterRegistry
это StepMeterRegistry
так что создал Counter
от этого StepCounter
, StepCounter.increment()
увеличивает счетчик на текущем шаге, но StepCounter.count()
вернет счет в предыдущем шаге. Вот почему вы видите 0 с count()
хотя вы уже вызвали increment()
несколько раз. Вы можете увидеть его на следующем шаге, шаг по умолчанию - 1 минута, поэтому вам нужно подождать 1 минуту, чтобы увидеть его.
Посмотрите следующий тест, чтобы получить представление о том, как это работает: https://github.com/izeye/sample-micrometer-spring-boot/blob/influx/src/test/java/com/izeye/sample/InfluxMeterRegistryTests.java