diff options
author | 2020-12-01 15:29:05 -0500 | |
---|---|---|
committer | 2020-12-01 15:29:05 -0500 | |
commit | 9121e784966d52bb93696d83d9ab394ac2efd77d (patch) | |
tree | c9d6c6ac28f712116eaec06a72119fc709d8e849 /plugin/kubernetes/metrics_test.go | |
parent | 56eea6e6099c41e8913b6c24fbbc156133f22c62 (diff) | |
download | coredns-9121e784966d52bb93696d83d9ab394ac2efd77d.tar.gz coredns-9121e784966d52bb93696d83d9ab394ac2efd77d.tar.zst coredns-9121e784966d52bb93696d83d9ab394ac2efd77d.zip |
plugin/kubernetes: Fix dns programming duration metric (#4255)
* get data reqd to record latency before calling toFuncs
* refactor out unnecessary toFunc wrappers
* remove latency metric unit tests per PR feedback
Signed-off-by: Chris O'Haver <cohaver@infoblox.com>
Diffstat (limited to 'plugin/kubernetes/metrics_test.go')
-rw-r--r-- | plugin/kubernetes/metrics_test.go | 223 |
1 files changed, 0 insertions, 223 deletions
diff --git a/plugin/kubernetes/metrics_test.go b/plugin/kubernetes/metrics_test.go deleted file mode 100644 index 43b5ca382..000000000 --- a/plugin/kubernetes/metrics_test.go +++ /dev/null @@ -1,223 +0,0 @@ -package kubernetes - -import ( - "context" - "strings" - "testing" - "time" - - "github.com/coredns/coredns/plugin/kubernetes/object" - - "github.com/prometheus/client_golang/prometheus/testutil" - api "k8s.io/api/core/v1" - discovery "k8s.io/api/discovery/v1beta1" - meta "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/wait" - "k8s.io/client-go/kubernetes" - "k8s.io/client-go/kubernetes/fake" -) - -const ( - namespace = "testns" -) - -var expected = ` - # HELP coredns_kubernetes_dns_programming_duration_seconds Histogram of the time (in seconds) it took to program a dns instance. - # TYPE coredns_kubernetes_dns_programming_duration_seconds histogram - coredns_kubernetes_dns_programming_duration_seconds_bucket{service_kind="headless_with_selector",le="0.001"} 0 - coredns_kubernetes_dns_programming_duration_seconds_bucket{service_kind="headless_with_selector",le="0.002"} 0 - coredns_kubernetes_dns_programming_duration_seconds_bucket{service_kind="headless_with_selector",le="0.004"} 0 - coredns_kubernetes_dns_programming_duration_seconds_bucket{service_kind="headless_with_selector",le="0.008"} 0 - coredns_kubernetes_dns_programming_duration_seconds_bucket{service_kind="headless_with_selector",le="0.016"} 0 - coredns_kubernetes_dns_programming_duration_seconds_bucket{service_kind="headless_with_selector",le="0.032"} 0 - coredns_kubernetes_dns_programming_duration_seconds_bucket{service_kind="headless_with_selector",le="0.064"} 0 - coredns_kubernetes_dns_programming_duration_seconds_bucket{service_kind="headless_with_selector",le="0.128"} 0 - coredns_kubernetes_dns_programming_duration_seconds_bucket{service_kind="headless_with_selector",le="0.256"} 0 - coredns_kubernetes_dns_programming_duration_seconds_bucket{service_kind="headless_with_selector",le="0.512"} 0 - coredns_kubernetes_dns_programming_duration_seconds_bucket{service_kind="headless_with_selector",le="1.024"} 1 - coredns_kubernetes_dns_programming_duration_seconds_bucket{service_kind="headless_with_selector",le="2.048"} 2 - coredns_kubernetes_dns_programming_duration_seconds_bucket{service_kind="headless_with_selector",le="4.096"} 2 - coredns_kubernetes_dns_programming_duration_seconds_bucket{service_kind="headless_with_selector",le="8.192"} 2 - coredns_kubernetes_dns_programming_duration_seconds_bucket{service_kind="headless_with_selector",le="16.384"} 2 - coredns_kubernetes_dns_programming_duration_seconds_bucket{service_kind="headless_with_selector",le="32.768"} 2 - coredns_kubernetes_dns_programming_duration_seconds_bucket{service_kind="headless_with_selector",le="65.536"} 2 - coredns_kubernetes_dns_programming_duration_seconds_bucket{service_kind="headless_with_selector",le="131.072"} 2 - coredns_kubernetes_dns_programming_duration_seconds_bucket{service_kind="headless_with_selector",le="262.144"} 2 - coredns_kubernetes_dns_programming_duration_seconds_bucket{service_kind="headless_with_selector",le="524.288"} 2 - coredns_kubernetes_dns_programming_duration_seconds_bucket{service_kind="headless_with_selector",le="+Inf"} 2 - coredns_kubernetes_dns_programming_duration_seconds_sum{service_kind="headless_with_selector"} 3 - coredns_kubernetes_dns_programming_duration_seconds_count{service_kind="headless_with_selector"} 2 - ` - -func TestDNSProgrammingLatencyEndpointSlices(t *testing.T) { - client := fake.NewSimpleClientset() - now := time.Now() - ctx := context.TODO() - controller := newdnsController(ctx, client, dnsControlOpts{ - initEndpointsCache: true, - useEndpointSlices: true, - // This is needed as otherwise the fake k8s client doesn't work properly. - skipAPIObjectsCleanup: true, - }) - - durationSinceFunc = func(t time.Time) time.Duration { - return now.Sub(t) - } - DNSProgrammingLatency.Reset() - go controller.Run() - - endpoints1 := []discovery.Endpoint{{ - Addresses: []string{"1.2.3.4"}, - }} - - endpoints2 := []discovery.Endpoint{{ - Addresses: []string{"1.2.3.45"}, - }} - - createService(t, client, controller, "my-service", api.ClusterIPNone) - createEndpointSlice(t, client, "my-service", now.Add(-2*time.Second), endpoints1) - updateEndpointSlice(t, client, "my-service", now.Add(-1*time.Second), endpoints2) - - createEndpointSlice(t, client, "endpoints-no-service", now.Add(-4*time.Second), nil) - - createService(t, client, controller, "clusterIP-service", "10.40.0.12") - createEndpointSlice(t, client, "clusterIP-service", now.Add(-8*time.Second), nil) - - createService(t, client, controller, "headless-no-annotation", api.ClusterIPNone) - createEndpointSlice(t, client, "headless-no-annotation", nil, nil) - - createService(t, client, controller, "headless-wrong-annotation", api.ClusterIPNone) - createEndpointSlice(t, client, "headless-wrong-annotation", "wrong-value", nil) - - controller.Stop() - - if err := testutil.CollectAndCompare(DNSProgrammingLatency, strings.NewReader(expected)); err != nil { - t.Error(err) - } -} - -func TestDnsProgrammingLatencyEndpoints(t *testing.T) { - client := fake.NewSimpleClientset() - now := time.Now() - ctx := context.TODO() - controller := newdnsController(ctx, client, dnsControlOpts{ - initEndpointsCache: true, - useEndpointSlices: false, - // This is needed as otherwise the fake k8s client doesn't work properly. - skipAPIObjectsCleanup: true, - }) - - durationSinceFunc = func(t time.Time) time.Duration { - return now.Sub(t) - } - DNSProgrammingLatency.Reset() - go controller.Run() - - subset1 := []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4", Hostname: "foo"}}, - }} - - subset2 := []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.5", Hostname: "foo"}}, - }} - - createService(t, client, controller, "my-service", api.ClusterIPNone) - createEndpoints(t, client, "my-service", now.Add(-2*time.Second), subset1) - updateEndpoints(t, client, "my-service", now.Add(-1*time.Second), subset2) - - createEndpoints(t, client, "endpoints-no-service", now.Add(-4*time.Second), nil) - - createService(t, client, controller, "clusterIP-service", "10.40.0.12") - createEndpoints(t, client, "clusterIP-service", now.Add(-8*time.Second), nil) - - createService(t, client, controller, "headless-no-annotation", api.ClusterIPNone) - createEndpoints(t, client, "headless-no-annotation", nil, nil) - - createService(t, client, controller, "headless-wrong-annotation", api.ClusterIPNone) - createEndpoints(t, client, "headless-wrong-annotation", "wrong-value", nil) - - controller.Stop() - - if err := testutil.CollectAndCompare(DNSProgrammingLatency, strings.NewReader(expected)); err != nil { - t.Error(err) - } -} - -func buildEndpoints(name string, lastChangeTriggerTime interface{}, subsets []api.EndpointSubset) *api.Endpoints { - annotations := make(map[string]string) - switch v := lastChangeTriggerTime.(type) { - case string: - annotations[api.EndpointsLastChangeTriggerTime] = v - case time.Time: - annotations[api.EndpointsLastChangeTriggerTime] = v.Format(time.RFC3339Nano) - } - return &api.Endpoints{ - ObjectMeta: meta.ObjectMeta{Namespace: namespace, Name: name, Annotations: annotations}, - Subsets: subsets, - } -} - -func buildEndpointSlice(name string, lastChangeTriggerTime interface{}, endpoints []discovery.Endpoint) *discovery.EndpointSlice { - annotations := make(map[string]string) - switch v := lastChangeTriggerTime.(type) { - case string: - annotations[api.EndpointsLastChangeTriggerTime] = v - case time.Time: - annotations[api.EndpointsLastChangeTriggerTime] = v.Format(time.RFC3339Nano) - } - return &discovery.EndpointSlice{ - ObjectMeta: meta.ObjectMeta{ - Namespace: namespace, Name: name + "-12345", - Labels: map[string]string{discovery.LabelServiceName: name}, - Annotations: annotations, - }, - Endpoints: endpoints, - } -} - -func createEndpoints(t *testing.T, client kubernetes.Interface, name string, triggerTime interface{}, subsets []api.EndpointSubset) { - ctx := context.TODO() - _, err := client.CoreV1().Endpoints(namespace).Create(ctx, buildEndpoints(name, triggerTime, subsets), meta.CreateOptions{}) - if err != nil { - t.Fatal(err) - } -} - -func updateEndpoints(t *testing.T, client kubernetes.Interface, name string, triggerTime interface{}, subsets []api.EndpointSubset) { - ctx := context.TODO() - _, err := client.CoreV1().Endpoints(namespace).Update(ctx, buildEndpoints(name, triggerTime, subsets), meta.UpdateOptions{}) - if err != nil { - t.Fatal(err) - } -} - -func createEndpointSlice(t *testing.T, client kubernetes.Interface, name string, triggerTime interface{}, endpoints []discovery.Endpoint) { - ctx := context.TODO() - _, err := client.DiscoveryV1beta1().EndpointSlices(namespace).Create(ctx, buildEndpointSlice(name, triggerTime, endpoints), meta.CreateOptions{}) - if err != nil { - t.Fatal(err) - } -} - -func updateEndpointSlice(t *testing.T, client kubernetes.Interface, name string, triggerTime interface{}, endpoints []discovery.Endpoint) { - ctx := context.TODO() - _, err := client.DiscoveryV1beta1().EndpointSlices(namespace).Update(ctx, buildEndpointSlice(name, triggerTime, endpoints), meta.UpdateOptions{}) - if err != nil { - t.Fatal(err) - } -} - -func createService(t *testing.T, client kubernetes.Interface, controller dnsController, name string, clusterIp string) { - ctx := context.TODO() - if _, err := client.CoreV1().Services(namespace).Create(ctx, &api.Service{ - ObjectMeta: meta.ObjectMeta{Namespace: namespace, Name: name}, - Spec: api.ServiceSpec{ClusterIP: clusterIp}, - }, meta.CreateOptions{}); err != nil { - t.Fatal(err) - } - if err := wait.PollImmediate(10*time.Millisecond, 10*time.Second, func() (bool, error) { - return len(controller.SvcIndex(object.ServiceKey(name, namespace))) == 1, nil - }); err != nil { - t.Fatal(err) - } -} |