2016-03-02 00:12:23 +08:00
package prometheus
import (
2021-10-06 05:11:46 +08:00
"fmt"
2016-07-07 18:15:47 +08:00
"net/http"
2016-03-02 00:12:23 +08:00
"testing"
2021-10-06 05:11:46 +08:00
"time"
2016-03-02 00:12:23 +08:00
2021-11-15 23:14:09 +08:00
"github.com/stretchr/testify/require"
2016-03-02 00:12:23 +08:00
)
const validUniqueGauge = ` # HELP cadvisor_version_info A metric with a constant '1' value labeled by kernel version , OS version , docker version , cadvisor version & cadvisor revision .
# TYPE cadvisor_version_info gauge
cadvisor_version_info { cadvisorRevision = "" , cadvisorVersion = "" , dockerVersion = "1.8.2" , kernelVersion = "3.10.0-229.20.1.el7.x86_64" , osVersion = "CentOS Linux 7 (Core)" } 1
`
const validUniqueCounter = ` # HELP get_token_fail_count Counter of failed Token ( ) requests to the alternate token source
# TYPE get_token_fail_count counter
get_token_fail_count 0
`
const validUniqueSummary = ` # HELP http_request_duration_microseconds The HTTP request latencies in microseconds .
# TYPE http_request_duration_microseconds summary
http_request_duration_microseconds { handler = "prometheus" , quantile = "0.5" } 552048.506
http_request_duration_microseconds { handler = "prometheus" , quantile = "0.9" } 5.876804288e+06
http_request_duration_microseconds { handler = "prometheus" , quantile = "0.99" } 5.876804288e+06
http_request_duration_microseconds_sum { handler = "prometheus" } 1.8909097205e+07
http_request_duration_microseconds_count { handler = "prometheus" } 9
`
const validUniqueHistogram = ` # HELP apiserver_request_latencies Response latency distribution in microseconds for each verb , resource and client .
# TYPE apiserver_request_latencies histogram
apiserver_request_latencies_bucket { resource = "bindings" , verb = "POST" , le = "125000" } 1994
apiserver_request_latencies_bucket { resource = "bindings" , verb = "POST" , le = "250000" } 1997
apiserver_request_latencies_bucket { resource = "bindings" , verb = "POST" , le = "500000" } 2000
apiserver_request_latencies_bucket { resource = "bindings" , verb = "POST" , le = "1e+06" } 2005
apiserver_request_latencies_bucket { resource = "bindings" , verb = "POST" , le = "2e+06" } 2012
apiserver_request_latencies_bucket { resource = "bindings" , verb = "POST" , le = "4e+06" } 2017
apiserver_request_latencies_bucket { resource = "bindings" , verb = "POST" , le = "8e+06" } 2024
apiserver_request_latencies_bucket { resource = "bindings" , verb = "POST" , le = "+Inf" } 2025
apiserver_request_latencies_sum { resource = "bindings" , verb = "POST" } 1.02726334e+08
apiserver_request_latencies_count { resource = "bindings" , verb = "POST" } 2025
`
func TestParseValidPrometheus ( t * testing . T ) {
// Gauge value
2021-10-06 05:11:46 +08:00
metrics , err := Parse ( [ ] byte ( validUniqueGauge ) , http . Header { } , false )
2021-11-15 23:14:09 +08:00
require . NoError ( t , err )
require . Len ( t , metrics , 1 )
require . Equal ( t , "cadvisor_version_info" , metrics [ 0 ] . Name ( ) )
require . Equal ( t , map [ string ] interface { } {
2016-03-02 00:12:23 +08:00
"gauge" : float64 ( 1 ) ,
} , metrics [ 0 ] . Fields ( ) )
2021-11-15 23:14:09 +08:00
require . Equal ( t , map [ string ] string {
2018-03-28 08:30:51 +08:00
"osVersion" : "CentOS Linux 7 (Core)" ,
"cadvisorRevision" : "" ,
"cadvisorVersion" : "" ,
"dockerVersion" : "1.8.2" ,
"kernelVersion" : "3.10.0-229.20.1.el7.x86_64" ,
2016-03-02 00:12:23 +08:00
} , metrics [ 0 ] . Tags ( ) )
// Counter value
2021-10-06 05:11:46 +08:00
metrics , err = Parse ( [ ] byte ( validUniqueCounter ) , http . Header { } , false )
2021-11-15 23:14:09 +08:00
require . NoError ( t , err )
require . Len ( t , metrics , 1 )
require . Equal ( t , "get_token_fail_count" , metrics [ 0 ] . Name ( ) )
require . Equal ( t , map [ string ] interface { } {
2016-03-02 00:12:23 +08:00
"counter" : float64 ( 0 ) ,
} , metrics [ 0 ] . Fields ( ) )
2021-11-15 23:14:09 +08:00
require . Equal ( t , map [ string ] string { } , metrics [ 0 ] . Tags ( ) )
2016-03-02 00:12:23 +08:00
// Summary data
2016-07-07 18:15:47 +08:00
//SetDefaultTags(map[string]string{})
2021-10-06 05:11:46 +08:00
metrics , err = Parse ( [ ] byte ( validUniqueSummary ) , http . Header { } , false )
2021-11-15 23:14:09 +08:00
require . NoError ( t , err )
require . Len ( t , metrics , 1 )
require . Equal ( t , "http_request_duration_microseconds" , metrics [ 0 ] . Name ( ) )
require . Equal ( t , map [ string ] interface { } {
2016-03-02 00:12:23 +08:00
"0.5" : 552048.506 ,
"0.9" : 5.876804288e+06 ,
"0.99" : 5.876804288e+06 ,
2016-06-10 05:50:00 +08:00
"count" : 9.0 ,
2016-03-02 00:12:23 +08:00
"sum" : 1.8909097205e+07 ,
} , metrics [ 0 ] . Fields ( ) )
2021-11-15 23:14:09 +08:00
require . Equal ( t , map [ string ] string { "handler" : "prometheus" } , metrics [ 0 ] . Tags ( ) )
2016-03-02 00:12:23 +08:00
// histogram data
2021-10-06 05:11:46 +08:00
metrics , err = Parse ( [ ] byte ( validUniqueHistogram ) , http . Header { } , false )
2021-11-15 23:14:09 +08:00
require . NoError ( t , err )
require . Len ( t , metrics , 1 )
require . Equal ( t , "apiserver_request_latencies" , metrics [ 0 ] . Name ( ) )
require . Equal ( t , map [ string ] interface { } {
2016-03-02 00:12:23 +08:00
"500000" : 2000.0 ,
"count" : 2025.0 ,
2016-06-10 05:50:00 +08:00
"sum" : 1.02726334e+08 ,
2016-03-02 00:12:23 +08:00
"250000" : 1997.0 ,
"2e+06" : 2012.0 ,
"4e+06" : 2017.0 ,
"8e+06" : 2024.0 ,
"+Inf" : 2025.0 ,
"125000" : 1994.0 ,
"1e+06" : 2005.0 ,
} , metrics [ 0 ] . Fields ( ) )
2021-11-15 23:14:09 +08:00
require . Equal ( t ,
2016-03-02 00:12:23 +08:00
map [ string ] string { "verb" : "POST" , "resource" : "bindings" } ,
metrics [ 0 ] . Tags ( ) )
}
2021-10-06 05:11:46 +08:00
func TestMetricsWithTimestamp ( t * testing . T ) {
testTime := time . Date ( 2020 , time . October , 4 , 17 , 0 , 0 , 0 , time . UTC )
testTimeUnix := testTime . UnixNano ( ) / int64 ( time . Millisecond )
metricsWithTimestamps := fmt . Sprintf ( `
# TYPE test_counter counter
test_counter { label = "test" } 1 % d
` , testTimeUnix )
// IgnoreTimestamp is false
metrics , err := Parse ( [ ] byte ( metricsWithTimestamps ) , http . Header { } , false )
2021-11-15 23:14:09 +08:00
require . NoError ( t , err )
require . Len ( t , metrics , 1 )
require . Equal ( t , "test_counter" , metrics [ 0 ] . Name ( ) )
require . Equal ( t , map [ string ] interface { } {
2021-10-06 05:11:46 +08:00
"counter" : float64 ( 1 ) ,
} , metrics [ 0 ] . Fields ( ) )
2021-11-15 23:14:09 +08:00
require . Equal ( t , map [ string ] string {
2021-10-06 05:11:46 +08:00
"label" : "test" ,
} , metrics [ 0 ] . Tags ( ) )
2021-11-15 23:14:09 +08:00
require . Equal ( t , testTime , metrics [ 0 ] . Time ( ) . UTC ( ) )
2021-10-06 05:11:46 +08:00
// IgnoreTimestamp is true
metrics , err = Parse ( [ ] byte ( metricsWithTimestamps ) , http . Header { } , true )
2021-11-15 23:14:09 +08:00
require . NoError ( t , err )
require . Len ( t , metrics , 1 )
require . Equal ( t , "test_counter" , metrics [ 0 ] . Name ( ) )
require . Equal ( t , map [ string ] interface { } {
2021-10-06 05:11:46 +08:00
"counter" : float64 ( 1 ) ,
} , metrics [ 0 ] . Fields ( ) )
2021-11-15 23:14:09 +08:00
require . Equal ( t , map [ string ] string {
2021-10-06 05:11:46 +08:00
"label" : "test" ,
} , metrics [ 0 ] . Tags ( ) )
2021-11-15 23:14:09 +08:00
require . WithinDuration ( t , time . Now ( ) , metrics [ 0 ] . Time ( ) . UTC ( ) , 5 * time . Second )
2021-10-06 05:11:46 +08:00
}