2017-08-23 20:46:03 +02:00
package metrics
import (
2018-11-14 10:18:03 +01:00
"context"
2017-08-23 20:46:03 +02:00
"net/http"
2020-08-17 12:02:03 +02:00
"strconv"
2017-08-23 20:46:03 +02:00
"testing"
"time"
"github.com/stvp/go-udp-testing"
2020-08-17 18:04:03 +02:00
ptypes "github.com/traefik/paerser/types"
2023-02-03 15:24:05 +01:00
"github.com/traefik/traefik/v3/pkg/types"
2017-08-23 20:46:03 +02:00
)
func TestStatsD ( t * testing . T ) {
2021-04-30 10:22:04 +02:00
t . Cleanup ( func ( ) {
StopStatsd ( )
} )
2017-08-23 20:46:03 +02:00
udp . SetAddr ( ":18125" )
// This is needed to make sure that UDP Listener listens for data a bit longer, otherwise it will quit after a millisecond
udp . Timeout = 5 * time . Second
2021-04-30 10:22:04 +02:00
statsdRegistry := RegisterStatsd ( context . Background ( ) , & types . Statsd { Address : ":18125" , PushInterval : ptypes . Duration ( time . Second ) , AddEntryPointsLabels : true , AddRoutersLabels : true , AddServicesLabels : true } )
2019-11-12 18:18:04 +01:00
2021-10-06 09:34:07 -06:00
testRegistry ( t , defaultMetricsPrefix , statsdRegistry )
2019-11-12 18:18:04 +01:00
}
func TestStatsDWithPrefix ( t * testing . T ) {
2021-04-30 10:22:04 +02:00
t . Cleanup ( func ( ) {
StopStatsd ( )
} )
2019-11-12 18:18:04 +01:00
udp . SetAddr ( ":18125" )
// This is needed to make sure that UDP Listener listens for data a bit longer, otherwise it will quit after a millisecond
udp . Timeout = 5 * time . Second
2021-04-30 10:22:04 +02:00
statsdRegistry := RegisterStatsd ( context . Background ( ) , & types . Statsd { Address : ":18125" , PushInterval : ptypes . Duration ( time . Second ) , AddEntryPointsLabels : true , AddRoutersLabels : true , AddServicesLabels : true , Prefix : "testPrefix" } )
testRegistry ( t , "testPrefix" , statsdRegistry )
}
func testRegistry ( t * testing . T , metricsPrefix string , registry Registry ) {
t . Helper ( )
if ! registry . IsEpEnabled ( ) || ! registry . IsRouterEnabled ( ) || ! registry . IsSvcEnabled ( ) {
t . Errorf ( "Statsd registry should return true for IsEnabled(), IsRouterEnabled() and IsSvcEnabled()" )
}
2019-11-12 18:18:04 +01:00
expected := [ ] string {
2021-04-30 10:22:04 +02:00
metricsPrefix + ".config.reload.total:1.000000|c\n" ,
metricsPrefix + ".config.reload.lastSuccessTimestamp:1.000000|g\n" ,
metricsPrefix + ".tls.certs.notAfterTimestamp:1.000000|g\n" ,
metricsPrefix + ".entrypoint.request.total:1.000000|c\n" ,
metricsPrefix + ".entrypoint.request.tls.total:1.000000|c\n" ,
metricsPrefix + ".entrypoint.request.duration:10000.000000|ms" ,
metricsPrefix + ".entrypoint.connections.open:1.000000|g\n" ,
2022-09-12 17:10:09 +02:00
metricsPrefix + ".entrypoint.requests.bytes.total:1.000000|c\n" ,
metricsPrefix + ".entrypoint.responses.bytes.total:1.000000|c\n" ,
2021-04-30 10:22:04 +02:00
metricsPrefix + ".router.request.total:2.000000|c\n" ,
metricsPrefix + ".router.request.tls.total:1.000000|c\n" ,
metricsPrefix + ".router.request.duration:10000.000000|ms" ,
metricsPrefix + ".router.connections.open:1.000000|g\n" ,
2022-09-12 17:10:09 +02:00
metricsPrefix + ".router.requests.bytes.total:1.000000|c\n" ,
metricsPrefix + ".router.responses.bytes.total:1.000000|c\n" ,
2021-04-30 10:22:04 +02:00
metricsPrefix + ".service.request.total:2.000000|c\n" ,
metricsPrefix + ".service.request.tls.total:1.000000|c\n" ,
metricsPrefix + ".service.request.duration:10000.000000|ms" ,
metricsPrefix + ".service.connections.open:1.000000|g\n" ,
metricsPrefix + ".service.retries.total:2.000000|c\n" ,
metricsPrefix + ".service.server.up:1.000000|g\n" ,
2022-09-12 17:10:09 +02:00
metricsPrefix + ".service.requests.bytes.total:1.000000|c\n" ,
metricsPrefix + ".service.responses.bytes.total:1.000000|c\n" ,
2017-08-23 20:46:03 +02:00
}
udp . ShouldReceiveAll ( t , expected , func ( ) {
2021-04-30 10:22:04 +02:00
registry . ConfigReloadsCounter ( ) . Add ( 1 )
registry . LastConfigReloadSuccessGauge ( ) . Set ( 1 )
registry . TLSCertsNotAfterTimestampGauge ( ) . With ( "key" , "value" ) . Set ( 1 )
registry . EntryPointReqsCounter ( ) . With ( "entrypoint" , "test" , "code" , strconv . Itoa ( http . StatusOK ) , "method" , http . MethodGet ) . Add ( 1 )
registry . EntryPointReqsTLSCounter ( ) . With ( "entrypoint" , "test" , "tls_version" , "foo" , "tls_cipher" , "bar" ) . Add ( 1 )
registry . EntryPointReqDurationHistogram ( ) . With ( "entrypoint" , "test" ) . Observe ( 10000 )
registry . EntryPointOpenConnsGauge ( ) . With ( "entrypoint" , "test" ) . Set ( 1 )
2022-09-12 17:10:09 +02:00
registry . EntryPointReqsBytesCounter ( ) . With ( "entrypoint" , "test" , "code" , strconv . Itoa ( http . StatusOK ) , "method" , http . MethodGet ) . Add ( 1 )
registry . EntryPointRespsBytesCounter ( ) . With ( "entrypoint" , "test" , "code" , strconv . Itoa ( http . StatusOK ) , "method" , http . MethodGet ) . Add ( 1 )
2021-04-30 10:22:04 +02:00
registry . RouterReqsCounter ( ) . With ( "router" , "demo" , "service" , "test" , "code" , strconv . Itoa ( http . StatusNotFound ) , "method" , http . MethodGet ) . Add ( 1 )
registry . RouterReqsCounter ( ) . With ( "router" , "demo" , "service" , "test" , "code" , strconv . Itoa ( http . StatusOK ) , "method" , http . MethodGet ) . Add ( 1 )
registry . RouterReqsTLSCounter ( ) . With ( "router" , "demo" , "service" , "test" , "tls_version" , "foo" , "tls_cipher" , "bar" ) . Add ( 1 )
registry . RouterReqDurationHistogram ( ) . With ( "router" , "demo" , "service" , "test" , "code" , strconv . Itoa ( http . StatusOK ) ) . Observe ( 10000 )
registry . RouterOpenConnsGauge ( ) . With ( "router" , "demo" , "service" , "test" ) . Set ( 1 )
2022-09-12 17:10:09 +02:00
registry . RouterReqsBytesCounter ( ) . With ( "router" , "demo" , "service" , "test" , "code" , strconv . Itoa ( http . StatusOK ) , "method" , http . MethodGet ) . Add ( 1 )
registry . RouterRespsBytesCounter ( ) . With ( "router" , "demo" , "service" , "test" , "code" , strconv . Itoa ( http . StatusOK ) , "method" , http . MethodGet ) . Add ( 1 )
2021-04-30 10:22:04 +02:00
registry . ServiceReqsCounter ( ) . With ( "service" , "test" , "code" , strconv . Itoa ( http . StatusOK ) , "method" , http . MethodGet ) . Add ( 1 )
registry . ServiceReqsCounter ( ) . With ( "service" , "test" , "code" , strconv . Itoa ( http . StatusNotFound ) , "method" , http . MethodGet ) . Add ( 1 )
registry . ServiceReqsTLSCounter ( ) . With ( "service" , "test" , "tls_version" , "foo" , "tls_cipher" , "bar" ) . Add ( 1 )
registry . ServiceReqDurationHistogram ( ) . With ( "service" , "test" , "code" , strconv . Itoa ( http . StatusOK ) ) . Observe ( 10000 )
registry . ServiceOpenConnsGauge ( ) . With ( "service" , "test" ) . Set ( 1 )
registry . ServiceRetriesCounter ( ) . With ( "service" , "test" ) . Add ( 1 )
registry . ServiceRetriesCounter ( ) . With ( "service" , "test" ) . Add ( 1 )
registry . ServiceServerUpGauge ( ) . With ( "service:test" , "url" , "http://127.0.0.1" ) . Set ( 1 )
2022-09-12 17:10:09 +02:00
registry . ServiceReqsBytesCounter ( ) . With ( "service" , "test" , "code" , strconv . Itoa ( http . StatusOK ) , "method" , http . MethodGet ) . Add ( 1 )
registry . ServiceRespsBytesCounter ( ) . With ( "service" , "test" , "code" , strconv . Itoa ( http . StatusOK ) , "method" , http . MethodGet ) . Add ( 1 )
2017-08-23 20:46:03 +02:00
} )
}