我正在从前端客户端向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错误代码,因此我不确定如何以可维护的方式实现它
答案 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信息放入另一个标签中并通过它发送即可。