func()

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
}