{ "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": "Summary", "type": "row" }, { "datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" }, "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "decimals": 1, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "red", "value": 0 }, { "color": "yellow", "value": 80 }, { "color": "green", "value": 95 } ] }, "unit": "percent" }, "overrides": [] }, "gridPos": { "h": 4, "w": 4, "x": 0, "y": 1 }, "id": 1, "options": { "colorMode": "background", "graphMode": "none", "justifyMode": "center", "orientation": "auto", "percentChangeColorMode": "standard", "reduceOptions": { "calcs": [ "lastNotNull" ], "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": "Uptime", "type": "stat" }, { "datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" }, "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "decimals": 1, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "red", "value": 0 }, { "color": "yellow", "value": 50 }, { "color": "green", "value": 100 } ] }, "unit": "Mbits" }, "overrides": [] }, "gridPos": { "h": 4, "w": 4, "x": 4, "y": 1 }, "id": 2, "options": { "colorMode": "background", "graphMode": "none", "justifyMode": "center", "orientation": "auto", "percentChangeColorMode": "standard", "reduceOptions": { "calcs": [ "lastNotNull" ], "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(down_90th), 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(AVG(down_90th), 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": "Avg Download (90th pct)", "type": "stat" }, { "datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" }, "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "decimals": 1, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "red", "value": 0 }, { "color": "yellow", "value": 20 }, { "color": "green", "value": 50 } ] }, "unit": "Mbits" }, "overrides": [] }, "gridPos": { "h": 4, "w": 4, "x": 8, "y": 1 }, "id": 3, "options": { "colorMode": "background", "graphMode": "none", "justifyMode": "center", "orientation": "auto", "percentChangeColorMode": "standard", "reduceOptions": { "calcs": [ "lastNotNull" ], "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(up_90th), 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(AVG(up_90th), 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": "Avg Upload (90th pct)", "type": "stat" }, { "datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" }, "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "decimals": 1, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": 0 }, { "color": "yellow", "value": 30 }, { "color": "red", "value": 80 } ] }, "unit": "ms" }, "overrides": [] }, "gridPos": { "h": 4, "w": 4, "x": 12, "y": 1 }, "id": 4, "options": { "colorMode": "background", "graphMode": "none", "justifyMode": "center", "orientation": "auto", "percentChangeColorMode": "standard", "reduceOptions": { "calcs": [ "lastNotNull" ], "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), 1) AS value FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 AND failed=0 AND latency IS NOT NULL", "queryType": "table", "rawQueryText": "SELECT ROUND(AVG(latency), 1) AS value FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 AND failed=0 AND latency IS NOT NULL", "refId": "A" } ], "title": "Avg Latency", "type": "stat" }, { "datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" }, "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "decimals": 1, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": 0 }, { "color": "yellow", "value": 10 }, { "color": "red", "value": 30 } ] }, "unit": "ms" }, "overrides": [] }, "gridPos": { "h": 4, "w": 4, "x": 16, "y": 1 }, "id": 5, "options": { "colorMode": "background", "graphMode": "none", "justifyMode": "center", "orientation": "auto", "percentChangeColorMode": "standard", "reduceOptions": { "calcs": [ "lastNotNull" ], "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(jitter), 1) AS value FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 AND failed=0 AND jitter IS NOT NULL", "queryType": "table", "rawQueryText": "SELECT ROUND(AVG(jitter), 1) AS value FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 AND failed=0 AND jitter IS NOT NULL", "refId": "A" } ], "title": "Avg Jitter", "type": "stat" }, { "datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" }, "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "decimals": 1, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": 0 }, { "color": "yellow", "value": 3 }, { "color": "red", "value": 10 } ] }, "unit": "none" }, "overrides": [] }, "gridPos": { "h": 4, "w": 4, "x": 20, "y": 1 }, "id": 6, "options": { "colorMode": "background", "graphMode": "none", "justifyMode": "center", "orientation": "auto", "percentChangeColorMode": "standard", "reduceOptions": { "calcs": [ "lastNotNull" ], "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 Tests", "type": "stat" }, { "collapsed": false, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 5 }, "id": 101, "panels": [], "title": "Speed Over Time", "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 90th" }, "properties": [ { "id": "color", "value": { "fixedColor": "#3274D9", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Upload 90th" }, "properties": [ { "id": "color", "value": { "fixedColor": "#56A64B", "mode": "fixed" } } ] } ] }, "gridPos": { "h": 10, "w": 24, "x": 0, "y": 6 }, "id": 10, "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, down_90th AS 'Download 90th', up_90th AS 'Upload 90th' 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 90th', up_90th AS 'Upload 90th' 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": 16 }, "id": 11, "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": "Latency & Jitter Over Time", "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": "Mbits" }, "overrides": [] }, "gridPos": { "h": 8, "w": 12, "x": 12, "y": 16 }, "id": 12, "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, down_100kB AS '100kB', down_1MB AS '1MB', down_10MB AS '10MB', down_25MB AS '25MB', down_90th AS '90th pct' 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_100kB AS '100kB', down_1MB AS '1MB', down_10MB AS '10MB', down_25MB AS '25MB', down_90th AS '90th pct' FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 AND failed=0 ORDER BY timestamp", "refId": "A", "timeColumns": [ "time" ] } ], "title": "Download Speed Breakdown", "type": "timeseries" }, { "collapsed": false, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 24 }, "id": 102, "panels": [], "title": "Time-of-Day & Weekday 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": 10, "w": 12, "x": 0, "y": 25 }, "id": 20, "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 1767177837097/1000 AND 1769083876509/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", "timeColumns": [ "time", "ts" ] } ], "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": 10, "w": 12, "x": 12, "y": 25 }, "id": 21, "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 1767177837097/1000 AND 1769083876509/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", "timeColumns": [ "time", "ts" ] } ], "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": 9, "w": 12, "x": 0, "y": 35 }, "id": 22, "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" }, { "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": 35 }, "id": 23, "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": "Block", "xTickLabelRotation": 0, "xTickLabelSpacing": 0 }, "pluginVersion": "12.3.3", "targets": [ { "datasource": { "type": "frser-sqlite-datasource", "uid": "speed-tests-sqlite" }, "queryText": "SELECT CASE WHEN CAST(strftime('%H', datetime(timestamp,'unixepoch','localtime')) AS INTEGER) BETWEEN 0 AND 5 THEN 'Midnight-6am' WHEN CAST(strftime('%H', datetime(timestamp,'unixepoch','localtime')) AS INTEGER) BETWEEN 6 AND 8 THEN 'Early Morning' WHEN CAST(strftime('%H', datetime(timestamp,'unixepoch','localtime')) AS INTEGER) BETWEEN 9 AND 11 THEN 'Morning' WHEN CAST(strftime('%H', datetime(timestamp,'unixepoch','localtime')) AS INTEGER) BETWEEN 12 AND 13 THEN 'Lunch' WHEN CAST(strftime('%H', datetime(timestamp,'unixepoch','localtime')) AS INTEGER) BETWEEN 14 AND 17 THEN 'Afternoon' WHEN CAST(strftime('%H', datetime(timestamp,'unixepoch','localtime')) AS INTEGER) BETWEEN 18 AND 21 THEN 'Evening' ELSE 'Late Night' END AS 'Block', 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 CASE WHEN CAST(strftime('%H', datetime(timestamp,'unixepoch','localtime')) AS INTEGER) BETWEEN 0 AND 5 THEN 1 WHEN CAST(strftime('%H', datetime(timestamp,'unixepoch','localtime')) AS INTEGER) BETWEEN 6 AND 8 THEN 2 WHEN CAST(strftime('%H', datetime(timestamp,'unixepoch','localtime')) AS INTEGER) BETWEEN 9 AND 11 THEN 3 WHEN CAST(strftime('%H', datetime(timestamp,'unixepoch','localtime')) AS INTEGER) BETWEEN 12 AND 13 THEN 4 WHEN CAST(strftime('%H', datetime(timestamp,'unixepoch','localtime')) AS INTEGER) BETWEEN 14 AND 17 THEN 5 WHEN CAST(strftime('%H', datetime(timestamp,'unixepoch','localtime')) AS INTEGER) BETWEEN 18 AND 21 THEN 6 ELSE 7 END", "queryType": "table", "rawQueryText": "SELECT CASE WHEN CAST(strftime('%H', datetime(timestamp,'unixepoch','localtime')) AS INTEGER) BETWEEN 0 AND 5 THEN 'Midnight-6am' WHEN CAST(strftime('%H', datetime(timestamp,'unixepoch','localtime')) AS INTEGER) BETWEEN 6 AND 8 THEN 'Early Morning' WHEN CAST(strftime('%H', datetime(timestamp,'unixepoch','localtime')) AS INTEGER) BETWEEN 9 AND 11 THEN 'Morning' WHEN CAST(strftime('%H', datetime(timestamp,'unixepoch','localtime')) AS INTEGER) BETWEEN 12 AND 13 THEN 'Lunch' WHEN CAST(strftime('%H', datetime(timestamp,'unixepoch','localtime')) AS INTEGER) BETWEEN 14 AND 17 THEN 'Afternoon' WHEN CAST(strftime('%H', datetime(timestamp,'unixepoch','localtime')) AS INTEGER) BETWEEN 18 AND 21 THEN 'Evening' ELSE 'Late Night' END AS 'Block', 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 CASE WHEN CAST(strftime('%H', datetime(timestamp,'unixepoch','localtime')) AS INTEGER) BETWEEN 0 AND 5 THEN 1 WHEN CAST(strftime('%H', datetime(timestamp,'unixepoch','localtime')) AS INTEGER) BETWEEN 6 AND 8 THEN 2 WHEN CAST(strftime('%H', datetime(timestamp,'unixepoch','localtime')) AS INTEGER) BETWEEN 9 AND 11 THEN 3 WHEN CAST(strftime('%H', datetime(timestamp,'unixepoch','localtime')) AS INTEGER) BETWEEN 12 AND 13 THEN 4 WHEN CAST(strftime('%H', datetime(timestamp,'unixepoch','localtime')) AS INTEGER) BETWEEN 14 AND 17 THEN 5 WHEN CAST(strftime('%H', datetime(timestamp,'unixepoch','localtime')) AS INTEGER) BETWEEN 18 AND 21 THEN 6 ELSE 7 END", "refId": "A" } ], "title": "Avg Speed by Time Block (Weekdays)", "type": "barchart" }, { "collapsed": false, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 44 }, "id": 103, "panels": [], "title": "Uptime & Failures", "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": "none" }, "overrides": [ { "matcher": { "id": "byName", "options": "Failed" }, "properties": [ { "id": "color", "value": { "fixedColor": "#E02F44", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Successful" }, "properties": [ { "id": "color", "value": { "fixedColor": "#56A64B", "mode": "fixed" } } ] } ] }, "gridPos": { "h": 8, "w": 14, "x": 0, "y": 45 }, "id": 30, "options": { "barRadius": 0, "barWidth": 0.85, "fullHighlight": false, "groupWidth": 0.7, "legend": { "calcs": [], "displayMode": "list", "placement": "bottom", "showLegend": true }, "orientation": "auto", "showValue": "auto", "stacking": "normal", "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 strftime('%d.%m.', datetime(timestamp,'unixepoch','localtime')) AS 'Day', SUM(CASE WHEN failed=0 THEN 1 ELSE 0 END) AS 'Successful', SUM(CASE WHEN failed=1 THEN 1 ELSE 0 END) AS 'Failed' FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 GROUP BY strftime('%Y-%m-%d', datetime(timestamp,'unixepoch','localtime')) ORDER BY strftime('%Y-%m-%d', datetime(timestamp,'unixepoch','localtime'))", "queryType": "table", "rawQueryText": "SELECT strftime('%d.%m.', datetime(timestamp,'unixepoch','localtime')) AS 'Day', SUM(CASE WHEN failed=0 THEN 1 ELSE 0 END) AS 'Successful', SUM(CASE WHEN failed=1 THEN 1 ELSE 0 END) AS 'Failed' FROM speed_tests WHERE timestamp BETWEEN $__from/1000 AND $__to/1000 GROUP BY strftime('%Y-%m-%d', datetime(timestamp,'unixepoch','localtime')) ORDER BY strftime('%Y-%m-%d', datetime(timestamp,'unixepoch','localtime'))", "refId": "A" } ], "title": "Test Results per Day", "type": "barchart" }, { "collapsed": false, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 53 }, "id": 104, "panels": [], "title": "Raw Data", "type": "row" }, { "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": 54 }, "id": 40, "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 1761951600000/1000 AND 1771887599000/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": [ "time", "ts" ] } ], "title": "Raw Measurements", "type": "table" } ], "preload": false, "refresh": "5m", "schemaVersion": 42, "tags": [ "network", "speed-test" ], "templating": { "list": [] }, "time": { "from": "now-7d", "to": "now" }, "timepicker": {}, "timezone": "browser", "title": "Internet Speed Tests", "uid": "speed-tests-v2", "version": 2 }