Запрос данных с помощью микрометра

У нас есть эта причудливая система мониторинга, в которую наши сервисы весенней загрузки отправляют метрики в приточную БД с микрометром. Есть хороший интерфейс графана, но проблема в том, что мы сейчас находимся на этапе, когда нам нужно иметь некоторые из этих метрик в других сервисах, чтобы рассуждать. Вся система была создана моим предшественником, и мое нынешнее понимание этого практически равно нулю. Я могу добавлять и публиковать новые метрики, но я не могу ничего для себя извлечь из этого.

Вот краткий пример: наш шлюз увеличивает счетчик для каждого изображения, которое камера отправляет на него. Определение счетчика выглядит так:

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

Другие вопросы по тегам