首页 > 解决方案 > 指标名称已存在 - 指标注册表

问题描述

我正在使用指标注册表将指标记录到 jmx 中。我使用下面的代码

protected void submitMetric(String metricName, long value) {

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

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

                });
}

它第一次运行良好。如果我再次尝试这样做,我会收到错误 A metric named ***** already exists。但是我想为发送到控制器的每个请求记录相同指标的值,以便我可以在 Grafana 中进行可视化。

有什么方法可以为每个请求记录相同指标名称的值吗?

还如何检查每 1 分钟记录的所有数据点。我们应该对每分钟的值求和吗?我在metrics.xml中有以下内容

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

标签: jmxspring-boot-actuatorcodahale-metrics

解决方案


通常,您希望创建仪表并注册一次,例如从 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);
}

推荐阅读