From 9d48e2a8f7b138e4ebfe692d61722acca2791e45 Mon Sep 17 00:00:00 2001 From: mackjmr Date: Tue, 7 Jan 2025 14:16:38 +0100 Subject: [PATCH] Add DD_AGENT_IPC_* env vars This PR adds DD_AGENT_IPC_PORT and DD_AGENT_IPC_CONFIG_REFRESH_INTERVAL env vars in otel agent and core agent. It does not override them if they are added by the user. THis is necessary for the otel-agent to pull the api key from core config in the case where backend secrets are used. --- api/datadoghq/v2alpha1/envvar.go | 3 + .../feature/otelcollector/feature.go | 20 ++++++ .../feature/otelcollector/feature_test.go | 61 ++++++++++++++++++- 3 files changed, 83 insertions(+), 1 deletion(-) diff --git a/api/datadoghq/v2alpha1/envvar.go b/api/datadoghq/v2alpha1/envvar.go index dee11f317..b783fcaaa 100644 --- a/api/datadoghq/v2alpha1/envvar.go +++ b/api/datadoghq/v2alpha1/envvar.go @@ -62,6 +62,9 @@ const ( DDSystemProbeExternal = "DD_SYSTEM_PROBE_EXTERNAL" DDSystemProbeSocket = "DD_SYSPROBE_SOCKET" DDTags = "DD_TAGS" + DDAgentIpcPort = "DD_AGENT_IPC_PORT" + DDAgentIpcConfigRefreshInterval = "DD_AGENT_IPC_CONFIG_REFRESH_INTERVAL" + // otelcollector core agent configs DDOtelCollectorCoreConfigEnabled = "DD_OTELCOLLECTOR_ENABLED" DDOtelCollectorCoreConfigExtensionURL = "DD_OTELCOLLECTOR_EXTENSION_URL" diff --git a/internal/controller/datadogagent/feature/otelcollector/feature.go b/internal/controller/datadogagent/feature/otelcollector/feature.go index 69083073d..b6781bc95 100644 --- a/internal/controller/datadogagent/feature/otelcollector/feature.go +++ b/internal/controller/datadogagent/feature/otelcollector/feature.go @@ -172,6 +172,25 @@ func (o otelCollectorFeature) ManageNodeAgent(managers feature.PodTemplateManage managers.Port().AddPortToContainer(apicommon.OtelAgent, port) } + // (todo: mackjmr): remove this once IPC port is enabled by default. Enabling this port is required to fetch the API key from + // core agent when secrets backend is used. + agentIpcPortEnvVar := &corev1.EnvVar{ + Name: v2alpha1.DDAgentIpcPort, + Value: "5009", + } + agentIpcConfigRefreshIntervalEnvVar := &corev1.EnvVar{ + Name: v2alpha1.DDAgentIpcConfigRefreshInterval, + Value: "60", + } + // don't set env var if it was already set by user. + mergeFunc := func(current, newEnv *corev1.EnvVar) (*corev1.EnvVar, error) { + return current, nil + } + for _, container := range []apicommon.AgentContainerName{apicommon.CoreAgentContainerName, apicommon.OtelAgent} { + managers.EnvVar().AddEnvVarToContainerWithMergeFunc(container, agentIpcPortEnvVar, mergeFunc) + managers.EnvVar().AddEnvVarToContainerWithMergeFunc(container, agentIpcConfigRefreshIntervalEnvVar, mergeFunc) + } + var enableEnvVar *corev1.EnvVar if o.coreAgentConfig.enabled != nil { if *o.coreAgentConfig.enabled { @@ -201,6 +220,7 @@ func (o otelCollectorFeature) ManageNodeAgent(managers feature.PodTemplateManage Value: *o.coreAgentConfig.extension_url, }) } + return nil } diff --git a/internal/controller/datadogagent/feature/otelcollector/feature_test.go b/internal/controller/datadogagent/feature/otelcollector/feature_test.go index 5f8c39d62..b2e15d581 100644 --- a/internal/controller/datadogagent/feature/otelcollector/feature_test.go +++ b/internal/controller/datadogagent/feature/otelcollector/feature_test.go @@ -26,6 +26,8 @@ type expectedPorts struct { } type expectedEnvVars struct { + agent_ipc_port expectedEnvVar + agent_ipc_refresh expectedEnvVar enabled expectedEnvVar extension_timeout expectedEnvVar extension_url expectedEnvVar @@ -43,6 +45,14 @@ var ( } defaultLocalObjectReferenceName = "-otel-agent-config" defaultExpectedEnvVars = expectedEnvVars{ + agent_ipc_port: expectedEnvVar{ + present: true, + value: "5009", + }, + agent_ipc_refresh: expectedEnvVar{ + present: true, + value: "60", + }, enabled: expectedEnvVar{ present: true, value: "true", @@ -50,6 +60,17 @@ var ( extension_timeout: expectedEnvVar{}, extension_url: expectedEnvVar{}, } + + onlyIpcEnvVars = expectedEnvVars{ + agent_ipc_port: expectedEnvVar{ + present: true, + value: "5009", + }, + agent_ipc_refresh: expectedEnvVar{ + present: true, + value: "60", + }, + } ) func Test_otelCollectorFeature_Configure(t *testing.T) { @@ -135,7 +156,7 @@ func Test_otelCollectorFeature_Configure(t *testing.T) { Build(), WantConfigure: true, WantDependenciesFunc: testExpectedDepsCreatedCM, - Agent: testExpectedAgent(apicommon.OtelAgent, defaultExpectedPorts, defaultLocalObjectReferenceName, expectedEnvVars{}), + Agent: testExpectedAgent(apicommon.OtelAgent, defaultExpectedPorts, defaultLocalObjectReferenceName, onlyIpcEnvVars), }, { Name: "otel agent coreconfig extensionTimeout", @@ -147,6 +168,14 @@ func Test_otelCollectorFeature_Configure(t *testing.T) { WantConfigure: true, WantDependenciesFunc: testExpectedDepsCreatedCM, Agent: testExpectedAgent(apicommon.OtelAgent, defaultExpectedPorts, defaultLocalObjectReferenceName, expectedEnvVars{ + agent_ipc_port: expectedEnvVar{ + present: true, + value: "5009", + }, + agent_ipc_refresh: expectedEnvVar{ + present: true, + value: "60", + }, extension_timeout: expectedEnvVar{ present: true, value: "13", @@ -163,6 +192,14 @@ func Test_otelCollectorFeature_Configure(t *testing.T) { WantConfigure: true, WantDependenciesFunc: testExpectedDepsCreatedCM, Agent: testExpectedAgent(apicommon.OtelAgent, defaultExpectedPorts, defaultLocalObjectReferenceName, expectedEnvVars{ + agent_ipc_port: expectedEnvVar{ + present: true, + value: "5009", + }, + agent_ipc_refresh: expectedEnvVar{ + present: true, + value: "60", + }, extension_url: expectedEnvVar{ present: true, value: "https://localhost:1234", @@ -180,6 +217,14 @@ func Test_otelCollectorFeature_Configure(t *testing.T) { WantConfigure: true, WantDependenciesFunc: testExpectedDepsCreatedCM, Agent: testExpectedAgent(apicommon.OtelAgent, defaultExpectedPorts, defaultLocalObjectReferenceName, expectedEnvVars{ + agent_ipc_port: expectedEnvVar{ + present: true, + value: "5009", + }, + agent_ipc_refresh: expectedEnvVar{ + present: true, + value: "60", + }, extension_url: expectedEnvVar{ present: true, value: "https://localhost:1234", @@ -254,6 +299,20 @@ func testExpectedAgent(agentContainerName apicommon.AgentContainerName, expected // check env vars wantEnvVars := []*corev1.EnvVar{} + if expectedEnvVars.agent_ipc_port.present { + wantEnvVars = append(wantEnvVars, &corev1.EnvVar{ + Name: v2alpha1.DDAgentIpcPort, + Value: expectedEnvVars.agent_ipc_port.value, + }) + } + + if expectedEnvVars.agent_ipc_refresh.present { + wantEnvVars = append(wantEnvVars, &corev1.EnvVar{ + Name: v2alpha1.DDAgentIpcConfigRefreshInterval, + Value: expectedEnvVars.agent_ipc_refresh.value, + }) + } + if expectedEnvVars.enabled.present { wantEnvVars = append(wantEnvVars, &corev1.EnvVar{ Name: v2alpha1.DDOtelCollectorCoreConfigEnabled,