欢迎来到Spring Boot Actuator系列教程的第二部分,在第一部分,你学到了spring-boot-actuator 模块可以做什么,在spring boot application如何配置,以及怎样和各种actuator端点交互。
在本文中,你将学到 spring boot actuator如何和监控系统 Prometheus、被称为图形解决方案Grafana 的集成。
在本文末尾,你还能在本地机子设置Prometheus 和 Grafana dashboard,可视化和监控所有来自Spring Boot application的指标数据。
Prometheus
Prometheus 是一个开源监控系统,它最初是由SoundCloud创建的。
它由下面的核心组件组成:
- 数据刮刀-配置间隔周期性地通过HTTP拉取指标数据
- 时序数据库-存储所有指标数据
- 简单用户接口-可视化,查询、监控所有指标。
Grafana
Grafana 允许你从各种数据源导入数据,像Elasticsearch, Prometheus, Graphite, InfluxDB等等,
并且用漂亮的图表可视化这些数据。
它还可以让你设置基于指标数据的警告规则。当警告状态发生改变时,可以通过email, slack或者其他渠道通知到你。
注意这里,Prometheus dashboard 也有简单的图表,但是Grafana 的图表更好,这就是为什么,本文我们用Prometheus和Grafana集成一起,导入和可视化我们的指标数据。
将Micrometer Prometheus 注册添加到Spring Boot 应用。
Spring Boot 使用 Micrometer一个应用指标外观 ,集成actuator metrics和使用外部监控系统。它支持多个监控系统,像Netflix Atlas, AWS Cloudwatch, Datadog, InfluxData, SignalFx, Graphite, Wavefront, Prometheus 等等。
为了集成 Prometheus,你需要添加micrometer-registry-prometheus 依赖。
<!-- Micrometer Prometheus registry -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
一旦你添加了上面的依赖,Spring Boot将会自动配置一个PrometheusMeterRegistry 和CollectorRegistry 去收集和导出可被Prometheus服务器scraped格式的指标数据.所有application的指标数据在actuator的/prometheus 端点 都可获取,Prometheus服务器通过该端点周期性获取指标数据。
探索Spring Boot Actuator 的/prometheus端点
我们探索prometheus 端点,当micrometer-registry-prometheus依赖可用的时候,它由Spring Boot 暴露出来。
首先,你启动endpoint-discovery页面 http://localhost:8080/actuator 可以看到prometheus 端点信息。
prometheus 端点暴露了被Prometheus服务器格式的指标数据。通过http://localhost:8080/actuator/prometheus你可以看到暴露的指标数据。
# HELP jvm_buffer_memory_used_bytes An estimate of the memory that the Java virtual machine is using for this buffer pool
# TYPE jvm_buffer_memory_used_bytes gauge
jvm_buffer_memory_used_bytes{id="direct",} 81920.0
jvm_buffer_memory_used_bytes{id="mapped",} 0.0
# HELP jvm_threads_live The current number of live threads including both daemon and non-daemon threads
# TYPE jvm_threads_live gauge
jvm_threads_live 23.0
# HELP tomcat_global_received_bytes_total
# TYPE tomcat_global_received_bytes_total counter
tomcat_global_received_bytes_total{name="http-nio-8080",} 0.0
# HELP jvm_gc_pause_seconds Time spent in GC pause
# TYPE jvm_gc_pause_seconds summary
jvm_gc_pause_seconds_count{action="end of minor GC",cause="Allocation Failure",} 7.0
jvm_gc_pause_seconds_sum{action="end of minor GC",cause="Allocation Failure",} 0.232
jvm_gc_pause_seconds_count{action="end of minor GC",cause="Metadata GC Threshold",} 1.0
jvm_gc_pause_seconds_sum{action="end of minor GC",cause="Metadata GC Threshold",} 0.01
jvm_gc_pause_seconds_count{action="end of major GC",cause="Metadata GC Threshold",} 1.0
jvm_gc_pause_seconds_sum{action="end of major GC",cause="Metadata GC Threshold",} 0.302
# HELP jvm_gc_pause_seconds_max Time spent in GC pause
# TYPE jvm_gc_pause_seconds_max gauge
jvm_gc_pause_seconds_max{action="end of minor GC",cause="Allocation Failure",} 0.0
jvm_gc_pause_seconds_max{action="end of minor GC",cause="Metadata GC Threshold",} 0.0
jvm_gc_pause_seconds_max{action="end of major GC",cause="Metadata GC Threshold",} 0.0
# HELP jvm_gc_live_data_size_bytes Size of old generation memory pool after a full GC
# TYPE jvm_gc_live_data_size_bytes gauge
jvm_gc_live_data_size_bytes 5.0657472E7
## More data ...... (Omitted for brevity)
使用Docker下载和运行Prometheus
- 下载Prometheus
你可以使用docker pull命令 下载Prometheus docker 镜像,像这样:
$ docker pull prom/prometheus
下载完镜像,你可以输入docker 镜像命令,查看本地存在的镜像列表
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
prom/prometheus latest b82ef1f3aa07 5 days ago
- Prometheus 配置prometheus.yml
接着,我们需要从Spring Boot Actuator的/prometheus 端点,配置Prometheus 以便scrape 指标数据
使用下面的配置,创建一个名叫prometheus.yml 的新文件
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['127.0.0.1:9090']
- job_name: 'spring-actuator'
metrics_path: '/actuator/prometheus'
scrape_interval: 5s
static_configs:
- targets: ['HOST_IP:8080']
以上配置是从Prometheus文档提供的配置文件基础上作了扩展。最重要的,值得注意是,在scrape_configs 部分中, spring-actuator job 的metrics_path ,指定 Actuator的prometheus 端点路径,目标部分包括了你的Spring Boot 应用的HOST 和 PORT,请确保用运行Spring Boot application 的机子的IP地址,代替HOST_IP,注意这里,localhost在这里是无效的,因为我们从docker 容器连接HOST的机子,你必须指定网络IP地址。
- 使用 Docker运行Prometheus
最后,我们使用 Docker运行Prometheus。输入下面的命令, 以后台服务方式,启动Prometheus 服务-
$ docker run -d --name=prometheus -p 9090:9090 -v <PATH_TO_prometheus.yml_FILE>:/etc/prometheus/prometheus.yml prom/prometheus --config.file=/etc/prometheus/prometheus.yml
请确保 用你Prometheus 配置文件存储的路径,代替<PATH_TO_prometheus.yml_FILE>
执行上面命令之后,docker 将会在容器内启动Prometheus 服务 。用下面的命令,你可以查看所有容器的列表。
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e036eb20b8ad prom/prometheus "/bin/prometheus --c…" 4 minutes ago Up 4 minutes 0.0.0.0:9090->9090/tcp prometheus
- 从Prometheus dashboard 可视化 Spring Boot 指标
就是这样,你现在可以导航到http://localhost:9090 查看Prometheus dashboard了。
你可以在表达式文本框中,输入一个Prometheus 查询表达式。
下面是我们Spring Boot 应用指标的一些Prometheus图
1.系统的CPU使用情况
2.响应延迟的缓慢API
使用Docker下载和运行Grafana
输入下面Docker命令下载和运行Grafana
$ docker run -d --name=grafana -p 3000:3000 grafana/grafana
以上命令会在Docker容器内部 启动Grafana,在主机机器上保证3000端口可用。
你可以输入docker容器ls 命令 查看容器列表
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cf9196b30d0d grafana/grafana "/run.sh" Less than a second ago Up 5 seconds 0.0.0.0:3000->3000/tcp grafana
e036eb20b8ad prom/prometheus "/bin/prometheus --c…" 16 minutes ago Up 16 minutes 0.0.0.0:9090->9090/tcp prometheus
就是这样,你现在可以导航到http://localhost:3000 ,用默认用户名admin 和密码admin 登录Grafana
配置Grafana 从Prometheus导入指标数据
下列步骤 ,从Prometheus导入指标数据,并在Grafana可视化它。
1.在Grafana 添加 Prometheus数据源
2.用Graph创建一个新Dashboard
3.在Grafana的查询编辑器,添加一个Prometheus查询。
4. 从Grafana的dashboard可视化指标
你可以从Github上,找到完整的Actuator演示源代码。