Prometheus监控实战系列一:主机监控

前面我们介绍了Prometheus的基础概念,包括数据格式 、PromQL语法等,本节我们将讲解如何通过Prometheus实现主机的监控

Prometheus使用各种Exporter来监控资源。Exporter可以看成是监控的agent端,它负责收集对应资源的指标,并提供接口给到Prometheus读取。不同资源的监控对应不同的Exporter,如node-exporeter、mysql-exporter、kafka-exporter等,在这其中最常用的当属node_exporter。

node-exporter使用Go语言编写,它主要用来监控主机系统的各项性能参数,可收集各种主机指标的库,还提供了textfile功能,用于自定义指标。

一. 安装node-exporter

1.1 二进制安装

下载安装包并解压

1
2
3
4
5
$ cd /usr/local/src
$ wget https://github.com/prometheus/node_exporter/releases/download/v1.5.0/node_exporter-1.5.0.linux-amd64.tar.gz
$ tar -xvf node_exporter-1.5.0.linux-amd64.tar.gz
$ mv node_exporter-1.5.0.linux-amd64 /usr/local/
$ cd /usr/local/node_exporter-1.5.0.linux-amd64

启动 Node Exporter

1
2
$ ./node_exporter &

配置访问密码

具体参考

1
2
3
cat /usr/local/node_exporter-1.5.0.linux-amd64/node_exporter.yml 
basic_auth_users:
admin: $2y$10$e80fEG5laHMO/eDTUQvjzu.xGX9W4pyi9lEQVm6ILI6FJyReIqDqq

做成服务

1
2
3
4
5
6
7
8
9
10
11
12
cat /etc/systemd/system/node_exporter.service 
[Unit]
Description=node_exporter

[Service]
ExecStart=/usr/local/node_exporter-1.5.0.linux-amd64/node_exporter --web.config.file=/usr/local/node_exporter-1.5.0.linux-amd64/node_exporter.yml --web.listen-address=:9100
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target

启动服务设置开机自动启动

1
2
3
4
sudo systemctl daemon-reload
sudo systemctl start node_exporter
sudo systemctl status node_exporter
sudo systemctl enable node_exporter

查看服务器,可看到端口已启动(默认端口9100)

1
2
$ netstat -lnpt  |grep ":9100"   
tcp6 0 0 :::9100 :::* LISTEN 2345/./node_exporte

1.2 docker安装 (可选)

官方不建议通过Docekr方式部署node-exporter,因为它需要访问主机系统。通过docker部署的方式,需要把任何非根安装点都绑定到容器中,并通过–path.rootfs参数指定。

拉取镜像

1
$ docker pull prom/node-exporter

启动容器

1
$ docker run -d --net="host" --pid="host" -v "/:/host:ro,rslave" prom/node-exporter --path.rootfs=/host

部署完成后,访问节点地址:http://ip:9100/metrics ,可看到node-exporter获取的指标。

二. 配置node-exporter

node-exporter提供不少配置参数,可使用 –help 进行查看。

1
$ ./node_exporter --help

例如:通过–web.listen-address 改变监听的端口

1
$ ./node_exporter  --web.listen-address=":8080" &

如果需要收集主机上面运行服务的状态,可启用systemd收集器。由于systemd指标较多,可以用–collector.systemd.unit-include参数配置只收集指定的服务,减少无用数据,该参数支持正则表达式匹配。如docker和ssh服务状态,

示例:

1
./node_exporter --collector.systemd  --collector.systemd.unit-include="(docker|sshd).service" &

如果只想启用需要的收集器,其他的全部禁用,可用如下格式配置

1
--collector.disable-defaults --collector.<name>

三. textfile收集器

textfile是一个特定的收集器,它的功能非常有用,textfile允许我们暴露自定义的指标。这些指标或者是没有相关的exporter可以使用,或者是你自己开发的应用指标。

textfile通过扫描指定目录中的文件,提取所有符合Prometheus数据格式的字符串,然后暴露它们给到Prometheus进行抓取。

示例:

创建指标文件保存目录

1
$ mkdir /opt/prom

写入指标文件,此处我们用手动方式写入

1
2
3
4
5
$ cat <<EOF | tee /opt/prom/metadata.prom 
# HELP alex_test this is a test
# TYPE alex_test gauge
alex_test{server="test",idc="bj"} 1
EOF

启用textfile

1
./node_exporter --collector.textfile.directory="/opt/prom"  &

访问node-exporter的地址,可看到指标已生效

四. Prometheus抓取指标

在Prometheus配置关于node-exporter节点的target,即可抓取相关节点指标数据。

1
2
3
4
- job_name: 'node-exporter'
static_configs:
- targets:
- 'locahost:9100'

实例抓取正常

在表达式浏览器中搜索 {job=”node-exporter”,instance=”localhost:9100”},可看到相关指标已被收集到Prometheus。

五、实例:定义主机监控告警

修改Prometheus配置文件prometheus.yml,添加以下配置:

1
2
rule_files:
- /etc/prometheus/rules/*.rules

在目录/etc/prometheus/rules/下创建告警文件hoststats-alert.rules内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
groups:
- name: hostStatsAlert
rules:
- alert: hostCpuUsageAlert
expr: sum(avg without (cpu)(irate(node_cpu{mode!='idle'}[5m]))) by (instance) > 0.85
for: 1m
labels:
severity: page
annotations:
summary: "Instance {{ $labels.instance }} CPU usgae high"
description: "{{ $labels.instance }} CPU usage above 85% (current value: {{ $value }})"
- alert: hostMemUsageAlert
expr: (node_memory_MemTotal - node_memory_MemAvailable)/node_memory_MemTotal > 0.85
for: 1m
labels:
severity: page
annotations:
summary: "Instance {{ $labels.instance }} MEM usgae high"
description: "{{ $labels.instance }} MEM usage above 85% (current value: {{ $value }})"

重启Prometheus后访问Prometheus UI http://127.0.0.1:9090/rules可以查看当前以加载的规则文件。