Prometheus +千分尺:如何记录时间间隔和成功/失败率

时间:2019-02-28 11:10:36

标签: spring metrics prometheus micrometer

我正在从前端客户端向metrics-微服务发送一个包含以下数据的JSON:

{
    totalTimeOnTheNetwork: number;
    timeElasticsearch: number;
    isSuccessful: boolean;
}

metrics-microservice当前处理这样的数据:

@AllArgsConstructor
@Service
public class ClientMetricsService {
    @Autowired
    MeterRegistry registry; // abstract class, SimpleMeterRegistry gets injected
    public void metrics(final MetricsProperty metrics) {
        final long networkTime = metrics.getTotalTime() - metrics.getElasticTime();
        registry.timer(ELASTIC_TIME_LABEL).record(metrics.getElasticTime(), TimeUnit.MILLISECONDS);
        registry.timer(TOTAL_TIME_LABEL).record(metrics.getTotalTime(), TimeUnit.MILLISECONDS);
        registry.timer(NETWORK_TIME_LABEL).record(networkTime, TimeUnit.MILLISECONDS);
    }
}

如您所见,我为每个时间间隔创建了一个新指标。我想知道是否可以将所有间隔设为一个度量标准?如果我不必在metrics-microservice上而是在Grafana上计算网络时间,那就太好了。

此外,我可以在成功的注册表中放置一个成功/失败标签吗?我假设我需要在每个请求上使用timer.builder,如下所示:

Timer timer = Timer
    .builder("my.timer")
    .description("a description of what this timer does") // optional
    .tags("region", "test") // optional
    .register(registry);

这是一种典型的方法(例如,在每个HTTP请求上创建一个新计时器并将其链接到注册表)还是应该像我当前版本一样从MeterRegistry派生计时器?

还是您要使用另一个度量标准来记录成功/失败?将来,该指标可能会替换为布尔值,而不是布尔值,例如,http错误代码,因此我不确定如何以可维护的方式实现它

1 个答案:

答案 0 :(得分:0)

Timer timer = Timer
    .builder("your-timer-name-here")
    .tags("ResponseStatus", isSuccessful.toString, "ResponseCode", http-error-code.toString)
    .register(registry);

timer.record(metrics.getTotalTime);

应该是可以回答您问题的有效代码,但是我感觉存在误解。您为什么想要所有指标都统一?

无论哪种方式,您都可以使用标签对其进行分类。我不知道Grafana端的功能,但它可能很简单,只需将.getElasticTime信息放入另一个标签中并通过它发送即可。