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

Posted

技术标签:

【中文标题】Spring Actuator Controller 端点在哪里,我可以使用 jvm 调用以编程方式调用它吗?【英文标题】:Where is the Spring Actuator Controller endpoint and can I call it programmatically with jvm call? 【发布时间】:2021-09-09 03:18:08 【问题描述】:

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

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

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

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

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

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

【问题讨论】:

您可以定期将 OpenCensus 数据添加到 Actuator 中吗?这样你就根本不用调用 Actuator 方法了,可能吗? 是的!我也对此持开放态度 唯一的问题是,micrometer 喜欢为其指标添加后缀(例如 _count、_sum),我们需要保留原始的 opencensus 指标名称。所以无论什么解决方案都必须考虑到这一点 【参考方案1】:

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

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

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

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

这是从两个框架获取指标的代码的 sn-p

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);

【讨论】:

【参考方案2】:

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

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

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

您只需要确保提供这些 bean

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


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

【讨论】:

以上是关于Spring Actuator Controller 端点在哪里,我可以使用 jvm 调用以编程方式调用它吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用Actuator 实现Spring Boot应用监控

Spring Security+Spring Actuator实践

Spring Boot Actuator [监控与管理]

Spring Boot 2.X(十六):应用监控之 Spring Boot Actuator 使用及配置

Spring Boot参考教程内部应用监控(Actuator)

spring-boot-starter-actuator监控接口详解