使用 Prometheus + Grafana + Spring Boot Actuator 监控应用
在企业级的应用中,监控往往至关重要,监控可以帮助我们预防故障,预测变化趋势,在达到阈值的时候报警,为排查生产问题提供更多的信息。如果我们不知道我们程序的运行情况,当线上系统出现了事故再去排查就需要花费更多的时间,如果能提前监控,就能早做准备,以免出了事故之后乱了手脚,当然也避免不了系统不产生一点事故,但是能减少系统事故的产生。同时也能看到系统问题,早做优化,避免更大的事故发生。
1. Spring Boot Actuator
根据官网介绍,Spring Boot包含了很多附加功能帮助我们监控和管理我们的应用,可以使用HTTP或者JMX等方式通过端点(endpoint)获取应用的健康状态以及其他指标收集。
Spring Boot Actuator模块就是Spring Boot提供的集成了上面所述的监控和管理的功能。像Spring Boot其他模块一样开箱即用,非常方便,通过Actuator就可以使用HTTP或者JMX来监控我们的应用。
JMX(Java Management Extensions):Java平台的管理和监控接口,任何程序只要按JMX规范访问这个接口,就可以获取所有管理与监控信息。
下面简单介绍下Spring Boot Actuator是如何使用的,具体的使用方法见官方文档,官方的文档是永远值得相信的。
1.1 添加依赖
如果使用maven管理,则是:
如果使用Gradle,则是下面这样的:
1.2 开启端点
Spring Boot中监控应用或者与应用交互都是通过端点(endpoint
)进行的,Spring Boot提供了非常多的原生端点,比如health
,可以帮助我们监控应用的监控状态(是否可用),同时可以添加自定义的端点。每个端点都可以单独设置是否开启,并通过HTTP或者JMX暴露给外部系统。如果选择HTTP方式,则URL的前缀一般是/actuator
,比如health
的url地址就是/actuator/health
。
默认情况下,除了shutdown
(让系统优雅的关闭) ,其他端点默认是开启的。我们可以通过management.endpoint.<id>.enabled
设置某个端口的状态,比如开启shutdown端口。
1.3 暴露端点
开启端点后还必须暴露端点给HTTP或者JMX才能正常使用,但是端口可能包含一些敏感的数据,所以Spring Boot的原生端口默认只支持HTTP或者JMX,比如shutdown
端口默认只支持JMX,health
端口即支持JMX,也支持HTTP。
ID | JMX | Web |
---|---|---|
| Yes | No |
| Yes | No |
| Yes | No |
| Yes | No |
| Yes | No |
| Yes | No |
| Yes | No |
| Yes | Yes |
| N/A | No |
| Yes | No |
| Yes | No |
| Yes | No |
| N/A | No |
| N/A | No |
| Yes | No |
| Yes | No |
| Yes | No |
| Yes | No |
| N/A | No |
| Yes | No |
| Yes | No |
| Yes | No |
| Yes | No |
| Yes | No |
| Yes | No |
如果要改变端口暴露的方式,使用include
或者exclude
属性,比如:
到目前为止,Spring Boot Actuator就配置好了,除了上述所看到的端点的开启和暴露方式,还有HTTP,JMX,日志,指标(Metrics),权限,HTTP追踪,进程监控等功能,如果想了解更多,可以去官网进一步学习。
2. Prometheus
Prometheus,中文名普罗米修斯,是新一代的监控系统,与其他监控系统相比,具有易于管理,监控服务的内部运行状态,强大的数据模型,强大的查询语言PromQL,高效,可扩展,易于集成,可视化,开放性等众多功能。详细内容可见官网,此处不再详细介绍。
在Spring Boot中,原生支持了prometheus端口,只需要通过如下配置就可集成Prometheus暴露给HTTP。
除了上述配置外,还需要配置metrics,因为如果没有这个参数,很多报表不能正常显示。(此处没有深入研究,道歉...)
这样就把Prometheus的客户端配置好了,另外就还需要服务端,这里我们使用docker方式,首先需要配置文件prometheus.yml
创建docker-compose.yml
,注意prometheus.yml
与docker-compose.yml
的相对路径,如果放在同样的目录下,volumes则为- './prometheus.yml:/etc/prometheus/config.yml'
。
然后直接使用命令docker-compose up -d
启动即可,docker compose的使用另寻了解,此处不再详细介绍。
启动之后,在浏览器中访问http://localhost:9090
然后,可以查看不同指标的监控数据,比如jvm_memory_used_bytes
这样,我们就通过Prometheus已经可以看到Spring Boot不同指标的监控数据了,那么为什么还需要Grafana呢,不集成Grafana也是可以的,但是通过Grafana,我们可以更加方便快捷的可视化的查看监控数据,最终的成果如下图所述:
如果感兴趣的话,继续往下看哟。
3. Grafana
3.1 介绍
Grafana是一个可视化面板,可以展示非常漂亮的图标和布局,支持Prometheus,SQL(MySQL,PostgreSQL)等作为数据源。
有如下特点:
可视化:非常精美的各种组件可供选择,比如图表,文本,提醒事项,还有灵活的布局,可以自由配置你的可视化面板。
数据源:目前支持Prometheus,Graphite,Loki,Elasticsearch,MySQL,PostgreSQL,Stackdriver和TestData DB等多种数据源。
通知提醒:通过可视化的方式配置通知规则,在数据达到阈值时,将配置好的信息发送给指定管理员。
混合数据源:在同一个图中混合不同的数据源,基于每个查询指定数据源。
3.2 安装
还是使用docker compose的方式安装,docker-compose.yml
如下:
此处可以与Prometheus合并到一个docker compose中,如果合并则是:
然后再通过命令docker-compose up -d
启动,在浏览器中访问http://localhost:3000
,并使用初始账号admin:admin
登录。
3.3 配置
3.3.1 添加数据源
登录之后,选择添加数据源,选择Prometheus。
输入数据源名称(任意),Prometheus的url地址,然后点击添加保存。
3.3.2 创建仪表盘
下一步就是创建仪表盘,在这里有两个选择,其一是创建新的仪表盘,选择不同的组件,设置布局,还有一种方式是选择grafana官方或者社区提供的仪表盘,而且他们的样式都十分精美,可以直接导入。这里我们选择导入仪表盘,因为我们是Java应用,重点关注的肯定是JVM相关的指标,所以我们搜索JVM,通过安装量进行排序。
点击第一个,这个仪表盘包含了JVM,线程,CPU等指标,我们就导入这个,当然你也可以选择其他的仪表盘或者自建。
在Grafana.com Dashboard
处输入4701。
选择数据源,点击导入。
最终呈现的仪表盘就如下图:
4. 总结
这篇主要从Spring Boot Actuator入手,介绍了Spring Boot应用监控的端点和暴露方式,接着就以端点Prometheus为例,介绍了Prometheus的基本概念和如何使用的,Spring Boot Actuator + Prometheus就已经能完成可视化监控应用了,但是Prometheus的可视化还是比较粗糙,这个时候Grafana就出场了,通过Grafana和Prometheus就可以实现完美的可视化仪表盘。
另外除了监控应用外,我们平时使用的还有数据库,那么我们如果通过Grafana和Prometheus监控数据库实例的相关指标呢,下一篇文章见。
最后更新于