问题描述
是否可以在休息端点中公开所有 Spring 指标?
在我们的环境中,Micrometer 无法直接将指标转发到我们的监控系统,然后我的想法是将所有指标公开在一个休息端点(或文件,json 格式,但端点是可取的),然后有一个脚本一次获取所有指标,操作有效负载并将指标转发到我们自定义的监控 API。
如果千分尺不是正确的选择,那是什么?
编辑
我尝试使用执行器/普罗米修斯端点。我可以看到端点,但是一旦我到达端点,它就会挂起并且不返回任何内容:
我使用的是 spring boot 2.2.2 并且我添加了这个依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<version>1.3.1</version>
</dependency>
应用程序.yml
management:
endpoints:
web:
exposure:
include: health,metrics,prometheus
解决方法
您可以使用 Spring Boot 的 built-in prometheus
endpoint。它公开了所有基于 Micrometer 的指标。它主要用于 Prometheus 服务器定期获取,但您可以在自己的脚本中执行类似操作,将数据转换为必要的格式并将其转发到您的自定义监控 API。
就您的想法而言,您所做的一切都是正确的,而 Micrometer 确实是实现这一目标的方法。
在 pom.xml
定义级别,不需要设置版本:
如果您的 Spring Boot 附带的版本或 micrometer/micrometer-prometheus
模块与您的定义发生冲突,则它可能无法正常工作。
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
除此之外,如果您只使用 core-micrometer(甚至没有 prometheus 集成),您就有 metrics
端点,它也以“通用”格式显示所有指标。 Prometheus 以普罗米修斯可以抓取的格式显示指标。对于您的用例,似乎两种方式都可以工作,但您必须熟悉您选择的任何一种方式的格式。
另一个想法:您说应用程序无法转发到监控系统,是因为某些安全限制还是因为您使用了某种自定义解决方案或微米无法集成的东西? 如果不是安全问题,您可以考虑编写自己的千分尺注册表,作为千分尺和监控系统之间的桥梁。
我还想回答一件事:你说端点没有完成。
我只能推测,因为基本上可能有很多原因(其中一个是我上面提到的版本冲突) - 但都是错误,它不应该那样工作。
另一个原因是您可能已经定义了一个以微米为单位的 Gauge,为了进行计算,它会执行一些“昂贵”的计算:访问由于某种原因需要很长时间才能访问的数据库,调用一些昂贵的 http 端点等。
当其余端点被调用时,它会获取所有计量原语的“快照”(当前值),对于仪表,它实际上会调用您可以执行任何操作的自定义代码,所以我会检查一下。
另一个原因可能是连接/安全配置(请求根本没有到达执行器),但鉴于您提供的信息,我不能说更多...