🪵尝试使用Grafana监控家庭网络状态(一)

2024-9-10|2025-3-3
Yawatasensei
Yawatasensei
type
status
date
slug
summary
tags
category
icon
password
😀
之前已经配置了很多关于家庭局域网方面的东西,目前还缺少一个可以监控整体网络状态的Dashboard。选来选取,最终决定使用Grafana + Loki + Vector + Prometheus这套方案。整体方案的资源占用确实也不小,但主要都是在Docker部署的几个服务端上,OpenWRT路由器上使用Node,也不算太占用资源。今天主要分享一下如何在手搓一个监控网络状态的Grafana Panel。
notion image

📝 什么是Grafana

Grafana 是一款开源的跨平台数据可视化与监控工具,专为实时动态展示和分析大规模数据而设计。它最初由 Torkel Ödegaard 于 2014 年开发,现已成为 DevOps、 IT 运维及数据分析领域的核心工具之一。Grafana 用于监控和分析各种数据源中的数据。它能够从多个数据源(如Prometheus、Loki、InfluxDB、Elasticsearch、MySQL、PostgreSQL 等等)获取数据,并通过图表、仪表盘Dashboard和警报Alert来展示这些数据。

Grafana的核心功能与用途

  1. 可视化仪表盘
      • 支持图表、表格、热图、地图等多种可视化形式。
      • 可自定义仪表盘布局,实时刷新数据(秒级更新)。
      • 示例:监控服务器 CPU 使用率、数据库查询性能、应用程序响应时间等。
  1. 多数据源支持
      • 接入超过 80 种数据源,包括:
        • 时序数据库:Prometheus、InfluxDB、Graphite
        • 日志平台:Elasticsearch、Loki
        • 云服务:AWS CloudWatch、Google Cloud Monitoring
        • 关系型数据库:MySQL、PostgreSQL
        • 其他:JSON API、CSV 文件等。
  1. 警报与通知
      • 设置灵活的条件阈值(如 CPU > 90% 持续 5 分钟)。
      • 支持通过 Email、Slack、PagerDuty、Webhook 等方式推送告警。
  1. 用户权限与协作
      • 提供多租户功能,支持团队共享仪表盘。
      • 细粒度权限控制,可分配查看、编辑或管理权限。

为什么选择Grafana

我选择Grafana的原因主要是因为Grafana支持多种数据源,通过Vector、Loki、Prometheus可以很方便的将OpenWRT产生的日志文件数据、Metric数据等等导入到Grafana中,从而进行可视化的展示,打造一个监控家庭网络情况的Dashboard。

📝 Grafana监控整体方案

各部分使用的数据源如下:

OpenWRT主路由

以下这些包均可通过OpenWRT的包管理器opkg进行安装。
  • prometheus-node-exporter-lua
  • prometheus-node-exporter-lua-nat_traffic
  • prometheus-node-exporter-lua-netstat
  • prometheus-node-exporter-lua-openwrt

OpenWRT旁路由(旁路网关)

以下这些包均可通过opkg进行安装。
  • prometheus-node-exporter-lua
  • prometheus-node-exporter-lua-nat_traffic
  • prometheus-node-exporter-lua-netstat
  • prometheus-node-exporter-lua-openwrt

DNS

Prometheus + Vector + Loki

网络连通性

Shell脚本 + Cron + Vector + Loki,Shell脚本放在OpenWRT旁路由上。

监控方案介绍

Loki、Grafana和Prometheus的服务端通过Docker安装在我的本地电脑上,并通过Caddy进行反代使用域名访问。
OpenWRT路由器上提供了Prometheus Node Exporter的包,可以很方便的安装并提供数据源。在DNS方面,由于我使用的是ADG + MosDNS + OpenClash的模式,所以核心的DNS解析位于MosDNS这里,监控也就只对MosDNS的DNS请求进行监控,这部分也有相对成熟的方案,以后有时间会单独写一篇安装配置的指南文章。OpenClash的核心Clash(Mihomo)部分的数据暂时还无法获取,之前的Premium核心提供过metric的接口可以获取各项流量数据,可惜Premium内核本身是闭源的,而且现在作者也已经退网,Mihomo内核暂时也没有支持Metric暴露功能,有些遗憾。另外AdGuard Home也提供了Prometheus可用的接口,但是因为我对AdGuard Home内的数据并不是很关心,所以没有考虑添加到这个Dashboard中。
除了上述这几部分之外,我比较在乎网络的连通性,尤其是外网的连通性,通过OpenWRT和MosDNS的监控不是很好能够反应出网络是否通还是不通。但是这部分暂时没有成熟到可以直接使用的包或者程序,blackbox exporter可以解决这个问题,但是blackbox exporter对于这个需求来说,实在是有点过于庞大,所以只能自己手搓一个简单的脚本。
由于我们已经使用了Vector和Loki,所以最简单的办法就是通过Curl命令对特定外网网站进行请求,例如Curl Google,并将返回的信息记录到日志文件中,由Vector进行进行收集、处理和转换,然后由Loki进行存储并提供索引Index和查询功能。
在用于监控的国外网站我选择了http://www.google.com/generate_204 ,原因很简单就是因为完全被墙了,而且基本不会宕机。国内网站选择了小米的http://connect.rom.miui.com/generate_204 ,以上两个地址挂了的几率远远小于我的网络宕机DOWN掉的几率,所以如果无法请求成功,那么肯定是我的网络出现了问题。

📝 网络连通性日志处理

监控脚本

Shell脚本通过使用Curl命令发送HTTP请求,并记录响应时间和返回的状态,通过Cron定时任务持续检查网络的连通性。需要注意的是,/var 下的文件会在每次旁路由重启的时候清空并根据/etc 内的配置文件重新生成,所以如果有持久化数据存储需求的话,建议放在别的目录下例如/opt目录。

代码解释:

google_response=$(curl -o /dev/null -s -w "%{http_code} %{time_total}\n" http://www.google.com/generate_204) :
  • curl:用于发送 HTTP 请求的命令。
  • o /dev/null:将响应的内容丢弃,不保存到文件中。
  • s:静默模式,不显示进度条等输出。
  • w "%{http_code} %{time_total}\n":输出 HTTP 状态码和总响应时间。
  • http://www.google.com/generate_204:请求的 URL。/generate_204 是一个常用的检查点,用于测试网络连接。
  • google_response:将 curl 的输出(状态码和响应时间)保存到变量中。
google_status_code=$(echo $google_response | cut -d' ' -f1)
  • google_response 变量中提取第一个字段(状态码),并保存到 google_status_code 变量中。
google_response_time=$(echo $google_response | cut -d' ' -f2)
  • google_response 变量中提取第二个字段(响应时间),并保存到 google_response_time 变量中。
echo "{\"site\": \"google\", \"status_code\": \"$google_status_code\", \"response_time\": $google_response_time}" >> /var/log/network_monitor.log
  • 将 Google 的状态码和响应时间以 JSON 格式写入 /var/log/network_monitor.log 文件中。>> 表示追加到文件末尾。
国内网站xiaomi部分与Google部分相同。

保存并赋予执行权限:

定时任务

即每分钟执行一次查询,并输出到日志文件中。这里的/path/to/你需要修改为你自己的路径地址。

Vector配置

在脚本将请求结果输出到日志文件后,需要使用Vector对日志进行收集、处理和传输到Loki。OpenWRT的包管理器OPKG提供了Vector的安装,可以直接安装,或者自行进行编译安装。需要注意的是,opkg安装的vector的配置文件为yml格式,与Vector需要的toml格式不同,在编写配置文件时需要特别注意。
配置文件分为三部分,sources部分定义日志文件的来源和读取方式,transforms部分定义日志的转换和提取方式,sinks定义与loki之间传输的方式。
在sources这里我们需要的信息分别是网站名称,用来区分是Google还是Xiaomi的204页面,status_code即状态码,如果是返回200即表明网站连通性没有问题,如果是4**或其他就需要检查自己的网络了。sinks部分注意修改endpoint为自己的loki服务器地址和端口。
保存之后,重启Vector

Grafana配置

在Grafana中新建一个Dashboard,数据源选择为Loki,然后进行数据查询配置。这里面有一个坑,目前我使用Docker-compose部署的Grafana和Loki不支持unwrap 语法,需要使用line_format 才能正确的提取数据。
notion image
由于我需要分别检查国内和国外的网络连通性来确保科学上网的分流,所以需要在Grafana新建两个panel,分别使用上面两个查询命令。同时选择 Stat 面板进行可视化展示。

阈值Thresholds设置

通过阈值设置,可以通过颜色明显的察觉网络的异常。
在Grafana面板中:
  1. 打开Field设置。
  1. 设置Thresholds阈值:
      • 200为绿色(表示成功)。
      • 其他状态码(如500, 404)为红色(表示失败)。

📎 参考文章

 
💡
有关OpenWRT安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~
AdGuard Home配置仅局域网访问在OpenWRT旁路网关上通过Caddy实现Homelab反向代理
Loading...