带弹簧靴的千分尺 - 值未更新

问题描述 投票:0回答:1

我有一段 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);
            }
    }
}
prometheus grafana micrometer gauge
1个回答
0
投票

您不应该每次都尝试重新创建

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);
  1. 您可以按照注射
    MeterRegistry
    的方式注射
    ManagementService
  2. 这不会使用复合注册表,仅使用普罗米修斯,因此如果您有多个注册表(例如:执行器指标端点),这些注册表将不会更新。

仪表名称中的分隔符应为

.
,如果是 Prometheus,Micrometer 会将其转换为
_

© www.soinside.com 2019 - 2024. All rights reserved.