diff --git a/.examples/docker-compose-grafana-prometheus/README.md b/.examples/docker-compose-grafana-prometheus/README.md index 72a2f16c..80519718 100644 --- a/.examples/docker-compose-grafana-prometheus/README.md +++ b/.examples/docker-compose-grafana-prometheus/README.md @@ -1,23 +1,41 @@ ## Usage +Gatus exposes Prometheus metrics at `/metrics` if the `metrics` configuration option is set to `true`. + +To run this example, all you need to do is execute the following command: ```console docker-compose up ``` Once you've done the above, you should be able to access the Grafana dashboard at `http://localhost:3000`. -## Queries -Gatus uses Prometheus counters. +![Gatus Grafana dashboard](../../.github/assets/grafana-dashboard.png) -Total results per minute: + +## Queries +By default, this example has a Grafana dashboard with some panels, but for the sake of verbosity, you'll find +a list of simple queries below. Those make use of the `key` parameter, which is a concatenation of the endpoint's +group and name. + +### Success rate +``` +sum(rate(gatus_results_total{success="true"}[30s])) by (key) / sum(rate(gatus_results_total[30s])) by (key) +``` + +### Response time +``` +gatus_results_duration_seconds +``` + +### Total results per minute ``` sum(rate(gatus_results_total[5m])*60) by (key) ``` -Total successful results per minute: +### Total successful results per minute ``` sum(rate(gatus_results_total{success="true"}[5m])*60) by (key) ``` -Total unsuccessful results per minute: +### Total unsuccessful results per minute +``` +sum(rate(gatus_results_total{success="false"}[5m])*60) by (key) ``` -sum(rate(gatus_results_total{success="true"}[5m])*60) by (key) -``` \ No newline at end of file diff --git a/.examples/docker-compose-grafana-prometheus/config/config.yaml b/.examples/docker-compose-grafana-prometheus/config/config.yaml index 7bb82766..699ed29c 100644 --- a/.examples/docker-compose-grafana-prometheus/config/config.yaml +++ b/.examples/docker-compose-grafana-prometheus/config/config.yaml @@ -2,15 +2,18 @@ metrics: true endpoints: - name: website url: https://twin.sh/health - interval: 30s + interval: 5m conditions: - "[STATUS] == 200" + + - name: example + url: https://example.com/ + interval: 5m + conditions: + - "[STATUS] == 200" + - name: github url: https://api.github.com/healthz interval: 5m - conditions: - - "[STATUS] == 200" - - name: example - url: https://example.com/ conditions: - "[STATUS] == 200" \ No newline at end of file diff --git a/.examples/docker-compose-grafana-prometheus/grafana/provisioning/dashboards/main.json b/.examples/docker-compose-grafana-prometheus/grafana/provisioning/dashboards/gatus.json similarity index 55% rename from .examples/docker-compose-grafana-prometheus/grafana/provisioning/dashboards/main.json rename to .examples/docker-compose-grafana-prometheus/grafana/provisioning/dashboards/gatus.json index 8534737c..9fdf282c 100644 --- a/.examples/docker-compose-grafana-prometheus/grafana/provisioning/dashboards/main.json +++ b/.examples/docker-compose-grafana-prometheus/grafana/provisioning/dashboards/gatus.json @@ -15,8 +15,266 @@ "editable": true, "gnetId": null, "graphTooltip": 0, + "id": 3, "links": [], "panels": [ + { + "cacheTimeout": null, + "datasource": null, + "description": "Number of successful results compared to the total number of results during the current interval", + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 9, + "links": [], + "options": { + "fieldOptions": { + "calcs": [ + "mean" + ], + "defaults": { + "mappings": [ + { + "id": 0, + "op": "=", + "text": "N/A", + "type": 1, + "value": "null" + } + ], + "max": 1, + "min": 0, + "nullValueMode": "connected", + "thresholds": [ + { + "color": "red", + "value": null + }, + { + "color": "semi-dark-orange", + "value": 0.6 + }, + { + "color": "yellow", + "value": 0.8 + }, + { + "color": "dark-green", + "value": 0.95 + } + ], + "unit": "percentunit" + }, + "override": {}, + "values": false + }, + "orientation": "horizontal", + "showThresholdLabels": false, + "showThresholdMarkers": false + }, + "pluginVersion": "6.4.4", + "targets": [ + { + "expr": "sum(rate(gatus_results_total{success=\"true\"}[30s])) by (key) / sum(rate(gatus_results_total[30s])) by (key)", + "hide": false, + "legendFormat": "{{key}}", + "refId": "B" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Success rate", + "type": "gauge" + }, + { + "aliasColors": {}, + "bars": false, + "cacheTimeout": null, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 11, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null as zero", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pluginVersion": "6.4.4", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "gatus_results_duration_seconds", + "format": "time_series", + "instant": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{key}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Response time", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "cacheTimeout": null, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 8 + }, + "id": 10, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "connected", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pluginVersion": "6.4.4", + "pointradius": 2, + "points": true, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(gatus_results_total{success=\"true\"}[30s])) by (key) / sum(rate(gatus_results_total[30s])) by (key)", + "format": "time_series", + "instant": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{key}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Success rate", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, { "aliasColors": {}, "bars": false, @@ -27,10 +285,10 @@ "fill": 1, "fillGradient": 0, "gridPos": { - "h": 7, + "h": 8, "w": 12, - "x": 0, - "y": 0 + "x": 12, + "y": 8 }, "id": 2, "interval": "", @@ -126,8 +384,8 @@ "gridPos": { "h": 7, "w": 12, - "x": 12, - "y": 0 + "x": 0, + "y": 16 }, "id": 5, "legend": { @@ -204,94 +462,6 @@ "alignLevel": null } }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorPostfix": false, - "colorPrefix": false, - "colorValue": true, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": null, - "format": "none", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 7 - }, - "id": 7, - "interval": "", - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "options": {}, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": true, - "ymax": null, - "ymin": null - }, - "tableColumn": "", - "targets": [ - { - "expr": "rate(gatus_results_total{success=\"false\"}[1m])*60", - "format": "time_series", - "instant": false, - "intervalFactor": 1, - "refId": "A" - } - ], - "thresholds": "1,2", - "timeFrom": null, - "timeShift": null, - "title": "Unsuccessful results", - "type": "singlestat", - "valueFontSize": "150%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, { "aliasColors": {}, "bars": false, @@ -304,7 +474,7 @@ "h": 7, "w": 12, "x": 12, - "y": 7 + "y": 16 }, "id": 3, "legend": { @@ -380,7 +550,7 @@ } } ], - "refresh": "10s", + "refresh": "1m", "schemaVersion": 20, "style": "dark", "tags": [], @@ -391,9 +561,22 @@ "from": "now-1h", "to": "now" }, - "timepicker": {}, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ] + }, "timezone": "", "title": "Gatus", "uid": "KPI7Qj1Wk", - "version": 1 + "version": 2 } \ No newline at end of file diff --git a/.github/assets/grafana-dashboard.png b/.github/assets/grafana-dashboard.png new file mode 100644 index 00000000..a4f778aa Binary files /dev/null and b/.github/assets/grafana-dashboard.png differ diff --git a/README.md b/README.md index 3ddd534e..dde18ae4 100644 --- a/README.md +++ b/README.md @@ -1055,6 +1055,8 @@ endpoint on the same port your application is configured to run on (`web.port`). | gatus_results_duration_seconds | gauge | Duration of the request in seconds | key, group, name, type | All | | gatus_results_certificate_expiration_seconds | gauge | Number of seconds until the certificate expires | key, group, name, type | HTTP, STARTTLS | +See [examples/docker-compose-grafana-prometheus](.examples/docker-compose-grafana-prometheus) for further documentation as well as an example. + ## Deployment Many examples can be found in the [.examples](.examples) folder, but this section will focus on the most popular ways of deploying Gatus.