├── .travis.yml ├── Grafana-Org-Stats.json ├── README.md ├── blackbox └── config │ └── blackbox.yml ├── docker-compose.yml ├── grafana ├── config.monitoring └── provisioning │ ├── dashboards │ ├── dashboard.yml │ ├── internet-connection.json │ ├── power-consumption.json │ └── starlink-overview.json │ └── datasources │ └── datasource.yml ├── images └── dashboard.png └── prometheus ├── alert.rules ├── pinghosts.yaml └── prometheus.yml /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: required 2 | 3 | services: 4 | - docker 5 | 6 | language: bash 7 | 8 | before_script: 9 | - docker-compose pull 10 | - docker-compose up -d 11 | - docker ps 12 | 13 | script: 14 | - while ! curl --retry 10 --retry-delay 5 -v http://0.0.0.0:9090 >/dev/null; do sleep 1; done 15 | - while ! curl --retry 10 --retry-delay 5 -v http://0.0.0.0:3000 >/dev/null; do sleep 1; done 16 | -------------------------------------------------------------------------------- /Grafana-Org-Stats.json: -------------------------------------------------------------------------------- 1 | { 2 | "__inputs": [ 3 | { 4 | "name": "DS_PROMETHEUS", 5 | "label": "Prometheus", 6 | "description": "", 7 | "type": "datasource", 8 | "pluginId": "prometheus", 9 | "pluginName": "Prometheus" 10 | } 11 | ], 12 | "__requires": [ 13 | { 14 | "type": "grafana", 15 | "id": "grafana", 16 | "name": "Grafana", 17 | "version": "4.1.2" 18 | }, 19 | { 20 | "type": "panel", 21 | "id": "graph", 22 | "name": "Graph", 23 | "version": "" 24 | }, 25 | { 26 | "type": "datasource", 27 | "id": "prometheus", 28 | "name": "Prometheus", 29 | "version": "1.0.0" 30 | } 31 | ], 32 | "annotations": { 33 | "list": [] 34 | }, 35 | "editable": true, 36 | "gnetId": null, 37 | "graphTooltip": 0, 38 | "hideControls": false, 39 | "id": null, 40 | "links": [], 41 | "rows": [ 42 | { 43 | "collapse": false, 44 | "height": "250px", 45 | "panels": [ 46 | { 47 | "aliasColors": {}, 48 | "bars": false, 49 | "datasource": "${DS_PROMETHEUS}", 50 | "fill": 1, 51 | "id": 1, 52 | "legend": { 53 | "avg": false, 54 | "current": false, 55 | "max": false, 56 | "min": false, 57 | "show": true, 58 | "total": false, 59 | "values": false 60 | }, 61 | "lines": true, 62 | "linewidth": 1, 63 | "links": [], 64 | "nullPointMode": "null", 65 | "percentage": false, 66 | "pointradius": 5, 67 | "points": false, 68 | "renderer": "flot", 69 | "seriesOverrides": [], 70 | "span": 6, 71 | "stack": false, 72 | "steppedLine": false, 73 | "targets": [ 74 | { 75 | "expr": "topk(5, github_repo_stars)", 76 | "intervalFactor": 2, 77 | "legendFormat": "{{repo}}", 78 | "metric": "github_repo_stars", 79 | "refId": "A", 80 | "step": 60 81 | } 82 | ], 83 | "thresholds": [], 84 | "timeFrom": null, 85 | "timeShift": null, 86 | "title": "Top 5 Repos", 87 | "tooltip": { 88 | "shared": true, 89 | "sort": 0, 90 | "value_type": "individual" 91 | }, 92 | "type": "graph", 93 | "xaxis": { 94 | "mode": "time", 95 | "name": null, 96 | "show": true, 97 | "values": [] 98 | }, 99 | "yaxes": [ 100 | { 101 | "format": "short", 102 | "label": null, 103 | "logBase": 1, 104 | "max": null, 105 | "min": null, 106 | "show": true 107 | }, 108 | { 109 | "format": "short", 110 | "label": null, 111 | "logBase": 1, 112 | "max": null, 113 | "min": null, 114 | "show": true 115 | } 116 | ] 117 | }, 118 | { 119 | "aliasColors": {}, 120 | "bars": false, 121 | "datasource": "${DS_PROMETHEUS}", 122 | "fill": 1, 123 | "id": 2, 124 | "legend": { 125 | "avg": false, 126 | "current": false, 127 | "max": false, 128 | "min": false, 129 | "show": true, 130 | "total": false, 131 | "values": false 132 | }, 133 | "lines": true, 134 | "linewidth": 1, 135 | "links": [], 136 | "nullPointMode": "null", 137 | "percentage": false, 138 | "pointradius": 5, 139 | "points": false, 140 | "renderer": "flot", 141 | "seriesOverrides": [], 142 | "span": 6, 143 | "stack": false, 144 | "steppedLine": false, 145 | "targets": [ 146 | { 147 | "expr": "sum(github_repo_stars)", 148 | "intervalFactor": 2, 149 | "legendFormat": "Total Github Stars", 150 | "metric": "github_repo_stars", 151 | "refId": "A", 152 | "step": 60 153 | } 154 | ], 155 | "thresholds": [], 156 | "timeFrom": null, 157 | "timeShift": null, 158 | "title": "Total GitHub Stars", 159 | "tooltip": { 160 | "shared": true, 161 | "sort": 0, 162 | "value_type": "individual" 163 | }, 164 | "type": "graph", 165 | "xaxis": { 166 | "mode": "time", 167 | "name": null, 168 | "show": true, 169 | "values": [] 170 | }, 171 | "yaxes": [ 172 | { 173 | "format": "short", 174 | "label": null, 175 | "logBase": 1, 176 | "max": null, 177 | "min": null, 178 | "show": true 179 | }, 180 | { 181 | "format": "short", 182 | "label": null, 183 | "logBase": 1, 184 | "max": null, 185 | "min": null, 186 | "show": true 187 | } 188 | ] 189 | } 190 | ], 191 | "repeat": null, 192 | "repeatIteration": null, 193 | "repeatRowId": null, 194 | "showTitle": false, 195 | "title": "Dashboard Row", 196 | "titleSize": "h6" 197 | } 198 | ], 199 | "schemaVersion": 14, 200 | "style": "dark", 201 | "tags": [], 202 | "templating": { 203 | "list": [] 204 | }, 205 | "time": { 206 | "from": "now-6h", 207 | "to": "now" 208 | }, 209 | "timepicker": { 210 | "refresh_intervals": [ 211 | "5s", 212 | "10s", 213 | "30s", 214 | "1m", 215 | "5m", 216 | "15m", 217 | "30m", 218 | "1h", 219 | "2h", 220 | "1d" 221 | ], 222 | "time_options": [ 223 | "5m", 224 | "15m", 225 | "1h", 226 | "6h", 227 | "12h", 228 | "24h", 229 | "2d", 230 | "7d", 231 | "30d" 232 | ] 233 | }, 234 | "timezone": "browser", 235 | "title": "Org Stats", 236 | "version": 0 237 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ARCHIVED - Internet Monitoring Docker Stack with Prometheus + Grafana 2 | 3 | > **ARCHIVED**: This repository has been archived. The contents have been merged into my [internet-pi](https://github.com/geerlingguy/internet-pi) repository. 4 | 5 | Stand-up a Docker [Prometheus](http://prometheus.io/) stack containing Prometheus, Grafana with [blackbox-exporter](https://github.com/prometheus/blackbox_exporter), and [speedtest-exporter](https://github.com/MiguelNdeCarvalho/speedtest-exporter) to collect and graph home Internet reliability and throughput. 6 | 7 | ## Pre-requisites 8 | 9 | Make sure Docker and [Docker Compose](https://docs.docker.com/compose/install/) are installed on your Docker host machine. 10 | 11 | ## Quick Start 12 | 13 | ``` 14 | git clone https://github.com/geerlingguy/internet-monitoring 15 | cd internet-monitoring 16 | docker-compose up -d 17 | ``` 18 | 19 | Go to [http://localhost:3030/d/o9mIe_Aik/internet-connection](http://localhost:3030/d/o9mIe_Aik/internet-connection) (change `localhost` to your docker host ip/name). 20 | 21 | ## Configuration 22 | 23 | To change what hosts you ping you change the `targets` section in [/prometheus/pinghosts.yaml](./prometheus/pinghosts.yaml) file. 24 | 25 | For speedtest the only relevant configuration is how often you want the check to happen. It is at 30 minutes by default which might be too much if you have limit on downloads. This is changed by editing `scrape_interval` under `speedtest` in [/prometheus/prometheus.yml](./prometheus/prometheus.yml). 26 | 27 | Once configurations are done, run the following command: 28 | 29 | $ docker-compose up -d 30 | 31 | That's it. docker-compose builds the entire Grafana and Prometheus stack automagically. 32 | 33 | The Grafana Dashboard is now accessible via: `http://:3030` for example http://localhost:3030 34 | 35 | username - admin 36 | password - wonka (Password is stored in the `config.monitoring` env file) 37 | 38 | The DataSource and Dashboard for Grafana are automatically provisioned. 39 | 40 | If all works it should be available at http://localhost:3030/d/o9mIe_Aik/internet-connection - if no data shows up try change the timeduration to something smaller. 41 | 42 |
43 | 44 | ## Interesting urls 45 | 46 | http://localhost:9090/targets shows status of monitored targets as seen from prometheus - in this case which hosts being pinged and speedtest. note: speedtest will take a while before it shows as UP as it takes about 30s to respond. 47 | 48 | http://localhost:9090/graph?g0.expr=probe_http_status_code&g0.tab=1 shows prometheus value for `probe_http_status_code` for each host. You can edit/play with additional values. Useful to check everything is okey in prometheus (in case Grafana is not showing the data you expect). 49 | 50 | http://localhost:9115 blackbox exporter endpoint. Lets you see what have failed/succeded. 51 | 52 | http://localhost:9798/metrics speedtest exporter endpoint. Does take about 30 seconds to show its result as it runs an actual speedtest when requested. 53 | 54 | ## Thanks and a disclaimer 55 | 56 | Thanks to @maxandersen for making the original project this fork is based on. 57 | 58 | Thanks to @vegasbrianc work on making a [super easy docker](https://github.com/vegasbrianc/github-monitoring) stack for running prometheus and grafana. 59 | 60 | This setup is not secured in any way, so please only use on non-public networks, or find a way to secure it on your own. 61 | -------------------------------------------------------------------------------- /blackbox/config/blackbox.yml: -------------------------------------------------------------------------------- 1 | modules: 2 | http_2xx: 3 | prober: http 4 | http: 5 | preferred_ip_protocol: "ip4" 6 | http_post_2xx: 7 | prober: http 8 | http: 9 | method: POST 10 | tcp_connect: 11 | prober: tcp 12 | pop3s_banner: 13 | prober: tcp 14 | tcp: 15 | query_response: 16 | - expect: "^+OK" 17 | tls: true 18 | tls_config: 19 | insecure_skip_verify: false 20 | ssh_banner: 21 | prober: tcp 22 | tcp: 23 | query_response: 24 | - expect: "^SSH-2.0-" 25 | irc_banner: 26 | prober: tcp 27 | tcp: 28 | query_response: 29 | - send: "NICK prober" 30 | - send: "USER prober prober prober :prober" 31 | - expect: "PING :([^ ]+)" 32 | send: "PONG ${1}" 33 | - expect: "^:[^ ]+ 001" 34 | icmp: 35 | prober: icmp -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.1" 2 | 3 | volumes: 4 | prometheus_data: {} 5 | grafana_data: {} 6 | 7 | networks: 8 | front-tier: 9 | back-tier: 10 | 11 | services: 12 | prometheus: 13 | image: prom/prometheus:v2.25.2 14 | restart: always 15 | volumes: 16 | - ./prometheus/:/etc/prometheus/ 17 | - prometheus_data:/prometheus 18 | command: 19 | - '--config.file=/etc/prometheus/prometheus.yml' 20 | - '--storage.tsdb.path=/prometheus' 21 | - '--web.console.libraries=/usr/share/prometheus/console_libraries' 22 | - '--web.console.templates=/usr/share/prometheus/consoles' 23 | ports: 24 | - 9090:9090 25 | links: 26 | - ping:ping 27 | - speedtest:speedtest 28 | networks: 29 | - back-tier 30 | 31 | grafana: 32 | image: grafana/grafana 33 | restart: always 34 | volumes: 35 | - grafana_data:/var/lib/grafana 36 | - ./grafana/provisioning/:/etc/grafana/provisioning/ 37 | depends_on: 38 | - prometheus 39 | ports: 40 | - 3030:3000 41 | env_file: 42 | - ./grafana/config.monitoring 43 | networks: 44 | - back-tier 45 | - front-tier 46 | 47 | ping: 48 | tty: true 49 | stdin_open: true 50 | expose: 51 | - 9115 52 | ports: 53 | - 9115:9115 54 | image: prom/blackbox-exporter 55 | restart: always 56 | volumes: 57 | - ./blackbox/config:/config 58 | command: 59 | - '--config.file=/config/blackbox.yml' 60 | networks: 61 | - back-tier 62 | 63 | speedtest: 64 | tty: true 65 | stdin_open: true 66 | expose: 67 | - 9798 68 | ports: 69 | - 9798:9798 70 | image: miguelndecarvalho/speedtest-exporter 71 | restart: always 72 | networks: 73 | - back-tier 74 | 75 | nodeexp: 76 | privileged: true 77 | image: prom/node-exporter 78 | volumes: 79 | - /proc:/host/proc:ro 80 | - /sys:/host/sys:ro 81 | - /:/rootfs:ro 82 | ports: 83 | - 9100:9100 84 | restart: always 85 | command: 86 | - '--path.procfs=/host/proc' 87 | - '--path.sysfs=/host/sys' 88 | - --collector.filesystem.ignored-mount-points 89 | - "^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)" 90 | networks: 91 | - back-tier 92 | -------------------------------------------------------------------------------- /grafana/config.monitoring: -------------------------------------------------------------------------------- 1 | GF_SECURITY_ADMIN_PASSWORD=wonka 2 | GF_USERS_ALLOW_SIGN_UP=false 3 | GF_INSTALL_PLUGINS=flant-statusmap-panel,ae3e-plotly-panel 4 | -------------------------------------------------------------------------------- /grafana/provisioning/dashboards/dashboard.yml: -------------------------------------------------------------------------------- 1 | apiVersion: 1 2 | 3 | providers: 4 | - name: 'prometheus' 5 | orgId: 1 6 | folder: '' 7 | type: file 8 | disableDeletion: false 9 | editable: true 10 | options: 11 | path: /etc/grafana/provisioning/dashboards 12 | -------------------------------------------------------------------------------- /grafana/provisioning/dashboards/internet-connection.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 | "limit": 100, 11 | "name": "Annotations & Alerts", 12 | "showIn": 0, 13 | "type": "dashboard" 14 | } 15 | ] 16 | }, 17 | "editable": true, 18 | "gnetId": null, 19 | "graphTooltip": 0, 20 | "links": [], 21 | "panels": [ 22 | { 23 | "cacheTimeout": null, 24 | "datasource": "prometheus", 25 | "fieldConfig": { 26 | "defaults": { 27 | "color": { 28 | "mode": "thresholds" 29 | }, 30 | "mappings": [ 31 | { 32 | "id": 0, 33 | "op": "=", 34 | "text": "N/A", 35 | "type": 1, 36 | "value": "null" 37 | } 38 | ], 39 | "thresholds": { 40 | "mode": "absolute", 41 | "steps": [ 42 | { 43 | "color": "#299c46", 44 | "value": null 45 | }, 46 | { 47 | "color": "blue", 48 | "value": 100 49 | } 50 | ] 51 | }, 52 | "unit": "bps" 53 | }, 54 | "overrides": [] 55 | }, 56 | "gridPos": { 57 | "h": 9, 58 | "w": 6, 59 | "x": 0, 60 | "y": 0 61 | }, 62 | "id": 8, 63 | "interval": null, 64 | "links": [], 65 | "maxDataPoints": 50000, 66 | "options": { 67 | "orientation": "horizontal", 68 | "reduceOptions": { 69 | "calcs": [ 70 | "mean" 71 | ], 72 | "fields": "", 73 | "values": false 74 | }, 75 | "showThresholdLabels": false, 76 | "showThresholdMarkers": true, 77 | "text": {} 78 | }, 79 | "pluginVersion": "7.5.6", 80 | "targets": [ 81 | { 82 | "expr": "speedtest_download_bits_per_second{}", 83 | "format": "time_series", 84 | "interval": "", 85 | "intervalFactor": 1, 86 | "legendFormat": "", 87 | "refId": "A" 88 | } 89 | ], 90 | "title": "Download", 91 | "type": "gauge" 92 | }, 93 | { 94 | "cacheTimeout": null, 95 | "datasource": "prometheus", 96 | "fieldConfig": { 97 | "defaults": { 98 | "color": { 99 | "mode": "thresholds" 100 | }, 101 | "mappings": [ 102 | { 103 | "id": 0, 104 | "op": "=", 105 | "text": "N/A", 106 | "type": 1, 107 | "value": "null" 108 | } 109 | ], 110 | "thresholds": { 111 | "mode": "absolute", 112 | "steps": [ 113 | { 114 | "color": "green", 115 | "value": null 116 | }, 117 | { 118 | "color": "blue", 119 | "value": 20 120 | } 121 | ] 122 | }, 123 | "unit": "bps" 124 | }, 125 | "overrides": [] 126 | }, 127 | "gridPos": { 128 | "h": 9, 129 | "w": 6, 130 | "x": 6, 131 | "y": 0 132 | }, 133 | "id": 10, 134 | "interval": null, 135 | "links": [], 136 | "maxDataPoints": 50000, 137 | "options": { 138 | "orientation": "horizontal", 139 | "reduceOptions": { 140 | "calcs": [ 141 | "mean" 142 | ], 143 | "fields": "", 144 | "values": false 145 | }, 146 | "showThresholdLabels": false, 147 | "showThresholdMarkers": true, 148 | "text": {} 149 | }, 150 | "pluginVersion": "7.5.6", 151 | "targets": [ 152 | { 153 | "expr": "speedtest_upload_bits_per_second{}", 154 | "format": "time_series", 155 | "interval": "", 156 | "intervalFactor": 1, 157 | "legendFormat": "", 158 | "refId": "A" 159 | } 160 | ], 161 | "title": "Upload", 162 | "type": "gauge" 163 | }, 164 | { 165 | "cacheTimeout": null, 166 | "datasource": "prometheus", 167 | "fieldConfig": { 168 | "defaults": { 169 | "color": { 170 | "mode": "thresholds" 171 | }, 172 | "decimals": 2, 173 | "mappings": [ 174 | { 175 | "id": 0, 176 | "op": "=", 177 | "text": "N/A", 178 | "type": 1, 179 | "value": "null" 180 | } 181 | ], 182 | "thresholds": { 183 | "mode": "absolute", 184 | "steps": [ 185 | { 186 | "color": "green", 187 | "value": null 188 | }, 189 | { 190 | "color": "red", 191 | "value": 80 192 | } 193 | ] 194 | }, 195 | "unit": "ms" 196 | }, 197 | "overrides": [] 198 | }, 199 | "gridPos": { 200 | "h": 9, 201 | "w": 12, 202 | "x": 12, 203 | "y": 0 204 | }, 205 | "id": 12, 206 | "interval": null, 207 | "links": [], 208 | "maxDataPoints": 50000, 209 | "options": { 210 | "orientation": "horizontal", 211 | "reduceOptions": { 212 | "calcs": [ 213 | "mean" 214 | ], 215 | "fields": "", 216 | "values": false 217 | }, 218 | "showThresholdLabels": false, 219 | "showThresholdMarkers": true, 220 | "text": {} 221 | }, 222 | "pluginVersion": "7.5.6", 223 | "targets": [ 224 | { 225 | "expr": "speedtest_ping_latency_milliseconds", 226 | "format": "time_series", 227 | "instant": false, 228 | "interval": "", 229 | "intervalFactor": 1, 230 | "legendFormat": "", 231 | "refId": "A" 232 | } 233 | ], 234 | "title": "Speedtest Ping", 235 | "type": "gauge" 236 | }, 237 | { 238 | "datasource": "prometheus", 239 | "fieldConfig": { 240 | "defaults": { 241 | "color": { 242 | "mode": "palette-classic" 243 | }, 244 | "custom": { 245 | "axisLabel": "", 246 | "axisPlacement": "auto", 247 | "barAlignment": 0, 248 | "drawStyle": "line", 249 | "fillOpacity": 50, 250 | "gradientMode": "none", 251 | "hideFrom": { 252 | "graph": false, 253 | "legend": false, 254 | "tooltip": false 255 | }, 256 | "lineInterpolation": "linear", 257 | "lineWidth": 0, 258 | "pointSize": 5, 259 | "scaleDistribution": { 260 | "type": "linear" 261 | }, 262 | "showPoints": "never", 263 | "spanNulls": true 264 | }, 265 | "mappings": [], 266 | "thresholds": { 267 | "mode": "absolute", 268 | "steps": [ 269 | { 270 | "color": "green", 271 | "value": null 272 | }, 273 | { 274 | "color": "red", 275 | "value": 80 276 | } 277 | ] 278 | }, 279 | "unit": "bps" 280 | }, 281 | "overrides": [] 282 | }, 283 | "gridPos": { 284 | "h": 9, 285 | "w": 12, 286 | "x": 0, 287 | "y": 9 288 | }, 289 | "id": 6, 290 | "links": [], 291 | "maxDataPoints": 50000, 292 | "options": { 293 | "graph": {}, 294 | "legend": { 295 | "calcs": [], 296 | "displayMode": "list", 297 | "placement": "right" 298 | }, 299 | "tooltipOptions": { 300 | "mode": "multi" 301 | } 302 | }, 303 | "pluginVersion": "7.4.5", 304 | "repeat": null, 305 | "targets": [ 306 | { 307 | "expr": "speedtest_download_bits_per_second{}", 308 | "format": "time_series", 309 | "interval": "", 310 | "intervalFactor": 1, 311 | "legendFormat": "Download", 312 | "refId": "A" 313 | }, 314 | { 315 | "expr": "speedtest_upload_bits_per_second{}", 316 | "hide": false, 317 | "interval": "", 318 | "legendFormat": "Upload", 319 | "refId": "B" 320 | } 321 | ], 322 | "timeFrom": null, 323 | "timeShift": null, 324 | "title": "Speedtest Graph", 325 | "type": "timeseries" 326 | }, 327 | { 328 | "cards": { 329 | "cardHSpacing": 2, 330 | "cardMinWidth": 5, 331 | "cardRound": null, 332 | "cardVSpacing": 2 333 | }, 334 | "color": { 335 | "cardColor": "#b4ff00", 336 | "colorScale": "sqrt", 337 | "colorScheme": "interpolateGnYlRd", 338 | "defaultColor": "#757575", 339 | "exponent": 0.5, 340 | "max": 1, 341 | "min": 0, 342 | "mode": "discrete", 343 | "thresholds": [ 344 | { 345 | "$$hashKey": "object:68", 346 | "color": "#37872D", 347 | "tooltip": "Up", 348 | "value": "1" 349 | }, 350 | { 351 | "$$hashKey": "object:72", 352 | "color": "#C4162A", 353 | "tooltip": "Down", 354 | "value": "0" 355 | } 356 | ] 357 | }, 358 | "datasource": "prometheus", 359 | "fieldConfig": { 360 | "defaults": {}, 361 | "overrides": [] 362 | }, 363 | "gridPos": { 364 | "h": 9, 365 | "w": 12, 366 | "x": 12, 367 | "y": 9 368 | }, 369 | "highlightCards": true, 370 | "id": 14, 371 | "legend": { 372 | "show": false 373 | }, 374 | "links": [], 375 | "nullPointMode": "as empty", 376 | "pageSize": 15, 377 | "seriesFilterIndex": -1, 378 | "statusmap": { 379 | "ConfigVersion": "v1" 380 | }, 381 | "targets": [ 382 | { 383 | "expr": "probe_success", 384 | "format": "time_series", 385 | "interval": "", 386 | "intervalFactor": 1, 387 | "legendFormat": "{{instance}}", 388 | "refId": "A" 389 | } 390 | ], 391 | "title": "Uptime", 392 | "tooltip": { 393 | "extraInfo": "", 394 | "freezeOnClick": true, 395 | "items": [], 396 | "show": true, 397 | "showExtraInfo": false, 398 | "showItems": false 399 | }, 400 | "type": "flant-statusmap-panel", 401 | "useMax": true, 402 | "usingPagination": false, 403 | "xAxis": { 404 | "show": true 405 | }, 406 | "yAxis": { 407 | "maxWidth": -1, 408 | "minWidth": -1, 409 | "show": true 410 | }, 411 | "yAxisSort": "metrics", 412 | "yLabel": { 413 | "delimiter": "", 414 | "labelTemplate": "", 415 | "usingSplitLabel": false 416 | } 417 | }, 418 | { 419 | "aliasColors": {}, 420 | "bars": false, 421 | "dashLength": 10, 422 | "dashes": false, 423 | "datasource": "prometheus", 424 | "fieldConfig": { 425 | "defaults": {}, 426 | "overrides": [] 427 | }, 428 | "fill": 1, 429 | "fillGradient": 0, 430 | "gridPos": { 431 | "h": 9, 432 | "w": 24, 433 | "x": 0, 434 | "y": 18 435 | }, 436 | "hiddenSeries": false, 437 | "id": 4, 438 | "legend": { 439 | "avg": false, 440 | "current": false, 441 | "max": false, 442 | "min": false, 443 | "show": true, 444 | "total": false, 445 | "values": false 446 | }, 447 | "lines": true, 448 | "linewidth": 1, 449 | "links": [], 450 | "maxPerRow": 12, 451 | "nullPointMode": "null", 452 | "options": { 453 | "alertThreshold": true 454 | }, 455 | "percentage": false, 456 | "pluginVersion": "7.5.6", 457 | "pointradius": 5, 458 | "points": false, 459 | "renderer": "flot", 460 | "repeat": "host", 461 | "repeatDirection": "h", 462 | "seriesOverrides": [], 463 | "spaceLength": 10, 464 | "stack": false, 465 | "steppedLine": false, 466 | "targets": [ 467 | { 468 | "expr": "sum(probe_http_duration_seconds) by (instance)", 469 | "format": "time_series", 470 | "intervalFactor": 1, 471 | "legendFormat": "{{instance}}", 472 | "refId": "A" 473 | } 474 | ], 475 | "thresholds": [], 476 | "timeFrom": null, 477 | "timeRegions": [], 478 | "timeShift": null, 479 | "title": "HTTP Request Duration", 480 | "tooltip": { 481 | "shared": true, 482 | "sort": 0, 483 | "value_type": "individual" 484 | }, 485 | "type": "graph", 486 | "xaxis": { 487 | "buckets": null, 488 | "mode": "time", 489 | "name": null, 490 | "show": true, 491 | "values": [] 492 | }, 493 | "yaxes": [ 494 | { 495 | "format": "short", 496 | "label": null, 497 | "logBase": 1, 498 | "max": null, 499 | "min": null, 500 | "show": true 501 | }, 502 | { 503 | "format": "short", 504 | "label": null, 505 | "logBase": 1, 506 | "max": null, 507 | "min": null, 508 | "show": true 509 | } 510 | ], 511 | "yaxis": { 512 | "align": false, 513 | "alignLevel": null 514 | } 515 | } 516 | ], 517 | "refresh": "5m", 518 | "schemaVersion": 27, 519 | "style": "dark", 520 | "tags": [ 521 | "speedtest", 522 | "ping" 523 | ], 524 | "templating": { 525 | "list": [] 526 | }, 527 | "time": { 528 | "from": "now-7d", 529 | "to": "now" 530 | }, 531 | "timepicker": { 532 | "refresh_intervals": [ 533 | "5s", 534 | "10s", 535 | "30s", 536 | "1m", 537 | "5m", 538 | "15m", 539 | "30m", 540 | "1h", 541 | "2h", 542 | "1d" 543 | ], 544 | "time_options": [ 545 | "5m", 546 | "15m", 547 | "1h", 548 | "6h", 549 | "12h", 550 | "24h", 551 | "2d", 552 | "7d", 553 | "30d" 554 | ] 555 | }, 556 | "timezone": "browser", 557 | "title": "Internet connection", 558 | "uid": "o9mIe_Aik", 559 | "version": 12 560 | } -------------------------------------------------------------------------------- /grafana/provisioning/dashboards/power-consumption.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 | "type": "dashboard" 12 | } 13 | ] 14 | }, 15 | "editable": true, 16 | "gnetId": null, 17 | "graphTooltip": 0, 18 | "id": 2, 19 | "links": [], 20 | "panels": [ 21 | { 22 | "datasource": "prometheus", 23 | "description": "", 24 | "fieldConfig": { 25 | "defaults": { 26 | "color": { 27 | "mode": "thresholds" 28 | }, 29 | "custom": {}, 30 | "mappings": [], 31 | "max": 500, 32 | "min": 0, 33 | "thresholds": { 34 | "mode": "absolute", 35 | "steps": [ 36 | { 37 | "color": "green", 38 | "value": null 39 | }, 40 | { 41 | "color": "#EAB839", 42 | "value": 150 43 | }, 44 | { 45 | "color": "red", 46 | "value": 300 47 | } 48 | ] 49 | }, 50 | "unit": "watt" 51 | }, 52 | "overrides": [] 53 | }, 54 | "gridPos": { 55 | "h": 8, 56 | "w": 12, 57 | "x": 0, 58 | "y": 0 59 | }, 60 | "id": 6, 61 | "options": { 62 | "reduceOptions": { 63 | "calcs": [ 64 | "lastNotNull" 65 | ], 66 | "fields": "", 67 | "values": false 68 | }, 69 | "showThresholdLabels": false, 70 | "showThresholdMarkers": true, 71 | "text": {} 72 | }, 73 | "pluginVersion": "7.4.5", 74 | "targets": [ 75 | { 76 | "expr": "power", 77 | "interval": "", 78 | "legendFormat": "Watts", 79 | "queryType": "randomWalk", 80 | "refId": "A" 81 | } 82 | ], 83 | "title": "Power Consumption (Latest)", 84 | "type": "gauge" 85 | }, 86 | { 87 | "datasource": "prometheus", 88 | "fieldConfig": { 89 | "defaults": { 90 | "color": { 91 | "mode": "thresholds" 92 | }, 93 | "custom": {}, 94 | "mappings": [], 95 | "max": 500, 96 | "min": 0, 97 | "thresholds": { 98 | "mode": "absolute", 99 | "steps": [ 100 | { 101 | "color": "green", 102 | "value": null 103 | }, 104 | { 105 | "color": "#EAB839", 106 | "value": 150 107 | }, 108 | { 109 | "color": "red", 110 | "value": 300 111 | } 112 | ] 113 | }, 114 | "unit": "watt" 115 | }, 116 | "overrides": [] 117 | }, 118 | "gridPos": { 119 | "h": 8, 120 | "w": 12, 121 | "x": 12, 122 | "y": 0 123 | }, 124 | "id": 4, 125 | "options": { 126 | "reduceOptions": { 127 | "calcs": [ 128 | "mean" 129 | ], 130 | "fields": "", 131 | "values": false 132 | }, 133 | "showThresholdLabels": false, 134 | "showThresholdMarkers": true, 135 | "text": {} 136 | }, 137 | "pluginVersion": "7.4.5", 138 | "targets": [ 139 | { 140 | "expr": "power", 141 | "interval": "", 142 | "legendFormat": "Watts", 143 | "queryType": "randomWalk", 144 | "refId": "A" 145 | } 146 | ], 147 | "title": "Power Consumption (Average)", 148 | "type": "gauge" 149 | }, 150 | { 151 | "aliasColors": {}, 152 | "bars": false, 153 | "dashLength": 10, 154 | "dashes": false, 155 | "datasource": "prometheus", 156 | "description": "", 157 | "fieldConfig": { 158 | "defaults": { 159 | "custom": {}, 160 | "unit": "watt" 161 | }, 162 | "overrides": [] 163 | }, 164 | "fill": 1, 165 | "fillGradient": 0, 166 | "gridPos": { 167 | "h": 8, 168 | "w": 24, 169 | "x": 0, 170 | "y": 8 171 | }, 172 | "hiddenSeries": false, 173 | "id": 2, 174 | "legend": { 175 | "avg": false, 176 | "current": false, 177 | "max": false, 178 | "min": false, 179 | "show": false, 180 | "total": false, 181 | "values": false 182 | }, 183 | "lines": true, 184 | "linewidth": 1, 185 | "nullPointMode": "null", 186 | "options": { 187 | "alertThreshold": true 188 | }, 189 | "percentage": false, 190 | "pluginVersion": "7.4.5", 191 | "pointradius": 1, 192 | "points": true, 193 | "renderer": "flot", 194 | "seriesOverrides": [], 195 | "spaceLength": 10, 196 | "stack": false, 197 | "steppedLine": false, 198 | "targets": [ 199 | { 200 | "expr": "power", 201 | "interval": "", 202 | "legendFormat": "Watts", 203 | "queryType": "randomWalk", 204 | "refId": "A" 205 | } 206 | ], 207 | "thresholds": [], 208 | "timeFrom": null, 209 | "timeRegions": [], 210 | "timeShift": null, 211 | "title": "Power Consumption", 212 | "tooltip": { 213 | "shared": true, 214 | "sort": 0, 215 | "value_type": "individual" 216 | }, 217 | "type": "graph", 218 | "xaxis": { 219 | "buckets": null, 220 | "mode": "time", 221 | "name": null, 222 | "show": true, 223 | "values": [] 224 | }, 225 | "yaxes": [ 226 | { 227 | "$$hashKey": "object:169", 228 | "decimals": null, 229 | "format": "watt", 230 | "label": null, 231 | "logBase": 1, 232 | "max": null, 233 | "min": "0", 234 | "show": true 235 | }, 236 | { 237 | "$$hashKey": "object:170", 238 | "decimals": null, 239 | "format": "short", 240 | "label": null, 241 | "logBase": 1, 242 | "max": null, 243 | "min": null, 244 | "show": true 245 | } 246 | ], 247 | "yaxis": { 248 | "align": false, 249 | "alignLevel": null 250 | } 251 | } 252 | ], 253 | "refresh": "5m", 254 | "schemaVersion": 27, 255 | "style": "dark", 256 | "tags": [ 257 | "power" 258 | ], 259 | "templating": { 260 | "list": [] 261 | }, 262 | "time": { 263 | "from": "now-6h", 264 | "to": "now" 265 | }, 266 | "timepicker": {}, 267 | "timezone": "", 268 | "title": "Power consumption", 269 | "uid": "i_aeo-uMz", 270 | "version": 3 271 | } -------------------------------------------------------------------------------- /grafana/provisioning/dashboards/starlink-overview.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 | "type": "dashboard" 12 | } 13 | ] 14 | }, 15 | "description": "Starlink dish metrics", 16 | "editable": true, 17 | "gnetId": null, 18 | "graphTooltip": 1, 19 | "links": [ 20 | { 21 | "icon": "info", 22 | "tags": [], 23 | "targetBlank": true, 24 | "title": "Starlink Debug", 25 | "tooltip": "", 26 | "type": "link", 27 | "url": "http://192.168.100.1/support/debug" 28 | }, 29 | { 30 | "icon": "info", 31 | "tags": [], 32 | "targetBlank": true, 33 | "title": "Starlink Statistics", 34 | "tooltip": "", 35 | "type": "link", 36 | "url": "http://192.168.100.1/support/statistics" 37 | }, 38 | { 39 | "icon": "bolt", 40 | "includeVars": false, 41 | "keepTime": false, 42 | "tags": [], 43 | "targetBlank": true, 44 | "title": "Speedtest.net", 45 | "tooltip": "", 46 | "type": "link", 47 | "url": "https://www.speedtest.net/" 48 | } 49 | ], 50 | "panels": [ 51 | { 52 | "aliasColors": {}, 53 | "bars": false, 54 | "dashLength": 10, 55 | "dashes": false, 56 | "datasource": "prometheus", 57 | "fieldConfig": { 58 | "defaults": { 59 | "custom": {}, 60 | "unit": "short" 61 | }, 62 | "overrides": [] 63 | }, 64 | "fill": 1, 65 | "fillGradient": 0, 66 | "gridPos": { 67 | "h": 8, 68 | "w": 16, 69 | "x": 0, 70 | "y": 0 71 | }, 72 | "hiddenSeries": false, 73 | "id": 8, 74 | "interval": "1s", 75 | "legend": { 76 | "alignAsTable": false, 77 | "avg": true, 78 | "current": true, 79 | "max": true, 80 | "min": true, 81 | "show": true, 82 | "total": false, 83 | "values": true 84 | }, 85 | "lines": true, 86 | "linewidth": 1, 87 | "nullPointMode": "null", 88 | "options": { 89 | "alertThreshold": true 90 | }, 91 | "percentage": false, 92 | "pluginVersion": "7.4.5", 93 | "pointradius": 2, 94 | "points": false, 95 | "renderer": "flot", 96 | "seriesOverrides": [ 97 | { 98 | "$$hashKey": "object:934", 99 | "alias": "Download", 100 | "color": "#FADE2A" 101 | } 102 | ], 103 | "spaceLength": 10, 104 | "stack": false, 105 | "steppedLine": false, 106 | "targets": [ 107 | { 108 | "exemplar": false, 109 | "expr": "starlink_dish_uplink_throughput_bytes / 1000000", 110 | "instant": false, 111 | "interval": "", 112 | "legendFormat": "Upload", 113 | "refId": "A" 114 | }, 115 | { 116 | "exemplar": false, 117 | "expr": "starlink_dish_downlink_throughput_bytes /1000000", 118 | "hide": false, 119 | "interval": "", 120 | "legendFormat": "Download", 121 | "refId": "B" 122 | } 123 | ], 124 | "thresholds": [], 125 | "timeFrom": null, 126 | "timeRegions": [], 127 | "timeShift": null, 128 | "title": "Actual Throughput", 129 | "tooltip": { 130 | "shared": true, 131 | "sort": 0, 132 | "value_type": "individual" 133 | }, 134 | "type": "graph", 135 | "xaxis": { 136 | "buckets": null, 137 | "mode": "time", 138 | "name": null, 139 | "show": true, 140 | "values": [] 141 | }, 142 | "yaxes": [ 143 | { 144 | "$$hashKey": "object:95", 145 | "decimals": null, 146 | "format": "short", 147 | "label": "Mbps", 148 | "logBase": 1, 149 | "max": null, 150 | "min": null, 151 | "show": true 152 | }, 153 | { 154 | "$$hashKey": "object:96", 155 | "format": "short", 156 | "label": "Upload (Mbps)", 157 | "logBase": 1, 158 | "max": null, 159 | "min": null, 160 | "show": false 161 | } 162 | ], 163 | "yaxis": { 164 | "align": false, 165 | "alignLevel": 0 166 | } 167 | }, 168 | { 169 | "datasource": "prometheus", 170 | "fieldConfig": { 171 | "defaults": { 172 | "color": { 173 | "mode": "thresholds" 174 | }, 175 | "custom": {}, 176 | "mappings": [], 177 | "max": 9, 178 | "min": 0, 179 | "thresholds": { 180 | "mode": "absolute", 181 | "steps": [ 182 | { 183 | "color": "red", 184 | "value": null 185 | }, 186 | { 187 | "color": "orange", 188 | "value": 5 189 | }, 190 | { 191 | "color": "yellow", 192 | "value": 6 193 | }, 194 | { 195 | "color": "green", 196 | "value": 8 197 | } 198 | ] 199 | }, 200 | "unit": "short" 201 | }, 202 | "overrides": [] 203 | }, 204 | "gridPos": { 205 | "h": 5, 206 | "w": 4, 207 | "x": 16, 208 | "y": 0 209 | }, 210 | "id": 19, 211 | "interval": "1s", 212 | "options": { 213 | "reduceOptions": { 214 | "calcs": [ 215 | "lastNotNull" 216 | ], 217 | "fields": "", 218 | "values": false 219 | }, 220 | "showThresholdLabels": false, 221 | "showThresholdMarkers": true, 222 | "text": {} 223 | }, 224 | "pluginVersion": "7.4.5", 225 | "targets": [ 226 | { 227 | "exemplar": false, 228 | "expr": "starlink_dish_snr", 229 | "interval": "", 230 | "legendFormat": "", 231 | "refId": "A" 232 | } 233 | ], 234 | "title": "Current SNR", 235 | "type": "gauge" 236 | }, 237 | { 238 | "datasource": "prometheus", 239 | "fieldConfig": { 240 | "defaults": { 241 | "color": { 242 | "fixedColor": "rgb(245, 245, 245)", 243 | "mode": "fixed" 244 | }, 245 | "custom": {}, 246 | "mappings": [ 247 | { 248 | "from": "", 249 | "id": 1, 250 | "text": "Unknown", 251 | "to": "", 252 | "type": 1, 253 | "value": "0" 254 | }, 255 | { 256 | "from": "", 257 | "id": 2, 258 | "text": "Connected", 259 | "to": "", 260 | "type": 1, 261 | "value": "1" 262 | }, 263 | { 264 | "from": "", 265 | "id": 3, 266 | "text": "Searching", 267 | "to": "", 268 | "type": 1, 269 | "value": "2" 270 | }, 271 | { 272 | "from": "", 273 | "id": 4, 274 | "text": "Booting", 275 | "to": "", 276 | "type": 1, 277 | "value": "3" 278 | } 279 | ], 280 | "thresholds": { 281 | "mode": "absolute", 282 | "steps": [ 283 | { 284 | "color": "green", 285 | "value": null 286 | } 287 | ] 288 | } 289 | }, 290 | "overrides": [] 291 | }, 292 | "gridPos": { 293 | "h": 3, 294 | "w": 2, 295 | "x": 20, 296 | "y": 0 297 | }, 298 | "id": 34, 299 | "options": { 300 | "colorMode": "value", 301 | "graphMode": "none", 302 | "justifyMode": "auto", 303 | "orientation": "auto", 304 | "reduceOptions": { 305 | "calcs": [ 306 | "lastNotNull" 307 | ], 308 | "fields": "", 309 | "values": false 310 | }, 311 | "text": {}, 312 | "textMode": "auto" 313 | }, 314 | "pluginVersion": "7.4.5", 315 | "targets": [ 316 | { 317 | "exemplar": false, 318 | "expr": "starlink_dish_state", 319 | "interval": "", 320 | "legendFormat": "", 321 | "refId": "A" 322 | } 323 | ], 324 | "title": "State", 325 | "type": "stat" 326 | }, 327 | { 328 | "datasource": "prometheus", 329 | "description": "", 330 | "fieldConfig": { 331 | "defaults": { 332 | "color": { 333 | "mode": "thresholds" 334 | }, 335 | "custom": {}, 336 | "mappings": [], 337 | "min": 0, 338 | "thresholds": { 339 | "mode": "absolute", 340 | "steps": [ 341 | { 342 | "color": "green", 343 | "value": null 344 | }, 345 | { 346 | "color": "yellow", 347 | "value": 300 348 | }, 349 | { 350 | "color": "orange", 351 | "value": 600 352 | }, 353 | { 354 | "color": "red", 355 | "value": 900 356 | } 357 | ] 358 | }, 359 | "unit": "s" 360 | }, 361 | "overrides": [] 362 | }, 363 | "gridPos": { 364 | "h": 3, 365 | "w": 2, 366 | "x": 22, 367 | "y": 0 368 | }, 369 | "id": 4, 370 | "options": { 371 | "colorMode": "value", 372 | "graphMode": "area", 373 | "justifyMode": "auto", 374 | "orientation": "auto", 375 | "reduceOptions": { 376 | "calcs": [ 377 | "lastNotNull" 378 | ], 379 | "fields": "", 380 | "values": false 381 | }, 382 | "text": {}, 383 | "textMode": "auto" 384 | }, 385 | "pluginVersion": "7.4.5", 386 | "targets": [ 387 | { 388 | "exemplar": false, 389 | "expr": "starlink_dish_last_24h_obstructed_seconds", 390 | "format": "time_series", 391 | "interval": "", 392 | "legendFormat": "", 393 | "refId": "A" 394 | } 395 | ], 396 | "timeFrom": null, 397 | "title": "24h Obstructed Time", 398 | "transformations": [], 399 | "type": "stat" 400 | }, 401 | { 402 | "datasource": "prometheus", 403 | "fieldConfig": { 404 | "defaults": { 405 | "color": { 406 | "mode": "thresholds" 407 | }, 408 | "custom": {}, 409 | "mappings": [ 410 | { 411 | "from": "", 412 | "id": 1, 413 | "text": "False", 414 | "to": "", 415 | "type": 1, 416 | "value": "0" 417 | }, 418 | { 419 | "from": "", 420 | "id": 2, 421 | "text": "True", 422 | "to": "", 423 | "type": 1, 424 | "value": "1" 425 | } 426 | ], 427 | "thresholds": { 428 | "mode": "absolute", 429 | "steps": [ 430 | { 431 | "color": "green", 432 | "value": null 433 | }, 434 | { 435 | "color": "red", 436 | "value": 1 437 | } 438 | ] 439 | } 440 | }, 441 | "overrides": [] 442 | }, 443 | "gridPos": { 444 | "h": 2, 445 | "w": 2, 446 | "x": 20, 447 | "y": 3 448 | }, 449 | "id": 13, 450 | "options": { 451 | "colorMode": "value", 452 | "graphMode": "none", 453 | "justifyMode": "auto", 454 | "orientation": "auto", 455 | "reduceOptions": { 456 | "calcs": [ 457 | "lastNotNull" 458 | ], 459 | "fields": "", 460 | "values": false 461 | }, 462 | "text": {}, 463 | "textMode": "auto" 464 | }, 465 | "pluginVersion": "7.4.5", 466 | "targets": [ 467 | { 468 | "exemplar": false, 469 | "expr": "starlink_dish_alert_slow_eth_speeds", 470 | "interval": "", 471 | "legendFormat": "", 472 | "refId": "A" 473 | } 474 | ], 475 | "title": "Slow Ethernet", 476 | "type": "stat" 477 | }, 478 | { 479 | "datasource": "prometheus", 480 | "fieldConfig": { 481 | "defaults": { 482 | "color": { 483 | "mode": "thresholds" 484 | }, 485 | "custom": {}, 486 | "mappings": [ 487 | { 488 | "from": "", 489 | "id": 1, 490 | "text": "False", 491 | "to": "", 492 | "type": 1, 493 | "value": "0" 494 | }, 495 | { 496 | "from": "", 497 | "id": 2, 498 | "text": "True", 499 | "to": "", 500 | "type": 1, 501 | "value": "1" 502 | } 503 | ], 504 | "thresholds": { 505 | "mode": "absolute", 506 | "steps": [ 507 | { 508 | "color": "green", 509 | "value": null 510 | }, 511 | { 512 | "color": "red", 513 | "value": 1 514 | } 515 | ] 516 | } 517 | }, 518 | "overrides": [] 519 | }, 520 | "gridPos": { 521 | "h": 2, 522 | "w": 2, 523 | "x": 22, 524 | "y": 3 525 | }, 526 | "id": 16, 527 | "options": { 528 | "colorMode": "value", 529 | "graphMode": "none", 530 | "justifyMode": "auto", 531 | "orientation": "auto", 532 | "reduceOptions": { 533 | "calcs": [ 534 | "lastNotNull" 535 | ], 536 | "fields": "", 537 | "values": false 538 | }, 539 | "text": {}, 540 | "textMode": "auto" 541 | }, 542 | "pluginVersion": "7.4.5", 543 | "targets": [ 544 | { 545 | "exemplar": false, 546 | "expr": "starlink_dish_alert_unexpected_location", 547 | "interval": "", 548 | "legendFormat": "", 549 | "refId": "A" 550 | } 551 | ], 552 | "title": "Unexpected Location", 553 | "type": "stat" 554 | }, 555 | { 556 | "datasource": "prometheus", 557 | "description": "", 558 | "fieldConfig": { 559 | "defaults": { 560 | "custom": {} 561 | }, 562 | "overrides": [] 563 | }, 564 | "gridPos": { 565 | "h": 6, 566 | "w": 4, 567 | "x": 16, 568 | "y": 5 569 | }, 570 | "id": 2, 571 | "options": { 572 | "config": { 573 | "displayModeBar": false 574 | }, 575 | "data": [ 576 | { 577 | "line": { 578 | "color": "red", 579 | "width": 2 580 | }, 581 | "mode": "lines", 582 | "type": "scatter" 583 | } 584 | ], 585 | "layout": { 586 | "font": { 587 | "color": "darkgrey" 588 | }, 589 | "margin": { 590 | "b": 20, 591 | "t": 30 592 | }, 593 | "paper_bgcolor": "rgba(0,0,0,0)", 594 | "plot_bgcolor": "rgba(0,0,0,0)", 595 | "xaxis": { 596 | "autorange": false, 597 | "range": [ 598 | "2000-06-13 20:19:55.8287", 599 | "2000-06-18 15:40:49.7421" 600 | ], 601 | "type": "date" 602 | } 603 | }, 604 | "onclick": "\n\n", 605 | "script": "var data = [\n {\n r: [data.series[0].fields[1].values.buffer[0] * 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n theta: [\"0\", \"30\", \"60\", \"90\", \"120\", \"150\", \"180\", \"210\", \"240\", \"270\", \"300\", \"330\"],\n name: \"0°-30°\",\n marker: {color: \"rgb(255,0,0)\"},\n type: \"barpolar\",\n showlegend: false,\n offset: 0,\n hovertext: \"Obstructions between 0° and 30°\",\n hoverinfo: \"text+r\"\n },\n {\n r: [0, data.series[1].fields[1].values.buffer[0] * 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n theta: [\"0\", \"30\", \"60\", \"90\", \"120\", \"150\", \"180\", \"210\", \"240\", \"270\", \"300\", \"330\"],\n name: \"30°-60°\",\n marker: {color: \"rgb(255,125,0)\"},\n type: \"barpolar\",\n showlegend: false,\n offset: 0,\n hovertext: \"Obstructions between 30° and 60°\",\n hoverinfo: \"text+r\"\n },\n {\n r: [0, 0, data.series[2].fields[1].values.buffer[0] * 100, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n theta: [\"0\", \"30\", \"60\", \"90\", \"120\", \"150\", \"180\", \"210\", \"240\", \"270\", \"300\", \"330\"],\n name: \"60°-90°\",\n marker: {color: \"rgb(255,225,0)\"},\n type: \"barpolar\",\n showlegend: false,\n offset: 0,\n hovertext: \"Obstructions between 60° and 90°\",\n hoverinfo: \"text+r\"\n },\n {\n r: [0, 0, 0, data.series[3].fields[1].values.buffer[0] * 100, 0, 0, 0, 0, 0, 0, 0, 0],\n theta: [\"0\", \"30\", \"60\", \"90\", \"120\", \"150\", \"180\", \"210\", \"240\", \"270\", \"300\", \"330\"],\n name: \"90°-120°\",\n marker: {color: \"rgb(125,255,0)\"},\n type: \"barpolar\",\n showlegend: false,\n offset: 0,\n hovertext: \"Obstructions between 90° and 120°\",\n hoverinfo: \"text+r\"\n },\n {\n r: [0, 0, 0, 0, data.series[4].fields[1].values.buffer[0] * 100, 0, 0, 0, 0, 0, 0, 0],\n theta: [\"0\", \"30\", \"60\", \"90\", \"120\", \"150\", \"180\", \"210\", \"240\", \"270\", \"300\", \"330\"],\n name: \"120°-150°\",\n marker: {color: \"rgb(0,255,0)\"},\n type: \"barpolar\",\n showlegend: false,\n offset: 0,\n hovertext: \"Obstructions between 120° and 150°\",\n hoverinfo: \"text+r\"\n },\n {\n r: [0, 0, 0, 0, 0, data.series[5].fields[1].values.buffer[0] * 100, 0, 0, 0, 0, 0, 0],\n theta: [\"0\", \"30\", \"60\", \"90\", \"120\", \"150\", \"180\", \"210\", \"240\", \"270\", \"300\", \"330\"],\n name: \"150°-180°\",\n marker: {color: \"rgb(0,255,125)\"},\n type: \"barpolar\",\n showlegend: false,\n offset: 0,\n hovertext: \"Obstructions between 150° and 180°\",\n hoverinfo: \"text+r\"\n },\n {\n r: [0, 0, 0, 0, 0, 0, data.series[6].fields[1].values.buffer[0] * 100, 0, 0, 0, 0, 0],\n theta: [\"0\", \"30\", \"60\", \"90\", \"120\", \"150\", \"180\", \"210\", \"240\", \"270\", \"300\", \"330\"],\n name: \"180°-210°\",\n marker: {color: \"rgb(0,255,255)\"},\n type: \"barpolar\",\n showlegend: false,\n offset: 0,\n hovertext: \"Obstructions between 180° and 210°\",\n hoverinfo: \"text+r\"\n },\n {\n r: [0, 0, 0, 0, 0, 0, 0, data.series[7].fields[1].values.buffer[0] * 100, 0, 0, 0, 0],\n theta: [\"0\", \"30\", \"60\", \"90\", \"120\", \"150\", \"180\", \"210\", \"240\", \"270\", \"300\", \"330\"],\n name: \"210°-240°\",\n marker: {color: \"rgb(0,125,255)\"},\n type: \"barpolar\",\n showlegend: false,\n offset: 0,\n hovertext: \"Obstructions between 210° and 240°\",\n hoverinfo: \"text+r\"\n },\n {\n r: [0, 0, 0, 0, 0, 0, 0, 0, data.series[8].fields[1].values.buffer[0] * 100, 0, 0, 0],\n theta: [\"0\", \"30\", \"60\", \"90\", \"120\", \"150\", \"180\", \"210\", \"240\", \"270\", \"300\", \"330\"],\n name: \"240°-270°\",\n marker: {color: \"rgb(0,0,255)\"},\n type: \"barpolar\",\n showlegend: false,\n offset: 0,\n hovertext: \"Obstructions between 240° and 270°\",\n hoverinfo: \"text+r\"\n },\n {\n r: [0, 0, 0, 0, 0, 0, 0, 0, 0, data.series[9].fields[1].values.buffer[0] * 100, 0, 0],\n theta: [\"0\", \"30\", \"60\", \"90\", \"120\", \"150\", \"180\", \"210\", \"240\", \"270\", \"300\", \"330\"],\n name: \"270°-300°\",\n marker: {color: \"rgb(125,0,255)\"},\n type: \"barpolar\",\n showlegend: false,\n offset: 0,\n hovertext: \"Obstructions between 270° and 300°\",\n hoverinfo: \"text+r\"\n },\n {\n r: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, data.series[10].fields[1].values.buffer[0] * 100, 0],\n theta: [\"0\", \"30\", \"60\", \"90\", \"120\", \"150\", \"180\", \"210\", \"240\", \"270\", \"300\", \"330\"],\n name: \"300°-330°\",\n marker: {color: \"rgb(255,0,255)\"},\n type: \"barpolar\",\n showlegend: false,\n offset: 0,\n hovertext: \"Obstructions between 300° and 330°\",\n hoverinfo: \"text+r\"\n },\n {\n r: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, data.series[11].fields[1].values.buffer[0] * 100],\n theta: [\"0\", \"30\", \"60\", \"90\", \"120\", \"150\", \"180\", \"210\", \"240\", \"270\", \"300\", \"330\"],\n name: \"330°-360°\",\n marker: {color: \"rgb(255,0,125)\"},\n type: \"barpolar\",\n showlegend: false,\n offset: 0,\n hovertext: \"Obstructions between 330° and 360°\",\n hoverinfo: \"text+r\"\n }\n]\nvar layout = {\n font: {size: 12},\n legend: {font: {size: 10}},\n polar: {\n barmode: \"overlay\",\n bargap: 0,\n radialaxis: {ticksuffix: \"%\", angle: 45, dtick: 10},\n angularaxis: {direction: \"clockwise\"}\n }\n}\n\nreturn {data: data, layout: layout}\n" 606 | }, 607 | "pluginVersion": "7.4.5", 608 | "targets": [ 609 | { 610 | "exemplar": false, 611 | "expr": "starlink_dish_wedge_fraction_obstruction_ratio{wedge=\"0\"}", 612 | "instant": true, 613 | "interval": "", 614 | "legendFormat": "", 615 | "refId": "A" 616 | }, 617 | { 618 | "exemplar": false, 619 | "expr": "starlink_dish_wedge_fraction_obstruction_ratio{wedge=\"1\"}", 620 | "hide": false, 621 | "instant": true, 622 | "interval": "", 623 | "legendFormat": "", 624 | "refId": "B" 625 | }, 626 | { 627 | "exemplar": false, 628 | "expr": "starlink_dish_wedge_fraction_obstruction_ratio{wedge=\"2\"}", 629 | "hide": false, 630 | "instant": true, 631 | "interval": "", 632 | "legendFormat": "", 633 | "refId": "C" 634 | }, 635 | { 636 | "exemplar": false, 637 | "expr": "starlink_dish_wedge_fraction_obstruction_ratio{wedge=\"3\"}", 638 | "hide": false, 639 | "instant": true, 640 | "interval": "", 641 | "legendFormat": "", 642 | "refId": "D" 643 | }, 644 | { 645 | "exemplar": false, 646 | "expr": "starlink_dish_wedge_fraction_obstruction_ratio{wedge=\"4\"}", 647 | "hide": false, 648 | "instant": true, 649 | "interval": "", 650 | "legendFormat": "", 651 | "refId": "E" 652 | }, 653 | { 654 | "exemplar": false, 655 | "expr": "starlink_dish_wedge_fraction_obstruction_ratio{wedge=\"5\"}", 656 | "hide": false, 657 | "instant": true, 658 | "interval": "", 659 | "legendFormat": "", 660 | "refId": "F" 661 | }, 662 | { 663 | "exemplar": false, 664 | "expr": "starlink_dish_wedge_fraction_obstruction_ratio{wedge=\"6\"}", 665 | "hide": false, 666 | "instant": true, 667 | "interval": "", 668 | "legendFormat": "", 669 | "refId": "G" 670 | }, 671 | { 672 | "exemplar": false, 673 | "expr": "starlink_dish_wedge_fraction_obstruction_ratio{wedge=\"7\"}", 674 | "hide": false, 675 | "instant": true, 676 | "interval": "", 677 | "legendFormat": "", 678 | "refId": "H" 679 | }, 680 | { 681 | "exemplar": false, 682 | "expr": "starlink_dish_wedge_fraction_obstruction_ratio{wedge=\"8\"}", 683 | "hide": false, 684 | "instant": true, 685 | "interval": "", 686 | "legendFormat": "", 687 | "refId": "I" 688 | }, 689 | { 690 | "exemplar": false, 691 | "expr": "starlink_dish_wedge_fraction_obstruction_ratio{wedge=\"9\"}", 692 | "hide": false, 693 | "instant": true, 694 | "interval": "", 695 | "legendFormat": "", 696 | "refId": "J" 697 | }, 698 | { 699 | "exemplar": false, 700 | "expr": "starlink_dish_wedge_fraction_obstruction_ratio{wedge=\"10\"}", 701 | "hide": false, 702 | "instant": true, 703 | "interval": "", 704 | "legendFormat": "", 705 | "refId": "K" 706 | }, 707 | { 708 | "exemplar": false, 709 | "expr": "starlink_dish_wedge_fraction_obstruction_ratio{wedge=\"11\"}", 710 | "hide": false, 711 | "instant": true, 712 | "interval": "", 713 | "legendFormat": "", 714 | "refId": "L" 715 | } 716 | ], 717 | "title": "Wedge Fraction Obstructions", 718 | "type": "ae3e-plotly-panel" 719 | }, 720 | { 721 | "datasource": "prometheus", 722 | "fieldConfig": { 723 | "defaults": { 724 | "color": { 725 | "mode": "thresholds" 726 | }, 727 | "custom": {}, 728 | "mappings": [ 729 | { 730 | "from": "", 731 | "id": 1, 732 | "text": "False", 733 | "to": "", 734 | "type": 1, 735 | "value": "0" 736 | }, 737 | { 738 | "from": "", 739 | "id": 2, 740 | "text": "True", 741 | "to": "", 742 | "type": 1, 743 | "value": "1" 744 | } 745 | ], 746 | "thresholds": { 747 | "mode": "absolute", 748 | "steps": [ 749 | { 750 | "color": "green", 751 | "value": null 752 | }, 753 | { 754 | "color": "red", 755 | "value": 1 756 | } 757 | ] 758 | } 759 | }, 760 | "overrides": [] 761 | }, 762 | "gridPos": { 763 | "h": 2, 764 | "w": 2, 765 | "x": 20, 766 | "y": 5 767 | }, 768 | "id": 6, 769 | "interval": "1s", 770 | "options": { 771 | "colorMode": "value", 772 | "graphMode": "none", 773 | "justifyMode": "auto", 774 | "orientation": "auto", 775 | "reduceOptions": { 776 | "calcs": [ 777 | "lastNotNull" 778 | ], 779 | "fields": "", 780 | "values": false 781 | }, 782 | "text": {}, 783 | "textMode": "auto" 784 | }, 785 | "pluginVersion": "7.4.5", 786 | "targets": [ 787 | { 788 | "exemplar": false, 789 | "expr": "starlink_dish_currently_obstructed", 790 | "interval": "", 791 | "legendFormat": "", 792 | "refId": "A" 793 | } 794 | ], 795 | "title": "Currently Obstructed", 796 | "type": "stat" 797 | }, 798 | { 799 | "datasource": "prometheus", 800 | "fieldConfig": { 801 | "defaults": { 802 | "color": { 803 | "mode": "thresholds" 804 | }, 805 | "custom": {}, 806 | "mappings": [ 807 | { 808 | "from": "", 809 | "id": 1, 810 | "text": "False", 811 | "to": "", 812 | "type": 1, 813 | "value": "0" 814 | }, 815 | { 816 | "from": "", 817 | "id": 2, 818 | "text": "True", 819 | "to": "", 820 | "type": 1, 821 | "value": "1" 822 | } 823 | ], 824 | "thresholds": { 825 | "mode": "absolute", 826 | "steps": [ 827 | { 828 | "color": "green", 829 | "value": null 830 | }, 831 | { 832 | "color": "purple", 833 | "value": 1 834 | } 835 | ] 836 | } 837 | }, 838 | "overrides": [] 839 | }, 840 | "gridPos": { 841 | "h": 2, 842 | "w": 2, 843 | "x": 22, 844 | "y": 5 845 | }, 846 | "id": 29, 847 | "interval": "1s", 848 | "options": { 849 | "colorMode": "value", 850 | "graphMode": "none", 851 | "justifyMode": "auto", 852 | "orientation": "auto", 853 | "reduceOptions": { 854 | "calcs": [ 855 | "lastNotNull" 856 | ], 857 | "fields": "", 858 | "values": false 859 | }, 860 | "text": {}, 861 | "textMode": "auto" 862 | }, 863 | "pluginVersion": "7.4.5", 864 | "targets": [ 865 | { 866 | "expr": "max(speedtest_up)", 867 | "instant": false, 868 | "interval": "", 869 | "legendFormat": "", 870 | "refId": "A" 871 | } 872 | ], 873 | "title": "Speed Test", 874 | "type": "stat" 875 | }, 876 | { 877 | "datasource": "prometheus", 878 | "fieldConfig": { 879 | "defaults": { 880 | "color": { 881 | "mode": "thresholds" 882 | }, 883 | "custom": {}, 884 | "mappings": [ 885 | { 886 | "from": "", 887 | "id": 1, 888 | "text": "False", 889 | "to": "", 890 | "type": 1, 891 | "value": "0" 892 | }, 893 | { 894 | "from": "", 895 | "id": 2, 896 | "text": "True", 897 | "to": "", 898 | "type": 1, 899 | "value": "1" 900 | } 901 | ], 902 | "thresholds": { 903 | "mode": "absolute", 904 | "steps": [ 905 | { 906 | "color": "green", 907 | "value": null 908 | }, 909 | { 910 | "color": "red", 911 | "value": 1 912 | } 913 | ] 914 | } 915 | }, 916 | "overrides": [] 917 | }, 918 | "gridPos": { 919 | "h": 2, 920 | "w": 2, 921 | "x": 20, 922 | "y": 7 923 | }, 924 | "id": 14, 925 | "options": { 926 | "colorMode": "value", 927 | "graphMode": "none", 928 | "justifyMode": "auto", 929 | "orientation": "auto", 930 | "reduceOptions": { 931 | "calcs": [ 932 | "lastNotNull" 933 | ], 934 | "fields": "", 935 | "values": false 936 | }, 937 | "text": {}, 938 | "textMode": "auto" 939 | }, 940 | "pluginVersion": "7.4.5", 941 | "targets": [ 942 | { 943 | "exemplar": false, 944 | "expr": "starlink_dish_alert_mast_not_near_vertical", 945 | "interval": "", 946 | "legendFormat": "", 947 | "refId": "A" 948 | } 949 | ], 950 | "title": "Mast Not Near Vertical", 951 | "type": "stat" 952 | }, 953 | { 954 | "datasource": "prometheus", 955 | "fieldConfig": { 956 | "defaults": { 957 | "color": { 958 | "mode": "thresholds" 959 | }, 960 | "custom": {}, 961 | "mappings": [ 962 | { 963 | "from": "", 964 | "id": 1, 965 | "text": "False", 966 | "to": "", 967 | "type": 1, 968 | "value": "0" 969 | }, 970 | { 971 | "from": "", 972 | "id": 2, 973 | "text": "True", 974 | "to": "", 975 | "type": 1, 976 | "value": "1" 977 | } 978 | ], 979 | "thresholds": { 980 | "mode": "absolute", 981 | "steps": [ 982 | { 983 | "color": "green", 984 | "value": null 985 | }, 986 | { 987 | "color": "red", 988 | "value": 1 989 | } 990 | ] 991 | } 992 | }, 993 | "overrides": [] 994 | }, 995 | "gridPos": { 996 | "h": 2, 997 | "w": 2, 998 | "x": 22, 999 | "y": 7 1000 | }, 1001 | "id": 17, 1002 | "options": { 1003 | "colorMode": "value", 1004 | "graphMode": "none", 1005 | "justifyMode": "auto", 1006 | "orientation": "auto", 1007 | "reduceOptions": { 1008 | "calcs": [ 1009 | "lastNotNull" 1010 | ], 1011 | "fields": "", 1012 | "values": false 1013 | }, 1014 | "text": {}, 1015 | "textMode": "auto" 1016 | }, 1017 | "pluginVersion": "7.4.5", 1018 | "targets": [ 1019 | { 1020 | "exemplar": false, 1021 | "expr": "starlink_dish_alert_thermal_throttle", 1022 | "interval": "", 1023 | "legendFormat": "", 1024 | "refId": "A" 1025 | } 1026 | ], 1027 | "title": "Thermal throttle", 1028 | "type": "stat" 1029 | }, 1030 | { 1031 | "aliasColors": {}, 1032 | "bars": false, 1033 | "dashLength": 10, 1034 | "dashes": false, 1035 | "datasource": "prometheus", 1036 | "fieldConfig": { 1037 | "defaults": { 1038 | "custom": {} 1039 | }, 1040 | "overrides": [] 1041 | }, 1042 | "fill": 1, 1043 | "fillGradient": 0, 1044 | "gridPos": { 1045 | "h": 8, 1046 | "w": 16, 1047 | "x": 0, 1048 | "y": 8 1049 | }, 1050 | "hiddenSeries": false, 1051 | "id": 10, 1052 | "interval": "1s", 1053 | "legend": { 1054 | "alignAsTable": false, 1055 | "avg": true, 1056 | "current": true, 1057 | "hideEmpty": false, 1058 | "hideZero": false, 1059 | "max": true, 1060 | "min": true, 1061 | "rightSide": false, 1062 | "show": true, 1063 | "total": false, 1064 | "values": true 1065 | }, 1066 | "lines": true, 1067 | "linewidth": 1, 1068 | "nullPointMode": "null", 1069 | "options": { 1070 | "alertThreshold": true 1071 | }, 1072 | "percentage": false, 1073 | "pluginVersion": "7.4.5", 1074 | "pointradius": 2, 1075 | "points": false, 1076 | "renderer": "flot", 1077 | "seriesOverrides": [ 1078 | { 1079 | "$$hashKey": "object:94", 1080 | "alias": "Ping Drop", 1081 | "bars": true, 1082 | "color": "#F2495C", 1083 | "lines": false, 1084 | "yaxis": 2 1085 | }, 1086 | { 1087 | "$$hashKey": "object:613", 1088 | "alias": "Latency", 1089 | "color": "#5794F2" 1090 | } 1091 | ], 1092 | "spaceLength": 10, 1093 | "stack": false, 1094 | "steppedLine": false, 1095 | "targets": [ 1096 | { 1097 | "exemplar": false, 1098 | "expr": "starlink_dish_pop_ping_latency_seconds", 1099 | "interval": "", 1100 | "legendFormat": "Latency", 1101 | "refId": "A" 1102 | }, 1103 | { 1104 | "exemplar": false, 1105 | "expr": "starlink_dish_pop_ping_drop_ratio", 1106 | "hide": false, 1107 | "interval": "", 1108 | "legendFormat": "Ping Drop", 1109 | "refId": "B" 1110 | } 1111 | ], 1112 | "thresholds": [], 1113 | "timeFrom": null, 1114 | "timeRegions": [], 1115 | "timeShift": null, 1116 | "title": "Latency/Drop", 1117 | "tooltip": { 1118 | "shared": true, 1119 | "sort": 0, 1120 | "value_type": "individual" 1121 | }, 1122 | "type": "graph", 1123 | "xaxis": { 1124 | "buckets": null, 1125 | "mode": "time", 1126 | "name": null, 1127 | "show": true, 1128 | "values": [] 1129 | }, 1130 | "yaxes": [ 1131 | { 1132 | "$$hashKey": "object:201", 1133 | "format": "ms", 1134 | "label": "Time", 1135 | "logBase": 1, 1136 | "max": null, 1137 | "min": "0", 1138 | "show": true 1139 | }, 1140 | { 1141 | "$$hashKey": "object:202", 1142 | "format": "percentunit", 1143 | "label": "Drop", 1144 | "logBase": 1, 1145 | "max": "1", 1146 | "min": "0", 1147 | "show": true 1148 | } 1149 | ], 1150 | "yaxis": { 1151 | "align": false, 1152 | "alignLevel": null 1153 | } 1154 | }, 1155 | { 1156 | "datasource": "prometheus", 1157 | "fieldConfig": { 1158 | "defaults": { 1159 | "color": { 1160 | "mode": "thresholds" 1161 | }, 1162 | "custom": {}, 1163 | "mappings": [ 1164 | { 1165 | "from": "", 1166 | "id": 1, 1167 | "text": "False", 1168 | "to": "", 1169 | "type": 1, 1170 | "value": "0" 1171 | }, 1172 | { 1173 | "from": "", 1174 | "id": 2, 1175 | "text": "True", 1176 | "to": "", 1177 | "type": 1, 1178 | "value": "1" 1179 | } 1180 | ], 1181 | "thresholds": { 1182 | "mode": "absolute", 1183 | "steps": [ 1184 | { 1185 | "color": "green", 1186 | "value": null 1187 | }, 1188 | { 1189 | "color": "red", 1190 | "value": 1 1191 | } 1192 | ] 1193 | } 1194 | }, 1195 | "overrides": [] 1196 | }, 1197 | "gridPos": { 1198 | "h": 2, 1199 | "w": 2, 1200 | "x": 20, 1201 | "y": 9 1202 | }, 1203 | "id": 12, 1204 | "options": { 1205 | "colorMode": "value", 1206 | "graphMode": "none", 1207 | "justifyMode": "auto", 1208 | "orientation": "auto", 1209 | "reduceOptions": { 1210 | "calcs": [ 1211 | "lastNotNull" 1212 | ], 1213 | "fields": "", 1214 | "values": false 1215 | }, 1216 | "text": {}, 1217 | "textMode": "auto" 1218 | }, 1219 | "pluginVersion": "7.4.5", 1220 | "targets": [ 1221 | { 1222 | "exemplar": false, 1223 | "expr": "starlink_dish_alert_motors_stuck", 1224 | "interval": "", 1225 | "legendFormat": "", 1226 | "refId": "A" 1227 | } 1228 | ], 1229 | "title": "Motors Stuck", 1230 | "type": "stat" 1231 | }, 1232 | { 1233 | "datasource": "prometheus", 1234 | "fieldConfig": { 1235 | "defaults": { 1236 | "color": { 1237 | "mode": "thresholds" 1238 | }, 1239 | "custom": {}, 1240 | "mappings": [ 1241 | { 1242 | "from": "", 1243 | "id": 1, 1244 | "text": "False", 1245 | "to": "", 1246 | "type": 1, 1247 | "value": "0" 1248 | }, 1249 | { 1250 | "from": "", 1251 | "id": 2, 1252 | "text": "True", 1253 | "to": "", 1254 | "type": 1, 1255 | "value": "1" 1256 | } 1257 | ], 1258 | "thresholds": { 1259 | "mode": "absolute", 1260 | "steps": [ 1261 | { 1262 | "color": "green", 1263 | "value": null 1264 | }, 1265 | { 1266 | "color": "red", 1267 | "value": 1 1268 | } 1269 | ] 1270 | } 1271 | }, 1272 | "overrides": [] 1273 | }, 1274 | "gridPos": { 1275 | "h": 2, 1276 | "w": 2, 1277 | "x": 22, 1278 | "y": 9 1279 | }, 1280 | "id": 15, 1281 | "options": { 1282 | "colorMode": "value", 1283 | "graphMode": "none", 1284 | "justifyMode": "auto", 1285 | "orientation": "auto", 1286 | "reduceOptions": { 1287 | "calcs": [ 1288 | "lastNotNull" 1289 | ], 1290 | "fields": "", 1291 | "values": false 1292 | }, 1293 | "text": {}, 1294 | "textMode": "auto" 1295 | }, 1296 | "pluginVersion": "7.4.5", 1297 | "targets": [ 1298 | { 1299 | "exemplar": false, 1300 | "expr": "starlink_dish_alert_thermal_shutdown", 1301 | "interval": "", 1302 | "legendFormat": "", 1303 | "refId": "A" 1304 | } 1305 | ], 1306 | "title": "Thermal Shutdown", 1307 | "type": "stat" 1308 | }, 1309 | { 1310 | "aliasColors": {}, 1311 | "bars": false, 1312 | "dashLength": 10, 1313 | "dashes": false, 1314 | "datasource": "prometheus", 1315 | "fieldConfig": { 1316 | "defaults": { 1317 | "custom": {}, 1318 | "unit": "short" 1319 | }, 1320 | "overrides": [] 1321 | }, 1322 | "fill": 1, 1323 | "fillGradient": 0, 1324 | "gridPos": { 1325 | "h": 4, 1326 | "w": 4, 1327 | "x": 16, 1328 | "y": 11 1329 | }, 1330 | "hiddenSeries": false, 1331 | "id": 37, 1332 | "legend": { 1333 | "avg": false, 1334 | "current": false, 1335 | "max": false, 1336 | "min": false, 1337 | "show": false, 1338 | "total": false, 1339 | "values": false 1340 | }, 1341 | "lines": true, 1342 | "linewidth": 1, 1343 | "nullPointMode": "null", 1344 | "options": { 1345 | "alertThreshold": true 1346 | }, 1347 | "percentage": false, 1348 | "pluginVersion": "7.4.5", 1349 | "pointradius": 2, 1350 | "points": false, 1351 | "renderer": "flot", 1352 | "seriesOverrides": [], 1353 | "spaceLength": 10, 1354 | "stack": false, 1355 | "steppedLine": false, 1356 | "targets": [ 1357 | { 1358 | "exemplar": false, 1359 | "expr": "starlink_dish_wedge_fraction_obstruction_ratio * 100 > 0 ", 1360 | "interval": "", 1361 | "legendFormat": "{{wedge}}", 1362 | "refId": "A" 1363 | } 1364 | ], 1365 | "thresholds": [], 1366 | "timeFrom": null, 1367 | "timeRegions": [], 1368 | "timeShift": null, 1369 | "title": "Wedge Fraction Obstructions", 1370 | "tooltip": { 1371 | "shared": true, 1372 | "sort": 0, 1373 | "value_type": "individual" 1374 | }, 1375 | "type": "graph", 1376 | "xaxis": { 1377 | "buckets": null, 1378 | "mode": "time", 1379 | "name": null, 1380 | "show": true, 1381 | "values": [] 1382 | }, 1383 | "yaxes": [ 1384 | { 1385 | "$$hashKey": "object:327", 1386 | "format": "short", 1387 | "label": "Percent", 1388 | "logBase": 1, 1389 | "max": null, 1390 | "min": "0", 1391 | "show": true 1392 | }, 1393 | { 1394 | "$$hashKey": "object:328", 1395 | "format": "short", 1396 | "label": null, 1397 | "logBase": 1, 1398 | "max": null, 1399 | "min": null, 1400 | "show": false 1401 | } 1402 | ], 1403 | "yaxis": { 1404 | "align": false, 1405 | "alignLevel": null 1406 | } 1407 | }, 1408 | { 1409 | "aliasColors": {}, 1410 | "bars": false, 1411 | "dashLength": 10, 1412 | "dashes": false, 1413 | "datasource": "prometheus", 1414 | "fieldConfig": { 1415 | "defaults": { 1416 | "custom": {}, 1417 | "unit": "short" 1418 | }, 1419 | "overrides": [] 1420 | }, 1421 | "fill": 1, 1422 | "fillGradient": 0, 1423 | "gridPos": { 1424 | "h": 4, 1425 | "w": 4, 1426 | "x": 20, 1427 | "y": 11 1428 | }, 1429 | "hiddenSeries": false, 1430 | "id": 36, 1431 | "legend": { 1432 | "avg": false, 1433 | "current": false, 1434 | "max": false, 1435 | "min": false, 1436 | "show": false, 1437 | "total": false, 1438 | "values": false 1439 | }, 1440 | "lines": true, 1441 | "linewidth": 1, 1442 | "nullPointMode": "null", 1443 | "options": { 1444 | "alertThreshold": true 1445 | }, 1446 | "percentage": false, 1447 | "pluginVersion": "7.4.5", 1448 | "pointradius": 2, 1449 | "points": false, 1450 | "renderer": "flot", 1451 | "seriesOverrides": [], 1452 | "spaceLength": 10, 1453 | "stack": false, 1454 | "steppedLine": false, 1455 | "targets": [ 1456 | { 1457 | "exemplar": false, 1458 | "expr": "starlink_dish_first_nonempty_slot_seconds", 1459 | "interval": "", 1460 | "legendFormat": "", 1461 | "refId": "A" 1462 | } 1463 | ], 1464 | "thresholds": [], 1465 | "timeFrom": null, 1466 | "timeRegions": [], 1467 | "timeShift": null, 1468 | "title": "Seconds To Non-empty Slot", 1469 | "tooltip": { 1470 | "shared": true, 1471 | "sort": 0, 1472 | "value_type": "individual" 1473 | }, 1474 | "type": "graph", 1475 | "xaxis": { 1476 | "buckets": null, 1477 | "mode": "time", 1478 | "name": null, 1479 | "show": true, 1480 | "values": [] 1481 | }, 1482 | "yaxes": [ 1483 | { 1484 | "$$hashKey": "object:327", 1485 | "format": "short", 1486 | "label": null, 1487 | "logBase": 2, 1488 | "max": null, 1489 | "min": "0", 1490 | "show": true 1491 | }, 1492 | { 1493 | "$$hashKey": "object:328", 1494 | "format": "short", 1495 | "label": null, 1496 | "logBase": 1, 1497 | "max": null, 1498 | "min": null, 1499 | "show": false 1500 | } 1501 | ], 1502 | "yaxis": { 1503 | "align": false, 1504 | "alignLevel": null 1505 | } 1506 | }, 1507 | { 1508 | "datasource": "prometheus", 1509 | "fieldConfig": { 1510 | "defaults": { 1511 | "custom": {} 1512 | }, 1513 | "overrides": [] 1514 | }, 1515 | "gridPos": { 1516 | "h": 1, 1517 | "w": 8, 1518 | "x": 16, 1519 | "y": 15 1520 | }, 1521 | "id": 23, 1522 | "options": { 1523 | "content": "\n ", 1524 | "mode": "markdown" 1525 | }, 1526 | "pluginVersion": "7.4.5", 1527 | "timeFrom": null, 1528 | "timeShift": null, 1529 | "title": "Best Speedtest.net In Last 24 Hours", 1530 | "type": "text" 1531 | }, 1532 | { 1533 | "aliasColors": {}, 1534 | "bars": false, 1535 | "dashLength": 10, 1536 | "dashes": false, 1537 | "datasource": "prometheus", 1538 | "fieldConfig": { 1539 | "defaults": { 1540 | "custom": {} 1541 | }, 1542 | "overrides": [] 1543 | }, 1544 | "fill": 0, 1545 | "fillGradient": 0, 1546 | "gridPos": { 1547 | "h": 7, 1548 | "w": 16, 1549 | "x": 0, 1550 | "y": 16 1551 | }, 1552 | "hiddenSeries": false, 1553 | "id": 26, 1554 | "interval": "1s", 1555 | "legend": { 1556 | "alignAsTable": false, 1557 | "avg": true, 1558 | "current": true, 1559 | "hideEmpty": false, 1560 | "hideZero": false, 1561 | "max": true, 1562 | "min": true, 1563 | "rightSide": false, 1564 | "show": true, 1565 | "total": false, 1566 | "values": true 1567 | }, 1568 | "lines": true, 1569 | "linewidth": 1, 1570 | "nullPointMode": "null", 1571 | "options": { 1572 | "alertThreshold": true 1573 | }, 1574 | "percentage": false, 1575 | "pluginVersion": "7.4.5", 1576 | "pointradius": 2, 1577 | "points": false, 1578 | "renderer": "flot", 1579 | "seriesOverrides": [ 1580 | { 1581 | "$$hashKey": "object:631", 1582 | "alias": "Obstructed", 1583 | "bars": true, 1584 | "color": "#F2495C", 1585 | "lines": false, 1586 | "yaxis": 2 1587 | } 1588 | ], 1589 | "spaceLength": 10, 1590 | "stack": false, 1591 | "steppedLine": false, 1592 | "targets": [ 1593 | { 1594 | "exemplar": false, 1595 | "expr": "starlink_dish_snr", 1596 | "interval": "", 1597 | "legendFormat": "SNR", 1598 | "refId": "A" 1599 | }, 1600 | { 1601 | "exemplar": false, 1602 | "expr": "starlink_dish_currently_obstructed", 1603 | "hide": false, 1604 | "interval": "", 1605 | "legendFormat": "Obstructed", 1606 | "refId": "B" 1607 | } 1608 | ], 1609 | "thresholds": [], 1610 | "timeFrom": null, 1611 | "timeRegions": [], 1612 | "timeShift": null, 1613 | "title": "SNR", 1614 | "tooltip": { 1615 | "shared": true, 1616 | "sort": 0, 1617 | "value_type": "individual" 1618 | }, 1619 | "type": "graph", 1620 | "xaxis": { 1621 | "buckets": null, 1622 | "mode": "time", 1623 | "name": null, 1624 | "show": true, 1625 | "values": [] 1626 | }, 1627 | "yaxes": [ 1628 | { 1629 | "$$hashKey": "object:201", 1630 | "decimals": 0, 1631 | "format": "short", 1632 | "label": "SNR", 1633 | "logBase": 1, 1634 | "max": "9", 1635 | "min": "0", 1636 | "show": true 1637 | }, 1638 | { 1639 | "$$hashKey": "object:202", 1640 | "format": "percentunit", 1641 | "label": "Obstructed", 1642 | "logBase": 1, 1643 | "max": "1", 1644 | "min": "0", 1645 | "show": true 1646 | } 1647 | ], 1648 | "yaxis": { 1649 | "align": true, 1650 | "alignLevel": 0 1651 | } 1652 | }, 1653 | { 1654 | "datasource": "prometheus", 1655 | "fieldConfig": { 1656 | "defaults": { 1657 | "color": { 1658 | "fixedColor": "yellow", 1659 | "mode": "fixed" 1660 | }, 1661 | "custom": {}, 1662 | "mappings": [], 1663 | "thresholds": { 1664 | "mode": "absolute", 1665 | "steps": [ 1666 | { 1667 | "color": "rgb(131, 135, 131)", 1668 | "value": null 1669 | } 1670 | ] 1671 | }, 1672 | "unit": "Bps" 1673 | }, 1674 | "overrides": [] 1675 | }, 1676 | "gridPos": { 1677 | "h": 2, 1678 | "w": 3, 1679 | "x": 16, 1680 | "y": 16 1681 | }, 1682 | "id": 21, 1683 | "options": { 1684 | "colorMode": "value", 1685 | "graphMode": "none", 1686 | "justifyMode": "auto", 1687 | "orientation": "auto", 1688 | "reduceOptions": { 1689 | "calcs": [ 1690 | "lastNotNull" 1691 | ], 1692 | "fields": "", 1693 | "values": false 1694 | }, 1695 | "text": {}, 1696 | "textMode": "auto" 1697 | }, 1698 | "pluginVersion": "7.4.5", 1699 | "targets": [ 1700 | { 1701 | "exemplar": false, 1702 | "expr": "max(max_over_time(speedtest_download_bits_per_second[1d:5m]))", 1703 | "interval": "", 1704 | "legendFormat": "", 1705 | "refId": "A" 1706 | } 1707 | ], 1708 | "timeFrom": null, 1709 | "title": "Download", 1710 | "type": "stat" 1711 | }, 1712 | { 1713 | "datasource": "prometheus", 1714 | "fieldConfig": { 1715 | "defaults": { 1716 | "color": { 1717 | "fixedColor": "purple", 1718 | "mode": "fixed" 1719 | }, 1720 | "custom": {}, 1721 | "mappings": [], 1722 | "thresholds": { 1723 | "mode": "absolute", 1724 | "steps": [ 1725 | { 1726 | "color": "rgb(131, 135, 131)", 1727 | "value": null 1728 | } 1729 | ] 1730 | }, 1731 | "unit": "Bps" 1732 | }, 1733 | "overrides": [] 1734 | }, 1735 | "gridPos": { 1736 | "h": 2, 1737 | "w": 3, 1738 | "x": 19, 1739 | "y": 16 1740 | }, 1741 | "id": 24, 1742 | "options": { 1743 | "colorMode": "value", 1744 | "graphMode": "none", 1745 | "justifyMode": "auto", 1746 | "orientation": "auto", 1747 | "reduceOptions": { 1748 | "calcs": [ 1749 | "lastNotNull" 1750 | ], 1751 | "fields": "", 1752 | "values": false 1753 | }, 1754 | "text": {}, 1755 | "textMode": "auto" 1756 | }, 1757 | "pluginVersion": "7.4.5", 1758 | "targets": [ 1759 | { 1760 | "exemplar": false, 1761 | "expr": "max(max_over_time(speedtest_upload_bits_per_second[1d:5m]))", 1762 | "interval": "", 1763 | "legendFormat": "", 1764 | "refId": "A" 1765 | } 1766 | ], 1767 | "title": "Upload", 1768 | "type": "stat" 1769 | }, 1770 | { 1771 | "datasource": "prometheus", 1772 | "fieldConfig": { 1773 | "defaults": { 1774 | "color": { 1775 | "fixedColor": "blue", 1776 | "mode": "fixed" 1777 | }, 1778 | "custom": {}, 1779 | "mappings": [], 1780 | "thresholds": { 1781 | "mode": "absolute", 1782 | "steps": [ 1783 | { 1784 | "color": "rgb(131, 135, 131)", 1785 | "value": null 1786 | } 1787 | ] 1788 | }, 1789 | "unit": "ms" 1790 | }, 1791 | "overrides": [] 1792 | }, 1793 | "gridPos": { 1794 | "h": 2, 1795 | "w": 2, 1796 | "x": 22, 1797 | "y": 16 1798 | }, 1799 | "id": 25, 1800 | "options": { 1801 | "colorMode": "value", 1802 | "graphMode": "none", 1803 | "justifyMode": "auto", 1804 | "orientation": "auto", 1805 | "reduceOptions": { 1806 | "calcs": [ 1807 | "lastNotNull" 1808 | ], 1809 | "fields": "", 1810 | "values": false 1811 | }, 1812 | "text": {}, 1813 | "textMode": "auto" 1814 | }, 1815 | "pluginVersion": "7.4.5", 1816 | "targets": [ 1817 | { 1818 | "exemplar": false, 1819 | "expr": "min(min_over_time(speedtest_ping_latency_milliseconds[1d:5m]))", 1820 | "interval": "", 1821 | "legendFormat": "", 1822 | "refId": "A" 1823 | } 1824 | ], 1825 | "title": "Latency", 1826 | "type": "stat" 1827 | }, 1828 | { 1829 | "aliasColors": {}, 1830 | "bars": false, 1831 | "dashLength": 10, 1832 | "dashes": false, 1833 | "datasource": "prometheus", 1834 | "fieldConfig": { 1835 | "defaults": { 1836 | "custom": {} 1837 | }, 1838 | "overrides": [] 1839 | }, 1840 | "fill": 1, 1841 | "fillGradient": 0, 1842 | "gridPos": { 1843 | "h": 5, 1844 | "w": 8, 1845 | "x": 16, 1846 | "y": 18 1847 | }, 1848 | "hiddenSeries": false, 1849 | "id": 32, 1850 | "interval": "1s", 1851 | "legend": { 1852 | "avg": true, 1853 | "current": false, 1854 | "max": true, 1855 | "min": true, 1856 | "show": true, 1857 | "total": false, 1858 | "values": true 1859 | }, 1860 | "lines": true, 1861 | "linewidth": 1, 1862 | "nullPointMode": "null", 1863 | "options": { 1864 | "alertThreshold": true 1865 | }, 1866 | "percentage": false, 1867 | "pluginVersion": "7.4.5", 1868 | "pointradius": 2, 1869 | "points": false, 1870 | "renderer": "flot", 1871 | "seriesOverrides": [ 1872 | { 1873 | "$$hashKey": "object:446", 1874 | "alias": "Scrape Duration", 1875 | "color": "rgb(191, 191, 191)" 1876 | } 1877 | ], 1878 | "spaceLength": 10, 1879 | "stack": false, 1880 | "steppedLine": false, 1881 | "targets": [ 1882 | { 1883 | "exemplar": false, 1884 | "expr": "scrape_duration_seconds", 1885 | "interval": "", 1886 | "legendFormat": "{{ job }}", 1887 | "refId": "A" 1888 | } 1889 | ], 1890 | "thresholds": [], 1891 | "timeFrom": null, 1892 | "timeRegions": [], 1893 | "timeShift": null, 1894 | "title": "prometheus Scrape Duration", 1895 | "tooltip": { 1896 | "shared": true, 1897 | "sort": 0, 1898 | "value_type": "individual" 1899 | }, 1900 | "type": "graph", 1901 | "xaxis": { 1902 | "buckets": null, 1903 | "mode": "time", 1904 | "name": null, 1905 | "show": true, 1906 | "values": [] 1907 | }, 1908 | "yaxes": [ 1909 | { 1910 | "$$hashKey": "object:50", 1911 | "format": "s", 1912 | "label": null, 1913 | "logBase": 10, 1914 | "max": null, 1915 | "min": null, 1916 | "show": true 1917 | }, 1918 | { 1919 | "$$hashKey": "object:51", 1920 | "format": "short", 1921 | "label": null, 1922 | "logBase": 1, 1923 | "max": null, 1924 | "min": null, 1925 | "show": true 1926 | } 1927 | ], 1928 | "yaxis": { 1929 | "align": false, 1930 | "alignLevel": null 1931 | } 1932 | } 1933 | ], 1934 | "refresh": "5s", 1935 | "schemaVersion": 27, 1936 | "style": "dark", 1937 | "tags": [], 1938 | "templating": { 1939 | "list": [] 1940 | }, 1941 | "time": { 1942 | "from": "now-30m", 1943 | "to": "now" 1944 | }, 1945 | "timepicker": { 1946 | "hidden": false, 1947 | "nowDelay": "", 1948 | "refresh_intervals": [ 1949 | "5s", 1950 | "10s", 1951 | "30s", 1952 | "1m", 1953 | "5m" 1954 | ] 1955 | }, 1956 | "timezone": "", 1957 | "title": "Starlink Overview", 1958 | "uid": "GG3mnflGz", 1959 | "version": 3 1960 | } -------------------------------------------------------------------------------- /grafana/provisioning/datasources/datasource.yml: -------------------------------------------------------------------------------- 1 | # config file version 2 | apiVersion: 1 3 | 4 | # list of datasources that should be deleted from the database 5 | deleteDatasources: 6 | - name: prometheus 7 | orgId: 1 8 | 9 | # list of datasources to insert/update depending 10 | # whats available in the database 11 | datasources: 12 | # name of the datasource. Required 13 | - name: prometheus 14 | # datasource type. Required 15 | type: prometheus 16 | # access mode. direct or proxy. Required 17 | access: proxy 18 | # org id. will default to orgId 1 if not specified 19 | orgId: 1 20 | # url 21 | url: http://prometheus:9090 22 | # database password, if used 23 | password: 24 | # database user, if used 25 | user: 26 | # database name, if used 27 | database: 28 | # enable/disable basic auth 29 | basicAuth: true 30 | # basic auth username 31 | basicAuthUser: admin 32 | # basic auth password 33 | basicAuthPassword: foobar 34 | # enable/disable with credentials headers 35 | withCredentials: 36 | # mark as default datasource. Max one per org 37 | isDefault: 38 | # fields that will be converted to json and stored in json_data 39 | jsonData: 40 | graphiteVersion: "1.1" 41 | tlsAuth: false 42 | tlsAuthWithCACert: false 43 | # json object of data that will be encrypted. 44 | secureJsonData: 45 | tlsCACert: "..." 46 | tlsClientCert: "..." 47 | tlsClientKey: "..." 48 | version: 1 49 | # allow users to edit datasources from the UI. 50 | editable: true 51 | -------------------------------------------------------------------------------- /images/dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geerlingguy/internet-monitoring/bd9508de502dc68ab06f92f54626ec832bfb6c77/images/dashboard.png -------------------------------------------------------------------------------- /prometheus/alert.rules: -------------------------------------------------------------------------------- 1 | groups: 2 | - name: example 3 | rules: 4 | 5 | # Alert for any instance that is unreachable for >5 minutes. 6 | - alert: service_down 7 | expr: up == 0 8 | for: 2m 9 | labels: 10 | severity: page 11 | annotations: 12 | summary: "Instance {{ $labels.instance }} down" 13 | description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 2 minutes." 14 | 15 | - alert: high_load 16 | expr: node_load1 > 0.5 17 | for: 2m 18 | labels: 19 | severity: page 20 | annotations: 21 | summary: "Instance {{ $labels.instance }} under high load" 22 | description: "{{ $labels.instance }} of job {{ $labels.job }} is under high load." 23 | -------------------------------------------------------------------------------- /prometheus/pinghosts.yaml: -------------------------------------------------------------------------------- 1 | - targets: # url;humanname;routing;switch 2 | - http://www.google.com/;google.com;external;internetbox 3 | - https://github.com/;github.com;external;internetbox 4 | - https://www.apple.com/;apple.com;external;internetbox 5 | # - http://192.168.1.1;internetbox;local;internetbox 6 | # - http://192.168.1.42;blackdata;local;orbirouter-attic 7 | # - http://192.168.1.101;orbirouter;local;orbirouter 8 | 9 | -------------------------------------------------------------------------------- /prometheus/prometheus.yml: -------------------------------------------------------------------------------- 1 | global: 2 | scrape_interval: 15s # By default, scrape targets every 15 seconds. 3 | evaluation_interval: 15s # By default, scrape targets every 15 seconds. 4 | # scrape_timeout is set to the global default (10s). 5 | external_labels: 6 | monitor: 'Alertmanager' 7 | 8 | # Load and evaluate rules in this file every 'evaluation_interval' seconds. 9 | rule_files: 10 | - 'alert.rules' 11 | 12 | scrape_configs: 13 | - job_name: 'prometheus' 14 | scrape_interval: 5s 15 | static_configs: 16 | - targets: ['localhost:9090'] 17 | 18 | - job_name: 'speedtest' 19 | metrics_path: /metrics 20 | scrape_interval: 30m 21 | scrape_timeout: 60s # running speedtest needs time to complete 22 | static_configs: 23 | - targets: ['speedtest:9798'] 24 | 25 | # This job config only works with my internet-pi configuration currently, 26 | # if you also have the shelly plug enabled there. It will just error out 27 | # by default if you don't have a Shelly Plug on your network. Someday I'll 28 | # work on making this more configurable... 29 | - job_name: 'shelly-plug' 30 | metrics_path: /metrics 31 | scrape_interval: 1m 32 | static_configs: 33 | - targets: ['172.17.0.1:9924'] 34 | 35 | # This job config only works with my internet-pi configuration currently, 36 | # if you also have starlink enabled there. It will just error out by default 37 | # if you don't have Starlink. Someday I'll work on making this more 38 | # configurable... 39 | - job_name: 'starlink' 40 | metrics_path: /metrics 41 | static_configs: 42 | - targets: ['172.17.0.1:9817'] 43 | 44 | - job_name: 'ping' 45 | metrics_path: /probe 46 | scrape_interval: 5s 47 | params: 48 | module: [http_2xx] # Look for a HTTP 200 response. 49 | file_sd_configs: 50 | - files: 51 | - pinghosts.yaml 52 | relabel_configs: 53 | - source_labels: [__address__] 54 | regex: '(.*);(.*);(.*);(.*)' #first is the url, thus unique for instance 55 | target_label: instance 56 | replacement: $1 57 | - source_labels: [__address__] 58 | regex: '(.*);(.*);(.*);(.*)' #second is humanname to use in charts 59 | target_label: humanname 60 | replacement: $2 61 | - source_labels: [__address__] 62 | regex: '(.*);(.*);(.*);(.*)' #third state whether this is testing external or internal network 63 | target_label: routing 64 | replacement: $3 65 | - source_labels: [__address__] 66 | regex: '(.*);(.*);(.*);(.*)' #fourth is which switch/router the device is connected to. 67 | target_label: switching 68 | replacement: $4 69 | - source_labels: [instance] 70 | target_label: __param_target 71 | - target_label: __address__ 72 | replacement: ping:9115 # The blackbox exporter's real hostname:port. 73 | 74 | - job_name: 'nodeexp' 75 | static_configs: 76 | - targets: ['nodeexp:9100'] 77 | --------------------------------------------------------------------------------