func createNodeStatusAllocatableFamilyGenerator()

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,
			}
		}),
	)
}