Clean shutdown of metrics integration tests

This commit is contained in:
Wojciech Tyczyński 2022-05-21 08:50:21 +02:00
parent 284509f36e
commit 054c489d00

View File

@ -20,42 +20,31 @@ import (
"context" "context"
"errors" "errors"
"fmt" "fmt"
"io"
"net/http"
"net/http/httptest"
"runtime" "runtime"
"testing" "testing"
"github.com/prometheus/common/model" "github.com/prometheus/common/model"
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
clientset "k8s.io/client-go/kubernetes" clientset "k8s.io/client-go/kubernetes"
restclient "k8s.io/client-go/rest" restclient "k8s.io/client-go/rest"
"k8s.io/component-base/metrics/testutil" "k8s.io/component-base/metrics/testutil"
kubeapiservertesting "k8s.io/kubernetes/cmd/kube-apiserver/app/testing"
"k8s.io/kubernetes/test/integration/framework" "k8s.io/kubernetes/test/integration/framework"
) )
func scrapeMetrics(s *httptest.Server) (testutil.Metrics, error) { func scrapeMetrics(s *kubeapiservertesting.TestServer) (testutil.Metrics, error) {
req, err := http.NewRequest("GET", s.URL+"/metrics", nil) client, err := clientset.NewForConfig(s.ClientConfig)
if err != nil { if err != nil {
return nil, fmt.Errorf("Unable to create http request: %v", err) return nil, fmt.Errorf("couldn't create client")
} }
client := &http.Client{}
resp, err := client.Do(req) body, err := client.RESTClient().Get().AbsPath("metrics").DoRaw(context.TODO())
if err != nil { if err != nil {
return nil, fmt.Errorf("Unable to contact metrics endpoint of API server: %v", err) return nil, fmt.Errorf("request failed: %v", err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("Non-200 response trying to scrape metrics from API Server: %v", resp)
} }
metrics := testutil.NewMetrics() metrics := testutil.NewMetrics()
data, err := io.ReadAll(resp.Body) err = testutil.ParseMetrics(string(body), &metrics)
if err != nil {
return nil, fmt.Errorf("Unable to read response: %v", resp)
}
err = testutil.ParseMetrics(string(data), &metrics)
return metrics, err return metrics, err
} }
@ -72,8 +61,8 @@ func TestAPIServerProcessMetrics(t *testing.T) {
t.Skipf("not supported on GOOS=%s", runtime.GOOS) t.Skipf("not supported on GOOS=%s", runtime.GOOS)
} }
_, s, closeFn := framework.RunAnAPIServer(nil) s := kubeapiservertesting.StartTestServerOrDie(t, nil, nil, framework.SharedEtcd())
defer closeFn() defer s.TearDownFn()
metrics, err := scrapeMetrics(s) metrics, err := scrapeMetrics(s)
if err != nil { if err != nil {
@ -88,12 +77,12 @@ func TestAPIServerProcessMetrics(t *testing.T) {
} }
func TestAPIServerMetrics(t *testing.T) { func TestAPIServerMetrics(t *testing.T) {
_, s, closeFn := framework.RunAnAPIServer(nil) s := kubeapiservertesting.StartTestServerOrDie(t, nil, nil, framework.SharedEtcd())
defer closeFn() defer s.TearDownFn()
// Make a request to the apiserver to ensure there's at least one data point // Make a request to the apiserver to ensure there's at least one data point
// for the metrics we're expecting -- otherwise, they won't be exported. // for the metrics we're expecting -- otherwise, they won't be exported.
client := clientset.NewForConfigOrDie(&restclient.Config{Host: s.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &schema.GroupVersion{Group: "", Version: "v1"}}}) client := clientset.NewForConfigOrDie(s.ClientConfig)
if _, err := client.CoreV1().Pods(metav1.NamespaceDefault).List(context.TODO(), metav1.ListOptions{}); err != nil { if _, err := client.CoreV1().Pods(metav1.NamespaceDefault).List(context.TODO(), metav1.ListOptions{}); err != nil {
t.Fatalf("unexpected error getting pods: %v", err) t.Fatalf("unexpected error getting pods: %v", err)
} }
@ -116,10 +105,13 @@ func TestAPIServerMetrics(t *testing.T) {
} }
func TestAPIServerMetricsLabels(t *testing.T) { func TestAPIServerMetricsLabels(t *testing.T) {
_, s, closeFn := framework.RunAnAPIServer(nil) // Disable ServiceAccount admission plugin as we don't have service account controller running.
defer closeFn() s := kubeapiservertesting.StartTestServerOrDie(t, nil, []string{"--disable-admission-plugins=ServiceAccount"}, framework.SharedEtcd())
defer s.TearDownFn()
client, err := clientset.NewForConfig(&restclient.Config{Host: s.URL, QPS: -1}) clientConfig := restclient.CopyConfig(s.ClientConfig)
clientConfig.QPS = -1
client, err := clientset.NewForConfig(clientConfig)
if err != nil { if err != nil {
t.Fatalf("Error in create clientset: %v", err) t.Fatalf("Error in create clientset: %v", err)
} }
@ -266,10 +258,13 @@ func TestAPIServerMetricsPods(t *testing.T) {
} }
} }
_, server, closeFn := framework.RunAnAPIServer(framework.NewControlPlaneConfig()) // Disable ServiceAccount admission plugin as we don't have service account controller running.
defer closeFn() server := kubeapiservertesting.StartTestServerOrDie(t, nil, []string{"--disable-admission-plugins=ServiceAccount"}, framework.SharedEtcd())
defer server.TearDownFn()
client, err := clientset.NewForConfig(&restclient.Config{Host: server.URL, QPS: -1}) clientConfig := restclient.CopyConfig(server.ClientConfig)
clientConfig.QPS = -1
client, err := clientset.NewForConfig(clientConfig)
if err != nil { if err != nil {
t.Fatalf("Error in create clientset: %v", err) t.Fatalf("Error in create clientset: %v", err)
} }
@ -372,10 +367,12 @@ func TestAPIServerMetricsNamespaces(t *testing.T) {
} }
} }
_, server, closeFn := framework.RunAnAPIServer(framework.NewControlPlaneConfig()) server := kubeapiservertesting.StartTestServerOrDie(t, nil, nil, framework.SharedEtcd())
defer closeFn() defer server.TearDownFn()
client, err := clientset.NewForConfig(&restclient.Config{Host: server.URL, QPS: -1}) clientConfig := restclient.CopyConfig(server.ClientConfig)
clientConfig.QPS = -1
client, err := clientset.NewForConfig(clientConfig)
if err != nil { if err != nil {
t.Fatalf("Error in create clientset: %v", err) t.Fatalf("Error in create clientset: %v", err)
} }
@ -462,7 +459,7 @@ func TestAPIServerMetricsNamespaces(t *testing.T) {
} }
} }
func getSamples(s *httptest.Server) (model.Samples, error) { func getSamples(s *kubeapiservertesting.TestServer) (model.Samples, error) {
metrics, err := scrapeMetrics(s) metrics, err := scrapeMetrics(s)
if err != nil { if err != nil {
return nil, err return nil, err