mirror of
https://github.com/zalando-incubator/kube-metrics-adapter.git
synced 2025-03-09 20:07:32 +00:00
191 lines
5.5 KiB
Go
191 lines
5.5 KiB
Go
package httpmetrics
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func compareMetricsGetter(t *testing.T, first, second *PodMetricsJSONPathGetter) {
|
|
require.Equal(t, first.metricGetter.jsonPath, second.metricGetter.jsonPath)
|
|
require.Equal(t, first.scheme, second.scheme)
|
|
require.Equal(t, first.path, second.path)
|
|
require.Equal(t, first.port, second.port)
|
|
}
|
|
|
|
func TestNewPodJSONPathMetricsGetter(t *testing.T) {
|
|
configNoAggregator := map[string]string{
|
|
"json-key": "$.value",
|
|
"scheme": "http",
|
|
"path": "/metrics",
|
|
"port": "9090",
|
|
}
|
|
getterNoAggregator, err1 := NewPodMetricsJSONPathGetter(configNoAggregator)
|
|
|
|
require.NoError(t, err1)
|
|
compareMetricsGetter(t, &PodMetricsJSONPathGetter{
|
|
metricGetter: &JSONPathMetricsGetter{jsonPath: configNoAggregator["json-key"]},
|
|
scheme: "http",
|
|
path: "/metrics",
|
|
port: 9090,
|
|
}, getterNoAggregator)
|
|
|
|
configAggregator := map[string]string{
|
|
"json-key": "$.values",
|
|
"scheme": "http",
|
|
"path": "/metrics",
|
|
"port": "9090",
|
|
"aggregator": "avg",
|
|
}
|
|
getterAggregator, err2 := NewPodMetricsJSONPathGetter(configAggregator)
|
|
|
|
require.NoError(t, err2)
|
|
compareMetricsGetter(t, &PodMetricsJSONPathGetter{
|
|
metricGetter: &JSONPathMetricsGetter{jsonPath: configAggregator["json-key"], aggregator: Average},
|
|
scheme: "http",
|
|
path: "/metrics",
|
|
port: 9090,
|
|
}, getterAggregator)
|
|
|
|
configErrorJSONPath := map[string]string{
|
|
"json-key": "{}",
|
|
"scheme": "http",
|
|
"path": "/metrics",
|
|
"port": "9090",
|
|
}
|
|
|
|
_, err3 := NewPodMetricsJSONPathGetter(configErrorJSONPath)
|
|
require.Error(t, err3)
|
|
|
|
configErrorPort := map[string]string{
|
|
"json-key": "$.values",
|
|
"scheme": "http",
|
|
"path": "/metrics",
|
|
"port": "a9090",
|
|
}
|
|
|
|
_, err4 := NewPodMetricsJSONPathGetter(configErrorPort)
|
|
require.Error(t, err4)
|
|
|
|
configWithRawQuery := map[string]string{
|
|
"json-key": "$.values",
|
|
"scheme": "http",
|
|
"path": "/metrics",
|
|
"port": "9090",
|
|
"raw-query": "foo=bar&baz=bop",
|
|
}
|
|
getterWithRawQuery, err5 := NewPodMetricsJSONPathGetter(configWithRawQuery)
|
|
|
|
require.NoError(t, err5)
|
|
compareMetricsGetter(t, &PodMetricsJSONPathGetter{
|
|
metricGetter: &JSONPathMetricsGetter{jsonPath: configWithRawQuery["json-key"]},
|
|
scheme: "http",
|
|
path: "/metrics",
|
|
port: 9090,
|
|
rawQuery: "foo=bar&baz=bop",
|
|
}, getterWithRawQuery)
|
|
}
|
|
|
|
func TestBuildMetricsURL(t *testing.T) {
|
|
scheme := "http"
|
|
ip := "1.2.3.4"
|
|
port := "9090"
|
|
path := "/v1/test/"
|
|
rawQuery := "foo=bar&baz=bop"
|
|
|
|
// Test building URL with rawQuery
|
|
configWithRawQuery := map[string]string{
|
|
"json-key": "$.value",
|
|
"scheme": scheme,
|
|
"path": path,
|
|
"port": port,
|
|
"raw-query": rawQuery,
|
|
}
|
|
getterWithRawQuery, err1 := NewPodMetricsJSONPathGetter(configWithRawQuery)
|
|
require.NoError(t, err1)
|
|
|
|
expectedURLWithQuery := fmt.Sprintf("%s://%s:%s%s?%s", scheme, ip, port, path, rawQuery)
|
|
receivedURLWithQuery := getterWithRawQuery.buildMetricsURL(ip)
|
|
require.Equal(t, receivedURLWithQuery.String(), expectedURLWithQuery)
|
|
|
|
// Test building URL without rawQuery
|
|
configWithNoQuery := map[string]string{
|
|
"json-key": "$.value",
|
|
"scheme": scheme,
|
|
"path": path,
|
|
"port": port,
|
|
}
|
|
getterWithNoQuery, err3 := NewPodMetricsJSONPathGetter(configWithNoQuery)
|
|
require.NoError(t, err3)
|
|
|
|
expectedURLNoQuery := fmt.Sprintf("%s://%s:%s%s", scheme, ip, port, path)
|
|
receivedURLNoQuery := getterWithNoQuery.buildMetricsURL(ip)
|
|
require.Equal(t, receivedURLNoQuery.String(), expectedURLNoQuery)
|
|
}
|
|
|
|
func TestCustomTimeouts(t *testing.T) {
|
|
scheme := "http"
|
|
port := "9090"
|
|
path := "/v1/test/"
|
|
|
|
// Test no custom options results in default timeouts
|
|
defaultConfig := map[string]string{
|
|
"json-key": "$.value",
|
|
"scheme": scheme,
|
|
"path": path,
|
|
"port": port,
|
|
}
|
|
defaultTime := time.Duration(15000) * time.Millisecond
|
|
|
|
defaultGetter, err1 := NewPodMetricsJSONPathGetter(defaultConfig)
|
|
require.NoError(t, err1)
|
|
require.Equal(t, defaultGetter.metricGetter.client.Timeout, defaultTime)
|
|
|
|
// Test with custom request timeout
|
|
configWithRequestTimeout := map[string]string{
|
|
"json-key": "$.value",
|
|
"scheme": scheme,
|
|
"path": path,
|
|
"port": port,
|
|
"request-timeout": "978ms",
|
|
}
|
|
exectedTimeout := time.Duration(978) * time.Millisecond
|
|
customRequestGetter, err2 := NewPodMetricsJSONPathGetter(configWithRequestTimeout)
|
|
require.NoError(t, err2)
|
|
require.Equal(t, customRequestGetter.metricGetter.client.Timeout, exectedTimeout)
|
|
|
|
// Test with custom connect timeout. Unfortunately, it seems there's no way to access the
|
|
// connect timeout of the client struct to actually verify it's set :/
|
|
configWithConnectTimeout := map[string]string{
|
|
"json-key": "$.value",
|
|
"scheme": scheme,
|
|
"path": path,
|
|
"port": port,
|
|
"connect-timeout": "512ms",
|
|
}
|
|
_, err3 := NewPodMetricsJSONPathGetter(configWithConnectTimeout)
|
|
require.NoError(t, err3)
|
|
|
|
configWithInvalidTimeout := map[string]string{
|
|
"json-key": "$.value",
|
|
"scheme": scheme,
|
|
"path": path,
|
|
"port": port,
|
|
"request-timeout": "-256ms",
|
|
}
|
|
_, err4 := NewPodMetricsJSONPathGetter(configWithInvalidTimeout)
|
|
require.Error(t, err4)
|
|
|
|
configWithInvalidTimeout = map[string]string{
|
|
"json-key": "$.value",
|
|
"scheme": scheme,
|
|
"path": path,
|
|
"port": port,
|
|
"connect-timeout": "-256ms",
|
|
}
|
|
_, err5 := NewPodMetricsJSONPathGetter(configWithInvalidTimeout)
|
|
require.Error(t, err5)
|
|
}
|