in internal/store/node.go [243:324]
func createNodeStatusAllocatableFamilyGenerator() generator.FamilyGenerator {
return *generator.NewFamilyGenerator(
"kube_node_status_allocatable",
"The allocatable for different resources of a node that are available for scheduling.",
metric.Gauge,
"",
wrapNodeFunc(func(n *v1.Node) *metric.Family {
ms := []*metric.Metric{}
allocatable := n.Status.Allocatable
for resourceName, val := range allocatable {
switch resourceName {
case v1.ResourceCPU:
ms = append(ms, &metric.Metric{
LabelValues: []string{
sanitizeLabelName(string(resourceName)),
string(constant.UnitCore),
},
Value: float64(val.MilliValue()) / 1000,
})
case v1.ResourceStorage:
fallthrough
case v1.ResourceEphemeralStorage:
fallthrough
case v1.ResourceMemory:
ms = append(ms, &metric.Metric{
LabelValues: []string{
sanitizeLabelName(string(resourceName)),
string(constant.UnitByte),
},
Value: float64(val.MilliValue()) / 1000,
})
case v1.ResourcePods:
ms = append(ms, &metric.Metric{
LabelValues: []string{
sanitizeLabelName(string(resourceName)),
string(constant.UnitInteger),
},
Value: float64(val.MilliValue()) / 1000,
})
default:
if isHugePageResourceName(resourceName) {
ms = append(ms, &metric.Metric{
LabelValues: []string{
sanitizeLabelName(string(resourceName)),
string(constant.UnitByte),
},
Value: float64(val.MilliValue()) / 1000,
})
}
if isAttachableVolumeResourceName(resourceName) {
ms = append(ms, &metric.Metric{
LabelValues: []string{
sanitizeLabelName(string(resourceName)),
string(constant.UnitByte),
},
Value: float64(val.MilliValue()) / 1000,
})
}
if isExtendedResourceName(resourceName) {
ms = append(ms, &metric.Metric{
LabelValues: []string{
sanitizeLabelName(string(resourceName)),
string(constant.UnitInteger),
},
Value: float64(val.MilliValue()) / 1000,
})
}
}
}
for _, m := range ms {
m.LabelKeys = []string{"resource", "unit"}
}
return &metric.Family{
Metrics: ms,
}
}),
)
}