From 1b1a4aef6aa6b4ec6e6da5debd0a38d4e23e8d9b Mon Sep 17 00:00:00 2001 From: gmarek Date: Fri, 9 Dec 2016 17:23:03 +0100 Subject: [PATCH] Fix resource gatherer for kubemark --- test/e2e/framework/BUILD | 1 + .../framework/get-kubemark-resource-usage.go | 52 +++++++++++++++++++ test/e2e/framework/resource_usage_gatherer.go | 37 ++++--------- 3 files changed, 63 insertions(+), 27 deletions(-) create mode 100644 test/e2e/framework/get-kubemark-resource-usage.go diff --git a/test/e2e/framework/BUILD b/test/e2e/framework/BUILD index 88398d997aa..cae2d0eeb9d 100644 --- a/test/e2e/framework/BUILD +++ b/test/e2e/framework/BUILD @@ -14,6 +14,7 @@ go_library( "exec_util.go", "federation_util.go", "framework.go", + "get-kubemark-resource-usage.go", "google_compute.go", "kubelet_stats.go", "log_size_monitoring.go", diff --git a/test/e2e/framework/get-kubemark-resource-usage.go b/test/e2e/framework/get-kubemark-resource-usage.go new file mode 100644 index 00000000000..e28347dc310 --- /dev/null +++ b/test/e2e/framework/get-kubemark-resource-usage.go @@ -0,0 +1,52 @@ +/* +Copyright 2016 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 framework + +import ( + "bufio" + "fmt" + "strings" +) + +type KubemarkResourceUsage struct { + Name string + MemoryWorkingSetInBytes uint64 + CPUUsageInCores float64 +} + +// TODO: figure out how to move this to kubemark directory (need to factor test SSH out of e2e framework) +func GetKubemarkMasterComponentsResourceUsage() map[string]*KubemarkResourceUsage { + result := make(map[string]*KubemarkResourceUsage) + sshResult, err := SSH("ps ax -o %cpu,rss,command | tail -n +2 | grep kube | sed 's/\\s+/ /g'", GetMasterHost()+":22", TestContext.Provider) + if err != nil { + Logf("Error when trying to SSH to master machine. Skipping probe") + return nil + } + scanner := bufio.NewScanner(strings.NewReader(sshResult.Stdout)) + for scanner.Scan() { + var cpu float64 + var mem uint64 + var name string + fmt.Sscanf(strings.TrimSpace(scanner.Text()), "%f %d /usr/local/bin/kube-%s", &cpu, &mem, &name) + if name != "" { + // Gatherer expects pod_name/container_name format + fullName := name + "/" + name + result[fullName] = &KubemarkResourceUsage{Name: fullName, MemoryWorkingSetInBytes: mem * 1024, CPUUsageInCores: cpu / 100} + } + } + return result +} diff --git a/test/e2e/framework/resource_usage_gatherer.go b/test/e2e/framework/resource_usage_gatherer.go index f78855481d6..7eacc5e0d6a 100644 --- a/test/e2e/framework/resource_usage_gatherer.go +++ b/test/e2e/framework/resource_usage_gatherer.go @@ -17,7 +17,6 @@ limitations under the License. package framework import ( - "bufio" "bytes" "fmt" "math" @@ -140,14 +139,20 @@ type resourceGatherWorker struct { } func (w *resourceGatherWorker) singleProbe() { - var data ResourceUsagePerContainer + data := make(ResourceUsagePerContainer) if w.inKubemark { - data = getKubemarkMasterComponentsResourceUsage() + kubemarkData := GetKubemarkMasterComponentsResourceUsage() if data == nil { return } + for k, v := range kubemarkData { + data[k] = &ContainerResourceUsage{ + Name: v.Name, + MemoryWorkingSetInBytes: v.MemoryWorkingSetInBytes, + CPUUsageInCores: v.CPUUsageInCores, + } + } } else { - data = make(ResourceUsagePerContainer) nodeUsage, err := getOneTimeResourceUsageOnNode(w.c, w.nodeName, probeDuration, func() []string { return w.containerIDs }, true) if err != nil { Logf("Error while reading data from %v: %v", w.nodeName, err) @@ -181,28 +186,6 @@ func (w *resourceGatherWorker) gather(initialSleep time.Duration) { } } -func getKubemarkMasterComponentsResourceUsage() ResourceUsagePerContainer { - result := make(ResourceUsagePerContainer) - sshResult, err := SSH("ps ax -o %cpu,rss,command | tail -n +2 | grep kube", GetMasterHost()+":22", TestContext.Provider) - if err != nil { - Logf("Error when trying to SSH to master machine. Skipping probe") - return nil - } - scanner := bufio.NewScanner(strings.NewReader(sshResult.Stdout)) - for scanner.Scan() { - var cpu float64 - var mem uint64 - var name string - fmt.Sscanf(strings.TrimSpace(scanner.Text()), "%f %d kubernetes/server/bin/%s", &cpu, &mem, &name) - if name != "" { - // Gatherer expects pod_name/container_name format - fullName := name + "/" + name - result[fullName] = &ContainerResourceUsage{Name: fullName, MemoryWorkingSetInBytes: mem * 1024, CPUUsageInCores: cpu / 100} - } - } - return result -} - func (g *containerResourceGatherer) getKubeSystemContainersResourceUsage(c clientset.Interface) { if len(g.workers) == 0 { return @@ -317,7 +300,7 @@ func (g *containerResourceGatherer) stopAndSummarize(percentiles []int, constrai if len(percentiles) == 0 { Logf("Warning! Empty percentile list for stopAndPrintData.") - return &ResourceUsageSummary{}, nil + return &ResourceUsageSummary{}, fmt.Errorf("Failed to get any resource usage data") } data := make(map[int]ResourceUsagePerContainer) for i := range g.workers {