pkg/instrumentation/javaagent.go (67 lines of code) (raw):

// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 package instrumentation import ( corev1 "k8s.io/api/core/v1" "github.com/aws/amazon-cloudwatch-agent-operator/apis/v1alpha1" ) const ( envJavaToolsOptions = "JAVA_TOOL_OPTIONS" javaJVMArgument = " -javaagent:/otel-auto-instrumentation-java/javaagent.jar" javaInitContainerName = initContainerName + "-java" javaVolumeName = volumeName + "-java" javaInstrMountPath = "/otel-auto-instrumentation-java" javaInstrMountPathWindows = "\\otel-auto-instrumentation-java" ) var ( javaCommandLinux = []string{"cp", "/javaagent.jar", javaInstrMountPath + "/javaagent.jar"} javaCommandWindows = []string{"CMD", "/c", "copy", "javaagent.jar", javaInstrMountPathWindows} ) func injectJavaagent(javaSpec v1alpha1.Java, pod corev1.Pod, index int) (corev1.Pod, error) { // caller checks if there is at least one container. container := &pod.Spec.Containers[index] err := validateContainerEnv(container.Env, envJavaToolsOptions) if err != nil { return pod, err } // inject Java instrumentation spec env vars. for _, env := range javaSpec.Env { idx := getIndexOfEnv(container.Env, env.Name) if idx == -1 { container.Env = append(container.Env, env) } } idx := getIndexOfEnv(container.Env, envJavaToolsOptions) if idx == -1 { container.Env = append(container.Env, corev1.EnvVar{ Name: envJavaToolsOptions, Value: javaJVMArgument, }) } else { container.Env[idx].Value = container.Env[idx].Value + javaJVMArgument } container.VolumeMounts = append(container.VolumeMounts, corev1.VolumeMount{ Name: javaVolumeName, MountPath: javaInstrMountPath, }) // We just inject Volumes and init containers for the first processed container. if isInitContainerMissing(pod, javaInitContainerName) { pod.Spec.Volumes = append(pod.Spec.Volumes, corev1.Volume{ Name: javaVolumeName, VolumeSource: corev1.VolumeSource{ EmptyDir: &corev1.EmptyDirVolumeSource{ SizeLimit: volumeSize(javaSpec.VolumeSizeLimit), }, }}) command := javaCommandLinux if isWindowsPod(pod) { command = javaCommandWindows } pod.Spec.InitContainers = append(pod.Spec.InitContainers, corev1.Container{ Name: javaInitContainerName, Image: javaSpec.Image, Command: command, Resources: javaSpec.Resources, VolumeMounts: []corev1.VolumeMount{{ Name: javaVolumeName, MountPath: javaInstrMountPath, }}, }) } return pod, err }