jmx - 指标名称已存在 - 指标注册表
问题描述
我正在使用指标注册表将指标记录到 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>
解决方案
通常,您希望创建仪表并注册一次,例如从 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);
}
推荐阅读
- r - 通过组调用将单独的 data.table 调用组合成一个
- azure-devops - 将输出变量传递到不同的阶段
- javascript - 在 React JSX 中的 div 之间切换
- python - 跳过字典列表中的服务器而不是停止代码
- c++ - 如果我知道元素的数量,如何在 std::vector 的开头插入一个新元素而没有任何复制和默认构造开销?
- python - 如何在等式中添加“*”?
- android - NativeScript中PDF打印的Android实现
- pandas - 将 10 到 40 分钟随机添加到 pandas 中的日期时间列
- python - 试图让 pygame 加载图像。以前可以用,现在突然进不了游戏了
- reference - mssql 中的传入引用和传出引用