代码之家  ›  专栏  ›  技术社区  ›  Phil

普罗米修斯+测微计:如何记录时间间隔和成功/失败率

  •  0
  • Phil  · 技术社区  · 5 年前

    我从前端客户端向metrics微服务发送一个JSON,其中包含以下数据:

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

    @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中计算,那就太好了。

    另外,我可以在registry.timer中放置一个成功/失败标记吗?我想我需要对每个请求使用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错误代码,而不是布尔值,因此我不确定如何以可维护的方式实现它

    0 回复  |  直到 5 年前
        1
  •  0
  •   8t12c7081    5 年前
    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信息放入另一个标记并发送出去。