Update the Metrics test to only require the presense of a list of needed

metrics, and not fail if any new metrics are added.

Signed-off-by: Vishnu kannan <vishnuk@google.com>
This commit is contained in:
Vishnu kannan 2016-01-20 14:33:05 -08:00
parent 7866ffa71c
commit c7de580623
3 changed files with 26 additions and 19 deletions

View File

@ -24,7 +24,7 @@ import (
"github.com/prometheus/common/model" "github.com/prometheus/common/model"
) )
var KnownKubeletMetrics = map[string][]string{ var NecessaryKubeletMetrics = map[string][]string{
"cadvisor_version_info": {"cadvisorRevision", "cadvisorVersion", "dockerVersion", "kernelVersion", "osVersion"}, "cadvisor_version_info": {"cadvisorRevision", "cadvisorVersion", "dockerVersion", "kernelVersion", "osVersion"},
"container_cpu_system_seconds_total": {"id", "image", "kubernetes_container_name", "kubernetes_namespace", "kubernetes_pod_name", "name"}, "container_cpu_system_seconds_total": {"id", "image", "kubernetes_container_name", "kubernetes_namespace", "kubernetes_pod_name", "name"},
"container_cpu_usage_seconds_total": {"id", "image", "kubernetes_container_name", "kubernetes_namespace", "kubernetes_pod_name", "name", "cpu"}, "container_cpu_usage_seconds_total": {"id", "image", "kubernetes_container_name", "kubernetes_namespace", "kubernetes_pod_name", "name", "cpu"},
@ -43,6 +43,8 @@ var KnownKubeletMetrics = map[string][]string{
"container_fs_writes_merged_total": {"device", "id", "image", "kubernetes_container_name", "kubernetes_namespace", "kubernetes_pod_name", "name"}, "container_fs_writes_merged_total": {"device", "id", "image", "kubernetes_container_name", "kubernetes_namespace", "kubernetes_pod_name", "name"},
"container_fs_writes_total": {"device", "id", "image", "kubernetes_container_name", "kubernetes_namespace", "kubernetes_pod_name", "name"}, "container_fs_writes_total": {"device", "id", "image", "kubernetes_container_name", "kubernetes_namespace", "kubernetes_pod_name", "name"},
"container_last_seen": {"id", "image", "kubernetes_container_name", "kubernetes_namespace", "kubernetes_pod_name", "name"}, "container_last_seen": {"id", "image", "kubernetes_container_name", "kubernetes_namespace", "kubernetes_pod_name", "name"},
"container_memory_cache": {},
"container_memory_rss": {},
"container_memory_failcnt": {"id", "image", "kubernetes_container_name", "kubernetes_namespace", "kubernetes_pod_name", "name"}, "container_memory_failcnt": {"id", "image", "kubernetes_container_name", "kubernetes_namespace", "kubernetes_pod_name", "name"},
"container_memory_failures_total": {"id", "image", "kubernetes_container_name", "kubernetes_namespace", "kubernetes_pod_name", "name", "scope", "type"}, "container_memory_failures_total": {"id", "image", "kubernetes_container_name", "kubernetes_namespace", "kubernetes_pod_name", "name", "scope", "type"},
"container_memory_usage_bytes": {"id", "image", "kubernetes_container_name", "kubernetes_namespace", "kubernetes_pod_name", "name"}, "container_memory_usage_bytes": {"id", "image", "kubernetes_container_name", "kubernetes_namespace", "kubernetes_pod_name", "name"},
@ -116,15 +118,15 @@ func (m *KubeletMetrics) Equal(o KubeletMetrics) bool {
func NewKubeletMetrics() KubeletMetrics { func NewKubeletMetrics() KubeletMetrics {
result := NewMetrics() result := NewMetrics()
for metric := range KnownKubeletMetrics { for metric := range NecessaryKubeletMetrics {
result[metric] = make(model.Samples, 0) result[metric] = make(model.Samples, 0)
} }
return KubeletMetrics(result) return KubeletMetrics(result)
} }
func parseKubeletMetrics(data string, unknownMetrics sets.String) (KubeletMetrics, error) { func parseKubeletMetrics(data string) (KubeletMetrics, error) {
result := NewKubeletMetrics() result := NewKubeletMetrics()
if err := parseMetrics(data, KnownKubeletMetrics, (*Metrics)(&result), unknownMetrics); err != nil { if err := parseMetrics(data, NecessaryKubeletMetrics, (*Metrics)(&result), nil); err != nil {
return KubeletMetrics{}, err return KubeletMetrics{}, err
} }
return result, nil return result, nil

View File

@ -85,7 +85,7 @@ func NewMetricsGrabber(c *client.Client, kubelets bool, scheduler bool, controll
}, nil }, nil
} }
func (g *MetricsGrabber) GrabFromKubelet(nodeName string, unknownMetrics sets.String) (KubeletMetrics, error) { func (g *MetricsGrabber) GrabFromKubelet(nodeName string) (KubeletMetrics, error) {
nodes, err := g.client.Nodes().List(api.ListOptions{FieldSelector: fields.Set{client.ObjectNameField: nodeName}.AsSelector()}) nodes, err := g.client.Nodes().List(api.ListOptions{FieldSelector: fields.Set{client.ObjectNameField: nodeName}.AsSelector()})
if err != nil { if err != nil {
return KubeletMetrics{}, err return KubeletMetrics{}, err
@ -94,10 +94,10 @@ func (g *MetricsGrabber) GrabFromKubelet(nodeName string, unknownMetrics sets.St
return KubeletMetrics{}, fmt.Errorf("Error listing nodes with name %v, got %v", nodeName, nodes.Items) return KubeletMetrics{}, fmt.Errorf("Error listing nodes with name %v, got %v", nodeName, nodes.Items)
} }
kubeletPort := nodes.Items[0].Status.DaemonEndpoints.KubeletEndpoint.Port kubeletPort := nodes.Items[0].Status.DaemonEndpoints.KubeletEndpoint.Port
return g.grabFromKubeletInternal(nodeName, kubeletPort, unknownMetrics) return g.grabFromKubeletInternal(nodeName, kubeletPort)
} }
func (g *MetricsGrabber) grabFromKubeletInternal(nodeName string, kubeletPort int, unknownMetrics sets.String) (KubeletMetrics, error) { func (g *MetricsGrabber) grabFromKubeletInternal(nodeName string, kubeletPort int) (KubeletMetrics, error) {
if kubeletPort <= 0 || kubeletPort > 65535 { if kubeletPort <= 0 || kubeletPort > 65535 {
return KubeletMetrics{}, fmt.Errorf("Invalid Kubelet port %v. Skipping Kubelet's metrics gathering.", kubeletPort) return KubeletMetrics{}, fmt.Errorf("Invalid Kubelet port %v. Skipping Kubelet's metrics gathering.", kubeletPort)
} }
@ -105,7 +105,7 @@ func (g *MetricsGrabber) grabFromKubeletInternal(nodeName string, kubeletPort in
if err != nil { if err != nil {
return KubeletMetrics{}, err return KubeletMetrics{}, err
} }
return parseKubeletMetrics(output, unknownMetrics) return parseKubeletMetrics(output)
} }
func (g *MetricsGrabber) GrabFromScheduler(unknownMetrics sets.String) (SchedulerMetrics, error) { func (g *MetricsGrabber) GrabFromScheduler(unknownMetrics sets.String) (SchedulerMetrics, error) {
@ -173,7 +173,7 @@ func (g *MetricsGrabber) Grab(unknownMetrics sets.String) (MetricsCollection, er
} else { } else {
for _, node := range nodes.Items { for _, node := range nodes.Items {
kubeletPort := node.Status.DaemonEndpoints.KubeletEndpoint.Port kubeletPort := node.Status.DaemonEndpoints.KubeletEndpoint.Port
metrics, err := g.grabFromKubeletInternal(node.Name, kubeletPort, nil) metrics, err := g.grabFromKubeletInternal(node.Name, kubeletPort)
if err != nil { if err != nil {
errs = append(errs, err) errs = append(errs, err)
} }

View File

@ -47,7 +47,7 @@ func validateLabelSet(labelSet map[string][]string, data metrics.Metrics, invali
invalidLabel = false invalidLabel = false
} }
} }
if invalidLabel { if invalidLabel && invalidLabels != nil {
if _, ok := invalidLabels[metric]; !ok { if _, ok := invalidLabels[metric]; !ok {
invalidLabels[metric] = sets.NewString() invalidLabels[metric] = sets.NewString()
} }
@ -59,13 +59,21 @@ func validateLabelSet(labelSet map[string][]string, data metrics.Metrics, invali
} }
} }
func checkNecessaryMetrics(response metrics.Metrics, necessaryMetrics map[string][]string) {
missingLabels := make(map[string]sets.String)
validateLabelSet(metrics.CommonMetrics, response, nil, missingLabels)
validateLabelSet(necessaryMetrics, response, nil, missingLabels)
Expect(missingLabels).To(BeEmpty())
}
func checkMetrics(response metrics.Metrics, assumedMetrics map[string][]string) { func checkMetrics(response metrics.Metrics, assumedMetrics map[string][]string) {
invalidLabels := make(map[string]sets.String) invalidLabels := make(map[string]sets.String)
unknownLabels := make(map[string]sets.String) missingLabels := make(map[string]sets.String)
validateLabelSet(metrics.CommonMetrics, response, invalidLabels, unknownLabels) validateLabelSet(metrics.CommonMetrics, response, invalidLabels, missingLabels)
validateLabelSet(assumedMetrics, response, invalidLabels, unknownLabels) validateLabelSet(assumedMetrics, response, invalidLabels, missingLabels)
Expect(unknownLabels).To(BeEmpty()) Expect(missingLabels).To(BeEmpty())
Expect(invalidLabels).To(BeEmpty()) Expect(invalidLabels).To(BeEmpty())
} }
@ -97,12 +105,9 @@ var _ = Describe("MetricsGrabber", func() {
By("Connecting proxying to Node through the API server") By("Connecting proxying to Node through the API server")
nodes := ListSchedulableNodesOrDie(c) nodes := ListSchedulableNodesOrDie(c)
Expect(nodes.Items).NotTo(BeEmpty()) Expect(nodes.Items).NotTo(BeEmpty())
unknownMetrics := sets.NewString() response, err := grabber.GrabFromKubelet(nodes.Items[0].Name)
response, err := grabber.GrabFromKubelet(nodes.Items[0].Name, unknownMetrics)
expectNoError(err) expectNoError(err)
Expect(unknownMetrics).To(BeEmpty()) checkNecessaryMetrics(metrics.Metrics(response), metrics.NecessaryKubeletMetrics)
checkMetrics(metrics.Metrics(response), metrics.KnownKubeletMetrics)
} }
}) })