[上篇] 搭建高级的性能监控系统(Prometheus+Grafana+Node Exporter+Alertmanager)

介绍

Prometheus、Grafana、Node Exporter 和Alertmanager是一组用于监控和可视化系统性能的开源工具。它们通常一起使用,形成一个强大的完整的监控和告警系统。

一般来说,这四个工具一起协作,形成了一个完整的监控和告警系统。Node Exporter用于收集主机级别的指标,Prometheus存储和查询这些指标,Grafana提供可视化界面,而Alertmanager则负责管理和发送告警。整个系统的目标是帮助管理员和开发人员实时了解系统的状态、性能和健康状况,并在必要时采取措施。

Prometheus

Prometheus 是一种开源的系统监控和警报工具。它最初由 SoundCloud 开发,并成为 Cloud Native Computing Foundation(CNCF)的一部分。Prometheus 支持多维度的数据模型和强大的查询语言,使得用户可以轻松地收集和查询各种类型的监控数据。

Grafana

Grafana 是一个开源的数据可视化和监控平台。它提供了丰富的图表和仪表盘,可以将各种数据源的信息可视化展示。Grafana 支持多个数据源,包括 Prometheus、Graphite、InfluxDB 等,因此可以与各种监控系统集成,提供灵活且强大的可视化功能。

Node Exporter

Node Exporter 是一个用于在 Unix/Linux 系统上暴露系统信息的 Prometheus Exporter。它会收集关于系统资源使用情况、性能指标等方面的信息,并将这些信息提供给 Prometheus 进行监控。Node Exporter 通常与 Prometheus 配合使用,以监控主机上的各种系统级别的指标,例如 CPU 使用率、内存使用率、磁盘空间等。

Alertmanager

Alertmanager 是 Prometheus 生态系统中的一个组件,负责处理和管理告警。当 Prometheus 检测到异常或达到某个预定的阈值时,它将生成告警并将其发送到 Alertmanager。Alertmanager 可以进行静默、分组、抑制和路由告警,并将它们发送到不同的接收端,如电子邮件、Slack 等。

预览

我们先看效果

这是grafana面板的局部截图,一个整体系统资源总览,方便我们快速发现问题并检索,这也是我们日常使用最频繁的地点。

下面是prometheus的局部截图

接下来就是alertmanager的截图,主要是接收prometheus触发的告警,alertmanager负责推送。

最后就是我们的采集器Node Exporter,在宿主机上部署,一般是监听9100端口,访问后可以看到宿主机的各种指标参数。

准备

服务端

Centos7 + Docker

客户端

Centos +可选Docker

安装使用

接下来我们将进行安装和使用,首先是安装我们指标收集器

node Exporter

代码语言:javascript
复制

#arm平台
wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-arm64.tar.gz
tar -xzf node_exporter-1.6.1.linux-arm64.tar.gz
cp node_exporter-1.6.1.linux-arm64/node_exporter /usr/local/bin/

#amd平台
wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz
tar -xzf node_exporter-1.6.1.linux-amd64.tar.gz
cp node_exporter-1.6.1.linux-amd64/node_exporter /usr/local/bin/

#进程守护
cat > /etc/systemd/system/notdeexporter.service << EOF
[Unit]
Description=notdeexporter
After=network.target network-online.target nss-lookup.target
[Service]
Type=simple
StandardError=journal
ExecStart = /usr/local/bin/node_exporter
ExecReload=/bin/kill -HUP $MAINPID
LimitNOFILE=512000
Restart=on-failure
RestartSec=10s
[Install]
WantedBy=multi-user.target
EOF

#启动
systemctl daemon-reload
systemctl start notdeexporter
systemctl enable notdeexporter
systemctl status notdeexporter

当我们看到绿色的active (running) 则安装成功。

访问宿主+9100端口既可访问Node Exporter采集的指标数据

prometheus

接下来我们接着安装prometheus,除了Node Exporter,其他的我们都将采用docker进行安装,因为除了Node Exporter安装在客户端上,其他都在服务端上既可。

代码语言:javascript
复制

docker stop prometheusserver
docker rm prometheusserver
docker run -i --restart=always
--name prometheusserver
-p 9000:9090
-v /root/prometheus/data:/prometheus-data
-v /root/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
-v /root/prometheus/rules:/etc/prometheus/rules
-d prom/prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path=/prometheus-data/

9000:9090

9090是容器内部端口,9000外部端口作为NGINX代理使用,你也可以直接访问9000端口

/prometheus-data

/prometheus-data 是 prometheus的数据目录

/etc/prometheus/prometheus.yml

/etc/prometheus/prometheus.yml是prometheus主配置

代码语言:javascript
复制

抓取规则

global:
scrape_interval: 15s # 抓取间隔
evaluation_interval: 15s # 评估间隔

触发规则

rule_files:

  • /etc/prometheus/rules/*.rules

alert告警服务器

alerting:
alertmanagers:

  • static_configs:
  • targets: ['域名/服务器+端口']

监控客户端列表

scrape_configs:

  • job_name: "测试服务器"
    static_configs:
  • targets: ['域名/IP:9100']
    labels:
    name: "1号服务器"
    group: "测试服务器"
  • targets: ['域名/IP:9100']
    labels:
    name: "2号服务器/编译/监控"
    group: "测试服务器"
  • job_name: "应用服务器"
    static_configs:
  • targets: ['域名/IP:9100']
    labels:
    name: "邮件服务器"
    group: "应用服务器"
  • targets: ['域名/IP:9100']
    labels:
    name: "测试服务器"
    group: "应用服务器"

/etc/prometheus/rules

/etc/prometheus/rules主要是存放告警规则的目录

举例:hoststats-alert.rules

代码语言:javascript
复制

groups:

  • name: hostStatsAlert
    rules:
  • alert: CPU告警
    expr: (1 - avg(rate(node_cpu_seconds_total{vendor="",account="",mode="idle",name=~".."}[5m])) by (name)) * 100 > 85
    for: 1m
    labels:
    severity: warning
    annotations:
    summary: "Instance {{ $labels.name }} CPU usgae high"
    description: "{{
  • alert: 内存告警
    expr: (1 - (node_memory_MemAvailable_bytes{vendor="",account="",name=".."} / (node_memory_MemTotal_bytes{vendor="",account="",name=".."})))* 100 > 95
    for: 1m
    labels:
    severity: warning
    annotations:
    summary: "Instance {{ $labels.name }} MEM usgae high"
    description: "{{
  • alert: 磁盘告警
    expr: max((node_filesystem_size_bytes{vendor="",account="",name="..",fstype="ext.?|xfs"}-node_filesystem_free_bytes{vendor="",account="",name="..",fstype="ext.?|xfs"}) 100/(node_filesystem_avail_bytes {vendor="",account="",name=~"..",fstype="ext.?|xfs"}+(node_filesystem_size_bytes{vendor="",account="",name="..",fstype="ext.?|xfs"}-node_filesystem_free_bytes{vendor="",account="",name="..*",fstype=~"ext.?|xfs"})))by(name) > 80
    for: 1m
    labels:
    severity: warning
    annotations:
    summary: "Instance {{ $labels.name }} DISK usgae high"
    description: "{{
  • alert: 主机宕机
    expr: up == 0
    for: 1m
    labels:
    severity: warning
    annotations:
    summary: "Instance {{ $labels.name }} 停止工作"
    description: "{{

当配置完成并启动容器后,访问服务端+9000端口即可访问

主页

是否有触发

具体规则查看