自己动手打造 HomeLab 监控系统

自己动手打造 HomeLab 监控系统

使用 Grafana 和飞书 webhook 来设置警报

·

2 min read

背景

If you can't measure it, you can't manage it

在家庭服务器(homelab)日常维护过程中,时常会遇到磁盘打满、CPU占用过高、内存不足等问题。当这些问题出现时,往往较难排查,我决定搭建一个监控 + 报警系统。经过多次调试和 debug 后,我确认这套监控方案是低成本并有效的,因此将配置过程分享出来。

技术选型

1. Prometheus - 开源系统监控和警报工具包,使用非常广泛

2. Node Exporter - 硬件和内核相关的指标收集器

3. Grafana - 大名鼎鼎的数据可视化观测、监控平台

4. 飞书 Webhook - 报警接收器的一种实现,通过飞书机器人进行通知,当然你也可以使用 telegram、dingding

配置过程

首先确保机器上安装了 docker 和 docker-compose,新建配置文件 docker-compose.yml,并按以下步骤配置和启动服务,这个配置集成了 prometheus、node exporter 和 grafana,因此无需再手动安装任何依赖

version: "3.2" 
services:
  node_exporter:
    image: quay.io/prometheus/node-exporter:v1.5.0  # 使用 node-exporter 镜像的 v1.5.0 版本
    container_name: node_exporter  # 容器名称为 node_exporter
    command: "--path.rootfs=/host"  # node-exporter 的启动命令,设置 root 文件系统路径
    pid: host  # 使用主机的 PID 命名空间
    restart: unless-stopped  # 设置容器除非手动停止,否则始终重启
    ports:
      - 9100:9100  # 将容器的 9100 端口映射到主机的 9100 端口
    volumes:
      - /:/host:ro,rslave  # 挂载主机根目录到容器,只读且使用 rslave 模式

  grafana:
    image: grafana/grafana-oss:latest  # 使用 grafana-oss 最新版本镜像
    container_name: grafana  # 容器名称为 grafana
    ports:
      - "4000:3000"  # 将容器的 3000 端口映射到主机的 4000 端口
    volumes:
      - ./grafana-data:/var/lib/grafana  # 挂载宿主机目录到容器中的数据目录
    restart: unless-stopped  # 设置容器除非手动停止,否则始终重启

  prometheus:
    image: prom/prometheus:v2.37.9  # 使用 prometheus 镜像的 v2.37.9 版本
    container_name: prometheus  # 容器名称为 prometheus
    ports:
      - 9090:9090  # 将容器的 9090 端口映射到主机的 9090 端口
    command: "--config.file=/etc/prometheus/prometheus.yaml"  # 启动时加载指定的配置文件
    volumes:
      - 你的路径/prometheus/config.yaml:/etc/prometheus/prometheus.yaml:ro  # 挂载宿主机的配置文件到容器,只读
      - 你的路径/prometheus/data:/prometheus  # 挂载宿主机的数据目录到容器
    restart: unless-stopped  # 设置容器除非手动停止,否则始终重启

启动服务

在存放 docker-compose.yml 文件的目录中执行 docker-compose up -d ,这个命令会启动所有服务

配置 Grafana 看板

  • 访问 http://<你的服务器地址>:4000 进入 Grafana 界面,默认端口为 4000,首次登录时,账号密码都是 admin

  • 登录后添加 Prometheus 数据源,URL 填写 http://prometheus:9090

  • 数据源配置完毕后,进入看板配置页面

  • 导入社区的 Dashboard,这里我使用了下载数量最多的 1860 号模板

  • 完成配置后,你应该可以看到一个精美的监控看板

配置飞书 Webhook

你也可以按照官方 飞书 Webhook 配置教程 进行配置

Webhook 又叫“网络钩子”,是应用给其它应用提供实时信息的一种方式。通过 Webhook ,可以在收到 HTTPS 请求时,自动触发流程运行。飞书机器人助手 提供 Webhook 触发能力,你可以通过 Webhook 将 Grafana 与 飞书机器人助手 连接起来。通过 Webhook,无需代码编辑,就可以实现从其他应用或服务自动接收数据。

  1. 访问飞书机器人配置网页,点击「新建指令」

  1. 点击「选择触发器」,选择「Grafana 新报警产生」

  1. 复制「webhook 地址」,后续我们配置 grafana 报警联系人时会用到

  1. 点击「选择操作」,将其设置为「通过官方机器人发消息」

  1. 在弹出的面板中,点击 「+」按钮,依次配置 grafana 的标题、状态、消息插槽,点击完成后发布即可

  1. 至此我们已经有了一个飞书 webhook 机器人,下一步我们将配置 Grafana 报警规则

配置 Grafana 报警联系人

  1. 首先进入 Grafana 的报警联系人控制面板中,选择 「contact point」对报警联系人进行配置

  1. 点击编辑,对报警配置进行修改

    这里我直接修改默认的报警联系人,当然你也可以新建一个,后续报警配置会略有不同

  1. 录入前面我们复制下来的 webhook 地址,点击保存即可

  1. 测试一下,确保链路正常

配置 Grafana 报警规则

这一步的进阶配置需要你对 bosun 或者 PromQL 语法有一定了解,如果你不了解 bosun 语法也没有关系,可以直接复刻我的温度报警配置

  1. 进入 Grafana 监控面板,找到带有你需要监控的指标的面板,对它进行编辑,这里我选中了硬件温度监控面板(Hardware temperature monitor)

  1. 进入面板编辑区域,选中报警配置 Tab(Alert),我们尝试新建一个报警规则

  1. 按照图中的步骤配置报警规则,这一步需要消耗一些时间,首次配置请耐心

    如果你对于指标的配置存在疑问,可以将所有指标删除后,将下面这个查询语句粘贴到第二步的输入框中

    node_hwmon_temp_celsius{instance="node_exporter:9100",job="node_exporter",chip="platform_coretemp_0"} * on(chip) group_left(chip_name) node_hwmon_chip_names

  1. 继续配置,将报警规则添加到报警组中,并添加一些额外注解,方便接收报警时,快速了解如何应对

  1. 至此,我们完成了一项温度报警配置,如果你有兴趣了解 PromQL 语法,还可以继续配置磁盘利用率报警、内存利用率报警、丢包率报警等一系列规则

希望这篇文章对你有所帮助