Это может показаться глупым и может дать действительно простой ответ, но я еще не нашел его.
Микрометр имеет классы Builder для каждого типа метрики следующего вида:
<MetricType>.builder(<metricName>).description(<description>).tags(<tagsArray>).register(<meterRegistry>)
В качестве примера возьмем показатели счетчика. Его можно увеличить следующим образом:
<meterRegistry>.Counter(<counterName>, <Pairs of labels and their values>).increment()
Проблема возникает, когда вы хотите задать описание. Если значения меток являются динамическими по своей природе, то есть значения определяются во время выполнения или если возможная комбинация меток слишком много, например 10+, то как вы должны установить описание?
Единственное решение, которое я мог придумать, - это где-нибудь сохранить описание при запуске метрической службы. Затем создайте оболочку вокруг метода приращения. Теперь, когда пользователь вызывает оболочку, вызовите метод регистрации (с сохраненным описанием), а затем метод приращения. И, как правило, метод register создает новую метрику, если она не существует, в противном случае возвращает существующую метрику.
Эту же проблему можно легко решить в Prometheus, поскольку у них есть метод регистрации, который позволяет вам устанавливать все метки (т.е. только ключи) и описание. Тогда метод приращения требует только значений этих меток.
Обеспечивает ли микрометр аналогичную функциональность? Создание оболочки для простого приложения кажется крайне неудобным. И учитывая, что микрометр уже является оболочкой для Prometheus (и других инструментальных сервисов), я также не хочу создавать оболочку вокруг него.
Если вопрос не имеет смысла, может помочь следующий пример:
Рассмотрим метрику счетчика requests
с меткой type
, значение которой может быть alpha, beta, gamma
с описанием tracks requests from clients
Затем в качестве решения я могу добавить следующую строку в функцию регистрации, вызываемую при запуске метрической службы.
Counter.builder("requests")
.description("tracks requests from clients)
.tags("type", "alpha")
.register(meterRegistry);
И затем, где бы я ни хотел использовать эту метрику, я могу запустить следующий код:
meterRegistry.Counter("request", "type", <valueOfType>).increment()
Меня беспокоит то, что в этом решении я инициирую только тип alpha
, который кажется неправильным, поскольку это единственный тип. Другой вариант - зарегистрировать все 3 типа, однако при этом предполагается, что все возможные значения известны во время выполнения. Если значения обнаруживаются во время выполнения, это решение полностью не работает, и теперь вам придется использовать решение с оболочками, как описано выше, или полностью забыть описание.