文章目录
- Prometheus企业级监控
-
- 1. Prometheus架构介绍
- ### 1.1 组件说明
- 1.3 对比Zabbix
- 1.4 环境介绍
- Prometheus部署
- 2.2 配置systemctl管理
- 3.Prometheus**配置文件介绍
- 3.1 Global配置参数
- 3.2 scrapy_config片段主要参数
- 配置监控远程Linux主机
- 5.1 配置systemctl管理
- 5.2 配置监控
- 检测语法,检测配置文件有没有问题?
- 部署Grafana,就是一个展示页面,部署在哪个机器上面都可以,可要可不要
- 邮箱报警实战
- 7.部署AlterManager报警
- 配置文件详解:
- #配置systemctl系统管理
- prometheus告警实战
- 编写告警规则
- 测试报警
- 报警邮件:
- 普罗米修斯邮箱报警优化版
- 检测语法完成测试
Prometheus企业级监控
Prometheus 是一款基于时序数据库的开源监控告警系统,非常适合Kubernetes集群的监控。Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态,任意组件只要提供对应的HTTP接口就可以接入监控。不需要任何SDK或者其他的集成过程。这样做非常适合做虚拟化环境监控系统,比如VM、Docker、Kubernetes等。输出被监控组件信息的HTTP接口被叫做exporter 。目前互联网公司常用的组件大部分都有exporter可以直接使用,比如Varnish、Haproxy、Nginx、MySQL、Linux系统信息(包括磁盘、内存、CPU、网络等等)。Promethus有以下特点:
-
支持多维数据模型:由度量名和键值对组成的时间序列数据
-
内置时间序列数据库TSDB
-
支持PromQL查询语言,可以完成非常复杂的查询和分析,对图表展示和告警非常有意义
-
支持HTTP的Pull方式采集时间序列数据
-
支持PushGateway采集瞬时任务的数据
-
支持服务发现和静态配置两种方式发现目标
-
支持接入Grafana
1. Prometheus架构介绍
### 1.1 组件说明
* prometheus server是Prometheus组件中的核心部分,负责实现对监控数据的获取,存储以及查询。
* exporter简单说是采集端,通过http服务的形式保留一个url地址,prometheusserver通过访问该exporter提供的endpoint端点,即可获取到需要采集的监控数据。
* AlertManager在prometheus中,支持基于PromQL创建告警规则,如果满足定义的规则,则会产生一条告警信息,进入AlertManager进行处理。可以集成邮件,微信或者通过webhook自定义报警。
* Pushgateway由于Prometheus数据采集采用pull方式进行设置的,内置必须保证prometheusserver和对应的exporter必须通信,当网络情况无法直接满足时,可以使用pushgateway来进行中转,可以通过pushgateway将内部网络数据主动push到gateway里面去,而prometheus采用pull方式拉取pushgateway中数据。
1.2 总结:
-
prometheus负责从pushgateway和job中采集数据,存储到后端Storatge中,可以通过
PromQL进行查询,推送alerts信息到AlertManager。AlertManager根据不同的路由规则
进行报警通知
1.3 对比Zabbix
| **Zabbix** | **Prometheus** |
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| 后端用 C 开发,界面用 PHP 开发,定制化难度很高。 | 后端用 golang 开发,前端是 Grafana,JSON 编辑即可解决。定制化难度较低。 |
| 集群规模上限为 10000 个节点。 | 支持更大的集群规模,速度也更快。 |
| 更适合监控物理机环境,以IP地址为监控标识 | 更适合云环境的监控,对 OpenStack,Kubernetes 有更好的集成。 |
| 监控数据存储在关系型数据库内,如 MySQL,很难从现有数据中扩展维度。 | 监控数据存储在基于时间序列的数据库内,便于对已有数据进行新的聚合。 |
| 安装简单,zabbix-server 一个软件包中包括了所有的服务端功能。 | 安装相对复杂,监控、告警和界面都分属于不同的组件。 |
| 图形化界面比较成熟,界面上基本上能完成全部的配置操作。 | 界面相对较弱,很多配置需要修改配置文件。 |
| **Zabbix** | **Prometheus** |
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| 后端用 C 开发,界面用 PHP 开发,定制化难度很高。 | 后端用 golang 开发,前端是 Grafana,JSON 编辑即可解决。定制化难度较低。 |
| 集群规模上限为 10000 个节点。 | 支持更大的集群规模,速度也更快。 |
| 更适合监控物理机环境,以IP地址为监控标识 | 更适合云环境的监控,对 OpenStack,Kubernetes 有更好的集成。 |
| 监控数据存储在关系型数据库内,如 MySQL,很难从现有数据中扩展维度。 | 监控数据存储在基于时间序列的数据库内,便于对已有数据进行新的聚合。 |
| 安装简单,zabbix-server 一个软件包中包括了所有的服务端功能。 | 安装相对复杂,监控、告警和界面都分属于不同的组件。 |
| 图形化界面比较成熟,界面上基本上能完成全部的配置操作。 | 界面相对较弱,很多配置需要修改配置文件。 |
1.4 环境介绍
Prometheus部署
2.1 下载安装
我是直接采用的安装包配置的,都一样
[root@prometheus ~]#wget https://github.com/prometheus/prometheus/releases/download/v2.31.0-rc.0/prometheus-2.31.0-rc.0.linux-amd64.tar.gz
[root@prometheus ~]# tar -xzvf prometheus-2.31.0-rc.0.linux-amd64.tar.gz -C /usr/local/
[root@prometheus local]# mv prometheus-2.31.0-rc.0.linux-amd64/ prometheus
[root@prometheus local]# cd prometheus/
[root@prometheus prometheus]# mkdir data #创建数据存放目录
2.2 配置systemctl管理
[root@prometheus prometheus]# vim /usr/lib/systemd/system/prometheus.service
[Unit]
Description=https://prometheus.io
[Service]
Restart=on-failure
ExecStart=/usr/local/prometheus/prometheus --storage.tsdb.path=/usr/local/prometheus/data --config.file=/usr/local/prometheus/prometheus.yml
[Install]
WantedBy=multi-user.target
[root@prometheus prometheus]# cp prometheus.yml prometheus.yml.bak
[root@prometheus prometheus]# systemctl start prometheus
3.Prometheus**配置文件介绍
global:此片段指定的是prometheus的全局配置,比如采集间隔,抓取超时时间等。
rule_files:此片段指定报警规则文件,prometheus根据这些规则信息,会推送报警信息到alertmanager中。
scrape_configs:此片段指定抓取配置,prometheus的数据采集通过此片段配置。
alerting:此片段指定报警配置,这里主要是指定prometheus将报警规则推送到指定的alertmanager实例地址。
remote_write:指定后端的存储的写入api地址。
remote_read:指定后端的存储的读取api地址。
3.1 Global配置参数
#Howfrequentlytoscrapetargetsbydefault.[scrape_interval:<duration>|default=1m] #抓取间隔
#Howlonguntilascraperequesttimesout.[scrape_timeout:<duration>|default=10s] #抓取超时时间
#Howfrequentlytoevaluaterules.[evaluation_interval:<duration>|default=1m] #评估规则间隔
3.2 scrapy_config片段主要参数
一个scrape_config片段指定一组目标和参数,目标就是实例,指定采集的端点,参数描述如何采集这些实例,主要参数如下:
scrape_interval:抓取间隔,默认继承global值。
scrape_timeout:抓取超时时间,默认继承global值。metric_path:抓取路径,默认是/metrics
*_sd_configs:指定服务发现配置
static_configs:静态指定服务job。
relabel_config:relabel设置。
配置监控远程Linux主机
下载安装node_exporter,再需要被监控的机器上面
[root@node1 ~]# wget https://github.com/prometheus/node_exporter/releases/download/v1.2.2/node_exporter-1.2.2.linux-amd64.tar.gz #github网站连接时好时坏,不断的下载,一直到下载成功!
[root@node1 ~]# systemctl stop firewalld
[root@node1 ~]# setenforce 0
[root@node1 ~]# tar -xvzf node_exporter-1.2.2.linux-amd64.tar.gz -C /usr/local/
[root@node1 ~]# cd /usr/local/
[root@node1 local]# mv node_exporter-1.2.2.linux-amd64/ node_exporter
[root@node1 node_exporter]# nohup ./node_exporter & #这样启动也可以,但是我不是
[root@node1 node_exporter]# netstat -tnlp
5.1 配置systemctl管理
[root@node1 node_exporter]# vim /usr/lib/systemd/system/node_exporter.service
[Unit]
Description=Prometheusnode_exporter
[Service]
User=nobody
ExecStart=/usr/local/node_exporter/node_exporter --log.level=error
ExecStop=/usr/bin/killallnode_exporter
[Install]
WantedBy=default.target
[root@node1 node_exporter]# systemctl start node_exporter #配置完成之后,这样启动
5.2 配置监控
#来到监控节点
[root@prometheus prometheus]# pwd
/usr/local/prometheus
[root@prometheus prometheus]# vim prometheus.yml #在最后面添加监控主机
- job_name: "node1"
static_configs:
- targets: ["192.168.153.144:9100"]
检测语法,检测配置文件有没有问题?
[root@prometheus prometheus]# ./promtool check config prometheus.yml #检查配置文件语法有无问题
启动
[root@prometheus prometheus]# systemctl restart prometheus
部署Grafana,就是一个展示页面,部署在哪个机器上面都可以,可要可不要
安装方式:
1.选择rpm安装。
2.二进制安装。
我这里是rpm安装
[root@grafana ~]# wget https://dl.grafana.com/oss/release/grafana-6.4.3-1.x86_64.rpm
[root@grafana ~]# yum -y install grafana-6.4.3-1.x86_64.rpm
[root@grafana ~]# systemctl start grafana-server
[root@grafana ~]# netstat -tnlp
默认账号:admin ; 默认密码:admin
登录之后,需要修改密码,自行修改即可
下面我们把prometheus服务器收集的数据做为一个数据源添加到 grafana,让grafana可以得到prometheus的数据。
邮箱报警实战
6.1 开启邮箱SNMP
7.部署AlterManager报警
这个这里提示一下 ,安装在那一台机器上面都可以,他只是用来部署报警的方式
[root@prometheus ~]# wget https://github.com/prometheus/alertmanager/releases/download/v0.23.0/alertmanager-0.23.0.linux-amd64.tar.gz
[root@prometheus ~]# tar -xvzf alertmanager-0.23.0.linux-amd64.tar.gz -C /usr/local/
[root@prometheus ~]# cd /usr/local/
[root@prometheus local]# mv alertmanager-0.23.0.linux-amd64/ alertmanager
[root@prometheus local]# vim alertmanager/alertmanager.yml
配置文件需要你们改改
global:
resolve_timeout: 5m
smtp_from: '@163.com'
smtp_smarthost: 'smtp.163.com:25'
smtp_auth_username: '@163.com'
smtp_auth_password: '填自己的' #这里要开启邮箱SMTP/POP3/IMAP认证,记录授权码
smtp_require_tls: false
# smtp_hello: '163.com'
route:
group_by: ['alertname']
group_wait: 20s
group_interval: 5m
repeat_interval: 5m
receiver: 'email'
receivers:
- name: 'email'
email_configs:
- to: '@qq.com'
send_resolved: true
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
检测语法
[root@prometheus alertmanager]# ./amtool check-config alertmanager.yml #检测语法
配置文件详解:
# 全局配置项
global:
resolve_timeout: 5m #处理超时时间,默认为5min
smtp_from: '.com' # 发送邮箱名称
smtp_smarthost: 'smtp.163.com:25' # 邮箱smtp服务器代理
smtp_auth_username: '.com' # 邮箱名称
smtp_auth_password: '' # 邮箱授权码
# 定义路由树信息
route:
group_by: ['alertname'] # 报警分组依据
group_wait: 10s # 最初即第一次等待多久时间发送一组警报的通知
group_interval: 10s # 在发送新警报前的等待时间
repeat_interval: 1m # 发送重复警报的周期 对于email配置中,此项不可以设置过低,否则将会由于邮件发送太多频繁,被smtp服务器拒绝
receiver: 'email' # 发送警报的接收者的名称,以下receivers name的名称
# 定义警报接收者信息
receivers:
- name: 'email' # 警报
email_configs: # 邮箱配置
- to: '[email protected]' # 接收警报的email配置
send_resolved: true
# 一个inhibition规则是在与另一组匹配器匹配的警报存在的条件下,使匹配一组匹配器的警报失效的规则。两个警报必须具有一组相同的标签.
inhibit_rules: #抑制规则
- source_match: #源标签
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
#配置systemctl系统管理
[root@prometheus alertmanager]# cat /usr/lib/systemd/system/alertmanager.service
[Unit]
Description=alertmanager System
Documentation=alertmanager System
[Service]
ExecStart=/usr/local/alertmanager/alertmanager --config.file=/usr/local/alertmanager/alertmanager.yml
[Install]
WantedBy=multi-user.target
[root@prometheus alertmanager]# systemctl restart alertmanager.service
这里讲一下遇到的问题,alertmanager怎么起都起不来,后来查了好多方法发现是版本问题
报错如下:
level=warn ts=2019-01-24T09:20:01.122920737Z caller=cluster.go:148 component=cluster err="couldn't deduce an advertise address: no private IP found, explicit advertise addr not provided"
level=error ts=2019-01-24T09:20:01.129140557Z caller=main.go:199 msg="unable to initialize gossip mesh" err="create memberlist: Failed to get final advertise address: No private IP address found, and explicit IP not provided"
解决办法
wget https://github.com/prometheus/alertmanager/releases/download/v0.14.0/alertmanager-0.14.0.linux-amd64.tar.gz
把alertmanager版本降低到prom/alertmanager:v0.14.0 就没有问题,必须降到0.14其他版本没有用
prometheus告警实战
修改 prometheus 配置文件
[root@prometheus local]# vim prometheus/prometheus.yml #添加如下内容
编写告警规则
创建目录,还有文件
[root@prometheus local]# mkdir prometheus/rules/
[root@prometheus local]# vim prometheus/rules/host_monitor.yml
[root@prometheus local]# cat prometheus/rules/host_monitor.yml
文件内容
groups:
- name: node-up
rules:
- alert: node-up
expr: up == 0
for: 10s
labels:
severity: warning
team: node
annotations:
summary: "民企服务 {
{ $labels.instance }} 服务已停止运行超过 10s!"
意思详解
# alert:告警规则的名称。
# expr:基于 PromQL 表达式告警触发条件,用于计算是否有时间序列满足该条件。
# for:评估等待时间,可选参数。用于表示只有当触发条件持续一段时间后才发送告警。在等待期间新产生告警的状态为 pending。
# labels:自定义标签,允许用户指定要附加到告警上的一组附加标签。
# annotations:用于指定一组附加信息,比如用于描述告警详细信息的文字等,annotations 的内容在告警产生时会一同作为参数发送到 Alertmanager。
# summary 描述告警的概要信息,description 用于描述告警的详细信息。
# 同时 Alertmanager 的 UI 也会根据这两个标签值,显示告警信息。
启动
[root@prometheus local]# systemctl restart prometheus
测试报警
#来到node1上关闭node_exporter
[root@node1 node_exporter]# systemctl stop node_exporter
#查看Prometheus监控页面
状态说明
Prometheus Alert 告警状态有三种状态:Inactive、Pending、Firing。
1、Inactive:非活动状态,表示正在监控,但是还未有任何警报触发。
2、Pending:表示这个警报必须被触发。由于警报可以被分组、压抑/抑制或静默/静音,所 以等待验证,一旦所有的验证都通过,则将转到 Firing 状态。
3、Firing:将警报发送到 AlertManager,它将按照配置将警报的发送给所有接收者。一旦警 报解除,则将状态转到 Inactive,如此循环。
报警邮件:
以上就是测试版完成,下面是终极优化版
普罗米修斯邮箱报警优化版
步骤一:来到alertmanager,机器上面
[root@prometheus alertmanager]# pwd
/usr/local/alertmanager
[root@prometheus alertmanager]# vim email.tmpl
编辑配置文件
{
{
define "email.from" }}@qq.com{
{
end }}
{
{
define "email.to" }}@qq.com{
{
end }}
{
{
define "email.to.html" }}
{
{
if gt (len .Alerts.Firing) 0 }}{
{
range .Alerts }}
@告警: <br>
告警程序: prometheus_alert <br>
告警级别: {
{
.Labels.severity }} 级 <br>
告警类型: {
{
.Labels.alertname }} <br>
故障主机: {
{
.Labels.instance }} <br>
告警主题: {
{
.Annotations.summary }} <br>
告警详情: {
{
.Annotations.description }} <br>
触发时间: {
{
.StartsAt.Add 28800e9 }} <br>
{
{
end }}
{
{
end }}
{
{
if gt (len .Alerts.Resolved) 0 }}{
{
range .Alerts }}
@恢复: <br>
告警主机:{
{
.Labels.instance }} <br>
告警主题:{
{
.Annotations.summary }} <br>
恢复时间: {
{
.EndsAt.Add 28800e9 }} <br>
{
{
end }}
{
{
end }}
{
{
end }}
步骤一:来到alertmanager,机器上面
vim alertmanager.yml 再次编辑个文件
完整版
global:
resolve_timeout: 5m
smtp_from: '@163.com'
smtp_smarthost: 'smtp.163.com:25'
smtp_auth_username: '[email protected]'
smtp_auth_password: 'P'
smtp_require_tls: false
smtp_hello: '163.com'
templates:
- "/usr/local/alertmanager/email.tmpl"
route:
group_by: ['alertname']
group_wait: 5s
group_interval: 1m
repeat_interval: 1m
receiver: 'email'
receivers:
- name: 'email'
email_configs:
- to: '@qq.com'
- to: '{
{ template "email.to" . }}'
html: '{
{ template "email.to.html" . }}'
send_resolved: true
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
检测语法完成测试
[root@prometheus alertmanager]# ./amtool check-config alertmanager.yml #每次改完配置,都可以检测一下配置文件,只检测alertmanager.yml即可,里面包含报警模板等配置文件
[root@node1 ~]# systemctl stop node_exporter