我有一段 Java 代码,它使用微米库来报告有关每个租户中失败作业的指标。它正确报告每个租户的失败作业,因为我在 Grafana 上验证了它,但问题是,当租户的失败作业数量增加或减少时,更新不会反映在 Grafana 上。我该怎么做才能让每次更新都反映在 Grafana 上?
@Component
@RequiredArgsConstructor
public class FailedJobsGaugeReporter {
private final ManagementService managementService;
@Scheduled(fixedDelayString = "3000", initialDelayString = "1000")
public void reportFailedJobGauge() {
List<Job> list = managementService.createFailedJobQuery().listPage(0, 999);
Map<String, Long> countByTenantId = list.stream()
.collect(Collectors.groupingBy(Job::getTenantId, Collectors.counting()));
String name = "rc_job_failed_gauge";
MeterRegistry registry = ApplicationContextHolder.getBean(PrometheusMeterRegistry.class);
for (Map.Entry<String, Long> entry : countByTenantId.entrySet()) {
Tag tag = Tag.of("tenant", entry.getKey());
Gauge.builder(name, entry::getValue).tags(List.of(tag)).strongReference(true).register(registry);
}
}
}
您不应该每次都尝试重新创建
Gauge
,但您应该更新 Gauge
的值。请先阅读文档:https://micrometer.io/docs/concepts#_gauges
另请检查 MultiGauge:https://micrometer.io/docs/concepts#_multi_gauge
在你的演员中:
MultiGauge jobs = MultiGauge.builder("jobs")
.tag("failed", "true")
.register(registry);
...
jobs.register(
countByTenantId.entrySet().stream()
.map(entry -> Row.of(Tags.of("tenant", entry.getKey()), entry.getValue()))
.collect(toList())
);
我还认为你应该在作业失败的地方使用
Counter instead not a
Gauge`(如果它是单调计数)。
另外,请不要这样做:
MeterRegistry registry = ApplicationContextHolder.getBean(PrometheusMeterRegistry.class);
MeterRegistry
的方式注射ManagementService
。仪表名称中的分隔符应为
.
,如果是 Prometheus,Micrometer 会将其转换为 _
。