Skip to content

Commit 31f7931

Browse files
committed
fix big memory overflow
1 parent 3c6bc83 commit 31f7931

File tree

2 files changed

+108
-9
lines changed

2 files changed

+108
-9
lines changed

internal/store/node.go

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ package store
1818

1919
import (
2020
"context"
21+
"k8s.io/apimachinery/pkg/api/resource"
22+
"math"
2123
"strings"
2224

2325
basemetrics "k8s.io/component-base/metrics"
@@ -353,7 +355,7 @@ func createNodeStatusAllocatableFamilyGenerator() generator.FamilyGenerator {
353355
SanitizeLabelName(string(resourceName)),
354356
string(constant.UnitByte),
355357
},
356-
Value: float64(val.MilliValue()) / 1000,
358+
Value: convertFloat64(&val),
357359
})
358360
}
359361
if isAttachableVolumeResourceName(resourceName) {
@@ -362,7 +364,7 @@ func createNodeStatusAllocatableFamilyGenerator() generator.FamilyGenerator {
362364
SanitizeLabelName(string(resourceName)),
363365
string(constant.UnitByte),
364366
},
365-
Value: float64(val.MilliValue()) / 1000,
367+
Value: convertFloat64(&val),
366368
})
367369
}
368370
if isExtendedResourceName(resourceName) {
@@ -371,7 +373,7 @@ func createNodeStatusAllocatableFamilyGenerator() generator.FamilyGenerator {
371373
SanitizeLabelName(string(resourceName)),
372374
string(constant.UnitInteger),
373375
},
374-
Value: float64(val.MilliValue()) / 1000,
376+
Value: convertFloat64(&val),
375377
})
376378
}
377379
}
@@ -407,7 +409,7 @@ func createNodeStatusCapacityFamilyGenerator() generator.FamilyGenerator {
407409
SanitizeLabelName(string(resourceName)),
408410
string(constant.UnitCore),
409411
},
410-
Value: float64(val.MilliValue()) / 1000,
412+
Value: convertFloat64(&val),
411413
})
412414
case v1.ResourceStorage:
413415
fallthrough
@@ -419,15 +421,15 @@ func createNodeStatusCapacityFamilyGenerator() generator.FamilyGenerator {
419421
SanitizeLabelName(string(resourceName)),
420422
string(constant.UnitByte),
421423
},
422-
Value: float64(val.MilliValue()) / 1000,
424+
Value: convertFloat64(&val),
423425
})
424426
case v1.ResourcePods:
425427
ms = append(ms, &metric.Metric{
426428
LabelValues: []string{
427429
SanitizeLabelName(string(resourceName)),
428430
string(constant.UnitInteger),
429431
},
430-
Value: float64(val.MilliValue()) / 1000,
432+
Value: convertFloat64(&val),
431433
})
432434
default:
433435
if isHugePageResourceName(resourceName) {
@@ -436,7 +438,7 @@ func createNodeStatusCapacityFamilyGenerator() generator.FamilyGenerator {
436438
SanitizeLabelName(string(resourceName)),
437439
string(constant.UnitByte),
438440
},
439-
Value: float64(val.MilliValue()) / 1000,
441+
Value: convertFloat64(&val),
440442
})
441443
}
442444
if isAttachableVolumeResourceName(resourceName) {
@@ -445,7 +447,7 @@ func createNodeStatusCapacityFamilyGenerator() generator.FamilyGenerator {
445447
SanitizeLabelName(string(resourceName)),
446448
string(constant.UnitByte),
447449
},
448-
Value: float64(val.MilliValue()) / 1000,
450+
Value: convertFloat64(&val),
449451
})
450452
}
451453
if isExtendedResourceName(resourceName) {
@@ -454,7 +456,7 @@ func createNodeStatusCapacityFamilyGenerator() generator.FamilyGenerator {
454456
SanitizeLabelName(string(resourceName)),
455457
string(constant.UnitInteger),
456458
},
457-
Value: float64(val.MilliValue()) / 1000,
459+
Value: convertFloat64(&val),
458460
})
459461
}
460462
}
@@ -530,3 +532,12 @@ func createNodeListWatch(kubeClient clientset.Interface, _ string, _ string) cac
530532
},
531533
}
532534
}
535+
536+
const maxValue = math.MaxInt64 / 1000
537+
538+
func convertFloat64(q *resource.Quantity) float64 {
539+
if q.Value() > maxValue {
540+
return float64(q.Value())
541+
}
542+
return float64(q.MilliValue()) / 1000
543+
}

internal/store/node_test.go

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,94 @@ func TestNodeStore(t *testing.T) {
298298
`,
299299
MetricNames: []string{"kube_node_status_addresses"},
300300
},
301+
// memory overflow test
302+
{
303+
Obj: &v1.Node{
304+
ObjectMeta: metav1.ObjectMeta{
305+
Name: "127.0.0.1",
306+
CreationTimestamp: metav1.Time{Time: time.Unix(1500000000, 0)},
307+
Labels: map[string]string{
308+
"node-role.kubernetes.io/master": "",
309+
},
310+
},
311+
Spec: v1.NodeSpec{
312+
Unschedulable: true,
313+
ProviderID: "provider://i-randomidentifier",
314+
PodCIDR: "172.24.10.0/24",
315+
},
316+
Status: v1.NodeStatus{
317+
NodeInfo: v1.NodeSystemInfo{
318+
KernelVersion: "kernel",
319+
KubeletVersion: "kubelet",
320+
KubeProxyVersion: "kubeproxy",
321+
OSImage: "osimage",
322+
ContainerRuntimeVersion: "rkt",
323+
SystemUUID: "6a934e21-5207-4a84-baea-3a952d926c80",
324+
},
325+
Addresses: []v1.NodeAddress{
326+
{Type: "InternalIP", Address: "1.2.3.4"},
327+
},
328+
Capacity: v1.ResourceList{
329+
v1.ResourceCPU: resource.MustParse("4.3"),
330+
// overflow test
331+
v1.ResourceMemory: resource.MustParse("10000T"),
332+
v1.ResourcePods: resource.MustParse("1000"),
333+
v1.ResourceStorage: resource.MustParse("3G"),
334+
v1.ResourceEphemeralStorage: resource.MustParse("4G"),
335+
v1.ResourceName("nvidia.com/gpu"): resource.MustParse("4"),
336+
},
337+
Allocatable: v1.ResourceList{
338+
v1.ResourceCPU: resource.MustParse("3"),
339+
v1.ResourceMemory: resource.MustParse("1G"),
340+
v1.ResourcePods: resource.MustParse("555"),
341+
v1.ResourceStorage: resource.MustParse("2G"),
342+
v1.ResourceEphemeralStorage: resource.MustParse("3G"),
343+
v1.ResourceName("nvidia.com/gpu"): resource.MustParse("1"),
344+
},
345+
},
346+
},
347+
Want: `
348+
# HELP kube_node_created [STABLE] Unix creation timestamp
349+
# HELP kube_node_info [STABLE] Information about a cluster node.
350+
# HELP kube_node_labels [STABLE] Kubernetes labels converted to Prometheus labels.
351+
# HELP kube_node_role The role of a cluster node.
352+
# HELP kube_node_spec_unschedulable [STABLE] Whether a node can schedule new pods.
353+
# HELP kube_node_status_allocatable [STABLE] The allocatable for different resources of a node that are available for scheduling.
354+
# HELP kube_node_status_capacity [STABLE] The capacity for different resources of a node.
355+
# TYPE kube_node_created gauge
356+
# TYPE kube_node_info gauge
357+
# TYPE kube_node_labels gauge
358+
# TYPE kube_node_role gauge
359+
# TYPE kube_node_spec_unschedulable gauge
360+
# TYPE kube_node_status_allocatable gauge
361+
# TYPE kube_node_status_capacity gauge
362+
kube_node_created{node="127.0.0.1"} 1.5e+09
363+
kube_node_info{container_runtime_version="rkt",kernel_version="kernel",kubelet_version="kubelet",kubeproxy_version="deprecated",node="127.0.0.1",os_image="osimage",pod_cidr="172.24.10.0/24",provider_id="provider://i-randomidentifier",internal_ip="1.2.3.4",system_uuid="6a934e21-5207-4a84-baea-3a952d926c80"} 1
364+
kube_node_role{node="127.0.0.1",role="master"} 1
365+
kube_node_spec_unschedulable{node="127.0.0.1"} 1
366+
kube_node_status_allocatable{node="127.0.0.1",resource="cpu",unit="core"} 3
367+
kube_node_status_allocatable{node="127.0.0.1",resource="ephemeral_storage",unit="byte"} 3e+09
368+
kube_node_status_allocatable{node="127.0.0.1",resource="memory",unit="byte"} 1e+09
369+
kube_node_status_allocatable{node="127.0.0.1",resource="nvidia_com_gpu",unit="integer"} 1
370+
kube_node_status_allocatable{node="127.0.0.1",resource="pods",unit="integer"} 555
371+
kube_node_status_allocatable{node="127.0.0.1",resource="storage",unit="byte"} 2e+09
372+
kube_node_status_capacity{node="127.0.0.1",resource="cpu",unit="core"} 4.3
373+
kube_node_status_capacity{node="127.0.0.1",resource="ephemeral_storage",unit="byte"} 4e+09
374+
kube_node_status_capacity{node="127.0.0.1",resource="memory",unit="byte"} 1e+16
375+
kube_node_status_capacity{node="127.0.0.1",resource="nvidia_com_gpu",unit="integer"} 4
376+
kube_node_status_capacity{node="127.0.0.1",resource="pods",unit="integer"} 1000
377+
kube_node_status_capacity{node="127.0.0.1",resource="storage",unit="byte"} 3e+09
378+
`,
379+
MetricNames: []string{
380+
"kube_node_status_capacity",
381+
"kube_node_status_allocatable",
382+
"kube_node_spec_unschedulable",
383+
"kube_node_labels",
384+
"kube_node_role",
385+
"kube_node_info",
386+
"kube_node_created",
387+
},
388+
},
301389
}
302390
for i, c := range cases {
303391
c.Func = generator.ComposeMetricGenFuncs(nodeMetricFamilies(nil, nil))

0 commit comments

Comments
 (0)