如何根据标签更新 MicroMeter 量规
How to update MicroMeter gauge according to labels
我在 Spring Boot 2 应用程序中使用 MicroMeter 仪表来跟踪对象的状态。在状态更改时,调用 statusArrived()
方法。此函数应更新与该对象相关的仪表。
这是我当前的实现:
public class PrometheusStatusLogger {
private int currentStatus;
public void statusArrived(String id, int value) {
currentStatus = value;
Tags tags = Tags.of("product_id", id);
Gauge.builder("product_status",this::returnStatus)
.tags(tags)
.strongReference(true)
.register(Metrics.globalRegistry);
}
private int returnStatus(){
return currentStatus;
}
}
这很好用,但问题是调用此方法时,所有仪表值都会更新。我只想更新具有给定 product_id
的仪表。
输入:
statusArrived(1, 2);
statusArrived(2, 3);
当前输出:
product_status{product_id=1} 3
product_status{product_id=2} 3
所有仪表已更新
期望输出:
product_status{product_id=1} 2
product_status{product_id=2} 3
仅更新具有给定 product_id 标签的仪表。
我怎样才能做到这一点?
由于您所有的仪表都引用相同的 currentStatus
,当新值出现时,所有仪表的来源都会更改。而是使用地图通过 id:
跟踪所有当前状态
public class PrometheusStatusLogger {
private Map<String, Integer> currentStatuses = new HashMap<>();
public void statusArrived(String id, int value) {
if(!currentStatuses.containsKey(id)) {
Tags tags = Tags.of("product_id", id);
Gauge.builder("product_status",currentStatuses, map -> map.get(id))
.tags(tags)
.register(Metrics.globalRegistry);
}
currentStatuses.put(id, value);
}
}
我在 Spring Boot 2 应用程序中使用 MicroMeter 仪表来跟踪对象的状态。在状态更改时,调用 statusArrived()
方法。此函数应更新与该对象相关的仪表。
这是我当前的实现:
public class PrometheusStatusLogger {
private int currentStatus;
public void statusArrived(String id, int value) {
currentStatus = value;
Tags tags = Tags.of("product_id", id);
Gauge.builder("product_status",this::returnStatus)
.tags(tags)
.strongReference(true)
.register(Metrics.globalRegistry);
}
private int returnStatus(){
return currentStatus;
}
}
这很好用,但问题是调用此方法时,所有仪表值都会更新。我只想更新具有给定 product_id
的仪表。
输入:
statusArrived(1, 2);
statusArrived(2, 3);
当前输出:
product_status{product_id=1} 3
product_status{product_id=2} 3
所有仪表已更新
期望输出:
product_status{product_id=1} 2
product_status{product_id=2} 3
仅更新具有给定 product_id 标签的仪表。
我怎样才能做到这一点?
由于您所有的仪表都引用相同的 currentStatus
,当新值出现时,所有仪表的来源都会更改。而是使用地图通过 id:
public class PrometheusStatusLogger {
private Map<String, Integer> currentStatuses = new HashMap<>();
public void statusArrived(String id, int value) {
if(!currentStatuses.containsKey(id)) {
Tags tags = Tags.of("product_id", id);
Gauge.builder("product_status",currentStatuses, map -> map.get(id))
.tags(tags)
.register(Metrics.globalRegistry);
}
currentStatuses.put(id, value);
}
}