├── README.md └── speedtest-tracker-v2.json /README.md: -------------------------------------------------------------------------------- 1 | ## Speedtest-Tracker-v2-InfluxDBv2 2 | 3 | A dashboard to display data exported by Speedtest Tracker v2 . Avalible Now at Grafana Dashboard 17808 4 | (https://grafana.com/grafana/dashboards/17808-speedtest-tracker-v2-influxdbv2/) 5 | 6 | This dashboard shows data collected by Speedtest Tracker v2 https://github.com/alexjustesen/speedtest-tracker and exported in an InfluxDBv2 database in the bucket. 7 | 8 | Dashboard based on my previous dashboard Speedtest Tracker - InfluxDBv2 with guide for OLD Speedtest Tracker app. https://grafana.com/grafana/dashboards/16428-speedtest-tracker/ 9 | 10 | Same steps here as before for exporting data but without needs for influxDBv1. Check [Here](#steps) 11 | 12 | ### Info 13 | ![Screenshot 2024-08-14 202917](https://github.com/user-attachments/assets/aab1ed25-2e70-4486-b540-4da6306418b6) 14 | ![Screenshot 2024-08-14 202935](https://github.com/user-attachments/assets/37685a7d-9d58-4987-a4dd-2ebeabaebc49) 15 | 16 | ### Updates 17 | 18 | - **8.12.24** 19 | - Fixed time in Latest result panel. 20 | 21 | - **7.12.24** 22 | - Compatibility Update for Speedtest Tracker v0.25: some fields have been moved to tags + some fixes. 23 | 24 | - **14.8.24** 25 | - More Panels added + some fixes. 26 | 27 | - **20.4.24** 28 | - Panels fixed + Avg Speed fixed. 29 | 30 | - **6.4.24** 31 | - Added Multi bucket support. 32 | 33 | ### Multi buckets 34 | 35 | You can change bucket name and add multiple buckets by: 36 | 37 | - **Go to Dashboard Setting - Variables - Click on bucket - Custom options - Add new buckets** 38 | 39 | 40 | ![Screenshot 2024-04-06 204806](https://github.com/masterwishx/Speedtest-Tracker-v2-InfluxDBv2/assets/28630321/808c1b36-71dc-4669-8014-6aac6ebfd85b) 41 | 42 | ### Steps 43 | 44 | ``` 45 | 1. Create bucket in InfluxDBv2: speedtest-tracker 46 | 47 | 2.1 Create or use existing API token (ALL ACCESS) for Grafana and auth. 48 | 49 | 2.2 Create API token (read/write) for this bucket to use with speedtest-tracker or use existing. 50 | 51 | 3. Configure Speedtest Tracker application with relevant InfluxDBv2 configuration: URL, org, bucket, token, etc..., and 'Test connection' 52 | 53 | 4. Check in InfluxDBv2 in Data Explorer that test data exists in bucket 54 | 55 | 5. Configure Grafana to use with data from InfluxDBv2 ( Select Datasource = InfluxDB , Query Language = Flux , Organization = yourorg , Bucket = speedtest-tracker , Token = yourtoken for bucket ) 56 | 57 | 6. Import this dashboard to Grafana (Dashboard > New > Import) using link in README.md 58 | 59 | 7. Return to Speedtest Tracker application and Export data to InfluxDB (Settings > Data Integration > Export current results) 60 | 61 | 7. Enjoy 62 | ``` 63 | 64 | ![image](https://github.com/user-attachments/assets/25aeb76a-5acf-4135-8073-a61f6bcb8cc3) 65 | ![influxsetup](https://user-images.githubusercontent.com/28630321/187088939-492e8910-395b-4aef-b1f8-199ea98a2dc8.jpg) -------------------------------------------------------------------------------- /speedtest-tracker-v2.json: -------------------------------------------------------------------------------- 1 | { 2 | "__inputs": [ 3 | { 4 | "name": "DS_INFLUXDBV2", 5 | "label": "InfluxDBv2", 6 | "description": "", 7 | "type": "datasource", 8 | "pluginId": "influxdb", 9 | "pluginName": "InfluxDB" 10 | } 11 | ], 12 | "__elements": {}, 13 | "__requires": [ 14 | { 15 | "type": "grafana", 16 | "id": "grafana", 17 | "name": "Grafana", 18 | "version": "11.4.0" 19 | }, 20 | { 21 | "type": "datasource", 22 | "id": "influxdb", 23 | "name": "InfluxDB", 24 | "version": "1.0.0" 25 | }, 26 | { 27 | "type": "panel", 28 | "id": "stat", 29 | "name": "Stat", 30 | "version": "" 31 | }, 32 | { 33 | "type": "panel", 34 | "id": "table", 35 | "name": "Table", 36 | "version": "" 37 | }, 38 | { 39 | "type": "panel", 40 | "id": "timeseries", 41 | "name": "Time series", 42 | "version": "" 43 | } 44 | ], 45 | "annotations": { 46 | "list": [ 47 | { 48 | "builtIn": 1, 49 | "datasource": { 50 | "type": "datasource", 51 | "uid": "grafana" 52 | }, 53 | "enable": true, 54 | "hide": false, 55 | "iconColor": "rgba(0, 211, 255, 1)", 56 | "name": "Annotations & Alerts", 57 | "target": { 58 | "limit": 100, 59 | "matchAny": false, 60 | "tags": [], 61 | "type": "dashboard" 62 | }, 63 | "type": "dashboard" 64 | } 65 | ] 66 | }, 67 | "description": "A dashboard to display data exported by Speedtest Tracker", 68 | "editable": true, 69 | "fiscalYearStartMonth": 0, 70 | "graphTooltip": 0, 71 | "id": null, 72 | "links": [ 73 | { 74 | "asDropdown": false, 75 | "icon": "external link", 76 | "includeVars": false, 77 | "keepTime": false, 78 | "tags": [], 79 | "targetBlank": true, 80 | "title": "Speedtest Tracker v2 App", 81 | "tooltip": "Speedtest Tracker", 82 | "type": "link", 83 | "url": "https://192.168.0.0:8443" 84 | }, 85 | { 86 | "asDropdown": false, 87 | "icon": "external link", 88 | "includeVars": false, 89 | "keepTime": false, 90 | "tags": [], 91 | "targetBlank": true, 92 | "title": "Speedtest Tracker v2 GitHub", 93 | "tooltip": "Speedtest Tracker Repo", 94 | "type": "link", 95 | "url": "https://github.com/alexjustesen/speedtest-tracker" 96 | }, 97 | { 98 | "asDropdown": false, 99 | "icon": "external link", 100 | "includeVars": false, 101 | "keepTime": false, 102 | "tags": [], 103 | "targetBlank": true, 104 | "title": "GitHub", 105 | "tooltip": "", 106 | "type": "link", 107 | "url": "https://github.com/masterwishx/Speedtest-Tracker-v2-InfluxDBv2" 108 | }, 109 | { 110 | "asDropdown": false, 111 | "icon": "external link", 112 | "includeVars": false, 113 | "keepTime": false, 114 | "tags": [], 115 | "targetBlank": true, 116 | "title": "Grafana", 117 | "tooltip": "", 118 | "type": "link", 119 | "url": "https://grafana.com/grafana/dashboards/17808-speedtest-tracker-v2-influxdbv2/" 120 | }, 121 | { 122 | "asDropdown": false, 123 | "icon": "doc", 124 | "includeVars": false, 125 | "keepTime": false, 126 | "tags": [], 127 | "targetBlank": true, 128 | "title": "Ookla guide", 129 | "tooltip": "ookla Performance metrics", 130 | "type": "link", 131 | "url": "https://www.ookla.com/resources/guides/speedtest-methodology#performance-metrics" 132 | } 133 | ], 134 | "panels": [ 135 | { 136 | "collapsed": false, 137 | "gridPos": { 138 | "h": 1, 139 | "w": 24, 140 | "x": 0, 141 | "y": 0 142 | }, 143 | "id": 115, 144 | "panels": [], 145 | "title": "Quick Speed Info", 146 | "type": "row" 147 | }, 148 | { 149 | "datasource": { 150 | "type": "influxdb", 151 | "uid": "${DS_INFLUXDBV2}" 152 | }, 153 | "description": "Download speed - measures how quickly you can pull data from a server on the internet to your device.", 154 | "fieldConfig": { 155 | "defaults": { 156 | "decimals": 1, 157 | "fieldMinMax": true, 158 | "mappings": [], 159 | "min": 0, 160 | "thresholds": { 161 | "mode": "percentage", 162 | "steps": [ 163 | { 164 | "color": "dark-red", 165 | "value": null 166 | }, 167 | { 168 | "color": "dark-yellow", 169 | "value": 60 170 | }, 171 | { 172 | "color": "dark-green", 173 | "value": 70 174 | } 175 | ] 176 | }, 177 | "unit": "bps" 178 | }, 179 | "overrides": [] 180 | }, 181 | "gridPos": { 182 | "h": 4, 183 | "w": 6, 184 | "x": 0, 185 | "y": 1 186 | }, 187 | "id": 116, 188 | "options": { 189 | "colorMode": "value", 190 | "graphMode": "area", 191 | "justifyMode": "auto", 192 | "orientation": "auto", 193 | "percentChangeColorMode": "standard", 194 | "reduceOptions": { 195 | "calcs": [ 196 | "last" 197 | ], 198 | "fields": "/^Download Speed$/", 199 | "values": false 200 | }, 201 | "showPercentChange": true, 202 | "text": {}, 203 | "textMode": "auto", 204 | "wideLayout": true 205 | }, 206 | "pluginVersion": "11.4.0", 207 | "targets": [ 208 | { 209 | "datasource": { 210 | "type": "influxdb", 211 | "uid": "${DS_INFLUXDBV2}" 212 | }, 213 | "groupBy": [ 214 | { 215 | "params": [ 216 | "$__interval" 217 | ], 218 | "type": "time" 219 | }, 220 | { 221 | "params": [ 222 | "linear" 223 | ], 224 | "type": "fill" 225 | } 226 | ], 227 | "hide": false, 228 | "measurement": "speedtest", 229 | "orderByTime": "ASC", 230 | "policy": "default", 231 | "query": "from(bucket: \"${bucket}\")\r\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\r\n |> filter(fn: (r) => r[\"_measurement\"] == \"speedtest\")\r\n |> filter(fn: (r) => r[\"_field\"] == \"download_bits\")\r\n |> drop(columns: [\"server_host\",\"server_name\",\"server_id\"])\r\n |> aggregateWindow(every: v.windowPeriod, fn: last, createEmpty: false)\r\n |> yield(name: \"last\")", 232 | "refId": "A", 233 | "resultFormat": "time_series", 234 | "select": [ 235 | [ 236 | { 237 | "params": [ 238 | "download" 239 | ], 240 | "type": "field" 241 | }, 242 | { 243 | "params": [], 244 | "type": "last" 245 | } 246 | ] 247 | ], 248 | "tags": [] 249 | } 250 | ], 251 | "timeFrom": "1d", 252 | "title": "Download Speed", 253 | "transformations": [ 254 | { 255 | "id": "merge", 256 | "options": {} 257 | }, 258 | { 259 | "id": "organize", 260 | "options": { 261 | "excludeByName": {}, 262 | "indexByName": {}, 263 | "renameByName": { 264 | "download_bits": "Download Speed" 265 | } 266 | } 267 | } 268 | ], 269 | "type": "stat" 270 | }, 271 | { 272 | "datasource": { 273 | "type": "influxdb", 274 | "uid": "${DS_INFLUXDBV2}" 275 | }, 276 | "description": "Upload speed - measures how quickly you send data from your device to the internet.", 277 | "fieldConfig": { 278 | "defaults": { 279 | "decimals": 1, 280 | "fieldMinMax": true, 281 | "mappings": [], 282 | "min": 0, 283 | "thresholds": { 284 | "mode": "percentage", 285 | "steps": [ 286 | { 287 | "color": "dark-red", 288 | "value": null 289 | }, 290 | { 291 | "color": "dark-yellow", 292 | "value": 70 293 | }, 294 | { 295 | "color": "dark-green", 296 | "value": 90 297 | } 298 | ] 299 | }, 300 | "unit": "bps" 301 | }, 302 | "overrides": [] 303 | }, 304 | "gridPos": { 305 | "h": 4, 306 | "w": 6, 307 | "x": 6, 308 | "y": 1 309 | }, 310 | "id": 117, 311 | "options": { 312 | "colorMode": "value", 313 | "graphMode": "area", 314 | "justifyMode": "auto", 315 | "orientation": "auto", 316 | "percentChangeColorMode": "standard", 317 | "reduceOptions": { 318 | "calcs": [ 319 | "last" 320 | ], 321 | "fields": "/^Upload Speed$/", 322 | "values": false 323 | }, 324 | "showPercentChange": true, 325 | "text": {}, 326 | "textMode": "auto", 327 | "wideLayout": true 328 | }, 329 | "pluginVersion": "11.4.0", 330 | "targets": [ 331 | { 332 | "datasource": { 333 | "type": "influxdb", 334 | "uid": "${DS_INFLUXDBV2}" 335 | }, 336 | "groupBy": [ 337 | { 338 | "params": [ 339 | "$__interval" 340 | ], 341 | "type": "time" 342 | }, 343 | { 344 | "params": [ 345 | "linear" 346 | ], 347 | "type": "fill" 348 | } 349 | ], 350 | "measurement": "speedtest", 351 | "orderByTime": "ASC", 352 | "policy": "default", 353 | "query": "from(bucket: \"${bucket}\")\r\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\r\n |> filter(fn: (r) => r[\"_measurement\"] == \"speedtest\")\r\n |> filter(fn: (r) => r[\"_field\"] == \"upload_bits\")\r\n |> drop(columns: [\"server_host\",\"server_name\",\"server_id\"])\r\n |> aggregateWindow(every: v.windowPeriod, fn: last, createEmpty: false)\r\n |> yield(name: \"last\")", 354 | "refId": "A", 355 | "resultFormat": "time_series", 356 | "select": [ 357 | [ 358 | { 359 | "params": [ 360 | "upload" 361 | ], 362 | "type": "field" 363 | }, 364 | { 365 | "params": [], 366 | "type": "last" 367 | } 368 | ] 369 | ], 370 | "tags": [] 371 | } 372 | ], 373 | "timeFrom": "1d", 374 | "title": "Upload Speed", 375 | "transformations": [ 376 | { 377 | "id": "merge", 378 | "options": {} 379 | }, 380 | { 381 | "id": "organize", 382 | "options": { 383 | "excludeByName": {}, 384 | "indexByName": {}, 385 | "renameByName": { 386 | "upload_bits": "Upload Speed" 387 | } 388 | } 389 | } 390 | ], 391 | "type": "stat" 392 | }, 393 | { 394 | "datasource": { 395 | "type": "influxdb", 396 | "uid": "${DS_INFLUXDBV2}" 397 | }, 398 | "description": "Also called latency, ping is the reaction time of your connection - that is, how quickly your device gets a response after you've sent out a request.", 399 | "fieldConfig": { 400 | "defaults": { 401 | "decimals": 1, 402 | "fieldMinMax": true, 403 | "mappings": [], 404 | "min": 0, 405 | "thresholds": { 406 | "mode": "percentage", 407 | "steps": [ 408 | { 409 | "color": "dark-green", 410 | "value": null 411 | }, 412 | { 413 | "color": "dark-yellow", 414 | "value": 50 415 | }, 416 | { 417 | "color": "dark-red", 418 | "value": 100 419 | } 420 | ] 421 | }, 422 | "unit": "ms" 423 | }, 424 | "overrides": [] 425 | }, 426 | "gridPos": { 427 | "h": 4, 428 | "w": 4, 429 | "x": 12, 430 | "y": 1 431 | }, 432 | "id": 118, 433 | "options": { 434 | "colorMode": "value", 435 | "graphMode": "area", 436 | "justifyMode": "auto", 437 | "orientation": "auto", 438 | "percentChangeColorMode": "standard", 439 | "reduceOptions": { 440 | "calcs": [ 441 | "last" 442 | ], 443 | "fields": "/^Ping$/", 444 | "values": false 445 | }, 446 | "showPercentChange": true, 447 | "textMode": "auto", 448 | "wideLayout": true 449 | }, 450 | "pluginVersion": "11.4.0", 451 | "targets": [ 452 | { 453 | "datasource": { 454 | "type": "influxdb", 455 | "uid": "${DS_INFLUXDBV2}" 456 | }, 457 | "groupBy": [ 458 | { 459 | "params": [ 460 | "$__interval" 461 | ], 462 | "type": "time" 463 | }, 464 | { 465 | "params": [ 466 | "linear" 467 | ], 468 | "type": "fill" 469 | } 470 | ], 471 | "measurement": "speedtest", 472 | "orderByTime": "ASC", 473 | "policy": "default", 474 | "query": "from(bucket: \"${bucket}\")\r\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\r\n |> filter(fn: (r) => r[\"_measurement\"] == \"speedtest\")\r\n |> filter(fn: (r) => r[\"_field\"] == \"ping\")\r\n |> drop(columns: [\"server_host\",\"server_name\",\"server_id\"])\r\n |> aggregateWindow(every: v.windowPeriod, fn: last, createEmpty: false)\r\n |> yield(name: \"last\")", 475 | "refId": "A", 476 | "resultFormat": "time_series", 477 | "select": [ 478 | [ 479 | { 480 | "params": [ 481 | "ping" 482 | ], 483 | "type": "field" 484 | }, 485 | { 486 | "params": [], 487 | "type": "last" 488 | } 489 | ] 490 | ], 491 | "tags": [] 492 | } 493 | ], 494 | "timeFrom": "1d", 495 | "title": "Response Time", 496 | "transformations": [ 497 | { 498 | "id": "merge", 499 | "options": {} 500 | }, 501 | { 502 | "id": "organize", 503 | "options": { 504 | "excludeByName": {}, 505 | "indexByName": {}, 506 | "renameByName": { 507 | "ping": "Ping" 508 | } 509 | } 510 | } 511 | ], 512 | "type": "stat" 513 | }, 514 | { 515 | "datasource": { 516 | "type": "influxdb", 517 | "uid": "${DS_INFLUXDBV2}" 518 | }, 519 | "description": "Also called Packet Delay Variation (PDV), jitter is a measure of the variability in ping over time.\nThis metric shows the average difference between consecutive latency measurements.", 520 | "fieldConfig": { 521 | "defaults": { 522 | "decimals": 1, 523 | "fieldMinMax": true, 524 | "mappings": [], 525 | "min": 0, 526 | "thresholds": { 527 | "mode": "percentage", 528 | "steps": [ 529 | { 530 | "color": "dark-green", 531 | "value": null 532 | }, 533 | { 534 | "color": "dark-yellow", 535 | "value": 50 536 | }, 537 | { 538 | "color": "dark-red", 539 | "value": 100 540 | } 541 | ] 542 | }, 543 | "unit": "ms" 544 | }, 545 | "overrides": [] 546 | }, 547 | "gridPos": { 548 | "h": 4, 549 | "w": 4, 550 | "x": 16, 551 | "y": 1 552 | }, 553 | "id": 124, 554 | "options": { 555 | "colorMode": "value", 556 | "graphMode": "area", 557 | "justifyMode": "auto", 558 | "orientation": "auto", 559 | "percentChangeColorMode": "standard", 560 | "reduceOptions": { 561 | "calcs": [ 562 | "last" 563 | ], 564 | "fields": "/^Ping Jitter$/", 565 | "values": false 566 | }, 567 | "showPercentChange": true, 568 | "textMode": "auto", 569 | "wideLayout": true 570 | }, 571 | "pluginVersion": "11.4.0", 572 | "targets": [ 573 | { 574 | "datasource": { 575 | "type": "influxdb", 576 | "uid": "${DS_INFLUXDBV2}" 577 | }, 578 | "groupBy": [ 579 | { 580 | "params": [ 581 | "$__interval" 582 | ], 583 | "type": "time" 584 | }, 585 | { 586 | "params": [ 587 | "linear" 588 | ], 589 | "type": "fill" 590 | } 591 | ], 592 | "measurement": "speedtest", 593 | "orderByTime": "ASC", 594 | "policy": "default", 595 | "query": "from(bucket: \"${bucket}\")\r\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\r\n |> filter(fn: (r) => r[\"_measurement\"] == \"speedtest\")\r\n |> filter(fn: (r) => r[\"_field\"] == \"ping_jitter\")\r\n |> drop(columns: [\"server_host\",\"server_name\",\"server_id\"])\r\n |> aggregateWindow(every: v.windowPeriod, fn: last, createEmpty: false)\r\n |> yield(name: \"last\")", 596 | "refId": "A", 597 | "resultFormat": "time_series", 598 | "select": [ 599 | [ 600 | { 601 | "params": [ 602 | "ping" 603 | ], 604 | "type": "field" 605 | }, 606 | { 607 | "params": [], 608 | "type": "last" 609 | } 610 | ] 611 | ], 612 | "tags": [] 613 | } 614 | ], 615 | "timeFrom": "1d", 616 | "title": "Ping Jitter", 617 | "transformations": [ 618 | { 619 | "id": "merge", 620 | "options": {} 621 | }, 622 | { 623 | "id": "organize", 624 | "options": { 625 | "excludeByName": {}, 626 | "indexByName": {}, 627 | "renameByName": { 628 | "ping_jitter": "Ping Jitter" 629 | } 630 | } 631 | } 632 | ], 633 | "type": "stat" 634 | }, 635 | { 636 | "datasource": { 637 | "type": "influxdb", 638 | "uid": "${DS_INFLUXDBV2}" 639 | }, 640 | "description": "Packet loss occurs when a packet of data being sent over the internet is not received or is incomplete. This is described in the percentage of packets lost compared to packets sent.", 641 | "fieldConfig": { 642 | "defaults": { 643 | "decimals": 1, 644 | "fieldMinMax": true, 645 | "mappings": [], 646 | "min": 0, 647 | "thresholds": { 648 | "mode": "percentage", 649 | "steps": [ 650 | { 651 | "color": "dark-green", 652 | "value": null 653 | }, 654 | { 655 | "color": "dark-yellow", 656 | "value": 2 657 | }, 658 | { 659 | "color": "dark-red", 660 | "value": 5 661 | } 662 | ] 663 | }, 664 | "unit": "percent" 665 | }, 666 | "overrides": [] 667 | }, 668 | "gridPos": { 669 | "h": 4, 670 | "w": 4, 671 | "x": 20, 672 | "y": 1 673 | }, 674 | "id": 123, 675 | "options": { 676 | "colorMode": "value", 677 | "graphMode": "area", 678 | "justifyMode": "auto", 679 | "orientation": "auto", 680 | "percentChangeColorMode": "standard", 681 | "reduceOptions": { 682 | "calcs": [ 683 | "last" 684 | ], 685 | "fields": "/^Packet Loss %$/", 686 | "values": false 687 | }, 688 | "showPercentChange": true, 689 | "textMode": "auto", 690 | "wideLayout": true 691 | }, 692 | "pluginVersion": "11.4.0", 693 | "targets": [ 694 | { 695 | "datasource": { 696 | "type": "influxdb", 697 | "uid": "${DS_INFLUXDBV2}" 698 | }, 699 | "groupBy": [ 700 | { 701 | "params": [ 702 | "$__interval" 703 | ], 704 | "type": "time" 705 | }, 706 | { 707 | "params": [ 708 | "linear" 709 | ], 710 | "type": "fill" 711 | } 712 | ], 713 | "measurement": "speedtest", 714 | "orderByTime": "ASC", 715 | "policy": "default", 716 | "query": "from(bucket: \"${bucket}\")\r\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\r\n |> filter(fn: (r) => r[\"_measurement\"] == \"speedtest\")\r\n |> filter(fn: (r) => r[\"_field\"] == \"packet_loss\")\r\n |> drop(columns: [\"server_host\",\"server_name\",\"server_id\"])\r\n |> aggregateWindow(every: v.windowPeriod, fn: last, createEmpty: false)\r\n |> yield(name: \"last\")", 717 | "refId": "A", 718 | "resultFormat": "time_series", 719 | "select": [ 720 | [ 721 | { 722 | "params": [ 723 | "ping" 724 | ], 725 | "type": "field" 726 | }, 727 | { 728 | "params": [], 729 | "type": "last" 730 | } 731 | ] 732 | ], 733 | "tags": [] 734 | } 735 | ], 736 | "timeFrom": "1d", 737 | "title": "Packet Loss", 738 | "transformations": [ 739 | { 740 | "id": "merge", 741 | "options": {} 742 | }, 743 | { 744 | "id": "organize", 745 | "options": { 746 | "excludeByName": {}, 747 | "indexByName": {}, 748 | "renameByName": { 749 | "packet_loss": "Packet Loss %" 750 | } 751 | } 752 | } 753 | ], 754 | "type": "stat" 755 | }, 756 | { 757 | "datasource": { 758 | "type": "influxdb", 759 | "uid": "${DS_INFLUXDBV2}" 760 | }, 761 | "description": "", 762 | "fieldConfig": { 763 | "defaults": { 764 | "fieldMinMax": false, 765 | "mappings": [], 766 | "thresholds": { 767 | "mode": "percentage", 768 | "steps": [ 769 | { 770 | "color": "blue", 771 | "value": null 772 | } 773 | ] 774 | }, 775 | "unit": "dateTimeFromNow" 776 | }, 777 | "overrides": [] 778 | }, 779 | "gridPos": { 780 | "h": 2, 781 | "w": 4, 782 | "x": 10, 783 | "y": 5 784 | }, 785 | "id": 129, 786 | "interval": "10s", 787 | "options": { 788 | "colorMode": "value", 789 | "graphMode": "none", 790 | "justifyMode": "center", 791 | "orientation": "auto", 792 | "percentChangeColorMode": "standard", 793 | "reduceOptions": { 794 | "calcs": [ 795 | "last" 796 | ], 797 | "fields": "/^_time$/", 798 | "values": false 799 | }, 800 | "showPercentChange": false, 801 | "text": {}, 802 | "textMode": "auto", 803 | "wideLayout": true 804 | }, 805 | "pluginVersion": "11.4.0", 806 | "targets": [ 807 | { 808 | "datasource": { 809 | "type": "influxdb", 810 | "uid": "${DS_INFLUXDBV2}" 811 | }, 812 | "groupBy": [ 813 | { 814 | "params": [ 815 | "$__interval" 816 | ], 817 | "type": "time" 818 | }, 819 | { 820 | "params": [ 821 | "linear" 822 | ], 823 | "type": "fill" 824 | } 825 | ], 826 | "hide": false, 827 | "measurement": "speedtest", 828 | "orderByTime": "ASC", 829 | "policy": "default", 830 | "query": "from(bucket: \"${bucket}\")\r\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\r\n |> filter(fn: (r) => r[\"_measurement\"] == \"speedtest\")\r\n |> filter(fn: (r) => r[\"_field\"] == \"download_bits\")\r\n |> group(columns: [\"_field\", \"_measurement\"], mode:\"by\")\r\n |> last()\r\n |> yield(name: \"last\")", 831 | "refId": "A", 832 | "resultFormat": "time_series", 833 | "select": [ 834 | [ 835 | { 836 | "params": [ 837 | "download" 838 | ], 839 | "type": "field" 840 | }, 841 | { 842 | "params": [], 843 | "type": "last" 844 | } 845 | ] 846 | ], 847 | "tags": [] 848 | } 849 | ], 850 | "title": "Latest result", 851 | "transformations": [ 852 | { 853 | "id": "calculateField", 854 | "options": { 855 | "mode": "reduceRow", 856 | "reduce": { 857 | "include": [], 858 | "reducer": "lastNotNull" 859 | }, 860 | "replaceFields": true 861 | } 862 | } 863 | ], 864 | "type": "stat" 865 | }, 866 | { 867 | "collapsed": false, 868 | "gridPos": { 869 | "h": 1, 870 | "w": 24, 871 | "x": 0, 872 | "y": 7 873 | }, 874 | "id": 127, 875 | "panels": [], 876 | "title": "Basic Speed Info", 877 | "type": "row" 878 | }, 879 | { 880 | "datasource": { 881 | "type": "influxdb", 882 | "uid": "${DS_INFLUXDBV2}" 883 | }, 884 | "description": "Download speed - measures how quickly you can pull data from a server on the internet to your device.\n\nUpload speed - measures how quickly you send data from your device to the internet.", 885 | "fieldConfig": { 886 | "defaults": { 887 | "color": { 888 | "mode": "palette-classic" 889 | }, 890 | "custom": { 891 | "axisBorderShow": false, 892 | "axisCenteredZero": false, 893 | "axisColorMode": "series", 894 | "axisLabel": "", 895 | "axisPlacement": "auto", 896 | "barAlignment": 0, 897 | "barWidthFactor": 0.6, 898 | "drawStyle": "line", 899 | "fillOpacity": 30, 900 | "gradientMode": "opacity", 901 | "hideFrom": { 902 | "legend": false, 903 | "tooltip": false, 904 | "viz": false 905 | }, 906 | "insertNulls": false, 907 | "lineInterpolation": "smooth", 908 | "lineWidth": 1, 909 | "pointSize": 3, 910 | "scaleDistribution": { 911 | "type": "linear" 912 | }, 913 | "showPoints": "always", 914 | "spanNulls": false, 915 | "stacking": { 916 | "group": "A", 917 | "mode": "none" 918 | }, 919 | "thresholdsStyle": { 920 | "mode": "off" 921 | } 922 | }, 923 | "decimals": 1, 924 | "mappings": [], 925 | "thresholds": { 926 | "mode": "absolute", 927 | "steps": [ 928 | { 929 | "color": "green", 930 | "value": null 931 | }, 932 | { 933 | "color": "red", 934 | "value": 80 935 | } 936 | ] 937 | }, 938 | "unit": "bps" 939 | }, 940 | "overrides": [ 941 | { 942 | "matcher": { 943 | "id": "byName", 944 | "options": "Upload" 945 | }, 946 | "properties": [ 947 | { 948 | "id": "color", 949 | "value": { 950 | "fixedColor": "#a352ff", 951 | "mode": "fixed" 952 | } 953 | }, 954 | { 955 | "id": "custom.axisPlacement", 956 | "value": "right" 957 | }, 958 | { 959 | "id": "custom.axisSoftMin" 960 | }, 961 | { 962 | "id": "custom.axisSoftMax", 963 | "value": 150000000 964 | } 965 | ] 966 | }, 967 | { 968 | "matcher": { 969 | "id": "byName", 970 | "options": "Download" 971 | }, 972 | "properties": [ 973 | { 974 | "id": "color", 975 | "value": { 976 | "fixedColor": "#1774ff", 977 | "mode": "fixed" 978 | } 979 | } 980 | ] 981 | } 982 | ] 983 | }, 984 | "gridPos": { 985 | "h": 10, 986 | "w": 24, 987 | "x": 0, 988 | "y": 8 989 | }, 990 | "id": 104, 991 | "options": { 992 | "legend": { 993 | "calcs": [ 994 | "last", 995 | "min", 996 | "max", 997 | "mean" 998 | ], 999 | "displayMode": "table", 1000 | "placement": "bottom", 1001 | "showLegend": true 1002 | }, 1003 | "tooltip": { 1004 | "maxHeight": 600, 1005 | "mode": "multi", 1006 | "sort": "none" 1007 | } 1008 | }, 1009 | "pluginVersion": "11.4.0", 1010 | "targets": [ 1011 | { 1012 | "datasource": { 1013 | "type": "influxdb", 1014 | "uid": "${DS_INFLUXDBV2}" 1015 | }, 1016 | "query": "from(bucket: \"${bucket}\")\r\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\r\n |> filter(fn: (r) => r[\"_measurement\"] == \"speedtest\")\r\n |> filter(fn: (r) => r[\"_field\"] == \"download_bits\" or r[\"_field\"] == \"upload_bits\")\r\n |> drop(columns: [\"server_host\",\"server_name\",\"server_id\"])\r\n |> aggregateWindow(every: v.windowPeriod, fn: last, createEmpty: false)\r\n |> yield(name: \"last\")", 1017 | "refId": "A" 1018 | } 1019 | ], 1020 | "title": "Speedtest Results", 1021 | "transformations": [ 1022 | { 1023 | "id": "merge", 1024 | "options": {} 1025 | }, 1026 | { 1027 | "id": "organize", 1028 | "options": { 1029 | "excludeByName": {}, 1030 | "indexByName": {}, 1031 | "renameByName": { 1032 | "download_bits": "Download", 1033 | "upload_bits": "Upload" 1034 | } 1035 | } 1036 | } 1037 | ], 1038 | "type": "timeseries" 1039 | }, 1040 | { 1041 | "datasource": { 1042 | "type": "influxdb", 1043 | "uid": "${DS_INFLUXDBV2}" 1044 | }, 1045 | "description": "Also called latency, ping is the reaction time of your connection - that is, how quickly your device gets a response after you've sent out a request.", 1046 | "fieldConfig": { 1047 | "defaults": { 1048 | "color": { 1049 | "mode": "palette-classic" 1050 | }, 1051 | "custom": { 1052 | "axisBorderShow": false, 1053 | "axisCenteredZero": false, 1054 | "axisColorMode": "series", 1055 | "axisLabel": "", 1056 | "axisPlacement": "auto", 1057 | "barAlignment": 0, 1058 | "barWidthFactor": 0.6, 1059 | "drawStyle": "line", 1060 | "fillOpacity": 30, 1061 | "gradientMode": "opacity", 1062 | "hideFrom": { 1063 | "legend": false, 1064 | "tooltip": false, 1065 | "viz": false 1066 | }, 1067 | "insertNulls": false, 1068 | "lineInterpolation": "smooth", 1069 | "lineWidth": 1, 1070 | "pointSize": 3, 1071 | "scaleDistribution": { 1072 | "type": "linear" 1073 | }, 1074 | "showPoints": "always", 1075 | "spanNulls": false, 1076 | "stacking": { 1077 | "group": "A", 1078 | "mode": "none" 1079 | }, 1080 | "thresholdsStyle": { 1081 | "mode": "off" 1082 | } 1083 | }, 1084 | "decimals": 1, 1085 | "mappings": [], 1086 | "thresholds": { 1087 | "mode": "absolute", 1088 | "steps": [ 1089 | { 1090 | "color": "green", 1091 | "value": null 1092 | }, 1093 | { 1094 | "color": "#EAB839", 1095 | "value": 20 1096 | }, 1097 | { 1098 | "color": "red", 1099 | "value": 30 1100 | } 1101 | ] 1102 | }, 1103 | "unit": "ms" 1104 | }, 1105 | "overrides": [ 1106 | { 1107 | "matcher": { 1108 | "id": "byName", 1109 | "options": "Ping (ms)" 1110 | }, 1111 | "properties": [ 1112 | { 1113 | "id": "color", 1114 | "value": { 1115 | "fixedColor": "dark-green", 1116 | "mode": "fixed" 1117 | } 1118 | } 1119 | ] 1120 | } 1121 | ] 1122 | }, 1123 | "gridPos": { 1124 | "h": 8, 1125 | "w": 24, 1126 | "x": 0, 1127 | "y": 18 1128 | }, 1129 | "id": 119, 1130 | "options": { 1131 | "legend": { 1132 | "calcs": [ 1133 | "last", 1134 | "min", 1135 | "max", 1136 | "mean" 1137 | ], 1138 | "displayMode": "table", 1139 | "placement": "bottom", 1140 | "showLegend": true 1141 | }, 1142 | "tooltip": { 1143 | "maxHeight": 600, 1144 | "mode": "multi", 1145 | "sort": "none" 1146 | } 1147 | }, 1148 | "pluginVersion": "11.4.0", 1149 | "targets": [ 1150 | { 1151 | "datasource": { 1152 | "type": "influxdb", 1153 | "uid": "${DS_INFLUXDBV2}" 1154 | }, 1155 | "query": "from(bucket: \"${bucket}\")\r\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\r\n |> filter(fn: (r) => r[\"_measurement\"] == \"speedtest\")\r\n |> filter(fn: (r) => r[\"_field\"] == \"ping\")\r\n |> drop(columns: [\"server_host\",\"server_name\",\"server_id\"])\r\n |> aggregateWindow(every: v.windowPeriod, fn: last, createEmpty: false)\r\n |> yield(name: \"last\")", 1156 | "refId": "A" 1157 | } 1158 | ], 1159 | "title": "Ping", 1160 | "transformations": [ 1161 | { 1162 | "id": "merge", 1163 | "options": {} 1164 | }, 1165 | { 1166 | "id": "organize", 1167 | "options": { 1168 | "excludeByName": {}, 1169 | "indexByName": {}, 1170 | "renameByName": { 1171 | "ping": "Ping (ms)" 1172 | } 1173 | } 1174 | } 1175 | ], 1176 | "type": "timeseries" 1177 | }, 1178 | { 1179 | "datasource": { 1180 | "type": "influxdb", 1181 | "uid": "${DS_INFLUXDBV2}" 1182 | }, 1183 | "description": "Also called Packet Delay Variation (PDV), jitter is a measure of the variability in ping over time.\nThis metric shows the average difference between consecutive latency measurements.", 1184 | "fieldConfig": { 1185 | "defaults": { 1186 | "color": { 1187 | "mode": "palette-classic" 1188 | }, 1189 | "custom": { 1190 | "axisBorderShow": false, 1191 | "axisCenteredZero": false, 1192 | "axisColorMode": "series", 1193 | "axisLabel": "", 1194 | "axisPlacement": "auto", 1195 | "barAlignment": 0, 1196 | "barWidthFactor": 0.6, 1197 | "drawStyle": "line", 1198 | "fillOpacity": 30, 1199 | "gradientMode": "opacity", 1200 | "hideFrom": { 1201 | "legend": false, 1202 | "tooltip": false, 1203 | "viz": false 1204 | }, 1205 | "insertNulls": false, 1206 | "lineInterpolation": "smooth", 1207 | "lineWidth": 1, 1208 | "pointSize": 3, 1209 | "scaleDistribution": { 1210 | "type": "linear" 1211 | }, 1212 | "showPoints": "always", 1213 | "spanNulls": false, 1214 | "stacking": { 1215 | "group": "A", 1216 | "mode": "none" 1217 | }, 1218 | "thresholdsStyle": { 1219 | "mode": "off" 1220 | } 1221 | }, 1222 | "decimals": 1, 1223 | "mappings": [], 1224 | "thresholds": { 1225 | "mode": "absolute", 1226 | "steps": [ 1227 | { 1228 | "color": "green" 1229 | }, 1230 | { 1231 | "color": "#EAB839", 1232 | "value": 20 1233 | }, 1234 | { 1235 | "color": "red", 1236 | "value": 30 1237 | } 1238 | ] 1239 | }, 1240 | "unit": "ms" 1241 | }, 1242 | "overrides": [ 1243 | { 1244 | "matcher": { 1245 | "id": "byName", 1246 | "options": "Ping (ms)" 1247 | }, 1248 | "properties": [ 1249 | { 1250 | "id": "color", 1251 | "value": { 1252 | "fixedColor": "dark-green", 1253 | "mode": "fixed" 1254 | } 1255 | } 1256 | ] 1257 | }, 1258 | { 1259 | "matcher": { 1260 | "id": "byName", 1261 | "options": "Download (ms)" 1262 | }, 1263 | "properties": [ 1264 | { 1265 | "id": "color", 1266 | "value": { 1267 | "fixedColor": "dark-blue", 1268 | "mode": "fixed" 1269 | } 1270 | } 1271 | ] 1272 | }, 1273 | { 1274 | "matcher": { 1275 | "id": "byName", 1276 | "options": "Upload (ms)" 1277 | }, 1278 | "properties": [ 1279 | { 1280 | "id": "color", 1281 | "value": { 1282 | "fixedColor": "dark-purple", 1283 | "mode": "fixed" 1284 | } 1285 | } 1286 | ] 1287 | }, 1288 | { 1289 | "__systemRef": "hideSeriesFrom", 1290 | "matcher": { 1291 | "id": "byNames", 1292 | "options": { 1293 | "mode": "exclude", 1294 | "names": [ 1295 | "Ping (ms)" 1296 | ], 1297 | "prefix": "All except:", 1298 | "readOnly": true 1299 | } 1300 | }, 1301 | "properties": [ 1302 | { 1303 | "id": "custom.hideFrom", 1304 | "value": { 1305 | "legend": false, 1306 | "tooltip": false, 1307 | "viz": true 1308 | } 1309 | } 1310 | ] 1311 | } 1312 | ] 1313 | }, 1314 | "gridPos": { 1315 | "h": 9, 1316 | "w": 24, 1317 | "x": 0, 1318 | "y": 26 1319 | }, 1320 | "id": 122, 1321 | "options": { 1322 | "legend": { 1323 | "calcs": [ 1324 | "last", 1325 | "min", 1326 | "max", 1327 | "mean" 1328 | ], 1329 | "displayMode": "table", 1330 | "placement": "bottom", 1331 | "showLegend": true 1332 | }, 1333 | "tooltip": { 1334 | "maxHeight": 600, 1335 | "mode": "multi", 1336 | "sort": "none" 1337 | } 1338 | }, 1339 | "pluginVersion": "11.4.0", 1340 | "targets": [ 1341 | { 1342 | "datasource": { 1343 | "type": "influxdb", 1344 | "uid": "${DS_INFLUXDBV2}" 1345 | }, 1346 | "hide": false, 1347 | "query": "from(bucket: \"${bucket}\")\r\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\r\n |> filter(fn: (r) => r[\"_measurement\"] == \"speedtest\")\r\n |> filter(fn: (r) => r[\"_field\"] == \"ping_jitter\" or r[\"_field\"] == \"download_jitter\" or r[\"_field\"] == \"upload_jitter\")\r\n |> drop(columns: [\"server_host\",\"server_name\",\"server_id\"])\r\n |> aggregateWindow(every: v.windowPeriod, fn: last, createEmpty: false)\r\n |> yield(name: \"last\")", 1348 | "refId": "C" 1349 | } 1350 | ], 1351 | "title": "Jitter", 1352 | "transformations": [ 1353 | { 1354 | "id": "merge", 1355 | "options": {} 1356 | }, 1357 | { 1358 | "id": "organize", 1359 | "options": { 1360 | "excludeByName": {}, 1361 | "indexByName": {}, 1362 | "renameByName": { 1363 | "download_jitter": "Download (ms)", 1364 | "ping_jitter": "Ping (ms)", 1365 | "upload_jitter": "Upload (ms)" 1366 | } 1367 | } 1368 | } 1369 | ], 1370 | "type": "timeseries" 1371 | }, 1372 | { 1373 | "datasource": { 1374 | "type": "influxdb", 1375 | "uid": "${DS_INFLUXDBV2}" 1376 | }, 1377 | "description": "Low - Minimum Latency (formerly, Latency) measures the best case latency for the user at the time they decide to take a Speedtest.\n\nAvg - Primary-Server Latency is the interquartile mean (IQM or midmean) of the idle latency tests taken prior to the download portion of a Speedtest.\n\nHigh - Multi-server latency measures latency to multiple connections and then takes an average.", 1378 | "fieldConfig": { 1379 | "defaults": { 1380 | "color": { 1381 | "mode": "palette-classic" 1382 | }, 1383 | "custom": { 1384 | "axisBorderShow": false, 1385 | "axisCenteredZero": false, 1386 | "axisColorMode": "series", 1387 | "axisLabel": "", 1388 | "axisPlacement": "auto", 1389 | "barAlignment": 0, 1390 | "barWidthFactor": 0.6, 1391 | "drawStyle": "line", 1392 | "fillOpacity": 30, 1393 | "gradientMode": "opacity", 1394 | "hideFrom": { 1395 | "legend": false, 1396 | "tooltip": false, 1397 | "viz": false 1398 | }, 1399 | "insertNulls": false, 1400 | "lineInterpolation": "smooth", 1401 | "lineWidth": 1, 1402 | "pointSize": 3, 1403 | "scaleDistribution": { 1404 | "type": "linear" 1405 | }, 1406 | "showPoints": "always", 1407 | "spanNulls": false, 1408 | "stacking": { 1409 | "group": "A", 1410 | "mode": "none" 1411 | }, 1412 | "thresholdsStyle": { 1413 | "mode": "off" 1414 | } 1415 | }, 1416 | "decimals": 1, 1417 | "mappings": [], 1418 | "thresholds": { 1419 | "mode": "absolute", 1420 | "steps": [ 1421 | { 1422 | "color": "green" 1423 | }, 1424 | { 1425 | "color": "#EAB839", 1426 | "value": 20 1427 | }, 1428 | { 1429 | "color": "red", 1430 | "value": 30 1431 | } 1432 | ] 1433 | }, 1434 | "unit": "ms" 1435 | }, 1436 | "overrides": [ 1437 | { 1438 | "matcher": { 1439 | "id": "byName", 1440 | "options": "High (ms)" 1441 | }, 1442 | "properties": [ 1443 | { 1444 | "id": "color", 1445 | "value": { 1446 | "fixedColor": "dark-blue", 1447 | "mode": "fixed" 1448 | } 1449 | } 1450 | ] 1451 | }, 1452 | { 1453 | "matcher": { 1454 | "id": "byName", 1455 | "options": "Average (ms)" 1456 | }, 1457 | "properties": [ 1458 | { 1459 | "id": "color", 1460 | "value": { 1461 | "fixedColor": "dark-green", 1462 | "mode": "fixed" 1463 | } 1464 | } 1465 | ] 1466 | }, 1467 | { 1468 | "matcher": { 1469 | "id": "byName", 1470 | "options": "Low (ms)" 1471 | }, 1472 | "properties": [ 1473 | { 1474 | "id": "color", 1475 | "value": { 1476 | "fixedColor": "dark-purple", 1477 | "mode": "fixed" 1478 | } 1479 | } 1480 | ] 1481 | } 1482 | ] 1483 | }, 1484 | "gridPos": { 1485 | "h": 9, 1486 | "w": 24, 1487 | "x": 0, 1488 | "y": 35 1489 | }, 1490 | "id": 126, 1491 | "options": { 1492 | "legend": { 1493 | "calcs": [ 1494 | "last", 1495 | "min", 1496 | "max", 1497 | "mean" 1498 | ], 1499 | "displayMode": "table", 1500 | "placement": "bottom", 1501 | "showLegend": true 1502 | }, 1503 | "tooltip": { 1504 | "maxHeight": 600, 1505 | "mode": "multi", 1506 | "sort": "none" 1507 | } 1508 | }, 1509 | "pluginVersion": "11.4.0", 1510 | "targets": [ 1511 | { 1512 | "datasource": { 1513 | "type": "influxdb", 1514 | "uid": "${DS_INFLUXDBV2}" 1515 | }, 1516 | "hide": false, 1517 | "query": "from(bucket: \"${bucket}\")\r\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\r\n |> filter(fn: (r) => r[\"_measurement\"] == \"speedtest\")\r\n |> filter(fn: (r) => r[\"_field\"] == \"download_latency_avg\" or r[\"_field\"] == \"download_latency_high\" or r[\"_field\"] == \"download_latency_low\")\r\n |> drop(columns: [\"server_host\",\"server_name\",\"server_id\"])\r\n |> aggregateWindow(every: v.windowPeriod, fn: last, createEmpty: false)\r\n |> yield(name: \"last\")", 1518 | "refId": "C" 1519 | } 1520 | ], 1521 | "title": "Download Latency", 1522 | "transformations": [ 1523 | { 1524 | "id": "merge", 1525 | "options": {} 1526 | }, 1527 | { 1528 | "id": "organize", 1529 | "options": { 1530 | "excludeByName": {}, 1531 | "includeByName": {}, 1532 | "indexByName": {}, 1533 | "renameByName": { 1534 | "download_jitter": "Download (ms)", 1535 | "download_latency_avg": "Average (ms)", 1536 | "download_latency_high": "High (ms)", 1537 | "download_latency_low": "Low (ms)", 1538 | "ping_jitter": "Ping (ms)", 1539 | "upload_jitter": "Upload (ms)", 1540 | "upload_latency_avg": "Average (ms)", 1541 | "upload_latency_high": "High (ms)", 1542 | "upload_latency_low": "Low (ms)" 1543 | } 1544 | } 1545 | } 1546 | ], 1547 | "type": "timeseries" 1548 | }, 1549 | { 1550 | "datasource": { 1551 | "type": "influxdb", 1552 | "uid": "${DS_INFLUXDBV2}" 1553 | }, 1554 | "description": "Low - Minimum Latency (formerly, Latency) measures the best case latency for the user at the time they decide to take a Speedtest.\n\nAvg - Primary-Server Latency is the interquartile mean (IQM or midmean) of the idle latency tests taken prior to the download portion of a Speedtest.\n\nHigh - Multi-server latency measures latency to multiple connections and then takes an average.", 1555 | "fieldConfig": { 1556 | "defaults": { 1557 | "color": { 1558 | "mode": "palette-classic" 1559 | }, 1560 | "custom": { 1561 | "axisBorderShow": false, 1562 | "axisCenteredZero": false, 1563 | "axisColorMode": "series", 1564 | "axisLabel": "", 1565 | "axisPlacement": "auto", 1566 | "barAlignment": 0, 1567 | "barWidthFactor": 0.6, 1568 | "drawStyle": "line", 1569 | "fillOpacity": 30, 1570 | "gradientMode": "opacity", 1571 | "hideFrom": { 1572 | "legend": false, 1573 | "tooltip": false, 1574 | "viz": false 1575 | }, 1576 | "insertNulls": false, 1577 | "lineInterpolation": "smooth", 1578 | "lineWidth": 1, 1579 | "pointSize": 3, 1580 | "scaleDistribution": { 1581 | "type": "linear" 1582 | }, 1583 | "showPoints": "always", 1584 | "spanNulls": false, 1585 | "stacking": { 1586 | "group": "A", 1587 | "mode": "none" 1588 | }, 1589 | "thresholdsStyle": { 1590 | "mode": "off" 1591 | } 1592 | }, 1593 | "decimals": 1, 1594 | "mappings": [], 1595 | "thresholds": { 1596 | "mode": "absolute", 1597 | "steps": [ 1598 | { 1599 | "color": "green" 1600 | }, 1601 | { 1602 | "color": "#EAB839", 1603 | "value": 20 1604 | }, 1605 | { 1606 | "color": "red", 1607 | "value": 30 1608 | } 1609 | ] 1610 | }, 1611 | "unit": "ms" 1612 | }, 1613 | "overrides": [ 1614 | { 1615 | "matcher": { 1616 | "id": "byName", 1617 | "options": "High (ms)" 1618 | }, 1619 | "properties": [ 1620 | { 1621 | "id": "color", 1622 | "value": { 1623 | "fixedColor": "dark-blue", 1624 | "mode": "fixed" 1625 | } 1626 | } 1627 | ] 1628 | }, 1629 | { 1630 | "matcher": { 1631 | "id": "byName", 1632 | "options": "Average (ms)" 1633 | }, 1634 | "properties": [ 1635 | { 1636 | "id": "color", 1637 | "value": { 1638 | "fixedColor": "dark-green", 1639 | "mode": "fixed" 1640 | } 1641 | } 1642 | ] 1643 | }, 1644 | { 1645 | "matcher": { 1646 | "id": "byName", 1647 | "options": "Low (ms)" 1648 | }, 1649 | "properties": [ 1650 | { 1651 | "id": "color", 1652 | "value": { 1653 | "fixedColor": "dark-purple", 1654 | "mode": "fixed" 1655 | } 1656 | } 1657 | ] 1658 | } 1659 | ] 1660 | }, 1661 | "gridPos": { 1662 | "h": 9, 1663 | "w": 24, 1664 | "x": 0, 1665 | "y": 44 1666 | }, 1667 | "id": 125, 1668 | "options": { 1669 | "legend": { 1670 | "calcs": [ 1671 | "last", 1672 | "min", 1673 | "max", 1674 | "mean" 1675 | ], 1676 | "displayMode": "table", 1677 | "placement": "bottom", 1678 | "showLegend": true 1679 | }, 1680 | "tooltip": { 1681 | "maxHeight": 600, 1682 | "mode": "multi", 1683 | "sort": "none" 1684 | } 1685 | }, 1686 | "pluginVersion": "11.4.0", 1687 | "targets": [ 1688 | { 1689 | "datasource": { 1690 | "type": "influxdb", 1691 | "uid": "${DS_INFLUXDBV2}" 1692 | }, 1693 | "hide": false, 1694 | "query": "from(bucket: \"${bucket}\")\r\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\r\n |> filter(fn: (r) => r[\"_measurement\"] == \"speedtest\")\r\n |> filter(fn: (r) => r[\"_field\"] == \"upload_latency_avg\" or r[\"_field\"] == \"upload_latency_high\" or r[\"_field\"] == \"upload_latency_low\")\r\n |> drop(columns: [\"server_host\",\"server_name\",\"server_id\"])\r\n |> aggregateWindow(every: v.windowPeriod, fn: last, createEmpty: false)\r\n |> yield(name: \"last\")", 1695 | "refId": "C" 1696 | } 1697 | ], 1698 | "title": "Upload Latency", 1699 | "transformations": [ 1700 | { 1701 | "id": "merge", 1702 | "options": {} 1703 | }, 1704 | { 1705 | "id": "organize", 1706 | "options": { 1707 | "excludeByName": {}, 1708 | "includeByName": {}, 1709 | "indexByName": {}, 1710 | "renameByName": { 1711 | "download_jitter": "Download (ms)", 1712 | "ping_jitter": "Ping (ms)", 1713 | "upload_jitter": "Upload (ms)", 1714 | "upload_latency_avg": "Average (ms)", 1715 | "upload_latency_high": "High (ms)", 1716 | "upload_latency_low": "Low (ms)" 1717 | } 1718 | } 1719 | } 1720 | ], 1721 | "type": "timeseries" 1722 | }, 1723 | { 1724 | "collapsed": false, 1725 | "gridPos": { 1726 | "h": 1, 1727 | "w": 24, 1728 | "x": 0, 1729 | "y": 53 1730 | }, 1731 | "id": 128, 1732 | "panels": [], 1733 | "title": "Advanced Speed Info", 1734 | "type": "row" 1735 | }, 1736 | { 1737 | "datasource": { 1738 | "type": "influxdb", 1739 | "uid": "${DS_INFLUXDBV2}" 1740 | }, 1741 | "description": "Average speeds received by server", 1742 | "fieldConfig": { 1743 | "defaults": { 1744 | "custom": { 1745 | "align": "center", 1746 | "cellOptions": { 1747 | "mode": "gradient", 1748 | "type": "color-background" 1749 | }, 1750 | "filterable": false, 1751 | "inspect": false 1752 | }, 1753 | "fieldMinMax": false, 1754 | "mappings": [], 1755 | "thresholds": { 1756 | "mode": "absolute", 1757 | "steps": [ 1758 | { 1759 | "color": "dark-blue" 1760 | } 1761 | ] 1762 | }, 1763 | "unit": "bps" 1764 | }, 1765 | "overrides": [ 1766 | { 1767 | "matcher": { 1768 | "id": "byName", 1769 | "options": "Ping Avg." 1770 | }, 1771 | "properties": [ 1772 | { 1773 | "id": "unit", 1774 | "value": "ms" 1775 | }, 1776 | { 1777 | "id": "thresholds", 1778 | "value": { 1779 | "mode": "percentage", 1780 | "steps": [ 1781 | { 1782 | "color": "green" 1783 | }, 1784 | { 1785 | "color": "#EAB839", 1786 | "value": 50 1787 | }, 1788 | { 1789 | "color": "red", 1790 | "value": 100 1791 | } 1792 | ] 1793 | } 1794 | }, 1795 | { 1796 | "id": "custom.cellOptions", 1797 | "value": { 1798 | "mode": "gradient", 1799 | "type": "gauge", 1800 | "valueDisplayMode": "color" 1801 | } 1802 | }, 1803 | { 1804 | "id": "max" 1805 | }, 1806 | { 1807 | "id": "min", 1808 | "value": 0 1809 | }, 1810 | { 1811 | "id": "decimals", 1812 | "value": 1 1813 | }, 1814 | { 1815 | "id": "fieldMinMax", 1816 | "value": true 1817 | } 1818 | ] 1819 | }, 1820 | { 1821 | "matcher": { 1822 | "id": "byName", 1823 | "options": "DL Avg." 1824 | }, 1825 | "properties": [ 1826 | { 1827 | "id": "custom.cellOptions", 1828 | "value": { 1829 | "mode": "gradient", 1830 | "type": "gauge", 1831 | "valueDisplayMode": "color" 1832 | } 1833 | }, 1834 | { 1835 | "id": "thresholds", 1836 | "value": { 1837 | "mode": "percentage", 1838 | "steps": [ 1839 | { 1840 | "color": "red" 1841 | }, 1842 | { 1843 | "color": "yellow", 1844 | "value": 60 1845 | }, 1846 | { 1847 | "color": "green", 1848 | "value": 70 1849 | } 1850 | ] 1851 | } 1852 | }, 1853 | { 1854 | "id": "min", 1855 | "value": 0 1856 | }, 1857 | { 1858 | "id": "max", 1859 | "value": 1000000000 1860 | }, 1861 | { 1862 | "id": "custom.width", 1863 | "value": 300 1864 | }, 1865 | { 1866 | "id": "decimals", 1867 | "value": 1 1868 | } 1869 | ] 1870 | }, 1871 | { 1872 | "matcher": { 1873 | "id": "byName", 1874 | "options": "UL Avg." 1875 | }, 1876 | "properties": [ 1877 | { 1878 | "id": "custom.cellOptions", 1879 | "value": { 1880 | "mode": "gradient", 1881 | "type": "gauge", 1882 | "valueDisplayMode": "color" 1883 | } 1884 | }, 1885 | { 1886 | "id": "min", 1887 | "value": 0 1888 | }, 1889 | { 1890 | "id": "max", 1891 | "value": 100000000 1892 | }, 1893 | { 1894 | "id": "thresholds", 1895 | "value": { 1896 | "mode": "percentage", 1897 | "steps": [ 1898 | { 1899 | "color": "red" 1900 | }, 1901 | { 1902 | "color": "yellow", 1903 | "value": 70 1904 | }, 1905 | { 1906 | "color": "green", 1907 | "value": 90 1908 | } 1909 | ] 1910 | } 1911 | }, 1912 | { 1913 | "id": "custom.width", 1914 | "value": 300 1915 | }, 1916 | { 1917 | "id": "decimals", 1918 | "value": 1 1919 | } 1920 | ] 1921 | }, 1922 | { 1923 | "matcher": { 1924 | "id": "byName", 1925 | "options": "Server ID" 1926 | }, 1927 | "properties": [ 1928 | { 1929 | "id": "unit", 1930 | "value": "string" 1931 | } 1932 | ] 1933 | }, 1934 | { 1935 | "matcher": { 1936 | "id": "byName", 1937 | "options": "Server Name" 1938 | }, 1939 | "properties": [ 1940 | { 1941 | "id": "unit", 1942 | "value": "string" 1943 | } 1944 | ] 1945 | }, 1946 | { 1947 | "matcher": { 1948 | "id": "byName", 1949 | "options": "Server ID" 1950 | }, 1951 | "properties": [ 1952 | { 1953 | "id": "custom.width", 1954 | "value": 90 1955 | } 1956 | ] 1957 | }, 1958 | { 1959 | "matcher": { 1960 | "id": "byName", 1961 | "options": "Server Name" 1962 | }, 1963 | "properties": [ 1964 | { 1965 | "id": "custom.width", 1966 | "value": 200 1967 | } 1968 | ] 1969 | }, 1970 | { 1971 | "matcher": { 1972 | "id": "byName", 1973 | "options": "Ping Jitter" 1974 | }, 1975 | "properties": [ 1976 | { 1977 | "id": "unit", 1978 | "value": "ms" 1979 | }, 1980 | { 1981 | "id": "thresholds", 1982 | "value": { 1983 | "mode": "percentage", 1984 | "steps": [ 1985 | { 1986 | "color": "green" 1987 | }, 1988 | { 1989 | "color": "#EAB839", 1990 | "value": 50 1991 | }, 1992 | { 1993 | "color": "red", 1994 | "value": 100 1995 | } 1996 | ] 1997 | } 1998 | }, 1999 | { 2000 | "id": "custom.cellOptions", 2001 | "value": { 2002 | "mode": "gradient", 2003 | "type": "gauge", 2004 | "valueDisplayMode": "color" 2005 | } 2006 | }, 2007 | { 2008 | "id": "max" 2009 | }, 2010 | { 2011 | "id": "min", 2012 | "value": 0 2013 | }, 2014 | { 2015 | "id": "decimals", 2016 | "value": 1 2017 | }, 2018 | { 2019 | "id": "fieldMinMax", 2020 | "value": true 2021 | } 2022 | ] 2023 | }, 2024 | { 2025 | "matcher": { 2026 | "id": "byName", 2027 | "options": "Packet Loss" 2028 | }, 2029 | "properties": [ 2030 | { 2031 | "id": "unit", 2032 | "value": "percent" 2033 | }, 2034 | { 2035 | "id": "thresholds", 2036 | "value": { 2037 | "mode": "percentage", 2038 | "steps": [ 2039 | { 2040 | "color": "green" 2041 | }, 2042 | { 2043 | "color": "#EAB839", 2044 | "value": 2 2045 | }, 2046 | { 2047 | "color": "red", 2048 | "value": 5 2049 | } 2050 | ] 2051 | } 2052 | }, 2053 | { 2054 | "id": "custom.cellOptions", 2055 | "value": { 2056 | "mode": "gradient", 2057 | "type": "gauge", 2058 | "valueDisplayMode": "color" 2059 | } 2060 | }, 2061 | { 2062 | "id": "decimals", 2063 | "value": 1 2064 | }, 2065 | { 2066 | "id": "min", 2067 | "value": 0 2068 | }, 2069 | { 2070 | "id": "max" 2071 | }, 2072 | { 2073 | "id": "fieldMinMax", 2074 | "value": true 2075 | } 2076 | ] 2077 | }, 2078 | { 2079 | "matcher": { 2080 | "id": "byName", 2081 | "options": "UL Ping Avg." 2082 | }, 2083 | "properties": [ 2084 | { 2085 | "id": "unit", 2086 | "value": "ms" 2087 | }, 2088 | { 2089 | "id": "custom.cellOptions", 2090 | "value": { 2091 | "type": "gauge", 2092 | "valueDisplayMode": "color" 2093 | } 2094 | }, 2095 | { 2096 | "id": "max" 2097 | }, 2098 | { 2099 | "id": "fieldMinMax", 2100 | "value": true 2101 | }, 2102 | { 2103 | "id": "thresholds", 2104 | "value": { 2105 | "mode": "percentage", 2106 | "steps": [ 2107 | { 2108 | "color": "green" 2109 | }, 2110 | { 2111 | "color": "#EAB839", 2112 | "value": 50 2113 | }, 2114 | { 2115 | "color": "red", 2116 | "value": 80 2117 | } 2118 | ] 2119 | } 2120 | } 2121 | ] 2122 | }, 2123 | { 2124 | "matcher": { 2125 | "id": "byName", 2126 | "options": "DL Ping Avg." 2127 | }, 2128 | "properties": [ 2129 | { 2130 | "id": "unit", 2131 | "value": "ms" 2132 | }, 2133 | { 2134 | "id": "custom.cellOptions", 2135 | "value": { 2136 | "type": "gauge", 2137 | "valueDisplayMode": "color" 2138 | } 2139 | }, 2140 | { 2141 | "id": "max" 2142 | }, 2143 | { 2144 | "id": "fieldMinMax", 2145 | "value": true 2146 | }, 2147 | { 2148 | "id": "thresholds", 2149 | "value": { 2150 | "mode": "percentage", 2151 | "steps": [ 2152 | { 2153 | "color": "green" 2154 | }, 2155 | { 2156 | "color": "#EAB839", 2157 | "value": 50 2158 | }, 2159 | { 2160 | "color": "red", 2161 | "value": 80 2162 | } 2163 | ] 2164 | } 2165 | } 2166 | ] 2167 | } 2168 | ] 2169 | }, 2170 | "gridPos": { 2171 | "h": 7, 2172 | "w": 24, 2173 | "x": 0, 2174 | "y": 54 2175 | }, 2176 | "id": 114, 2177 | "options": { 2178 | "cellHeight": "sm", 2179 | "footer": { 2180 | "countRows": false, 2181 | "fields": "", 2182 | "reducer": [ 2183 | "sum" 2184 | ], 2185 | "show": false 2186 | }, 2187 | "showHeader": true, 2188 | "sortBy": [ 2189 | { 2190 | "desc": true, 2191 | "displayName": "DL Avg." 2192 | } 2193 | ] 2194 | }, 2195 | "pluginVersion": "11.4.0", 2196 | "targets": [ 2197 | { 2198 | "datasource": { 2199 | "type": "influxdb", 2200 | "uid": "${DS_INFLUXDBV2}" 2201 | }, 2202 | "groupBy": [], 2203 | "hide": false, 2204 | "measurement": "speedtest", 2205 | "orderByTime": "ASC", 2206 | "policy": "default", 2207 | "query": "from(bucket: \"${bucket}\")\r\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\r\n |> filter(fn: (r) => r[\"_measurement\"] == \"speedtest\")\r\n |> filter(fn: (r) => r[\"_field\"] == \"download_bits\" or r[\"_field\"] == \"id\" or r[\"_field\"] == \"ping\" or r[\"_field\"] == \"scheduled\" or r[\"_field\"] == \"server_host\" or r[\"_field\"] == \"server_id\" or r[\"_field\"] == \"server_name\" or r[\"_field\"] == \"upload_bits\" or r[\"_field\"] == \"ping_jitter\" or r[\"_field\"] == \"packet_loss\" or r[\"_field\"] == \"upload_latency_avg\" or r[\"_field\"] == \"download_latency_avg\")\r\n |> aggregateWindow(every: v.windowPeriod, fn: last, createEmpty: false)\r\n |> yield(name: \"last\")", 2208 | "refId": "A", 2209 | "resultFormat": "table", 2210 | "select": [ 2211 | [ 2212 | { 2213 | "params": [ 2214 | "server_name" 2215 | ], 2216 | "type": "field" 2217 | } 2218 | ] 2219 | ], 2220 | "tags": [] 2221 | } 2222 | ], 2223 | "title": "Avg. Speed by Server", 2224 | "transformations": [ 2225 | { 2226 | "id": "labelsToFields", 2227 | "options": {} 2228 | }, 2229 | { 2230 | "id": "merge", 2231 | "options": {} 2232 | }, 2233 | { 2234 | "id": "groupBy", 2235 | "options": { 2236 | "fields": { 2237 | "Time": { 2238 | "aggregations": [ 2239 | "lastNotNull" 2240 | ] 2241 | }, 2242 | "download": { 2243 | "aggregations": [ 2244 | "mean" 2245 | ], 2246 | "operation": "aggregate" 2247 | }, 2248 | "download_bits": { 2249 | "aggregations": [ 2250 | "mean" 2251 | ], 2252 | "operation": "aggregate" 2253 | }, 2254 | "download_latency_avg": { 2255 | "aggregations": [ 2256 | "mean" 2257 | ], 2258 | "operation": "aggregate" 2259 | }, 2260 | "packet_loss": { 2261 | "aggregations": [ 2262 | "mean" 2263 | ], 2264 | "operation": "aggregate" 2265 | }, 2266 | "ping": { 2267 | "aggregations": [ 2268 | "mean" 2269 | ], 2270 | "operation": "aggregate" 2271 | }, 2272 | "ping_jitter": { 2273 | "aggregations": [ 2274 | "mean" 2275 | ], 2276 | "operation": "aggregate" 2277 | }, 2278 | "server_host": { 2279 | "aggregations": [] 2280 | }, 2281 | "server_id": { 2282 | "aggregations": [], 2283 | "operation": "groupby" 2284 | }, 2285 | "server_name": { 2286 | "aggregations": [ 2287 | "lastNotNull" 2288 | ], 2289 | "operation": "groupby" 2290 | }, 2291 | "upload": { 2292 | "aggregations": [ 2293 | "mean" 2294 | ], 2295 | "operation": "aggregate" 2296 | }, 2297 | "upload_bits": { 2298 | "aggregations": [ 2299 | "mean" 2300 | ], 2301 | "operation": "aggregate" 2302 | }, 2303 | "upload_latency_avg": { 2304 | "aggregations": [ 2305 | "mean" 2306 | ], 2307 | "operation": "aggregate" 2308 | } 2309 | } 2310 | } 2311 | }, 2312 | { 2313 | "id": "organize", 2314 | "options": { 2315 | "excludeByName": {}, 2316 | "includeByName": {}, 2317 | "indexByName": { 2318 | "download_bits (mean)": 2, 2319 | "download_latency_avg (mean)": 7, 2320 | "packet_loss (mean)": 8, 2321 | "ping (mean)": 4, 2322 | "ping_jitter (mean)": 5, 2323 | "server_id": 0, 2324 | "server_name": 1, 2325 | "upload_bits (mean)": 3, 2326 | "upload_latency_avg (mean)": 6 2327 | }, 2328 | "renameByName": { 2329 | "download (mean)": "DL Avg.", 2330 | "download_bits (mean)": "DL Avg.", 2331 | "download_latency_avg (mean)": "DL Ping Avg.", 2332 | "packet_loss (mean)": "Packet Loss", 2333 | "ping (mean)": "Ping Avg.", 2334 | "ping_jitter (mean)": "Ping Jitter", 2335 | "server_id": "Server ID", 2336 | "server_name": "Server Name", 2337 | "upload (mean)": "UL Avg.", 2338 | "upload_bits (mean)": "UL Avg.", 2339 | "upload_latency_avg (mean)": "UL Ping Avg." 2340 | } 2341 | } 2342 | }, 2343 | { 2344 | "disabled": true, 2345 | "id": "filterFieldsByName", 2346 | "options": { 2347 | "include": { 2348 | "names": [ 2349 | "Server ID", 2350 | "Server Name", 2351 | "DL Avg.", 2352 | "UL Avg.", 2353 | "Ping Avg.", 2354 | "Ping Jitter", 2355 | "UL Ping Avg.", 2356 | "Packet Loss", 2357 | "DL Ping Avg." 2358 | ] 2359 | } 2360 | } 2361 | }, 2362 | { 2363 | "disabled": true, 2364 | "id": "filterByValue", 2365 | "options": { 2366 | "filters": [ 2367 | { 2368 | "config": { 2369 | "id": "greater", 2370 | "options": { 2371 | "value": 0 2372 | } 2373 | }, 2374 | "fieldName": "Server ID" 2375 | } 2376 | ], 2377 | "match": "any", 2378 | "type": "include" 2379 | } 2380 | } 2381 | ], 2382 | "type": "table" 2383 | }, 2384 | { 2385 | "datasource": { 2386 | "type": "influxdb", 2387 | "uid": "${DS_INFLUXDBV2}" 2388 | }, 2389 | "description": "", 2390 | "fieldConfig": { 2391 | "defaults": { 2392 | "color": { 2393 | "mode": "thresholds" 2394 | }, 2395 | "custom": { 2396 | "align": "center", 2397 | "cellOptions": { 2398 | "type": "auto" 2399 | }, 2400 | "inspect": false, 2401 | "minWidth": 120 2402 | }, 2403 | "decimals": 1, 2404 | "mappings": [], 2405 | "thresholds": { 2406 | "mode": "absolute", 2407 | "steps": [ 2408 | { 2409 | "color": "green" 2410 | }, 2411 | { 2412 | "color": "red", 2413 | "value": 80 2414 | } 2415 | ] 2416 | }, 2417 | "unit": "none" 2418 | }, 2419 | "overrides": [ 2420 | { 2421 | "matcher": { 2422 | "id": "byName", 2423 | "options": "Time" 2424 | }, 2425 | "properties": [ 2426 | { 2427 | "id": "custom.cellOptions", 2428 | "value": { 2429 | "type": "auto" 2430 | } 2431 | }, 2432 | { 2433 | "id": "mappings", 2434 | "value": [] 2435 | }, 2436 | { 2437 | "id": "unit", 2438 | "value": "dateTimeAsLocal" 2439 | }, 2440 | { 2441 | "id": "custom.minWidth", 2442 | "value": 200 2443 | } 2444 | ] 2445 | }, 2446 | { 2447 | "matcher": { 2448 | "id": "byName", 2449 | "options": "Server Name" 2450 | }, 2451 | "properties": [ 2452 | { 2453 | "id": "custom.width", 2454 | "value": 200 2455 | } 2456 | ] 2457 | }, 2458 | { 2459 | "matcher": { 2460 | "id": "byName", 2461 | "options": "Download (Mbit/s)" 2462 | }, 2463 | "properties": [ 2464 | { 2465 | "id": "unit", 2466 | "value": "bps" 2467 | } 2468 | ] 2469 | }, 2470 | { 2471 | "matcher": { 2472 | "id": "byName", 2473 | "options": "Upload (Mbit/s)" 2474 | }, 2475 | "properties": [ 2476 | { 2477 | "id": "unit", 2478 | "value": "bps" 2479 | } 2480 | ] 2481 | }, 2482 | { 2483 | "matcher": { 2484 | "id": "byName", 2485 | "options": "Packet Loss" 2486 | }, 2487 | "properties": [ 2488 | { 2489 | "id": "unit", 2490 | "value": "percent" 2491 | } 2492 | ] 2493 | }, 2494 | { 2495 | "matcher": { 2496 | "id": "byName", 2497 | "options": "ID" 2498 | }, 2499 | "properties": [ 2500 | { 2501 | "id": "decimals" 2502 | }, 2503 | { 2504 | "id": "custom.minWidth", 2505 | "value": 90 2506 | } 2507 | ] 2508 | }, 2509 | { 2510 | "matcher": { 2511 | "id": "byName", 2512 | "options": "Server ID" 2513 | }, 2514 | "properties": [ 2515 | { 2516 | "id": "decimals" 2517 | }, 2518 | { 2519 | "id": "custom.width", 2520 | "value": 90 2521 | } 2522 | ] 2523 | }, 2524 | { 2525 | "matcher": { 2526 | "id": "byName", 2527 | "options": "Ping" 2528 | }, 2529 | "properties": [ 2530 | { 2531 | "id": "unit", 2532 | "value": "ms" 2533 | } 2534 | ] 2535 | }, 2536 | { 2537 | "matcher": { 2538 | "id": "byName", 2539 | "options": "Ping Jitter" 2540 | }, 2541 | "properties": [ 2542 | { 2543 | "id": "unit", 2544 | "value": "ms" 2545 | } 2546 | ] 2547 | }, 2548 | { 2549 | "matcher": { 2550 | "id": "byName", 2551 | "options": "Download Jitter" 2552 | }, 2553 | "properties": [ 2554 | { 2555 | "id": "unit", 2556 | "value": "ms" 2557 | } 2558 | ] 2559 | }, 2560 | { 2561 | "matcher": { 2562 | "id": "byName", 2563 | "options": "Upload Jitter" 2564 | }, 2565 | "properties": [ 2566 | { 2567 | "id": "unit", 2568 | "value": "ms" 2569 | } 2570 | ] 2571 | }, 2572 | { 2573 | "matcher": { 2574 | "id": "byName", 2575 | "options": "UL Latency IQM" 2576 | }, 2577 | "properties": [ 2578 | { 2579 | "id": "unit", 2580 | "value": "ms" 2581 | } 2582 | ] 2583 | }, 2584 | { 2585 | "matcher": { 2586 | "id": "byName", 2587 | "options": "DL Latency IQM" 2588 | }, 2589 | "properties": [ 2590 | { 2591 | "id": "unit", 2592 | "value": "ms" 2593 | } 2594 | ] 2595 | }, 2596 | { 2597 | "matcher": { 2598 | "id": "byName", 2599 | "options": "ISP" 2600 | }, 2601 | "properties": [ 2602 | { 2603 | "id": "custom.width", 2604 | "value": 200 2605 | } 2606 | ] 2607 | }, 2608 | { 2609 | "matcher": { 2610 | "id": "byName", 2611 | "options": "Service" 2612 | }, 2613 | "properties": [ 2614 | { 2615 | "id": "custom.width", 2616 | "value": 90 2617 | }, 2618 | { 2619 | "id": "mappings", 2620 | "value": [ 2621 | { 2622 | "options": { 2623 | "ookla": { 2624 | "index": 0, 2625 | "text": "Ookla" 2626 | } 2627 | }, 2628 | "type": "value" 2629 | } 2630 | ] 2631 | } 2632 | ] 2633 | }, 2634 | { 2635 | "matcher": { 2636 | "id": "byName", 2637 | "options": "Status" 2638 | }, 2639 | "properties": [ 2640 | { 2641 | "id": "mappings", 2642 | "value": [ 2643 | { 2644 | "options": { 2645 | "completed": { 2646 | "index": 0, 2647 | "text": "Completed" 2648 | } 2649 | }, 2650 | "type": "value" 2651 | } 2652 | ] 2653 | } 2654 | ] 2655 | } 2656 | ] 2657 | }, 2658 | "gridPos": { 2659 | "h": 7, 2660 | "w": 24, 2661 | "x": 0, 2662 | "y": 61 2663 | }, 2664 | "id": 121, 2665 | "options": { 2666 | "cellHeight": "sm", 2667 | "footer": { 2668 | "countRows": false, 2669 | "fields": "", 2670 | "reducer": [ 2671 | "sum" 2672 | ], 2673 | "show": false 2674 | }, 2675 | "frameIndex": 1, 2676 | "showHeader": true, 2677 | "sortBy": [ 2678 | { 2679 | "desc": true, 2680 | "displayName": "ID" 2681 | } 2682 | ] 2683 | }, 2684 | "pluginVersion": "11.4.0", 2685 | "targets": [ 2686 | { 2687 | "datasource": { 2688 | "type": "influxdb", 2689 | "uid": "${DS_INFLUXDBV2}" 2690 | }, 2691 | "hide": false, 2692 | "query": "from(bucket: \"${bucket}\")\r\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\r\n |> filter(fn: (r) => r[\"_measurement\"] == \"speedtest\")\r\n |> filter(fn: (r) => r[\"_field\"] == \"download\" or r[\"_field\"] == \"download_bits\" or r[\"_field\"] == \"download_jitter\" or r[\"_field\"] == \"id\" or r[\"_field\"] == \"packet_loss\" or r[\"_field\"] == \"ping\" or r[\"_field\"] == \"ping_jitter\" or r[\"_field\"] == \"scheduled\" or r[\"_field\"] == \"server_host\" or r[\"_field\"] == \"server_id\" or r[\"_field\"] == \"server_name\" or r[\"_field\"] == \"upload\" or r[\"_field\"] == \"upload_bits\" or r[\"_field\"] == \"upload_jitter\" or r[\"_field\"] == \"upload_latency_avg\" or r[\"_field\"] == \"download_latency_avg\")\r\n |> aggregateWindow(every: v.windowPeriod, fn: last, createEmpty: false)\r\n |> yield(name: \"last\")", 2693 | "refId": "A" 2694 | } 2695 | ], 2696 | "title": "All Tests", 2697 | "transformations": [ 2698 | { 2699 | "filter": { 2700 | "id": "byRefId", 2701 | "options": "" 2702 | }, 2703 | "id": "labelsToFields", 2704 | "options": { 2705 | "mode": "columns" 2706 | } 2707 | }, 2708 | { 2709 | "id": "merge", 2710 | "options": {} 2711 | }, 2712 | { 2713 | "id": "organize", 2714 | "options": { 2715 | "excludeByName": { 2716 | "app_name": true, 2717 | "download": true, 2718 | "healthy": true, 2719 | "result_id": true, 2720 | "scheduled": true, 2721 | "server_id": false, 2722 | "upload": true 2723 | }, 2724 | "includeByName": {}, 2725 | "indexByName": { 2726 | "Time": 1, 2727 | "app_name": 16, 2728 | "download": 2, 2729 | "download_bits": 7, 2730 | "download_jitter": 8, 2731 | "download_latency_avg": 14, 2732 | "external_ip": 19, 2733 | "healthy": 17, 2734 | "id": 0, 2735 | "isp": 18, 2736 | "packet_loss": 15, 2737 | "ping": 11, 2738 | "ping_jitter": 12, 2739 | "result_id": 20, 2740 | "scheduled": 4, 2741 | "server_country": 21, 2742 | "server_id": 6, 2743 | "server_location": 22, 2744 | "server_name": 5, 2745 | "service": 23, 2746 | "status": 24, 2747 | "upload": 3, 2748 | "upload_bits": 9, 2749 | "upload_jitter": 10, 2750 | "upload_latency_avg": 13 2751 | }, 2752 | "renameByName": { 2753 | "Time": "Time", 2754 | "download": "", 2755 | "download_bits": "Download (Mbit/s)", 2756 | "download_jitter": "Download Jitter", 2757 | "download_latency_avg": "DL Latency IQM", 2758 | "external_ip": "IP", 2759 | "id": "ID", 2760 | "id {host=\"speedtest\", name=\"speedtest\"}": "", 2761 | "isp": "ISP", 2762 | "packet_loss": "Packet Loss", 2763 | "ping": "Ping", 2764 | "ping_jitter": "Ping Jitter", 2765 | "result_id": "", 2766 | "scheduled": "", 2767 | "server_country": "Server Country", 2768 | "server_host": "Server Host", 2769 | "server_id": "Server ID", 2770 | "server_location": "Server Location", 2771 | "server_name": "Server Name", 2772 | "service": "Service", 2773 | "status": "Status", 2774 | "upload": "", 2775 | "upload_bits": "Upload (Mbit/s)", 2776 | "upload_jitter": "Upload Jitter", 2777 | "upload_latency_avg": "UL Latency IQM" 2778 | } 2779 | } 2780 | } 2781 | ], 2782 | "type": "table" 2783 | } 2784 | ], 2785 | "refresh": "5m", 2786 | "schemaVersion": 40, 2787 | "tags": [ 2788 | "speedtest tracker", 2789 | "speedtest", 2790 | "influxdbv2", 2791 | "Flux" 2792 | ], 2793 | "templating": { 2794 | "list": [ 2795 | { 2796 | "current": { 2797 | "text": "speedtest-tracker", 2798 | "value": "speedtest-tracker" 2799 | }, 2800 | "description": "InfluxDBv2 bucket", 2801 | "includeAll": false, 2802 | "label": "SpeedTest Tracker", 2803 | "name": "bucket", 2804 | "options": [ 2805 | { 2806 | "selected": true, 2807 | "text": "speedtest-tracker", 2808 | "value": "speedtest-tracker" 2809 | } 2810 | ], 2811 | "query": "speedtest-tracker", 2812 | "type": "custom" 2813 | } 2814 | ] 2815 | }, 2816 | "time": { 2817 | "from": "now-3h", 2818 | "to": "now" 2819 | }, 2820 | "timepicker": { 2821 | "refresh_intervals": [ 2822 | "5s", 2823 | "10s", 2824 | "15s", 2825 | "30s", 2826 | "1m", 2827 | "5m", 2828 | "15m", 2829 | "30m", 2830 | "1h", 2831 | "2h", 2832 | "1d" 2833 | ] 2834 | }, 2835 | "timezone": "", 2836 | "title": "Speedtest Tracker v2 - InfluxDBv2", 2837 | "uid": "g7QsvEtVk", 2838 | "version": 86, 2839 | "weekStart": "" 2840 | } 2841 | --------------------------------------------------------------------------------