Название метрики уже существует - Реестр метрик - PullRequest
0 голосов
/ 18 апреля 2019

Я использую реестр метрик для регистрации метрики в jmx.Я использую приведенный ниже код

protected void submitMetric(String metricName, long value) {

                mr.register(metricName, new Gauge<Long>() {

                    @Override
                    public Long getValue() {
                        return value;
                    }

                });
}

Впервые работает нормально.Если я пытаюсь сделать это снова, я получаю ошибку Метрика с именем ***** уже существует .Но я хотел бы регистрировать значение для одной и той же метрики для каждого запроса, который я отправляю контроллеру, чтобы я мог визуализировать в Grafana.

Есть ли способ записать значения для одного и того же имени метрики для каждогоrequest?

Также, как проверить все данные, зарегистрированные в журнале за каждую 1 минуту.Должны ли мы суммировать значения за каждую минуту?У меня есть ниже в metrics.xml

<publish name="****">
            <delay>60</delay>
            <unit>SECONDS</unit>
        </publish>

1 Ответ

0 голосов
/ 18 апреля 2019

Обычно вы хотите создать датчик и зарегистрировать его один раз, скажем, путем создания датчика из AtomicLong.Затем вы просто обновляете значение датчика, устанавливая значение в AtomicLong.В этом случае, поскольку вы хотите получить доступ к датчику по имени, вы можете сохранить карту AtomicLongs и зарегистрировать датчик один раз, когда карта обновится новым датчиком:

final Map<String, AtomicLong> gauges = new ConcurrentHashMap<>();

protected void submitMetric(String metricName, long value) {
    // If the gauge does not exist, create and register it
    gauges.computeIfAbsent(metricName, k -> {
        AtomicLong g = new AtomicLong();
        mr.register(k, new Gauge<Long>() {
            @Override
            public Long getValue() {
                return g.get();
            }
        });         
        return g;
    }).set(value); // Then set the value
    // Counters can be retrieved by name
    mr.counter(metricName + "Counter").inc(value);
    // Meters can be retrieved by name
    mr.meter(metricName + "Meter").mark(value);
}
...