in pkg/instrumentation/sdk.go [458:512]
func (i *sdkInjector) addParentResourceLabels(ctx context.Context, uid bool, ns corev1.Namespace, objectMeta metav1.ObjectMeta, resources map[attribute.Key]string) {
for _, owner := range objectMeta.OwnerReferences {
switch strings.ToLower(owner.Kind) {
case "replicaset":
resources[semconv.K8SReplicaSetNameKey] = owner.Name
if uid {
resources[semconv.K8SReplicaSetUIDKey] = string(owner.UID)
}
// parent of ReplicaSet is e.g. Deployment which we are interested to know
rs := appsv1.ReplicaSet{}
nsn := types.NamespacedName{Namespace: ns.Name, Name: owner.Name}
backOff := wait.Backoff{Duration: 10 * time.Millisecond, Factor: 1.5, Jitter: 0.1, Steps: 20, Cap: 2 * time.Second}
checkError := func(err error) bool {
return apierrors.IsNotFound(err)
}
getReplicaSet := func() error {
return i.client.Get(ctx, nsn, &rs)
}
// use a retry loop to get the Deployment. A single call to client.get fails occasionally
err := retry.OnError(backOff, checkError, getReplicaSet)
if err != nil {
i.logger.Error(err, "failed to get replicaset", "replicaset", nsn.Name, "namespace", nsn.Namespace)
}
i.addParentResourceLabels(ctx, uid, ns, rs.ObjectMeta, resources)
case "deployment":
resources[semconv.K8SDeploymentNameKey] = owner.Name
if uid {
resources[semconv.K8SDeploymentUIDKey] = string(owner.UID)
}
case "statefulset":
resources[semconv.K8SStatefulSetNameKey] = owner.Name
if uid {
resources[semconv.K8SStatefulSetUIDKey] = string(owner.UID)
}
case "daemonset":
resources[semconv.K8SDaemonSetNameKey] = owner.Name
if uid {
resources[semconv.K8SDaemonSetUIDKey] = string(owner.UID)
}
case "job":
resources[semconv.K8SJobNameKey] = owner.Name
if uid {
resources[semconv.K8SJobUIDKey] = string(owner.UID)
}
case "cronjob":
resources[semconv.K8SCronJobNameKey] = owner.Name
if uid {
resources[semconv.K8SCronJobUIDKey] = string(owner.UID)
}
}
}
}