type
status
date
slug
summary
tags
category
icon
password
之前已经配置了很多关于家庭局域网方面的东西,目前还缺少一个可以监控整体网络状态的Dashboard。选来选取,最终决定使用Grafana + Loki + Vector + Prometheus这套方案。整体方案的资源占用确实也不小,但主要都是在Docker部署的几个服务端上,OpenWRT路由器上使用Node,也不算太占用资源。今天主要分享一下如何在手搓一个监控网络状态的Grafana Panel。
📝 什么是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
才能正确的提取数据。我需要分别检查国内和国外的连通性,所以要新建两个panel,分别使用上面两个查询命令。同时选择Stat 面板进行可视化展示。
阈值设置
在Grafana面板中:
- 打开Field设置。
- 设置Thresholds:
200
为绿色(表示成功)。- 其他状态码(如
500
,404
)为红色(表示失败)。
📎 参考文章
有关OpenWRT安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~