Spring Actuator Controller 端点在哪里,我可以通过 jvm 调用以编程方式调用它吗?

Where is the Spring Actuator Controller endpoint and can I call it programmatically with jvm call?

我想找到服务于 Spring 执行器端点 (/actuator) 的实际 java class。

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

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

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

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

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

我弄明白了,并将其发布给其他感兴趣的人。

关键发现:如果启用 prometheus 指标,MeterRegistry@Autowired 实际上是 PrometheusMeterRegistry

将其转换为 PrometheusMeterRegistry 后,您可以调用其 .scrape() 方法来 return 与您访问 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);

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

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

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

你只需要确保提供这些bean

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

@Bean
public CollectorRegistry collectorRegistry() {
  return CollectorRegistry.defaultRegistry;
}