diff --git a/README.md b/README.md index 312116f55d..fa4fa3ef2e 100644 --- a/README.md +++ b/README.md @@ -120,6 +120,7 @@ Have any feedback or questions? [Create a discussion](https://github.com/TwiN/ga - [How to change the color thresholds of the response time badge](#how-to-change-the-color-thresholds-of-the-response-time-badge) - [API](#api) - [Raw Data](#raw-data) + - [Uptime](#uptime-1) - [Installing as binary](#installing-as-binary) - [High level design overview](#high-level-design-overview) @@ -1745,11 +1746,12 @@ endpoint on the same port your application is configured to run on (`web.port`). | Metric name | Type | Description | Labels | Relevant endpoint types | |:---------------------------------------------|:--------|:---------------------------------------------------------------------------|:--------------------------------|:------------------------| -| gatus_results_total | counter | Number of results per endpoint | key, group, name, type, success | All | +| gatus_results_total | counter | Number of results per endpoint per success state | key, group, name, type, success | All | | gatus_results_code_total | counter | Total number of results by code | key, group, name, type, code | DNS, HTTP | | gatus_results_connected_total | counter | Total number of results in which a connection was successfully established | key, group, name, type | All | | 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 | +| gatus_results_endpoint_success | gauge | Displays whether or not the endpoint was a success (0 failure, 1 success) | key, group, name, type | All | See [examples/docker-compose-grafana-prometheus](.examples/docker-compose-grafana-prometheus) for further documentation as well as an example. diff --git a/metrics/metrics.go b/metrics/metrics.go index 42600c4b56..990e4a5ea0 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -18,6 +18,7 @@ var ( resultConnectedTotal *prometheus.CounterVec resultCodeTotal *prometheus.CounterVec resultCertificateExpirationSeconds *prometheus.GaugeVec + resultEndpointSuccess *prometheus.GaugeVec ) func initializePrometheusMetrics() { @@ -46,6 +47,11 @@ func initializePrometheusMetrics() { Name: "results_certificate_expiration_seconds", Help: "Number of seconds until the certificate expires", }, []string{"key", "group", "name", "type"}) + resultEndpointSuccess = promauto.NewGaugeVec(prometheus.GaugeOpts{ + Namespace: namespace, + Name: "results_endpoint_success", + Help: "Displays whether or not the endpoint was a success", + }, []string{"key", "group", "name", "type"}) } // PublishMetricsForEndpoint publishes metrics for the given endpoint and its result. @@ -70,4 +76,9 @@ func PublishMetricsForEndpoint(ep *endpoint.Endpoint, result *endpoint.Result) { if result.CertificateExpiration != 0 { resultCertificateExpirationSeconds.WithLabelValues(ep.Key(), ep.Group, ep.Name, string(endpointType)).Set(result.CertificateExpiration.Seconds()) } + if result.Success { + resultEndpointSuccess.WithLabelValues(ep.Key(), ep.Group, ep.Name, string(endpointType)).Set(1) + } else { + resultEndpointSuccess.WithLabelValues(ep.Key(), ep.Group, ep.Name, string(endpointType)).Set(0) + } } diff --git a/metrics/metrics_test.go b/metrics/metrics_test.go index ecc1602a3c..73a680d964 100644 --- a/metrics/metrics_test.go +++ b/metrics/metrics_test.go @@ -25,9 +25,6 @@ func TestPublishMetricsForEndpoint(t *testing.T) { CertificateExpiration: 49 * time.Hour, }) err := testutil.GatherAndCompare(prometheus.Gatherers{prometheus.DefaultGatherer}, bytes.NewBufferString(` -# HELP gatus_results_certificate_expiration_seconds Number of seconds until the certificate expires -# TYPE gatus_results_certificate_expiration_seconds gauge -gatus_results_certificate_expiration_seconds{group="http-ep-group",key="http-ep-group_http-ep-name",name="http-ep-name",type="HTTP"} 176400 # HELP gatus_results_code_total Total number of results by code # TYPE gatus_results_code_total counter gatus_results_code_total{code="200",group="http-ep-group",key="http-ep-group_http-ep-name",name="http-ep-name",type="HTTP"} 1 @@ -40,7 +37,13 @@ gatus_results_duration_seconds{group="http-ep-group",key="http-ep-group_http-ep- # HELP gatus_results_total Number of results per endpoint # TYPE gatus_results_total counter gatus_results_total{group="http-ep-group",key="http-ep-group_http-ep-name",name="http-ep-name",success="true",type="HTTP"} 1 -`), "gatus_results_code_total", "gatus_results_connected_total", "gatus_results_duration_seconds", "gatus_results_total", "gatus_results_certificate_expiration_seconds") +# HELP gatus_results_certificate_expiration_seconds Number of seconds until the certificate expires +# TYPE gatus_results_certificate_expiration_seconds gauge +gatus_results_certificate_expiration_seconds{group="http-ep-group",key="http-ep-group_http-ep-name",name="http-ep-name",type="HTTP"} 176400 +# HELP gatus_results_endpoint_success Displays whether or not the endpoint was a success +# TYPE gatus_results_endpoint_success gauge +gatus_results_endpoint_success{group="http-ep-group",key="http-ep-group_http-ep-name",name="http-ep-name",type="HTTP"} 1 +`), "gatus_results_code_total", "gatus_results_connected_total", "gatus_results_duration_seconds", "gatus_results_total", "gatus_results_certificate_expiration_seconds", "gatus_results_endpoint_success") if err != nil { t.Errorf("Expected no errors but got: %v", err) } @@ -56,9 +59,6 @@ gatus_results_total{group="http-ep-group",key="http-ep-group_http-ep-name",name= CertificateExpiration: 47 * time.Hour, }) err = testutil.GatherAndCompare(prometheus.Gatherers{prometheus.DefaultGatherer}, bytes.NewBufferString(` -# HELP gatus_results_certificate_expiration_seconds Number of seconds until the certificate expires -# TYPE gatus_results_certificate_expiration_seconds gauge -gatus_results_certificate_expiration_seconds{group="http-ep-group",key="http-ep-group_http-ep-name",name="http-ep-name",type="HTTP"} 169200 # HELP gatus_results_code_total Total number of results by code # TYPE gatus_results_code_total counter gatus_results_code_total{code="200",group="http-ep-group",key="http-ep-group_http-ep-name",name="http-ep-name",type="HTTP"} 2 @@ -72,7 +72,13 @@ gatus_results_duration_seconds{group="http-ep-group",key="http-ep-group_http-ep- # TYPE gatus_results_total counter gatus_results_total{group="http-ep-group",key="http-ep-group_http-ep-name",name="http-ep-name",success="false",type="HTTP"} 1 gatus_results_total{group="http-ep-group",key="http-ep-group_http-ep-name",name="http-ep-name",success="true",type="HTTP"} 1 -`), "gatus_results_code_total", "gatus_results_connected_total", "gatus_results_duration_seconds", "gatus_results_total", "gatus_results_certificate_expiration_seconds") +# HELP gatus_results_certificate_expiration_seconds Number of seconds until the certificate expires +# TYPE gatus_results_certificate_expiration_seconds gauge +gatus_results_certificate_expiration_seconds{group="http-ep-group",key="http-ep-group_http-ep-name",name="http-ep-name",type="HTTP"} 169200 +# HELP gatus_results_endpoint_success Displays whether or not the endpoint was a success +# TYPE gatus_results_endpoint_success gauge +gatus_results_endpoint_success{group="http-ep-group",key="http-ep-group_http-ep-name",name="http-ep-name",type="HTTP"} 0 +`), "gatus_results_code_total", "gatus_results_connected_total", "gatus_results_duration_seconds", "gatus_results_total", "gatus_results_certificate_expiration_seconds", "gatus_results_endpoint_success") if err != nil { t.Errorf("Expected no errors but got: %v", err) } @@ -90,9 +96,6 @@ gatus_results_total{group="http-ep-group",key="http-ep-group_http-ep-name",name= Success: true, }) err = testutil.GatherAndCompare(prometheus.Gatherers{prometheus.DefaultGatherer}, bytes.NewBufferString(` -# HELP gatus_results_certificate_expiration_seconds Number of seconds until the certificate expires -# TYPE gatus_results_certificate_expiration_seconds gauge -gatus_results_certificate_expiration_seconds{group="http-ep-group",key="http-ep-group_http-ep-name",name="http-ep-name",type="HTTP"} 169200 # HELP gatus_results_code_total Total number of results by code # TYPE gatus_results_code_total counter gatus_results_code_total{code="200",group="http-ep-group",key="http-ep-group_http-ep-name",name="http-ep-name",type="HTTP"} 2 @@ -110,7 +113,14 @@ gatus_results_duration_seconds{group="http-ep-group",key="http-ep-group_http-ep- gatus_results_total{group="dns-ep-group",key="dns-ep-group_dns-ep-name",name="dns-ep-name",success="true",type="DNS"} 1 gatus_results_total{group="http-ep-group",key="http-ep-group_http-ep-name",name="http-ep-name",success="false",type="HTTP"} 1 gatus_results_total{group="http-ep-group",key="http-ep-group_http-ep-name",name="http-ep-name",success="true",type="HTTP"} 1 -`), "gatus_results_code_total", "gatus_results_connected_total", "gatus_results_duration_seconds", "gatus_results_total", "gatus_results_certificate_expiration_seconds") +# HELP gatus_results_certificate_expiration_seconds Number of seconds until the certificate expires +# TYPE gatus_results_certificate_expiration_seconds gauge +gatus_results_certificate_expiration_seconds{group="http-ep-group",key="http-ep-group_http-ep-name",name="http-ep-name",type="HTTP"} 169200 +# HELP gatus_results_endpoint_success Displays whether or not the endpoint was a success +# TYPE gatus_results_endpoint_success gauge +gatus_results_endpoint_success{group="dns-ep-group",key="dns-ep-group_dns-ep-name",name="dns-ep-name",type="DNS"} 1 +gatus_results_endpoint_success{group="http-ep-group",key="http-ep-group_http-ep-name",name="http-ep-name",type="HTTP"} 0 +`), "gatus_results_code_total", "gatus_results_connected_total", "gatus_results_duration_seconds", "gatus_results_total", "gatus_results_certificate_expiration_seconds", "gatus_results_endpoint_success") if err != nil { t.Errorf("Expected no errors but got: %v", err) }