2017-11-08 19:44:03 +05:30
package metrics
import (
2018-11-14 10:18:03 +01:00
"context"
2018-05-29 16:58:03 -04:00
"fmt"
"io/ioutil"
2017-11-08 19:44:03 +05:30
"net/http"
2018-05-29 16:58:03 -04:00
"net/http/httptest"
2017-11-08 19:44:03 +05:30
"regexp"
"strconv"
"testing"
"time"
2019-08-03 03:58:23 +02:00
"github.com/containous/traefik/v2/pkg/types"
2017-11-08 19:44:03 +05:30
"github.com/stvp/go-udp-testing"
)
func TestInfluxDB ( t * testing . T ) {
udp . SetAddr ( ":8089" )
// 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
2019-07-18 21:36:05 +02:00
influxDBRegistry := RegisterInfluxDB ( context . Background ( ) , & types . InfluxDB { Address : ":8089" , PushInterval : types . Duration ( time . Second ) , AddEntryPointsLabels : true , AddServicesLabels : true } )
2017-11-08 19:44:03 +05:30
defer StopInfluxDB ( )
2019-07-18 21:36:05 +02:00
if ! influxDBRegistry . IsEpEnabled ( ) || ! influxDBRegistry . IsSvcEnabled ( ) {
t . Fatalf ( "InfluxDB registry must be epEnabled" )
2017-11-08 19:44:03 +05:30
}
2019-07-18 21:36:05 +02:00
expectedService := [ ] string {
` (traefik\.service\.requests\.total,code=200,method=GET,service=test count=1) [\d] { 19} ` ,
` (traefik\.service\.requests\.total,code=404,method=GET,service=test count=1) [\d] { 19} ` ,
` (traefik\.service\.request\.duration,code=200,service=test p50=10000,p90=10000,p95=10000,p99=10000) [\d] { 19} ` ,
` (traefik\.service\.retries\.total(?:,code=[\d] { 3},method=GET)?,service=test count=2) [\d] { 19} ` ,
2018-03-12 14:04:03 +05:30
` (traefik\.config\.reload\.total(?:[a-z=0-9A-Z,]+)? count=1) [\d] { 19} ` ,
` (traefik\.config\.reload\.total\.failure(?:[a-z=0-9A-Z,]+)? count=1) [\d] { 19} ` ,
2019-07-18 21:36:05 +02:00
` (traefik\.service\.server\.up,service=test(?:[a-z=0-9A-Z,]+)?,url=http://127.0.0.1 value=1) [\d] { 19} ` ,
2017-11-08 19:44:03 +05:30
}
2019-07-18 21:36:05 +02:00
msgService := udp . ReceiveString ( t , func ( ) {
influxDBRegistry . ServiceReqsCounter ( ) . With ( "service" , "test" , "code" , strconv . Itoa ( http . StatusOK ) , "method" , http . MethodGet ) . Add ( 1 )
influxDBRegistry . ServiceReqsCounter ( ) . With ( "service" , "test" , "code" , strconv . Itoa ( http . StatusNotFound ) , "method" , http . MethodGet ) . Add ( 1 )
influxDBRegistry . ServiceRetriesCounter ( ) . With ( "service" , "test" ) . Add ( 1 )
influxDBRegistry . ServiceRetriesCounter ( ) . With ( "service" , "test" ) . Add ( 1 )
influxDBRegistry . ServiceReqDurationHistogram ( ) . With ( "service" , "test" , "code" , strconv . Itoa ( http . StatusOK ) ) . Observe ( 10000 )
2018-03-12 14:04:03 +05:30
influxDBRegistry . ConfigReloadsCounter ( ) . Add ( 1 )
influxDBRegistry . ConfigReloadsFailureCounter ( ) . Add ( 1 )
2019-07-18 21:36:05 +02:00
influxDBRegistry . ServiceServerUpGauge ( ) . With ( "service" , "test" , "url" , "http://127.0.0.1" ) . Set ( 1 )
2017-11-08 19:44:03 +05:30
} )
2019-07-18 21:36:05 +02:00
assertMessage ( t , msgService , expectedService )
2018-03-12 14:04:03 +05:30
expectedEntrypoint := [ ] string {
2018-04-16 10:28:04 +02:00
` (traefik\.entrypoint\.requests\.total,entrypoint=test(?:[a-z=0-9A-Z,:/.]+)? count=1) [\d] { 19} ` ,
` (traefik\.entrypoint\.request\.duration(?:,code=[\d] { 3})?,entrypoint=test(?:[a-z=0-9A-Z,:/.]+)? p50=10000,p90=10000,p95=10000,p99=10000) [\d] { 19} ` ,
` (traefik\.entrypoint\.connections\.open,entrypoint=test value=1) [\d] { 19} ` ,
2018-03-12 14:04:03 +05:30
}
msgEntrypoint := udp . ReceiveString ( t , func ( ) {
2019-07-18 21:36:05 +02:00
influxDBRegistry . EntryPointReqsCounter ( ) . With ( "entrypoint" , "test" ) . Add ( 1 )
influxDBRegistry . EntryPointReqDurationHistogram ( ) . With ( "entrypoint" , "test" ) . Observe ( 10000 )
influxDBRegistry . EntryPointOpenConnsGauge ( ) . With ( "entrypoint" , "test" ) . Set ( 1 )
2018-03-12 14:04:03 +05:30
} )
assertMessage ( t , msgEntrypoint , expectedEntrypoint )
2017-11-08 19:44:03 +05:30
}
2018-05-29 16:58:03 -04:00
func TestInfluxDBHTTP ( t * testing . T ) {
c := make ( chan * string )
ts := httptest . NewServer ( http . HandlerFunc ( func ( w http . ResponseWriter , r * http . Request ) {
body , err := ioutil . ReadAll ( r . Body )
if err != nil {
http . Error ( w , "can't read body " + err . Error ( ) , http . StatusBadRequest )
return
}
bodyStr := string ( body )
c <- & bodyStr
2019-07-18 21:36:05 +02:00
_ , _ = fmt . Fprintln ( w , "ok" )
2018-05-29 16:58:03 -04:00
} ) )
defer ts . Close ( )
2019-07-18 21:36:05 +02:00
influxDBRegistry := RegisterInfluxDB ( context . Background ( ) , & types . InfluxDB { Address : ts . URL , Protocol : "http" , PushInterval : types . Duration ( time . Second ) , Database : "test" , RetentionPolicy : "autogen" , AddEntryPointsLabels : true , AddServicesLabels : true } )
2018-05-29 16:58:03 -04:00
defer StopInfluxDB ( )
2019-07-18 21:36:05 +02:00
if ! influxDBRegistry . IsEpEnabled ( ) || ! influxDBRegistry . IsSvcEnabled ( ) {
t . Fatalf ( "InfluxDB registry must be epEnabled" )
2018-05-29 16:58:03 -04:00
}
2019-07-18 21:36:05 +02:00
expectedService := [ ] string {
` (traefik\.service\.requests\.total,code=200,method=GET,service=test count=1) [\d] { 19} ` ,
` (traefik\.service\.requests\.total,code=404,method=GET,service=test count=1) [\d] { 19} ` ,
` (traefik\.service\.request\.duration,code=200,service=test p50=10000,p90=10000,p95=10000,p99=10000) [\d] { 19} ` ,
` (traefik\.service\.retries\.total(?:,code=[\d] { 3},method=GET)?,service=test count=2) [\d] { 19} ` ,
2018-05-29 16:58:03 -04:00
` (traefik\.config\.reload\.total(?:[a-z=0-9A-Z,]+)? count=1) [\d] { 19} ` ,
` (traefik\.config\.reload\.total\.failure(?:[a-z=0-9A-Z,]+)? count=1) [\d] { 19} ` ,
2019-07-18 21:36:05 +02:00
` (traefik\.service\.server\.up,service=test(?:[a-z=0-9A-Z,]+)?,url=http://127.0.0.1 value=1) [\d] { 19} ` ,
2018-05-29 16:58:03 -04:00
}
2019-07-18 21:36:05 +02:00
influxDBRegistry . ServiceReqsCounter ( ) . With ( "service" , "test" , "code" , strconv . Itoa ( http . StatusOK ) , "method" , http . MethodGet ) . Add ( 1 )
influxDBRegistry . ServiceReqsCounter ( ) . With ( "service" , "test" , "code" , strconv . Itoa ( http . StatusNotFound ) , "method" , http . MethodGet ) . Add ( 1 )
influxDBRegistry . ServiceRetriesCounter ( ) . With ( "service" , "test" ) . Add ( 1 )
influxDBRegistry . ServiceRetriesCounter ( ) . With ( "service" , "test" ) . Add ( 1 )
influxDBRegistry . ServiceReqDurationHistogram ( ) . With ( "service" , "test" , "code" , strconv . Itoa ( http . StatusOK ) ) . Observe ( 10000 )
2018-05-29 16:58:03 -04:00
influxDBRegistry . ConfigReloadsCounter ( ) . Add ( 1 )
influxDBRegistry . ConfigReloadsFailureCounter ( ) . Add ( 1 )
2019-07-18 21:36:05 +02:00
influxDBRegistry . ServiceServerUpGauge ( ) . With ( "service" , "test" , "url" , "http://127.0.0.1" ) . Set ( 1 )
msgService := <- c
2018-05-29 16:58:03 -04:00
2019-07-18 21:36:05 +02:00
assertMessage ( t , * msgService , expectedService )
2018-05-29 16:58:03 -04:00
expectedEntrypoint := [ ] string {
` (traefik\.entrypoint\.requests\.total,entrypoint=test(?:[a-z=0-9A-Z,:/.]+)? count=1) [\d] { 19} ` ,
` (traefik\.entrypoint\.request\.duration(?:,code=[\d] { 3})?,entrypoint=test(?:[a-z=0-9A-Z,:/.]+)? p50=10000,p90=10000,p95=10000,p99=10000) [\d] { 19} ` ,
` (traefik\.entrypoint\.connections\.open,entrypoint=test value=1) [\d] { 19} ` ,
}
2019-07-18 21:36:05 +02:00
influxDBRegistry . EntryPointReqsCounter ( ) . With ( "entrypoint" , "test" ) . Add ( 1 )
influxDBRegistry . EntryPointReqDurationHistogram ( ) . With ( "entrypoint" , "test" ) . Observe ( 10000 )
influxDBRegistry . EntryPointOpenConnsGauge ( ) . With ( "entrypoint" , "test" ) . Set ( 1 )
2018-05-29 16:58:03 -04:00
msgEntrypoint := <- c
assertMessage ( t , * msgEntrypoint , expectedEntrypoint )
}
2017-11-09 17:22:03 +01:00
func assertMessage ( t * testing . T , msg string , patterns [ ] string ) {
2017-11-08 19:44:03 +05:30
t . Helper ( )
for _ , pattern := range patterns {
re := regexp . MustCompile ( pattern )
match := re . FindStringSubmatch ( msg )
if len ( match ) != 2 {
t . Errorf ( "Got %q %v, want %q" , msg , match , pattern )
}
}
}