├── .env.sample ├── .gitignore ├── LICENSE ├── README.md ├── docker-compose.yml ├── fa-grafana-graphs.png ├── fa-grafana-system-metrics.png ├── grafana ├── dashboards │ ├── adsb-dashboard.json │ └── system-information.json ├── grafana.ini └── provisioning │ ├── dashboards │ └── dashboards.yml │ └── datasources │ └── datasources.yml ├── install.sh └── prometheus └── prometheus.yml /.env.sample: -------------------------------------------------------------------------------- 1 | # This file contains environment variables referenced in the docker-compose.yml 2 | 3 | # Set HOST_IP to your Pi's local IP (no quotes) 4 | HOST_IP= 5 | 6 | ######## Grafana Settings - configurable settings ######### 7 | 8 | # enable/disable login 9 | DISABLE_LOGIN=false 10 | 11 | # default Grafana port 12 | GRAFANA_PORT=3000 13 | 14 | # username and password 15 | GRAFANA_USERNAME=admin 16 | GRAFANA_PASSWORD=flightaware 17 | 18 | # light or dark mode 19 | GRAFANA_THEME=dark 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .env 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 FlightAware 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # fa-grafana 2 | Suite of Grafana dashboards for PiAware 3 | 4 | This is a multi-container Docker application that runs Grafana, Prometheus, and the Prometheus exporter containers below to monitor your PiAware's flight tracking and system health 5 | - [Claws's dump1090-exporter](https://github.com/claws/dump1090-exporter) 6 | - [piaware_exporter](https://github.com/flightaware/piaware-exporter) 7 | - [node_exporter](https://github.com/prometheus/node_exporter) 8 | 9 | 10 | ### **Minimum System Requirements:** 11 | - Raspberry Pi 3B+ or Pi 4 12 | - Raspberry Pi Zero 2 W 13 | 14 | The docker containers used in this application are built for ARMv7 CPU architectures. 15 | 16 | ![Image of fa-grafana](https://github.com/flightaware/fa-grafana/blob/master/fa-grafana-graphs.png) 17 | 18 | ![Image of fa-grafana](https://github.com/flightaware/fa-grafana/blob/master/fa-grafana-system-metrics.png) 19 | 20 | 21 | ## Setup ## 22 |
23 | 24 | New Installations 25 | 26 |
27 | These steps will install required dependencies, pull all the Docker images from Docker Hub, and start up the containers 28 | 29 | #### 1. Install pre-requisite programs: 30 | 31 | Convenient script to install git, docker compose, and docker. 32 | 33 | ``` 34 | sudo bash -c "$(curl -sS https://raw.githubusercontent.com/flightaware/fa-grafana/master/install.sh)" 35 | ``` 36 | 37 | #### 2. Checkout the fa-grafana git repository and cd into the directory 38 | 39 | ``` 40 | git clone https://github.com/flightaware/fa-grafana.git 41 | cd fa-grafana 42 | ``` 43 | 44 | #### 3. Rename the .env.sample file to .env 45 | 46 | ``` 47 | mv .env.sample .env 48 | ``` 49 | 50 | #### 4. Set the HOST_IP to your Pi's local IP address (required) and set other Grafana configuration if desired 51 | 52 | ``` 53 | nano .env 54 | HOST_IP= 55 | ``` 56 | 57 | #### 5. Start up containers 58 | 59 | ``` 60 | sudo docker compose up -d 61 | ``` 62 | 63 | #### 6. Open Grafana in a web browser by entering your Pi's local IP address and the configured Grafana port number 64 | ``` 65 | :3000 66 | ``` 67 | 68 |
69 | 70 | 71 |
72 | 73 | Updating Existing Installations 74 | 75 |
76 | These steps will stop the running fa-grafana containers, pull the latest images from Docker Hub, clean up volumes, and start up the new containers 77 | 78 | #### 1. Stop fa-grafana docker containers 79 | ``` 80 | cd fa-grafana 81 | sudo docker compose down 82 | ``` 83 | #### 2. Pull latest source code 84 | ``` 85 | git pull 86 | ``` 87 | #### 3. Make sure the .env file has HOST_IP and other configuration variables set. Rename the provided .env.sample file to .env if needed.
88 | 89 | #### 4. Delete existing fa-grafana_grafana_data Docker volume 90 | ``` 91 | sudo docker volume rm fa-grafana_grafana_data 92 | ``` 93 | #### 5. Start up containers 94 | ``` 95 | sudo docker compose up -d 96 | ``` 97 | 98 | 99 |
100 | 101 | ## Configuration 102 | 103 | You configure the Grafana interface using the .env file shown below. This is what Grafana will use when you start its container. 104 | 105 | ``` 106 | # This file contains environment variables referenced in the docker-compose.yml 107 | 108 | # Set HOST_IP to your Pi's local IP (no quotes) 109 | HOST_IP= 110 | 111 | ######## Grafana Settings - configurable settings ######### 112 | 113 | # enable/disable login 114 | DISABLE_LOGIN=false 115 | 116 | # default Grafana port 117 | GRAFANA_PORT=3000 118 | 119 | # username and password 120 | GRAFANA_USERNAME=admin 121 | GRAFANA_PASSWORD=flightaware 122 | 123 | # light or dark mode 124 | GRAFANA_THEME=dark 125 | ``` 126 | 127 | 128 | ## Reference ## 129 | 130 | 131 | 132 |
133 | Cleaning up unused Docker images to free up disk space 134 |
135 | 136 | ``` 137 | sudo docker image prune -a 138 | ``` 139 |
140 | 141 | 142 |
143 | 144 | Useful Docker commands 145 | 146 | #### To stop all Docker containers, cd into the fa-grafana directory and use the following command: 147 | ``` 148 | sudo docker compose down 149 | ``` 150 | #### List all running Docker containers 151 | ``` 152 | sudo docker ps 153 | ``` 154 | #### List all Docker images installed 155 | ``` 156 | sudo docker images 157 | ``` 158 | #### Delete a Docker image 159 | ``` 160 | sudo docker rmi 161 | ``` 162 | 163 | #### Delete unused and dangling Docker images 164 | ``` 165 | sudo docker image prune -a 166 | ``` 167 | 168 | 169 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | volumes: 4 | prometheus_data: {} 5 | grafana_data: {} 6 | 7 | services: 8 | 9 | dump1090exporter: 10 | container_name: dump1090exporter 11 | image: flightawareadsb/dump1090exporter:2.0 12 | ports: 13 | - "9105:9105" 14 | restart: always 15 | stop_signal: SIGINT 16 | command: [ 17 | "--resource-path=http://${HOST_IP:?IP_ADDRESS_UNSET_ERROR}:8080/data", 18 | ] 19 | 20 | prometheus: 21 | container_name: prometheus 22 | image: prom/prometheus 23 | depends_on: 24 | - dump1090exporter 25 | volumes: 26 | - ./prometheus/:/etc/prometheus/ 27 | - prometheus_data:/prometheus 28 | command: [ 29 | "--config.file=/etc/prometheus/prometheus.yml", 30 | "--web.listen-address=:9090" 31 | ] 32 | ports: 33 | - 9090:9090 34 | restart: always 35 | 36 | grafana: 37 | container_name: grafana 38 | image: grafana/grafana:8.4.3-armv7 39 | volumes: 40 | - ./grafana/provisioning/:/etc/grafana/provisioning/ 41 | - ./grafana/dashboards/:/var/lib/grafana/dashboards/ 42 | - ./grafana/grafana.ini:/etc/grafana/grafana.ini 43 | - grafana_data:/var/lib/grafana 44 | depends_on: 45 | - prometheus 46 | ports: 47 | - ${GRAFANA_PORT}:${GRAFANA_PORT} 48 | restart: always 49 | environment: 50 | - GF_AUTH_ANONYMOUS_ENABLED=${DISABLE_LOGIN} 51 | - GF_SECURITY_ADMIN_USER=${GRAFANA_USERNAME} 52 | - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD} 53 | - GF_USERS_DEFAULT_THEME=${GRAFANA_THEME} 54 | - GF_SERVER_GRAFANA_PORT=${GRAFANA_PORT} 55 | 56 | node-exporter: 57 | container_name: node_exporter 58 | image: quay.io/prometheus/node-exporter:latest 59 | command: [ 60 | "--path.rootfs=/host", 61 | "--web.listen-address=:9100", 62 | ] 63 | ports: 64 | - 9100:9100 65 | volumes: 66 | - "/:/host:ro,rslave" 67 | restart: always 68 | 69 | piaware-exporter: 70 | container_name: piaware_exporter 71 | image: flightawareadsb/piaware_exporter:1.0 72 | ports: 73 | - 9101:9101 74 | restart: always 75 | command: [ 76 | "--piaware_host", 77 | "${HOST_IP}" 78 | ] -------------------------------------------------------------------------------- /fa-grafana-graphs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/fa-grafana/9dcfe71f42374b17092ed97b657738ecb4d2388e/fa-grafana-graphs.png -------------------------------------------------------------------------------- /fa-grafana-system-metrics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/fa-grafana/9dcfe71f42374b17092ed97b657738ecb4d2388e/fa-grafana-system-metrics.png -------------------------------------------------------------------------------- /grafana/dashboards/adsb-dashboard.json: -------------------------------------------------------------------------------- 1 | { 2 | "annotations": { 3 | "list": [ 4 | { 5 | "builtIn": 1, 6 | "datasource": "-- Grafana --", 7 | "enable": true, 8 | "hide": true, 9 | "iconColor": "rgba(0, 211, 255, 1)", 10 | "name": "Annotations & Alerts", 11 | "target": { 12 | "limit": 100, 13 | "matchAny": false, 14 | "tags": [], 15 | "type": "dashboard" 16 | }, 17 | "type": "dashboard" 18 | } 19 | ] 20 | }, 21 | "editable": true, 22 | "fiscalYearStartMonth": 0, 23 | "graphTooltip": 0, 24 | "id": 1, 25 | "links": [], 26 | "liveNow": false, 27 | "panels": [ 28 | { 29 | "gridPos": { 30 | "h": 1, 31 | "w": 24, 32 | "x": 0, 33 | "y": 0 34 | }, 35 | "id": 34, 36 | "title": "PiAware Status", 37 | "type": "row" 38 | }, 39 | { 40 | "datasource": { 41 | "type": "prometheus", 42 | "uid": "P1809F7CD0C75ACF3" 43 | }, 44 | "fieldConfig": { 45 | "defaults": { 46 | "color": { 47 | "mode": "thresholds" 48 | }, 49 | "mappings": [ 50 | { 51 | "options": { 52 | "None": { 53 | "index": 0, 54 | "text": "Test" 55 | } 56 | }, 57 | "type": "value" 58 | } 59 | ], 60 | "thresholds": { 61 | "mode": "absolute", 62 | "steps": [ 63 | { 64 | "color": "transparent", 65 | "value": null 66 | } 67 | ] 68 | } 69 | }, 70 | "overrides": [ 71 | { 72 | "matcher": { 73 | "id": "byRegexp", 74 | "options": "red" 75 | }, 76 | "properties": [ 77 | { 78 | "id": "displayName", 79 | "value": "PiAware" 80 | }, 81 | { 82 | "id": "color", 83 | "value": { 84 | "fixedColor": "red", 85 | "mode": "fixed" 86 | } 87 | } 88 | ] 89 | }, 90 | { 91 | "matcher": { 92 | "id": "byRegexp", 93 | "options": "green" 94 | }, 95 | "properties": [ 96 | { 97 | "id": "displayName", 98 | "value": "PiAware" 99 | }, 100 | { 101 | "id": "color", 102 | "value": { 103 | "fixedColor": "green", 104 | "mode": "fixed" 105 | } 106 | } 107 | ] 108 | }, 109 | { 110 | "matcher": { 111 | "id": "byRegexp", 112 | "options": "amber" 113 | }, 114 | "properties": [ 115 | { 116 | "id": "displayName", 117 | "value": "PiAware" 118 | }, 119 | { 120 | "id": "color", 121 | "value": { 122 | "fixedColor": "yellow", 123 | "mode": "fixed" 124 | } 125 | } 126 | ] 127 | }, 128 | { 129 | "matcher": { 130 | "id": "byRegexp", 131 | "options": "N/A" 132 | }, 133 | "properties": [ 134 | { 135 | "id": "displayName", 136 | "value": "PiAware" 137 | }, 138 | { 139 | "id": "color", 140 | "value": { 141 | "mode": "fixed" 142 | } 143 | } 144 | ] 145 | }, 146 | { 147 | "matcher": { 148 | "id": "byRegexp", 149 | "options": "" 150 | }, 151 | "properties": [ 152 | { 153 | "id": "displayName", 154 | "value": "N/A" 155 | }, 156 | { 157 | "id": "color", 158 | "value": { 159 | "mode": "fixed" 160 | } 161 | } 162 | ] 163 | } 164 | ] 165 | }, 166 | "gridPos": { 167 | "h": 3, 168 | "w": 6, 169 | "x": 0, 170 | "y": 1 171 | }, 172 | "id": 36, 173 | "options": { 174 | "colorMode": "background", 175 | "graphMode": "none", 176 | "justifyMode": "auto", 177 | "orientation": "auto", 178 | "reduceOptions": { 179 | "calcs": [ 180 | "lastNotNull" 181 | ], 182 | "fields": "", 183 | "values": false 184 | }, 185 | "text": { 186 | "valueSize": 50 187 | }, 188 | "textMode": "name" 189 | }, 190 | "pluginVersion": "8.4.3", 191 | "targets": [ 192 | { 193 | "datasource": { 194 | "type": "prometheus", 195 | "uid": "P1809F7CD0C75ACF3" 196 | }, 197 | "exemplar": false, 198 | "expr": "piaware_service_state{job=\"piaware_exporter\"} == 1", 199 | "instant": true, 200 | "interval": "", 201 | "legendFormat": "{{piaware_service_state}}", 202 | "refId": "A" 203 | } 204 | ], 205 | "type": "stat" 206 | }, 207 | { 208 | "datasource": { 209 | "type": "prometheus", 210 | "uid": "P1809F7CD0C75ACF3" 211 | }, 212 | "fieldConfig": { 213 | "defaults": { 214 | "color": { 215 | "mode": "thresholds" 216 | }, 217 | "mappings": [], 218 | "thresholds": { 219 | "mode": "absolute", 220 | "steps": [ 221 | { 222 | "color": "transparent", 223 | "value": null 224 | } 225 | ] 226 | } 227 | }, 228 | "overrides": [ 229 | { 230 | "matcher": { 231 | "id": "byRegexp", 232 | "options": "green" 233 | }, 234 | "properties": [ 235 | { 236 | "id": "displayName", 237 | "value": "Radio" 238 | }, 239 | { 240 | "id": "color", 241 | "value": { 242 | "fixedColor": "green", 243 | "mode": "fixed" 244 | } 245 | } 246 | ] 247 | }, 248 | { 249 | "matcher": { 250 | "id": "byRegexp", 251 | "options": "red" 252 | }, 253 | "properties": [ 254 | { 255 | "id": "color", 256 | "value": { 257 | "fixedColor": "red", 258 | "mode": "fixed" 259 | } 260 | }, 261 | { 262 | "id": "displayName", 263 | "value": "Radio" 264 | } 265 | ] 266 | }, 267 | { 268 | "matcher": { 269 | "id": "byRegexp", 270 | "options": "amber" 271 | }, 272 | "properties": [ 273 | { 274 | "id": "color", 275 | "value": { 276 | "fixedColor": "yellow", 277 | "mode": "fixed" 278 | } 279 | }, 280 | { 281 | "id": "displayName", 282 | "value": "Radio" 283 | } 284 | ] 285 | }, 286 | { 287 | "matcher": { 288 | "id": "byRegexp", 289 | "options": "N/A" 290 | }, 291 | "properties": [ 292 | { 293 | "id": "displayName", 294 | "value": "Radio" 295 | }, 296 | { 297 | "id": "color", 298 | "value": { 299 | "mode": "fixed" 300 | } 301 | } 302 | ] 303 | } 304 | ] 305 | }, 306 | "gridPos": { 307 | "h": 3, 308 | "w": 6, 309 | "x": 6, 310 | "y": 1 311 | }, 312 | "id": 38, 313 | "options": { 314 | "colorMode": "background", 315 | "graphMode": "none", 316 | "justifyMode": "auto", 317 | "orientation": "auto", 318 | "reduceOptions": { 319 | "calcs": [ 320 | "lastNotNull" 321 | ], 322 | "fields": "", 323 | "values": false 324 | }, 325 | "text": { 326 | "valueSize": 50 327 | }, 328 | "textMode": "name" 329 | }, 330 | "pluginVersion": "8.4.3", 331 | "targets": [ 332 | { 333 | "datasource": { 334 | "type": "prometheus", 335 | "uid": "P1809F7CD0C75ACF3" 336 | }, 337 | "exemplar": false, 338 | "expr": "piaware_radio_state{job=\"piaware_exporter\"} == 1", 339 | "instant": true, 340 | "interval": "", 341 | "legendFormat": "{{piaware_radio_state}}", 342 | "refId": "A" 343 | } 344 | ], 345 | "type": "stat" 346 | }, 347 | { 348 | "datasource": { 349 | "type": "prometheus", 350 | "uid": "P1809F7CD0C75ACF3" 351 | }, 352 | "fieldConfig": { 353 | "defaults": { 354 | "color": { 355 | "mode": "thresholds" 356 | }, 357 | "mappings": [], 358 | "thresholds": { 359 | "mode": "absolute", 360 | "steps": [ 361 | { 362 | "color": "transparent", 363 | "value": null 364 | } 365 | ] 366 | } 367 | }, 368 | "overrides": [ 369 | { 370 | "matcher": { 371 | "id": "byRegexp", 372 | "options": "green" 373 | }, 374 | "properties": [ 375 | { 376 | "id": "displayName", 377 | "value": "FlightAware" 378 | }, 379 | { 380 | "id": "color", 381 | "value": { 382 | "fixedColor": "green", 383 | "mode": "fixed" 384 | } 385 | } 386 | ] 387 | }, 388 | { 389 | "matcher": { 390 | "id": "byRegexp", 391 | "options": "red" 392 | }, 393 | "properties": [ 394 | { 395 | "id": "displayName", 396 | "value": "FlightAware" 397 | }, 398 | { 399 | "id": "color", 400 | "value": { 401 | "fixedColor": "red", 402 | "mode": "fixed" 403 | } 404 | } 405 | ] 406 | }, 407 | { 408 | "matcher": { 409 | "id": "byRegexp", 410 | "options": "amber" 411 | }, 412 | "properties": [ 413 | { 414 | "id": "displayName", 415 | "value": "FlightAware" 416 | }, 417 | { 418 | "id": "color", 419 | "value": { 420 | "fixedColor": "yellow", 421 | "mode": "fixed" 422 | } 423 | } 424 | ] 425 | }, 426 | { 427 | "matcher": { 428 | "id": "byRegexp", 429 | "options": "N/A" 430 | }, 431 | "properties": [ 432 | { 433 | "id": "displayName", 434 | "value": "FlightAware" 435 | }, 436 | { 437 | "id": "color", 438 | "value": { 439 | "mode": "fixed" 440 | } 441 | } 442 | ] 443 | } 444 | ] 445 | }, 446 | "gridPos": { 447 | "h": 3, 448 | "w": 6, 449 | "x": 12, 450 | "y": 1 451 | }, 452 | "id": 40, 453 | "options": { 454 | "colorMode": "background", 455 | "graphMode": "none", 456 | "justifyMode": "auto", 457 | "orientation": "auto", 458 | "reduceOptions": { 459 | "calcs": [ 460 | "lastNotNull" 461 | ], 462 | "fields": "", 463 | "values": false 464 | }, 465 | "text": { 466 | "valueSize": 50 467 | }, 468 | "textMode": "name" 469 | }, 470 | "pluginVersion": "8.4.3", 471 | "targets": [ 472 | { 473 | "datasource": { 474 | "type": "prometheus", 475 | "uid": "P1809F7CD0C75ACF3" 476 | }, 477 | "exemplar": false, 478 | "expr": "piaware_connect_to_flightaware_state{job=\"piaware_exporter\"} == 1", 479 | "instant": true, 480 | "interval": "", 481 | "legendFormat": "{{piaware_connect_to_flightaware_state}}", 482 | "refId": "A" 483 | } 484 | ], 485 | "type": "stat" 486 | }, 487 | { 488 | "datasource": { 489 | "type": "prometheus", 490 | "uid": "P1809F7CD0C75ACF3" 491 | }, 492 | "fieldConfig": { 493 | "defaults": { 494 | "color": { 495 | "mode": "thresholds" 496 | }, 497 | "mappings": [], 498 | "thresholds": { 499 | "mode": "absolute", 500 | "steps": [ 501 | { 502 | "color": "transparent", 503 | "value": null 504 | } 505 | ] 506 | } 507 | }, 508 | "overrides": [ 509 | { 510 | "matcher": { 511 | "id": "byRegexp", 512 | "options": "green" 513 | }, 514 | "properties": [ 515 | { 516 | "id": "color", 517 | "value": { 518 | "fixedColor": "green", 519 | "mode": "fixed" 520 | } 521 | }, 522 | { 523 | "id": "displayName", 524 | "value": "MLAT" 525 | } 526 | ] 527 | }, 528 | { 529 | "matcher": { 530 | "id": "byRegexp", 531 | "options": "red" 532 | }, 533 | "properties": [ 534 | { 535 | "id": "displayName", 536 | "value": "MLAT" 537 | }, 538 | { 539 | "id": "color", 540 | "value": { 541 | "fixedColor": "red", 542 | "mode": "fixed" 543 | } 544 | } 545 | ] 546 | }, 547 | { 548 | "matcher": { 549 | "id": "byRegexp", 550 | "options": "amber" 551 | }, 552 | "properties": [ 553 | { 554 | "id": "displayName", 555 | "value": "MLAT" 556 | }, 557 | { 558 | "id": "color", 559 | "value": { 560 | "fixedColor": "yellow", 561 | "mode": "fixed" 562 | } 563 | } 564 | ] 565 | }, 566 | { 567 | "matcher": { 568 | "id": "byRegexp", 569 | "options": "N/A" 570 | }, 571 | "properties": [ 572 | { 573 | "id": "displayName", 574 | "value": "MLAT" 575 | }, 576 | { 577 | "id": "color", 578 | "value": { 579 | "mode": "fixed" 580 | } 581 | } 582 | ] 583 | } 584 | ] 585 | }, 586 | "gridPos": { 587 | "h": 3, 588 | "w": 6, 589 | "x": 18, 590 | "y": 1 591 | }, 592 | "id": 42, 593 | "options": { 594 | "colorMode": "background", 595 | "graphMode": "area", 596 | "justifyMode": "center", 597 | "orientation": "auto", 598 | "reduceOptions": { 599 | "calcs": [ 600 | "lastNotNull" 601 | ], 602 | "fields": "", 603 | "values": false 604 | }, 605 | "text": { 606 | "valueSize": 50 607 | }, 608 | "textMode": "name" 609 | }, 610 | "pluginVersion": "8.4.3", 611 | "targets": [ 612 | { 613 | "datasource": { 614 | "type": "prometheus", 615 | "uid": "P1809F7CD0C75ACF3" 616 | }, 617 | "exemplar": false, 618 | "expr": "piaware_mlat_state{job=\"piaware_exporter\"} == 1", 619 | "instant": true, 620 | "interval": "", 621 | "legendFormat": "{{piaware_mlat_state}}", 622 | "refId": "A" 623 | } 624 | ], 625 | "type": "stat" 626 | }, 627 | { 628 | "collapsed": false, 629 | "gridPos": { 630 | "h": 1, 631 | "w": 24, 632 | "x": 0, 633 | "y": 4 634 | }, 635 | "id": 22, 636 | "panels": [], 637 | "title": "Current dump1090-fa Aircraft Tracking", 638 | "type": "row" 639 | }, 640 | { 641 | "datasource": { 642 | "type": "prometheus", 643 | "uid": "P1809F7CD0C75ACF3" 644 | }, 645 | "fieldConfig": { 646 | "defaults": { 647 | "color": { 648 | "mode": "thresholds" 649 | }, 650 | "decimals": 0, 651 | "mappings": [ 652 | { 653 | "options": { 654 | "match": "null", 655 | "result": { 656 | "text": "N/A" 657 | } 658 | }, 659 | "type": "special" 660 | } 661 | ], 662 | "thresholds": { 663 | "mode": "absolute", 664 | "steps": [ 665 | { 666 | "color": "green", 667 | "value": null 668 | }, 669 | { 670 | "color": "red", 671 | "value": 80 672 | } 673 | ] 674 | }, 675 | "unit": "none" 676 | }, 677 | "overrides": [] 678 | }, 679 | "gridPos": { 680 | "h": 3, 681 | "w": 4, 682 | "x": 0, 683 | "y": 5 684 | }, 685 | "hideTimeOverride": false, 686 | "id": 24, 687 | "interval": "5s", 688 | "links": [], 689 | "maxDataPoints": 100, 690 | "options": { 691 | "colorMode": "none", 692 | "graphMode": "none", 693 | "justifyMode": "auto", 694 | "orientation": "horizontal", 695 | "reduceOptions": { 696 | "calcs": [ 697 | "mean" 698 | ], 699 | "fields": "", 700 | "values": false 701 | }, 702 | "textMode": "auto" 703 | }, 704 | "pluginVersion": "8.4.3", 705 | "targets": [ 706 | { 707 | "datasource": { 708 | "type": "prometheus", 709 | "uid": "P1809F7CD0C75ACF3" 710 | }, 711 | "exemplar": true, 712 | "expr": "dump1090_recent_aircraft_observed{job=\"dump1090\", time_period=\"latest\"}", 713 | "instant": false, 714 | "interval": "", 715 | "intervalFactor": 2, 716 | "legendFormat": "", 717 | "refId": "A" 718 | } 719 | ], 720 | "timeFrom": "1s", 721 | "title": "Current Aircraft Total", 722 | "type": "stat" 723 | }, 724 | { 725 | "datasource": { 726 | "type": "prometheus", 727 | "uid": "P1809F7CD0C75ACF3" 728 | }, 729 | "fieldConfig": { 730 | "defaults": { 731 | "color": { 732 | "mode": "thresholds" 733 | }, 734 | "decimals": 0, 735 | "mappings": [ 736 | { 737 | "options": { 738 | "match": "null", 739 | "result": { 740 | "text": "N/A" 741 | } 742 | }, 743 | "type": "special" 744 | } 745 | ], 746 | "thresholds": { 747 | "mode": "absolute", 748 | "steps": [ 749 | { 750 | "color": "green", 751 | "value": null 752 | }, 753 | { 754 | "color": "red", 755 | "value": 80 756 | } 757 | ] 758 | }, 759 | "unit": "none" 760 | }, 761 | "overrides": [] 762 | }, 763 | "gridPos": { 764 | "h": 3, 765 | "w": 4, 766 | "x": 4, 767 | "y": 5 768 | }, 769 | "hideTimeOverride": false, 770 | "id": 25, 771 | "interval": "5s", 772 | "links": [], 773 | "maxDataPoints": 100, 774 | "options": { 775 | "colorMode": "none", 776 | "graphMode": "none", 777 | "justifyMode": "auto", 778 | "orientation": "horizontal", 779 | "reduceOptions": { 780 | "calcs": [ 781 | "mean" 782 | ], 783 | "fields": "", 784 | "values": false 785 | }, 786 | "textMode": "auto" 787 | }, 788 | "pluginVersion": "8.4.3", 789 | "targets": [ 790 | { 791 | "expr": "dump1090_recent_aircraft_with_position{job=\"dump1090\", time_period=\"latest\"}", 792 | "interval": "", 793 | "intervalFactor": 2, 794 | "legendFormat": "", 795 | "refId": "A" 796 | } 797 | ], 798 | "timeFrom": "1s", 799 | "title": "Aircraft W/ Position", 800 | "type": "stat" 801 | }, 802 | { 803 | "datasource": { 804 | "type": "prometheus", 805 | "uid": "P1809F7CD0C75ACF3" 806 | }, 807 | "fieldConfig": { 808 | "defaults": { 809 | "color": { 810 | "mode": "thresholds" 811 | }, 812 | "decimals": 1, 813 | "mappings": [ 814 | { 815 | "options": { 816 | "match": "null", 817 | "result": { 818 | "text": "N/A" 819 | } 820 | }, 821 | "type": "special" 822 | } 823 | ], 824 | "thresholds": { 825 | "mode": "absolute", 826 | "steps": [ 827 | { 828 | "color": "green", 829 | "value": null 830 | }, 831 | { 832 | "color": "red", 833 | "value": 80 834 | } 835 | ] 836 | }, 837 | "unit": "NM" 838 | }, 839 | "overrides": [] 840 | }, 841 | "gridPos": { 842 | "h": 3, 843 | "w": 4, 844 | "x": 8, 845 | "y": 5 846 | }, 847 | "hideTimeOverride": false, 848 | "id": 26, 849 | "interval": "5s", 850 | "links": [], 851 | "maxDataPoints": 100, 852 | "options": { 853 | "colorMode": "none", 854 | "graphMode": "none", 855 | "justifyMode": "auto", 856 | "orientation": "horizontal", 857 | "reduceOptions": { 858 | "calcs": [ 859 | "mean" 860 | ], 861 | "fields": "", 862 | "values": false 863 | }, 864 | "textMode": "auto" 865 | }, 866 | "pluginVersion": "8.4.3", 867 | "targets": [ 868 | { 869 | "expr": "dump1090_recent_aircraft_max_range{job=\"dump1090\", time_period=\"latest\"} / 1852", 870 | "interval": "", 871 | "intervalFactor": 2, 872 | "legendFormat": "", 873 | "refId": "A" 874 | } 875 | ], 876 | "timeFrom": "1s", 877 | "title": "Maximum Range", 878 | "type": "stat" 879 | }, 880 | { 881 | "datasource": { 882 | "type": "prometheus", 883 | "uid": "P1809F7CD0C75ACF3" 884 | }, 885 | "fieldConfig": { 886 | "defaults": { 887 | "color": { 888 | "mode": "thresholds" 889 | }, 890 | "mappings": [ 891 | { 892 | "options": { 893 | "match": "null", 894 | "result": { 895 | "text": "N/A" 896 | } 897 | }, 898 | "type": "special" 899 | } 900 | ], 901 | "thresholds": { 902 | "mode": "absolute", 903 | "steps": [ 904 | { 905 | "color": "green", 906 | "value": null 907 | }, 908 | { 909 | "color": "red", 910 | "value": 80 911 | } 912 | ] 913 | }, 914 | "unit": "none" 915 | }, 916 | "overrides": [] 917 | }, 918 | "gridPos": { 919 | "h": 3, 920 | "w": 4, 921 | "x": 12, 922 | "y": 5 923 | }, 924 | "hideTimeOverride": false, 925 | "id": 27, 926 | "interval": "5s", 927 | "links": [], 928 | "maxDataPoints": 100, 929 | "options": { 930 | "colorMode": "none", 931 | "graphMode": "none", 932 | "justifyMode": "auto", 933 | "orientation": "horizontal", 934 | "reduceOptions": { 935 | "calcs": [ 936 | "mean" 937 | ], 938 | "fields": "", 939 | "values": false 940 | }, 941 | "textMode": "auto" 942 | }, 943 | "pluginVersion": "8.4.3", 944 | "targets": [ 945 | { 946 | "datasource": { 947 | "type": "prometheus", 948 | "uid": "P1809F7CD0C75ACF3" 949 | }, 950 | "exemplar": true, 951 | "expr": "rate(dump1090_messages_total{job=\"dump1090\", time_period=\"latest\"}[1m])", 952 | "interval": "", 953 | "intervalFactor": 2, 954 | "legendFormat": "", 955 | "refId": "A" 956 | } 957 | ], 958 | "timeFrom": "1s", 959 | "title": "Messages Received / Second", 960 | "type": "stat" 961 | }, 962 | { 963 | "datasource": { 964 | "type": "prometheus", 965 | "uid": "P1809F7CD0C75ACF3" 966 | }, 967 | "fieldConfig": { 968 | "defaults": { 969 | "color": { 970 | "mode": "thresholds" 971 | }, 972 | "mappings": [ 973 | { 974 | "options": { 975 | "match": "null", 976 | "result": { 977 | "text": "N/A" 978 | } 979 | }, 980 | "type": "special" 981 | } 982 | ], 983 | "thresholds": { 984 | "mode": "absolute", 985 | "steps": [ 986 | { 987 | "color": "green", 988 | "value": null 989 | }, 990 | { 991 | "color": "red", 992 | "value": 80 993 | } 994 | ] 995 | }, 996 | "unit": "dbFS" 997 | }, 998 | "overrides": [] 999 | }, 1000 | "gridPos": { 1001 | "h": 3, 1002 | "w": 4, 1003 | "x": 16, 1004 | "y": 5 1005 | }, 1006 | "id": 29, 1007 | "interval": "5s", 1008 | "links": [], 1009 | "maxDataPoints": 100, 1010 | "options": { 1011 | "colorMode": "none", 1012 | "graphMode": "none", 1013 | "justifyMode": "auto", 1014 | "orientation": "horizontal", 1015 | "reduceOptions": { 1016 | "calcs": [ 1017 | "mean" 1018 | ], 1019 | "fields": "", 1020 | "values": false 1021 | }, 1022 | "textMode": "auto" 1023 | }, 1024 | "pluginVersion": "8.4.3", 1025 | "targets": [ 1026 | { 1027 | "expr": "dump1090_stats_local_peak_signal_strength_dbFS{job=\"dump1090\", time_period=\"last1min\"}", 1028 | "interval": "", 1029 | "intervalFactor": 2, 1030 | "legendFormat": "", 1031 | "refId": "A" 1032 | } 1033 | ], 1034 | "timeFrom": "1s", 1035 | "title": "Signal Peak", 1036 | "type": "stat" 1037 | }, 1038 | { 1039 | "datasource": { 1040 | "type": "prometheus", 1041 | "uid": "P1809F7CD0C75ACF3" 1042 | }, 1043 | "fieldConfig": { 1044 | "defaults": { 1045 | "color": { 1046 | "mode": "thresholds" 1047 | }, 1048 | "mappings": [ 1049 | { 1050 | "options": { 1051 | "match": "null", 1052 | "result": { 1053 | "text": "N/A" 1054 | } 1055 | }, 1056 | "type": "special" 1057 | } 1058 | ], 1059 | "thresholds": { 1060 | "mode": "absolute", 1061 | "steps": [ 1062 | { 1063 | "color": "green", 1064 | "value": null 1065 | }, 1066 | { 1067 | "color": "red", 1068 | "value": 80 1069 | } 1070 | ] 1071 | }, 1072 | "unit": "dbFS" 1073 | }, 1074 | "overrides": [] 1075 | }, 1076 | "gridPos": { 1077 | "h": 3, 1078 | "w": 4, 1079 | "x": 20, 1080 | "y": 5 1081 | }, 1082 | "id": 30, 1083 | "interval": "5s", 1084 | "links": [], 1085 | "maxDataPoints": 100, 1086 | "options": { 1087 | "colorMode": "none", 1088 | "graphMode": "none", 1089 | "justifyMode": "auto", 1090 | "orientation": "horizontal", 1091 | "reduceOptions": { 1092 | "calcs": [ 1093 | "mean" 1094 | ], 1095 | "fields": "", 1096 | "values": false 1097 | }, 1098 | "textMode": "auto" 1099 | }, 1100 | "pluginVersion": "8.4.3", 1101 | "targets": [ 1102 | { 1103 | "expr": "dump1090_stats_local_signal_strength_dbFS{job=\"dump1090\", time_period=\"last1min\"}", 1104 | "interval": "", 1105 | "intervalFactor": 2, 1106 | "legendFormat": "", 1107 | "refId": "A" 1108 | } 1109 | ], 1110 | "timeFrom": "1s", 1111 | "title": "Signal Mean", 1112 | "type": "stat" 1113 | }, 1114 | { 1115 | "collapsed": false, 1116 | "gridPos": { 1117 | "h": 1, 1118 | "w": 24, 1119 | "x": 0, 1120 | "y": 8 1121 | }, 1122 | "id": 20, 1123 | "panels": [], 1124 | "title": "dump1090-fa Historical Monitoring", 1125 | "type": "row" 1126 | }, 1127 | { 1128 | "datasource": { 1129 | "type": "prometheus", 1130 | "uid": "P1809F7CD0C75ACF3" 1131 | }, 1132 | "description": "Total aircraft seen by the receiver at the given point in time. Filtered aircraft to only those that have been seen within the last 15 seconds to minimize contributions from stale aircraft. ", 1133 | "fieldConfig": { 1134 | "defaults": { 1135 | "color": { 1136 | "mode": "palette-classic" 1137 | }, 1138 | "custom": { 1139 | "axisLabel": "Aircraft", 1140 | "axisPlacement": "auto", 1141 | "barAlignment": 0, 1142 | "drawStyle": "bars", 1143 | "fillOpacity": 75, 1144 | "gradientMode": "opacity", 1145 | "hideFrom": { 1146 | "legend": false, 1147 | "tooltip": false, 1148 | "viz": false 1149 | }, 1150 | "lineInterpolation": "stepAfter", 1151 | "lineWidth": 1, 1152 | "pointSize": 5, 1153 | "scaleDistribution": { 1154 | "type": "linear" 1155 | }, 1156 | "showPoints": "never", 1157 | "spanNulls": true, 1158 | "stacking": { 1159 | "group": "A", 1160 | "mode": "none" 1161 | }, 1162 | "thresholdsStyle": { 1163 | "mode": "off" 1164 | } 1165 | }, 1166 | "links": [], 1167 | "mappings": [], 1168 | "thresholds": { 1169 | "mode": "absolute", 1170 | "steps": [ 1171 | { 1172 | "color": "green", 1173 | "value": null 1174 | }, 1175 | { 1176 | "color": "red", 1177 | "value": 80 1178 | } 1179 | ] 1180 | }, 1181 | "unit": "short" 1182 | }, 1183 | "overrides": [ 1184 | { 1185 | "matcher": { 1186 | "id": "byName", 1187 | "options": "Aircraft with ADS-B Position" 1188 | }, 1189 | "properties": [ 1190 | { 1191 | "id": "color", 1192 | "value": { 1193 | "fixedColor": "super-light-blue", 1194 | "mode": "fixed" 1195 | } 1196 | } 1197 | ] 1198 | }, 1199 | { 1200 | "matcher": { 1201 | "id": "byName", 1202 | "options": "Aircraft with MLAT Position" 1203 | }, 1204 | "properties": [ 1205 | { 1206 | "id": "color", 1207 | "value": { 1208 | "fixedColor": "super-light-green", 1209 | "mode": "fixed" 1210 | } 1211 | } 1212 | ] 1213 | }, 1214 | { 1215 | "matcher": { 1216 | "id": "byName", 1217 | "options": "Aircraft with no Position" 1218 | }, 1219 | "properties": [ 1220 | { 1221 | "id": "color", 1222 | "value": { 1223 | "fixedColor": "light-red", 1224 | "mode": "fixed" 1225 | } 1226 | } 1227 | ] 1228 | }, 1229 | { 1230 | "matcher": { 1231 | "id": "byName", 1232 | "options": "Aircraft without Position" 1233 | }, 1234 | "properties": [ 1235 | { 1236 | "id": "color", 1237 | "value": { 1238 | "fixedColor": "semi-dark-orange", 1239 | "mode": "fixed" 1240 | } 1241 | } 1242 | ] 1243 | }, 1244 | { 1245 | "matcher": { 1246 | "id": "byName", 1247 | "options": "Total Aircraft" 1248 | }, 1249 | "properties": [ 1250 | { 1251 | "id": "color", 1252 | "value": { 1253 | "fixedColor": "dark-blue", 1254 | "mode": "fixed" 1255 | } 1256 | } 1257 | ] 1258 | } 1259 | ] 1260 | }, 1261 | "gridPos": { 1262 | "h": 7, 1263 | "w": 24, 1264 | "x": 0, 1265 | "y": 9 1266 | }, 1267 | "id": 4, 1268 | "options": { 1269 | "legend": { 1270 | "calcs": [ 1271 | "lastNotNull" 1272 | ], 1273 | "displayMode": "table", 1274 | "placement": "right" 1275 | }, 1276 | "tooltip": { 1277 | "mode": "multi", 1278 | "sort": "none" 1279 | } 1280 | }, 1281 | "pluginVersion": "8.4.3", 1282 | "targets": [ 1283 | { 1284 | "expr": "dump1090_recent_aircraft_observed{time_period=\"latest\"}", 1285 | "interval": "", 1286 | "intervalFactor": 2, 1287 | "legendFormat": "Total Aircraft", 1288 | "refId": "A" 1289 | }, 1290 | { 1291 | "expr": "dump1090_recent_aircraft_with_position{time_period=\"latest\"}", 1292 | "instant": false, 1293 | "interval": "", 1294 | "intervalFactor": 2, 1295 | "legendFormat": "Aircraft with ADS-B Position", 1296 | "refId": "B" 1297 | }, 1298 | { 1299 | "expr": "dump1090_recent_aircraft_with_multilateration{time_period=\"latest\"}", 1300 | "interval": "", 1301 | "legendFormat": "Aircraft with MLAT Position", 1302 | "refId": "C" 1303 | }, 1304 | { 1305 | "expr": "dump1090_recent_aircraft_observed{time_period=\"latest\"} - dump1090_recent_aircraft_with_position{time_period=\"latest\"}", 1306 | "interval": "", 1307 | "intervalFactor": 2, 1308 | "legendFormat": "Aircraft without Position", 1309 | "refId": "D" 1310 | } 1311 | ], 1312 | "title": "Aircraft Seen", 1313 | "type": "timeseries" 1314 | }, 1315 | { 1316 | "datasource": { 1317 | "type": "prometheus", 1318 | "uid": "P1809F7CD0C75ACF3" 1319 | }, 1320 | "description": "Messages received per second", 1321 | "fieldConfig": { 1322 | "defaults": { 1323 | "color": { 1324 | "mode": "palette-classic" 1325 | }, 1326 | "custom": { 1327 | "axisLabel": "Messages / Second", 1328 | "axisPlacement": "auto", 1329 | "barAlignment": 0, 1330 | "drawStyle": "line", 1331 | "fillOpacity": 100, 1332 | "gradientMode": "hue", 1333 | "hideFrom": { 1334 | "legend": false, 1335 | "tooltip": false, 1336 | "viz": false 1337 | }, 1338 | "lineInterpolation": "linear", 1339 | "lineWidth": 1, 1340 | "pointSize": 5, 1341 | "scaleDistribution": { 1342 | "type": "linear" 1343 | }, 1344 | "showPoints": "never", 1345 | "spanNulls": true, 1346 | "stacking": { 1347 | "group": "A", 1348 | "mode": "none" 1349 | }, 1350 | "thresholdsStyle": { 1351 | "mode": "off" 1352 | } 1353 | }, 1354 | "links": [], 1355 | "mappings": [], 1356 | "thresholds": { 1357 | "mode": "absolute", 1358 | "steps": [ 1359 | { 1360 | "color": "green", 1361 | "value": null 1362 | }, 1363 | { 1364 | "color": "red", 1365 | "value": 80 1366 | } 1367 | ] 1368 | }, 1369 | "unit": "short" 1370 | }, 1371 | "overrides": [ 1372 | { 1373 | "matcher": { 1374 | "id": "byName", 1375 | "options": " " 1376 | }, 1377 | "properties": [ 1378 | { 1379 | "id": "color", 1380 | "value": { 1381 | "fixedColor": "semi-dark-orange", 1382 | "mode": "fixed" 1383 | } 1384 | } 1385 | ] 1386 | }, 1387 | { 1388 | "matcher": { 1389 | "id": "byName", 1390 | "options": "Message/Second" 1391 | }, 1392 | "properties": [ 1393 | { 1394 | "id": "color", 1395 | "value": { 1396 | "fixedColor": "light-blue", 1397 | "mode": "fixed" 1398 | } 1399 | } 1400 | ] 1401 | } 1402 | ] 1403 | }, 1404 | "gridPos": { 1405 | "h": 7, 1406 | "w": 24, 1407 | "x": 0, 1408 | "y": 16 1409 | }, 1410 | "id": 14, 1411 | "options": { 1412 | "legend": { 1413 | "calcs": [ 1414 | "min", 1415 | "mean", 1416 | "max" 1417 | ], 1418 | "displayMode": "list", 1419 | "placement": "right" 1420 | }, 1421 | "tooltip": { 1422 | "mode": "multi", 1423 | "sort": "none" 1424 | } 1425 | }, 1426 | "pluginVersion": "8.4.3", 1427 | "targets": [ 1428 | { 1429 | "expr": "dump1090_stats_messages_total{job=\"dump1090\", time_period=\"last1min\"} / 60", 1430 | "interval": "", 1431 | "intervalFactor": 2, 1432 | "legendFormat": " ", 1433 | "refId": "A" 1434 | } 1435 | ], 1436 | "title": "Message Rate Received", 1437 | "transparent": true, 1438 | "type": "timeseries" 1439 | }, 1440 | { 1441 | "datasource": { 1442 | "type": "prometheus", 1443 | "uid": "P1809F7CD0C75ACF3" 1444 | }, 1445 | "description": "Maximum range of the currently observed aircraft at the given time", 1446 | "fieldConfig": { 1447 | "defaults": { 1448 | "color": { 1449 | "mode": "palette-classic" 1450 | }, 1451 | "custom": { 1452 | "axisLabel": "Nautical Miles", 1453 | "axisPlacement": "auto", 1454 | "barAlignment": 0, 1455 | "drawStyle": "line", 1456 | "fillOpacity": 75, 1457 | "gradientMode": "hue", 1458 | "hideFrom": { 1459 | "legend": false, 1460 | "tooltip": false, 1461 | "viz": false 1462 | }, 1463 | "lineInterpolation": "linear", 1464 | "lineStyle": { 1465 | "fill": "solid" 1466 | }, 1467 | "lineWidth": 1, 1468 | "pointSize": 5, 1469 | "scaleDistribution": { 1470 | "type": "linear" 1471 | }, 1472 | "showPoints": "never", 1473 | "spanNulls": true, 1474 | "stacking": { 1475 | "group": "A", 1476 | "mode": "none" 1477 | }, 1478 | "thresholdsStyle": { 1479 | "mode": "off" 1480 | } 1481 | }, 1482 | "links": [], 1483 | "mappings": [], 1484 | "thresholds": { 1485 | "mode": "absolute", 1486 | "steps": [ 1487 | { 1488 | "color": "green", 1489 | "value": null 1490 | } 1491 | ] 1492 | }, 1493 | "unit": "none" 1494 | }, 1495 | "overrides": [ 1496 | { 1497 | "matcher": { 1498 | "id": "byName", 1499 | "options": " " 1500 | }, 1501 | "properties": [ 1502 | { 1503 | "id": "color", 1504 | "value": { 1505 | "fixedColor": "semi-dark-blue", 1506 | "mode": "fixed" 1507 | } 1508 | } 1509 | ] 1510 | }, 1511 | { 1512 | "matcher": { 1513 | "id": "byName", 1514 | "options": "Distance" 1515 | }, 1516 | "properties": [ 1517 | { 1518 | "id": "color", 1519 | "value": { 1520 | "fixedColor": "light-blue", 1521 | "mode": "fixed" 1522 | } 1523 | } 1524 | ] 1525 | } 1526 | ] 1527 | }, 1528 | "gridPos": { 1529 | "h": 8, 1530 | "w": 24, 1531 | "x": 0, 1532 | "y": 23 1533 | }, 1534 | "id": 13, 1535 | "options": { 1536 | "legend": { 1537 | "calcs": [ 1538 | "min", 1539 | "mean", 1540 | "max" 1541 | ], 1542 | "displayMode": "list", 1543 | "placement": "right" 1544 | }, 1545 | "tooltip": { 1546 | "mode": "multi", 1547 | "sort": "none" 1548 | } 1549 | }, 1550 | "pluginVersion": "8.4.3", 1551 | "targets": [ 1552 | { 1553 | "expr": "dump1090_recent_aircraft_max_range{job=\"dump1090\", time_period=\"latest\"} / 1852", 1554 | "instant": false, 1555 | "interval": "", 1556 | "intervalFactor": 2, 1557 | "legendFormat": " ", 1558 | "refId": "A" 1559 | } 1560 | ], 1561 | "title": "Maximum Range", 1562 | "transparent": true, 1563 | "type": "timeseries" 1564 | }, 1565 | { 1566 | "datasource": { 1567 | "type": "prometheus", 1568 | "uid": "P1809F7CD0C75ACF3" 1569 | }, 1570 | "description": "", 1571 | "fieldConfig": { 1572 | "defaults": { 1573 | "color": { 1574 | "mode": "palette-classic" 1575 | }, 1576 | "custom": { 1577 | "axisLabel": "dbFS", 1578 | "axisPlacement": "auto", 1579 | "barAlignment": 0, 1580 | "drawStyle": "line", 1581 | "fillOpacity": 0, 1582 | "gradientMode": "none", 1583 | "hideFrom": { 1584 | "legend": false, 1585 | "tooltip": false, 1586 | "viz": false 1587 | }, 1588 | "lineInterpolation": "linear", 1589 | "lineWidth": 1, 1590 | "pointSize": 5, 1591 | "scaleDistribution": { 1592 | "type": "linear" 1593 | }, 1594 | "showPoints": "never", 1595 | "spanNulls": true, 1596 | "stacking": { 1597 | "group": "A", 1598 | "mode": "none" 1599 | }, 1600 | "thresholdsStyle": { 1601 | "mode": "off" 1602 | } 1603 | }, 1604 | "decimals": 1, 1605 | "links": [], 1606 | "mappings": [], 1607 | "thresholds": { 1608 | "mode": "absolute", 1609 | "steps": [ 1610 | { 1611 | "color": "green", 1612 | "value": null 1613 | }, 1614 | { 1615 | "color": "red", 1616 | "value": 80 1617 | } 1618 | ] 1619 | }, 1620 | "unit": "dB" 1621 | }, 1622 | "overrides": [ 1623 | { 1624 | "matcher": { 1625 | "id": "byName", 1626 | "options": "Mean Signal" 1627 | }, 1628 | "properties": [ 1629 | { 1630 | "id": "color", 1631 | "value": { 1632 | "fixedColor": "semi-dark-orange", 1633 | "mode": "fixed" 1634 | } 1635 | } 1636 | ] 1637 | }, 1638 | { 1639 | "matcher": { 1640 | "id": "byName", 1641 | "options": "Mean Signal" 1642 | }, 1643 | "properties": [ 1644 | { 1645 | "id": "color", 1646 | "value": { 1647 | "fixedColor": "light-orange", 1648 | "mode": "fixed" 1649 | } 1650 | } 1651 | ] 1652 | }, 1653 | { 1654 | "matcher": { 1655 | "id": "byName", 1656 | "options": "Noise" 1657 | }, 1658 | "properties": [ 1659 | { 1660 | "id": "color", 1661 | "value": { 1662 | "fixedColor": "semi-dark-blue", 1663 | "mode": "fixed" 1664 | } 1665 | } 1666 | ] 1667 | } 1668 | ] 1669 | }, 1670 | "gridPos": { 1671 | "h": 8, 1672 | "w": 24, 1673 | "x": 0, 1674 | "y": 31 1675 | }, 1676 | "id": 17, 1677 | "options": { 1678 | "legend": { 1679 | "calcs": [ 1680 | "min", 1681 | "max", 1682 | "last" 1683 | ], 1684 | "displayMode": "list", 1685 | "placement": "right" 1686 | }, 1687 | "tooltip": { 1688 | "mode": "multi", 1689 | "sort": "none" 1690 | } 1691 | }, 1692 | "pluginVersion": "8.4.3", 1693 | "targets": [ 1694 | { 1695 | "datasource": { 1696 | "type": "prometheus", 1697 | "uid": "P1809F7CD0C75ACF3" 1698 | }, 1699 | "exemplar": true, 1700 | "expr": "dump1090_stats_local_peak_signal_strength_dbFS{job=\"dump1090\", time_period=\"last1min\"}", 1701 | "interval": "", 1702 | "intervalFactor": 2, 1703 | "legendFormat": "Peak Signal", 1704 | "refId": "A" 1705 | }, 1706 | { 1707 | "datasource": { 1708 | "type": "prometheus", 1709 | "uid": "P1809F7CD0C75ACF3" 1710 | }, 1711 | "exemplar": true, 1712 | "expr": "dump1090_stats_local_signal_strength_dbFS{job=\"dump1090\", time_period=\"last1min\"}", 1713 | "interval": "", 1714 | "intervalFactor": 2, 1715 | "legendFormat": "Mean Signal", 1716 | "refId": "B" 1717 | }, 1718 | { 1719 | "datasource": { 1720 | "type": "prometheus", 1721 | "uid": "P1809F7CD0C75ACF3" 1722 | }, 1723 | "exemplar": true, 1724 | "expr": "dump1090_stats_local_noise_level_dbFS{job=\"dump1090\", time_period=\"last1min\"}", 1725 | "instant": false, 1726 | "interval": "", 1727 | "intervalFactor": 1, 1728 | "legendFormat": "Noise Level", 1729 | "refId": "C" 1730 | } 1731 | ], 1732 | "title": "Signal Level", 1733 | "transparent": true, 1734 | "type": "timeseries" 1735 | }, 1736 | { 1737 | "datasource": { 1738 | "type": "prometheus", 1739 | "uid": "P1809F7CD0C75ACF3" 1740 | }, 1741 | "description": "Demodulator - Time spent demodulating and decoding data from the USB SDR dongle. \n\nUSB - Time spent reading sample data from the USB SDR dongle. \n\nOther - Time spent doing network I/O, processing network messages, and periodic tasks.", 1742 | "fieldConfig": { 1743 | "defaults": { 1744 | "color": { 1745 | "mode": "palette-classic" 1746 | }, 1747 | "custom": { 1748 | "axisLabel": "Time", 1749 | "axisPlacement": "auto", 1750 | "barAlignment": 0, 1751 | "drawStyle": "line", 1752 | "fillOpacity": 50, 1753 | "gradientMode": "hue", 1754 | "hideFrom": { 1755 | "legend": false, 1756 | "tooltip": false, 1757 | "viz": false 1758 | }, 1759 | "lineInterpolation": "linear", 1760 | "lineWidth": 1, 1761 | "pointSize": 5, 1762 | "scaleDistribution": { 1763 | "type": "linear" 1764 | }, 1765 | "showPoints": "never", 1766 | "spanNulls": true, 1767 | "stacking": { 1768 | "group": "A", 1769 | "mode": "none" 1770 | }, 1771 | "thresholdsStyle": { 1772 | "mode": "off" 1773 | } 1774 | }, 1775 | "links": [], 1776 | "mappings": [], 1777 | "thresholds": { 1778 | "mode": "absolute", 1779 | "steps": [ 1780 | { 1781 | "color": "green", 1782 | "value": null 1783 | }, 1784 | { 1785 | "color": "red", 1786 | "value": 80 1787 | } 1788 | ] 1789 | }, 1790 | "unit": "ms" 1791 | }, 1792 | "overrides": [ 1793 | { 1794 | "matcher": { 1795 | "id": "byName", 1796 | "options": "Aircraft with ADS-B Position" 1797 | }, 1798 | "properties": [ 1799 | { 1800 | "id": "color", 1801 | "value": { 1802 | "fixedColor": "super-light-blue", 1803 | "mode": "fixed" 1804 | } 1805 | } 1806 | ] 1807 | }, 1808 | { 1809 | "matcher": { 1810 | "id": "byName", 1811 | "options": "Aircraft with MLAT Position" 1812 | }, 1813 | "properties": [ 1814 | { 1815 | "id": "color", 1816 | "value": { 1817 | "fixedColor": "light-green", 1818 | "mode": "fixed" 1819 | } 1820 | } 1821 | ] 1822 | }, 1823 | { 1824 | "matcher": { 1825 | "id": "byName", 1826 | "options": "Aircraft with no Position" 1827 | }, 1828 | "properties": [ 1829 | { 1830 | "id": "color", 1831 | "value": { 1832 | "fixedColor": "light-red", 1833 | "mode": "fixed" 1834 | } 1835 | } 1836 | ] 1837 | }, 1838 | { 1839 | "matcher": { 1840 | "id": "byName", 1841 | "options": "Demodulator" 1842 | }, 1843 | "properties": [ 1844 | { 1845 | "id": "color", 1846 | "value": { 1847 | "fixedColor": "rgb(34, 255, 0)", 1848 | "mode": "fixed" 1849 | } 1850 | } 1851 | ] 1852 | }, 1853 | { 1854 | "matcher": { 1855 | "id": "byName", 1856 | "options": "Other (Network I/O, periodic tasks, etc)" 1857 | }, 1858 | "properties": [ 1859 | { 1860 | "id": "color", 1861 | "value": { 1862 | "fixedColor": "blue", 1863 | "mode": "fixed" 1864 | } 1865 | } 1866 | ] 1867 | }, 1868 | { 1869 | "matcher": { 1870 | "id": "byName", 1871 | "options": "Total Aircraft" 1872 | }, 1873 | "properties": [ 1874 | { 1875 | "id": "color", 1876 | "value": { 1877 | "fixedColor": "dark-blue", 1878 | "mode": "fixed" 1879 | } 1880 | } 1881 | ] 1882 | }, 1883 | { 1884 | "matcher": { 1885 | "id": "byName", 1886 | "options": "USB" 1887 | }, 1888 | "properties": [ 1889 | { 1890 | "id": "color", 1891 | "value": { 1892 | "fixedColor": "orange", 1893 | "mode": "fixed" 1894 | } 1895 | } 1896 | ] 1897 | } 1898 | ] 1899 | }, 1900 | "gridPos": { 1901 | "h": 7, 1902 | "w": 24, 1903 | "x": 0, 1904 | "y": 39 1905 | }, 1906 | "id": 18, 1907 | "options": { 1908 | "legend": { 1909 | "calcs": [ 1910 | "mean" 1911 | ], 1912 | "displayMode": "list", 1913 | "placement": "right" 1914 | }, 1915 | "tooltip": { 1916 | "mode": "multi", 1917 | "sort": "none" 1918 | } 1919 | }, 1920 | "pluginVersion": "8.4.3", 1921 | "targets": [ 1922 | { 1923 | "expr": "dump1090_stats_cpu_demod_milliseconds{job=\"dump1090\", time_period=\"last1min\"}", 1924 | "interval": "", 1925 | "intervalFactor": 2, 1926 | "legendFormat": "Demodulator", 1927 | "refId": "A" 1928 | }, 1929 | { 1930 | "expr": "dump1090_stats_cpu_reader_milliseconds{job=\"dump1090\", time_period=\"last1min\"}", 1931 | "interval": "", 1932 | "intervalFactor": 2, 1933 | "legendFormat": "USB", 1934 | "refId": "B" 1935 | }, 1936 | { 1937 | "expr": "dump1090_stats_cpu_background_milliseconds{job=\"dump1090\", time_period=\"last1min\"}", 1938 | "interval": "", 1939 | "intervalFactor": 2, 1940 | "legendFormat": "Other (Network I/O, periodic tasks, etc)", 1941 | "refId": "C" 1942 | } 1943 | ], 1944 | "title": "CPU Utilization", 1945 | "transparent": true, 1946 | "type": "timeseries" 1947 | } 1948 | ], 1949 | "refresh": "10s", 1950 | "schemaVersion": 35, 1951 | "style": "dark", 1952 | "tags": [], 1953 | "templating": { 1954 | "list": [] 1955 | }, 1956 | "time": { 1957 | "from": "now-3h", 1958 | "to": "now" 1959 | }, 1960 | "timepicker": { 1961 | "refresh_intervals": [ 1962 | "5s", 1963 | "10s", 1964 | "30s", 1965 | "1m", 1966 | "5m", 1967 | "15m", 1968 | "30m", 1969 | "1h", 1970 | "2h", 1971 | "1d" 1972 | ] 1973 | }, 1974 | "timezone": "", 1975 | "title": "Flight Tracking Dashboard", 1976 | "uid": "dqoDE-gRz", 1977 | "version": 1, 1978 | "weekStart": "" 1979 | } -------------------------------------------------------------------------------- /grafana/dashboards/system-information.json: -------------------------------------------------------------------------------- 1 | { 2 | "annotations": { 3 | "list": [ 4 | { 5 | "builtIn": 1, 6 | "datasource": "-- Grafana --", 7 | "enable": true, 8 | "hide": true, 9 | "iconColor": "rgba(0, 211, 255, 1)", 10 | "name": "Annotations & Alerts", 11 | "target": { 12 | "limit": 100, 13 | "matchAny": false, 14 | "tags": [], 15 | "type": "dashboard" 16 | }, 17 | "type": "dashboard" 18 | } 19 | ] 20 | }, 21 | "editable": true, 22 | "fiscalYearStartMonth": 0, 23 | "graphTooltip": 2, 24 | "id": 1, 25 | "links": [], 26 | "liveNow": false, 27 | "panels": [ 28 | { 29 | "collapsed": false, 30 | "gridPos": { 31 | "h": 1, 32 | "w": 24, 33 | "x": 0, 34 | "y": 0 35 | }, 36 | "id": 4, 37 | "panels": [], 38 | "title": "System Information", 39 | "type": "row" 40 | }, 41 | { 42 | "datasource": { 43 | "type": "prometheus", 44 | "uid": "P1809F7CD0C75ACF3" 45 | }, 46 | "fieldConfig": { 47 | "defaults": { 48 | "color": { 49 | "mode": "thresholds" 50 | }, 51 | "mappings": [], 52 | "thresholds": { 53 | "mode": "absolute", 54 | "steps": [ 55 | { 56 | "color": "green", 57 | "value": null 58 | } 59 | ] 60 | } 61 | }, 62 | "overrides": [] 63 | }, 64 | "gridPos": { 65 | "h": 4, 66 | "w": 7, 67 | "x": 0, 68 | "y": 1 69 | }, 70 | "id": 8, 71 | "options": { 72 | "colorMode": "value", 73 | "graphMode": "none", 74 | "justifyMode": "auto", 75 | "orientation": "auto", 76 | "reduceOptions": { 77 | "calcs": [ 78 | "lastNotNull" 79 | ], 80 | "fields": "", 81 | "values": false 82 | }, 83 | "textMode": "auto" 84 | }, 85 | "pluginVersion": "8.4.3", 86 | "targets": [ 87 | { 88 | "datasource": { 89 | "type": "prometheus", 90 | "uid": "P1809F7CD0C75ACF3" 91 | }, 92 | "exemplar": true, 93 | "expr": "count(count(node_cpu_seconds_total{job=\"node_exporter\"}) by (cpu))", 94 | "interval": "", 95 | "legendFormat": "", 96 | "refId": "A" 97 | } 98 | ], 99 | "title": "CPU Cores", 100 | "type": "stat" 101 | }, 102 | { 103 | "datasource": { 104 | "type": "prometheus", 105 | "uid": "P1809F7CD0C75ACF3" 106 | }, 107 | "fieldConfig": { 108 | "defaults": { 109 | "color": { 110 | "mode": "thresholds" 111 | }, 112 | "mappings": [], 113 | "thresholds": { 114 | "mode": "absolute", 115 | "steps": [ 116 | { 117 | "color": "green", 118 | "value": null 119 | } 120 | ] 121 | }, 122 | "unit": "dtdhms" 123 | }, 124 | "overrides": [] 125 | }, 126 | "gridPos": { 127 | "h": 4, 128 | "w": 9, 129 | "x": 7, 130 | "y": 1 131 | }, 132 | "id": 10, 133 | "options": { 134 | "colorMode": "value", 135 | "graphMode": "none", 136 | "justifyMode": "auto", 137 | "orientation": "auto", 138 | "reduceOptions": { 139 | "calcs": [ 140 | "lastNotNull" 141 | ], 142 | "fields": "", 143 | "values": false 144 | }, 145 | "textMode": "auto" 146 | }, 147 | "pluginVersion": "8.4.3", 148 | "targets": [ 149 | { 150 | "datasource": { 151 | "type": "prometheus", 152 | "uid": "P1809F7CD0C75ACF3" 153 | }, 154 | "exemplar": true, 155 | "expr": "node_time_seconds{job=\"node_exporter\"} - node_boot_time_seconds{job=\"node_exporter\"}", 156 | "interval": "", 157 | "legendFormat": "", 158 | "refId": "A" 159 | } 160 | ], 161 | "title": "System Uptime", 162 | "type": "stat" 163 | }, 164 | { 165 | "datasource": { 166 | "type": "prometheus", 167 | "uid": "P1809F7CD0C75ACF3" 168 | }, 169 | "fieldConfig": { 170 | "defaults": { 171 | "color": { 172 | "mode": "thresholds" 173 | }, 174 | "mappings": [], 175 | "thresholds": { 176 | "mode": "absolute", 177 | "steps": [ 178 | { 179 | "color": "green", 180 | "value": null 181 | } 182 | ] 183 | }, 184 | "unit": "decbytes" 185 | }, 186 | "overrides": [] 187 | }, 188 | "gridPos": { 189 | "h": 4, 190 | "w": 8, 191 | "x": 16, 192 | "y": 1 193 | }, 194 | "id": 30, 195 | "options": { 196 | "colorMode": "value", 197 | "graphMode": "none", 198 | "justifyMode": "auto", 199 | "orientation": "auto", 200 | "reduceOptions": { 201 | "calcs": [ 202 | "lastNotNull" 203 | ], 204 | "fields": "", 205 | "values": false 206 | }, 207 | "textMode": "auto" 208 | }, 209 | "pluginVersion": "8.4.3", 210 | "targets": [ 211 | { 212 | "datasource": { 213 | "type": "prometheus", 214 | "uid": "P1809F7CD0C75ACF3" 215 | }, 216 | "exemplar": true, 217 | "expr": "node_filesystem_size_bytes{device=\"/dev/root\", mountpoint=\"/\"}", 218 | "interval": "", 219 | "legendFormat": "", 220 | "refId": "A" 221 | } 222 | ], 223 | "title": "Total Storage", 224 | "type": "stat" 225 | }, 226 | { 227 | "datasource": { 228 | "type": "prometheus", 229 | "uid": "P1809F7CD0C75ACF3" 230 | }, 231 | "fieldConfig": { 232 | "defaults": { 233 | "color": { 234 | "mode": "thresholds" 235 | }, 236 | "mappings": [], 237 | "max": 100, 238 | "min": 0, 239 | "thresholds": { 240 | "mode": "absolute", 241 | "steps": [ 242 | { 243 | "color": "green", 244 | "value": null 245 | } 246 | ] 247 | }, 248 | "unit": "percent" 249 | }, 250 | "overrides": [] 251 | }, 252 | "gridPos": { 253 | "h": 8, 254 | "w": 5, 255 | "x": 0, 256 | "y": 5 257 | }, 258 | "id": 22, 259 | "options": { 260 | "orientation": "vertical", 261 | "reduceOptions": { 262 | "calcs": [ 263 | "last" 264 | ], 265 | "fields": "", 266 | "values": false 267 | }, 268 | "showThresholdLabels": true, 269 | "showThresholdMarkers": true 270 | }, 271 | "pluginVersion": "8.4.3", 272 | "targets": [ 273 | { 274 | "datasource": { 275 | "type": "prometheus", 276 | "uid": "P1809F7CD0C75ACF3" 277 | }, 278 | "exemplar": false, 279 | "expr": "100 - (node_filesystem_avail_bytes{device=\"/dev/root\", mountpoint=\"/\"}/node_filesystem_size_bytes{device=\"/dev/root\", mountpoint=\"/\"} * 100)", 280 | "instant": true, 281 | "interval": "", 282 | "legendFormat": "", 283 | "refId": "A" 284 | } 285 | ], 286 | "title": "File System Usage", 287 | "type": "gauge" 288 | }, 289 | { 290 | "datasource": { 291 | "type": "prometheus", 292 | "uid": "P1809F7CD0C75ACF3" 293 | }, 294 | "fieldConfig": { 295 | "defaults": { 296 | "color": { 297 | "mode": "palette-classic" 298 | }, 299 | "custom": { 300 | "axisLabel": "", 301 | "axisPlacement": "auto", 302 | "barAlignment": 0, 303 | "drawStyle": "line", 304 | "fillOpacity": 12, 305 | "gradientMode": "none", 306 | "hideFrom": { 307 | "legend": false, 308 | "tooltip": false, 309 | "viz": false 310 | }, 311 | "lineInterpolation": "linear", 312 | "lineWidth": 1, 313 | "pointSize": 5, 314 | "scaleDistribution": { 315 | "type": "linear" 316 | }, 317 | "showPoints": "never", 318 | "spanNulls": false, 319 | "stacking": { 320 | "group": "A", 321 | "mode": "none" 322 | }, 323 | "thresholdsStyle": { 324 | "mode": "off" 325 | } 326 | }, 327 | "mappings": [], 328 | "thresholds": { 329 | "mode": "absolute", 330 | "steps": [ 331 | { 332 | "color": "green", 333 | "value": null 334 | }, 335 | { 336 | "color": "red", 337 | "value": 80 338 | } 339 | ] 340 | }, 341 | "unit": "decbytes" 342 | }, 343 | "overrides": [ 344 | { 345 | "matcher": { 346 | "id": "byName", 347 | "options": "Used" 348 | }, 349 | "properties": [ 350 | { 351 | "id": "color", 352 | "value": { 353 | "fixedColor": "semi-dark-yellow", 354 | "mode": "fixed" 355 | } 356 | }, 357 | { 358 | "id": "custom.fillOpacity", 359 | "value": 75 360 | } 361 | ] 362 | } 363 | ] 364 | }, 365 | "gridPos": { 366 | "h": 8, 367 | "w": 19, 368 | "x": 5, 369 | "y": 5 370 | }, 371 | "id": 24, 372 | "options": { 373 | "legend": { 374 | "calcs": [ 375 | "min", 376 | "last", 377 | "max" 378 | ], 379 | "displayMode": "table", 380 | "placement": "right" 381 | }, 382 | "tooltip": { 383 | "mode": "single", 384 | "sort": "none" 385 | } 386 | }, 387 | "targets": [ 388 | { 389 | "datasource": { 390 | "type": "prometheus", 391 | "uid": "P1809F7CD0C75ACF3" 392 | }, 393 | "exemplar": true, 394 | "expr": "node_filesystem_size_bytes{device=\"/dev/root\", mountpoint=\"/\"}", 395 | "interval": "", 396 | "legendFormat": "Total", 397 | "refId": "A" 398 | }, 399 | { 400 | "datasource": { 401 | "type": "prometheus", 402 | "uid": "P1809F7CD0C75ACF3" 403 | }, 404 | "exemplar": true, 405 | "expr": "node_filesystem_size_bytes{device=\"/dev/root\", mountpoint=\"/\"} - node_filesystem_avail_bytes{device=\"/dev/root\", mountpoint=\"/\"}", 406 | "hide": false, 407 | "interval": "", 408 | "legendFormat": "Used", 409 | "refId": "B" 410 | }, 411 | { 412 | "datasource": { 413 | "type": "prometheus", 414 | "uid": "P1809F7CD0C75ACF3" 415 | }, 416 | "exemplar": true, 417 | "expr": "node_filesystem_avail_bytes{device=\"/dev/root\", mountpoint=\"/\"}", 418 | "hide": false, 419 | "interval": "", 420 | "legendFormat": "Available", 421 | "refId": "C" 422 | } 423 | ], 424 | "title": "File System Monitor", 425 | "type": "timeseries" 426 | }, 427 | { 428 | "collapsed": false, 429 | "gridPos": { 430 | "h": 1, 431 | "w": 24, 432 | "x": 0, 433 | "y": 13 434 | }, 435 | "id": 28, 436 | "panels": [], 437 | "title": "CPU", 438 | "type": "row" 439 | }, 440 | { 441 | "datasource": { 442 | "type": "prometheus", 443 | "uid": "P1809F7CD0C75ACF3" 444 | }, 445 | "description": "", 446 | "fieldConfig": { 447 | "defaults": { 448 | "color": { 449 | "mode": "thresholds" 450 | }, 451 | "mappings": [], 452 | "max": 100, 453 | "min": 0, 454 | "thresholds": { 455 | "mode": "percentage", 456 | "steps": [ 457 | { 458 | "color": "green", 459 | "value": null 460 | }, 461 | { 462 | "color": "yellow", 463 | "value": 75 464 | }, 465 | { 466 | "color": "red", 467 | "value": 90 468 | } 469 | ] 470 | }, 471 | "unit": "percent" 472 | }, 473 | "overrides": [] 474 | }, 475 | "gridPos": { 476 | "h": 8, 477 | "w": 5, 478 | "x": 0, 479 | "y": 14 480 | }, 481 | "id": 6, 482 | "options": { 483 | "orientation": "auto", 484 | "reduceOptions": { 485 | "calcs": [ 486 | "lastNotNull" 487 | ], 488 | "fields": "", 489 | "values": false 490 | }, 491 | "showThresholdLabels": true, 492 | "showThresholdMarkers": true, 493 | "text": {} 494 | }, 495 | "pluginVersion": "8.4.3", 496 | "targets": [ 497 | { 498 | "datasource": { 499 | "type": "prometheus", 500 | "uid": "P1809F7CD0C75ACF3" 501 | }, 502 | "exemplar": false, 503 | "expr": "100 - (avg (irate(node_cpu_seconds_total{job=\"node_exporter\",mode=\"idle\"}[5m])) * 100)", 504 | "instant": true, 505 | "interval": "", 506 | "legendFormat": "", 507 | "refId": "A" 508 | } 509 | ], 510 | "title": "Current CPU Usage", 511 | "type": "gauge" 512 | }, 513 | { 514 | "datasource": { 515 | "type": "prometheus", 516 | "uid": "P1809F7CD0C75ACF3" 517 | }, 518 | "fieldConfig": { 519 | "defaults": { 520 | "color": { 521 | "mode": "palette-classic" 522 | }, 523 | "custom": { 524 | "axisLabel": "", 525 | "axisPlacement": "auto", 526 | "barAlignment": 0, 527 | "drawStyle": "line", 528 | "fillOpacity": 10, 529 | "gradientMode": "none", 530 | "hideFrom": { 531 | "legend": false, 532 | "tooltip": false, 533 | "viz": false 534 | }, 535 | "lineInterpolation": "linear", 536 | "lineStyle": { 537 | "fill": "solid" 538 | }, 539 | "lineWidth": 1, 540 | "pointSize": 5, 541 | "scaleDistribution": { 542 | "type": "linear" 543 | }, 544 | "showPoints": "never", 545 | "spanNulls": false, 546 | "stacking": { 547 | "group": "A", 548 | "mode": "none" 549 | }, 550 | "thresholdsStyle": { 551 | "mode": "area" 552 | } 553 | }, 554 | "mappings": [], 555 | "thresholds": { 556 | "mode": "percentage", 557 | "steps": [ 558 | { 559 | "color": "green", 560 | "value": null 561 | }, 562 | { 563 | "color": "light-red", 564 | "value": 85 565 | } 566 | ] 567 | }, 568 | "unit": "percent" 569 | }, 570 | "overrides": [] 571 | }, 572 | "gridPos": { 573 | "h": 8, 574 | "w": 19, 575 | "x": 5, 576 | "y": 14 577 | }, 578 | "id": 16, 579 | "options": { 580 | "legend": { 581 | "calcs": [ 582 | "min", 583 | "last", 584 | "max" 585 | ], 586 | "displayMode": "table", 587 | "placement": "right" 588 | }, 589 | "tooltip": { 590 | "mode": "single", 591 | "sort": "none" 592 | } 593 | }, 594 | "pluginVersion": "8.4.3", 595 | "targets": [ 596 | { 597 | "datasource": { 598 | "type": "prometheus", 599 | "uid": "P1809F7CD0C75ACF3" 600 | }, 601 | "exemplar": true, 602 | "expr": "100 - (avg(irate(node_cpu_seconds_total{mode=\"idle\"}[30m])) * 100)", 603 | "interval": "", 604 | "legendFormat": "CPU Utilization", 605 | "refId": "A" 606 | } 607 | ], 608 | "title": "CPU Usage Monitor", 609 | "type": "timeseries" 610 | }, 611 | { 612 | "datasource": { 613 | "type": "prometheus", 614 | "uid": "P1809F7CD0C75ACF3" 615 | }, 616 | "fieldConfig": { 617 | "defaults": { 618 | "color": { 619 | "mode": "thresholds" 620 | }, 621 | "mappings": [], 622 | "max": 100, 623 | "min": 0, 624 | "thresholds": { 625 | "mode": "absolute", 626 | "steps": [ 627 | { 628 | "color": "green", 629 | "value": null 630 | }, 631 | { 632 | "color": "#EAB839", 633 | "value": 75 634 | }, 635 | { 636 | "color": "red", 637 | "value": 85 638 | } 639 | ] 640 | }, 641 | "unit": "celsius" 642 | }, 643 | "overrides": [] 644 | }, 645 | "gridPos": { 646 | "h": 8, 647 | "w": 5, 648 | "x": 0, 649 | "y": 22 650 | }, 651 | "id": 20, 652 | "options": { 653 | "orientation": "auto", 654 | "reduceOptions": { 655 | "calcs": [ 656 | "lastNotNull" 657 | ], 658 | "fields": "", 659 | "values": false 660 | }, 661 | "showThresholdLabels": true, 662 | "showThresholdMarkers": true 663 | }, 664 | "pluginVersion": "8.4.3", 665 | "targets": [ 666 | { 667 | "datasource": { 668 | "type": "prometheus", 669 | "uid": "P1809F7CD0C75ACF3" 670 | }, 671 | "exemplar": false, 672 | "expr": "max(node_hwmon_temp_celsius{job=\"node_exporter\"})", 673 | "instant": true, 674 | "interval": "", 675 | "legendFormat": "", 676 | "refId": "A" 677 | } 678 | ], 679 | "title": "Current CPU Temperature", 680 | "type": "gauge" 681 | }, 682 | { 683 | "datasource": { 684 | "type": "prometheus", 685 | "uid": "P1809F7CD0C75ACF3" 686 | }, 687 | "fieldConfig": { 688 | "defaults": { 689 | "color": { 690 | "mode": "palette-classic" 691 | }, 692 | "custom": { 693 | "axisLabel": "", 694 | "axisPlacement": "auto", 695 | "barAlignment": 0, 696 | "drawStyle": "line", 697 | "fillOpacity": 0, 698 | "gradientMode": "none", 699 | "hideFrom": { 700 | "legend": false, 701 | "tooltip": false, 702 | "viz": false 703 | }, 704 | "lineInterpolation": "linear", 705 | "lineStyle": { 706 | "fill": "solid" 707 | }, 708 | "lineWidth": 2, 709 | "pointSize": 5, 710 | "scaleDistribution": { 711 | "type": "linear" 712 | }, 713 | "showPoints": "never", 714 | "spanNulls": false, 715 | "stacking": { 716 | "group": "A", 717 | "mode": "none" 718 | }, 719 | "thresholdsStyle": { 720 | "mode": "area" 721 | } 722 | }, 723 | "mappings": [], 724 | "max": 95, 725 | "min": 30, 726 | "thresholds": { 727 | "mode": "absolute", 728 | "steps": [ 729 | { 730 | "color": "green", 731 | "value": null 732 | }, 733 | { 734 | "color": "light-red", 735 | "value": 85 736 | } 737 | ] 738 | }, 739 | "unit": "celsius" 740 | }, 741 | "overrides": [ 742 | { 743 | "__systemRef": "hideSeriesFrom", 744 | "matcher": { 745 | "id": "byNames", 746 | "options": { 747 | "mode": "exclude", 748 | "names": [ 749 | "CPU Temperature" 750 | ], 751 | "prefix": "All except:", 752 | "readOnly": true 753 | } 754 | }, 755 | "properties": [ 756 | { 757 | "id": "custom.hideFrom", 758 | "value": { 759 | "legend": false, 760 | "tooltip": false, 761 | "viz": false 762 | } 763 | } 764 | ] 765 | } 766 | ] 767 | }, 768 | "gridPos": { 769 | "h": 8, 770 | "w": 19, 771 | "x": 5, 772 | "y": 22 773 | }, 774 | "id": 14, 775 | "options": { 776 | "legend": { 777 | "calcs": [ 778 | "min", 779 | "last", 780 | "max" 781 | ], 782 | "displayMode": "table", 783 | "placement": "right" 784 | }, 785 | "tooltip": { 786 | "mode": "single", 787 | "sort": "none" 788 | } 789 | }, 790 | "pluginVersion": "8.4.3", 791 | "targets": [ 792 | { 793 | "datasource": { 794 | "type": "prometheus", 795 | "uid": "P1809F7CD0C75ACF3" 796 | }, 797 | "exemplar": true, 798 | "expr": "max(node_hwmon_temp_celsius{job=\"node_exporter\"})", 799 | "interval": "", 800 | "legendFormat": "Temperature", 801 | "refId": "A" 802 | } 803 | ], 804 | "title": "CPU Temperature Monitor", 805 | "type": "timeseries" 806 | }, 807 | { 808 | "collapsed": false, 809 | "gridPos": { 810 | "h": 1, 811 | "w": 24, 812 | "x": 0, 813 | "y": 30 814 | }, 815 | "id": 26, 816 | "panels": [], 817 | "title": "Memory", 818 | "type": "row" 819 | }, 820 | { 821 | "datasource": { 822 | "type": "prometheus", 823 | "uid": "P1809F7CD0C75ACF3" 824 | }, 825 | "fieldConfig": { 826 | "defaults": { 827 | "color": { 828 | "mode": "palette-classic" 829 | }, 830 | "custom": { 831 | "axisLabel": "", 832 | "axisPlacement": "auto", 833 | "barAlignment": 0, 834 | "drawStyle": "line", 835 | "fillOpacity": 12, 836 | "gradientMode": "none", 837 | "hideFrom": { 838 | "legend": false, 839 | "tooltip": false, 840 | "viz": false 841 | }, 842 | "lineInterpolation": "linear", 843 | "lineWidth": 1, 844 | "pointSize": 5, 845 | "scaleDistribution": { 846 | "type": "linear" 847 | }, 848 | "showPoints": "never", 849 | "spanNulls": false, 850 | "stacking": { 851 | "group": "A", 852 | "mode": "none" 853 | }, 854 | "thresholdsStyle": { 855 | "mode": "off" 856 | } 857 | }, 858 | "mappings": [], 859 | "thresholds": { 860 | "mode": "absolute", 861 | "steps": [ 862 | { 863 | "color": "green", 864 | "value": null 865 | }, 866 | { 867 | "color": "red", 868 | "value": 80 869 | } 870 | ] 871 | }, 872 | "unit": "decbytes" 873 | }, 874 | "overrides": [ 875 | { 876 | "matcher": { 877 | "id": "byName", 878 | "options": "Used" 879 | }, 880 | "properties": [ 881 | { 882 | "id": "custom.fillOpacity", 883 | "value": 75 884 | } 885 | ] 886 | } 887 | ] 888 | }, 889 | "gridPos": { 890 | "h": 9, 891 | "w": 24, 892 | "x": 0, 893 | "y": 31 894 | }, 895 | "id": 18, 896 | "options": { 897 | "legend": { 898 | "calcs": [ 899 | "min", 900 | "last", 901 | "max" 902 | ], 903 | "displayMode": "table", 904 | "placement": "right" 905 | }, 906 | "tooltip": { 907 | "mode": "single", 908 | "sort": "none" 909 | } 910 | }, 911 | "targets": [ 912 | { 913 | "datasource": { 914 | "type": "prometheus", 915 | "uid": "P1809F7CD0C75ACF3" 916 | }, 917 | "exemplar": true, 918 | "expr": "node_memory_MemTotal_bytes{job=\"node_exporter\"}", 919 | "instant": false, 920 | "interval": "", 921 | "legendFormat": "Total", 922 | "refId": "A" 923 | }, 924 | { 925 | "datasource": { 926 | "type": "prometheus", 927 | "uid": "P1809F7CD0C75ACF3" 928 | }, 929 | "exemplar": true, 930 | "expr": "node_memory_MemTotal_bytes{job=\"node_exporter\"} - node_memory_MemFree_bytes{job=\"node_exporter\"} - node_memory_Buffers_bytes{job=\"node_exporter\"} - node_memory_Cached_bytes{job=\"node_exporter\"} - node_memory_SReclaimable_bytes{job=\"node_exporter\"}", 931 | "hide": false, 932 | "instant": false, 933 | "interval": "", 934 | "legendFormat": "Used", 935 | "refId": "B" 936 | }, 937 | { 938 | "datasource": { 939 | "type": "prometheus", 940 | "uid": "P1809F7CD0C75ACF3" 941 | }, 942 | "exemplar": true, 943 | "expr": "node_memory_MemAvailable_bytes{job=\"node_exporter\"}", 944 | "hide": false, 945 | "instant": false, 946 | "interval": "", 947 | "legendFormat": "Available", 948 | "refId": "C" 949 | } 950 | ], 951 | "title": "Memory Usage Monitor", 952 | "type": "timeseries" 953 | } 954 | ], 955 | "refresh": "10s", 956 | "schemaVersion": 35, 957 | "style": "dark", 958 | "tags": [], 959 | "templating": { 960 | "list": [] 961 | }, 962 | "time": { 963 | "from": "now-15m", 964 | "to": "now" 965 | }, 966 | "timepicker": {}, 967 | "timezone": "", 968 | "title": "Raspberry Pi System Dashboard", 969 | "uid": "Kt-ERbgRk", 970 | "version": 3, 971 | "weekStart": "" 972 | } -------------------------------------------------------------------------------- /grafana/grafana.ini: -------------------------------------------------------------------------------- 1 | ##################### Grafana Configuration Example ##################### 2 | # 3 | # Everything has defaults so you only need to uncomment things you want to 4 | # change 5 | 6 | # possible values : production, development 7 | ;app_mode = production 8 | 9 | # instance name, defaults to HOSTNAME environment variable value or hostname if HOSTNAME var is empty 10 | ;instance_name = ${HOSTNAME} 11 | 12 | #################################### Paths #################################### 13 | [paths] 14 | # Path to where grafana can store temp files, sessions, and the sqlite3 db (if that is used) 15 | ;data = /var/lib/grafana 16 | 17 | # Temporary files in `data` directory older than given duration will be removed 18 | ;temp_data_lifetime = 24h 19 | 20 | # Directory where grafana can store logs 21 | ;logs = /var/log/grafana 22 | 23 | # Directory where grafana will automatically scan and look for plugins 24 | ;plugins = /var/lib/grafana/plugins 25 | 26 | # folder that contains provisioning config files that grafana will apply on startup and while running. 27 | provisioning = /etc/grafana/provisioning 28 | 29 | #################################### Server #################################### 30 | [server] 31 | # Protocol (http, https, h2, socket) 32 | ;protocol = http 33 | 34 | # The ip address to bind to, empty will bind to all interfaces 35 | ;http_addr = 36 | 37 | # The http port to use 38 | ;http_port = 3000 39 | 40 | # The public facing domain name used to access grafana from a browser 41 | ;domain = localhost 42 | 43 | # Redirect to correct domain if host header does not match domain 44 | # Prevents DNS rebinding attacks 45 | ;enforce_domain = false 46 | 47 | # The full public facing url you use in browser, used for redirects and emails 48 | # If you use reverse proxy and sub path specify full url (with sub path) 49 | ;root_url = %(protocol)s://%(domain)s:%(http_port)s/ 50 | 51 | # Serve Grafana from subpath specified in `root_url` setting. By default it is set to `false` for compatibility reasons. 52 | ;serve_from_sub_path = false 53 | 54 | # Log web requests 55 | ;router_logging = false 56 | 57 | # the path relative working path 58 | ;static_root_path = public 59 | 60 | # enable gzip 61 | ;enable_gzip = false 62 | 63 | # https certs & key file 64 | ;cert_file = 65 | ;cert_key = 66 | 67 | # Unix socket path 68 | ;socket = 69 | 70 | #################################### Database #################################### 71 | [database] 72 | # You can configure the database connection by specifying type, host, name, user and password 73 | # as separate properties or as on string using the url properties. 74 | 75 | # Either "mysql", "postgres" or "sqlite3", it's your choice 76 | ;type = sqlite3 77 | ;host = 127.0.0.1:3306 78 | ;name = grafana 79 | ;user = root 80 | # If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;""" 81 | ;password = 82 | 83 | # Use either URL or the previous fields to configure the database 84 | # Example: mysql://user:secret@host:port/database 85 | ;url = 86 | 87 | # For "postgres" only, either "disable", "require" or "verify-full" 88 | ;ssl_mode = disable 89 | 90 | ;ca_cert_path = 91 | ;client_key_path = 92 | ;client_cert_path = 93 | ;server_cert_name = 94 | 95 | # For "sqlite3" only, path relative to data_path setting 96 | ;path = grafana.db 97 | 98 | # Max idle conn setting default is 2 99 | ;max_idle_conn = 2 100 | 101 | # Max conn setting default is 0 (mean not set) 102 | ;max_open_conn = 103 | 104 | # Connection Max Lifetime default is 14400 (means 14400 seconds or 4 hours) 105 | ;conn_max_lifetime = 14400 106 | 107 | # Set to true to log the sql calls and execution times. 108 | ;log_queries = 109 | 110 | # For "sqlite3" only. cache mode setting used for connecting to the database. (private, shared) 111 | ;cache_mode = private 112 | 113 | #################################### Cache server ############################# 114 | [remote_cache] 115 | # Either "redis", "memcached" or "database" default is "database" 116 | ;type = database 117 | 118 | # cache connectionstring options 119 | # database: will use Grafana primary database. 120 | # redis: config like redis server e.g. `addr=127.0.0.1:6379,pool_size=100,db=0,ssl=false`. Only addr is required. ssl may be 'true', 'false', or 'insecure'. 121 | # memcache: 127.0.0.1:11211 122 | ;connstr = 123 | 124 | #################################### Data proxy ########################### 125 | [dataproxy] 126 | 127 | # This enables data proxy logging, default is false 128 | ;logging = false 129 | 130 | # How long the data proxy should wait before timing out default is 30 (seconds) 131 | ;timeout = 30 132 | 133 | # If enabled and user is not anonymous, data proxy will add X-Grafana-User header with username into the request, default is false. 134 | ;send_user_header = false 135 | 136 | #################################### Analytics #################################### 137 | [analytics] 138 | # Server reporting, sends usage counters to stats.grafana.org every 24 hours. 139 | # No ip addresses are being tracked, only simple counters to track 140 | # running instances, dashboard and error counts. It is very helpful to us. 141 | # Change this option to false to disable reporting. 142 | ;reporting_enabled = true 143 | 144 | # Set to false to disable all checks to https://grafana.net 145 | # for new vesions (grafana itself and plugins), check is used 146 | # in some UI views to notify that grafana or plugin update exists 147 | # This option does not cause any auto updates, nor send any information 148 | # only a GET request to http://grafana.com to get latest versions 149 | ;check_for_updates = true 150 | 151 | # Google Analytics universal tracking code, only enabled if you specify an id here 152 | ;google_analytics_ua_id = 153 | 154 | # Google Tag Manager ID, only enabled if you specify an id here 155 | ;google_tag_manager_id = 156 | 157 | #################################### Security #################################### 158 | [security] 159 | # disable creation of admin user on first start of grafana 160 | ;disable_initial_admin_creation = false 161 | 162 | # default admin user, created on startup 163 | ;admin_user = admin 164 | 165 | # default admin password, can be changed before first start of grafana, or in profile settings 166 | ;admin_password = admin 167 | 168 | # used for signing 169 | ;secret_key = SW2YcwTIb9zpOOhoPsMm 170 | 171 | # disable gravatar profile images 172 | ;disable_gravatar = false 173 | 174 | # data source proxy whitelist (ip_or_domain:port separated by spaces) 175 | ;data_source_proxy_whitelist = 176 | 177 | # disable protection against brute force login attempts 178 | ;disable_brute_force_login_protection = false 179 | 180 | # set to true if you host Grafana behind HTTPS. default is false. 181 | ;cookie_secure = false 182 | 183 | # set cookie SameSite attribute. defaults to `lax`. can be set to "lax", "strict", "none" and "disabled" 184 | ;cookie_samesite = lax 185 | 186 | # set to true if you want to allow browsers to render Grafana in a ,