内容来自“极客时间” --运维监控系统实战笔记
如何快速搭建Prometheus系统?
云原生标配的监控系统显然就是 Prometheus,而且 Prometheus 的部署非常简单,所以这一讲我们就先来自己动手搭建 Prometheus。
Prometheus 比较容易搭建,是因为它把服务端组件,包括时序库、告警引擎、数据展示三大块,整合成了一个进程,组件的数量大幅减少。Prometheus 生态的采集器就是各种 Exporter,告警发送靠的是 AlertManager 组件,下面我们先来部署 Prometheus 模块。
部署 Prometheus
把 Prometheus 和 Alertmanager 两个包都下载下来。注:Prometheus 的下载地址:https://prometheus.io/download/
下载之后解压缩,使用 systemd 托管启动,你可以参考下面的命令。
mkdir -p /opt/prometheus
wget https://github.com/prometheus/prometheus/releases/download/v2.37.1/prometheus-2.37.1.linux-amd64.tar.gz
tar xf prometheus-2.37.1.linux-amd64.tar.gz
cp -far prometheus-2.37.1.linux-amd64/* /opt/prometheus/
# service
cat <<EOF >/etc/systemd/system/prometheus.service
[Unit]
Description="prometheus"
Documentation=https://prometheus.io/
After=network.target
[Service]
Type=simple
ExecStart=/opt/prometheus/prometheus --config.file=/opt/prometheus/prometheus.yml --storage.tsdb.path=/opt/prometheus/data --web.enable-lifecycle --enable-feature=remote-write-receiver --query.lookback-delta=2m --web.enable-admin-api
Restart=on-failure
SuccessExitStatus=0
LimitNOFILE=65536
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=prometheus
[Install]
WantedBy=multi-user.target
EOF
systemctl enable prometheus
systemctl start prometheus
systemctl status prometheus
关注Prometheus 进程的启动参数
--config.file=/opt/prometheus/prometheus.yml
指定 Prometheus 的配置文件路径
--storage.tsdb.path=/opt/prometheus/data
指定 Prometheus 时序数据的硬盘存储路径
--web.enable-lifecycle
启用生命周期管理相关的 API,比如调用 /-/reload 接口就需要启用该项
--enable-feature=remote-write-receiver
启用 remote write 接收数据的接口,启用该项之后,categraf、grafana-agent 等 agent 就可以通过 /api/v1/write 接口推送数据给 Prometheus
--query.lookback-delta=2m
即时查询在查询当前最新值的时候,只要发现这个参数指定的时间段内有数据,就取最新的那个点返回,这个时间段内没数据,就不返回了
--web.enable-admin-api
启用管理性 API,比如删除时间序列数据的 /api/v1/admin/tsdb/delete_series 接口
如果正常启动,Prometheus 默认会在 9090 端口监听,访问这个端口就可以看到 Prometheus 的 Web 页面,输入下面的 PromQL 可以查到一些监控数据。
数据Prometheus 自己抓取自己的,Prometheus 会在 /metrics 接口暴露监控数据,你可以访问这个接口看一下输出。同时 Prometheus 在配置文件里配置了抓取规则,打开 prometheus.yml 就可以看到了。
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
ocalhost:9090 是暴露监控数据的地址,没有指定接口路径,默认使用 /metrics,没有指定 scheme,默认使用 HTTP,所以实际请求的是 http://localhost:9090/metrics。了解了 Prometheus 自监控的方式,下面我们来看一下机器监控。
部署 Node-Exporter
Prometheus 生态的机器监控比较简单,就是在所有的目标机器上部署 Node-Exporter,然后在抓取规则中给出所有 Node-Exporter 的地址就可以了。首先,下载 Node-Exporter(Download | Prometheus。你可以选择当下比较稳定的版本 1.3.1,下载之后解压就可以直接运行了,比如使用 nohup(生产环境建议使用 systemd 托管) 简单启动的话,可以输入下面这一行命令。
nohup ./node_exporter &> output.log &
Node-Exporter 默认的监听端口是 9100,我们可以通过下面的命令看到 Node-Exporter 采集的指标。
curl -s localhost:9100/metrics
然后把 Node-Exporter 的地址配置到 prometheus.yml 中即可。修改了配置之后,记得给 Prometheus 发个 HUP 信号,让 Prometheus 重新读取配置:kill -HUP <prometheus pid>。最终 scrape_configs 部分变成下面这段内容。
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node_exporter'
static_configs:
- targets: ['localhost:9100']
如果要监控更多机器,就在 targets 中写上多个 Node-Exporter 的地址,用逗号隔开。之后在 Prometheus 的 Web 上(菜单位置 Status -> Targets),就可以看到相关的 Targets 信息了。
Node-Exporter 默认内置了很多 collector,比如 cpu、loadavg、filesystem 等,可以通过命令行启动参数来控制这些 collector,比如要关掉某个 collector,使用 --no-collector.<name>,如果要开启某个 collector,使用 --collector.<name>。具体可以参考 Node-Exporter 的 README。Node-Exporter 默认采集几百个指标,有了这些数据,我们就可以演示告警规则的配置了。
配置告警规则
Prometheus 进程内置了告警判断引擎,prometheus.yml 中可以指定告警规则配置文件,默认配置中有个例子。
我们可以把不同类型的告警规则拆分到不同的配置文件中,然后在 prometheus.yml 中引用。比如 Node-Exporter 相关的规则,我们命名为 node_exporter.yml,最终这个 rule_files 就变成了如下配置。
rule_files:
- "node_exporter.yml"
最后,给 Prometheus 进程发个 HUP 信号,让它重新加载配置文件。
kill -HUP `pidof prometheus`
告警分成 3 个状态,Inactive、Pending、Firing。
如果我们还希望在告警的时候收到消息通知,比如邮件、短信等,就需要引入 AlertManager 组件了。
部署 Alertmanager
把上面的 prometheus.service 拿过来改一下给 Alertmanager 使用即可,下面是我改好的 alertmanager.service。
改好的:
[Unit]
Description="alertmanager"
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/alertmanager/alertmanager
WorkingDirectory=/usr/local/alertmanager
Restart=on-failure
SuccessExitStatus=0
LimitNOFILE=65536
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=alertmanager
[Install]
WantedBy=multi-user.target
Alertmanager 解压到 /usr/local/alertmanager 目录,通过 ExecStart 可以看出,直接执行二进制就可以,实际 Alertmanager 会读取二进制同级目录下的 alertmanager.yml 配置文件。
global:
smtp_from: 'username@163.com'
smtp_smarthost: 'smtp.163.com:465'
smtp_auth_username: 'username@163.com'
smtp_auth_password: '这里填写授权码'
smtp_require_tls: false
route:
group_by: ['alertname']
group_wait: 30s
group_interval: 1m
repeat_interval: 1h
receiver: 'email'
receivers:
- name: 'web.hook'
webhook_configs:
- url: 'http://127.0.0.1:5001/'
- name: 'email'
email_configs:
- to: 'ulricqin@163.com'
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
Prometheus 自带的看图工具,是给专家用的,需要对指标体系非常了解,经验没法沉淀,而且绘图工具单一,只有折线图。如果你希望有一个更好用的 UI 工具,可以试试 Grafana。
Grafana 是一个数据可视化工具,有丰富的图表类型,视觉效果很棒,插件式架构,支持各种数据源,是开源监控数据可视化的标杆之作。Grafana 可以直接对接 Prometheus,大部分使用 Prometheus 的用户,也都会使用 Grafana,
小结
prometheus框架图
Pushgateway:用于接收短生命周期任务的指标上报,是 PUSH 的接收方式。因为 Prometheus 主要是 PULL 的方式拉取监控数据,这就要求在拉取的时刻,监控对象得活着,但是很多短周期任务,比如 cronjob,可能半秒就运行结束了,就没法拉取了。为了应对这种情况,才单独做了 Pushgateway 组件作为整个生态的补充。Service discovery:我们演示抓取数据时,是直接在 prometheus.yml 中配置的多个 Targets。这种方式虽然简单直观,但是也有弊端,典型的问题就是如果 Targets 是动态变化的,而且变化得比较频繁,那就会造成管理上的灾难。所以 Prometheus 提供了多种服务发现机制,可以动态获取要监控的目标,比如 Kubernetes 的服务发现,可以通过调用 kube-apiserver 动态获取到需要监控的目标对象,大幅降低了抓取目标的管理成本。