

作者Author
Aleksandrs Petrovs-Gavrilovs
Zabbix认证培训师
目录
导语
你知道仅用 Zabbix 就能监控 Starlink dish吗?使用Starlink的想法(或者说需求)是在我搬到一个比较偏远的郊区后萌生的。当地的互联网服务商还没给这类地区“提供”光纤和稳定的移动网络,在四处寻找解决方案时,我偶然发现 Starlink 已经在为当地一些企业提供服务。后来我才知道,他们也向我所在区域的住宅用户开放服务。
长话短说,互联网接入在 IT 领域至关重要,所以我决定购置并监控自己的 Starlink dish。起初这个颇具挑战, 因为普通用户能获取的数据是非常有限的。但多亏了 Zabbix 的浏览器监控功能,我很轻松地解决了这个问题。这篇文章里,我会把我的解决方案包括配套模板分享给大家。
1、监控配置
首先,你需要确保 Zabbix(无论是 Zabbix proxy还是server)安装在与 Starlink dish和路由器的同一网络中。下一步是配置Zabbix浏览器监控。
2、WebDriver安装
# podman run --name webdriver -d \
-p 4444:4444 \
-p 7900:7900 \
--shm-size="2g" \
--restart=always -d docker.io/selenium/standalone-chrome:latest
4444 端口将作为 WebDriver的监听端口,端口7900 将被 NoVNC 使用,以便我们在使用带有GUI的浏览器上观察其行为。
3、Zabbix server / proxy 配置
WebDriver 安装完成后,我们需要设置 Zabbix 与驱动之间的通信。这可以通过编辑 Zabbix server/proxy的配置文件和更新以下参数实现:
### Option: WebDriverURL
# WebDriver interface HTTP[S] URL. For example http://localhost:4444 used with
# Selenium WebDriver standalone server.
#
# WebDriverURL=
WebDriverURL=http://localhost:4444
### Option: StartBrowserPollers
# Number of pre-forked instances of browser item pollers.
#
# Range: 0-1000
# StartBrowserPollers=1
StartBrowserPollers=5
配置参数设置完成后,重启 Zabbix server/proxy使其生效:
systemctl restart zabbix-server
4、创建主机
首先,我们需要进入「Data collection」>「Hosts」页面,创建一个代表 Starlink dish的主机。我的示例主机配置如下:

Starlink dish 主机
该主机还包含一个用户宏:
{$LINK},值为:http://webapp.starlink.com ,用于指向正确的 Starlink dish网页应用:

链接宏
5、创建浏览器监控项
接下来我们要配置浏览器监控项,来采集和监控 Starlink 网页应用中暴露的指标列表:

Starlink 浏览器项目
这里我们使用最基础的配置,请确保根据你的需要设置更新间隔,但不建议间隔短于5分钟,由于依赖项已存储相关数据,也不建议存储历史数据。
这个监控项最核心的部分是脚本本身:
var browser, result;
var opts = Browser.chromeOptions();
opts.capabilities.alwaysMatch['goog:chromeOptions'].args = [];
browser = new Browser(opts);
browser.setScreenSize(Number(1980), Number(1020));
try {
var params = JSON.parse(value);
browser.navigate(params.url);
// Wait for the dish to report status
Zabbix.sleep(2000);
// Find the JSON text element(s)
var jsonElements = browser.findElements("xpath", "//div[@id='root']/div[@class='App']/div[@class='Main']/div[2]/div[@class='Section'][2]/pre[@class='Json-Format']/div[@class='Json-Text']");
var extractedData = [];
for (var i = 0; i < jsonElements.length; i++) {
var text = jsonElements[i].getText();
// Try parsing JSON
try {
extractedData.push(JSON.parse(text));
} catch (e) {
// If not valid JSON, include raw text instead
extractedData.push({ raw: text, error: "Invalid JSON format" });
}
}
// Collect result
result = browser.getResult();
// Replace with parsed JSON data
result.extractedJsonData = extractedData.length === 1 ? extractedData[0] : extractedData;
}
catch (err) {
if (!(err instanceof BrowserError)) {
browser.setError(err.message);
}
result = browser.getResult();
}
finally {
// Return a clean JSON object
return JSON.stringify(result.extractedJsonData);
}
那么这个脚本是做什么的呢?它会打开 Starlink 网页应用,等待Starlink dish输出所有状态数据,经过简单解析后,返回截图中突出显示的数据:

Starlink dish 诊断数据
现在你可以点击监控项页面中新建的监控项左侧的三个点,为感兴趣的每个值创建依赖监控项了!
6、创建依赖监控项
点击此处:

举个例子,要创建监控硬件版本的项,可以按如下配置:

硬件版本依赖项
配置 JSONPath 预处理:

硬件版本监控项预处理
最终我们在 Zabbix 中获取到数据:

Starlink dish 硬件版本
其他所有监控项(告警除外)都遵循同样的逻辑 —— 只需更新监控项名称、键值,以及预处理中的 JSONPath 来提取所需数值即可。
7、创建低级别自动发现(LLD)监控项原型
为了自动创建告警监控项,可创建依赖发现规则。在"Discovery"部分,新建新的发现规则:

Starlink dish 告警发现
使用 JavaScript 进行预处理:
var data = JSON.parse(value);
var alerts = data.alerts;
var lld = [];
for (var key in alerts) {
if (alerts.hasOwnProperty(key)) {
lld.push({
"{#ALERT}": key
});
}
}
return JSON.stringify({ data: lld });
这段脚本将为我们生成如下 JSON 数据:
{
"data": [
{
"{#ALERT}": "dishIsHeating"
},
{
"{#ALERT}": "dishThermalThrottle"
},
{
"{#ALERT}": "dishThermalShutdown"
},
{
"{#ALERT}": "powerSupplyThermalThrottle"
},
{
"{#ALERT}": "motorsStuck"
},
{
"{#ALERT}": "mastNotNearVertical"
},
{
"{#ALERT}": "slowEthernetSpeeds"
},
{
"{#ALERT}": "softwareInstallPending"
},
{
"{#ALERT}": "movingTooFastForPolicy"
},
{
"{#ALERT}": "obstructed"
}
]
}
接下来就是创建一个依赖监控项原型:

Starlink dish 告警原型
当然,也要配置预处理:

JSONPath 将提取每个特定告警,而"布尔值转十进制"规则会将 true/false 转换为数字,帮我们节省数据库的空间。
8、实现效果
最终,我们可以监控到所有数据:

Starlink dish 最新数据
当然,如果你愿意做一些额外的配置,还可以通过导出器采集更多数据!