好的,感谢您提供正常工作的面板 JSON。通过对比,我已经准确定位了第一个面板不出数据的原因。
简而言之,第一个面板完全是为别人的 Prometheus 数据和命名习惯“量身定做”的,它与您的环境在三个关键点上完全不兼容:
数据源ID不匹配:面板写死了错误的数据源ID。
指标查询不匹配:面板查询了一个您环境中不存在的指标 (ping_loss_ratio),并且查询标签的方式也和您的习惯不同。
变量定义不匹配(最核心的问题):面板的下拉菜单变量使用了非常严格的过滤规则(例如要求 job 必须以 PEK- 开头),这导致变量列表为空,所有图表因此都无法获取任何数据,最终整个面板一片空白。
详细问题对比与解决方案 下面我将为您详细拆解问题所在,并提供直接的修复方案。
- 数据源 (Data Source) 正常面板: 所有图表和变量都统一使用数据源 ID eevnt0e0lz01sb。
问题面板: 使用了 eevnt0e0lz01sb, cdjc4dwosc83kb, fWcy5_o4z 等多个不同的 ID。
✅ 解决方案: 必须将问题面板中所有图表和变量的数据源都手动修改为您正确的 Prometheus 数据源 (ID: eevnt0e0lz01sb)。
- 指标和标签 (Metrics & Labels) 正常面板:
延迟指标: probe_duration_seconds
丢包率指标: 使用 probe_success 计算得出 (1 - avg_over_time(probe_success{…}[1m])) * 100
核心标签: 主要使用 job, ip, isp 等标签进行筛选。
问题面板:
延迟指标: probe_duration_seconds (这个是正确的)
丢包率指标: 直接查询一个不存在的指标 ping_loss_ratio。
核心标签: 使用 instance (代表目标VPS) 和 job (代表探测源) 这两个标签。这个设计思路本身没问题,但获取这两个标签值的方式错了。
✅ 解决方案:
必须修改“Packet Loss Rate”图表的查询语句。
原查询: ping_loss_ratio{target="$target",job="$job.*"} < 1
修正后查询: (1 - avg_over_time(probe_success{instance="$target", job="$job"}[1m])) * 100
注意:原查询中用的是 target 标签,但它的变量名叫 $target 实际获取的是 instance 标签,所以我这里修正为 instance=~"$target"。
- 变量定义 (Templating Variables) 这是导致面板空白的最根本原因。问题面板希望根据 $target 变量来平铺展示所有的VPS,但这个变量因为过滤规则太严格而获取不到任何值。
正常面板:
$job 变量: 使用 label_values(probe_success, job) 直接获取所有 job 标签的值,没有任何过滤,非常通用。
问题面板:
$target 变量: 它的正则表达式是 /.instance="(.?)",job="PEK-."./。
致命错误: 这段代码要求 job 标签的值必须以 “PEK-” 开头,否则就过滤掉。而从您的正常面板看,您的 job 名称是 “泉州联通NAS” 等,根本不符合这个规则。
结果: $target 变量为空 -> “Repeat” (平铺/重复) 功能没有目标 -> 所有图表都隐藏了。
✅ 解决方案: 必须彻底修改变量的定义,让它们能从您的数据中正确提取出 instance 和 job 的列表。
修改 $target 变量:
Query: label_values(probe_duration_seconds, instance)
Regex: 清空此项!删除所有内容。
修改 $job 变量:
Query: label_values(probe_duration_seconds, job)
Regex: 清空此项!删除所有内容。
一键修复:修正后的 JSON 为了方便您操作,我直接将第一个有问题面板的 JSON 按照上述方案进行了修正。您只需要:
打开那个不出数据的面板,进入 “Dashboard settings” (右上角齿轮图标)。
选择左侧的 “JSON Model”。
删除里面的所有内容,然后粘贴下面的代码。
点击 “Save changes”。
这样,您的面板应该就能正常显示数据并实现平铺和筛选功能了。
JSON
{
“annotations”: {
“list”: [
{
“builtIn”: 1,
“datasource”: {
“type”: “datasource”,
“uid”: “grafana”
},
“enable”: true,
“hide”: true,
“iconColor”: “rgba(0, 211, 255, 1)”,
“name”: “Annotations & Alerts”,
“target”: {
“limit”: 100,
“matchAny”: false,
“tags”: [],
“type”: “dashboard”
},
“type”: “dashboard”
}
]
},
“description”: “SZO.CT监测点由Crazy(blog.csgo.ovh)赞助\nNTG.CU监测点由Crazy(blog.csgo.ovh)赞助”,
“editable”: true,
“fiscalYearStartMonth”: 0,
“graphTooltip”: 0,
“id”: 14,
“links”: [],
“panels”: [
{
“collapsed”: false,
“gridPos”: {
“h”: 1,
“w”: 24,
“x”: 0,
“y”: 0
},
“id”: 15,
“panels”: [],
“repeat”: “target”,
“title”: “$target status”,
“type”: “row”
},
{
“datasource”: {
“type”: “prometheus”,
“uid”: “eevnt0e0lz01sb”
},
“fieldConfig”: {
“defaults”: {
“color”: {
“mode”: “palette-classic”
},
“custom”: {
“axisBorderShow”: false,
“axisCenteredZero”: false,
“axisColorMode”: “text”,
“axisLabel”: “”,
“axisPlacement”: “auto”,
“barAlignment”: 0,
“barWidthFactor”: 0.6,
“drawStyle”: “line”,
“fillOpacity”: 70,
“gradientMode”: “opacity”,
“hideFrom”: {
“legend”: false,
“tooltip”: false,
“viz”: false
},
“insertNulls”: false,
“lineInterpolation”: “smooth”,
“lineStyle”: {
“fill”: “solid”
},
“lineWidth”: 2,
“pointSize”: 5,
“scaleDistribution”: {
“type”: “linear”
},
“showPoints”: “auto”,
“spanNulls”: false,
“stacking”: {
“group”: “A”,
“mode”: “none”
},
“thresholdsStyle”: {
“mode”: “off”
}
},
“mappings”: [],
“thresholds”: {
“mode”: “absolute”,
“steps”: [
{
“color”: “green”,
“value”: 0
},
{
“color”: “red”,
“value”: 80
}
]
},
“unit”: “s”
},
“overrides”: []
},
“gridPos”: {
“h”: 11,
“w”: 14,
“x”: 0,
“y”: 1
},
“id”: 25,
“options”: {
“legend”: {
“calcs”: [
“logmin”,
“max”,
“mean”,
“stdDev”,
“range”
],
“displayMode”: “table”,
“placement”: “bottom”,
“showLegend”: true
},
“tooltip”: {
“hideZeros”: false,
“mode”: “multi”,
“sort”: “none”
}
},
“pluginVersion”: “12.2.0-17027759091”,
“targets”: [
{
“datasource”: {
“type”: “prometheus”,
“uid”: “eevnt0e0lz01sb”
},
“editorMode”: “code”,
“expr”: “probe_duration_seconds{phase="rtt",instance="$target",job="$job"}”,
“instant”: false,
“interval”: “$interval”,
“legendFormat”: “{{job}}”,
“range”: true,
“refId”: “A”
}
],
“title”: “ICMP Duration”,
“type”: “timeseries”
},
{
“datasource”: {
“type”: “prometheus”,
“uid”: “eevnt0e0lz01sb”
},
“fieldConfig”: {
“defaults”: {
“color”: {
“mode”: “palette-classic”
},
“custom”: {
“axisBorderShow”: false,
“axisCenteredZero”: false,
“axisColorMode”: “text”,
“axisLabel”: “”,
“axisPlacement”: “auto”,
“axisSoftMax”: 100,
“barAlignment”: 0,
“barWidthFactor”: 0.6,
“drawStyle”: “line”,
“fillOpacity”: 0,
“gradientMode”: “none”,
“hideFrom”: {
“legend”: false,
“tooltip”: false,
“viz”: false
},
“insertNulls”: false,
“lineInterpolation”: “smooth”,
“lineWidth”: 1,
“pointSize”: 5,
“scaleDistribution”: {
“type”: “linear”
},
“showPoints”: “auto”,
“spanNulls”: false,
“stacking”: {
“group”: “A”,
“mode”: “none”
},
“thresholdsStyle”: {
“mode”: “off”
}
},
“mappings”: [],
“thresholds”: {
“mode”: “absolute”,
“steps”: [
{
“color”: “green”,
“value”: 0
},
{
“color”: “red”,
“value”: 80
}
]
},
“unit”: “percent”
},
“overrides”: []
},
“gridPos”: {
“h”: 11,
“w”: 10,
“x”: 14,
“y”: 1
},
“id”: 17,
“options”: {
“legend”: {
“calcs”: [
“lastNotNull”,
“mean”,
“max”
],
“displayMode”: “table”,
“placement”: “bottom”,
“showLegend”: true
},
“tooltip”: {
“hideZeros”: false,
“mode”: “multi”,
“sort”: “none”
}
},
“pluginVersion”: “12.2.0-17027759091”,
“targets”: [
{
“datasource”: {
“type”: “prometheus”,
“uid”: “eevnt0e0lz01sb”
},
“editorMode”: “code”,
“exemplar”: false,
“expr”: “(1 - avg_over_time(probe_success{instance="$target", job="$job"}[1m])) * 100”,
“format”: “time_series”,
“instant”: false,
“interval”: “$interval”,
“intervalFactor”: 1,
“legendFormat”: “{{job}}”,
“range”: true,
“refId”: “A”
}
],
“title”: “Packet Loss Rate”,
“type”: “timeseries”
}
],
“refresh”: “10s”,
“schemaVersion”: 41,
“tags”: [
“prometheus”,
“icmp”,
“blackbox”
],
“templating”: {
“list”: [
{
“current”: {
“text”: “All”,
“value”: “$__all”
},
“datasource”: {
“type”: “prometheus”,
“uid”: “eevnt0e0lz01sb”
},
“definition”: “label_values(probe_duration_seconds, instance)”,
“includeAll”: true,
“label”: “目标 (Target)”,
“multi”: true,
“name”: “target”,
“options”: [],
“query”: “label_values(probe_duration_seconds, instance)”,
“refresh”: 1,
“regex”: “”,
“sort”: 1,
“type”: “query”
},
{
“current”: {
“text”: “All”,
“value”: [
“$__all”
]
},
“datasource”: {
“type”: “prometheus”,
“uid”: “eevnt0e0lz01sb”
},
“definition”: “label_values(probe_duration_seconds, job)”,
“includeAll”: true,
“label”: “源 (Source)”,
“multi”: true,
“name”: “job”,
“options”: [],
“query”: “label_values(probe_duration_seconds, job)”,
“refresh”: 1,
“regex”: “”,
“sort”: 1,
“type”: “query”
},
{
“auto”: true,
“auto_count”: 30,
“auto_min”: “10s”,
“current”: {
“text”: “auto”,
“value”: “$__auto_interval_interval”
},
“label”: “Interval”,
“name”: “interval”,
“options”: [
{
“selected”: true,
“text”: “auto”,
“value”: “$__auto_interval_interval”
},
{
“selected”: false,
“text”: “5s”,
“value”: “5s”
},
{
“selected”: false,
“text”: “10s”,
“value”: “10s”
},
{
“selected”: false,
“text”: “30s”,
“value”: “30s”
},
{
“selected”: false,
“text”: “1m”,
“value”: “1m”
}
],
“query”: “5s,10s,30s,1m”,
“refresh”: 2,
“type”: “interval”
}
]
},
“time”: {
“from”: “now-1h”,
“to”: “now”
},
“timepicker”: {},
“timezone”: “browser”,
“title”: “三网ICMP监测v2 (已修正)”,
“uid”: “bdvog263hhr0gc”,
“version”: 5
}
用了你这个 能显示所有源vps和目标vps数据了,能筛选,丢包率也出来了。但是ICMP Duration 数据还是空的。并且target这个值里面的选项,都是源ip,例如119.29.29.29,而不是我在config里定义的 - targets:
- ipv4.can-4134.endpoint.nxtrace.org
labels:
name: ‘广州电信’
code: ‘CAN’
city: ‘广东’
isp: ‘中国电信’
ip: ‘IPv4’
domestic: ’true'
这里面的label的值
显示思路 非常好!这说明我们之前的修改方向是完全正确的,核心的数据关联和丢包率计算已经解决了。
您现在遇到的这两个问题非常典型,我们来逐一解决:
ICMP Duration 仍然为空: 丢包率图表正常,说明 probe_success 指标能查到。延迟图表不正常,说明 probe_duration_seconds 的查询条件依然有问题。
$target 变量显示为 IP: 这说明我们成功地从 instance 标签里提取出了监控目标,但这个 instance 标签的值默认就是目标的 IP 或域名,而不是您在配置文件中定义的 name 标签。
下面是针对这两个问题的精准解决方案。
问题1:修复 ICMP Duration 空数据 丢包率图表之所以能出数据,是因为它的查询 probe_success{…} 比较简单。而延迟图表的查询是 probe_duration_seconds{phase=“rtt”, …},多了一个 phase=“rtt” 的标签过滤。
问题根源: 您的 blackbox-exporter 或 Prometheus 版本产生的 probe_duration_seconds 指标中,很可能不包含 phase=“rtt” 这个标签。这是一个可选的、在某些版本或配置下才会出现的标签。
解决方案: 我们只需要把这个对于您来说多余的查询条件去掉即可。
操作步骤: 编辑 “ICMP Duration” 图表。
在 “Query” (查询) 标签页中,找到表达式 (Expr)。
将原来的查询:
代码段
probe_duration_seconds{phase=“rtt”,instance="$target",job="$job"}
修改为(删除 phase=“rtt”, 部分):
代码段
probe_duration_seconds{instance="$target",job="$job"}
应用修改后,这个图表应该立刻就能显示数据了。
问题2:让 $target 变量显示名称而非 IP 这个问题非常关键,它能极大地提升面板的可用性。
问题根源: Prometheus 从 blackbox-exporter 获取数据时,会将您配置文件中 targets 列表里的值(例如 ipv4.can-4134.endpoint.nxtrace.org 或一个 IP 地址)自动赋给 instance 标签。而您自定义的 labels (如 name: ‘广州电信’) 会成为独立的标签。我们之前让变量去读取 instance 标签,所以自然就看到了 IP 或域名。
解决方案: 我们可以利用 Grafana 变量的一个高级功能:为选项同时定义“显示文本 (Text)”和“实际值 (Value)”。我们让下拉菜单显示 name 标签的值(例如“广州电信”),但当用户选中它时,Grafana 在后台查询时实际使用的是对应的 instance 标签的值(IP或域名)。
操作步骤: 进入面板设置 (右上角齿轮) -> “Variables” (变量)。
点击编辑 $target 变量。
修改以下两个字段:
Query (查询):
将原来的 label_values(probe_duration_seconds, instance)
修改为直接查询指标本身:probe_duration_seconds
Regex (正则表达式):
将原来的空内容
修改为下面这行代码(可以直接复制粘贴):
代码段
/.*instance="(?[^"]+)",.name="(?[^"]+)"./ 代码解释:
(?[^"]+):捕获 instance 标签的值,并将其命名为 value。
(?[^"]+):捕获 name 标签的值,并将其命名为 text。
Grafana 会自动识别 text 作为下拉菜单的显示文本,value 作为选中后传递给查询的实际值。
保存变量和面板。现在您再看顶部的 $target 下拉菜单,应该就能看到“广州电信”这样的友好名称了。
一键修复:最终修正版 JSON 我再次为您整合了上述两个问题的修复方案。请直接使用下面这个最终版本的 JSON,它应该能完美解决您所有的问题。
操作方式同上次一样:进入 “Dashboard settings” -> “JSON Model”,粘贴并保存。
JSON
{
“annotations”: {
“list”: [
{
“builtIn”: 1,
“datasource”: {
“type”: “datasource”,
“uid”: “grafana”
},
“enable”: true,
“hide”: true,
“iconColor”: “rgba(0, 211, 255, 1)”,
“name”: “Annotations & Alerts”,
“target”: {
“limit”: 100,
“matchAny”: false,
“tags”: [],
“type”: “dashboard”
},
“type”: “dashboard”
}
]
},
“description”: “SZO.CT监测点由Crazy(blog.csgo.ovh)赞助\nNTG.CU监测点由Crazy(blog.csgo.ovh)赞助”,
“editable”: true,
“fiscalYearStartMonth”: 0,
“graphTooltip”: 0,
“id”: 14,
“links”: [],
“panels”: [
{
“collapsed”: false,
“gridPos”: {
“h”: 1,
“w”: 24,
“x”: 0,
“y”: 0
},
“id”: 15,
“panels”: [],
“repeat”: “target”,
“title”: “$target status”,
“type”: “row”
},
{
“datasource”: {
“type”: “prometheus”,
“uid”: “eevnt0e0lz01sb”
},
“fieldConfig”: {
“defaults”: {
“color”: {
“mode”: “palette-classic”
},
“custom”: {
“axisBorderShow”: false,
“axisCenteredZero”: false,
“axisColorMode”: “text”,
“axisLabel”: “”,
“axisPlacement”: “auto”,
“barAlignment”: 0,
“barWidthFactor”: 0.6,
“drawStyle”: “line”,
“fillOpacity”: 70,
“gradientMode”: “opacity”,
“hideFrom”: {
“legend”: false,
“tooltip”: false,
“viz”: false
},
“insertNulls”: false,
“lineInterpolation”: “smooth”,
“lineStyle”: {
“fill”: “solid”
},
“lineWidth”: 2,
“pointSize”: 5,
“scaleDistribution”: {
“type”: “linear”
},
“showPoints”: “auto”,
“spanNulls”: false,
“stacking”: {
“group”: “A”,
“mode”: “none”
},
“thresholdsStyle”: {
“mode”: “off”
}
},
“mappings”: [],
“thresholds”: {
“mode”: “absolute”,
“steps”: [
{
“color”: “green”,
“value”: 0
},
{
“color”: “red”,
“value”: 80
}
]
},
“unit”: “s”
},
“overrides”: []
},
“gridPos”: {
“h”: 11,
“w”: 14,
“x”: 0,
“y”: 1
},
“id”: 25,
“options”: {
“legend”: {
“calcs”: [
“logmin”,
“max”,
“mean”,
“stdDev”,
“range”
],
“displayMode”: “table”,
“placement”: “bottom”,
“showLegend”: true
},
“tooltip”: {
“hideZeros”: false,
“mode”: “multi”,
“sort”: “none”
}
},
“pluginVersion”: “12.2.0-17027759091”,
“targets”: [
{
“datasource”: {
“type”: “prometheus”,
“uid”: “eevnt0e0lz01sb”
},
“editorMode”: “code”,
“expr”: “probe_duration_seconds{instance="$target",job="$job"}”,
“instant”: false,
“interval”: “$interval”,
“legendFormat”: “{{job}}”,
“range”: true,
“refId”: “A”
}
],
“title”: “ICMP Duration”,
“type”: “timeseries”
},
{
“datasource”: {
“type”: “prometheus”,
“uid”: “eevnt0e0lz01sb”
},
“fieldConfig”: {
“defaults”: {
“color”: {
“mode”: “palette-classic”
},
“custom”: {
“axisBorderShow”: false,
“axisCenteredZero”: false,
“axisColorMode”: “text”,
“axisLabel”: “”,
“axisPlacement”: “auto”,
“axisSoftMax”: 100,
“barAlignment”: 0,
“barWidthFactor”: 0.6,
“drawStyle”: “line”,
“fillOpacity”: 0,
“gradientMode”: “none”,
“hideFrom”: {
“legend”: false,
“tooltip”: false,
“viz”: false
},
“insertNulls”: false,
“lineInterpolation”: “smooth”,
“lineWidth”: 1,
“pointSize”: 5,
“scaleDistribution”: {
“type”: “linear”
},
“showPoints”: “auto”,
“spanNulls”: false,
“stacking”: {
“group”: “A”,
“mode”: “none”
},
“thresholdsStyle”: {
“mode”: “off”
}
},
“mappings”: [],
“thresholds”: {
“mode”: “absolute”,
“steps”: [
{
“color”: “green”,
“value”: 0
},
{
“color”: “red”,
“value”: 80
}
]
},
“unit”: “percent”
},
“overrides”: []
},
“gridPos”: {
“h”: 11,
“w”: 10,
“x”: 14,
“y”: 1
},
“id”: 17,
“options”: {
“legend”: {
“calcs”: [
“lastNotNull”,
“mean”,
“max”
],
“displayMode”: “table”,
“placement”: “bottom”,
“showLegend”: true
},
“tooltip”: {
“hideZeros”: false,
“mode”: “multi”,
“sort”: “none”
}
},
“pluginVersion”: “12.2.0-17027759091”,
“targets”: [
{
“datasource”: {
“type”: “prometheus”,
“uid”: “eevnt0e0lz01sb”
},
“editorMode”: “code”,
“exemplar”: false,
“expr”: “(1 - avg_over_time(probe_success{instance="$target", job="$job"}[1m])) * 100”,
“format”: “time_series”,
“instant”: false,
“interval”: “$interval”,
“intervalFactor”: 1,
“legendFormat”: “{{job}}”,
“range”: true,
“refId”: “A”
}
],
“title”: “Packet Loss Rate”,
“type”: “timeseries”
}
],
“refresh”: “10s”,
“schemaVersion”: 41,
“tags”: [
“prometheus”,
“icmp”,
“blackbox”
],
“templating”: {
“list”: [
{
“current”: {
“text”: “All”,
“value”: “$__all”
},
“datasource”: {
“type”: “prometheus”,
“uid”: “eevnt0e0lz01sb”
},
“definition”: “probe_duration_seconds”,
“includeAll”: true,
“label”: “目标 (Target)”,
“multi”: true,
“name”: “target”,
“options”: [],
“query”: {
“qryType”: 3,
“query”: “probe_duration_seconds”,
“refId”: “PrometheusVariableQueryEditor-VariableQuery”
},
“refresh”: 1,
“regex”: “/.*instance="(?[^"]+)",.name="(?[^"]+)"./”,
“sort”: 1,
“type”: “query”
},
{
“current”: {
“text”: “All”,
“value”: [
“$__all”
]
},
“datasource”: {
“type”: “prometheus”,
“uid”: “eevnt0e0lz01sb”
},
“definition”: “label_values(probe_duration_seconds, job)”,
“includeAll”: true,
“label”: “源 (Source)”,
“multi”: true,
“name”: “job”,
“options”: [],
“query”: “label_values(probe_duration_seconds, job)”,
“refresh”: 1,
“regex”: “”,
“sort”: 1,
“type”: “query”
},
{
“auto”: true,
“auto_count”: 30,
“auto_min”: “10s”,
“current”: {
“text”: “auto”,
“value”: “$__auto_interval_interval”
},
“label”: “Interval”,
“name”: “interval”,
“options”: [
{
“selected”: true,
“text”: “auto”,
“value”: “$__auto_interval_interval”
},
{
“selected”: false,
“text”: “5s”,
“value”: “5s”
},
{
“selected”: false,
“text”: “10s”,
“value”: “10s”
},
{
“selected”: false,
“text”: “30s”,
“value”: “30s”
},
{
“selected”: false,
“text”: “1m”,
“value”: “1m”
}
],
“query”: “5s,10s,30s,1m”,
“refresh”: 2,
“type”: “interval”
}
]
},
“time”: {
“from”: “now-1h”,
“to”: “now”
},
“timepicker”: {},
“timezone”: “browser”,
“title”: “三网ICMP监测v2 (已修正)”,
“uid”: “bdvog263hhr0gc”,
“version”: 6
}