概要
组件简介
spring-actuator
可以帮助你监控和管理Spring Boot应用,比如健康检查、审计、统计和HTTP追踪等
通过JMX或者HTTP endpoints来获取数据spring-boot-admin
对接spring-actuator,提供展示界面micrometer
提供多种监控平台可用的JVM应用指标查询接口,类似SLF4JPrometheus
可存储多维时间序列数据的监控和报警工具Graphite / InfluxDB / OpenTSDB
时间序列数据库Granfana
可视化指标分析平台
监控搭建
spring-actuator + micrometer + Prometheus + Grafana +
Prometheus
特征
- 多维度数据模型-由指标键值对标识的时间序列数据组成
- PromQL,一种灵活的查询语言
- 不依赖分布式存储; 单个服务器节点是自治的
- 以HTTP方式,通过pull模型拉取时间序列数据
- 支持通过中间网关推送时间序列数据
- 通过服务发现或者静态配置,来发现目标服务对象
- 支持多种多样的图表和界面展示
架构
数据采集
GET /actuator/prometheus
数据查询
prometheus提供了web界面执行PromSQL查询时序数据,上面的指标就可以直接作为查询条件语句,且支持多种函数查询,参见 https://prometheus.io/docs/prometheus/latest/querying/functions/
预警规则
通过配置文件中的规则对每次查询的时序数据进行预警判定,可以在web界面中展示已加载的规则项
预警信息发送到AlertManager组件中进行统一预警管理
- 规则配置:
groups:
- name: Instances
rules:
- alert: InstanceDown
expr: up != 1 # 规则表达式,支持PromSQL查询
for: 1m # 首次命中规则1分钟后发送报警,若延迟区间内对数据再次检查没有命中规则,就不再报警
labels: # 报警信息标签
severity: page # 预警严重程度,后面可以根据这个字段抑制某些不需要的告警
status: High
annotations: # 报警信息描述
description: "Application: {{ $labels.job }} Instance: {{ $labels.instance }} is Down ! ! !"
value: '{{ $value }}'
summary: "Instance {{ $labels.instance }} down"
- 预警状态
Inactive: 这里什么都没有发生。
Pending: 已触发阈值,但未满足报警持续时间(即rule中的for字段)
Firing: 已触发阈值且满足告警持续时间。警报发送到Notification Pipeline,经过处理,发送报警
Resolved: 预警已解决,只会出现报警的请求报文中,在web界面看不到
AlertManager
Prometheus服务器中的警报规则向AlertManager发送警报。然后,警报管理器管理这些警报,包括沉默、抑制、聚合和通过电子邮件、待命通知系统和聊天平台等方法发送通知
这里我们选择使用WebHook方式,将报警信息发送到指定接口,我们可以针对报警数据自行选择通知方式和通知人
- 报警请求数据
{
"receiver": "web\\.hook",
"status": "firing",
"alerts": [
{
"status": "firing",
"labels": {
"alertname": "InstanceDown",
"instance": "10.10.10.10:9000",
"job": "app-1",
"severity": "page",
"status": "High"
},
"annotations": {
"description": "Application: bdp-gateway Instance: 10.10.10.10:9000 is Down ! ! !",
"summary": "Instance 10.10.10.10:9000 down",
"value": "0"
},
"startsAt": "2021-02-20T09:11:43.380766777Z",
"endsAt": "0001-01-01T00:00:00Z",
"generatorURL": "http://VM-102-32-centos:9090/graph?g0.expr=up+%21%3D+1\u0026g0.tab=1",
"fingerprint": "8a9aadd8d34d09f7"
},
{
"status": "resolved",
"labels": {
"alertname": "InstanceDown",
"instance": "10.10.10.10:9001",
"job": "app-2",
"severity": "page",
"status": "High"
},
"annotations": {
"description": "Application: app-2 Instance: 10.10.10.10:9001 is Down ! ! !",
"summary": "Instance 10.10.10.10:9001 down",
"value": "0"
},
"startsAt": "2021-02-20T09:11:28.380766777Z",
"endsAt": "2021-02-20T09:13:43.380766777Z",
"generatorURL": "http://VM-102-32-centos:9090/graph?g0.expr=up+%21%3D+1\u0026g0.tab=1",
"fingerprint": "6070b8cb7389ffc2"
}
],
"groupLabels": {
"alertname": "InstanceDown"
},
"commonLabels": {
"alertname": "InstanceDown",
"severity": "page",
"status": "High"
},
"commonAnnotations": {
"value": "0"
},
"externalURL": "http://VM-102-32-centos:9093",
"version": "4",
"groupKey": "{}:{alertname=\"InstanceDown\"}",
"truncatedAlerts": 0
}
Grafana
用于可视化大型测量数据的开源程序,他提供了强大和优雅的方式去创建、共享、浏览数据。dashboard中显示了你不同metric数据源中的数据
数据源
多种时序数据库(Prometheus、Graphite、OpenTSDB、InfluxDB)
文档数据库(ElasticSearch)
分布式追踪系统(Jaeger、Zipkin、Tempo)
SQL(MySQL、PostgreSQL、Sql Server)
等等
-
节点仪表盘
-
应用健康表
部署
应用端加入spring-actuator和micrometer组件
org.springframework.boot
spring-boot-starter-actuator
io.micrometer
micrometer-registry-prometheus
安装Prometheus & AlertManager
- 官网下载解压缩后直接运行,这里我们只需要用到prometheus和alertmanager
https://prometheus.io/download/
prometheus默认端口9090,alertmanager默认端口9093
- 创建prometheus启动脚本
start.sh
nohup ./prometheus --web.enable-lifecycle 2>&1 &
- 创建prometheus热加载脚本
reload.sh
curl -XPOST http://localhost:9090/-/reload
- 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).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
- 127.0.0.1:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
- "./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=` to any timeseries scraped from this config.
- job_name: 'app-1'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['10.10.10.10:9000', '10.10.10.11:9000']
- job_name: 'app-2'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['10.10.10.11:9001']
- 创建alertmanager启动脚本
start.sh
nohup ./alertmanager 2>&1 &
- 创建alertmanager热加载脚本
reload.sh
curl -XPOST http://localhost:9093/-/reload
- alertmanager.yml
route:
group_by: ['alertname'] # 报警分组依据字段
group_wait: 20s # 收到新组时等待时间,目的是为了等待同组的警报合并发送报警
group_interval: 5m # 同组报警发送的间隔时间,从上次发送报警的时间开始计算
repeat_interval: 3m # 报警发送间隔
receiver: 'web.hook' # 接收报警的名称
receivers:
- name: 'web.hook'
webhook_configs:
- send_resolved: false # 已报警的指标恢复后是否通知,默认true
url: 'http://10.10.10.11:8080/xxx/xxx' #报警通知接口
inhibit_rules: # 告警抑制配置,避免当某种问题告警产生之后用户接收到大量由此问题导致的一系列的其它告警通知
- source_match: # 源报警规则
severity: 'critical'
target_match: # 抑制的报警规则
severity: 'warning'
equal: ['alertname', 'dev', 'instance'] # 需要都有相同的标签及值,否则抑制不起作用
安装Grafana
-
官网下载解压缩后直接运行
./bin/grafana-server
https://grafana.com/grafana/download
默认端口3000
-
创建Prometheus数据源
-
导入仪表盘
仪表盘可以使用文件导入,在官网上可以查询想要的仪表盘下载后导入到自己的服务器上
https://grafana.com/grafana/dashboards/12856