修复ping.nxtrace的模板到我能用的格式

好的,感谢您提供正常工作的面板 JSON。通过对比,我已经准确定位了第一个面板不出数据的原因。

简而言之,第一个面板完全是为别人的 Prometheus 数据和命名习惯“量身定做”的,它与您的环境在三个关键点上完全不兼容:

数据源ID不匹配:面板写死了错误的数据源ID。

指标查询不匹配:面板查询了一个您环境中不存在的指标 (ping_loss_ratio),并且查询标签的方式也和您的习惯不同。

变量定义不匹配(最核心的问题):面板的下拉菜单变量使用了非常严格的过滤规则(例如要求 job 必须以 PEK- 开头),这导致变量列表为空,所有图表因此都无法获取任何数据,最终整个面板一片空白。

详细问题对比与解决方案 下面我将为您详细拆解问题所在,并提供直接的修复方案。

  1. 数据源 (Data Source) 正常面板: 所有图表和变量都统一使用数据源 ID eevnt0e0lz01sb。

问题面板: 使用了 eevnt0e0lz01sb, cdjc4dwosc83kb, fWcy5_o4z 等多个不同的 ID。

✅ 解决方案: 必须将问题面板中所有图表和变量的数据源都手动修改为您正确的 Prometheus 数据源 (ID: eevnt0e0lz01sb)。

  1. 指标和标签 (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"。

  1. 变量定义 (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 }