文章目录
- 一、Prometheus基本概况
- 二、本文要实现的架构图
- 三、部署Prometheus
- 1.部署客户端—SpringBoot应用
- 2.部署客户端—node-exporter
- 3.部署服务端—Prometheus Server
- 三、部署Grafana
- 1.拉取镜像
- 2.添加数据源
- 3.选择展示模板
- 四、部署AlertManager
- 1.部署配置AlertManager
- 2.配置服务器告警操作
- 3.配置prometheus.yml文件
- 4.开始告警
- 5.SpringBoot应用接收告警信息
- 参考文章
一、Prometheus基本概况
首先Prometheus是一个监控系统,尤其在云原生的时代,Prometheus作为新一代的云原生监控,表现的非常亮眼,目前已经超过120+项的第三方集成。
Prometheus架构图
采集层
采集层分为两类,一类是生命周期比较短的作业,一类是生命周期较长的作业。所谓生命周期长短就是你的应用是长时间运行还是短时间运行
- 短作业:直接通过Api,将指标推送给Pushgateway
- 长作业:Retrieval组件直接从job或者Exporter拉取数据(比如SpringBoot应用程序)
存储计算层
- Prometheus Server,里面包含了存储引擎和计算引擎
- Retrieval组件为取数组件,它会主动从Pushgateway或者Exporter拉取指标数据
- Service dicovery可以动态发现要监控的目标
应用层
分为两类,AlertManager和数据可视化(Grafana)
- AlertManager:告警组件,在Prometheus配置告警规则,一旦满足告警规则,将告警信息发送给AlertManager,AlertManager发送出告警信息
- Grafana:将Prometheus采集的指标数据可视化
二、本文要实现的架构图
三、部署Prometheus
1.部署客户端—SpringBoot应用
Prometheus分为客户端与服务端,客户端就是SpringBoot应用需要引入相关的依赖
<!--springboot的监控端点 2.3.6-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--prometheus的客户端依赖 1.5.7-->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
配置文件配置打开Actuator服务
SpringBoot自带监控功能Actuator,可以帮助实现对程序内部运行情况监控,比如监控状况、Bean加载情况、环境变量、日志信息、线程信息等
#打开所有Actuator服务
management.endpoints.web.exposure.include=*
访问http://localhost:8090/actuator/prometheus,就可以看到监控的数据了
2.部署客户端—node-exporter
node-exproter 它是最基本的节点监控客户端,负责监控机器的各个指标,包括节点存活、CPU、Mem、Network、IO 等等,方便后边演示 Alertmanager 报警时的触发条件,例如配置节点存活检测,当机器 Down 时,触发报警控制,那么就可以通过停止 node-exporter 来模拟实现了。
docker pull prom/node-exporter:latest
docker run --name node-exporter -d -p 9100:9100 prom/node-exporter:latest
访问地址:http://192.168.184.128:9100/metrics,即可看到监控的指标
3.部署服务端—Prometheus Server
这里使用docker部署,因为国内有docker的镜像所有部署起来更容易一些
拉取镜像
# 拉取docker镜像
docker pull prom/prometheus
准备prometheus.yml文件
里面含有两个job,一个是收集springboot应用的actuator信息,一个是收集node-exporter的信息
scrape_configs:
# 可随意指定
- job_name: 'spring'
# 多久采集一次数据
scrape_interval: 15s
# 采集时的超时时间
scrape_timeout: 10s
# 采集的路径
metrics_path: '/actuator/prometheus'
# 采集服务的地址,设置成Springboot应用所在服务器的具体地址
static_configs:
- targets: ['192.168.43.119:8090','192.168.184.128:8090']
- job_name: 'node-exporter'
# 多久采集一次数据
scrape_interval: 15s
# 采集时的超时时间
scrape_timeout: 10s
static_configs:
- targets: ['192.168.184.128:9100']
labels:
instance: redpack
service: node-service
创建docker容器,挂载并指定yml文件启动
docker run -d -p 9090:9090 -v /usr/local/docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus --config.file=/etc/prometheus/prometheus.yml
访问服务http://{ip}:9090/即可
三、部署Grafana
Grafana是一款go语言编写的开源应用,主要用于大规模指标数据的可视化展现,是网络架构和应用分析中最流行的时序数据展示工具,目前已经支持绝大部分时序数据库
1.拉取镜像
//拉取镜像
docker pull grafana/grafana
//启动容器
docker run -d -p 3000:3000 grafana/grafana
访问:http://192.168.184.127:3000/login,用户名及密码都是admin
2.添加数据源
需要注意的是Access要选Browser模式,否则无法正常获取数据。配置完成后,点击Save & Test即可。
3.选择展示模板
Grafana提供了各式各样的监控模板供开发者使用,官方地址 ,在本实例中使用了Spring Boot Statistics
点击左侧加号+选import
显示的页面
里面也有涉及到其他的监控页面,大家可以自己探究一下
四、部署AlertManager
Prometheus发出告警时分为两部分。首先,Prometheus按告警规则(rule_files配置块)向Alertmanager发送告警(即告警规则是在Prometheus上定义的)。然后Alertmanager开管理这些告警,包括去重(Deduplicating)、分组(Grouping)、静音(silencing)、抑制(inhibition)、聚合(aggregation),最终通过电子邮件、webhook等方式将告警通知路由(route)给对应联系人
1.部署配置AlertManager
global:
resolve_timeout: 5m
route:
group_by: ['alertname']
group_wait: 10s #组报警等待时间
group_interval: 10s #组报警间隔时间
repeat_interval: 1m #重复报警间隔时间
receiver: 'web.hook'
receivers:
- name: 'web.hook'
webhook_configs:
- url: 'http://192.168.43.119:8090/alert/test'
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
- global: 全局配置,包括报警解决后的超时时间、SMTP 相关配置、各种渠道通知的 API 地址等等。
- route: 用来设置报警的分发策略,它是一个树状结构,按照深度优先从左向右的顺序进行匹配。
- receivers: 配置告警消息接受者信息,例如常用的 email、wechat、slack、webhook 等消息通知方式。
- inhibit_rules: 抑制规则配置,当存在与另一组匹配的警报(源)时,抑制规则将禁用与一组匹配的警报(目标)。
这里配置成了web.hook的方式,当server通知alertmanager会自动调用webhook http://192.168.43.119:8090/alert/test
docker run -d -p 9093:9093 \
--name alertmanager \
-v /usr/local/docker/altermanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml \
prom/alertmanager
访问服务 http://192.168.184.127:9093/#/alerts
目前还没有配置告警操作
2.配置服务器告警操作
需要配置告警规则的yml文件,如下
[root@k8s-node2 rules]# pwd
/usr/local/docker/prometheus/rules
[root@k8s-node2 rules]# ls
memory_over.yml node-up.yml
node-up.yml
groups:
- name: node-up
rules:
- alert: node-up
expr: up{job="node-exporter"} == 0
for: 2s
labels:
severity: 1
team: node
annotations:
summary: "{{ $labels.instance }} 已停止运行超过 2s!"
memory_over.yml
配置当服务器内存占用80%时告警
groups:
- name: HighMemoryUsage
rules:
- alert: NodeMemoryUsage
expr: (1 - (node_memory_MemAvailable_bytes / (node_memory_MemTotal_bytes))) * 100 > 80
for: 1m
labels:
severity: warning
annotations:
summary: "{{$labels.instance}}: High Memory usage detected"
description: "{{$labels.instance}}: Memory usage is above 80% (current value is:{{ $value }})"
其中(1 - (node_memory_MemAvailable_bytes / (node_memory_MemTotal_bytes))) * 100
是内存的利用率,可以在prometheus界面上执行一下。
3.配置prometheus.yml文件
将配置的规则添加到prometheus中
scrape_configs:
# 可随意指定
- job_name: 'spring'
# 多久采集一次数据
scrape_interval: 15s
# 采集时的超时时间
scrape_timeout: 10s
# 采集的路径
metrics_path: '/actuator/prometheus'
# 采集服务的地址,设置成Springboot应用所在服务器的具体地址
static_configs:
- targets: ['192.168.43.119:8090','192.168.184.128:8090']
- job_name: 'node-exporter'
# 多久采集一次数据
scrape_interval: 15s
# 采集时的超时时间
scrape_timeout: 10s
static_configs:
- targets: ['192.168.184.128:9100']
labels:
instance: redpack
service: node-service
#在后面加上该内容
rule_files:
- /etc/prometheus/rules/*.yml
alerting:
alertmanagers:
- static_configs:
- targets: ["192.168.184.127:9093"]
altering:指定了Alertmanager的告警地址
rule_files:指定了告警规则
重新启动prometheus的容器
docker run -d -p 9090:9090 \
-v /usr/local/docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
-v /usr/local/docker/prometheus/rules/:/etc/prometheus/rules/ prom/prometheus \
--config.file=/etc/prometheus/prometheus.yml \
--web.enable-lifecycle
添加上–web.enable-lifecycle就可以开启热加载配置,下次再改prometheus配置时就可以采用如下命令
curl -X POST http://192.168.184.127:9090/-/reload
当然AlertManager也可以,换成它的ip和端口号就行
从prometheus的控制台查看配置的规则
4.开始告警
访问prometheus的Alerts界面
可以看到Prometheus Alert告警有三种状态
- Inactive:非活动状态,表示正在监控,但是还未有任何警报触发。
- Pending:表示这个警报必须被触发。由于警报可以被分组、压抑/抑制或静默/静音,所以等待验证,一旦所有的验证都通过,则将转到 Firing 状态。
- Firing:将警报发送到 AlertManager,它将按照配置将警报的发送给所有接收者。一旦警报解除,则将状态转到 Inactive,如此循环。
从图中可以看出监控的128的服务器内存使用率已经超过80%,node-exporter还在正常运行
触发报警后,prometheus会将报警信息发送给AlertManager,ip:9093访问AlterManager界面可以看到正在发送一个报警信息
5.SpringBoot应用接收告警信息
前面说到AlertManager可以通过邮件、钉钉收到告警信息,这里采用的是通过springboot应用接收AlertManager发过来的json信息
参考文章
Actuator的介绍:https://www.jianshu.com/p/14d10481845e Prometheus官网:https://prometheus.io/ 详细教程: prometheus相关exporter: prometheus常用告警规则: Alertmanager配置介绍:https://www.bilibili.com/read/cv7055904?spm_id_from=333.999.0.0 prometheus的gitbook系列书:https://yunlzheng.gitbook.io/prometheus-book/parti-prometheus-ji-chu/quickstart