func()

in internal/deployers/eksapi/k8s.go [217:278]


func (k *k8sClient) emitNodeMetrics(metricRegistry metrics.MetricRegistry, ec2Client *ec2.Client) error {
	nodes, err := k.getReadyNodes()
	if err != nil {
		return err
	}
	var errs []error
	for _, node := range nodes {
		providerId, err := parseKubernetesProviderID(node.Spec.ProviderID)
		if err != nil {
			errs = append(errs, err)
			continue
		}
		instanceInfo, err := ec2Client.DescribeInstances(context.TODO(), &ec2.DescribeInstancesInput{
			InstanceIds: []string{providerId.InstanceID},
		})
		if err != nil {
			errs = append(errs, err)
			continue
		}
		instance := instanceInfo.Reservations[0].Instances[0]
		launchTime := *instance.LaunchTime
		timeToRegistration := node.ObjectMeta.CreationTimestamp.Time.Sub(launchTime)
		timeToReady := getNodeReadyCondition(&node).LastTransitionTime.Time.Sub(launchTime)

		nodeDimensions := map[string]string{
			"instanceType": string(instance.InstanceType),
			"os":           node.Status.NodeInfo.OperatingSystem,
			"osImage":      node.Status.NodeInfo.OSImage,
			"arch":         node.Status.NodeInfo.Architecture,
		}

		// we'll emit the metrics with different subset(s) of dimensions, to make aggregation simpler
		var nodeDimensionSets []map[string]string
		nodeDimensionSets = append(nodeDimensionSets, nodeDimensions)

		var osDistro string
		if strings.HasPrefix(node.Status.NodeInfo.OSImage, "Amazon Linux") {
			// on al2: "Amazon Linux 2"
			// on al2023: "Amazon Linux 2023.6.20241010"
			parts := strings.Split(node.Status.NodeInfo.OSImage, ".")
			amazonLinuxMajorVersion := parts[0]
			osDistro = amazonLinuxMajorVersion
		}

		if osDistro != "" {
			nodeDimensions["osDistro"] = osDistro

			// if we have an osDistro, add a pared-down dimension set that includes it
			nodeDimensionSets = append(nodeDimensionSets, map[string]string{
				"osDistro":     nodeDimensions["osDistro"],
				"instanceType": nodeDimensions["instanceType"],
				"arch":         nodeDimensions["arch"],
			})
		}

		for _, nodeDimensionSet := range nodeDimensionSets {
			metricRegistry.Record(nodeTimeToRegistrationSeconds, timeToRegistration.Seconds(), nodeDimensionSet)
			metricRegistry.Record(nodeTimeToReadySeconds, timeToReady.Seconds(), nodeDimensionSet)
		}
	}
	return errors.Join(errs...)
}