1.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架构介绍

prometheus企业级监控 - 图1

1.1 组件说明

  • prometheus server是Prometheus组件中的核心部分,负责实现对监控数据的获取,存储以及查询。
  • exporter简单说是采集端,通过http服务的形式保留一个url地址,prometheu sserver通过访问该exporter提供的endpoint端点,即可获取到需要采集的监控数据。
  • AlertManager在prometheus中,支持基于PromQL创建告警规则,如果满足定义的规则,则会产生一条告警信息,进入AlertManager进行处理。可以集成邮件,微信或者通过webhook自定义报警。
  • Pushgateway由于Prometheus数据采集采用pull方式进行设置的,内置必须保证prometheus-server和对应的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适合用于虚拟机、物理机的监控,因为每个监控指标是以 IP 地址作为标识进行区分的。而Prometheus的监控指标是由多个 label 组成,IP地址并不是唯一的区分指标,Prometheus 强大在可以支持自动发现规则,因此适合于容器环境。

从自定义监控项角度而言,Prometheus 开发难度较大,zabbix配合shell脚本更加方便。Prometheus在监控虚拟机上业务时,可能需要安装多个 exporter,而zabbix只需要安装一个 Agent。

Prometheus 采用拉数据方式,即使采用的是push-gateway,prometheus也是从push-gateway拉取数据。而Zabbix可以推可以拉。

1.4 环境介绍

操作系统 ip地址 主机名 应用
CentOS 7.8 192.168.153.205 grafana grafana
CentOS 7.4 192.168.153.143 prometheus prometheus,alertmanager
CentOS 7.4 192.168.153.144 node1 node_exporter

2.Prometheus部署

2.1 下载安装

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
  2. [root@prometheus ~]# tar -xzvf prometheus-2.31.0-rc.0.linux-amd64.tar.gz -C /usr/local/
  3. [root@prometheus local]# mv prometheus-2.31.0-rc.0.linux-amd64/ prometheus
  4. [root@prometheus local]# cd prometheus/
  5. [root@prometheus prometheus]# mkdir data #创建数据存放目录

2.2 配置systemctl管理

[root@prometheus prometheus]# vim /usr/lib/systemd/system/prometheus.service
[root@prometheus prometheus]# cat /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

prometheus企业级监控 - 图3

prometheus企业级监控 - 图4

prometheus企业级监控 - 图5

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设置。

4.PromQL介绍

Prometheus提供了一种名为PromQL(Prometheus查询语言)的函数式查询语言,允许用户实时选择和聚合时间序列数据。表达式的结果既可以显示为图形,也可以在Prometheus的表达式浏览器中作为表格数据查看,或者通过HTTPAPI由外部系统使用。
运算:  乘:*   除:/    加:+     减:-

常用函数:
sum()函数:求出找到所有value的值irate()函数:统计平均速率
by(标签名)
范围匹配
#5分钟之内
[5m]

4.1 查询指定mertic_name

prometheus企业级监控 - 图6

prometheus企业级监控 - 图7

prometheus企业级监控 - 图8

4.2 带标签的查询

node_cpu_seconds_total{instance="192.168.153.144:9100"}

prometheus企业级监控 - 图9

4.3 多标签查询

node_cpu_seconds_total{instance="192.168.153.144:9100", mode="system"}

prometheus企业级监控 - 图10

4.4 计算 CPU 使用率

100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance) * 100)

prometheus企业级监控 - 图11

5.监控远程Linux主机

prometheus企业级监控 - 图12

下载安装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

prometheus企业级监控 - 图13

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  #配置完成之后,这样启动

prometheus企业级监控 - 图14

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"]

prometheus企业级监控 - 图15

[root@prometheus prometheus]# ./promtool check config prometheus.yml #检查配置文件语法有无问题

prometheus企业级监控 - 图16

[root@prometheus prometheus]# systemctl restart prometheus

prometheus企业级监控 - 图17

部署Grafana

安装方式:

1.选择rpm安装。

2.二进制安装。

我这里是rpm安装

prometheus企业级监控 - 图18

prometheus企业级监控 - 图19

[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

prometheus企业级监控 - 图20

默认账号:admin ; 默认密码:admin

登录之后,需要修改密码,自行修改即可

prometheus企业级监控 - 图21

prometheus企业级监控 - 图22

下面我们把prometheus服务器收集的数据做为一个数据源添加到 grafana,让grafana可以得到prometheus的数据。

prometheus企业级监控 - 图23

prometheus企业级监控 - 图24

prometheus企业级监控 - 图25

prometheus企业级监控 - 图26

prometheus企业级监控 - 图27
image.png

告警方式

1.1. Prometheus 告警介绍

与Zabbix告警不同,Prometheus将告警分为两个部分:Prometheus 和 Alertmanager。其中Prometheus配置告警触发规则,对指标进行监控和计算,将再将告警信息发送到Alertmanager中。Alertmanager对告警进行管理,比如合并抑制等操作。

image.png

1.2. AlertManager介绍

Alertmanager处理由客户端应用程序(例如Prometheus服务器)发送的警报。它负责将重复数据删除,分组和路由到正确的接收者,通知方式有电子邮件、短信、微信等。它还负责沉默和禁止警报。Altermanager有以下几个功能点

  • 分组

当机房网络故障时,或者机房断电时,会突然有大量相同的告警出现,此时就需要对告警进行分组聚合,整合成少量告警发出。每个告警信息中会列出受影响的服务或者机器。

  • 抑制(Inhibition)

当集群故障时,会引发一系列告警,此时只需要通知集群故障,其它因为集群故障引起的告警应该被抑制,避免干扰判断。

  • 静默(Silences)

当集群升级、服务更新的过程中,大概率导致告警。因此在升级期间,对这些告警进行静默,不再发送相关告警。

告警相关配置

2.1 altermanager配置文件

2.1.1 全局配置

# global 指定了默认的接收者配置项                YAML        复制代码
global:
  # 默认smtp 配置项,如果recivers中没有配置则采用全局配置项 
  [ smtp_from: <tmpl_string> ]
  [ smtp_smarthost: <string> ]
  [ smtp_hello: <string> | default = "localhost" ]
  [ smtp_auth_username: <string> ]
  [ smtp_auth_password: <secret> ]
  [ smtp_auth_identity: <string> ]
  [ smtp_auth_secret: <secret> ]
  [ smtp_require_tls: <bool> | default = true ]

  # 企业微信告警配置
  [ wechat_api_url: <string> | default = "https://qyapi.weixin.qq.com/cgi-bin/" ]
  [ wechat_api_secret: <secret> ]
  [ wechat_api_corp_id: <string> ]

  # 默认http客户端配置,不推荐配置。参考官方文档: https://prometheus.io/docs/alerting/latest/clients/
  [ http_config: <http_config> ]

  # 如果警报不包含EndsAt,则ResolveTimeout是Alertmanager使用的默认值,经过此时间后,如果尚未更新,则可以将警报声明为已解决。
  # 这对Prometheus的警报没有影响,因为它们始终包含EndsAt。
  [ resolve_timeout: <duration> | default = 5m ]

# 定义通知模板,最好一个列表元素可以使用Linux通配符,如 *.tmpl
templates:
  [ - <filepath> ... ]

# 定义路由
route: <route>

# 定义通知的接收者
receivers:
  - <receiver> ...

# 告警抑制规则
inhibit_rules:
  [ - <inhibit_rule> ... ]

2.1.2. 路由配置

每个警报都会在已配置的顶级路由处进入路由树,该路由树必须与所有警报匹配(即没有任何已配置的匹配器)。然后遍历子节点。如果将continue设置为false,它将在第一个匹配的子项之后停止。如果在匹配的节点上true为true,则警报将继续与后续的同级进行匹配。如果警报与节点的任何子节点都不匹配(不匹配的子节点或不存在子节点),则根据当前节点的配置参数来处理警报。

# 告警接收者
[ receiver: <string> ]
# 告警根据标签进行分组,相同标签的作为一组进行聚合,发送单条告警信息。特殊值 '...' 表示告警不聚合
[ group_by: '[' <labelname>, ... ']' ]

# 告警是否匹后续的同级节点,如果为true还会继续进行规则匹配,否则匹配成功就截止
[ continue: <boolean> | default = false ]

# 报警必须匹配到labelname,否则无法匹配到该组路由,一般用于发送给不同联系人时使用
match:
  [ <labelname>: <labelvalue>, ... ]
match_re:
  [ <labelname>: <regex>, ... ]

# 第一次发送当前group报警等待的时间,目的是实现同组告警的聚合
[ group_wait: <duration> | default = 30s ]

# 当上一次group告警发送成功后,改组又出现新的告警,那么等待多久再发送,一般设置为5分钟或者更久
[ group_interval: <duration> | default = 5m ]

# 已经发送成功的告警,但是一直没消除,那么等待多久再发送。一般推荐三个小时以上
[ repeat_interval: <duration> | default = 4h ]

# 子路由
routes:
  [ - <route> ... ]

2.1.3. 接收者配置

# 接收者名称,唯一标识
name: <string>

# 接收方式
email_configs:
  [ - <email_config>, ... ]
pagerduty_configs:
  [ - <pagerduty_config>, ... ]
pushover_configs:
  [ - <pushover_config>, ... ]
slack_configs:
  [ - <slack_config>, ... ]
opsgenie_configs:
  [ - <opsgenie_config>, ... ]
webhook_configs:
  [ - <webhook_config>, ... ]
victorops_configs:
  [ - <victorops_config>, ... ]
wechat_configs:
  [ - <wechat_config>, ... ]

6.邮箱报警实战

6.1 开启邮箱SMTP

prometheus企业级监控 - 图30

7.部署AlertManager报警

[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
#route:
#  group_by: ['alertname']
#  group_wait: 30s
#  group_interval: 5m
#  repeat_interval: 1h
#  receiver: 'web.hook'
#receivers:
#- name: 'web.hook'
#  webhook_configs:
#  - url: 'http://127.0.0.1:5001/'
#inhibit_rules:
#  - source_match:
#      severity: 'critical'
#    target_match:
#      severity: 'warning'
#    equal: ['alertname', 'dev', 'instance']
global:
  resolve_timeout: 5m
  smtp_from: 'feigeyoungfit@163.com'
  smtp_smarthost: 'smtp.163.com:25'
  smtp_auth_username: 'feigeyoungfit@163.com'
  smtp_auth_password: 'LLWCLIXIADHVTPVJ' #这里要开启邮箱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: '908367919@qq.com'
    send_resolved: true
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']
========================================================================================
配置文件详解:
# 全局配置项
global: 
  resolve_timeout: 5m #处理超时时间,默认为5min
  smtp_from: 'ayoungfit@163.com' # 发送邮箱名称
  smtp_smarthost: 'smtp.163.com:25' # 邮箱smtp服务器代理
  smtp_auth_username: 'ayoungfit@163.com' # 邮箱名称
  smtp_auth_password: 'LLWCLIXIADHVTPVJ' # 邮箱授权码

# 定义路由树信息
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: '908367919@qq.com'  # 接收警报的email配置
    send_resolved: true
# 一个inhibition规则是在与另一组匹配器匹配的警报存在的条件下,使匹配一组匹配器的警报失效的规则。两个警报必须具有一组相同的标签.
inhibit_rules: #抑制规则
  - source_match: #源标签
     severity: 'critical'
    target_match:
     severity: 'warning'
    equal: ['alertname', 'dev', 'instance']
[root@prometheus alertmanager]# ./amtool check-config alertmanager.yml #检测语法

prometheus企业级监控 - 图31

#配置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

prometheus告警实战

修改 prometheus 配置文件

[root@prometheus local]# vim prometheus/prometheus.yml #添加如下内容

prometheus企业级监控 - 图32

prometheus企业级监控 - 图33

编写告警规则

[root@prometheus local]# mkdir prometheus/rules/
[root@prometheus local]# vim 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企业级监控 - 图34

prometheus企业级监控 - 图35

prometheus企业级监控 - 图36

状态说明
Prometheus Alert 告警状态有三种状态:Inactive、Pending、Firing。
1、Inactive:非活动状态,表示正在监控,但是还未有任何警报触发。
2、Pending:表示这个警报必须被触发。由于警报可以被分组、压抑/抑制或静默/静音,所 以等待验证,一旦所有的验证都通过,则将转到 Firing 状态。
3、Firing:将警报发送到 AlertManager,它将按照配置将警报的发送给所有接收者。一旦警 报解除,则将状态转到 Inactive,如此循环。

报警邮件:

prometheus企业级监控 - 图37

#来到node1,恢复node_exporter应用
[root@node1 node_exporter]# systemctl start node_exporter

恢复邮件:

prometheus企业级监控 - 图38

优化告警模板

新建模板文件

[root@prometheus alertmanager]# pwd
/usr/local/alertmanager
[root@prometheus alertmanager]# cat email.tmpl
{{ define "email.to.html" }}
{{- range $index, $alert := .Alerts -}}
======== 异常告警 ========
告警名称:{{ $alert.Labels.alertname }}
告警级别:{{ $alert.Labels.severity }}
告警机器:{{ $alert.Labels.instance }} {{ $alert.Labels.device }}
告警详情:{{ $alert.Annotations.summary }}
告警时间:{{ $alert.StartsAt.Format "2021-10-27 15:04:05" }}
========== END ==========
{{- end }}
{{- end }}
{{- if gt (len .Alerts.Resolved) 0 -}}
{{- range $index, $alert := .Alerts -}}
======== 告警恢复 ========
告警名称:{{ $alert.Labels.alertname }}
告警级别:{{ $alert.Labels.severity }}
告警机器:{{ $alert.Labels.instance }}
告警详情:{{ $alert.Annotations.summary }}
告警时间:{{ $alert.StartsAt.Format "2021-10-27 15:04:05" }}
恢复时间:{{ $alert.EndsAt.Format "2021-10-27 15:04:05" }}
========== END ==========
{{- end }}
{{- end }}

修改配置文件使用模板

[root@prometheus alertmanager]# pwd
/usr/local/alertmanager
[root@prometheus alertmanager]# vim email.tmpl 
[root@prometheus alertmanager]# cat email.tmpl 
{{ define "email.from" }}feigeyoungfit@qq.com{{ end }}
{{ define "email.to" }}908367919@qq.com{{ end }}
{{ define "email.to.html" }}
{{ range .Alerts }}
=========start==========<br>
告警程序: prometheus_alert <br>
告警级别: {{ .Labels.severity }} 级 <br>
告警类型: {{ .Labels.alertname }} <br>
故障主机: {{ .Labels.instance }} <br>
告警主题: {{ .Annotations.summary }} <br>
告警详情: {{ .Annotations.description }} <br>
触发时间: {{ .StartsAt.Format "2021-10-27 16:58:15" }} <br>
=========end==========<br>
{{ end }}
{{ end }}

prometheus企业级监控 - 图39

[root@prometheus alertmanager]# vim alertmanager.yml
===============================================
templates:
  - '/usr/local/alertmanager/email.tmpl'
===============================================
receivers:
- name: 'email'
  email_configs:
  - to: '{{ template "email.to" . }}'
    html: '{{ template "email.to.html" . }}'
    send_resolved: true
================================================

prometheus企业级监控 - 图40

prometheus企业级监控 - 图41

#再次停止node1上的node_exporter
[root@node1 node_exporter]# systemctl stop node_exporter

prometheus企业级监控 - 图42

调整邮件时间

[root@prometheus alertmanager]# pwd
/usr/local/alertmanager
[root@prometheus alertmanager]# cat email.tmpl

prometheus企业级监控 - 图43

[root@prometheus alertmanager]# systemctl restart alertmanager
等待几分钟,它还会再次发送告警邮件

prometheus企业级监控 - 图44

[root@node1 node_exporter]# systemctl start node_exporter

prometheus企业级监控 - 图45

其实上面的报警时间仍然不对,显示的是utc时间,比北京时间慢了8个小时;可以进行如下修改:

[root@prometheus alertmanager]# vim email.tmpl

prometheus企业级监控 - 图46

[root@prometheus alertmanager]# systemctl restart alertmanager #再次重启
[root@node1 ~]# systemctl stop node_exporter #再次停止

prometheus企业级监控 - 图47

[root@node1 ~]# systemctl start node_exporter

恢复报警(可选)

[root@prometheus alertmanager]# pwd
/usr/local/alertmanager
[root@prometheus alertmanager]# cat email.tmpl
{{ define "email.from" }}feigeyoungfit@qq.com{{ end }}
{{ define "email.to" }}908367919@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 }}

prometheus企业级监控 - 图48

[root@prometheus alertmanager]# ./amtool check-config alertmanager.yml #每次改完配置,都可以检测一下配置文件,只检测alertmanager.yml即可,里面包含报警模板等配置文件

prometheus企业级监控 - 图49

[root@node1 ~]# systemctl stop node_exporter

prometheus企业级监控 - 图50·

[root@node1 ~]# systemctl start node_exporter

prometheus企业级监控 - 图51

企业微信报警实战

手机下载企业微信,创建1个企业

百度“企业微信”

扫码登录->应用管理—>创建应用

prometheus企业级监控 - 图52

prometheus企业级监控 - 图53

prometheus企业级监控 - 图54

点击“我的企业”,记录企业ID

prometheus企业级监控 - 图55

corp_id: 企业微信账号唯一 ID, 可以在我的企业中查看。
to_party: 需要发送的组(部门)。 可以在通讯录中查看
agent_id: 第三方企业应用的 ID 
api_secret: 第三方企业应用的密钥

添加微信报警模板

[root@prometheus alertmanager]# pwd
/usr/local/alertmanager
[root@prometheus alertmanager]# cat wechat.tmpl 
{{ define "wechat.tmpl" }}
{{- if gt (len .Alerts.Firing) 0 -}}{{ range .Alerts }}
@警报 <br>
实例: {{ .Labels.instance }} <br>
信息: {{ .Annotations.summary }} <br>
详情: {{ .Annotations.description }} <br>
时间: {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }} <br>
{{ end }}{{ end -}}
{{- if gt (len .Alerts.Resolved) 0 -}}{{ range .Alerts }}
@恢复 <br>
实例: {{ .Labels.instance }} <br>
信息: {{ .Annotations.summary }} <br>
时间: {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }} <br>
恢复: {{ (.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }} <br>
{{ end }}{{ end -}}
{{- end }}

prometheus企业级监控 - 图56

加入微信模板

[root@prometheus alertmanager]# vim alertmanager.yml
========================================================
templates:
  - '/usr/local/alertmanager/email.tmpl'  #这行可以不要了
  - '/usr/local/alertmanager/wechat.tmpl' #加入定义好的微信模板
=========================================================
  wechat_configs:
  - corp_id: 'wwd5348195e1cdd999'
    to_party: '1'
    agent_id: '1000018'
    api_secret: 'zO7QTGNTS3ASQWnqNWl0d5s-8A0TFEnVkiU3J9W-abc'
    send_resolved: true
    message: '{{ template "wechat.tmpl" . }}  #应用上面已有的模板

prometheus企业级监控 - 图57

prometheus企业级监控 - 图58

image.png

[root@prometheus-server alertmanager]# systemctl restart alertmanager

测试效果

[root@node1 ~]# systemctl stop node_exporter

image.png

[root@node1 ~]# systemctl start node_exporter

image.png

钉钉报警实战

在企业中,如果企业要求使用钉钉进行工作交流,那我们也可以使用钉钉接收报警消息;

钉钉会有群,我们可以创建1个云计算团队的钉钉群,在群里创建1个报警机器人;

这个机器人只要报警,在群里的云计算/运维人员都能看见

流程:创建群聊->群设置->智能群助手->添加机器人->自定义

创建钉钉报警机器人

image.png

prometheus企业级监控 - 图63
加签:是有过期时间的。要注意本地时间跟网络服务器进行同步

Webhook地址: https://oapi.dingtalk.com/robot/send?access_token=d3f1f891b45215fe63fdc9caddebf236746fd1d3642cfff2e79318e5339*****
加签Secret: SECde52a64789df2f0389d4f1089377a4b39f6908a80159ec36f86bfe77eff*****

Alertmanager 配置前的准备

需要额外安装钉钉报警的插件,从github官网上搜索即可

插件官网: https://github.com/timonwong/prometheus-webhook-dingtalk

prometheus企业级监控 - 图64

[root@prometheus alertmanager]# pwd
/usr/local/alertmanager
[root@prometheus alertmanager]# wget https://github.com/timonwong/prometheus-webhook-dingtalk/releases/download/v2.0.0/prometheus-webhook-dingtalk-2.0.0.linux-amd64.tar.gz
[root@prometheus alertmanager]# tar -xvzf prometheus-webhook-dingtalk-2.0.0.linux-amd64.tar.gz
[root@prometheus alertmanager]# cd prometheus-webhook-dingtalk-2.0.0.linux-amd64
[root@prometheus prometheus-webhook-dingtalk-2.0.0.linux-amd64]# cp config.example.yml config.yml
[root@prometheus prometheus-webhook-dingtalk-2.0.0.linux-amd64]# vim config.yml

prometheus企业级监控 - 图65

#启动
[root@prometheus prometheus-webhook-dingtalk-2.0.0.linux-amd64]# nohup ./prometheus-webhook-dingtalk --config.file=config.yml &   #回车即可,当前目录下会产生nohup.out的日志文件
[root@prometheus prometheus-webhook-dingtalk-2.0.0.linux-amd64]# tail -f nohup.out

prometheus企业级监控 - 图66

[root@prometheus alertmanager]# pwd
/usr/local/alertmanager
[root@prometheus alertmanager]# vim alertmanager.yml

prometheus企业级监控 - 图67

prometheus企业级监控 - 图68

image.png

[root@prometheus alertmanager]# systemctl restart alertmanager

测试报警

[root@node1 ~]# systemctl stop node_exporter

prometheus企业级监控 - 图70

[root@node1 ~]# systemctl start node_exporter

prometheus企业级监控 - 图71

优化报警模板

钉钉报警插件默认使用的是最简单的模板

[root@prometheus-server prometheus-webhook-dingtalk-2.0.0.linux-amd64]# vim config.yml

image.png
image.png

自定义模板

[root@prometheus-server prometheus-webhook-dingtalk-2.0.0.linux-amd64]# cat ding.tmpl 
{{ define "ding.link.content" }}
{{ if gt (len .Alerts.Firing) 0 -}}
告警列表:
-----------
{{ template "__text_alert_list" .Alerts.Firing }}
{{- end }}
{{ if gt (len .Alerts.Resolved) 0 -}}
恢复列表:
{{ template "__text_resolve_list" .Alerts.Resolved }}
{{- end }}
{{- end }}
[root@prometheus-server prometheus-webhook-dingtalk-2.0.0.linux-amd64]# vim config.yml

image.png

image.png

image.png

[root@node1 ~]# systemctl stop node_exporter

image.png

告警标签、路由、分组

标签:给每个监控项添加标签,记住“标签”,有大用!!!

[root@prometheus prometheus]# pwd
/usr/local/prometheus
[root@prometheus prometheus]# cat rules/host_monitor.yml 
在定义报警规则的时候,每个监控,定义好一个可识别的标签,可以作为报警级别,比如
severity: error
severity: warning
severity: info
不同的报警级别,发送到不同的接收者;
这里就以severity: warning为例,在应用场景中,也就是,不同的报警级别,发送到不同的接收者;

prometheus企业级监控 - 图78

[root@prometheus alertmanager]# vim alertmanager.yml

prometheus企业级监控 - 图79

prometheus企业级监控 - 图80

prometheus企业级监控 - 图81

[root@prometheus alertmanager]# systemctl restart alertmanager

说明:group by指定以什么标签进行分组,我这里指定的是severity;

默认接收者是dingding,如果报警信息中没有severity类的标签,匹配不到,会默认发送给dingdind接收者;

常规匹配到severity: warning,发送到wechat接收者;

正则匹配到severity: warning或者severity: critical,发送到email接收者;

接收者要定义好,按照如上配置,email,wechat接收者,会接收到报警消息;

测试报警

[root@node1 ~]# systemctl stop node_exporter

prometheus企业级监控 - 图82

prometheus企业级监控 - 图83

[root@node1 ~]# systemctl start node_exporter

prometheus企业级监控 - 图84

prometheus企业级监控 - 图85

Mysql单机监控

prometheus企业级监控 - 图86

#node节点安装数据库
[root@node1 ~]# yum -y install mariadb-server
[root@node1 ~]# systemctl start mariadb
[root@node1 ~]# mysql
MariaDB [(none)]> grant select,process,super,replication client,reload on *.* to 'exporter'@'localhost' identified by '123456';

MariaDB [(none)]> flush privileges;

#被监控节点安装mysqld_exporter
[root@node1 ~]# wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.13.0/mysqld_exporter-0.13.0.linux-amd64.tar.gz
[root@node1 ~]# tar -xvzf mysqld_exporter-0.13.0.linux-amd64.tar.gz  -C /usr/local/
[root@node1 ~]# cd /usr/local/mysqld_exporter-0.13.0.linux-amd64/
[root@node1 mysqld_exporter-0.13.0.linux-amd64]# vim $HOME/.my.cnf
[client]
host=localhost
user=exporter
password=123456
#socket=/tmp/mysql3306.sock
[root@node1 mysqld_exporter-0.13.0.linux-amd64]# nohup ./mysqld_exporter &

prometheus企业级监控 - 图87

prometheus企业级监控 - 图88

[root@prometheus prometheus]# pwd
/usr/local/prometheus
[root@prometheus prometheus]# vim prometheus.yml

prometheus企业级监控 - 图89

[root@prometheus prometheus]# systemctl restart prometheus

配置grafana

prometheus企业级监控 - 图90

prometheus企业级监控 - 图91

prometheus企业级监控 - 图92

prometheus企业级监控 - 图93

Mysql 主从监控

Mysql主从复制搭建

搭建过程: 略
主库从库,都需要安装mysqld_exporter,配置好配置文件之后,启动;

[root@node1 ~]# cat /root/.my.cnf 
[client]
host=localhost
user=exporter
password=FeiGe@2021
#socket=/tmp/mysql3306.sock
[root@node2 ~]# cat /root/.my.cnf 
[client]
host=localhost
user=exporter
password=FeiGe@2021
#socket=/tmp/mysql3306.sock

从库访问查看

prometheus企业级监控 - 图94

[root@prometheus prometheus]# vim prometheus.yml
  - job_name: "node2-mysql"
    static_configs:
      - targets: ["192.168.153.147:9104"]

prometheus企业级监控 - 图95

[root@prometheus prometheus]# systemctl restart prometheus

标签查询

mysql_slave_status_slave_io_running

prometheus企业级监控 - 图96

mysql_up

prometheus企业级监控 - 图97

主从模板

7371

prometheus企业级监控 - 图98

prometheus企业级监控 - 图99

prometheus企业级监控 - 图100

添加 MySQL 告警规则

[root@prometheus prometheus]# pwd
/usr/local/prometheus
[root@prometheus prometheus]# cat rules/mysql.yml 
groups:
- name: Mysql-rules
  rules:
  - alert: Mysql status
    expr: up == 0
    for: 5s
    labels:
      severity: error
    annotations:
      summary: "千锋郑州云计算飞哥的 {{ $labels.instance }} 的Mysql已停止运行!"
      description: "Mysql数据库宕机,请检查"

  - alert: Mysql slave io thread status
    expr: mysql_slave_status_slave_io_running == 0
    for: 5s
    labels:
      severity: error
    annotations:
      summary: "千锋郑州云计算飞哥的 {{ $labels.instance }} Mysql slave io thread已停止"
      description: "Mysql主从IO线程故障,请检测"

  - alert: Mysql slave sql thread status
    expr: mysql_slave_status_slave_sql_running == 0
    for: 5s
    labels:
      severity: error
    annotations:
      summary: "千锋郑州云计算飞哥的 {{ $labels.instance }} Mysql slave sql thread已停止"
      description: "Mysql主从sql线程故障,请检测"

prometheus企业级监控 - 图101

[root@prometheus local]# pwd
/usr/local
[root@prometheus local]# vim alertmanager/alertmanager.yml

prometheus企业级监控 - 图102

prometheus企业级监控 - 图103

[root@prometheus-server prometheus]# systemctl restart alertmanager prometheus

测试报警

停止从库的sql线程观察

[root@node2 ~]# mysql -uroot -p'FeiGe@2021'
mysql> stop slave sql_thread;

prometheus企业级监控 - 图104

mysql> start slave sql_thread;

prometheus企业级监控 - 图105

Redis 监控

安装redis

[root@node1 ~]# vim /etc/redis.conf
bind 0.0.0.0
[root@node1 ~]# systemctl start redis

需要下载redis_exporter

https://github.com/oliver006/redis_exporter/releases/tag/v1.29.0

prometheus企业级监控 - 图106

[root@node1 ~]# wget https://github.com/oliver006/redis_exporter/releases/download/v1.29.0/redis_exporter-v1.29.0.linux-amd64.tar.gz
[root@node1 ~]# cd /usr/local/redis_exporter-v1.29.0.linux-amd64/
解压后只有一个二进制程序就叫 redis_exporter 通过 -h 可以获取到帮助信息,
下面列出一 些常用的选项: 
-redis.addr:指明一个或多个 Redis 节点的地址,多个节点使用逗号分隔,默认为redis://localhost:6379 
-redis.password:验证 Redis 时使用的密码; 
-redis.file:包含一个或多个 redis 节点的文件路径,每行一个节点,此选项与 
-redis.addr 互 斥。-web.listen-address:监听的地址和端口,默认为 0.0.0.0:9121
[root@node1 redis_exporter-v1.29.0.linux-amd64]# nohup ./redis_exporter -redis.addr 192.168.153.144:6379 &

prometheus企业级监控 - 图107

prometheus企业级监控 - 图108

修改prometheus文件

[root@prometheus local]# pwd
/usr/local
[root@prometheus local]# vim alertmanager/alertmanager.yml
  - job_name: "node1-redis"
    static_configs:
      - targets: ["192.168.153.144:9121"]

prometheus企业级监控 - 图109

prometheus企业级监控 - 图110

[root@prometheus local]# systemctl restart prometheus

这里注意:如果 redis 没有配置内存 最大可用值

redis设置最大使用内存

[root@node1 local]# redis-cli
127.0.0.1:6379> CONFIG GET maxmemory
1) "maxmemory" 
2) "0"
[root@node1 local]# vim /etc/redis.conf

prometheus企业级监控 - 图111

[root@node1 local]# systemctl restart redis

导入redis监控模板

763

prometheus企业级监控 - 图112

prometheus企业级监控 - 图113

配置告警规则

#我这里就监控一下redis的客户端连接数;
[root@prometheus local]# cat prometheus/rules/redis.yml 
groups:
- name: redis_instance
  rules:
#redis实例宕机 危险等级:5
  - alert: RedisInstanceDown
    expr: redis_up == 0
    for: 5s
    labels:
      severity: error
    annotations:
      summary: "Redis down (export {{ $labels.instance }})"
      description: "Redis instance is down\n VALUE = {{ $value }}\n INSTANCE: {{ $labels.addr }} {{ $labels.alias}}"
# redis 连接数过多 危险等级: 3
  - alert: RedisTooManyConnections
    expr: redis_connected_clients > 2 #设置为大于2就报警,为了看测试效果
    for: 5s
    labels:
      severity: warning
    annotations:
      summary: "Too many connections (export {{ $labels.instance }})"
      description: "Redis instance has too many connections\n VALUE = {{ $value }}\n INSTANCE: {{ $labels.addr }} {{ $
labels.alias}}"
[root@prometheus local]# systemctl restart prometheus

测试报警

将连接数搞成大于2

prometheus企业级监控 - 图114

prometheus企业级监控 - 图115

prometheus企业级监控 - 图116

prometheus企业级监控 - 图117

将连接数搞成小于等于2

prometheus企业级监控 - 图118

prometheus企业级监控 - 图119

prometheus企业级监控 - 图120

虽然说VALUE的值不正确。但是能正常报警;

Docker监控

[root@node1 ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@node1 ~]# yum -y install docker-ce
[root@node1 ~]# systemctl start docker
[root@node1 ~]# docker run  --volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro  \
--volume=/var/   \
lib/docker/:/var/lib/docker:ro  \
--volume=/dev/disk/:/dev/disk:ro  \
--publish=8080:8080  \
--detach=true  \
--name=cadvisor \
google/cadvisor:latest

增加docker监控

[root@prometheus local]# vim prometheus/prometheus.yml
  - job_name: "node1-docker"
    static_configs:
      - targets: ["192.168.153.144:8080"]
[root@prometheus local]# systemctl restart prometheus

prometheus企业级监控 - 图121

容器 CPU 使用率: 
sum(irate(container_cpu_usage_seconds_total{image!=""}[1m])) without (cpu) 

查询容器内存使用量(单位:字节): 
container_memory_usage_bytes{image!=""} 

查询容器网络接收量速率(单位:字节/秒):
sum(rate(container_network_receive_bytes_total{image!=""}[1m])) without (interface) 

查询容器网络传输量速率(单位:字节/秒): 
sum(rate(container_network_transmit_bytes_total{image!=""}[1m])) without (interface) 

查询容器文件系统读取速率(单位:字节/秒): 
sum(rate(container_fs_reads_bytes_total{image!=""}[1m])) without (device) 

查询容器文件系统写入速率(单位:字节/秒): 
sum(rate(container_fs_writes_bytes_total{image!=""}[1m])) without (device) 

# grafana 
模板:193

image.png

添加报警规则

[root@prometheus-server prometheus]# cat rules/docker.yml 
groups:
- name: docker_instance
  rules:
#redis实例宕机 危险等级:5
  - alert: docker_memory_out
    expr: container_memory_usage_bytes{image!=""} > 10000  #这里设置为1000,是为了看效果
    for: 5s
    labels:
      severity: error
    annotations:
      summary: "docker 内存使用量过大 (export {{ $labels.instance }})"
      description: "VALUE = {{ $value }}"

image.png

恢复报警

image.png

pushgaway 介绍

Pushgateway 是 Prometheus 生态中一个重要工具,使用它的原因主要是:  
Prometheus 采用 pull 模式,可能由于不在一个子网或者防火墙原因,导致 Prometheus 无 法直接拉取各个 target 数据。
在监控业务数据的时候,需要将不同数据汇总, 由 Prometheus 统一收集。 
由于以上原因,不得不使用 pushgateway,但在使用之前,有必要了解一下它的一些弊端:
将多个节点数据汇总到 pushgateway, 如果 pushgateway 挂了,受影响比多个 target 大。
Prometheus 拉取状态 up 只针对 pushgateway, 无法做到对每个节点有效。 
Pushgateway 可以持久化推送给它的所有监控数据。
因此,即使你的监控已经下线,prometheus 还会拉取到旧的监控数据,需要手动清理 pushgateway 不 要的数据

数据流

prometheus企业级监控 - 图125

prometheus企业级监控 - 图126

[root@node1 ~]# wget https://github.com/prometheus/pushgateway/releases/download/v1.4.2/pushgateway-1.4.2.linux-amd64.tar.gz
[root@node1 ~]# tar -xvzf pushgateway-1.4.2.linux-amd64.tar.gz  -C /usr/local/
[root@node1 ~]# cd /usr/local/pushgateway-1.4.2.linux-amd64
[root@node1 pushgateway-1.4.2.linux-amd64]# nohup ./pushgateway &

image.png

未整理完善,待后续。。。。

自动发现实战

Consul 部署

Consul 是基于 GO 语言开发的开源工具,主要面向分布式,服务化的系统提供服务注册、

服务发现和配置管理的功能。Consul 提供服务注册/发现、健康检查、Key/Value 存储、多数

据中心和分布式一致性保证等功能。Prometheus 通过 Consul 可以很方便的实现服务自动

发现和维护,同时 Consul 支持分布式集群部署,将大大提高了稳定性,通过 Prometheus 跟

Consul 集群二者结合起来,能够高效的进行数据维护同时保证系统稳定。

[root@grafana ~]# wget https://releases.hashicorp.com/consul/1.10.3/consul_1.10.3_linux_amd64.zip
[root@grafana ~]# mv consul_1.10.3_linux_amd64.zip /usr/local/
[root@grafana local]# unzip consul_1.10.3_linux_amd64.zip

image.png

[root@grafana local]# mkdir -p /data/consul /opt/logs/consul
[root@grafana local]# nohup consul agent -dev -client=0.0.0.0 -data-dir=/data/consul -bind=0.0.0.0 -log-file=/opt/logs/consul/consul.log -log-rotate-max-files=3 &

image.png

image.png

prometheus加入

[root@prometheus prometheus]# cat /tmp/request.json 
{
    "ID":"prometheus-143", #自定义
    "Name":"monitor",    #自定义
    "Address":"192.168.153.143",  #写自己服务的ip
    "Port": 9090,    #写自己服务的port
    "Tags": ["prometheus"],
    "Check":{
        "HTTP":"http://192.168.153.143:9090/-/healthy",  #写自己服务的ip和端口
        "Interval":"10s" #每10s一检测
    }
}

[root@prometheus ~]# curl -XPUT http://192.168.153.205:8500/v1/agent/service/register -d@/tmp/request.json  #注册服务

image.png

[root@prometheus prometheus]# curl -XPUT http://192.168.153.205:8500/v1/agent/service/deregister/prometheus-143 -d@/tmp/request.json 
#取消注册

image.png

实现自动发现

#prometheus配置监控consule服务
[root@prometheus prometheus]# pwd
/usr/local/prometheus
[root@prometheus prometheus]# vim prometheus.yml
###consul自动发现
  - job_name: "node-discovery-consul"
    consul_sd_configs:
     - server: '192.168.153.205:8500'
       services: ["mysql-exporter"]
       tags: ["prometheus"]
       refresh_interval: 10s

image.png

[root@prometheus prometheus]# systemctl restart prometheus

image.png

新机器自动加入

准备2台新机器

主机名 IP 服务
consul-node2 192.168.153.147 node-exporter
consul-node3 192.168.153.201 node-exporter

image.png

image.png

[root@consul-node2 ~]# tar -xvzf node_exporter-1.2.2.linux-amd64.tar.gz  -C /usr/local/
[root@consul-node2 ~]# cd /usr/local/node_exporter-1.2.2.linux-amd64/      
[root@consul-node2 node_exporter-1.2.2.linux-amd64]# nohup ./node_exporter &
[root@consul-node2 ~]# vim /tmp/request.json
{
    "ID":"node-192.168.153.147",
    "Name":"node-exporter",
    "Address":"192.168.153.147",
    "Port": 9100,
    "Tags": ["prometheus"],
    "Check":{
        "HTTP":"http://192.168.153.147:9100/-/healthy",
        "Interval":"10s"
    }
}
[root@consul-node2 ~]# curl -XPUT http://192.168.153.205:8500/v1/agent/service/register -d@/tmp/request.json
[root@consul-node3 ~]# tar -xvzf node_exporter-1.2.2.linux-amd64.tar.gz  -C /usr/local/
[root@consul-node3 ~]# cd /usr/local/node_exporter-1.2.2.linux-amd64/      
[root@consul-node3 node_exporter-1.2.2.linux-amd64]# nohup ./node_exporter &
[root@consul-node3 ~]# vim /tmp/request.json
{
    "ID":"node-192.168.153.201",
    "Name":"node-exporter",
    "Address":"192.168.153.201",
    "Port": 9100,
    "Tags": ["prometheus"],
    "Check":{
        "HTTP":"http://192.168.153.201:9100/-/healthy",
        "Interval":"10s"
    }
}
[root@consul-node3 ~]# curl -XPUT http://192.168.153.205:8500/v1/agent/service/register -d@/tmp/request.json

image.png

image.png

image.png

注销服务

[root@consul-node3 ~]# curl --request PUT http://192.168.153.205:8500/v1/agent/service/deregister/node-192.168.153.201

image.png

image.png

测试报警

[root@consul-node3 ~]# systemctl stop node_exporter
image.png

Prometheus 数据存储

本地存储

[root@prometheus data]# pwd
/usr/local/prometheus/data
[root@prometheus data]# tree /usr/local/prometheus/data/
/usr/local/prometheus/data/        # 数据存储目录
├── 01FK01XFQDAQ3C9APNKEFT18ZT    # 数据块
│   ├── chunks                    # 数据样本
│   │   └── 000001
│   ├── index                    # 索引文件
│   ├── meta.json                # 元数据文件
│   └── tombstones                # 逻辑数据
├── 01FM3SZ21W30R9N0W50KM4HKDA
│   ├── chunks
│   │   └── 000001
│   ├── index
│   ├── meta.json
│   └── tombstones
├── chunks_head
├── lock
├── queries.active
└── wal                        # 预写日志文件,即原始时间序列数据,还未压缩为块存储到本地磁盘
    ├── 00000086
    ├── 00000087
    ├── 00000088
    └── checkpoint.00000085
        └── 00000000

数据是不会占用过多的磁盘空间的,即使这样,Prometheus提供的远程存储的方式

远程存储

image.png

以上是官网支持的存储方式

Influxdb部署

https://docs.influxdata.com/influxdb/v1.8/introduction/install/?t=Red+Hat+%26amp%3B+CentOS

image.png

#我这里和Grafana安装在一台机器上了
[root@grafana ~]# cat <<EOF | sudo tee /etc/yum.repos.d/influxdb.repo
[influxdb]
name = InfluxDB Repository - RHEL \$releasever
baseurl = https://repos.influxdata.com/rhel/\$releasever/\$basearch/stable
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdb.key
EOF
[root@grafana ~]# yum install influxdb -y
[root@grafana ~]# systemctl start influxdb

image.png

创建数据库

image.png

image.png

Prometheus指定存储路径

[root@prometheus prometheus]# vim /usr/lib/systemd/system/prometheus.service
--storage.tsdb.path=/usr/local/prometheus/data

image.png

[root@prometheus prometheus]# systemctl daemon-reload
[root@prometheus prometheus]# systemctl restart prometheus

添加远程读写

[root@prometheus prometheus]# pwd
/usr/local/prometheus
[root@prometheus prometheus]# vim prometheus.yml
#远程写入地址
remote_write:
  - url: "http://192.168.153.205:8086/api/v1/prom/write?db=prometheus"
#远程读取地址
remote_read:
  - url: "http://192.168.153.205:8086/api/v1/prom/read?db=prometheus"

image.png

image.png

[root@prometheus prometheus]# systemctl restart prometheus

验证influxdb数据

查看influxdb是否有数据写入

[root@grafana ~]# influx
> use prometheus
> show measurements  #会显示出来很多表
> select * from redis_memory_max_bytes; 查看这张表中是否有监控数据

image.png

验证数据可靠性:

停止 Prometheus 服务。同时删除 Prometheus 的 data 目录,重启 Prometheus。打开 Prometheus

UI 如果配置正常,Prometheus 可以正常查询到本地存储以删除的历史数据记录。

image.png

进入influxdb数据库,数据仍然存在;

image.png