Skip to content

Commit ee0d311

Browse files
Export agent connection env vars to library init containers for telemetry
Swap mutator ordering so the APM mutator runs before the config webhook. This ensures library init containers already exist when the config webhook injects agent connection env vars (DD_AGENT_HOST, DD_TRACE_AGENT_URL, socket volumes). Removes the old timestamp file mechanism (c-init-time.*) and manual DD_AGENT_HOST injection in favor of the existing config mutator. Restores DD_INJECT_START_TIME. Replaces OnLibraryInjection callback with direct logging in InjectAPMLibraries.
1 parent 19fea94 commit ee0d311

File tree

5 files changed

+30
-32
lines changed

5 files changed

+30
-32
lines changed

pkg/clusteragent/admission/mutate/autoinstrumentation/auto_instrumentation.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,15 @@ func NewAutoInstrumentation(datadogConfig config.Component, wmeta workloadmeta.C
4040

4141
// For auto instrumentation, we need all the mutators to be applied for SSI to function. Specifically, we need
4242
// things like the Datadog socket to be mounted from the config webhook and the DD_ENV, DD_SERVICE, and DD_VERSION
43-
// env vars to be set from labels if they are available..
43+
// env vars to be set from labels if they are available.
44+
//
45+
// The APM mutator runs before the config webhook so that init containers created by library injection
46+
// already exist when the config webhook injects agent connection env vars (DD_AGENT_HOST, DD_TRACE_AGENT_URL,
47+
// socket volumes, etc.). This lets copy-lib.sh send telemetry to the trace agent without manual env var injection.
4448
mutator := mutatecommon.NewMutators(
4549
tagsfromlabels.NewMutator(tagsfromlabels.NewMutatorConfig(datadogConfig), apm),
46-
configWebhook.NewMutator(configWebhook.NewMutatorConfig(datadogConfig), apm),
4750
apm,
51+
configWebhook.NewMutator(configWebhook.NewMutatorConfig(datadogConfig), apm),
4852
)
4953
labelSelectors := NewLabelSelectors(NewLabelSelectorsConfig(datadogConfig))
5054
return NewWebhook(config.Webhook, mutator, labelSelectors)

pkg/clusteragent/admission/mutate/autoinstrumentation/libraryinjection/init_container.go

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -69,23 +69,19 @@ func (p *InitContainerProvider) InjectInjector(pod *corev1.Pod, cfg InjectorConf
6969
ReadOnly: true,
7070
})
7171

72-
// Timestamp file path for tracking init container completion
73-
tsFilePath := injectorMount.MountPath + "/c-init-time." + InjectorInitContainerName
74-
7572
// Init container that copies injector files
7673
initContainer := corev1.Container{
7774
Name: InjectorInitContainerName,
7875
Image: cfg.Package.FullRef(),
7976
Command: []string{"/bin/sh", "-c", "--"},
8077
Args: []string{
8178
fmt.Sprintf(
82-
`cp -r /%s/* %s && echo %s > %s/%s && echo $(date +%%s) >> %s`,
79+
`cp -r /%s/* %s && echo %s > %s/%s`,
8380
injectorMount.SubPath,
8481
injectorMount.MountPath,
8582
asAbsPath(injectorFilePath("launcher.preload.so")),
8683
etcMountPath,
8784
ldSoPreloadFileName,
88-
tsFilePath,
8985
),
9086
},
9187
VolumeMounts: []corev1.VolumeMount{
@@ -125,34 +121,19 @@ func (p *InitContainerProvider) InjectLibrary(pod *corev1.Pod, cfg LibraryConfig
125121
SubPath: libraryPackagesDir + "/" + cfg.Language,
126122
}
127123

128-
// Volume mount for injector (to write timestamp)
129-
injectorMount := corev1.VolumeMount{
130-
Name: InstrumentationVolumeName,
131-
MountPath: asAbsPath(injectPackageDir),
132-
SubPath: injectPackageDir,
133-
}
134-
135124
// Init container name
136125
containerName := fmt.Sprintf(LibraryInitContainerNameTemplate, cfg.Language)
137126

138-
// Timestamp file path
139-
tsFilePath := injectorMount.MountPath + "/c-init-time." + containerName
140-
141127
// Init container that copies library files
142128
initContainer := corev1.Container{
143129
Name: containerName,
144130
Image: cfg.Package.FullRef(),
145131
Command: []string{"/bin/sh", "-c", "--"},
146132
Args: []string{
147-
fmt.Sprintf(
148-
`sh copy-lib.sh %s && echo $(date +%%s) >> %s`,
149-
initContainerMount.MountPath,
150-
tsFilePath,
151-
),
133+
"sh copy-lib.sh " + initContainerMount.MountPath,
152134
},
153135
VolumeMounts: []corev1.VolumeMount{
154136
initContainerMount,
155-
injectorMount,
156137
},
157138
Resources: cfg.Context.ResourceRequirements,
158139
}

pkg/clusteragent/admission/mutate/autoinstrumentation/libraryinjection/init_container_test.go

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ func TestInjectInjector(t *testing.T) {
4949

5050
// Check volume mounts were added to app container
5151
require.Len(t, pod.Spec.Containers[0].VolumeMounts, 2)
52+
53+
// Check injector command does not contain timestamp writing
54+
assert.NotContains(t, pod.Spec.InitContainers[0].Args[0], "c-init-time")
5255
}
5356

5457
func TestInjectLibrary(t *testing.T) {
@@ -71,8 +74,20 @@ func TestInjectLibrary(t *testing.T) {
7174

7275
// Check init container was added
7376
require.Len(t, pod.Spec.InitContainers, 1)
74-
assert.Equal(t, "datadog-lib-java-init", pod.Spec.InitContainers[0].Name)
75-
assert.Equal(t, "gcr.io/datadoghq/dd-lib-java-init:latest", pod.Spec.InitContainers[0].Image)
77+
initContainer := pod.Spec.InitContainers[0]
78+
assert.Equal(t, "datadog-lib-java-init", initContainer.Name)
79+
assert.Equal(t, "gcr.io/datadoghq/dd-lib-java-init:latest", initContainer.Image)
80+
81+
// Check only the library volume mount is present (no injector mount)
82+
require.Len(t, initContainer.VolumeMounts, 1)
83+
assert.Equal(t, libraryinjection.InstrumentationVolumeName, initContainer.VolumeMounts[0].Name)
84+
85+
// Check no env vars are set directly (agent connection vars come from config mutator)
86+
assert.Empty(t, initContainer.Env)
87+
88+
// Check command does not contain timestamp writing
89+
assert.NotContains(t, initContainer.Args[0], "date")
90+
assert.NotContains(t, initContainer.Args[0], "c-init-time")
7691
}
7792

7893
func TestInjectInjector_SkipsWhenInsufficientResources(t *testing.T) {

pkg/clusteragent/admission/mutate/autoinstrumentation/libraryinjection/mutator.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ func InjectAPMLibraries(pod *corev1.Pod, cfg LibraryInjectionConfig) error {
7272

7373
metrics.LibInjectionAttempts.Inc(lib.Language, strconv.FormatBool(injected), strconv.FormatBool(cfg.AutoDetected), cfg.InjectionType)
7474

75+
log.Infof("APM library injection: pod=%s language=%s status=%s type=%s",
76+
mutatecommon.PodString(pod), lib.Language, libResult.Status, cfg.InjectionType)
77+
7578
if libResult.Status == MutationStatusInjected && lib.Package.CanonicalVersion != "" {
7679
annotation.Set(pod, annotation.LibraryCanonicalVersion.Format(lib.Language), lib.Package.CanonicalVersion)
7780
}

pkg/ssi/testutils/pod_init_container.go

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ func (v *initContainerInjectionValidator) RequireInjection(t *testing.T) {
9999
},
100100
}
101101
validator.RequireVolumeMounts(t, expectedVolumeMounts)
102-
validator.RequireCommand(t, "/bin/sh -c -- cp -r /opt/datadog-packages/datadog-apm-inject/* /datadog-inject && echo /opt/datadog-packages/datadog-apm-inject/stable/inject/launcher.preload.so > /datadog-etc/ld.so.preload && echo $(date +%s) >> /datadog-inject/c-init-time.datadog-init-apm-inject")
102+
validator.RequireCommand(t, "/bin/sh -c -- cp -r /opt/datadog-packages/datadog-apm-inject/* /datadog-inject && echo /opt/datadog-packages/datadog-apm-inject/stable/inject/launcher.preload.so > /datadog-etc/ld.so.preload")
103103

104104
// Validate library init containers.
105105
for lang := range v.libraryVersions {
@@ -111,14 +111,9 @@ func (v *initContainerInjectionValidator) RequireInjection(t *testing.T) {
111111
MountPath: "/datadog-lib",
112112
SubPath: "opt/datadog/apm/library/" + lang,
113113
},
114-
{
115-
Name: "datadog-auto-instrumentation",
116-
MountPath: "/opt/datadog-packages/datadog-apm-inject",
117-
SubPath: "opt/datadog-packages/datadog-apm-inject",
118-
},
119114
}
120115
validator.RequireVolumeMounts(t, expectedVolumeMounts)
121-
validator.RequireCommand(t, "/bin/sh -c -- sh copy-lib.sh /datadog-lib && echo $(date +%s) >> /opt/datadog-packages/datadog-apm-inject/c-init-time.datadog-lib-"+lang+"-init")
116+
validator.RequireCommand(t, "/bin/sh -c -- sh copy-lib.sh /datadog-lib")
122117
}
123118
}
124119

0 commit comments

Comments
 (0)