mirror of https://github.com/k3s-io/k3s
commit
36e87c4c21
|
@ -75,7 +75,6 @@ func NewHeapsterMetricsClient(client client.Interface) *HeapsterMetricsClient {
|
||||||
}
|
}
|
||||||
|
|
||||||
var heapsterMetricDefinitions = map[api.ResourceName]metricDefinition{
|
var heapsterMetricDefinitions = map[api.ResourceName]metricDefinition{
|
||||||
//TODO: add memory
|
|
||||||
api.ResourceCPU: {"cpu-usage",
|
api.ResourceCPU: {"cpu-usage",
|
||||||
func(metrics heapster.MetricResultList) (expapi.ResourceConsumption, int) {
|
func(metrics heapster.MetricResultList) (expapi.ResourceConsumption, int) {
|
||||||
sum, count := calculateSumFromLatestSample(metrics)
|
sum, count := calculateSumFromLatestSample(metrics)
|
||||||
|
@ -86,6 +85,15 @@ var heapsterMetricDefinitions = map[api.ResourceName]metricDefinition{
|
||||||
}
|
}
|
||||||
return expapi.ResourceConsumption{Resource: api.ResourceCPU, Quantity: resource.MustParse(value)}, count
|
return expapi.ResourceConsumption{Resource: api.ResourceCPU, Quantity: resource.MustParse(value)}, count
|
||||||
}},
|
}},
|
||||||
|
api.ResourceMemory: {"memory-usage",
|
||||||
|
func(metrics heapster.MetricResultList) (expapi.ResourceConsumption, int) {
|
||||||
|
sum, count := calculateSumFromLatestSample(metrics)
|
||||||
|
value := int64(0)
|
||||||
|
if count > 0 {
|
||||||
|
value = int64(sum) / int64(count)
|
||||||
|
}
|
||||||
|
return expapi.ResourceConsumption{Resource: api.ResourceMemory, Quantity: *resource.NewQuantity(value, resource.DecimalSI)}, count
|
||||||
|
}},
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *HeapsterMetricsClient) ResourceConsumption(namespace string) ResourceConsumptionClient {
|
func (h *HeapsterMetricsClient) ResourceConsumption(namespace string) ResourceConsumptionClient {
|
||||||
|
@ -111,7 +119,6 @@ func (h *HeapsterResourceConsumptionClient) Get(resourceName api.ResourceName, s
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *HeapsterResourceConsumptionClient) getForPods(resourceName api.ResourceName, podNames []string) (*expapi.ResourceConsumption, error) {
|
func (h *HeapsterResourceConsumptionClient) getForPods(resourceName api.ResourceName, podNames []string) (*expapi.ResourceConsumption, error) {
|
||||||
|
|
||||||
metricSpec, metricDefined := h.resourceDefinitions[resourceName]
|
metricSpec, metricDefined := h.resourceDefinitions[resourceName]
|
||||||
if !metricDefined {
|
if !metricDefined {
|
||||||
return nil, fmt.Errorf("heapster metric not defined for %v", resourceName)
|
return nil, fmt.Errorf("heapster metric not defined for %v", resourceName)
|
||||||
|
|
|
@ -41,7 +41,10 @@ const (
|
||||||
namespace = "test-namespace"
|
namespace = "test-namespace"
|
||||||
podName = "pod1"
|
podName = "pod1"
|
||||||
podListHandler = "podlisthandler"
|
podListHandler = "podlisthandler"
|
||||||
heapsterHandler = "heapsterhandler"
|
heapsterCpuHandler = "heapstercpuhandler"
|
||||||
|
heapsterMemHandler = "heapstermemhandler"
|
||||||
|
cpu = 650
|
||||||
|
memory = 20000000
|
||||||
)
|
)
|
||||||
|
|
||||||
type serverResponse struct {
|
type serverResponse struct {
|
||||||
|
@ -50,7 +53,6 @@ type serverResponse struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func makeTestServer(t *testing.T, responses map[string]*serverResponse) (*httptest.Server, map[string]*util.FakeHandler) {
|
func makeTestServer(t *testing.T, responses map[string]*serverResponse) (*httptest.Server, map[string]*util.FakeHandler) {
|
||||||
|
|
||||||
handlers := map[string]*util.FakeHandler{}
|
handlers := map[string]*util.FakeHandler{}
|
||||||
mux := http.NewServeMux()
|
mux := http.NewServeMux()
|
||||||
|
|
||||||
|
@ -78,10 +80,16 @@ func makeTestServer(t *testing.T, responses map[string]*serverResponse) (*httpte
|
||||||
handlers[podListHandler] = mkHandler(fmt.Sprintf("/api/v1/namespaces/%s/pods", namespace), *responses[podListHandler])
|
handlers[podListHandler] = mkHandler(fmt.Sprintf("/api/v1/namespaces/%s/pods", namespace), *responses[podListHandler])
|
||||||
}
|
}
|
||||||
|
|
||||||
if responses[heapsterHandler] != nil {
|
if responses[heapsterCpuHandler] != nil {
|
||||||
handlers[heapsterHandler] = mkRawHandler(
|
handlers[heapsterCpuHandler] = mkRawHandler(
|
||||||
fmt.Sprintf("/api/v1/proxy/namespaces/kube-system/services/monitoring-heapster/api/v1/model/namespaces/%s/pod-list/%s/metrics/cpu-usage",
|
fmt.Sprintf("/api/v1/proxy/namespaces/kube-system/services/monitoring-heapster/api/v1/model/namespaces/%s/pod-list/%s/metrics/cpu-usage",
|
||||||
namespace, podName), *responses[heapsterHandler])
|
namespace, podName), *responses[heapsterCpuHandler])
|
||||||
|
}
|
||||||
|
|
||||||
|
if responses[heapsterMemHandler] != nil {
|
||||||
|
handlers[heapsterMemHandler] = mkRawHandler(
|
||||||
|
fmt.Sprintf("/api/v1/proxy/namespaces/kube-system/services/monitoring-heapster/api/v1/model/namespaces/%s/pod-list/%s/metrics/memory-usage",
|
||||||
|
namespace, podName), *responses[heapsterMemHandler])
|
||||||
}
|
}
|
||||||
|
|
||||||
mux.HandleFunc("/", func(res http.ResponseWriter, req *http.Request) {
|
mux.HandleFunc("/", func(res http.ResponseWriter, req *http.Request) {
|
||||||
|
@ -92,7 +100,6 @@ func makeTestServer(t *testing.T, responses map[string]*serverResponse) (*httpte
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestHeapsterResourceConsumptionGet(t *testing.T) {
|
func TestHeapsterResourceConsumptionGet(t *testing.T) {
|
||||||
|
|
||||||
podListResponse := serverResponse{http.StatusOK, &api.PodList{
|
podListResponse := serverResponse{http.StatusOK, &api.PodList{
|
||||||
Items: []api.Pod{
|
Items: []api.Pod{
|
||||||
{
|
{
|
||||||
|
@ -103,18 +110,28 @@ func TestHeapsterResourceConsumptionGet(t *testing.T) {
|
||||||
}}}}
|
}}}}
|
||||||
|
|
||||||
timestamp := time.Now()
|
timestamp := time.Now()
|
||||||
metrics := heapster.MetricResultList{
|
metricsCpu := heapster.MetricResultList{
|
||||||
Items: []heapster.MetricResult{{
|
Items: []heapster.MetricResult{{
|
||||||
Metrics: []heapster.MetricPoint{{timestamp, 650}},
|
Metrics: []heapster.MetricPoint{{timestamp, cpu}},
|
||||||
LatestTimestamp: timestamp,
|
LatestTimestamp: timestamp,
|
||||||
}}}
|
}}}
|
||||||
heapsterRawResponse, _ := json.Marshal(&metrics)
|
heapsterRawCpuResponse, _ := json.Marshal(&metricsCpu)
|
||||||
heapsterStrResponse := string(heapsterRawResponse)
|
heapsterStrCpuResponse := string(heapsterRawCpuResponse)
|
||||||
heapsterResponse := serverResponse{http.StatusOK, &heapsterStrResponse}
|
heapsterCpuResponse := serverResponse{http.StatusOK, &heapsterStrCpuResponse}
|
||||||
|
|
||||||
|
metricsMem := heapster.MetricResultList{
|
||||||
|
Items: []heapster.MetricResult{{
|
||||||
|
Metrics: []heapster.MetricPoint{{timestamp, memory}},
|
||||||
|
LatestTimestamp: timestamp,
|
||||||
|
}}}
|
||||||
|
heapsterRawMemResponse, _ := json.Marshal(&metricsMem)
|
||||||
|
heapsterStrMemResponse := string(heapsterRawMemResponse)
|
||||||
|
heapsterMemResponse := serverResponse{http.StatusOK, &heapsterStrMemResponse}
|
||||||
|
|
||||||
testServer, _ := makeTestServer(t,
|
testServer, _ := makeTestServer(t,
|
||||||
map[string]*serverResponse{
|
map[string]*serverResponse{
|
||||||
heapsterHandler: &heapsterResponse,
|
heapsterCpuHandler: &heapsterCpuResponse,
|
||||||
|
heapsterMemHandler: &heapsterMemResponse,
|
||||||
podListHandler: &podListResponse,
|
podListHandler: &podListResponse,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -127,5 +144,11 @@ func TestHeapsterResourceConsumptionGet(t *testing.T) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Error while getting consumption: %v", err)
|
t.Fatalf("Error while getting consumption: %v", err)
|
||||||
}
|
}
|
||||||
assert.Equal(t, int64(650), val.Quantity.MilliValue())
|
assert.Equal(t, int64(cpu), val.Quantity.MilliValue())
|
||||||
|
|
||||||
|
val, err = metricsClient.ResourceConsumption(namespace).Get(api.ResourceMemory, map[string]string{"app": "test"})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Error while getting consumption: %v", err)
|
||||||
|
}
|
||||||
|
assert.Equal(t, int64(memory), val.Quantity.Value())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue