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

2024-9-10|2025-1-1
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 是一个开源的可视化工具,用于监控和分析各种数据源中的数据。它能够从多个数据源(如Prometheus、Loki、InfluxDB、Elasticsearch、MySQL、PostgreSQL 等)获取数据,并通过图表、仪表盘和警报来展示这些数据。
我选择Grafana的原因也是因为其支持多种数据源,通过Vector、Loki、Prometheus可以很方便的将日志文件数据、metric数据等等导入到Grafana中,从而进行可视化的展示。

📝 整体方案

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

OpenWRT主路由

  • prometheus-node-exporter-lua
  • prometheus-node-exporter-lua-nat_traffic
  • prometheus-node-exporter-lua-netstat
  • prometheus-node-exporter-lua-openwrt

OpenWRT旁路由

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

📝 日志处理

监控脚本

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

代码解释:

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的包管理器提供了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
我需要分别检查国内和国外的连通性,所以要新建两个panel,分别使用上面两个查询命令。同时选择Stat 面板进行可视化展示。

阈值设置

在Grafana面板中:
  1. 打开Field设置。
  1. 设置Thresholds:
      • 200为绿色(表示成功)。
      • 其他状态码(如500, 404)为红色(表示失败)。

📎 参考文章

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