mirror of
https://github.com/TwiN/gatus.git
synced 2024-12-22 14:41:01 +01:00
9d151fcdb4
* refactor: Partially break core package into dns, result and ssh packages * refactor: Move core package to config/endpoint * refactor: Fix warning about overlapping imported package name with endpoint variable * refactor: Rename EndpointStatus to Status * refactor: Merge result pkg back into endpoint pkg, because it makes more sense * refactor: Rename parameter r to result in Condition.evaluate * refactor: Rename parameter r to result * refactor: Revert accidental change to endpoint.TypeDNS * refactor: Rename parameter r to result * refactor: Merge util package into endpoint package * refactor: Rename parameter r to result
74 lines
3.0 KiB
Go
74 lines
3.0 KiB
Go
package metrics
|
|
|
|
import (
|
|
"strconv"
|
|
|
|
"github.com/TwiN/gatus/v5/config/endpoint"
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
"github.com/prometheus/client_golang/prometheus/promauto"
|
|
)
|
|
|
|
const namespace = "gatus" // The prefix of the metrics
|
|
|
|
var (
|
|
initializedMetrics bool // Whether the metrics have been initialized
|
|
|
|
resultTotal *prometheus.CounterVec
|
|
resultDurationSeconds *prometheus.GaugeVec
|
|
resultConnectedTotal *prometheus.CounterVec
|
|
resultCodeTotal *prometheus.CounterVec
|
|
resultCertificateExpirationSeconds *prometheus.GaugeVec
|
|
)
|
|
|
|
func initializePrometheusMetrics() {
|
|
resultTotal = promauto.NewCounterVec(prometheus.CounterOpts{
|
|
Namespace: namespace,
|
|
Name: "results_total",
|
|
Help: "Number of results per endpoint",
|
|
}, []string{"key", "group", "name", "type", "success"})
|
|
resultDurationSeconds = promauto.NewGaugeVec(prometheus.GaugeOpts{
|
|
Namespace: namespace,
|
|
Name: "results_duration_seconds",
|
|
Help: "Duration of the request in seconds",
|
|
}, []string{"key", "group", "name", "type"})
|
|
resultConnectedTotal = promauto.NewCounterVec(prometheus.CounterOpts{
|
|
Namespace: namespace,
|
|
Name: "results_connected_total",
|
|
Help: "Total number of results in which a connection was successfully established",
|
|
}, []string{"key", "group", "name", "type"})
|
|
resultCodeTotal = promauto.NewCounterVec(prometheus.CounterOpts{
|
|
Namespace: namespace,
|
|
Name: "results_code_total",
|
|
Help: "Total number of results by code",
|
|
}, []string{"key", "group", "name", "type", "code"})
|
|
resultCertificateExpirationSeconds = promauto.NewGaugeVec(prometheus.GaugeOpts{
|
|
Namespace: namespace,
|
|
Name: "results_certificate_expiration_seconds",
|
|
Help: "Number of seconds until the certificate expires",
|
|
}, []string{"key", "group", "name", "type"})
|
|
}
|
|
|
|
// PublishMetricsForEndpoint publishes metrics for the given endpoint and its result.
|
|
// These metrics will be exposed at /metrics if the metrics are enabled
|
|
func PublishMetricsForEndpoint(ep *endpoint.Endpoint, result *endpoint.Result) {
|
|
if !initializedMetrics {
|
|
initializePrometheusMetrics()
|
|
initializedMetrics = true
|
|
}
|
|
endpointType := ep.Type()
|
|
resultTotal.WithLabelValues(ep.Key(), ep.Group, ep.Name, string(endpointType), strconv.FormatBool(result.Success)).Inc()
|
|
resultDurationSeconds.WithLabelValues(ep.Key(), ep.Group, ep.Name, string(endpointType)).Set(result.Duration.Seconds())
|
|
if result.Connected {
|
|
resultConnectedTotal.WithLabelValues(ep.Key(), ep.Group, ep.Name, string(endpointType)).Inc()
|
|
}
|
|
if result.DNSRCode != "" {
|
|
resultCodeTotal.WithLabelValues(ep.Key(), ep.Group, ep.Name, string(endpointType), result.DNSRCode).Inc()
|
|
}
|
|
if result.HTTPStatus != 0 {
|
|
resultCodeTotal.WithLabelValues(ep.Key(), ep.Group, ep.Name, string(endpointType), strconv.Itoa(result.HTTPStatus)).Inc()
|
|
}
|
|
if result.CertificateExpiration != 0 {
|
|
resultCertificateExpirationSeconds.WithLabelValues(ep.Key(), ep.Group, ep.Name, string(endpointType)).Set(result.CertificateExpiration.Seconds())
|
|
}
|
|
}
|