Skip to content

Commit 6727627

Browse files
committed
Support extensions
1 parent 97b7192 commit 6727627

9 files changed

+197
-11
lines changed

apis/v1alpha1/instrumentation_types.go

+12
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,18 @@ type Java struct {
133133
// Resources describes the compute resource requirements.
134134
// +optional
135135
Resources corev1.ResourceRequirements `json:"resources,omitempty"`
136+
137+
// Extensions defines java specific extensions.
138+
// +optional
139+
Extensions *Extensions `json:"extensions,omitempty"`
140+
}
141+
142+
type Extensions struct {
143+
// Image is a container image with extensions auto-instrumentation JAR.
144+
Image string `json:"image"`
145+
146+
// Dir is a directory with extensions auto-instrumentation JAR.
147+
Dir string `json:"dir"`
136148
}
137149

138150
// NodeJS defines NodeJS SDK and instrumentation configuration.

apis/v1alpha1/zz_generated.deepcopy.go

+20
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bundle/manifests/opentelemetry.io_instrumentations.yaml

+15
Original file line numberDiff line numberDiff line change
@@ -919,6 +919,21 @@ spec:
919919
- name
920920
type: object
921921
type: array
922+
extensions:
923+
description: Extensions defines java specific extensions.
924+
properties:
925+
dir:
926+
description: Dir is a directory with extensions auto-instrumentation
927+
JAR.
928+
type: string
929+
image:
930+
description: Image is a container image with extensions auto-instrumentation
931+
JAR.
932+
type: string
933+
required:
934+
- dir
935+
- image
936+
type: object
922937
image:
923938
description: Image is a container image with javaagent auto-instrumentation
924939
JAR.

config/crd/bases/opentelemetry.io_instrumentations.yaml

+15
Original file line numberDiff line numberDiff line change
@@ -917,6 +917,21 @@ spec:
917917
- name
918918
type: object
919919
type: array
920+
extensions:
921+
description: Extensions defines java specific extensions.
922+
properties:
923+
dir:
924+
description: Dir is a directory with extensions auto-instrumentation
925+
JAR.
926+
type: string
927+
image:
928+
description: Image is a container image with extensions auto-instrumentation
929+
JAR.
930+
type: string
931+
required:
932+
- dir
933+
- image
934+
type: object
920935
image:
921936
description: Image is a container image with javaagent auto-instrumentation
922937
JAR.

docs/api.md

+41
Original file line numberDiff line numberDiff line change
@@ -1906,6 +1906,13 @@ Java defines configuration for java auto-instrumentation.
19061906
Env defines java specific env vars.<br/>
19071907
</td>
19081908
<td>false</td>
1909+
</tr><tr>
1910+
<td><b><a href="#instrumentationspecjavaextensions">extensions</a></b></td>
1911+
<td>object</td>
1912+
<td>
1913+
Extensions defines java specific extensions.<br/>
1914+
</td>
1915+
<td>false</td>
19091916
</tr><tr>
19101917
<td><b>image</b></td>
19111918
<td>string</td>
@@ -2188,6 +2195,40 @@ TODO: Add other useful fields. apiVersion, kind, uid?<br/>
21882195
</table>
21892196

21902197

2198+
### Instrumentation.spec.java.extensions
2199+
<sup><sup>[↩ Parent](#instrumentationspecjava)</sup></sup>
2200+
2201+
2202+
2203+
Extensions defines java specific extensions.
2204+
2205+
<table>
2206+
<thead>
2207+
<tr>
2208+
<th>Name</th>
2209+
<th>Type</th>
2210+
<th>Description</th>
2211+
<th>Required</th>
2212+
</tr>
2213+
</thead>
2214+
<tbody><tr>
2215+
<td><b>dir</b></td>
2216+
<td>string</td>
2217+
<td>
2218+
Dir is a directory with extensions auto-instrumentation JAR.<br/>
2219+
</td>
2220+
<td>true</td>
2221+
</tr><tr>
2222+
<td><b>image</b></td>
2223+
<td>string</td>
2224+
<td>
2225+
Image is a container image with extensions auto-instrumentation JAR.<br/>
2226+
</td>
2227+
<td>true</td>
2228+
</tr></tbody>
2229+
</table>
2230+
2231+
21912232
### Instrumentation.spec.java.resources
21922233
<sup><sup>[↩ Parent](#instrumentationspecjava)</sup></sup>
21932234

pkg/instrumentation/javaagent.go

+22-1
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,16 @@
1515
package instrumentation
1616

1717
import (
18+
"fmt"
19+
1820
corev1 "k8s.io/api/core/v1"
1921

2022
"github.com/open-telemetry/opentelemetry-operator/apis/v1alpha1"
2123
)
2224

2325
const (
2426
envJavaToolsOptions = "JAVA_TOOL_OPTIONS"
25-
javaJVMArgument = " -javaagent:/otel-auto-instrumentation-java/javaagent.jar"
27+
javaAgent = " -javaagent:/otel-auto-instrumentation-java/javaagent.jar"
2628
javaInitContainerName = initContainerName + "-java"
2729
javaVolumeName = volumeName + "-java"
2830
javaInstrMountPath = "/otel-auto-instrumentation-java"
@@ -45,6 +47,11 @@ func injectJavaagent(javaSpec v1alpha1.Java, pod corev1.Pod, index int) (corev1.
4547
}
4648
}
4749

50+
javaJVMArgument := javaAgent
51+
if javaSpec.Extensions != nil {
52+
javaJVMArgument = javaAgent + fmt.Sprintf(" -Dotel.javaagent.extensions=%s/extensions", javaInstrMountPath)
53+
}
54+
4855
idx := getIndexOfEnv(container.Env, envJavaToolsOptions)
4956
if idx == -1 {
5057
container.Env = append(container.Env, corev1.EnvVar{
@@ -80,6 +87,20 @@ func injectJavaagent(javaSpec v1alpha1.Java, pod corev1.Pod, index int) (corev1.
8087
MountPath: javaInstrMountPath,
8188
}},
8289
})
90+
91+
if javaSpec.Extensions != nil {
92+
pod.Spec.InitContainers = append(pod.Spec.InitContainers, corev1.Container{
93+
Name: initContainerName + "-extensions",
94+
Image: javaSpec.Extensions.Image,
95+
Command: []string{"cp", "-r", javaSpec.Extensions.Dir, javaInstrMountPath + "/extensions"},
96+
Resources: javaSpec.Resources,
97+
VolumeMounts: []corev1.VolumeMount{{
98+
Name: javaVolumeName,
99+
MountPath: javaInstrMountPath,
100+
}},
101+
})
102+
}
103+
83104
}
84105
return pod, err
85106
}

pkg/instrumentation/javaagent_test.go

+64-2
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,69 @@ func TestInjectJavaagent(t *testing.T) {
7676
Env: []corev1.EnvVar{
7777
{
7878
Name: "JAVA_TOOL_OPTIONS",
79-
Value: javaJVMArgument,
79+
Value: javaAgent,
80+
},
81+
},
82+
},
83+
},
84+
},
85+
},
86+
err: nil,
87+
},
88+
{
89+
name: "add extensions to JAVA_TOOL_OPTIONS",
90+
Java: v1alpha1.Java{Image: "foo/bar:1", Extensions: &v1alpha1.Extensions{Image: "ex/ex:1", Dir: "/ex"}},
91+
pod: corev1.Pod{
92+
Spec: corev1.PodSpec{
93+
Containers: []corev1.Container{
94+
{},
95+
},
96+
},
97+
},
98+
expected: corev1.Pod{
99+
Spec: corev1.PodSpec{
100+
Volumes: []corev1.Volume{
101+
{
102+
Name: "opentelemetry-auto-instrumentation-java",
103+
VolumeSource: corev1.VolumeSource{
104+
EmptyDir: &corev1.EmptyDirVolumeSource{
105+
SizeLimit: &defaultVolumeLimitSize,
106+
},
107+
},
108+
},
109+
},
110+
InitContainers: []corev1.Container{
111+
{
112+
Name: "opentelemetry-auto-instrumentation-java",
113+
Image: "foo/bar:1",
114+
Command: []string{"cp", "/javaagent.jar", "/otel-auto-instrumentation-java/javaagent.jar"},
115+
VolumeMounts: []corev1.VolumeMount{{
116+
Name: "opentelemetry-auto-instrumentation-java",
117+
MountPath: "/otel-auto-instrumentation-java",
118+
}},
119+
},
120+
{
121+
Name: "opentelemetry-auto-instrumentation-extensions",
122+
Image: "ex/ex:1",
123+
Command: []string{"cp", "-r", "/ex", "/otel-auto-instrumentation-java/extensions"},
124+
VolumeMounts: []corev1.VolumeMount{{
125+
Name: "opentelemetry-auto-instrumentation-java",
126+
MountPath: "/otel-auto-instrumentation-java",
127+
}},
128+
},
129+
},
130+
Containers: []corev1.Container{
131+
{
132+
VolumeMounts: []corev1.VolumeMount{
133+
{
134+
Name: "opentelemetry-auto-instrumentation-java",
135+
MountPath: "/otel-auto-instrumentation-java",
136+
},
137+
},
138+
Env: []corev1.EnvVar{
139+
{
140+
Name: "JAVA_TOOL_OPTIONS",
141+
Value: javaAgent + " -Dotel.javaagent.extensions=/otel-auto-instrumentation-java/extensions",
80142
},
81143
},
82144
},
@@ -137,7 +199,7 @@ func TestInjectJavaagent(t *testing.T) {
137199
Env: []corev1.EnvVar{
138200
{
139201
Name: "JAVA_TOOL_OPTIONS",
140-
Value: "-Dbaz=bar" + javaJVMArgument,
202+
Value: "-Dbaz=bar" + javaAgent,
141203
},
142204
},
143205
},

pkg/instrumentation/podmutator_test.go

+7-7
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ func TestMutatePod(t *testing.T) {
168168
},
169169
{
170170
Name: "JAVA_TOOL_OPTIONS",
171-
Value: javaJVMArgument,
171+
Value: javaAgent,
172172
},
173173
{
174174
Name: "OTEL_TRACES_EXPORTER",
@@ -356,7 +356,7 @@ func TestMutatePod(t *testing.T) {
356356
},
357357
{
358358
Name: "JAVA_TOOL_OPTIONS",
359-
Value: javaJVMArgument,
359+
Value: javaAgent,
360360
},
361361
{
362362
Name: "OTEL_TRACES_EXPORTER",
@@ -431,7 +431,7 @@ func TestMutatePod(t *testing.T) {
431431
},
432432
{
433433
Name: "JAVA_TOOL_OPTIONS",
434-
Value: javaJVMArgument,
434+
Value: javaAgent,
435435
},
436436
{
437437
Name: "OTEL_TRACES_EXPORTER",
@@ -3534,7 +3534,7 @@ func TestMutatePod(t *testing.T) {
35343534
},
35353535
{
35363536
Name: "JAVA_TOOL_OPTIONS",
3537-
Value: javaJVMArgument,
3537+
Value: javaAgent,
35383538
},
35393539
{
35403540
Name: "OTEL_SERVICE_NAME",
@@ -3581,7 +3581,7 @@ func TestMutatePod(t *testing.T) {
35813581
},
35823582
{
35833583
Name: "JAVA_TOOL_OPTIONS",
3584-
Value: javaJVMArgument,
3584+
Value: javaAgent,
35853585
},
35863586
{
35873587
Name: "OTEL_SERVICE_NAME",
@@ -4189,7 +4189,7 @@ func TestMutatePod(t *testing.T) {
41894189
},
41904190
{
41914191
Name: "JAVA_TOOL_OPTIONS",
4192-
Value: javaJVMArgument,
4192+
Value: javaAgent,
41934193
},
41944194
{
41954195
Name: "OTEL_SERVICE_NAME",
@@ -4236,7 +4236,7 @@ func TestMutatePod(t *testing.T) {
42364236
},
42374237
{
42384238
Name: "JAVA_TOOL_OPTIONS",
4239-
Value: javaJVMArgument,
4239+
Value: javaAgent,
42404240
},
42414241
{
42424242
Name: "OTEL_SERVICE_NAME",

pkg/instrumentation/sdk_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -557,7 +557,7 @@ func TestInjectJava(t *testing.T) {
557557
Env: []corev1.EnvVar{
558558
{
559559
Name: "JAVA_TOOL_OPTIONS",
560-
Value: javaJVMArgument,
560+
Value: javaAgent,
561561
},
562562
{
563563
Name: "OTEL_SERVICE_NAME",

0 commit comments

Comments
 (0)