in pkg/instrumentation/sdk.go [43:202]
func (i *sdkInjector) inject(ctx context.Context, insts languageInstrumentations, ns corev1.Namespace, pod corev1.Pod) corev1.Pod {
if len(pod.Spec.Containers) < 1 {
return pod
}
if insts.Java.Instrumentation != nil {
otelinst := *insts.Java.Instrumentation
var err error
i.logger.V(1).Info("injecting Java instrumentation into pod", "otelinst-namespace", otelinst.Namespace, "otelinst-name", otelinst.Name)
javaContainers := insts.Java.Containers
for _, container := range strings.Split(javaContainers, ",") {
index := getContainerIndex(container, pod)
pod, err = injectJavaagent(otelinst.Spec.Java, pod, index)
if err != nil {
i.logger.Info("Skipping javaagent injection", "reason", err.Error(), "container", pod.Spec.Containers[index].Name)
} else {
pod = i.injectCommonEnvVar(otelinst, pod, index)
pod = i.injectCommonSDKConfig(ctx, otelinst, ns, pod, index, index)
//disable setting security context in init container due to issue with runAsNonRoot conflict
//https://github.com/open-telemetry/opentelemetry-operator/issues/2272
//pod = i.setInitContainerSecurityContext(pod, pod.Spec.Containers[index].SecurityContext, javaInitContainerName)
}
}
}
if insts.NodeJS.Instrumentation != nil {
otelinst := *insts.NodeJS.Instrumentation
var err error
i.logger.V(1).Info("injecting NodeJS instrumentation into pod", "otelinst-namespace", otelinst.Namespace, "otelinst-name", otelinst.Name)
nodejsContainers := insts.NodeJS.Containers
for _, container := range strings.Split(nodejsContainers, ",") {
index := getContainerIndex(container, pod)
pod, err = injectNodeJSSDK(otelinst.Spec.NodeJS, pod, index)
if err != nil {
i.logger.Info("Skipping NodeJS SDK injection", "reason", err.Error(), "container", pod.Spec.Containers[index].Name)
} else {
pod = i.injectCommonEnvVar(otelinst, pod, index)
pod = i.injectCommonSDKConfig(ctx, otelinst, ns, pod, index, index)
pod = i.setInitContainerSecurityContext(pod, pod.Spec.Containers[index].SecurityContext, nodejsInitContainerName)
}
}
}
if insts.Python.Instrumentation != nil {
otelinst := *insts.Python.Instrumentation
var err error
i.logger.V(1).Info("injecting Python instrumentation into pod", "otelinst-namespace", otelinst.Namespace, "otelinst-name", otelinst.Name)
pythonContainers := insts.Python.Containers
for _, container := range strings.Split(pythonContainers, ",") {
index := getContainerIndex(container, pod)
pod, err = injectPythonSDK(otelinst.Spec.Python, pod, index)
if err != nil {
i.logger.Info("Skipping Python SDK injection", "reason", err.Error(), "container", pod.Spec.Containers[index].Name)
} else {
pod = i.injectCommonEnvVar(otelinst, pod, index)
pod = i.injectCommonSDKConfig(ctx, otelinst, ns, pod, index, index)
pod = i.setInitContainerSecurityContext(pod, pod.Spec.Containers[index].SecurityContext, pythonInitContainerName)
}
}
}
if insts.DotNet.Instrumentation != nil {
otelinst := *insts.DotNet.Instrumentation
var err error
i.logger.V(1).Info("injecting DotNet instrumentation into pod", "otelinst-namespace", otelinst.Namespace, "otelinst-name", otelinst.Name)
dotnetContainers := insts.DotNet.Containers
for _, container := range strings.Split(dotnetContainers, ",") {
index := getContainerIndex(container, pod)
pod, err = injectDotNetSDK(otelinst.Spec.DotNet, pod, index, insts.DotNet.AdditionalAnnotations[annotationDotNetRuntime])
if err != nil {
i.logger.Info("Skipping DotNet SDK injection", "reason", err.Error(), "container", pod.Spec.Containers[index].Name)
} else {
pod = i.injectCommonEnvVar(otelinst, pod, index)
pod = i.injectCommonSDKConfig(ctx, otelinst, ns, pod, index, index)
pod = i.setInitContainerSecurityContext(pod, pod.Spec.Containers[index].SecurityContext, dotnetInitContainerName)
}
}
}
if insts.Go.Instrumentation != nil {
origPod := pod
otelinst := *insts.Go.Instrumentation
var err error
i.logger.V(1).Info("injecting Go instrumentation into pod", "otelinst-namespace", otelinst.Namespace, "otelinst-name", otelinst.Name)
goContainers := insts.Go.Containers
// Go instrumentation supports only single container instrumentation.
index := getContainerIndex(goContainers, pod)
pod, err = injectGoSDK(otelinst.Spec.Go, pod)
if err != nil {
i.logger.Info("Skipping Go SDK injection", "reason", err.Error(), "container", pod.Spec.Containers[index].Name)
} else {
// Common env vars and config need to be applied to the agent contain.
pod = i.injectCommonEnvVar(otelinst, pod, len(pod.Spec.Containers)-1)
pod = i.injectCommonSDKConfig(ctx, otelinst, ns, pod, len(pod.Spec.Containers)-1, 0)
// Ensure that after all the env var coalescing we have a value for OTEL_GO_AUTO_TARGET_EXE
idx := getIndexOfEnv(pod.Spec.Containers[len(pod.Spec.Containers)-1].Env, envOtelTargetExe)
if idx == -1 {
i.logger.Info("Skipping Go SDK injection", "reason", "OTEL_GO_AUTO_TARGET_EXE not set", "container", pod.Spec.Containers[index].Name)
pod = origPod
}
}
}
if insts.ApacheHttpd.Instrumentation != nil {
otelinst := *insts.ApacheHttpd.Instrumentation
i.logger.V(1).Info("injecting Apache Httpd instrumentation into pod", "otelinst-namespace", otelinst.Namespace, "otelinst-name", otelinst.Name)
apacheHttpdContainers := insts.ApacheHttpd.Containers
for _, container := range strings.Split(apacheHttpdContainers, ",") {
index := getContainerIndex(container, pod)
// Apache agent is configured via config files rather than env vars.
// Therefore, service name, otlp endpoint and other attributes are passed to the agent injection method
resMap, _ := i.createResourceMap(ctx, otelinst, ns, pod, index)
pod = injectApacheHttpdagent(i.logger, otelinst.Spec.ApacheHttpd, pod, index, otelinst.Spec.Endpoint, resMap)
pod = i.injectCommonEnvVar(otelinst, pod, index)
pod = i.injectCommonSDKConfig(ctx, otelinst, ns, pod, index, index)
pod = i.setInitContainerSecurityContext(pod, pod.Spec.Containers[index].SecurityContext, apacheAgentInitContainerName)
pod = i.setInitContainerSecurityContext(pod, pod.Spec.Containers[index].SecurityContext, apacheAgentCloneContainerName)
}
}
if insts.Nginx.Instrumentation != nil {
otelinst := *insts.Nginx.Instrumentation
i.logger.V(1).Info("injecting Nginx instrumentation into pod", "otelinst-namespace", otelinst.Namespace, "otelinst-name", otelinst.Name)
nginxContainers := insts.Nginx.Containers
for _, container := range strings.Split(nginxContainers, ",") {
index := getContainerIndex(container, pod)
// Nginx agent is configured via config files rather than env vars.
// Therefore, service name, otlp endpoint and other attributes are passed to the agent injection method
resMap, _ := i.createResourceMap(ctx, otelinst, ns, pod, index)
pod = injectNginxSDK(i.logger, otelinst.Spec.Nginx, pod, index, otelinst.Spec.Endpoint, resMap)
pod = i.injectCommonEnvVar(otelinst, pod, index)
pod = i.injectCommonSDKConfig(ctx, otelinst, ns, pod, index, index)
}
}
if insts.Sdk.Instrumentation != nil {
otelinst := *insts.Sdk.Instrumentation
i.logger.V(1).Info("injecting sdk-only instrumentation into pod", "otelinst-namespace", otelinst.Namespace, "otelinst-name", otelinst.Name)
sdkContainers := insts.Sdk.Containers
for _, container := range strings.Split(sdkContainers, ",") {
index := getContainerIndex(container, pod)
pod = i.injectCommonEnvVar(otelinst, pod, index)
pod = i.injectCommonSDKConfig(ctx, otelinst, ns, pod, index, index)
}
}
return pod
}