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

发布于 2023-11-25  772 次阅读


介绍

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

#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安装在客户端上,其他都在服务端上既可。

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主配置

# 抓取规则
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

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: "{{ $labels.name }} CPU usage above 85% (current value: {{ $value }})"
  - 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: "{{ $labels.name }} MEM usage above 95% (current value: {{ $value }})"
  - 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: "{{ $labels.name }} DISK usage above 80% (current value: {{ $value }})"
  - alert: 主机宕机
    expr: up == 0
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: "Instance {{ $labels.name }} 停止工作"
      description: "{{ $labels.name }} 宕机超过1分钟 (current value: {{ $value }})"

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

主页

是否有触发

具体规则查看

grafana

docker stop grafanaserver
docker rm grafanaserver
docker run -i --restart=always \
--name grafanaserver \
-v /root/grafana/config/grafana.ini:/etc/grafana/grafana.ini \
-v /root/grafana/data:/var/lib/grafana \
-p 9001:3000 \
-d grafana/grafana 

/etc/grafana/grafana.ini

/etc/grafana/grafana.ini 是grafana的主要配置文件

 #内容太多,就不贴出来了,可自行启动容器拷贝一份出来进行修改,这里一般不修改

/var/lib/grafana

/var/lib/grafana是 grafana的持久化数据目录,需要从容器中映射出

温馨提示:这里需要把映射出来的数据目录修改最高权限,否则容器启动后将会出现无法访问的情况

chmod 777 /root/grafana/data

9001:3000

9001:3000 内部端口为3000,我们映射到宿主机端口9001进行访问

访问登录页面需要输入账号密码,默认账号密码admin/admin

登录后,根据自己的需要我们设置一下系统的语言显示

再接着我们接入prometheus汇聚的数据源

仪表盘=>Connections=>Data sources

然后点右上角的Add data source ,然后选择第一个Prometheus作为数据源

填写上刚刚部署的Prometheus的地址,并设置为默认数据源,然后拉到最下面保存便接入完成了。

如果有其他特殊需求,填写相应设置即可。

然后接着导入面板,这里提供三个好看的面板,分别是8919927611074

输入后点击Load既可加载面板

通过观察仪表盘,我们可以发现服务器中一些细微的问题,然后对其进行解决。

当然一些明显问题,直接通过观察健康值直接就可以分析出来。

alertmanager

这里是最后一个配置,当我们服务器出现异常警告的触发,这时候需要用到alertmanager进行邮件提醒,微信提醒,WebHook等等的推送操作,以便我们运维等人员及时发现并处理。

docker stop alertmanagerserver
docker rm alertmanagerserver
docker run -i --restart=always \
--name alertmanagerserver \
-p 9002:9093 \
-v /root/alertmanager/data:/alertmanager-data \
-v /root/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml \
-d prom/alertmanager --config.file=/etc/alertmanager/alertmanager.yml --storage.path=/alertmanager-data/

9002:9093

9002:9093 内部端口是9003,通过宿主机的9002进行访问或者代理访问

/alertmanager-data

/alertmanager-data 数据目录,持久化

/etc/alertmanager/alertmanager.yml

/etc/alertmanager/alertmanager.yml  是推送相关的配置

global:
  smtp_smarthost: mail.xxxxx.cn:587 #邮件服务器
  smtp_from: noreply@xxxxx.cn #邮件发送者
  smtp_auth_username: noreply@xxxxx.cn #账号
  smtp_auth_identity: noreply@xxxxx.cn #账号
  smtp_auth_password: xxxxxx #密码

route:
  group_by: ['alertname']
  receiver: 'default-receiver'

receivers:
  - name: default-receiver
    email_configs:
      - to: xxxxx@qq.com #接收报警的邮箱
        send_resolved: true

启动服务后,访问9002端口进行查看,如能进行访问,则部署成功。

接下来我们尝试关闭否个服务器的采集或者持续使用CPU利用率进行测试验证。

可以看到已经进入触发状态

当然此刻已经收到邮件的告警提示

至此!我们整个流程已经走完,运维人员、开发人员等人也要开始炸锅了。哈哈

那么当我们重新启动采集服务后,恢复正常

Q&A

这里将会总结归纳日常的解决方案(待更新)


一花一世界,一叶一菩提