Skip to content

Commit 6bb45bf

Browse files
Add Node.js support for --import flag
1 parent b563a6e commit 6bb45bf

19 files changed

+551
-5
lines changed

apis/v1alpha1/instrumentation_types.go

+5
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,11 @@ type NodeJS struct {
217217
// Resources describes the compute resource requirements.
218218
// +optional
219219
Resources corev1.ResourceRequirements `json:"resourceRequirements,omitempty"`
220+
221+
// UseImport overrides the default injected --require flag with an --import flag that supports ESM.
222+
// Requires Node.js 18 or later.
223+
// +optional
224+
UseImport bool `json:"useImport,omitempty"`
220225
}
221226

222227
// Python defines Python SDK and instrumentation configuration.

autoinstrumentation/nodejs/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
"@opentelemetry/exporter-metrics-otlp-grpc": "0.54.0",
2020
"@opentelemetry/exporter-prometheus": "0.54.0",
2121
"@opentelemetry/exporter-trace-otlp-grpc": "0.54.0",
22+
"@opentelemetry/instrumentation": "0.54.0",
2223
"@opentelemetry/resource-detector-alibaba-cloud": "0.29.4",
2324
"@opentelemetry/resource-detector-aws": "1.7.0",
2425
"@opentelemetry/resource-detector-container": "0.5.0",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import "./autoinstrumentation.js";
2+
3+
import { register } from "node:module";
4+
register("@opentelemetry/instrumentation/hooks.mjs");

autoinstrumentation/nodejs/tsconfig.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"forceConsistentCasingInFileNames": true,
1212
"incremental": true,
1313
"inlineSources": true,
14-
"module": "commonjs",
14+
"module": "node16",
1515
"newLine": "LF",
1616
"noEmitOnError": true,
1717
"noFallthroughCasesInSwitch": true,

bundle/community/manifests/opentelemetry-operator.clusterserviceversion.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ metadata:
9999
categories: Logging & Tracing,Monitoring
100100
certified: "false"
101101
containerImage: ghcr.io/open-telemetry/opentelemetry-operator/opentelemetry-operator
102-
createdAt: "2024-10-30T17:23:26Z"
102+
createdAt: "2024-11-01T17:13:20Z"
103103
description: Provides the OpenTelemetry components, including the Collector
104104
operators.operatorframework.io/builder: operator-sdk-v1.29.0
105105
operators.operatorframework.io/project_layout: go.kubebuilder.io/v3

bundle/community/manifests/opentelemetry.io_instrumentations.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -1496,6 +1496,8 @@ spec:
14961496
x-kubernetes-int-or-string: true
14971497
type: object
14981498
type: object
1499+
useImport:
1500+
type: boolean
14991501
volumeClaimTemplate:
15001502
properties:
15011503
metadata:

bundle/openshift/manifests/opentelemetry-operator.clusterserviceversion.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ metadata:
9999
categories: Logging & Tracing,Monitoring
100100
certified: "false"
101101
containerImage: ghcr.io/open-telemetry/opentelemetry-operator/opentelemetry-operator
102-
createdAt: "2024-10-30T17:23:26Z"
102+
createdAt: "2024-11-01T17:13:28Z"
103103
description: Provides the OpenTelemetry components, including the Collector
104104
operators.operatorframework.io/builder: operator-sdk-v1.29.0
105105
operators.operatorframework.io/project_layout: go.kubebuilder.io/v3

bundle/openshift/manifests/opentelemetry.io_instrumentations.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -1496,6 +1496,8 @@ spec:
14961496
x-kubernetes-int-or-string: true
14971497
type: object
14981498
type: object
1499+
useImport:
1500+
type: boolean
14991501
volumeClaimTemplate:
15001502
properties:
15011503
metadata:

config/crd/bases/opentelemetry.io_instrumentations.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -1494,6 +1494,8 @@ spec:
14941494
x-kubernetes-int-or-string: true
14951495
type: object
14961496
type: object
1497+
useImport:
1498+
type: boolean
14971499
volumeClaimTemplate:
14981500
properties:
14991501
metadata:

config/manager/kustomization.yaml

+12
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,14 @@
11
resources:
22
- manager.yaml
3+
apiVersion: kustomize.config.k8s.io/v1beta1
4+
kind: Kustomization
5+
images:
6+
- name: controller
7+
newName: ghcr.io/open-telemetry/opentelemetry-operator/opentelemetry-operator
8+
patches:
9+
- patch: '[{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"--target-allocator-image=ghcr.io/open-telemetry/opentelemetry-operator/target-allocator:"}]'
10+
target:
11+
kind: Deployment
12+
- patch: '[{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"--operator-opamp-bridge-image=ghcr.io/open-telemetry/opentelemetry-operator/operator-opamp-bridge:"}]'
13+
target:
14+
kind: Deployment

docs/api.md

+8
Original file line numberDiff line numberDiff line change
@@ -5666,6 +5666,14 @@ If the former var had been defined, then the other vars would be ignored.<br/>
56665666
Resources describes the compute resource requirements.<br/>
56675667
</td>
56685668
<td>false</td>
5669+
</tr><tr>
5670+
<td><b>useImport</b></td>
5671+
<td>boolean</td>
5672+
<td>
5673+
UseImport overrides the default injected --require flag with an --import flag that supports ESM.
5674+
Requires Node.js 18 or later.<br/>
5675+
</td>
5676+
<td>false</td>
56695677
</tr><tr>
56705678
<td><b><a href="#instrumentationspecnodejsvolumeclaimtemplate">volumeClaimTemplate</a></b></td>
56715679
<td>object</td>

pkg/instrumentation/nodejs.go

+9-2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
const (
2424
envNodeOptions = "NODE_OPTIONS"
2525
nodeRequireArgument = " --require /otel-auto-instrumentation-nodejs/autoinstrumentation.js"
26+
nodeImportArgument = " --import /otel-auto-instrumentation-nodejs/autoinstrumentation.mjs"
2627
nodejsInitContainerName = initContainerName + "-nodejs"
2728
nodejsVolumeName = volumeName + "-nodejs"
2829
nodejsInstrMountPath = "/otel-auto-instrumentation-nodejs"
@@ -47,14 +48,20 @@ func injectNodeJSSDK(nodeJSSpec v1alpha1.NodeJS, pod corev1.Pod, index int) (cor
4748
}
4849
}
4950

51+
var nodeArgument string
52+
if nodeJSSpec.UseImport {
53+
nodeArgument = nodeImportArgument
54+
} else {
55+
nodeArgument = nodeRequireArgument
56+
}
5057
idx := getIndexOfEnv(container.Env, envNodeOptions)
5158
if idx == -1 {
5259
container.Env = append(container.Env, corev1.EnvVar{
5360
Name: envNodeOptions,
54-
Value: nodeRequireArgument,
61+
Value: nodeArgument,
5562
})
5663
} else if idx > -1 {
57-
container.Env[idx].Value = container.Env[idx].Value + nodeRequireArgument
64+
container.Env[idx].Value = container.Env[idx].Value + nodeArgument
5865
}
5966

6067
container.VolumeMounts = append(container.VolumeMounts, corev1.VolumeMount{

pkg/instrumentation/nodejs_test.go

+114
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,120 @@ func TestInjectNodeJSSDK(t *testing.T) {
179179
},
180180
err: fmt.Errorf("the container defines env var value via ValueFrom, envVar: %s", envNodeOptions),
181181
},
182+
{
183+
name: "NODE_OPTIONS not defined and UseImport true",
184+
NodeJS: v1alpha1.NodeJS{Image: "foo/bar:1", UseImport: true},
185+
pod: corev1.Pod{
186+
Spec: corev1.PodSpec{
187+
Containers: []corev1.Container{
188+
{},
189+
},
190+
},
191+
},
192+
expected: corev1.Pod{
193+
Spec: corev1.PodSpec{
194+
Volumes: []corev1.Volume{
195+
{
196+
Name: "opentelemetry-auto-instrumentation-nodejs",
197+
VolumeSource: corev1.VolumeSource{
198+
EmptyDir: &corev1.EmptyDirVolumeSource{
199+
SizeLimit: &defaultVolumeLimitSize,
200+
},
201+
},
202+
},
203+
},
204+
InitContainers: []corev1.Container{
205+
{
206+
Name: "opentelemetry-auto-instrumentation-nodejs",
207+
Image: "foo/bar:1",
208+
Command: []string{"cp", "-r", "/autoinstrumentation/.", "/otel-auto-instrumentation-nodejs"},
209+
VolumeMounts: []corev1.VolumeMount{{
210+
Name: "opentelemetry-auto-instrumentation-nodejs",
211+
MountPath: "/otel-auto-instrumentation-nodejs",
212+
}},
213+
},
214+
},
215+
Containers: []corev1.Container{
216+
{
217+
VolumeMounts: []corev1.VolumeMount{
218+
{
219+
Name: "opentelemetry-auto-instrumentation-nodejs",
220+
MountPath: "/otel-auto-instrumentation-nodejs",
221+
},
222+
},
223+
Env: []corev1.EnvVar{
224+
{
225+
Name: "NODE_OPTIONS",
226+
Value: " --import /otel-auto-instrumentation-nodejs/autoinstrumentation.mjs",
227+
},
228+
},
229+
},
230+
},
231+
},
232+
},
233+
err: nil,
234+
},
235+
{
236+
name: "NODE_OPTIONS defined and UseImport true",
237+
NodeJS: v1alpha1.NodeJS{Image: "foo/bar:1", Resources: testResourceRequirements, UseImport: true},
238+
pod: corev1.Pod{
239+
Spec: corev1.PodSpec{
240+
Containers: []corev1.Container{
241+
{
242+
Env: []corev1.EnvVar{
243+
{
244+
Name: "NODE_OPTIONS",
245+
Value: "-Dbaz=bar",
246+
},
247+
},
248+
},
249+
},
250+
},
251+
},
252+
expected: corev1.Pod{
253+
Spec: corev1.PodSpec{
254+
Volumes: []corev1.Volume{
255+
{
256+
Name: "opentelemetry-auto-instrumentation-nodejs",
257+
VolumeSource: corev1.VolumeSource{
258+
EmptyDir: &corev1.EmptyDirVolumeSource{
259+
SizeLimit: &defaultVolumeLimitSize,
260+
},
261+
},
262+
},
263+
},
264+
InitContainers: []corev1.Container{
265+
{
266+
Name: "opentelemetry-auto-instrumentation-nodejs",
267+
Image: "foo/bar:1",
268+
Command: []string{"cp", "-r", "/autoinstrumentation/.", "/otel-auto-instrumentation-nodejs"},
269+
VolumeMounts: []corev1.VolumeMount{{
270+
Name: "opentelemetry-auto-instrumentation-nodejs",
271+
MountPath: "/otel-auto-instrumentation-nodejs",
272+
}},
273+
Resources: testResourceRequirements,
274+
},
275+
},
276+
Containers: []corev1.Container{
277+
{
278+
VolumeMounts: []corev1.VolumeMount{
279+
{
280+
Name: "opentelemetry-auto-instrumentation-nodejs",
281+
MountPath: "/otel-auto-instrumentation-nodejs",
282+
},
283+
},
284+
Env: []corev1.EnvVar{
285+
{
286+
Name: "NODE_OPTIONS",
287+
Value: "-Dbaz=bar" + " --import /otel-auto-instrumentation-nodejs/autoinstrumentation.mjs",
288+
},
289+
},
290+
},
291+
},
292+
},
293+
},
294+
err: nil,
295+
},
182296
}
183297

184298
for _, test := range tests {

0 commit comments

Comments
 (0)