2016-12-09 16:23:03 +00:00
|
|
|
/*
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2017-04-13 12:39:43 +00:00
|
|
|
func getMasterUsageByPrefix(prefix string) (string, error) {
|
|
|
|
sshResult, err := SSH(fmt.Sprintf("ps ax -o %%cpu,rss,command | tail -n +2 | grep %v | sed 's/\\s+/ /g'", prefix), GetMasterHost()+":22", TestContext.Provider)
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
return sshResult.Stdout, nil
|
|
|
|
}
|
|
|
|
|
2016-12-09 16:23:03 +00:00
|
|
|
// 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)
|
2018-03-14 10:03:42 +00:00
|
|
|
// Get kubernetes component resource usage
|
2017-04-13 12:39:43 +00:00
|
|
|
sshResult, err := getMasterUsageByPrefix("kube")
|
2016-12-09 16:23:03 +00:00
|
|
|
if err != nil {
|
2017-08-09 13:54:16 +00:00
|
|
|
Logf("Error when trying to SSH to master machine. Skipping probe. %v", err)
|
2016-12-09 16:23:03 +00:00
|
|
|
return nil
|
|
|
|
}
|
2017-04-13 12:39:43 +00:00
|
|
|
scanner := bufio.NewScanner(strings.NewReader(sshResult))
|
2016-12-09 16:23:03 +00:00
|
|
|
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}
|
|
|
|
}
|
|
|
|
}
|
2017-04-13 12:39:43 +00:00
|
|
|
// Get etcd resource usage
|
|
|
|
sshResult, err = getMasterUsageByPrefix("bin/etcd")
|
|
|
|
if err != nil {
|
|
|
|
Logf("Error when trying to SSH to master machine. Skipping probe")
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
scanner = bufio.NewScanner(strings.NewReader(sshResult))
|
|
|
|
for scanner.Scan() {
|
|
|
|
var cpu float64
|
|
|
|
var mem uint64
|
|
|
|
var etcdKind string
|
|
|
|
fmt.Sscanf(strings.TrimSpace(scanner.Text()), "%f %d /bin/sh -c /usr/local/bin/etcd", &cpu, &mem)
|
|
|
|
dataDirStart := strings.Index(scanner.Text(), "--data-dir")
|
|
|
|
if dataDirStart < 0 {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
fmt.Sscanf(scanner.Text()[dataDirStart:], "--data-dir=/var/%s", &etcdKind)
|
|
|
|
if etcdKind != "" {
|
|
|
|
// Gatherer expects pod_name/container_name format
|
|
|
|
fullName := "etcd/" + etcdKind
|
|
|
|
result[fullName] = &KubemarkResourceUsage{Name: fullName, MemoryWorkingSetInBytes: mem * 1024, CPUUsageInCores: cpu / 100}
|
|
|
|
}
|
|
|
|
}
|
2016-12-09 16:23:03 +00:00
|
|
|
return result
|
|
|
|
}
|