in pkg/instrumentation/sdk.go [245:368]
func (i *sdkInjector) injectCommonSDKConfig(ctx context.Context, otelinst v1alpha1.Instrumentation, ns corev1.Namespace, pod corev1.Pod, agentIndex int, appIndex int) corev1.Pod {
container := &pod.Spec.Containers[agentIndex]
resourceMap, existingRes := i.createResourceMap(ctx, otelinst, ns, pod, appIndex)
idx := getIndexOfEnv(container.Env, constants.EnvOTELServiceName)
serviceNameSource := constants.SourceInstrumentation
if idx == -1 {
container.Env = append(container.Env, corev1.EnvVar{
Name: constants.EnvOTELServiceName,
Value: chooseServiceName(pod, resourceMap, appIndex),
})
serviceNameSource = constants.SourceK8sWorkload
}
if otelinst.Spec.Exporter.Endpoint != "" {
idx = getIndexOfEnv(container.Env, constants.EnvOTELExporterOTLPEndpoint)
if idx == -1 {
container.Env = append(container.Env, corev1.EnvVar{
Name: constants.EnvOTELExporterOTLPEndpoint,
Value: otelinst.Spec.Endpoint,
})
}
}
// Some attributes might be empty, we should get them via k8s downward API
if !existingRes[string(semconv.K8SPodNameKey)] && resourceMap[string(semconv.K8SPodNameKey)] == "" {
container.Env = append(container.Env, corev1.EnvVar{
Name: constants.EnvPodName,
ValueFrom: &corev1.EnvVarSource{
FieldRef: &corev1.ObjectFieldSelector{
FieldPath: "metadata.name",
},
},
})
resourceMap[string(semconv.K8SPodNameKey)] = fmt.Sprintf("$(%s)", constants.EnvPodName)
}
if otelinst.Spec.Resource.AddK8sUIDAttributes {
if resourceMap[string(semconv.K8SPodUIDKey)] == "" {
container.Env = append(container.Env, corev1.EnvVar{
Name: constants.EnvPodUID,
ValueFrom: &corev1.EnvVarSource{
FieldRef: &corev1.ObjectFieldSelector{
FieldPath: "metadata.uid",
},
},
})
resourceMap[string(semconv.K8SPodUIDKey)] = fmt.Sprintf("$(%s)", constants.EnvPodUID)
}
}
idx = getIndexOfEnv(container.Env, constants.EnvOTELResourceAttrs)
if idx == -1 || !strings.Contains(container.Env[idx].Value, string(semconv.ServiceVersionKey)) {
vsn := chooseServiceVersion(pod, appIndex)
if vsn != "" {
resourceMap[string(semconv.ServiceVersionKey)] = vsn
}
}
if !existingRes[string(semconv.K8SNodeNameKey)] && resourceMap[string(semconv.K8SNodeNameKey)] == "" {
container.Env = append(container.Env, corev1.EnvVar{
Name: constants.EnvNodeName,
ValueFrom: &corev1.EnvVarSource{
FieldRef: &corev1.ObjectFieldSelector{
FieldPath: "spec.nodeName",
},
},
})
resourceMap[string(semconv.K8SNodeNameKey)] = fmt.Sprintf("$(%s)", constants.EnvNodeName)
}
if !existingRes[constants.ServiceNameSource] && resourceMap[constants.ServiceNameSource] == "" {
resourceMap[constants.ServiceNameSource] = serviceNameSource
}
idx = getIndexOfEnv(container.Env, constants.EnvOTELResourceAttrs)
resStr := resourceMapToStr(resourceMap)
if idx == -1 {
container.Env = append(container.Env, corev1.EnvVar{
Name: constants.EnvOTELResourceAttrs,
Value: resStr,
})
} else {
if !strings.HasSuffix(container.Env[idx].Value, ",") && resStr != "" {
resStr = "," + resStr
}
container.Env[idx].Value += resStr
}
idx = getIndexOfEnv(container.Env, constants.EnvOTELPropagators)
if idx == -1 && len(otelinst.Spec.Propagators) > 0 {
propagators := *(*[]string)((unsafe.Pointer(&otelinst.Spec.Propagators)))
container.Env = append(container.Env, corev1.EnvVar{
Name: constants.EnvOTELPropagators,
Value: strings.Join(propagators, ","),
})
}
idx = getIndexOfEnv(container.Env, constants.EnvOTELTracesSampler)
// configure sampler only if it is configured in the CR
if idx == -1 && otelinst.Spec.Sampler.Type != "" {
idxSamplerArg := getIndexOfEnv(container.Env, constants.EnvOTELTracesSamplerArg)
if idxSamplerArg == -1 {
container.Env = append(container.Env, corev1.EnvVar{
Name: constants.EnvOTELTracesSampler,
Value: string(otelinst.Spec.Sampler.Type),
})
if otelinst.Spec.Sampler.Argument != "" {
container.Env = append(container.Env, corev1.EnvVar{
Name: constants.EnvOTELTracesSamplerArg,
Value: otelinst.Spec.Sampler.Argument,
})
}
}
}
// Move OTEL_RESOURCE_ATTRIBUTES to last position on env list.
// When OTEL_RESOURCE_ATTRIBUTES environment variable uses other env vars
// as attributes value they have to be configured before.
// It is mandatory to set right order to avoid attributes with value
// pointing to the name of used environment variable instead of its value.
idx = getIndexOfEnv(container.Env, constants.EnvOTELResourceAttrs)
envs := moveEnvToListEnd(container.Env, idx)
container.Env = envs
return pod
}