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