1478 lines
58 KiB
JSON
1478 lines
58 KiB
JSON
{
|
|
"annotations": {
|
|
"list": [
|
|
{
|
|
"builtIn": 1,
|
|
"datasource": {
|
|
"type": "grafana",
|
|
"uid": "-- Grafana --"
|
|
},
|
|
"enable": true,
|
|
"hide": true,
|
|
"iconColor": "rgba(0, 211, 255, 1)",
|
|
"name": "Annotations & Alerts",
|
|
"type": "dashboard"
|
|
}
|
|
]
|
|
},
|
|
"editable": true,
|
|
"fiscalYearStartMonth": 0,
|
|
"graphTooltip": 1,
|
|
"id": 1,
|
|
"links": [],
|
|
"panels": [
|
|
{
|
|
"collapsed": false,
|
|
"gridPos": { "h": 1, "w": 24, "x": 0, "y": 0 },
|
|
"id": 100,
|
|
"panels": [],
|
|
"title": "Right Now",
|
|
"type": "row"
|
|
},
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"description": "Shows UP if at least one ping to an external target succeeded in the last 60 seconds. If this is down while the router is up, the problem is on the ISP side.",
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"color": { "mode": "thresholds" },
|
|
"mappings": [
|
|
{
|
|
"type": "value",
|
|
"options": {
|
|
"0": { "color": "red", "index": 1, "text": "DOWN" },
|
|
"1": { "color": "green", "index": 0, "text": "UP" }
|
|
}
|
|
},
|
|
{
|
|
"type": "special",
|
|
"options": {
|
|
"match": "null",
|
|
"result": { "color": "text", "index": 2, "text": "NO DATA" }
|
|
}
|
|
}
|
|
],
|
|
"noValue": "NO DATA",
|
|
"thresholds": {
|
|
"mode": "absolute",
|
|
"steps": [
|
|
{ "color": "red", "value": 0 },
|
|
{ "color": "green", "value": 1 }
|
|
]
|
|
},
|
|
"unit": "none"
|
|
},
|
|
"overrides": []
|
|
},
|
|
"gridPos": { "h": 5, "w": 6, "x": 0, "y": 1 },
|
|
"id": 1,
|
|
"options": {
|
|
"colorMode": "background",
|
|
"graphMode": "none",
|
|
"justifyMode": "center",
|
|
"orientation": "auto",
|
|
"percentChangeColorMode": "standard",
|
|
"reduceOptions": { "calcs": ["last"], "fields": "", "values": false },
|
|
"showPercentChange": false,
|
|
"textMode": "value",
|
|
"wideLayout": true
|
|
},
|
|
"pluginVersion": "12.3.3",
|
|
"targets": [
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"queryText": "SELECT MAX(success) AS value FROM ping_checks WHERE is_gateway = 0 AND timestamp >= strftime('%s','now') - 60",
|
|
"queryType": "table",
|
|
"rawQueryText": "SELECT MAX(success) AS value FROM ping_checks WHERE is_gateway = 0 AND timestamp >= strftime('%s','now') - 60",
|
|
"refId": "A"
|
|
}
|
|
],
|
|
"title": "Internet",
|
|
"type": "stat"
|
|
},
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"description": "Shows UP if at least one ping to the local gateway succeeded in the last 60 seconds. If this is down, the problem is in the local network or the router itself.",
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"color": { "mode": "thresholds" },
|
|
"mappings": [
|
|
{
|
|
"type": "value",
|
|
"options": {
|
|
"0": { "color": "red", "index": 1, "text": "DOWN" },
|
|
"1": { "color": "green", "index": 0, "text": "UP" }
|
|
}
|
|
},
|
|
{
|
|
"type": "special",
|
|
"options": {
|
|
"match": "null",
|
|
"result": { "color": "text", "index": 2, "text": "NO DATA" }
|
|
}
|
|
}
|
|
],
|
|
"noValue": "NO DATA",
|
|
"thresholds": {
|
|
"mode": "absolute",
|
|
"steps": [
|
|
{ "color": "red", "value": 0 },
|
|
{ "color": "green", "value": 1 }
|
|
]
|
|
},
|
|
"unit": "none"
|
|
},
|
|
"overrides": []
|
|
},
|
|
"gridPos": { "h": 5, "w": 6, "x": 6, "y": 1 },
|
|
"id": 2,
|
|
"options": {
|
|
"colorMode": "background",
|
|
"graphMode": "none",
|
|
"justifyMode": "center",
|
|
"orientation": "auto",
|
|
"percentChangeColorMode": "standard",
|
|
"reduceOptions": { "calcs": ["last"], "fields": "", "values": false },
|
|
"showPercentChange": false,
|
|
"textMode": "value",
|
|
"wideLayout": true
|
|
},
|
|
"pluginVersion": "12.3.3",
|
|
"targets": [
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"queryText": "SELECT MAX(success) AS value FROM ping_checks WHERE is_gateway = 1 AND timestamp >= strftime('%s','now') - 60",
|
|
"queryType": "table",
|
|
"rawQueryText": "SELECT MAX(success) AS value FROM ping_checks WHERE is_gateway = 1 AND timestamp >= strftime('%s','now') - 60",
|
|
"refId": "A"
|
|
}
|
|
],
|
|
"title": "Router",
|
|
"type": "stat"
|
|
},
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"description": "Average latency of successful external pings in the last 60 seconds.",
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"color": { "mode": "thresholds" },
|
|
"decimals": 1,
|
|
"mappings": [],
|
|
"noValue": "NO DATA",
|
|
"thresholds": {
|
|
"mode": "absolute",
|
|
"steps": [
|
|
{ "color": "green", "value": 0 },
|
|
{ "color": "yellow", "value": 50 },
|
|
{ "color": "red", "value": 100 }
|
|
]
|
|
},
|
|
"unit": "ms"
|
|
},
|
|
"overrides": []
|
|
},
|
|
"gridPos": { "h": 5, "w": 4, "x": 12, "y": 1 },
|
|
"id": 3,
|
|
"options": {
|
|
"colorMode": "background",
|
|
"graphMode": "none",
|
|
"justifyMode": "center",
|
|
"orientation": "auto",
|
|
"percentChangeColorMode": "standard",
|
|
"reduceOptions": { "calcs": ["last"], "fields": "", "values": false },
|
|
"showPercentChange": false,
|
|
"textMode": "auto",
|
|
"wideLayout": true
|
|
},
|
|
"pluginVersion": "12.3.3",
|
|
"targets": [
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"queryText": "SELECT ROUND(AVG(latency_ms), 1) AS value FROM ping_checks WHERE is_gateway = 0 AND success = 1 AND timestamp >= strftime('%s','now') - 60",
|
|
"queryType": "table",
|
|
"rawQueryText": "SELECT ROUND(AVG(latency_ms), 1) AS value FROM ping_checks WHERE is_gateway = 0 AND success = 1 AND timestamp >= strftime('%s','now') - 60",
|
|
"refId": "A"
|
|
}
|
|
],
|
|
"title": "Current Latency",
|
|
"type": "stat"
|
|
},
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"description": "Percentage of successful external pings over the last 24 hours.",
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"color": { "mode": "thresholds" },
|
|
"decimals": 2,
|
|
"mappings": [],
|
|
"noValue": "NO DATA",
|
|
"thresholds": {
|
|
"mode": "absolute",
|
|
"steps": [
|
|
{ "color": "red", "value": 0 },
|
|
{ "color": "yellow", "value": 99 },
|
|
{ "color": "green", "value": 99.9 }
|
|
]
|
|
},
|
|
"unit": "percent"
|
|
},
|
|
"overrides": []
|
|
},
|
|
"gridPos": { "h": 5, "w": 4, "x": 16, "y": 1 },
|
|
"id": 4,
|
|
"options": {
|
|
"colorMode": "background",
|
|
"graphMode": "none",
|
|
"justifyMode": "center",
|
|
"orientation": "auto",
|
|
"percentChangeColorMode": "standard",
|
|
"reduceOptions": { "calcs": ["last"], "fields": "", "values": false },
|
|
"showPercentChange": false,
|
|
"textMode": "auto",
|
|
"wideLayout": true
|
|
},
|
|
"pluginVersion": "12.3.3",
|
|
"targets": [
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"queryText": "SELECT ROUND(100.0 * SUM(success) / COUNT(*), 2) AS value FROM ping_checks WHERE is_gateway = 0 AND timestamp >= strftime('%s','now') - 86400",
|
|
"queryType": "table",
|
|
"rawQueryText": "SELECT ROUND(100.0 * SUM(success) / COUNT(*), 2) AS value FROM ping_checks WHERE is_gateway = 0 AND timestamp >= strftime('%s','now') - 86400",
|
|
"refId": "A"
|
|
}
|
|
],
|
|
"title": "Uptime (24h)",
|
|
"type": "stat"
|
|
},
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"description": "Seconds since the last recorded ping. If this turns red, the ping container has stopped writing data and the other panels can no longer be trusted.",
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"color": { "mode": "thresholds" },
|
|
"decimals": 0,
|
|
"mappings": [],
|
|
"noValue": "NO DATA",
|
|
"thresholds": {
|
|
"mode": "absolute",
|
|
"steps": [
|
|
{ "color": "green", "value": 0 },
|
|
{ "color": "yellow", "value": 15 },
|
|
{ "color": "red", "value": 60 }
|
|
]
|
|
},
|
|
"unit": "s"
|
|
},
|
|
"overrides": []
|
|
},
|
|
"gridPos": { "h": 5, "w": 4, "x": 20, "y": 1 },
|
|
"id": 5,
|
|
"options": {
|
|
"colorMode": "background",
|
|
"graphMode": "none",
|
|
"justifyMode": "center",
|
|
"orientation": "auto",
|
|
"percentChangeColorMode": "standard",
|
|
"reduceOptions": { "calcs": ["last"], "fields": "", "values": false },
|
|
"showPercentChange": false,
|
|
"textMode": "auto",
|
|
"wideLayout": true
|
|
},
|
|
"pluginVersion": "12.3.3",
|
|
"targets": [
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"queryText": "SELECT CAST(strftime('%s','now') - MAX(timestamp) AS INTEGER) AS value FROM ping_checks",
|
|
"queryType": "table",
|
|
"rawQueryText": "SELECT CAST(strftime('%s','now') - MAX(timestamp) AS INTEGER) AS value FROM ping_checks",
|
|
"refId": "A"
|
|
}
|
|
],
|
|
"title": "Last Check",
|
|
"type": "stat"
|
|
},
|
|
{
|
|
"collapsed": false,
|
|
"gridPos": { "h": 1, "w": 24, "x": 0, "y": 6 },
|
|
"id": 101,
|
|
"panels": [],
|
|
"title": "Status History",
|
|
"type": "row"
|
|
},
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"description": "A time bucket counts as up if at least one ping in it succeeded. A single dropped packet therefore does not show as an outage.",
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"color": { "mode": "thresholds" },
|
|
"custom": {
|
|
"fillOpacity": 70,
|
|
"hideFrom": { "legend": false, "tooltip": false, "viz": false },
|
|
"insertNulls": false,
|
|
"lineWidth": 0,
|
|
"spanNulls": false
|
|
},
|
|
"mappings": [
|
|
{
|
|
"type": "value",
|
|
"options": {
|
|
"0": { "color": "red", "index": 1, "text": "Down" },
|
|
"1": { "color": "green", "index": 0, "text": "Up" }
|
|
}
|
|
}
|
|
],
|
|
"thresholds": {
|
|
"mode": "absolute",
|
|
"steps": [
|
|
{ "color": "red", "value": 0 },
|
|
{ "color": "green", "value": 1 }
|
|
]
|
|
}
|
|
},
|
|
"overrides": []
|
|
},
|
|
"gridPos": { "h": 5, "w": 24, "x": 0, "y": 7 },
|
|
"id": 10,
|
|
"options": {
|
|
"alignValue": "left",
|
|
"legend": { "displayMode": "list", "placement": "bottom", "showLegend": true },
|
|
"mergeValues": true,
|
|
"rowHeight": 0.85,
|
|
"showValue": "never",
|
|
"tooltip": { "hideZeros": false, "mode": "single", "sort": "none" }
|
|
},
|
|
"pluginVersion": "12.3.3",
|
|
"targets": [
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"queryText": "SELECT CAST(timestamp / MAX(60, ($__to - $__from) / 1000 / 500) AS INTEGER) * MAX(60, ($__to - $__from) / 1000 / 500) AS time, MAX(CASE WHEN is_gateway = 0 THEN success END) AS 'Internet', MAX(CASE WHEN is_gateway = 1 THEN success END) AS 'Router' FROM ping_checks WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 GROUP BY 1 ORDER BY 1",
|
|
"queryType": "table",
|
|
"rawQueryText": "SELECT CAST(timestamp / MAX(60, ($__to - $__from) / 1000 / 500) AS INTEGER) * MAX(60, ($__to - $__from) / 1000 / 500) AS time, MAX(CASE WHEN is_gateway = 0 THEN success END) AS 'Internet', MAX(CASE WHEN is_gateway = 1 THEN success END) AS 'Router' FROM ping_checks WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 GROUP BY 1 ORDER BY 1",
|
|
"refId": "A",
|
|
"timeColumns": ["time"]
|
|
}
|
|
],
|
|
"title": "Connectivity",
|
|
"type": "state-timeline"
|
|
},
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"description": "One row per ping target provider. If all rows are red the internet connection is down. If only one row is red, only that provider is unreachable.",
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"color": { "mode": "thresholds" },
|
|
"custom": {
|
|
"fillOpacity": 70,
|
|
"hideFrom": { "legend": false, "tooltip": false, "viz": false },
|
|
"insertNulls": false,
|
|
"lineWidth": 0,
|
|
"spanNulls": false
|
|
},
|
|
"mappings": [
|
|
{
|
|
"type": "value",
|
|
"options": {
|
|
"0": { "color": "red", "index": 1, "text": "Down" },
|
|
"1": { "color": "green", "index": 0, "text": "Up" }
|
|
}
|
|
}
|
|
],
|
|
"thresholds": {
|
|
"mode": "absolute",
|
|
"steps": [
|
|
{ "color": "red", "value": 0 },
|
|
{ "color": "green", "value": 1 }
|
|
]
|
|
}
|
|
},
|
|
"overrides": []
|
|
},
|
|
"gridPos": { "h": 7, "w": 24, "x": 0, "y": 12 },
|
|
"id": 11,
|
|
"options": {
|
|
"alignValue": "left",
|
|
"legend": { "displayMode": "list", "placement": "bottom", "showLegend": true },
|
|
"mergeValues": true,
|
|
"rowHeight": 0.85,
|
|
"showValue": "never",
|
|
"tooltip": { "hideZeros": false, "mode": "single", "sort": "none" }
|
|
},
|
|
"pluginVersion": "12.3.3",
|
|
"targets": [
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"queryText": "SELECT CAST(timestamp / MAX(60, ($__to - $__from) / 1000 / 500) AS INTEGER) * MAX(60, ($__to - $__from) / 1000 / 500) AS time, MAX(CASE WHEN target_ip IN ('1.1.1.1','1.0.0.1') THEN success END) AS 'Cloudflare', MAX(CASE WHEN target_ip IN ('8.8.8.8','8.8.4.4') THEN success END) AS 'Google', MAX(CASE WHEN target_ip IN ('9.9.9.9','149.112.112.112') THEN success END) AS 'Quad9', MAX(CASE WHEN target_ip IN ('208.67.222.222','208.67.220.220') THEN success END) AS 'OpenDNS', MAX(CASE WHEN target_ip = '64.6.64.6' THEN success END) AS 'Verisign', MAX(CASE WHEN target_ip = '84.200.69.80' THEN success END) AS 'DNS.WATCH' FROM ping_checks WHERE is_gateway = 0 AND timestamp BETWEEN $__from/1000 AND $__to/1000 GROUP BY 1 ORDER BY 1",
|
|
"queryType": "table",
|
|
"rawQueryText": "SELECT CAST(timestamp / MAX(60, ($__to - $__from) / 1000 / 500) AS INTEGER) * MAX(60, ($__to - $__from) / 1000 / 500) AS time, MAX(CASE WHEN target_ip IN ('1.1.1.1','1.0.0.1') THEN success END) AS 'Cloudflare', MAX(CASE WHEN target_ip IN ('8.8.8.8','8.8.4.4') THEN success END) AS 'Google', MAX(CASE WHEN target_ip IN ('9.9.9.9','149.112.112.112') THEN success END) AS 'Quad9', MAX(CASE WHEN target_ip IN ('208.67.222.222','208.67.220.220') THEN success END) AS 'OpenDNS', MAX(CASE WHEN target_ip = '64.6.64.6' THEN success END) AS 'Verisign', MAX(CASE WHEN target_ip = '84.200.69.80' THEN success END) AS 'DNS.WATCH' FROM ping_checks WHERE is_gateway = 0 AND timestamp BETWEEN $__from/1000 AND $__to/1000 GROUP BY 1 ORDER BY 1",
|
|
"refId": "A",
|
|
"timeColumns": ["time"]
|
|
}
|
|
],
|
|
"title": "Ping Targets",
|
|
"type": "state-timeline"
|
|
},
|
|
{
|
|
"collapsed": false,
|
|
"gridPos": { "h": 1, "w": 24, "x": 0, "y": 19 },
|
|
"id": 102,
|
|
"panels": [],
|
|
"title": "Ping Latency",
|
|
"type": "row"
|
|
},
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"description": "Average ping round trip time per time bucket. Rising latency can indicate connection problems before pings start to fail.",
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"color": { "mode": "palette-classic" },
|
|
"custom": {
|
|
"axisBorderShow": false,
|
|
"axisCenteredZero": false,
|
|
"axisColorMode": "text",
|
|
"axisLabel": "",
|
|
"axisPlacement": "auto",
|
|
"barAlignment": 0,
|
|
"barWidthFactor": 0.6,
|
|
"drawStyle": "line",
|
|
"fillOpacity": 10,
|
|
"gradientMode": "none",
|
|
"hideFrom": { "legend": false, "tooltip": false, "viz": false },
|
|
"insertNulls": false,
|
|
"lineInterpolation": "linear",
|
|
"lineWidth": 2,
|
|
"pointSize": 5,
|
|
"scaleDistribution": { "type": "linear" },
|
|
"showPoints": "auto",
|
|
"showValues": false,
|
|
"spanNulls": false,
|
|
"stacking": { "group": "A", "mode": "none" },
|
|
"thresholdsStyle": { "mode": "off" }
|
|
},
|
|
"mappings": [],
|
|
"thresholds": {
|
|
"mode": "absolute",
|
|
"steps": [
|
|
{ "color": "green", "value": 0 },
|
|
{ "color": "red", "value": 80 }
|
|
]
|
|
},
|
|
"unit": "ms"
|
|
},
|
|
"overrides": [
|
|
{
|
|
"matcher": { "id": "byName", "options": "Internet" },
|
|
"properties": [
|
|
{ "id": "color", "value": { "fixedColor": "#3274D9", "mode": "fixed" } }
|
|
]
|
|
},
|
|
{
|
|
"matcher": { "id": "byName", "options": "Router" },
|
|
"properties": [
|
|
{ "id": "color", "value": { "fixedColor": "#56A64B", "mode": "fixed" } }
|
|
]
|
|
}
|
|
]
|
|
},
|
|
"gridPos": { "h": 8, "w": 24, "x": 0, "y": 20 },
|
|
"id": 20,
|
|
"options": {
|
|
"legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom", "showLegend": true },
|
|
"tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" }
|
|
},
|
|
"pluginVersion": "12.3.3",
|
|
"targets": [
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"queryText": "SELECT CAST(timestamp / MAX(60, ($__to - $__from) / 1000 / 500) AS INTEGER) * MAX(60, ($__to - $__from) / 1000 / 500) AS time, ROUND(AVG(CASE WHEN is_gateway = 0 AND success = 1 THEN latency_ms END), 2) AS 'Internet', ROUND(AVG(CASE WHEN is_gateway = 1 AND success = 1 THEN latency_ms END), 2) AS 'Router' FROM ping_checks WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 GROUP BY 1 ORDER BY 1",
|
|
"queryType": "table",
|
|
"rawQueryText": "SELECT CAST(timestamp / MAX(60, ($__to - $__from) / 1000 / 500) AS INTEGER) * MAX(60, ($__to - $__from) / 1000 / 500) AS time, ROUND(AVG(CASE WHEN is_gateway = 0 AND success = 1 THEN latency_ms END), 2) AS 'Internet', ROUND(AVG(CASE WHEN is_gateway = 1 AND success = 1 THEN latency_ms END), 2) AS 'Router' FROM ping_checks WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 GROUP BY 1 ORDER BY 1",
|
|
"refId": "A",
|
|
"timeColumns": ["time"]
|
|
}
|
|
],
|
|
"title": "Ping Latency Over Time",
|
|
"type": "timeseries"
|
|
},
|
|
{
|
|
"collapsed": false,
|
|
"gridPos": { "h": 1, "w": 24, "x": 0, "y": 28 },
|
|
"id": 103,
|
|
"panels": [],
|
|
"title": "Speed Tests",
|
|
"type": "row"
|
|
},
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"color": { "mode": "palette-classic" },
|
|
"custom": {
|
|
"axisBorderShow": false,
|
|
"axisCenteredZero": false,
|
|
"axisColorMode": "text",
|
|
"axisLabel": "",
|
|
"axisPlacement": "auto",
|
|
"barAlignment": 0,
|
|
"barWidthFactor": 0.6,
|
|
"drawStyle": "line",
|
|
"fillOpacity": 10,
|
|
"gradientMode": "none",
|
|
"hideFrom": { "legend": false, "tooltip": false, "viz": false },
|
|
"insertNulls": false,
|
|
"lineInterpolation": "linear",
|
|
"lineWidth": 2,
|
|
"pointSize": 5,
|
|
"scaleDistribution": { "type": "linear" },
|
|
"showPoints": "auto",
|
|
"showValues": false,
|
|
"spanNulls": false,
|
|
"stacking": { "group": "A", "mode": "none" },
|
|
"thresholdsStyle": { "mode": "off" }
|
|
},
|
|
"mappings": [],
|
|
"thresholds": {
|
|
"mode": "absolute",
|
|
"steps": [
|
|
{ "color": "green", "value": 0 },
|
|
{ "color": "red", "value": 80 }
|
|
]
|
|
},
|
|
"unit": "Mbits"
|
|
},
|
|
"overrides": [
|
|
{
|
|
"matcher": { "id": "byName", "options": "Download" },
|
|
"properties": [
|
|
{ "id": "color", "value": { "fixedColor": "#3274D9", "mode": "fixed" } }
|
|
]
|
|
},
|
|
{
|
|
"matcher": { "id": "byName", "options": "Upload" },
|
|
"properties": [
|
|
{ "id": "color", "value": { "fixedColor": "#56A64B", "mode": "fixed" } }
|
|
]
|
|
},
|
|
{
|
|
"matcher": { "id": "byName", "options": "Promised Download" },
|
|
"properties": [
|
|
{ "id": "color", "value": { "fixedColor": "#3274D9", "mode": "fixed" } },
|
|
{ "id": "custom.lineStyle", "value": { "dash": [10, 10], "fill": "dash" } },
|
|
{ "id": "custom.lineWidth", "value": 1 },
|
|
{ "id": "custom.fillOpacity", "value": 0 },
|
|
{ "id": "custom.showPoints", "value": "never" }
|
|
]
|
|
},
|
|
{
|
|
"matcher": { "id": "byName", "options": "Promised Upload" },
|
|
"properties": [
|
|
{ "id": "color", "value": { "fixedColor": "#56A64B", "mode": "fixed" } },
|
|
{ "id": "custom.lineStyle", "value": { "dash": [10, 10], "fill": "dash" } },
|
|
{ "id": "custom.lineWidth", "value": 1 },
|
|
{ "id": "custom.fillOpacity", "value": 0 },
|
|
{ "id": "custom.showPoints", "value": "never" }
|
|
]
|
|
}
|
|
]
|
|
},
|
|
"gridPos": { "h": 9, "w": 24, "x": 0, "y": 29 },
|
|
"id": 30,
|
|
"options": {
|
|
"legend": { "calcs": ["mean", "max", "lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true },
|
|
"tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" }
|
|
},
|
|
"pluginVersion": "12.3.3",
|
|
"targets": [
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"queryText": "SELECT timestamp AS time, down_90th AS 'Download', up_90th AS 'Upload', ${sla_down_normal} AS 'Promised Download', ${sla_up_normal} AS 'Promised Upload' FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 AND failed=0 ORDER BY timestamp",
|
|
"queryType": "table",
|
|
"rawQueryText": "SELECT timestamp AS time, down_90th AS 'Download', up_90th AS 'Upload', ${sla_down_normal} AS 'Promised Download', ${sla_up_normal} AS 'Promised Upload' FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 AND failed=0 ORDER BY timestamp",
|
|
"refId": "A",
|
|
"timeColumns": ["time"]
|
|
}
|
|
],
|
|
"title": "Download & Upload Speed (90th Percentile)",
|
|
"type": "timeseries"
|
|
},
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"color": { "mode": "palette-classic" },
|
|
"custom": {
|
|
"axisBorderShow": false,
|
|
"axisCenteredZero": false,
|
|
"axisColorMode": "text",
|
|
"axisLabel": "",
|
|
"axisPlacement": "auto",
|
|
"barAlignment": 0,
|
|
"barWidthFactor": 0.6,
|
|
"drawStyle": "line",
|
|
"fillOpacity": 10,
|
|
"gradientMode": "none",
|
|
"hideFrom": { "legend": false, "tooltip": false, "viz": false },
|
|
"insertNulls": false,
|
|
"lineInterpolation": "linear",
|
|
"lineWidth": 2,
|
|
"pointSize": 5,
|
|
"scaleDistribution": { "type": "linear" },
|
|
"showPoints": "auto",
|
|
"showValues": false,
|
|
"spanNulls": false,
|
|
"stacking": { "group": "A", "mode": "none" },
|
|
"thresholdsStyle": { "mode": "off" }
|
|
},
|
|
"mappings": [],
|
|
"thresholds": {
|
|
"mode": "absolute",
|
|
"steps": [
|
|
{ "color": "green", "value": 0 },
|
|
{ "color": "red", "value": 80 }
|
|
]
|
|
},
|
|
"unit": "ms"
|
|
},
|
|
"overrides": [
|
|
{
|
|
"matcher": { "id": "byName", "options": "Latency" },
|
|
"properties": [
|
|
{ "id": "color", "value": { "fixedColor": "#FF9830", "mode": "fixed" } }
|
|
]
|
|
},
|
|
{
|
|
"matcher": { "id": "byName", "options": "Jitter" },
|
|
"properties": [
|
|
{ "id": "color", "value": { "fixedColor": "#E02F44", "mode": "fixed" } }
|
|
]
|
|
}
|
|
]
|
|
},
|
|
"gridPos": { "h": 8, "w": 12, "x": 0, "y": 38 },
|
|
"id": 31,
|
|
"options": {
|
|
"legend": { "calcs": [], "displayMode": "list", "placement": "bottom", "showLegend": true },
|
|
"tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" }
|
|
},
|
|
"pluginVersion": "12.3.3",
|
|
"targets": [
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"queryText": "SELECT timestamp AS time, latency AS 'Latency', jitter AS 'Jitter' FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 AND failed=0 ORDER BY timestamp",
|
|
"queryType": "table",
|
|
"rawQueryText": "SELECT timestamp AS time, latency AS 'Latency', jitter AS 'Jitter' FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 AND failed=0 ORDER BY timestamp",
|
|
"refId": "A",
|
|
"timeColumns": ["time"]
|
|
}
|
|
],
|
|
"title": "Speedtest Latency & Jitter",
|
|
"type": "timeseries"
|
|
},
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"description": "Percentage of speedtest runs that completed in the selected time range.",
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"color": { "mode": "thresholds" },
|
|
"decimals": 1,
|
|
"mappings": [],
|
|
"noValue": "NO DATA",
|
|
"thresholds": {
|
|
"mode": "absolute",
|
|
"steps": [
|
|
{ "color": "red", "value": 0 },
|
|
{ "color": "yellow", "value": 90 },
|
|
{ "color": "green", "value": 98 }
|
|
]
|
|
},
|
|
"unit": "percent"
|
|
},
|
|
"overrides": []
|
|
},
|
|
"gridPos": { "h": 8, "w": 4, "x": 12, "y": 38 },
|
|
"id": 32,
|
|
"options": {
|
|
"colorMode": "background",
|
|
"graphMode": "none",
|
|
"justifyMode": "center",
|
|
"orientation": "auto",
|
|
"percentChangeColorMode": "standard",
|
|
"reduceOptions": { "calcs": ["last"], "fields": "", "values": false },
|
|
"showPercentChange": false,
|
|
"textMode": "auto",
|
|
"wideLayout": true
|
|
},
|
|
"pluginVersion": "12.3.3",
|
|
"targets": [
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"queryText": "SELECT ROUND(100.0 * SUM(CASE WHEN failed=0 THEN 1 ELSE 0 END) / COUNT(*), 1) AS value FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000",
|
|
"queryType": "table",
|
|
"rawQueryText": "SELECT ROUND(100.0 * SUM(CASE WHEN failed=0 THEN 1 ELSE 0 END) / COUNT(*), 1) AS value FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000",
|
|
"refId": "A"
|
|
}
|
|
],
|
|
"title": "Speedtest Success",
|
|
"type": "stat"
|
|
},
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"color": { "mode": "thresholds" },
|
|
"decimals": 0,
|
|
"mappings": [],
|
|
"thresholds": {
|
|
"mode": "absolute",
|
|
"steps": [
|
|
{ "color": "green", "value": 0 },
|
|
{ "color": "yellow", "value": 3 },
|
|
{ "color": "red", "value": 10 }
|
|
]
|
|
},
|
|
"unit": "none"
|
|
},
|
|
"overrides": []
|
|
},
|
|
"gridPos": { "h": 8, "w": 4, "x": 16, "y": 38 },
|
|
"id": 33,
|
|
"options": {
|
|
"colorMode": "background",
|
|
"graphMode": "none",
|
|
"justifyMode": "center",
|
|
"orientation": "auto",
|
|
"percentChangeColorMode": "standard",
|
|
"reduceOptions": { "calcs": ["last"], "fields": "", "values": false },
|
|
"showPercentChange": false,
|
|
"textMode": "auto",
|
|
"wideLayout": true
|
|
},
|
|
"pluginVersion": "12.3.3",
|
|
"targets": [
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"queryText": "SELECT COUNT(*) AS value FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 AND failed=1",
|
|
"queryType": "table",
|
|
"rawQueryText": "SELECT COUNT(*) AS value FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 AND failed=1",
|
|
"refId": "A"
|
|
}
|
|
],
|
|
"title": "Failed Speedtests",
|
|
"type": "stat"
|
|
},
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"description": "Whether scheduled speedtests are currently enabled. Toggle this on the control page served by the control container.",
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"color": { "mode": "thresholds" },
|
|
"mappings": [
|
|
{
|
|
"type": "value",
|
|
"options": {
|
|
"0": { "color": "orange", "index": 1, "text": "OFF" },
|
|
"1": { "color": "green", "index": 0, "text": "ON" }
|
|
}
|
|
},
|
|
{
|
|
"type": "special",
|
|
"options": {
|
|
"match": "null",
|
|
"result": { "color": "text", "index": 2, "text": "N/A" }
|
|
}
|
|
}
|
|
],
|
|
"noValue": "N/A",
|
|
"thresholds": {
|
|
"mode": "absolute",
|
|
"steps": [
|
|
{ "color": "orange", "value": 0 },
|
|
{ "color": "green", "value": 1 }
|
|
]
|
|
},
|
|
"unit": "none"
|
|
},
|
|
"overrides": []
|
|
},
|
|
"gridPos": { "h": 8, "w": 4, "x": 20, "y": 38 },
|
|
"id": 34,
|
|
"options": {
|
|
"colorMode": "background",
|
|
"graphMode": "none",
|
|
"justifyMode": "center",
|
|
"orientation": "auto",
|
|
"percentChangeColorMode": "standard",
|
|
"reduceOptions": { "calcs": ["last"], "fields": "", "values": false },
|
|
"showPercentChange": false,
|
|
"textMode": "value",
|
|
"wideLayout": true
|
|
},
|
|
"pluginVersion": "12.3.3",
|
|
"targets": [
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"queryText": "SELECT CASE value WHEN '1' THEN 1 ELSE 0 END AS value FROM settings WHERE key = 'speedtest_enabled'",
|
|
"queryType": "table",
|
|
"rawQueryText": "SELECT CASE value WHEN '1' THEN 1 ELSE 0 END AS value FROM settings WHERE key = 'speedtest_enabled'",
|
|
"refId": "A"
|
|
}
|
|
],
|
|
"title": "Speedtests",
|
|
"type": "stat"
|
|
},
|
|
{
|
|
"collapsed": false,
|
|
"gridPos": { "h": 1, "w": 24, "x": 0, "y": 46 },
|
|
"id": 106,
|
|
"panels": [],
|
|
"title": "ISP SLA",
|
|
"type": "row"
|
|
},
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"description": "Share of speedtests that reached the contractual 'normally available' download speed. German TKG rules require this in at least 90% of measurements.",
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"color": { "mode": "thresholds" },
|
|
"decimals": 1,
|
|
"mappings": [],
|
|
"noValue": "NO DATA",
|
|
"thresholds": {
|
|
"mode": "absolute",
|
|
"steps": [
|
|
{ "color": "red", "value": 0 },
|
|
{ "color": "yellow", "value": 80 },
|
|
{ "color": "green", "value": 90 }
|
|
]
|
|
},
|
|
"unit": "percent"
|
|
},
|
|
"overrides": []
|
|
},
|
|
"gridPos": { "h": 5, "w": 4, "x": 0, "y": 47 },
|
|
"id": 60,
|
|
"options": {
|
|
"colorMode": "background",
|
|
"graphMode": "none",
|
|
"justifyMode": "center",
|
|
"orientation": "auto",
|
|
"percentChangeColorMode": "standard",
|
|
"reduceOptions": { "calcs": ["last"], "fields": "", "values": false },
|
|
"showPercentChange": false,
|
|
"textMode": "auto",
|
|
"wideLayout": true
|
|
},
|
|
"pluginVersion": "12.3.3",
|
|
"targets": [
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"queryText": "SELECT ROUND(100.0 * SUM(CASE WHEN down_90th >= ${sla_down_normal} THEN 1 ELSE 0 END) / COUNT(*), 1) AS value FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 AND failed=0 AND down_90th IS NOT NULL",
|
|
"queryType": "table",
|
|
"rawQueryText": "SELECT ROUND(100.0 * SUM(CASE WHEN down_90th >= ${sla_down_normal} THEN 1 ELSE 0 END) / COUNT(*), 1) AS value FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 AND failed=0 AND down_90th IS NOT NULL",
|
|
"refId": "A"
|
|
}
|
|
],
|
|
"title": "Down ≥ ${sla_down_normal} Mbit/s",
|
|
"type": "stat"
|
|
},
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"description": "Share of speedtests that reached the contractual 'normally available' upload speed. German TKG rules require this in at least 90% of measurements.",
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"color": { "mode": "thresholds" },
|
|
"decimals": 1,
|
|
"mappings": [],
|
|
"noValue": "NO DATA",
|
|
"thresholds": {
|
|
"mode": "absolute",
|
|
"steps": [
|
|
{ "color": "red", "value": 0 },
|
|
{ "color": "yellow", "value": 80 },
|
|
{ "color": "green", "value": 90 }
|
|
]
|
|
},
|
|
"unit": "percent"
|
|
},
|
|
"overrides": []
|
|
},
|
|
"gridPos": { "h": 5, "w": 4, "x": 4, "y": 47 },
|
|
"id": 61,
|
|
"options": {
|
|
"colorMode": "background",
|
|
"graphMode": "none",
|
|
"justifyMode": "center",
|
|
"orientation": "auto",
|
|
"percentChangeColorMode": "standard",
|
|
"reduceOptions": { "calcs": ["last"], "fields": "", "values": false },
|
|
"showPercentChange": false,
|
|
"textMode": "auto",
|
|
"wideLayout": true
|
|
},
|
|
"pluginVersion": "12.3.3",
|
|
"targets": [
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"queryText": "SELECT ROUND(100.0 * SUM(CASE WHEN up_90th >= ${sla_up_normal} THEN 1 ELSE 0 END) / COUNT(*), 1) AS value FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 AND failed=0 AND up_90th IS NOT NULL",
|
|
"queryType": "table",
|
|
"rawQueryText": "SELECT ROUND(100.0 * SUM(CASE WHEN up_90th >= ${sla_up_normal} THEN 1 ELSE 0 END) / COUNT(*), 1) AS value FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 AND failed=0 AND up_90th IS NOT NULL",
|
|
"refId": "A"
|
|
}
|
|
],
|
|
"title": "Up ≥ ${sla_up_normal} Mbit/s",
|
|
"type": "stat"
|
|
},
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"description": "Share of days where at least one speedtest reached 90% of the contractual maximum download speed. The BNetzA methodology requires this on 2 of 3 measurement days.",
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"color": { "mode": "thresholds" },
|
|
"decimals": 1,
|
|
"mappings": [],
|
|
"noValue": "NO DATA",
|
|
"thresholds": {
|
|
"mode": "absolute",
|
|
"steps": [
|
|
{ "color": "red", "value": 0 },
|
|
{ "color": "yellow", "value": 34 },
|
|
{ "color": "green", "value": 67 }
|
|
]
|
|
},
|
|
"unit": "percent"
|
|
},
|
|
"overrides": []
|
|
},
|
|
"gridPos": { "h": 5, "w": 4, "x": 8, "y": 47 },
|
|
"id": 62,
|
|
"options": {
|
|
"colorMode": "background",
|
|
"graphMode": "none",
|
|
"justifyMode": "center",
|
|
"orientation": "auto",
|
|
"percentChangeColorMode": "standard",
|
|
"reduceOptions": { "calcs": ["last"], "fields": "", "values": false },
|
|
"showPercentChange": false,
|
|
"textMode": "auto",
|
|
"wideLayout": true
|
|
},
|
|
"pluginVersion": "12.3.3",
|
|
"targets": [
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"queryText": "SELECT ROUND(100.0 * SUM(hit) / COUNT(*), 1) AS value FROM (SELECT MAX(CASE WHEN down_90th >= 0.9 * ${sla_down_max} THEN 1 ELSE 0 END) AS hit FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 AND failed=0 AND down_90th IS NOT NULL GROUP BY strftime('%Y-%m-%d', datetime(timestamp,'unixepoch','localtime')))",
|
|
"queryType": "table",
|
|
"rawQueryText": "SELECT ROUND(100.0 * SUM(hit) / COUNT(*), 1) AS value FROM (SELECT MAX(CASE WHEN down_90th >= 0.9 * ${sla_down_max} THEN 1 ELSE 0 END) AS hit FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 AND failed=0 AND down_90th IS NOT NULL GROUP BY strftime('%Y-%m-%d', datetime(timestamp,'unixepoch','localtime')))",
|
|
"refId": "A"
|
|
}
|
|
],
|
|
"title": "Days Hitting 90% of Down Max",
|
|
"type": "stat"
|
|
},
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"description": "Share of days where at least one speedtest reached 90% of the contractual maximum upload speed.",
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"color": { "mode": "thresholds" },
|
|
"decimals": 1,
|
|
"mappings": [],
|
|
"noValue": "NO DATA",
|
|
"thresholds": {
|
|
"mode": "absolute",
|
|
"steps": [
|
|
{ "color": "red", "value": 0 },
|
|
{ "color": "yellow", "value": 34 },
|
|
{ "color": "green", "value": 67 }
|
|
]
|
|
},
|
|
"unit": "percent"
|
|
},
|
|
"overrides": []
|
|
},
|
|
"gridPos": { "h": 5, "w": 4, "x": 12, "y": 47 },
|
|
"id": 63,
|
|
"options": {
|
|
"colorMode": "background",
|
|
"graphMode": "none",
|
|
"justifyMode": "center",
|
|
"orientation": "auto",
|
|
"percentChangeColorMode": "standard",
|
|
"reduceOptions": { "calcs": ["last"], "fields": "", "values": false },
|
|
"showPercentChange": false,
|
|
"textMode": "auto",
|
|
"wideLayout": true
|
|
},
|
|
"pluginVersion": "12.3.3",
|
|
"targets": [
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"queryText": "SELECT ROUND(100.0 * SUM(hit) / COUNT(*), 1) AS value FROM (SELECT MAX(CASE WHEN up_90th >= 0.9 * ${sla_up_max} THEN 1 ELSE 0 END) AS hit FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 AND failed=0 AND up_90th IS NOT NULL GROUP BY strftime('%Y-%m-%d', datetime(timestamp,'unixepoch','localtime')))",
|
|
"queryType": "table",
|
|
"rawQueryText": "SELECT ROUND(100.0 * SUM(hit) / COUNT(*), 1) AS value FROM (SELECT MAX(CASE WHEN up_90th >= 0.9 * ${sla_up_max} THEN 1 ELSE 0 END) AS hit FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 AND failed=0 AND up_90th IS NOT NULL GROUP BY strftime('%Y-%m-%d', datetime(timestamp,'unixepoch','localtime')))",
|
|
"refId": "A"
|
|
}
|
|
],
|
|
"title": "Days Hitting 90% of Up Max",
|
|
"type": "stat"
|
|
},
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"description": "Number of speedtests below the contractual minimum download speed.",
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"color": { "mode": "thresholds" },
|
|
"decimals": 0,
|
|
"mappings": [],
|
|
"noValue": "0",
|
|
"thresholds": {
|
|
"mode": "absolute",
|
|
"steps": [
|
|
{ "color": "green", "value": 0 },
|
|
{ "color": "yellow", "value": 1 },
|
|
{ "color": "red", "value": 3 }
|
|
]
|
|
},
|
|
"unit": "none"
|
|
},
|
|
"overrides": []
|
|
},
|
|
"gridPos": { "h": 5, "w": 4, "x": 16, "y": 47 },
|
|
"id": 64,
|
|
"options": {
|
|
"colorMode": "background",
|
|
"graphMode": "none",
|
|
"justifyMode": "center",
|
|
"orientation": "auto",
|
|
"percentChangeColorMode": "standard",
|
|
"reduceOptions": { "calcs": ["last"], "fields": "", "values": false },
|
|
"showPercentChange": false,
|
|
"textMode": "auto",
|
|
"wideLayout": true
|
|
},
|
|
"pluginVersion": "12.3.3",
|
|
"targets": [
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"queryText": "SELECT COUNT(*) AS value FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 AND failed=0 AND down_90th IS NOT NULL AND down_90th < ${sla_down_min}",
|
|
"queryType": "table",
|
|
"rawQueryText": "SELECT COUNT(*) AS value FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 AND failed=0 AND down_90th IS NOT NULL AND down_90th < ${sla_down_min}",
|
|
"refId": "A"
|
|
}
|
|
],
|
|
"title": "Tests Below Down Min (${sla_down_min})",
|
|
"type": "stat"
|
|
},
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"description": "Number of speedtests below the contractual minimum upload speed.",
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"color": { "mode": "thresholds" },
|
|
"decimals": 0,
|
|
"mappings": [],
|
|
"noValue": "0",
|
|
"thresholds": {
|
|
"mode": "absolute",
|
|
"steps": [
|
|
{ "color": "green", "value": 0 },
|
|
{ "color": "yellow", "value": 1 },
|
|
{ "color": "red", "value": 3 }
|
|
]
|
|
},
|
|
"unit": "none"
|
|
},
|
|
"overrides": []
|
|
},
|
|
"gridPos": { "h": 5, "w": 4, "x": 20, "y": 47 },
|
|
"id": 65,
|
|
"options": {
|
|
"colorMode": "background",
|
|
"graphMode": "none",
|
|
"justifyMode": "center",
|
|
"orientation": "auto",
|
|
"percentChangeColorMode": "standard",
|
|
"reduceOptions": { "calcs": ["last"], "fields": "", "values": false },
|
|
"showPercentChange": false,
|
|
"textMode": "auto",
|
|
"wideLayout": true
|
|
},
|
|
"pluginVersion": "12.3.3",
|
|
"targets": [
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"queryText": "SELECT COUNT(*) AS value FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 AND failed=0 AND up_90th IS NOT NULL AND up_90th < ${sla_up_min}",
|
|
"queryType": "table",
|
|
"rawQueryText": "SELECT COUNT(*) AS value FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 AND failed=0 AND up_90th IS NOT NULL AND up_90th < ${sla_up_min}",
|
|
"refId": "A"
|
|
}
|
|
],
|
|
"title": "Tests Below Up Min (${sla_up_min})",
|
|
"type": "stat"
|
|
},
|
|
{
|
|
"collapsed": false,
|
|
"gridPos": { "h": 1, "w": 24, "x": 0, "y": 52 },
|
|
"id": 104,
|
|
"panels": [],
|
|
"title": "Patterns",
|
|
"type": "row"
|
|
},
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"color": { "mode": "palette-classic" },
|
|
"custom": {
|
|
"axisBorderShow": false,
|
|
"axisCenteredZero": false,
|
|
"axisColorMode": "text",
|
|
"axisLabel": "",
|
|
"axisPlacement": "auto",
|
|
"fillOpacity": 60,
|
|
"gradientMode": "none",
|
|
"hideFrom": { "legend": false, "tooltip": false, "viz": false },
|
|
"lineWidth": 1,
|
|
"scaleDistribution": { "type": "linear" },
|
|
"thresholdsStyle": { "mode": "off" }
|
|
},
|
|
"mappings": [],
|
|
"thresholds": {
|
|
"mode": "absolute",
|
|
"steps": [
|
|
{ "color": "green", "value": 0 },
|
|
{ "color": "red", "value": 80 }
|
|
]
|
|
},
|
|
"unit": "Mbits"
|
|
},
|
|
"overrides": []
|
|
},
|
|
"gridPos": { "h": 9, "w": 12, "x": 0, "y": 53 },
|
|
"id": 40,
|
|
"options": {
|
|
"barRadius": 0,
|
|
"barWidth": 0.7,
|
|
"fullHighlight": false,
|
|
"groupWidth": 0.7,
|
|
"legend": { "calcs": [], "displayMode": "list", "placement": "bottom", "showLegend": true },
|
|
"orientation": "auto",
|
|
"showValue": "auto",
|
|
"stacking": "none",
|
|
"tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" },
|
|
"xField": "Hour",
|
|
"xTickLabelRotation": -45,
|
|
"xTickLabelSpacing": 0
|
|
},
|
|
"pluginVersion": "12.3.3",
|
|
"targets": [
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"queryText": "SELECT strftime('%H:00', datetime(timestamp,'unixepoch','localtime')) AS 'Hour', AVG(down_90th) AS 'Download 90th', AVG(up_90th) AS 'Upload 90th' FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 AND failed=0 AND down_90th IS NOT NULL AND strftime('%w', datetime(timestamp,'unixepoch','localtime')) NOT IN ('0','6') GROUP BY 1 ORDER BY 1",
|
|
"queryType": "table",
|
|
"rawQueryText": "SELECT strftime('%H:00', datetime(timestamp,'unixepoch','localtime')) AS 'Hour', AVG(down_90th) AS 'Download 90th', AVG(up_90th) AS 'Upload 90th' FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 AND failed=0 AND down_90th IS NOT NULL AND strftime('%w', datetime(timestamp,'unixepoch','localtime')) NOT IN ('0','6') GROUP BY 1 ORDER BY 1",
|
|
"refId": "A"
|
|
}
|
|
],
|
|
"title": "Avg Speed by Hour (Weekdays)",
|
|
"type": "barchart"
|
|
},
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"color": { "mode": "palette-classic" },
|
|
"custom": {
|
|
"axisBorderShow": false,
|
|
"axisCenteredZero": false,
|
|
"axisColorMode": "text",
|
|
"axisLabel": "",
|
|
"axisPlacement": "auto",
|
|
"fillOpacity": 60,
|
|
"gradientMode": "none",
|
|
"hideFrom": { "legend": false, "tooltip": false, "viz": false },
|
|
"lineWidth": 1,
|
|
"scaleDistribution": { "type": "linear" },
|
|
"thresholdsStyle": { "mode": "off" }
|
|
},
|
|
"mappings": [],
|
|
"thresholds": {
|
|
"mode": "absolute",
|
|
"steps": [
|
|
{ "color": "green", "value": 0 },
|
|
{ "color": "red", "value": 80 }
|
|
]
|
|
},
|
|
"unit": "Mbits"
|
|
},
|
|
"overrides": []
|
|
},
|
|
"gridPos": { "h": 9, "w": 12, "x": 12, "y": 53 },
|
|
"id": 41,
|
|
"options": {
|
|
"barRadius": 0,
|
|
"barWidth": 0.7,
|
|
"fullHighlight": false,
|
|
"groupWidth": 0.7,
|
|
"legend": { "calcs": [], "displayMode": "list", "placement": "bottom", "showLegend": true },
|
|
"orientation": "auto",
|
|
"showValue": "auto",
|
|
"stacking": "none",
|
|
"tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" },
|
|
"xField": "Hour",
|
|
"xTickLabelRotation": -45,
|
|
"xTickLabelSpacing": 0
|
|
},
|
|
"pluginVersion": "12.3.3",
|
|
"targets": [
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"queryText": "SELECT strftime('%H:00', datetime(timestamp,'unixepoch','localtime')) AS 'Hour', AVG(down_90th) AS 'Download 90th', AVG(up_90th) AS 'Upload 90th' FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 AND failed=0 AND down_90th IS NOT NULL AND strftime('%w', datetime(timestamp,'unixepoch','localtime')) IN ('0','6') GROUP BY 1 ORDER BY 1",
|
|
"queryType": "table",
|
|
"rawQueryText": "SELECT strftime('%H:00', datetime(timestamp,'unixepoch','localtime')) AS 'Hour', AVG(down_90th) AS 'Download 90th', AVG(up_90th) AS 'Upload 90th' FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 AND failed=0 AND down_90th IS NOT NULL AND strftime('%w', datetime(timestamp,'unixepoch','localtime')) IN ('0','6') GROUP BY 1 ORDER BY 1",
|
|
"refId": "A"
|
|
}
|
|
],
|
|
"title": "Avg Speed by Hour (Weekends)",
|
|
"type": "barchart"
|
|
},
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"color": { "mode": "palette-classic" },
|
|
"custom": {
|
|
"axisBorderShow": false,
|
|
"axisCenteredZero": false,
|
|
"axisColorMode": "text",
|
|
"axisLabel": "",
|
|
"axisPlacement": "auto",
|
|
"fillOpacity": 60,
|
|
"gradientMode": "none",
|
|
"hideFrom": { "legend": false, "tooltip": false, "viz": false },
|
|
"lineWidth": 1,
|
|
"scaleDistribution": { "type": "linear" },
|
|
"thresholdsStyle": { "mode": "off" }
|
|
},
|
|
"mappings": [],
|
|
"thresholds": {
|
|
"mode": "absolute",
|
|
"steps": [
|
|
{ "color": "green", "value": 0 },
|
|
{ "color": "red", "value": 80 }
|
|
]
|
|
},
|
|
"unit": "Mbits"
|
|
},
|
|
"overrides": []
|
|
},
|
|
"gridPos": { "h": 8, "w": 24, "x": 0, "y": 62 },
|
|
"id": 42,
|
|
"options": {
|
|
"barRadius": 0,
|
|
"barWidth": 0.7,
|
|
"fullHighlight": false,
|
|
"groupWidth": 0.7,
|
|
"legend": { "calcs": [], "displayMode": "list", "placement": "bottom", "showLegend": true },
|
|
"orientation": "auto",
|
|
"showValue": "auto",
|
|
"stacking": "none",
|
|
"tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" },
|
|
"xField": "Day",
|
|
"xTickLabelRotation": 0,
|
|
"xTickLabelSpacing": 0
|
|
},
|
|
"pluginVersion": "12.3.3",
|
|
"targets": [
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"queryText": "SELECT CASE strftime('%w', datetime(timestamp,'unixepoch','localtime')) WHEN '0' THEN 'Sun' WHEN '1' THEN 'Mon' WHEN '2' THEN 'Tue' WHEN '3' THEN 'Wed' WHEN '4' THEN 'Thu' WHEN '5' THEN 'Fri' WHEN '6' THEN 'Sat' END AS 'Day', AVG(down_90th) AS 'Download 90th', AVG(up_90th) AS 'Upload 90th' FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 AND failed=0 AND down_90th IS NOT NULL GROUP BY 1 ORDER BY CASE strftime('%w', datetime(timestamp,'unixepoch','localtime')) WHEN '1' THEN 1 WHEN '2' THEN 2 WHEN '3' THEN 3 WHEN '4' THEN 4 WHEN '5' THEN 5 WHEN '6' THEN 6 WHEN '0' THEN 7 END",
|
|
"queryType": "table",
|
|
"rawQueryText": "SELECT CASE strftime('%w', datetime(timestamp,'unixepoch','localtime')) WHEN '0' THEN 'Sun' WHEN '1' THEN 'Mon' WHEN '2' THEN 'Tue' WHEN '3' THEN 'Wed' WHEN '4' THEN 'Thu' WHEN '5' THEN 'Fri' WHEN '6' THEN 'Sat' END AS 'Day', AVG(down_90th) AS 'Download 90th', AVG(up_90th) AS 'Upload 90th' FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 AND failed=0 AND down_90th IS NOT NULL GROUP BY 1 ORDER BY CASE strftime('%w', datetime(timestamp,'unixepoch','localtime')) WHEN '1' THEN 1 WHEN '2' THEN 2 WHEN '3' THEN 3 WHEN '4' THEN 4 WHEN '5' THEN 5 WHEN '6' THEN 6 WHEN '0' THEN 7 END",
|
|
"refId": "A"
|
|
}
|
|
],
|
|
"title": "Avg Speed by Day of Week",
|
|
"type": "barchart"
|
|
},
|
|
{
|
|
"collapsed": true,
|
|
"gridPos": { "h": 1, "w": 24, "x": 0, "y": 70 },
|
|
"id": 105,
|
|
"panels": [
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"custom": {
|
|
"align": "auto",
|
|
"cellOptions": { "type": "auto" },
|
|
"footer": { "reducers": [] },
|
|
"inspect": false
|
|
},
|
|
"mappings": [],
|
|
"thresholds": {
|
|
"mode": "absolute",
|
|
"steps": [
|
|
{ "color": "green", "value": 0 },
|
|
{ "color": "red", "value": 80 }
|
|
]
|
|
}
|
|
},
|
|
"overrides": [
|
|
{
|
|
"matcher": { "id": "byName", "options": "Time" },
|
|
"properties": [
|
|
{ "id": "custom.width", "value": 200 }
|
|
]
|
|
},
|
|
{
|
|
"matcher": { "id": "byName", "options": "Download 90th (Mbps)" },
|
|
"properties": [
|
|
{ "id": "unit", "value": "Mbits" },
|
|
{ "id": "decimals", "value": 2 },
|
|
{
|
|
"id": "thresholds",
|
|
"value": {
|
|
"mode": "absolute",
|
|
"steps": [
|
|
{ "color": "red", "value": 0 },
|
|
{ "color": "yellow", "value": 600 },
|
|
{ "color": "green", "value": 700 }
|
|
]
|
|
}
|
|
},
|
|
{ "id": "custom.width", "value": 200 },
|
|
{ "id": "custom.cellOptions", "value": { "mode": "gradient", "type": "color-background" } }
|
|
]
|
|
},
|
|
{
|
|
"matcher": { "id": "byName", "options": "Upload 90th (Mbps)" },
|
|
"properties": [
|
|
{ "id": "unit", "value": "Mbits" },
|
|
{ "id": "decimals", "value": 2 },
|
|
{
|
|
"id": "thresholds",
|
|
"value": {
|
|
"mode": "absolute",
|
|
"steps": [
|
|
{ "color": "red", "value": 0 },
|
|
{ "color": "yellow", "value": 35 },
|
|
{ "color": "green", "value": 50 }
|
|
]
|
|
}
|
|
},
|
|
{ "id": "custom.width", "value": 200 },
|
|
{ "id": "custom.cellOptions", "value": { "mode": "gradient", "type": "color-background" } }
|
|
]
|
|
}
|
|
]
|
|
},
|
|
"gridPos": { "h": 14, "w": 24, "x": 0, "y": 71 },
|
|
"id": 50,
|
|
"options": { "cellHeight": "sm", "showHeader": true },
|
|
"pluginVersion": "12.3.3",
|
|
"targets": [
|
|
{
|
|
"datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" },
|
|
"queryText": "SELECT strftime('%d.%m.%Y %H:%M', datetime(timestamp,'unixepoch','localtime')) AS 'Time', ROUND(down_90th, 2) AS 'Download 90th (Mbps)', ROUND(up_90th, 2) AS 'Upload 90th (Mbps)' FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 ORDER BY timestamp DESC",
|
|
"queryType": "table",
|
|
"rawQueryText": "SELECT strftime('%d.%m.%Y %H:%M', datetime(timestamp,'unixepoch','localtime')) AS 'Time', ROUND(down_90th, 2) AS 'Download 90th (Mbps)', ROUND(up_90th, 2) AS 'Upload 90th (Mbps)' FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 ORDER BY timestamp DESC",
|
|
"refId": "A",
|
|
"timeColumns": []
|
|
}
|
|
],
|
|
"title": "Raw Measurements",
|
|
"type": "table"
|
|
}
|
|
],
|
|
"title": "Raw Data",
|
|
"type": "row"
|
|
}
|
|
],
|
|
"preload": false,
|
|
"refresh": "30s",
|
|
"schemaVersion": 42,
|
|
"tags": [
|
|
"network",
|
|
"speed-test"
|
|
],
|
|
"templating": {
|
|
"list": [
|
|
{
|
|
"current": { "text": "1000", "value": "1000" },
|
|
"description": "Contractual maximum download speed (Mbit/s) from your ISP's Produktinformationsblatt.",
|
|
"hide": 0,
|
|
"label": "Down max (Mbit/s)",
|
|
"name": "sla_down_max",
|
|
"options": [{ "selected": true, "text": "1000", "value": "1000" }],
|
|
"query": "1000",
|
|
"skipUrlSync": false,
|
|
"type": "textbox"
|
|
},
|
|
{
|
|
"current": { "text": "850", "value": "850" },
|
|
"description": "Contractual 'normally available' download speed (Mbit/s).",
|
|
"hide": 0,
|
|
"label": "Down normal (Mbit/s)",
|
|
"name": "sla_down_normal",
|
|
"options": [{ "selected": true, "text": "850", "value": "850" }],
|
|
"query": "850",
|
|
"skipUrlSync": false,
|
|
"type": "textbox"
|
|
},
|
|
{
|
|
"current": { "text": "600", "value": "600" },
|
|
"description": "Contractual minimum download speed (Mbit/s).",
|
|
"hide": 0,
|
|
"label": "Down min (Mbit/s)",
|
|
"name": "sla_down_min",
|
|
"options": [{ "selected": true, "text": "600", "value": "600" }],
|
|
"query": "600",
|
|
"skipUrlSync": false,
|
|
"type": "textbox"
|
|
},
|
|
{
|
|
"current": { "text": "50", "value": "50" },
|
|
"description": "Contractual maximum upload speed (Mbit/s).",
|
|
"hide": 0,
|
|
"label": "Up max (Mbit/s)",
|
|
"name": "sla_up_max",
|
|
"options": [{ "selected": true, "text": "50", "value": "50" }],
|
|
"query": "50",
|
|
"skipUrlSync": false,
|
|
"type": "textbox"
|
|
},
|
|
{
|
|
"current": { "text": "35", "value": "35" },
|
|
"description": "Contractual 'normally available' upload speed (Mbit/s).",
|
|
"hide": 0,
|
|
"label": "Up normal (Mbit/s)",
|
|
"name": "sla_up_normal",
|
|
"options": [{ "selected": true, "text": "35", "value": "35" }],
|
|
"query": "35",
|
|
"skipUrlSync": false,
|
|
"type": "textbox"
|
|
},
|
|
{
|
|
"current": { "text": "15", "value": "15" },
|
|
"description": "Contractual minimum upload speed (Mbit/s).",
|
|
"hide": 0,
|
|
"label": "Up min (Mbit/s)",
|
|
"name": "sla_up_min",
|
|
"options": [{ "selected": true, "text": "15", "value": "15" }],
|
|
"query": "15",
|
|
"skipUrlSync": false,
|
|
"type": "textbox"
|
|
}
|
|
]
|
|
},
|
|
"time": {
|
|
"from": "now-24h",
|
|
"to": "now"
|
|
},
|
|
"timepicker": {},
|
|
"timezone": "browser",
|
|
"title": "Network Status",
|
|
"uid": "speed-tests-v2",
|
|
"version": 4
|
|
}
|