149 lines
5.3 KiB
Go
149 lines
5.3 KiB
Go
package metrics
|
|
|
|
import (
|
|
"encoding/json"
|
|
|
|
"strings"
|
|
|
|
"github.com/golang/glog"
|
|
|
|
"kubesphere.io/kubesphere/pkg/client"
|
|
"kubesphere.io/kubesphere/pkg/constants"
|
|
|
|
"fmt"
|
|
)
|
|
|
|
type ContainerMetrics struct {
|
|
NodeName string `json:"node_name"`
|
|
ContainerName string `json:"container_name"`
|
|
CpuRequest string `json:"cpu_request"`
|
|
CpuLimit string `json:"cpu_limit"`
|
|
MemoryRequest string `json:"mem_request"`
|
|
MemoryLimit string `json:"mem_limit"`
|
|
Cpu []ContainerCpuMetrics `json:"cpu"`
|
|
Memory []ContainerMemoryMetrics `json:"memory"`
|
|
}
|
|
type ContainerCpuMetrics struct {
|
|
TimeStamp string `json:"timestamp"`
|
|
UsedCpu string `json:"used_cpu"`
|
|
}
|
|
|
|
type ContainerMemoryMetrics struct {
|
|
TimeStamp string `json:"timestamp"`
|
|
UsedMemory string `json:"used_mem"`
|
|
}
|
|
|
|
/*
|
|
Get all containers under specified namespace in default cluster
|
|
*/
|
|
func GetContainers(namespace, podName string) []string {
|
|
containersList := client.GetHeapsterMetrics("/namespaces/" + namespace + "/pods/" + podName + "/containers")
|
|
var containers []string
|
|
dec := json.NewDecoder(strings.NewReader(containersList))
|
|
err := dec.Decode(&containers)
|
|
if err != nil {
|
|
glog.Error(err)
|
|
}
|
|
return containers
|
|
}
|
|
|
|
func FormatContainersMetrics(nodeName, namespace, podName string) constants.PageableResponse {
|
|
|
|
var result constants.PageableResponse
|
|
var resultContainer ContainerMetrics
|
|
var containers []string
|
|
var total_count int
|
|
containers = GetContainers(namespace, podName)
|
|
|
|
for i, container := range containers {
|
|
resultContainer = FormatContainerMetrics(namespace, podName, container)
|
|
if nodeName != "" {
|
|
resultContainer.NodeName = nodeName
|
|
} else {
|
|
resultContainer.NodeName = GetNodeNameForPod(podName, namespace)
|
|
}
|
|
result.Items = append(result.Items, resultContainer)
|
|
total_count = i
|
|
}
|
|
result.TotalCount = total_count + 1
|
|
|
|
return result
|
|
}
|
|
|
|
func FormatContainerMetrics(namespace, podName, containerName string) ContainerMetrics {
|
|
var resultContainer ContainerMetrics
|
|
var containerCPUMetrics []ContainerCpuMetrics
|
|
var containerMemMetrics []ContainerMemoryMetrics
|
|
var cpuMetrics ContainerCpuMetrics
|
|
var memMetrics ContainerMemoryMetrics
|
|
|
|
resultContainer.ContainerName = containerName
|
|
|
|
cpuRequest := client.GetHeapsterMetricsJson("/namespaces/" + namespace + "/pods/" + podName + "/containers/" + containerName + "/metrics/cpu/request")
|
|
cpuRequestMetrics, err := cpuRequest.GetObjectArray("metrics")
|
|
if err == nil && len(cpuRequestMetrics) != 0 {
|
|
requestCpu, _ := cpuRequestMetrics[0].GetFloat64("value")
|
|
resultContainer.CpuRequest = fmt.Sprintf("%.1f", requestCpu)
|
|
} else {
|
|
resultContainer.CpuRequest = Inf
|
|
}
|
|
|
|
cpuLimit := client.GetHeapsterMetricsJson("/namespaces/" + namespace + "/pods/" + podName + "/containers/" + containerName + "/metrics/cpu/limit")
|
|
cpuLimitMetrics, err := cpuLimit.GetObjectArray("metrics")
|
|
if err == nil && len(cpuLimitMetrics) != 0 {
|
|
limitCpu, _ := cpuLimitMetrics[0].GetFloat64("value")
|
|
resultContainer.CpuLimit = fmt.Sprintf("%.1f", limitCpu)
|
|
} else {
|
|
resultContainer.CpuLimit = Inf
|
|
}
|
|
|
|
memoryRequst := client.GetHeapsterMetricsJson("/namespaces/" + namespace + "/pods/" + podName + "/containers/" + containerName + "/metrics/memory/request")
|
|
memoryRequstMetrics, err := memoryRequst.GetObjectArray("metrics")
|
|
if err == nil && len(memoryRequstMetrics) != 0 {
|
|
requestMemory, _ := memoryRequstMetrics[0].GetFloat64("value")
|
|
resultContainer.MemoryRequest = fmt.Sprintf("%.1f", requestMemory)
|
|
} else {
|
|
resultContainer.MemoryRequest = Inf
|
|
}
|
|
|
|
memoryLimit := client.GetHeapsterMetricsJson("/namespaces/" + namespace + "/pods/" + podName + "/containers/" + containerName + "/metrics/memory/limit")
|
|
memoryLimitMetrics, err := memoryLimit.GetObjectArray("metrics")
|
|
if err == nil && len(memoryLimitMetrics) != 0 {
|
|
limitMemory, _ := memoryLimitMetrics[0].GetFloat64("value")
|
|
resultContainer.MemoryLimit = fmt.Sprintf("%.1f", limitMemory)
|
|
} else {
|
|
resultContainer.MemoryLimit = Inf
|
|
}
|
|
|
|
cpuUsageRate := client.GetHeapsterMetricsJson("/namespaces/" + namespace + "/pods/" + podName + "/containers/" + containerName + "/metrics/cpu/usage_rate")
|
|
cpuUsageRateMetrics, err := cpuUsageRate.GetObjectArray("metrics")
|
|
if err == nil && len(cpuUsageRateMetrics) != 0 {
|
|
for _, metric := range cpuUsageRateMetrics {
|
|
timestamp, _ := metric.GetString("timestamp")
|
|
cpuMetrics.TimeStamp = timestamp
|
|
usedCpu, _ := metric.GetFloat64("value")
|
|
cpuMetrics.UsedCpu = fmt.Sprintf("%.1f", usedCpu)
|
|
|
|
containerCPUMetrics = append(containerCPUMetrics, cpuMetrics)
|
|
}
|
|
}
|
|
|
|
resultContainer.Cpu = containerCPUMetrics
|
|
|
|
memoryUsage := client.GetHeapsterMetricsJson("/namespaces/" + namespace + "/pods/" + podName + "/containers/" + containerName + "/metrics/memory/usage")
|
|
memoryUsageMetrics, err := memoryUsage.GetObjectArray("metrics")
|
|
if err == nil && len(memoryUsageMetrics) != 0 {
|
|
for _, metric := range memoryUsageMetrics {
|
|
timestamp, _ := metric.GetString("timestamp")
|
|
memMetrics.TimeStamp = timestamp
|
|
usedMemoryBytes, _ := metric.GetFloat64("value")
|
|
memMetrics.UsedMemory = fmt.Sprintf("%.1f", usedMemoryBytes/1024/1024)
|
|
containerMemMetrics = append(containerMemMetrics, memMetrics)
|
|
}
|
|
}
|
|
|
|
resultContainer.Memory = containerMemMetrics
|
|
|
|
return resultContainer
|
|
}
|