一文搞定 Prometheus + Grafana + Node_Exporter:服务器监控与告警实战
本文最后更新于 11 天前,其中的信息可能已经有所发展或是发生改变。
大家好,这次的话又是给大家介绍一个非常专业的监控软件:Prometheus,本教程我们将搭配 Grafana 来为大家展示搭建的过程,并且以node_exporter来作为被控端的软件。
预览效果

一、准备工作

1、前提条件

首先的话我们需要准备以下的工具:

  • 一台用于搭建Prometheus + Grafana 的VPS服务器(配置建议1C1G以上
  • 若干台被监控的VPS(配置需求不大)

2、安装Docker

如果有条件的话,监控端的VPS安装上 Docker,这可以更方便为我们部署软件,方便收纳整理,一键安装命令(官方一键安装):

curl -fsSL https://get.docker.com | bash

国内服务器安装:轩辕镜像站

bash <(wget -qO- https://xuanyuan.cloud/docker.sh)

没用过轩辕镜像站,但是听描述说是这个命令安装后,镜像链接也帮忙配置好了。再给大家推荐一个镜像站,我比较常用的:毫秒镜像站

安装完之后如果想要进行更改默认镜像站的话,按以下命令操作即可:

mkdir -p /etc/docker # 新建配置文件夹
vim /etc/docker/daemon.json # 新建配置文件

把以下内容复制进去,保存即可:

{
  "registry-mirrors": [
    "https://docker.1ms.run"
  ]
}

重启Docker

systemctl daemon-reexec
sudo systemctl restart docker

确保Docker能够正常运行

docker info
看到这个链接,就证明你镜像站更换成功了!

二、开始搭建监控端

1、通过 Docker Compose 一键部署

①配置 Docker-compose.yml

这次搭建的方式十分简单,我们直接用 Docker Compose 搭建即可,我们先创建一个文件夹用于存放 docker-compose.yml:

mkdir -p /home/docker/prometheus # 自己选择一个创建文件夹的地方
cd /home/docker/prometheus # 进入目标文件夹
vim docker-compose.yml # 创建docker-compose.yml

在 docker-compose.yml 中放下以下内容:

version: "3.8"
volumes:
  prometheus_data: {}
  grafana_data: {}
networks:
  proxy:
  monitoring:
services:
  watchtower:
    image: containrrr/watchtower:latest
    environment:
      - WATCHTOWER_LABEL_ENABLE=true
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    labels:
      com.centurylinklabs.watchtower.enable: "true"
  node-exporter:
    image: prom/node-exporter:latest
    container_name: node-exporter
    restart: unless-stopped
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - "--path.procfs=/host/proc"
      - "--path.rootfs=/rootfs"
      - "--path.sysfs=/host/sys"
      - "--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)"
    ports:
      - "9100:9100"
    networks:
      - monitoring
    labels:
      com.centurylinklabs.watchtower.enable: "true"
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    restart: unless-stopped
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus
    command:
      - "--config.file=/etc/prometheus/prometheus.yml"
      - "--storage.tsdb.path=/prometheus"
      - "--web.console.libraries=/etc/prometheus/console_libraries"
      - "--web.console.templates=/etc/prometheus/consoles"
      - "--web.enable-lifecycle"
      - "--web.enable-admin-api"
    ports:
      - "9090:9090"
    networks:
      - monitoring
    labels:
      com.centurylinklabs.watchtower.enable: "true"
  mosquitto:
    image: eclipse-mosquitto:latest
    container_name: mosquitto
    restart: always
    ports:
      - "1883:1883"
    networks:
      - monitoring
    volumes:
      - ./mosquitto/mosquitto.conf:/mosquitto/config/mosquitto.conf
    labels:
      com.centurylinklabs.watchtower.enable: "true"
  loki:
    image: grafana/loki:latest
    container_name: loki
    restart: unless-stopped
    ports:
      - "3100:3100"
    command:
      - "-config.file=/etc/loki/local-config.yaml"
    networks:
      - monitoring
  promtail:
    image: grafana/promtail:latest
    container_name: promtail
    volumes:
      - /var/log:/var/log
    command:
      - "-config.file=/etc/promtail/config.yml"
    networks:
      - monitoring
  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    volumes:
      - grafana_data:/var/lib/grafana
      - ./grafana/provisioning/dashboards:/etc/grafana/provisioning/dashboards
      - ./grafana/provisioning/datasources:/etc/grafana/provisioning/datasources      
      - ./grafana/conf/grafana.ini:/etc/grafana/grafana.ini
    environment:
      - GF_SECURITY_ADMIN_USER=${GRAFANA_ADMIN_USER}
      - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_ADMIN_PASSWORD}
      - GF_USERS_ALLOW_SIGN_UP=false
      - GF_SMTP_ENABLED=true
      - GF_SMTP_HOST=${GF_SMTP_HOST}
      - GF_SMTP_USER=${GF_SMTP_USER}
      - GF_SMTP_PASSWORD=${GF_SMTP_PASSWORD}
      - GF_SMTP_FROM_ADDRESS=${GF_SMTP_FROM_ADDRESS}
    restart: unless-stopped
    ports:
      - "3000:3000"
    networks:
      - monitoring
    labels:
      com.centurylinklabs.watchtower.enable: "true"

里面直接包含了 Prometheus + Grafana + node_exporter + 一些环境,十分方便(来自NodeSeek论坛的@Testcharon

②设置 Prometheus + Grafana 的配置文件夹

我们要先创建一些配置文件夹以免 Docker 编译失败,首先先配置 Prometheus 的配置:

mkdir -p /home/docker/prometheus/prometheus/ # 创建配置文件夹
vim /home/docker/prometheus/prometheus/prometheus.yml # 创建配置文件

在配置文件里写入以下内容(带注释):

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]

  - job_name: "node_exporter"
    scrape_interval: 10s
    static_configs:
      - targets: ["服务器地址:9100"] # 按照这些情况来进行配置被控服务器
        labels:
          instance: '服务器1'
      - targets: ["服务器地址:9100"]
        labels:
          instance: '服务器2'

这些内容就是配置被控服务器的所有内容了!没错,Prometheus这个监控面板是被动访问被控服务器的地址来获取信息的,并非我们常见的Nezha、Komari等监控面板又被控服务器主动上传数据到监控端的。

接下来的话,我们将配置 Grafana 的配置文件:

mkdir -p /home/docker/prometheus/grafana/conf/ # 创建文件夹
mkdir -p /home/docker/prometheus/grafana/provisioning/dashboards/ # 创建文件夹
mkdir -p /home/docker/prometheus/grafana/provisioning/datasources/ # 创建文件夹
vim /home/docker/prometheus/grafana/conf/grafana.ini # 创建配置文件

在配置文件 Grafana.ini 中写入以下内容:

[server]
protocol = http
http_port = 3000
domain = status.mclzyun.com
root_url = http://localhost:3000 # Grafana 的访问 URL
serve_from_sub_path = false

到这里的话你可能会发现,Grafana其实就是一个前端面板,就好比 Prometheus 是收集服务器信息,而 Grafana 是用来展示给大家看的

最后的话我们创建最后一个配置文件,mosquitto

mkdir -p /home/docker/prometheus/mosquitto/ # 创建文件夹
vim /home/docker/prometheus/mosquitto/mosquitto.conf # 创建配置文件

随便写点东西进去:

listener 1883
allow_anonymous true
persistence true
persistence_location /mosquitto/data/
log_dest stdout

③开始编译

保存完 docker-compose.yml 之后在和文件同目录下输入以下命令:

docker compose up -d

Docker Compose 就开始编译了:

上面的警告可以不用管,这是缺少环境变量导致的错误,如果需要,就在目录下创建文件 .env 来进行补充。

三、测试监控端并对接

1、测试

确认无任何报错之后可以打开看看 Prometheus:

http://改成你服务器IP:9090
打开看看这个,看看自己配置的被控服务器是否存在。

接着打开 Grafana 看看能不能访问:

http://改成你服务器IP:3000

默认的账号密码均为:admin,第一次进入要求你更改密码(当然可以直接跳过 Skip),默认语言是英语,汉化流程如下:

点击右上角的个人资料
更改简体中文保存即可

2、Grafana对接Prometheus

接下来我们要在 Grafana 平台上对接 Prometheus 上,首先点击菜单栏左侧的:

数据源
点击右上角的添加新数据源
选择 Prometheus

名称随意,但是链接地址得更改成:

http://prometheus:9090

因为Prometheus和Grafana都在同一个容器内,不能用作于 localhost 连接,包括我们后面的 node_exporter 都是一样的。

保存测试连接,就成功对接上了!

3、配置Grafana主题

正如开头你所见我的监控页面,就是基于主题所展现的内容,如何添加主题呢?

点击仪表板
点击右上角的导入
使用同款ID:22403(英文) / 22869(中文),来自:NodeSeek

就可以直接应用上和我同款的主题了!

三、配置被控端

配置被控端就很简单了只需要一个 node_exporter 即可:

1、安装node_exporter:

直接复制下面命令即可:(来自@AhFei)的脚本

# 获取 Prometheus 最新版本
github_project="prometheus/node_exporter"
tag=$(wget -qO- -t1 -T2 "https://api.github.com/repos/${github_project}/releases/latest" | grep "tag_name" | head -n 1 | awk -F ":" '{print $2}' | sed 's/\"//g;s/,//g;s/ //g')
echo ${tag}
echo ${tag#*v}
 
wget https://github.com/prometheus/node_exporter/releases/download/${tag}/node_exporter-${tag#*v}.linux-amd64.tar.gz && \
tar xvfz node_exporter-*.tar.gz && \
rm node_exporter-*.tar.gz
 
 mv node_exporter-*.linux-amd64/node_exporter /usr/local/bin
rm -r node_exporter-*.linux-amd64*
 useradd -rs /bin/false node_exporter

 cat > /etc/systemd/system/node_exporter.service <<EOF
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target
 
[Service]
User=node_exporter
Group=node_exporter
Type=simple
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/bin/node_exporter
 
[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now node_exporter
systemctl status node_exporter

直接输入即可,不需要配置任何的东西,因为是监控端主动访问被控端的,到时候写好 IP:9100 端口即可(除了容器内的必须写:node-exporter:9100,就是监控端监控自己)

2、配置防火墙

因为 node_exporter 本身是没有任何防护措施的,也就以为着只要知道你的IP,就可以直接监控你的服务器了!十分不安全!给大家整理好 ufw 的命令,直接输入即可:

apt -y install ufw # 安装 ufw
ufw --force enable # 打开 ufw
ufw default allow incoming # 打开入站
ufw default allow outgoing # 打开出站

ufw delete allow 9100 # 删除9100端口
ufw allow from 监控端服务器IP to any port 9100 comment 'node_exporter only' # 设置只能指定IP访问9100
ufw deny 9100
ufw allow from 监控端服务器IP to any port 9100 comment 'node_exporter only'
ufw status verbose
ufw --force enable

我的 ufw 配置文件的内容大概是:

  • 所有的端口都默认开放(除了 9100)
  • 9100端口只能被指定IP访问

配置完后如何测试是否配置成功?使用 itdog 的Tcping 来进行检测 9100端口是否能被访问,如果不能被访问就测试监控端服务器是否能访问上被控端

telnet 被控端IP 9100

显示 Connected 就证明你配置成功了!

键入 Ctrl+] 和输入 quit 就能退出 telnet了!

接下来的话,就是依次在 Prometheus.yml 配置好每一个被监控端服务器的信息和名称!

四、添加报警途径&离线通知

1、添加联络点

接下来我们以腾讯企业微信机器人为报警联络点为例子为大家展示如何添加报警途径:(我省略了创建机器人的步骤,需要的话多搜索即可

点击联络点
创建联络点
名称随意,添加好你的 Webhook URL 即可,下面可选设置可以设置 Message TypeText,这边我是为了方便直接看微信,而不用打开企业微信
选择 MarkDown 会变这个,还要跑到企业微信 有点麻烦了!

保存后测试即可!

2、添加通知模板

我们可以自定义自己的通知模板

在同一个页面添加通知模板
名称随意,下面贴出我的通知模板(Text)
{{ define "默认通知模板" }}
{{ if gt (len .Alerts.Firing) 0 }}
==============================
🚨 服务器告警触发 🚨
==============================
{{ else }}
==============================
✅ 告警已恢复 ✅
==============================
{{ end }}

告警名称:
{{ if .CommonLabels.alertname }}
{{ .CommonLabels.alertname }}
{{ else }}
未知告警
{{ end }}

告警状态:{{ if gt (len .Alerts.Firing) 0 }}FIRING{{ else }}RESOLVED{{ end }}

标签信息:
{{ range .CommonLabels.SortedPairs }}
- {{ .Name }} = {{ .Value }}
{{ end }}

{{ if gt (len .Alerts.Firing) 0 }}
触发时间:{{ (index .Alerts.Firing 0).StartsAt.Format "2006-01-02 15:04:05" }}

描述信息:
{{ if .CommonAnnotations.description }}
{{ .CommonAnnotations.description }}
{{ else }}
无描述信息
{{ end }}
{{ else }}
恢复时间:{{ (index .Alerts.Resolved 0).EndsAt.Format "2006-01-02 15:04:05" }}
{{ end }}

Grafana 地址:
{{ .ExternalURL }}

==============================
{{ end }}

保存即可!

3、设置离线通知

警报 – 警报规则新建警报规则
按照我图片中配置即可,内容大概如下
  • 名称随意啦
  • Metric:检测条件,up就是看服务器还或者不
  • job:就是我们创建的一整个被监控的服务器组(也就是选择检测谁up)
  • Type:选择 Range 就是限定时间范围,Instant就是瞬时(服务器一掉线就检测到)
  • 下面提醒条件很好理解,就是当 up 不是 == 1 的时候就报警
下面都是要创建,提示也很明显了!可以自己做一个测试
设置联络点,通知信息可以写一个服务器炸了!

那么,以上就是本篇博客的所有内容!感谢各位的阅读!

暂无评论

发送评论 编辑评论

|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇