2022-06-14 14:20:13 +07:00
package metrics
import (
"strconv"
"time"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
)
// NewPrometheus returns a new Prometheus metrics recorder.
func NewPrometheus ( ) ( provider * Prometheus ) {
provider = & Prometheus { }
provider . register ( )
return provider
}
// Prometheus is a middleware for recording prometheus metrics.
type Prometheus struct {
authDuration * prometheus . HistogramVec
reqDuration * prometheus . HistogramVec
reqCounter * prometheus . CounterVec
reqVerifyCounter * prometheus . CounterVec
auth1FACounter * prometheus . CounterVec
auth2FACounter * prometheus . CounterVec
}
// RecordRequest takes the statusCode string, requestMethod string, and the elapsed time.Duration to record the request and request duration metrics.
2022-06-14 18:51:33 +07:00
func ( r * Prometheus ) RecordRequest ( statusCode , requestMethod string , elapsed time . Duration ) {
r . reqCounter . WithLabelValues ( statusCode , requestMethod ) . Inc ( )
r . reqDuration . WithLabelValues ( statusCode ) . Observe ( elapsed . Seconds ( ) )
2022-06-14 14:20:13 +07:00
}
// RecordVerifyRequest takes the statusCode string to record the verify endpoint request metrics.
2022-06-14 18:51:33 +07:00
func ( r * Prometheus ) RecordVerifyRequest ( statusCode string ) {
r . reqVerifyCounter . WithLabelValues ( statusCode ) . Inc ( )
2022-06-14 14:20:13 +07:00
}
// RecordAuthentication takes the success and regulated booleans and a method string to record the authentication metrics.
2022-06-14 18:51:33 +07:00
func ( r * Prometheus ) RecordAuthentication ( success , banned bool , authType string ) {
2022-06-14 14:20:13 +07:00
switch authType {
case "1fa" , "" :
2022-06-14 18:51:33 +07:00
r . auth1FACounter . WithLabelValues ( strconv . FormatBool ( success ) , strconv . FormatBool ( banned ) ) . Inc ( )
2022-06-14 14:20:13 +07:00
default :
2022-06-14 18:51:33 +07:00
r . auth2FACounter . WithLabelValues ( strconv . FormatBool ( success ) , strconv . FormatBool ( banned ) , authType ) . Inc ( )
2022-06-14 14:20:13 +07:00
}
}
// RecordAuthenticationDuration takes the statusCode string, requestMethod string, and the elapsed time.Duration to record the request and request duration metrics.
2022-06-14 18:51:33 +07:00
func ( r * Prometheus ) RecordAuthenticationDuration ( success bool , elapsed time . Duration ) {
r . authDuration . WithLabelValues ( strconv . FormatBool ( success ) ) . Observe ( elapsed . Seconds ( ) )
2022-06-14 14:20:13 +07:00
}
2022-06-14 18:51:33 +07:00
func ( r * Prometheus ) register ( ) {
r . authDuration = promauto . NewHistogramVec (
2022-06-14 14:20:13 +07:00
prometheus . HistogramOpts {
Subsystem : "authelia" ,
2022-06-14 18:51:33 +07:00
Name : "authentication_duration" ,
2022-06-14 14:20:13 +07:00
Help : "The time an authentication attempt takes in seconds." ,
Buckets : [ ] float64 { .0005 , .00075 , .001 , .005 , .01 , .025 , .05 , .075 , 0.1 , 0.2 , 0.3 , 0.4 , 0.5 , 0.6 , 0.8 , 0.9 , 1 , 5 , 10 , 15 , 30 , 60 } ,
} ,
[ ] string { "success" } ,
)
2022-06-14 18:51:33 +07:00
r . reqDuration = promauto . NewHistogramVec (
2022-06-14 14:20:13 +07:00
prometheus . HistogramOpts {
Subsystem : "authelia" ,
2022-06-14 18:51:33 +07:00
Name : "request_duration" ,
2022-06-14 14:20:13 +07:00
Help : "The time a HTTP request takes to process in seconds." ,
Buckets : [ ] float64 { .005 , .01 , .025 , .05 , .1 , .25 , .5 , 1 , 2.5 , 5 , 10 , 15 , 20 , 30 , 40 , 50 , 60 } ,
} ,
[ ] string { "code" } ,
)
2022-06-14 18:51:33 +07:00
r . reqCounter = promauto . NewCounterVec (
2022-06-14 14:20:13 +07:00
prometheus . CounterOpts {
Subsystem : "authelia" ,
2022-06-14 18:51:33 +07:00
Name : "request" ,
2022-06-14 14:20:13 +07:00
Help : "The number of HTTP requests processed." ,
} ,
[ ] string { "code" , "method" } ,
)
2022-06-14 18:51:33 +07:00
r . reqVerifyCounter = promauto . NewCounterVec (
2022-06-14 14:20:13 +07:00
prometheus . CounterOpts {
Subsystem : "authelia" ,
2022-06-14 18:51:33 +07:00
Name : "verify_request" ,
2022-06-14 14:20:13 +07:00
Help : "The number of verify requests processed." ,
} ,
[ ] string { "code" } ,
)
2022-06-14 18:51:33 +07:00
r . auth1FACounter = promauto . NewCounterVec (
2022-06-14 14:20:13 +07:00
prometheus . CounterOpts {
Subsystem : "authelia" ,
2022-06-14 18:51:33 +07:00
Name : "authentication_first_factor" ,
2022-06-14 14:20:13 +07:00
Help : "The number of 1FA authentications processed." ,
} ,
[ ] string { "success" , "banned" } ,
)
2022-06-14 18:51:33 +07:00
r . auth2FACounter = promauto . NewCounterVec (
2022-06-14 14:20:13 +07:00
prometheus . CounterOpts {
Subsystem : "authelia" ,
2022-06-14 18:51:33 +07:00
Name : "authentication_second_factor" ,
2022-06-14 14:20:13 +07:00
Help : "The number of 2FA authentications processed." ,
} ,
2022-06-14 18:51:33 +07:00
[ ] string { "success" , "banned" , "type" } ,
2022-06-14 14:20:13 +07:00
)
}