123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- /*
- Copyright 2015 The Kubernetes Authors.
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- */
- package metrics
- import (
- "context"
- "fmt"
- "io/ioutil"
- "net/http"
- "net/http/httptest"
- "runtime"
- "testing"
- metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
- "k8s.io/apimachinery/pkg/runtime/schema"
- clientset "k8s.io/client-go/kubernetes"
- restclient "k8s.io/client-go/rest"
- "k8s.io/component-base/metrics/testutil"
- "k8s.io/kubernetes/test/integration/framework"
- )
- func scrapeMetrics(s *httptest.Server) (testutil.Metrics, error) {
- req, err := http.NewRequest("GET", s.URL+"/metrics", nil)
- if err != nil {
- return nil, fmt.Errorf("Unable to create http request: %v", err)
- }
- client := &http.Client{}
- resp, err := client.Do(req)
- if err != nil {
- return nil, fmt.Errorf("Unable to contact metrics endpoint of master: %v", err)
- }
- defer resp.Body.Close()
- if resp.StatusCode != http.StatusOK {
- return nil, fmt.Errorf("Non-200 response trying to scrape metrics from master: %v", resp)
- }
- metrics := testutil.NewMetrics()
- data, err := ioutil.ReadAll(resp.Body)
- if err != nil {
- return nil, fmt.Errorf("Unable to read response: %v", resp)
- }
- err = testutil.ParseMetrics(string(data), &metrics)
- return metrics, err
- }
- func checkForExpectedMetrics(t *testing.T, metrics testutil.Metrics, expectedMetrics []string) {
- for _, expected := range expectedMetrics {
- if _, found := metrics[expected]; !found {
- t.Errorf("Master metrics did not include expected metric %q", expected)
- }
- }
- }
- func TestMasterProcessMetrics(t *testing.T) {
- if runtime.GOOS == "darwin" || runtime.GOOS == "windows" {
- t.Skipf("not supported on GOOS=%s", runtime.GOOS)
- }
- _, s, closeFn := framework.RunAMaster(nil)
- defer closeFn()
- metrics, err := scrapeMetrics(s)
- if err != nil {
- t.Fatal(err)
- }
- checkForExpectedMetrics(t, metrics, []string{
- "process_start_time_seconds",
- "process_cpu_seconds_total",
- "process_open_fds",
- "process_resident_memory_bytes",
- })
- }
- func TestApiserverMetrics(t *testing.T) {
- _, s, closeFn := framework.RunAMaster(nil)
- defer closeFn()
- // 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.
- client := clientset.NewForConfigOrDie(&restclient.Config{Host: s.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &schema.GroupVersion{Group: "", Version: "v1"}}})
- if _, err := client.CoreV1().Pods(metav1.NamespaceDefault).List(context.TODO(), metav1.ListOptions{}); err != nil {
- t.Fatalf("unexpected error getting pods: %v", err)
- }
- metrics, err := scrapeMetrics(s)
- if err != nil {
- t.Fatal(err)
- }
- checkForExpectedMetrics(t, metrics, []string{
- "apiserver_request_total",
- "apiserver_request_duration_seconds_sum",
- "etcd_request_duration_seconds_sum",
- })
- }
|