架构设计图
最终效果图
项目准备
xml依赖
<!-- 监控相关 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<scope>runtime</scope>
</dependency>
yml配置
management:
endpoints:
web:
exposure:
# 暴露相关项目信息
# include: "*" # 暴露全部端点
include: "prometheus" # 只暴露/actuator/prometheus
endpoint:
prometheus:
enabled: true
health:
show-details: always
metrics:
export:
prometheus:
enabled: true
附:springBoot相关endpoint参数
HTTP方法 | 路径 | 描述 | 默认是否启用 |
---|---|---|---|
GET | /health | 返回聚合的应用健康状态,可能的话,还会包含外部依赖应用的健康状态 | 是 |
GET | /heapdump | 下载堆dump文件 | 否 |
GET | /info | 返回有关开发人员定义的关于该应用的信息 | 是 |
GET | /loggers | 生成应用中源码的包列表,其中会包含配置的以及生效的日志级别 | 否 |
GET | /metrics | 返回所有jvm指标分类的列表 | 否 |
GET | /auditevents | 生成所有已经触发的审计的报告 | 否 |
GET | /beans | 描述Spring应用程序上下文中的所有bean | 否 |
GET | /conditions | 生成自动配置条件通过或者失败的报告,会指导应用上下文中bean的创建 | 否 |
GET | /configprops | 描述所有配置属性以及当前值 | 否 |
GET, POST, DELETE | /env | 生成Spring应用可用的所有属性源及其属性的报告 | 否 |
GET | /env/{toMatch} | 描述某个环境属性的值 | 否 |
GET | /httptrace | 生成最近100个请求的跟踪结果 | 否 |
GET, POST | /loggers/{name} | 返回指定logger配置的和生效的日志级别,生效的日志级别可以使用POST请求修改 | 否 |
GET | /mappings | 生成所有HTTP映射及其对应处理器方法的报告 | 否 |
GET | /metrics/{name} | 返回给定指标的多纬度值集 | 否 |
GET | /scheduledtasks | 列出所有的调度任务 | 否 |
GET | /threaddump | 返回所有应用线程的报告 | 否 |
其他
/**
* 为普罗米修斯添加应用名称 tag,在界面上好区分
*
* @param applicationName 应用名称
* @return org.springframework.boot.actuate.autoconfigure.metrics.MeterRegistryCustomizer
*/
@Bean
public MeterRegistryCustomizer<MeterRegistry> meterRegistryCustomizer(@Value("${spring.application.name}") String applicationName) {
return (registry -> registry.config().commonTags("application", applicationName));
}
验证
验证项目是否准备完毕,项目启动后,访问:http://ip:port/actuator/prometheus
docker安装组件
飞书配置
获取飞书token
- 创建一个飞书群聊,在 设置 中选择群机器人 --> 选择 添加机器人。
- 选择自定义机器人
- 选择添加后,url后面就是
飞书的token
,在prometheus的配置中需要用到。 - 在安全设置中
勾选 自定义关键词
,在发送的消息中存在 配置的关键词才能够正常发送。
安装发送消息到群的组件
我这里是在 docker hub 上找的一个发送飞书消息的镜像,里面跑的是一个 SpringBoot 项目,如果有找到更好的,可以进行更换。
docker run -d --name prom-alert-feishu -p 9001:8080 javafamily/prometheus-webhook-feishu:2.3.2-SNAPSHOT
prometheus安装
创建目录: /xxx/xxx/prometheus/
并进入,创建prometheus.yml
配置文件,内容如下:
global:
scrape_interval: 30s # 全局抓取数据时间,默认 60s,可在job中覆盖
evaluation_interval: 30s # 全局告警计算周期,默认 60s,可在job中覆盖
# alert Manager配置
alerting:
alertmanagers:
- static_configs:
- targets:
- 192.168.1.222:9093
# rule规则配置
rule_files:
- 'rules/*.yml'
# 监控job配置
scrape_configs:
# prometheus自带默认 job,不可删除
- job_name: 'prometheus'
metrics_path: '/metrics'
static_configs:
- targets: ['192.168.1.222:9090'] # 抓取数据url,确保在容器中能够访问到,使用docker启动不能写localhost
# 服务实例 job,可配置多个
- job_name: 'springboot_wcong_test'
scrape_interval: 15s # 每间隔15s向指定url进行抓取数据,覆盖global中的配置
metrics_path: '/actuator/prometheus' # 应用程序暴露的端点
static_configs:
- targets: ['192.168.1.222:9010']
labels:
serviceId: 'springboot_wcong_test_one'
serviceName: '测试boot应用1'
feishuToken: 'xxxx'
- job_name: 'springboot_wcong_test_two'
scrape_interval: 15s
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['192.168.1.222:9020']
labels:
serviceId: 'springboot_wcong_test_two'
serviceName: '测试boot应用2'
feishuToken: 'xxxx'
在/xxx/xxx/prometheus/
,创建 rules文件夹
,进入 rules 文件夹,创建dufault_rule.yml
文件,内容如下:
# 每个group可以定义多个告警规则(rule)
groups:
# 组名, 报警规则组名称,可配置多个
- name: 实例存活报警name
rules:
- alert: 实例存活报警alert
# PromQL表达式,相关参数可在prometheus界面中查看
expr: up == 0
# 报警持续时长 达到 这个时间,才会触发报警, for >= prometheus中的scrape_interval值(每次抓取数据的时间,防止最新的数据还没抓取)
for: 30s
# 自定义标签,允许用户指定要附加到告警上的一组附加标签。
labels:
# 指定告警级别。:warning,critical,emergency,严重等级依次递增。
severity: emergency
# 定义消息 内容 和 格式,相关参数根据具体的 webhook 而定。
annotations:
# 推送feishu机器人token,不同的组,可推送到不同群
token: "{{ $labels.feishuToken }}"
title: "服务宕机报警"
serviceName: "{{ $labels.serviceName }}"
instance: "{{ $labels.instance }}"
# 按钮标题
btn: "点击查看详情 :玫瑰:"
# 点击按钮跳转的链接
link: 'http://192.168.1.222:9090/targets'
template: '服务 **${serviceName}**(${instance}) 断联, 请及时处理!'
description: '服务宕机'
在/xxx/xxx/prometheus/
目录,创建docker容器文件:docker-compose.yml
,内容如下:
# 启动命令:docker-compose up -d
version: '3.7'
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
# 重启策略,失败后重启一次
restart: on-failure:1
ports:
- "9090:9090"
volumes:
# 配置文件,挂载到本机目录
- /xxx/xxx/prometheus/:/etc/prometheus/
# 限制最大使用内存
deploy:
resources:
limits:
memory: 512M
进入docker-compose.yml
所在目录,启动:docker-compose up -d
(-d 后台启动)
验证
访问地址:ip:9090
AlertManager安装
创建目录: /xxx/xxx/alertManager/
并进入,创建alertmanager.yml
配置文件,内容如下:
# 相关路由规则
route:
group_by: [...] # 分组, ... 表示不分组
group_wait: 60s # 同一组 告警 需要等待多少s才能发出
group_interval: 5m # 同一组的多批次告警间隔多少秒后,才能发出
repeat_interval: 1h # 重复告警要等待多久后才能再次发出去,目的是为了避免重复的消息发送多次
receiver: 'web.hook' # receiver名称,对应 receivers.name
# 配置报警方式
receivers:
- name: 'web.hook'
webhook_configs:
# 通知url
- url: 'http://192.168.1.222:9001/alert/card'
# 抑制规则,减少垃圾告警的产生,比如主机挂了,主机上的服务,数据库,中间件等一系列告警 相对来说没有意义,可以通过抑制项这个功能,让Prometheus只发出主机挂了的告警。
# 暂时不用
# inhibit_rules:
# - source_match:
# # 匹配的严重级别,向上兼容,warning,critical,emergency,严重等级依次递增。
# severity: 'critical'
# target_match:
# severity: 'warning'
# equal: ['alertname', 'dev', 'instance'] # 确保这个配置下的标签内容相同才会抑制,也就是说警报中必须有这三个标签值才会被抑制。
进入目录:/xxx/xxx/alertManager/
并进入,创建docker容器文件:docker-compose.yml
,内容如下:
# 启动命令:docker-compose up -d
version: '3.7'
services:
prometheus:
image: prom/alertmanager:latest
container_name: alertmanager
# 重启策略,失败重启一次
restart: on-failure:1
ports:
- "9093:9093"
volumes:
- /xxx/xxx/alertManager/:/etc/alertmanager/
# 限制最大使用内存
deploy:
resources:
limits:
memory: 256M
进入docker-compose.yml
所在目录,启动:docker-compose up -d
(-d 后台启动)
grafana安装
创建目录:/xxx/xxx/grafana/
并进入,创建docker容器文件:docker-compose.yml
,内容如下:
# 启动命令:docker-compose up -d
version: '3.7'
services:
prometheus:
image: grafana/grafana:latest
container_name: grafana
# 重启策略,失败重启一次
restart: on-failure:1
ports:
- "3000:3000"
# 不需要挂载容器卷,grafana只是一个数据展示平台
# volumes:
# - /xxx/xxx/grafana/:/etc/grafana/
# 限制最大使用内存
deploy:
resources:
limits:
memory: 256M
进入当前目录,启动:docker-compose up -d
(-d 后台启动)
验证
访问地址:ip:3030
,默认账号密码都为admin
Grafana相关配置
jvm监控
- 配置数据源,点击
Add data source
,选择 prometheus。
- 配置
名称
和url
- 点击:
Save & test
,添加数据源
- 导入官方提供的图像可视化插件,jvm的编号为:
4701
,加载后进行导入;其他仪表盘:https://grafana.com/grafana/dashboards/
- 选择刚才添加的数据源
- 一个仪表盘可以展示
多个jvm应用的信息
,可以根据应用名称
、标签名
进行筛选,可以选择查看的信息
、时间段
、刷新频率
。
- 后续查看
用户权限控制
用户-角色-组织
编辑界面
- 数据源、图表按组织隔离。
- 可以根据组织配置免密登录。
用户角色修改角色
每个图表的控制
- 控制某个图表为只读,防止误操作。
- 还可以根据角色区分操作权限。
- 保存后,刷新页面才会生效。