Prometheus是一个开源的监控和报警系统,用于收集、存储和查询时间序列数据。
Prometheus Server是Prometheus组件中的 核心部分,负责实现对 监控数据的获取,存储以及查询。
Prometheus Server可以通过静态配置管理监控目标,也可以配合使用Service Discovery的方式动态管理监控目标,并从这些监控目标中获取数据。其次Prometheus Server需要对采集到的监控数据进行存储,Prometheus Server本身就是一个时序数据库,将采集到的监控数据按照时间序列的方式存储在本地磁盘当中。
最后Prometheus Server对外提供了自定义的 PromQL语言,实现对数据的查询以及分析。Prometheus Server内置的Express Browser UI,通过这个UI可以直接通过PromQL实现数据的查询以及可视化。
Exporter将监控数据采集的端点通过HTTP服务的形式暴露给Prometheus Server,Prometheus Server通过访问该Exporter提供的Endpoint端点,即可获取到需要采集的监控数据。
当需要采集不同的监控指标(例如:主机、MySQL、Nginx)时,需要运行相应的监控采集程序(exporter),并且让Prometheus Server知道Exporter实例的访问地址。
在Prometheus中,每一个暴露监控样本数据的HTTP服务称为一个实例(instance),它是被监控的具体目标。 监控这些instances的任务叫做job。每个job负责一类任务,可以为一个job配置多个instance,job对自己的instance执行相同的动作。隶属于job的instance可以直接在配置文件中指定。也可以让job自动从consul、kuberntes中动态获取,这个过程就是服务发现。
Prometheus自身不具备告警能力,需要结合AlertManager实现监控指标告警。 由Prometheus配置告警规则,当告警规则触发后,会把告警信息推送给Altermanager,AlertManager收到告警之后在根据配置的路由,根据报警级别不同分别发送给不同的receive(收件人),AlertManager可以实现 email、企业微信、钉钉等报警。Prometheus作为客户端,Alertmanager负责处理来自客户端的告警通知。对告警通知进行分组、去重后,根据路由规则将其路由到不同的receiver。
由于Prometheus数据采集基于Pull模型进行设计,因此在网络环境的配置上必须要让Prometheus Server能够直接与Exporter进行通信。当这种网络需求无法直接满足时,就可以利用PushGateway来进行中转。通过PushGateway将内部网络的监控数据主动Push到Gateway当中,Prometheus Server再采用同样Pull的方式从PushGateway中获取到监控数据。
通过访问安装了exporter的机子的ip地址加上端口号9100加上路径/metrics的页面可以查看到当前抓取的数据,TYPE字段中包含有类型。如:
http://192.168.168.12:9100/metrics
使用ctrl+F可以搜索对应的类型
特点是只增不减,除非系统发生重置,常用来记录某些事件发生的次数。一般在定义Counter类型指标的名称时推荐使用_total作为后缀。
侧重于反应系统的当前状态。因此这类指标的样本数据可增可减。
用于统计和分析样本的分布情况。
也用于统计和分析样本的分布情况。
Zabbix | Prometheus |
---|---|
传统的基于代理的模型 | 时间序列数据模型 |
自定义查询语言 | PromQL |
关系型数据库 | 时间序列数据库(TSDB) |
基于Web的前端界面 | 与Grafana等工具集成 |
本地计算机、网络和基础设施监控 | 云计算、容器和微服务监控 |
Prometheus官网下载地址:https://prometheus.io/download/
mkdir /data/apps
cd /data/apps
wget https://github.com/prometheus/prometheus/releases/download/v2.37.2/prometheus-2.37.2.linux-amd64.tar.gz
或者(可能更快)
wget https://githubfast.com/prometheus/prometheus/releases/download/v2.37.2/prometheus-2.37.2.linux-amd64.tar.gz
tar -xzvf prometheus-2.37.2.linux-amd64.tar.gz -C /usr/local
cd /usr/local
mv prometheus-2.37.2.linux-amd64 prometheus
cd /usr/local/prometheus
./prometheus --version
./promtool check config prometheus.yml
mkdir -p /var/lib/prometheus
vim /usr/lib/systemd/system/prometheus.service
写入
[Unit]
Description=Prometheus
Documentation=https://prometheus.io/
After=network.target
[Service]
# Type设置为notify时,服务会不断重启
Type=simple
User=root
# --storage.tsdb.path是可选项,默认数据目录在运行目录的./dada目录中
ExecStart=/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml --storage.tsdb.path=/var/lib/prometheus --web.enable-lifecycle
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
systemctl enable prometheus && systemctl start prometheus
systemctl status prometheus
浏览器输入http://你的ip地址:9090
node_exporter收集当前机器的系统数据 ,采用prometheus官方提供的exporter,除node_exporter外,官方还提供consul,memcached,haproxy,mysqld等exporter
wget https://github.com/prometheus/node_exporter/releases/download/v1.4.0/node_exporter-1.4.0.linux-amd64.tar.gz
tar -zvxf node_exporter-1.4.0.linux-amd64.tar.gz -C /usr/local/
如果下载慢试试
wget https://githubfast.com/prometheus/node_exporter/releases/download/v1.4.0/node_exporter-1.4.0.linux-amd64.tar.gz
vim /usr/lib/systemd/system/node_exporter.service
写入
[Unit]
Description=node_exporter
Documentation=https://prometheus.io/
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/node_exporter/node_exporter
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
systemctl enable node_exporter && systemctl start node_exporter
在prometheus Server 配置文件中添加被监控的机器
vim /usr/local/prometheus/prometheus.yml
添加
- job_name: "node1"
static_configs:
- targets: ['被监控的机子的IP:9100']
/usr/local/prometheus/promtool check config prometheus.yml
curl -X POST http://127.0.0.1:9090/-/reload
http://被监控机子IP:9100/metrics,查看从exporter具体能抓到的数据
在Prometheus的web主页面,点击Graph,再在输入框里输入PromQL,执行后可以点击下面的Graph查看图表
一些PromQL如下
获取系统信息
node_uname_info
获取系统uptime 时间
sum(time() - node_boot_time_seconds)by(instance)
系统启动时间
node_boot_time_seconds
系统当前时间
time()
CPU核数
count(node_cpu_seconds_total{mode='system'}) by (instance)
计算 CPU 使用率
(1 - sum(rate(node_cpu_seconds_total{mode="idle"}[1m])) by (instance) / sum(rate(node_cpu_seconds_total[1m])) by (instance) ) * 100
计算内存使用率
(1- (node_memory_Buffers_bytes + node_memory_Cached_bytes + node_memory_MemFree_bytes) / node_memory_MemTotal_bytes) * 100
查看节点总内存
node_memory_MemTotal_bytes/1024/1024/1024
计算磁盘使用率
(1 - node_filesystem_avail_bytes{fstype=~"ext4|xfs"} /
node_filesystem_size_bytes{fstype=~"ext4|xfs"}) * 100
磁盘IO
磁盘读 IO 使用
sum by (instance) (rate(node_disk_reads_completed_total[5m]))
磁盘写 IO 使用
sum by (instance) (rate(node_disk_writes_completed_total[5m]))
网络带宽
下行带宽
sum by(instance) (irate(node_network_receive_bytes_total{device!~"bond.*?|lo"}[5m]))
上行带宽
sum by(instance) (irate(node_network_transmit_bytes_total{device!~"bond.*?|lo"}[5m]))
blackbox_exporter是 Prometheus 官方提供的 exporter,可通过 HTTP、HTTPS、DNS、TCP、ICMP 对端点进行可用性等指标探测。类似zabbix的监控项
blackbox_exporter 官方文档
https://github.com/prometheus/blackbox_exporter
blackbox_exporter能实现以下功能:
wget https://github.com/prometheus/blackbox_exporter/releases/download/v0.22.0/blackbox_exporter-0.22.0.linux-amd64.tar.gz
tar -zvxf blackbox_exporter-0.22.0.linux-amd64.tar.gz -C /usr/local/
cd /usr/local/
mv blackbox_exporter-0.22.0.linux-amd64.tar.gz blackbox_exporter
下载慢尝试:
wget https://githubfast.com/prometheus/blackbox_exporter/releases/download/v0.22.0/blackbox_exporter-0.22.0.linux-amd64.tar.gz
cd /usr/local/blackbox_exporter
./blackbox_exporter --version
vim /usr/lib/systemd/system/blackbox_exporter.service
写入
[Unit]
Description=blackbox_exporter
After=network.target
[Service]
User=root
Type=simple
ExecStart=/usr/local/blackbox_exporter/blackbox_exporter --config.file=/usr/local/blackbox_exporter/blackbox.yml
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
systemctl start blackbox_exporter && systemctl enable blackbox_exporter
ps -ef | grep blackbox_exporter
http://被监控机子的IP:9115
blackbox_exporter的配置文件无特殊需求使用默认配置即可
cat /usr/local/blackbox_exporter/blackbox.yml
以下均在Prometheus Server端操作
在prometheus.yml中添加blackbox_exporter的配置, 要注意yml文件的语法规范
vim /usr/local/prometheus/prometheus.yml
#icmp ping 监控
- job_name: crawler_status
metrics_path: /probe
params:
module: [icmp]
static_configs:
- targets: ['223.5.5.5','114.114.114.114']
labels:
instance: node_status
group: 'icmp-node'
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 安装blackbox_expoter的ip地址:9115
#监控tcp端口
- job_name: tcp_port
metrics_path: /probe
params:
module: [tcp_connect]
file_sd_configs:
- files: ['/usr/local/prometheus/conf.d/tcp_port/*.yml']
refresh_interval: 10s
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 安装blackbox_expoter的ip地址:9115
上一个配置指定了配置文件,在这里新建文件
mkdir -p /usr/local/prometheus/conf.d/tcp_port
vim /usr/local/prometheus/conf.d/tcp_port/tcp_port.yml
写入并改写要监控的ip和端口号
- targets: ['192.168.100.234:18080','192.168.100.235:22']
labels:
group: 'tcp port'
# http get 监控
- job_name: http_get
metrics_path: /probe
params:
module: [http_2xx]
file_sd_configs:
- files: ['/usr/local/prometheus/conf.d/http_get/*.yml']
refresh_interval: 10s
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 安装blackbox_expoter的ip地址:9115
上一个配置指定了配置文件,在这里新建文件
mkdir -p /usr/local/prometheus/conf.d/http_get
vim /usr/local/prometheus/conf.d/http_get/http_get.yml
自定义要监控的内容
- targets:
- http://192.168.100.234:18080/
labels:
name: 'http_get'
- targets:
- https://www.sohu.com/
labels:
name: 'http_get'
systemctl restart prometheus
mkdir -p /usr/local/prometheus/rules/
vim /usr/local/prometheus/rules/rules.yml
groups:
- name: http_status_code
rules:
- alert: probe_http_status_code
expr: probe_http_status_code != 200
for: 1m
labels:
severity: critical
annotations:
summary: "{{ $labels.instance }} 状态码异常"
description: "{{ $labels.instance }} 网站访问异常!!! (value: {{ $value }})"
- name: icmp_ping_status
rules:
- alert: icmp_ping_status
expr: probe_icmp_duration_seconds{phase="rtt"} == 0
for: 1m
labels:
severity: critical
annotations:
summary: "主机 {{ $labels.instance }} ICMP异常"
description: "{{ $labels.instance }} ICMP异常!!!(value: {{ $value }})"
value: '{{ $value }}'
##延迟高
- name: link_delay_high
rules:
- alert: link_delay_high
expr: probe_icmp_duration_seconds{phase="rtt"} >0.005
for: 1m
labels:
severity: critical
annotations:
summary: " {{ $labels.instance }} 延迟高!"
description: "{{ $labels.instance }} 延迟高!!!(value: {{ $value }})"
/usr/local/prometheus/promtool check rules rules.yml
vim /usr/local/prometheus/prometheus.yml
找到rule_files那一行,改为
rule_files: ['/usr/local/prometheus/rules/*.yml']
systemctl restart prometheus
查看Alerts
下一篇文章:超详细 Centos7下Prometheus Alertmanager配置钉钉告警与邮箱告警(已亲手验证)
参考文档:
https://cloud.tencent.com/developer/article/2214526
https://cloud.tencent.com/developer/article/2216581