十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
在Prometheus的架构设计中,Prometheus Server并不直接服务监控特定的目标,其主要任务负责数据的收集,存储并且对外提供数据查询支持。因此为了能够能够监控到某些东西,如主机的CPU使用率,我们需要使用到Exporter。Prometheus周期性的从Exporter暴露的HTTP服务地址(通常是/metrics)拉取监控样本数据。
从上面的描述中可以看出Exporter可以是一个相对开放的概念,其可以是一个独立运行的程序独立于监控目标以外,也可以是直接内置在监控目标中。只要能够向Prometheus提供标准格式的监控样本数据即可。
这里为了能够采集到主机的运行指标如CPU, 内存,磁盘等信息。我们可以使用Node Exporter。
Node Exporter同样采用Golang编写,并且不存在任何的第三方依赖,只需要下载,解压即可运行。
下载软件包:
mkdir -p /usr/local/prometheus/exporter/node
cd /usr/local/prometheus/exporter/node
curl -s -OL https://github.com/prometheus/node_exporter/releases/download/v0.18.0/node_exporter-$Version.linux-amd64.tar.gz
tar xf node_exporter-0.18.0.linux-amd64.tar.gz
cp -a node_exporter-0.18.0.linux-amd64/node_exporter /usr/local/bin/
cat > /usr/lib/systemd/system/node-exporter.service <<-'EOF'
[Unit]
Description=This is prometheus node exporter
After=docker.service
[Service]
Type=simple
ExecStart=/usr/local/bin/node_exporter
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload && systemctl enable node-exporter.service && systemctl start node-exporter.service
node_exporter 他的本质就是监控主机系统,所以我们不建议将其部署为 docker 容器,因为他需要访问主机系统.
- job_name: node
metrics_path: /metrics
static_configs:
- targets: ['192.168.111.65:9100']
重启 prometheus,查看状态
图表编号为8919
https://grafana.com/grafana/dashboards/8919
然后可以看到如下图表
groups:
- name: hostStatsAlert
rules:
- alert: hostCpuUsageAlert
expr: (1- avg(irate(node_cpu_seconds_total{instance=~"$node",mode="idle"}[30m])))*100>85
for: 1m
labels:
level: disaster #定义一个等级标签,用于altermanager 发送消息
annotations:
summary: "实例 {{ $labels.instance }} CPU使用率过高"
description: "{{ $labels.instance }} CPU 使用率大于 85% (当前值为: {{ $value }})"
- alert: hostMemUsageAlert
expr: (1 - (node_memory_MemAvailable_bytes / (node_memory_MemTotal_bytes)))* 100>85
for: 1m
labels:
level: disaster
annotations:
summary: "实例 {{ $labels.instance }} 内存使用率过高"
description: "{{ $labels.instance }} 内存使用率大于 85% (当前的值: {{ $value }})"
- alert: hostLoad
expr: sum(node_load15) >= sum(count(node_cpu_seconds_total{mode='system'}) by (cpu)) and node_load1 > node_load5 and node_load5 > node_load15
for: 1m
labels:
level: disaster
annotations:
summary: "实例 {{ $labels.instance }} 15 分钟负载过高"
description: "{{ $labels.instance }} 15 分钟负载大于其 cpu 核心数 (当前的值: {{ $value }})"
- alert: hostUp
expr: up{job="node"} == 0
for: 1m
labels:
level: disaster
annotations:
summary: "实例 {{ $labels.instance }} 不可达"
description: "{{ $labels.instance }} 实例不可达,请尽快解决"
参考文档:
https://github.com/prometheus/node_exporter
https://yunlzheng.gitbook.io/prometheus-book/parti-prometheus-ji-chu/quickstart/prometheus-quick-start/use-node-exporter
https://grafana.com/grafana/dashboards/8919