0

我想找到为 Spring Actuator 端点 ( /actuator) 提供服务的实际 java 类。

它在某种程度上类似于这个问题,但那个人想通过网络 HTTP 调用来调用它。理想情况下,我可以在 JVM 中调用它来节省建立 HTTP 连接的成本。

这样做的原因是因为我们的系统中有 2 个度量框架。我们有一个基于 OpenCensus 的遗留度量框架,我们迁移到 Spring Actuator(基于 Micrometer 的 Prometheus 度量)。我认为 Spring 版本更好,但我没有意识到我的公司围绕旧版本构建了多少基础设施。例如,我们利用使用 OpenCensus 的内部库。Infra 团队依赖于我们应用程序中基于 Opencensus 的指标。所以我们的想法是尝试合并和报告两组指标。

我想创建自己的指标端点,从 Opencensus 的端点和 Actuator 的端点提取数据。我可以对每个进行 HTTP 调用,但我宁愿在 JVM 中调用它们以节省资源并减少延迟。

或者我想错了。我应该只是MeterRegistry.forEachMeter()在我的端点中使用吗?无论如何,我想如果我找到了 Spring Actuator 端点,我可以看到他们如何做的一个例子,并模仿实现,即使我不直接调用它。

奖励:我还需要追踪为其端点提供服务的 Opencensus 处理程序,并且可能会为此发表另一篇文章,但如果您也知道答案,请分享!

4

2 回答 2

0

我想通了并将其发布给其他感兴趣的人。

关键发现:如果您启用普罗米修斯指标MeterRegistry,那@Autowired实际上是一个。PrometheusMeterRegistry

将其转换为PrometheusMeterRegistry后,您可以调用其.scrape()方法以返回与点击 http 端点时完全相同的指标打印输出。

我还需要从 OpenCensus 获取相同的信息,并且我也找到了一种方法。

这是从两个框架中获取指标的代码片段

Enumeration<MetricFamilySamples> openCensusSamples = CollectorRegistry.defaultRegistry.filteredMetricFamilySamples(ImmutableSet.of());
StringWriter writer = new StringWriter();
TextFormat.write004(writer, openCensusSamples);
String openCensusMetrics = writer.toString();

PrometheusMeterRegistry registry = (PrometheusMeterRegistry) meterRegistry;
String micrometerMetrics = registry.scrape();

return openCensusMetrics.concat(micrometerMetrics);
于 2021-06-25T23:27:55.590 回答
0

我发现了另一种有趣的方法。

我给出的另一个答案,但它有一个问题。它包含重复的结果。当我查看它时,我意识到 OpenCensus 和 Micrometer 都报告了相同的结果。

事实证明,PrometheusScrapeEndpoint实现使用与CollectorRegistryOpenCensus 相同的实现,因此两组指标都被添加到同一个注册表中。

您只需要确保提供这些 bean

@PostConstruct
public void openCensusStats() {
    PrometheusStatsCollector.createAndRegister();
}

@Bean
public CollectorRegistry collectorRegistry() {
  return CollectorRegistry.defaultRegistry;
}
于 2021-06-29T22:06:42.007 回答