Repository: DataDog/datadog-agent
Pull request #36745: [EBPF] docker: use WithX options pattern in testutil
Author: login: gjulianm
Labels: name: changelog/no-changelog
description: No changelog entry needed
name: component/system-probe
name: qa/done
description: QA done before merge and regressions are covered by tests
name: medium review
description: PR review might take time
name: ask-review
description: Ask required teams to review this PR
Created: 2025-05-07T12:29:05Z | Merged: 2025-05-13T09:34:56Z

<!--
* Contributors are encouraged to read our [CONTRIBUTING](/CONTRIBUTING.md) documentation.
* Both Contributor and Reviewer Checklists are available at https://datadoghq.dev/datadog-agent/guidelines/contributing/#pull-requests.
* The pull request:
  * Should only fix one issue or add one feature at a time.
  * Must update the test suite for the relevant functionality.
  * Should pass all status checks before being reviewed or merged.
* Commit titles should be prefixed with general area of pull request's change.
* Please fill the below sections if possible with relevant information or links.
-->
### What does this PR do?

This PR changes the way we pass options to the `NewRunConfig` and `NewComposeConfig` functions of the docker testutils, and adds two new arguments, `WithNetworkMode` and `WithPIDMode` 

### Motivation

Allow us to add more options to the config without having a constructor with a lot of arguments that need to be refactored each time.

### Describe how you validated your changes
<!--
Validate your changes before merge, ensuring that:
* Your PR is tested by static / unit / integrations / e2e tests
* Your PR description details which e2e tests cover your changes, if any
* The PR description contains details of how you validated your changes. If you validated changes manually and not through automated tests, add context on why automated tests did not fit your changes validation.

If you want additional validation by a second person, you can ask reviewers to do it. Describe how to set up an environment for manual tests in the PR description. Manual validation is expected to happen on every commit before merge.

Any manual validation step should then map to an automated test. Manual validation should not substitute automation, minus exceptions not supported by test tooling yet.
-->

Unit tests should still pass.

### Possible Drawbacks / Trade-offs

### Additional Notes
<!--
* Anything else we should know when reviewing?
* Include benchmarking information here whenever possible.
* Include info about alternatives that were considered and why the proposed
  version was chosen.
-->


Diff:
diff --git a/pkg/collector/corechecks/servicediscovery/module/impl_linux_test.go b/pkg/collector/corechecks/servicediscovery/module/impl_linux_test.go
index 54c03a659952..eaf7eb316d2b 100644
--- a/pkg/collector/corechecks/servicediscovery/module/impl_linux_test.go
+++ b/pkg/collector/corechecks/servicediscovery/module/impl_linux_test.go
@@ -925,11 +925,12 @@ func TestDocker(t *testing.T) {
 	dir, _ := testutil.CurDir()
 	scanner, err := globalutils.NewScanner(regexp.MustCompile("Serving.*"), globalutils.NoPattern)
 	require.NoError(t, err, "failed to create pattern scanner")
-	dockerCfg := dockerutils.NewComposeConfig("foo-server",
-		dockerutils.DefaultTimeout,
-		dockerutils.DefaultRetries,
-		scanner,
-		dockerutils.EmptyEnv,
+
+	dockerCfg := dockerutils.NewComposeConfig(
+		dockerutils.NewBaseConfig(
+			"foo-server",
+			scanner,
+		),
 		filepath.Join(dir, "testdata", "docker-compose.yml"))
 	err = dockerutils.Run(t, dockerCfg)
 	require.NoError(t, err)
diff --git a/pkg/gpu/testutil/samplebins.go b/pkg/gpu/testutil/samplebins.go
index d6bf97b2ad28..b99266cbc101 100644
--- a/pkg/gpu/testutil/samplebins.go
+++ b/pkg/gpu/testutil/samplebins.go
@@ -166,15 +166,16 @@ func RunSampleInDockerWithArgs(t *testing.T, name sampleName, image dockerImage,
 	scanner, err := procutil.NewScanner(startedPattern, finishedPattern)
 	require.NoError(t, err, "failed to create pattern scanner")
 
-	dockerConfig := dockerutils.NewRunConfig(containerName,
-		dockerutils.DefaultTimeout,
-		dockerutils.DefaultRetries,
-		scanner,
-		args.getEnv(),
+	dockerConfig := dockerutils.NewRunConfig(
+		dockerutils.NewBaseConfig(
+			containerName,
+			scanner,
+			dockerutils.WithEnv(args.getEnv()),
+		),
 		string(image),
 		builtBin,
-		args.getCLIArgs(),
-		map[string]string{builtBin: builtBin})
+		dockerutils.WithBinaryArgs(args.getCLIArgs()),
+		dockerutils.WithMounts(map[string]string{builtBin: builtBin}))
 
 	require.NoError(t, dockerutils.Run(t, dockerConfig))
 
diff --git a/pkg/network/protocols/amqp/server.go b/pkg/network/protocols/amqp/server.go
index 31a2fd628631..7f397eb5d9be 100644
--- a/pkg/network/protocols/amqp/server.go
+++ b/pkg/network/protocols/amqp/server.go
@@ -51,11 +51,13 @@ func RunServer(t testing.TB, serverAddr, serverPort string, enableTLS bool) erro
 
 	scanner, err := globalutils.NewScanner(startupRegexp, globalutils.NoPattern)
 	require.NoError(t, err, "failed to create pattern scanner")
-	dockerCfg := dockerutils.NewComposeConfig("amqp",
-		dockerutils.DefaultTimeout,
-		dockerutils.DefaultRetries,
-		scanner,
-		env,
+
+	dockerCfg := dockerutils.NewComposeConfig(
+		dockerutils.NewBaseConfig(
+			"amqp",
+			scanner,
+			dockerutils.WithEnv(env),
+		),
 		filepath.Join(dir, "testdata", "docker-compose.yml"))
 	return dockerutils.Run(t, dockerCfg)
 }
diff --git a/pkg/network/protocols/kafka/server.go b/pkg/network/protocols/kafka/server.go
index 586709b2a143..13168c17dcb3 100644
--- a/pkg/network/protocols/kafka/server.go
+++ b/pkg/network/protocols/kafka/server.go
@@ -50,11 +50,13 @@ func RunServer(t testing.TB, serverAddr, serverPort string) error {
 
 	scanner, err := globalutils.NewScanner(regexp.MustCompile(`.*started \(kafka.server.KafkaRaftServer\).*`), globalutils.NoPattern)
 	require.NoError(t, err, "failed to create pattern scanner")
-	dockerCfg := dockerutils.NewComposeConfig("kafka",
-		dockerutils.DefaultTimeout,
-		dockerutils.DefaultRetries,
-		scanner,
-		env,
+
+	dockerCfg := dockerutils.NewComposeConfig(
+		dockerutils.NewBaseConfig(
+			"kafka",
+			scanner,
+			dockerutils.WithEnv(env),
+		),
 		filepath.Join(dir, "testdata", "docker-compose.yml"))
 	return dockerutils.Run(t, dockerCfg)
 }
diff --git a/pkg/network/protocols/mongo/server.go b/pkg/network/protocols/mongo/server.go
index 5537f67b6a58..b2045eb65553 100644
--- a/pkg/network/protocols/mongo/server.go
+++ b/pkg/network/protocols/mongo/server.go
@@ -38,11 +38,13 @@ func RunServer(t testing.TB, serverAddress, serverPort string) error {
 	dir, _ := testutil.CurDir()
 	scanner, err := globalutils.NewScanner(regexp.MustCompile(fmt.Sprintf(".*Waiting for connections.*port.*:%s.*", serverPort)), globalutils.NoPattern)
 	require.NoError(t, err, "failed to create pattern scanner")
-	dockerCfg := dockerutils.NewComposeConfig("mongo",
-		dockerutils.DefaultTimeout,
-		dockerutils.DefaultRetries,
-		scanner,
-		env,
+
+	dockerCfg := dockerutils.NewComposeConfig(
+		dockerutils.NewBaseConfig(
+			"mongo",
+			scanner,
+			dockerutils.WithEnv(env),
+		),
 		filepath.Join(dir, "testdata", "docker-compose.yml"))
 	return dockerutils.Run(t, dockerCfg)
 }
diff --git a/pkg/network/protocols/mysql/server.go b/pkg/network/protocols/mysql/server.go
index a152e704bd8f..3c71d10b4f3b 100644
--- a/pkg/network/protocols/mysql/server.go
+++ b/pkg/network/protocols/mysql/server.go
@@ -50,11 +50,13 @@ func RunServer(t testing.TB, serverAddr, serverPort string, withTLS bool) error
 
 	scanner, err := globalutils.NewScanner(regexp.MustCompile(fmt.Sprintf(".*ready for connections.*port: %s.*", serverPort)), globalutils.NoPattern)
 	require.NoError(t, err, "failed to create pattern scanner")
-	dockerCfg := dockerutils.NewComposeConfig("MYSQL",
-		dockerutils.DefaultTimeout,
-		dockerutils.DefaultRetries,
-		scanner,
-		env,
+
+	dockerCfg := dockerutils.NewComposeConfig(
+		dockerutils.NewBaseConfig(
+			"MYSQL",
+			scanner,
+			dockerutils.WithEnv(env),
+		),
 		filepath.Join(dir, "testdata", "docker-compose.yml"))
 	return dockerutils.Run(t, dockerCfg)
 }
diff --git a/pkg/network/protocols/postgres/server.go b/pkg/network/protocols/postgres/server.go
index 556c918a1bd3..dbb2e30752ca 100644
--- a/pkg/network/protocols/postgres/server.go
+++ b/pkg/network/protocols/postgres/server.go
@@ -52,11 +52,13 @@ func RunServer(t testing.TB, serverAddr, serverPort string, enableTLS bool) erro
 
 	scanner, err := globalutils.NewScanner(regexp.MustCompile(fmt.Sprintf(".*listening on IPv4 address \"0.0.0.0\", port %s", serverPort)), globalutils.NoPattern)
 	require.NoError(t, err, "failed to create pattern scanner")
-	dockerCfg := dockerutils.NewComposeConfig("postgres",
-		dockerutils.DefaultTimeout,
-		dockerutils.DefaultRetries,
-		scanner,
-		env,
+
+	dockerCfg := dockerutils.NewComposeConfig(
+		dockerutils.NewBaseConfig(
+			"postgres",
+			scanner,
+			dockerutils.WithEnv(env),
+		),
 		filepath.Join(testDataDir, "docker-compose.yml"))
 	return dockerutils.Run(t, dockerCfg)
 }
diff --git a/pkg/network/protocols/redis/server.go b/pkg/network/protocols/redis/server.go
index 3c5b4f6ed7b8..5622f0fd87e8 100644
--- a/pkg/network/protocols/redis/server.go
+++ b/pkg/network/protocols/redis/server.go
@@ -44,11 +44,13 @@ func RunServer(t testing.TB, serverAddr, serverPort string, enableTLS bool) erro
 
 	scanner, err := globalutils.NewScanner(regexp.MustCompile(".*Ready to accept connections"), globalutils.NoPattern)
 	require.NoError(t, err, "failed to create pattern scanner")
-	dockerCfg := dockerutils.NewComposeConfig("redis",
-		dockerutils.DefaultTimeout,
-		dockerutils.DefaultRetries,
-		scanner,
-		env,
+
+	dockerCfg := dockerutils.NewComposeConfig(
+		dockerutils.NewBaseConfig(
+			"redis",
+			scanner,
+			dockerutils.WithEnv(env),
+		),
 		filepath.Join(dir, "testdata", "docker-compose.yml"))
 	return dockerutils.Run(t, dockerCfg)
 }
diff --git a/pkg/network/protocols/tls/gotls/testutil/server.go b/pkg/network/protocols/tls/gotls/testutil/server.go
index dbca288327ad..8124d143ebc1 100644
--- a/pkg/network/protocols/tls/gotls/testutil/server.go
+++ b/pkg/network/protocols/tls/gotls/testutil/server.go
@@ -28,12 +28,13 @@ func RunServer(t testing.TB, serverPort string) error {
 	dir, _ := testutil.CurDir()
 	scanner, err := globalutils.NewScanner(regexp.MustCompile("go-httpbin listening on https://0.0.0.0:8080"), globalutils.NoPattern)
 	require.NoError(t, err, "failed to create pattern scanner")
-	dockerCfg := dockerutils.NewComposeConfig("https-gotls",
-		dockerutils.DefaultTimeout,
-		dockerutils.DefaultRetries,
-		scanner,
-		env,
+
+	dockerCfg := dockerutils.NewComposeConfig(
+		dockerutils.NewBaseConfig(
+			"https-gotls",
+			scanner,
+			dockerutils.WithEnv(env),
+		),
 		dir+"/../testdata/docker-compose.yml")
 	return dockerutils.Run(t, dockerCfg)
-
 }
diff --git a/pkg/network/protocols/tls/nodejs/nodejs.go b/pkg/network/protocols/tls/nodejs/nodejs.go
index 54a21acf99dd..d648e660bd9f 100644
--- a/pkg/network/protocols/tls/nodejs/nodejs.go
+++ b/pkg/network/protocols/tls/nodejs/nodejs.go
@@ -68,11 +68,13 @@ func RunServerNodeJS(t *testing.T, key, cert, serverPort string) error {
 
 	scanner, err := globalutils.NewScanner(regexp.MustCompile("Server running at https.*"), globalutils.NoPattern)
 	require.NoError(t, err, "failed to create pattern scanner")
-	dockerCfg := dockerutils.NewComposeConfig("nodejs-server",
-		dockerutils.DefaultTimeout,
-		dockerutils.DefaultRetries,
-		scanner,
-		env,
+
+	dockerCfg := dockerutils.NewComposeConfig(
+		dockerutils.NewBaseConfig(
+			"nodejs-server",
+			scanner,
+			dockerutils.WithEnv(env),
+		),
 		path.Join(dir, "testdata", "docker-compose.yml"))
 	return dockerutils.Run(t, dockerCfg)
 }
diff --git a/pkg/network/usm/monitor_tls_test.go b/pkg/network/usm/monitor_tls_test.go
index ec975111862a..69dee0d763eb 100644
--- a/pkg/network/usm/monitor_tls_test.go
+++ b/pkg/network/usm/monitor_tls_test.go
@@ -111,11 +111,12 @@ func (s *tlsSuite) TestHTTPSViaLibraryIntegration() {
 				dir = path.Join(dir, "testdata", "musl")
 				scanner, err := globalutils.NewScanner(regexp.MustCompile("started"), globalutils.NoPattern)
 				require.NoError(t, err, "failed to create pattern scanner")
-				dockerCfg := dockerutils.NewComposeConfig("musl-alpine",
-					dockerutils.DefaultTimeout,
-					dockerutils.DefaultRetries,
-					scanner,
-					dockerutils.EmptyEnv,
+
+				dockerCfg := dockerutils.NewComposeConfig(
+					dockerutils.NewBaseConfig(
+						"musl-alpine",
+						scanner,
+					),
 					path.Join(dir, "/docker-compose.yml"))
 				err = dockerutils.Run(t, dockerCfg)
 				require.NoError(t, err)
diff --git a/pkg/util/testutil/docker/config.go b/pkg/util/testutil/docker/config.go
index d5f374afb79e..a0668341641e 100644
--- a/pkg/util/testutil/docker/config.go
+++ b/pkg/util/testutil/docker/config.go
@@ -58,32 +58,32 @@ type LifecycleConfig interface {
 }
 
 // Timeout returns the timeout to be used when running a container/s
-func (b baseConfig) Timeout() time.Duration {
+func (b BaseConfig) Timeout() time.Duration {
 	return b.timeout
 }
 
 // Retries returns the number of retries to be used when trying to start the container/s
-func (b baseConfig) Retries() int {
+func (b BaseConfig) Retries() int {
 	return b.retries
 }
 
 // PatternScanner returns the patternScanner object used to match logs for readiness and completion of the target container/s
-func (b baseConfig) PatternScanner() *testutil.PatternScanner {
+func (b BaseConfig) PatternScanner() *testutil.PatternScanner {
 	return b.patternScanner
 }
 
 // Env returns the environment variables to set for the container/s
-func (b baseConfig) Env() []string {
+func (b BaseConfig) Env() []string {
 	return b.env
 }
 
 // Name returns the name of the docker container or a friendly name for the docker-compose setup
-func (b baseConfig) Name() string {
+func (b BaseConfig) Name() string {
 	return b.name
 }
 
-// baseConfig contains shared configurations for both Docker and Docker Compose.
-type baseConfig struct {
+// BaseConfig contains shared configurations for both Docker and Docker Compose.
+type BaseConfig struct {
 	name           string                   // Container name for docker or an alias for docker-compose
 	timeout        time.Duration            // Timeout for the entire operation.
 	retries        int                      // Number of retries for starting.
@@ -93,11 +93,13 @@ type baseConfig struct {
 
 // runConfig contains specific configurations for Docker containers, embedding BaseConfig.
 type runConfig struct {
-	baseConfig                   // Embed general configuration.
-	ImageName  string            // Docker image to use.
-	Binary     string            // Binary to run inside the container.
-	BinaryArgs []string          // Arguments for the binary.
-	Mounts     map[string]string // Mounts (host path -> container path).
+	BaseConfig                    // Embed general configuration.
+	ImageName   string            // Docker image to use.
+	Binary      string            // Binary to run inside the container.
+	BinaryArgs  []string          // Arguments for the binary.
+	Mounts      map[string]string // Mounts (host path -> container path).
+	NetworkMode string            // Network mode to use for the container. If empty, the docker default will apply
+	PIDMode     string            // PID mode to use for the container. If empty, the docker default will apply
 }
 
 func (r runConfig) command() string {
@@ -124,6 +126,14 @@ func (r runConfig) commandArgs(t subCommandType) []string {
 		//append container name and container image name
 		args = append(args, "--name", r.Name(), r.ImageName)
 
+		if r.NetworkMode != "" {
+			args = append(args, "--network", r.NetworkMode)
+		}
+
+		if r.PIDMode != "" {
+			args = append(args, "--pid", r.PIDMode)
+		}
+
 		//provide main binary and binary arguments to run inside the docker container
 		args = append(args, r.Binary)
 		args = append(args, r.BinaryArgs...)
@@ -135,7 +145,7 @@ func (r runConfig) commandArgs(t subCommandType) []string {
 
 // composeConfig contains specific configurations for Docker Compose, embedding BaseConfig.
 type composeConfig struct {
-	baseConfig        // Embed general configuration.
+	BaseConfig        // Embed general configuration.
 	File       string // Path to the docker-compose file.
 }
 
@@ -154,31 +164,107 @@ func (c composeConfig) commandArgs(t subCommandType) []string {
 	}
 }
 
-func createBaseConfig(name string, timeout time.Duration, retries int, patternScanner *testutil.PatternScanner, env []string) baseConfig {
-	return baseConfig{
-		name:           name,
-		timeout:        timeout,
-		retries:        retries,
-		patternScanner: patternScanner,
-		env:            env,
+// WithBinaryArgs sets the arguments for the binary to run inside the container.
+func WithBinaryArgs(binaryArgs []string) RunConfigOption {
+	return func(c *runConfig) {
+		c.BinaryArgs = binaryArgs
+	}
+}
+
+// WithMounts sets the volume mounts for the container (host path -> container path).
+func WithMounts(mounts map[string]string) RunConfigOption {
+	return func(c *runConfig) {
+		c.Mounts = mounts
+	}
+}
+
+// WithNetworkMode sets the network mode for the container.
+func WithNetworkMode(networkMode string) RunConfigOption {
+	return func(c *runConfig) {
+		c.NetworkMode = networkMode
+	}
+}
+
+// WithPIDMode sets the PID mode for the container.
+func WithPIDMode(pidMode string) RunConfigOption {
+	return func(c *runConfig) {
+		c.PIDMode = pidMode
 	}
 }
 
 // NewRunConfig creates a new runConfig instance for a single docker container.
-func NewRunConfig(name string, timeout time.Duration, retries int, patternScanner *testutil.PatternScanner, env []string, imageName, binary string, binaryArgs []string, mounts map[string]string) LifecycleConfig {
-	return runConfig{
-		baseConfig: createBaseConfig(name, timeout, retries, patternScanner, env),
+// The baseConfig is the base configuration for the docker container.
+// imageName is the name of the docker image to use.
+// binary is the binary to run inside the container.
+// baseConfig, imageName and binary are required.
+// opts are the optional parameters for the runConfig.
+func NewRunConfig(baseConfig BaseConfig, imageName string, binary string, opts ...RunConfigOption) LifecycleConfig {
+	cfg := &runConfig{
+		BaseConfig: baseConfig,
 		ImageName:  imageName,
 		Binary:     binary,
-		BinaryArgs: binaryArgs,
-		Mounts:     mounts,
 	}
+	for _, opt := range opts {
+		opt(cfg)
+	}
+	return *cfg
 }
 
 // NewComposeConfig creates a new composeConfig instance for the docker-compose.
-func NewComposeConfig(name string, timeout time.Duration, retries int, patternScanner *testutil.PatternScanner, env []string, file string) LifecycleConfig {
-	return composeConfig{
-		baseConfig: createBaseConfig(name, timeout, retries, patternScanner, env),
+// The baseConfig is the base configuration for the docker-compose setup.
+// The file is the path to the docker-compose file. Both are required.
+// NewComposeConfig does not have optional parameters.
+func NewComposeConfig(baseConfig BaseConfig, file string) LifecycleConfig {
+	cfg := &composeConfig{
+		BaseConfig: baseConfig,
 		File:       file,
 	}
+	return cfg
+}
+
+// BaseConfigOption represents options for the base configuration for all docker lifecycle configs
+type BaseConfigOption func(*BaseConfig)
+
+// RunConfigOption represents options for the run configuration for a docker container
+type RunConfigOption func(*runConfig)
+
+// ComposeConfigOption represents options for the compose configuration for a docker-compose setup
+type ComposeConfigOption func(*composeConfig)
+
+// WithTimeout sets the timeout for the container operation.
+func WithTimeout(timeout time.Duration) BaseConfigOption {
+	return func(c *BaseConfig) {
+		c.timeout = timeout
+	}
+}
+
+// WithRetries sets the number of retries for starting the container.
+func WithRetries(retries int) BaseConfigOption {
+	return func(c *BaseConfig) {
+		c.retries = retries
+	}
+}
+
+// WithEnv sets the environment variables for the container.
+func WithEnv(env []string) BaseConfigOption {
+	return func(c *BaseConfig) {
+		c.env = env
+	}
+}
+
+// NewBaseConfig creates a new base configuration for a docker container or docker-compose setup.
+// The name is used to identify the container or docker-compose setup.
+// The patternScanner is used to match logs for readiness and completion of the target container/s.
+// The opts are used to configure optional parameters for the base configuration.
+func NewBaseConfig(name string, patternScanner *testutil.PatternScanner, opts ...BaseConfigOption) BaseConfig {
+	cfg := BaseConfig{
+		name:           name,
+		patternScanner: patternScanner,
+		timeout:        DefaultTimeout,
+		retries:        DefaultRetries,
+	}
+	for _, opt := range opts {
+		opt(&cfg)
+	}
+	return cfg
 }


Reviews:
user: login: guyarb
body: 🚀 
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-07T14:32:04Z
user: login: vitkyrka
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-08T10:17:15Z
user: login: brycekahle
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-09T18:37:38Z
user: login: gjulianm
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-09T18:47:05Z
user: login: brycekahle
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-09T18:47:49Z
user: login: guyarb
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-12T11:58:03Z
user: login: gjulianm
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-12T11:59:11Z
user: login: brycekahle
state: APPROVED
author_association: MEMBER
submitted_at: 2025-05-12T20:59:18Z

Review comments:
diff_hunk: @@ -921,12 +921,16 @@ func TestDocker(t *testing.T) {
 	dir, _ := testutil.CurDir()
 	scanner, err := globalutils.NewScanner(regexp.MustCompile("Serving.*"), globalutils.NoPattern)
 	require.NoError(t, err, "failed to create pattern scanner")
-	dockerCfg := dockerutils.NewComposeConfig("foo-server",
-		dockerutils.DefaultTimeout,
-		dockerutils.DefaultRetries,
-		scanner,
-		dockerutils.EmptyEnv,
-		filepath.Join(dir, "testdata", "docker-compose.yml"))
+
+	dockerCfg := dockerutils.NewComposeConfig(
+		dockerutils.WithBaseConfigForCompose(
+			dockerutils.WithName("foo-server"),
+			dockerutils.WithTimeout(dockerutils.DefaultTimeout),
+			dockerutils.WithRetries(dockerutils.DefaultRetries),
path: pkg/collector/corechecks/servicediscovery/module/impl_linux_test.go
user: login: vitkyrka
body: Looks like these two are default in the base config so they could be removed from here
created_at: 2025-05-08T10:16:56Z
author_association: CONTRIBUTOR
diff_hunk: @@ -921,12 +921,16 @@ func TestDocker(t *testing.T) {
 	dir, _ := testutil.CurDir()
 	scanner, err := globalutils.NewScanner(regexp.MustCompile("Serving.*"), globalutils.NoPattern)
 	require.NoError(t, err, "failed to create pattern scanner")
-	dockerCfg := dockerutils.NewComposeConfig("foo-server",
-		dockerutils.DefaultTimeout,
-		dockerutils.DefaultRetries,
-		scanner,
-		dockerutils.EmptyEnv,
-		filepath.Join(dir, "testdata", "docker-compose.yml"))
+
+	dockerCfg := dockerutils.NewComposeConfig(
+		dockerutils.WithBaseConfigForCompose(
+			dockerutils.WithName("foo-server"),
+			dockerutils.WithTimeout(dockerutils.DefaultTimeout),
+			dockerutils.WithRetries(dockerutils.DefaultRetries),
+			dockerutils.WithPatternScanner(scanner),
+			dockerutils.WithEnv(dockerutils.EmptyEnv),
path: pkg/collector/corechecks/servicediscovery/module/impl_linux_test.go
user: login: vitkyrka
body: This could also be default in the base config
created_at: 2025-05-08T10:17:09Z
author_association: CONTRIBUTOR
diff_hunk: @@ -154,31 +164,138 @@ func (c composeConfig) commandArgs(t subCommandType) []string {
 	}
 }
 
-func createBaseConfig(name string, timeout time.Duration, retries int, patternScanner *testutil.PatternScanner, env []string) baseConfig {
-	return baseConfig{
-		name:           name,
-		timeout:        timeout,
-		retries:        retries,
-		patternScanner: patternScanner,
-		env:            env,
+// WithImageName sets the Docker image name for the container configuration.
+func WithImageName(imageName string) RunConfigOption {
+	return func(c *runConfig) {
+		c.ImageName = imageName
+	}
+}
+
+// WithBinary sets the binary to run inside the container.
+func WithBinary(binary string) RunConfigOption {
+	return func(c *runConfig) {
+		c.Binary = binary
+	}
+}
+
+// WithBinaryArgs sets the arguments for the binary to run inside the container.
+func WithBinaryArgs(binaryArgs []string) RunConfigOption {
+	return func(c *runConfig) {
+		c.BinaryArgs = binaryArgs
+	}
+}
+
+// WithMounts sets the volume mounts for the container (host path -> container path).
+func WithMounts(mounts map[string]string) RunConfigOption {
+	return func(c *runConfig) {
+		c.Mounts = mounts
+	}
+}
+
+// WithNetworkMode sets the network mode for the container.
+func WithNetworkMode(networkMode string) RunConfigOption {
+	return func(c *runConfig) {
+		c.NetworkMode = networkMode
+	}
+}
+
+// WithPIDMode sets the PID mode for the container.
+func WithPIDMode(pidMode string) RunConfigOption {
+	return func(c *runConfig) {
+		c.PIDMode = pidMode
 	}
 }
 
 // NewRunConfig creates a new runConfig instance for a single docker container.
-func NewRunConfig(name string, timeout time.Duration, retries int, patternScanner *testutil.PatternScanner, env []string, imageName, binary string, binaryArgs []string, mounts map[string]string) LifecycleConfig {
-	return runConfig{
-		baseConfig: createBaseConfig(name, timeout, retries, patternScanner, env),
-		ImageName:  imageName,
-		Binary:     binary,
-		BinaryArgs: binaryArgs,
-		Mounts:     mounts,
+func NewRunConfig(opts ...RunConfigOption) LifecycleConfig {
+	cfg := &runConfig{}
+	for _, opt := range opts {
+		opt(cfg)
+	}
+	return *cfg
+}
+
+// WithFile sets the path to the docker-compose file.
+func WithFile(file string) ComposeConfigOption {
path: pkg/util/testutil/docker/config.go
user: login: brycekahle
body: It looks like `File` is required, so it shouldn't be an optional argument.
created_at: 2025-05-09T18:37:38Z
author_association: MEMBER
diff_hunk: @@ -154,31 +164,138 @@ func (c composeConfig) commandArgs(t subCommandType) []string {
 	}
 }
 
-func createBaseConfig(name string, timeout time.Duration, retries int, patternScanner *testutil.PatternScanner, env []string) baseConfig {
-	return baseConfig{
-		name:           name,
-		timeout:        timeout,
-		retries:        retries,
-		patternScanner: patternScanner,
-		env:            env,
+// WithImageName sets the Docker image name for the container configuration.
+func WithImageName(imageName string) RunConfigOption {
+	return func(c *runConfig) {
+		c.ImageName = imageName
+	}
+}
+
+// WithBinary sets the binary to run inside the container.
+func WithBinary(binary string) RunConfigOption {
+	return func(c *runConfig) {
+		c.Binary = binary
+	}
+}
+
+// WithBinaryArgs sets the arguments for the binary to run inside the container.
+func WithBinaryArgs(binaryArgs []string) RunConfigOption {
+	return func(c *runConfig) {
+		c.BinaryArgs = binaryArgs
+	}
+}
+
+// WithMounts sets the volume mounts for the container (host path -> container path).
+func WithMounts(mounts map[string]string) RunConfigOption {
+	return func(c *runConfig) {
+		c.Mounts = mounts
+	}
+}
+
+// WithNetworkMode sets the network mode for the container.
+func WithNetworkMode(networkMode string) RunConfigOption {
+	return func(c *runConfig) {
+		c.NetworkMode = networkMode
+	}
+}
+
+// WithPIDMode sets the PID mode for the container.
+func WithPIDMode(pidMode string) RunConfigOption {
+	return func(c *runConfig) {
+		c.PIDMode = pidMode
 	}
 }
 
 // NewRunConfig creates a new runConfig instance for a single docker container.
-func NewRunConfig(name string, timeout time.Duration, retries int, patternScanner *testutil.PatternScanner, env []string, imageName, binary string, binaryArgs []string, mounts map[string]string) LifecycleConfig {
-	return runConfig{
-		baseConfig: createBaseConfig(name, timeout, retries, patternScanner, env),
-		ImageName:  imageName,
-		Binary:     binary,
-		BinaryArgs: binaryArgs,
-		Mounts:     mounts,
+func NewRunConfig(opts ...RunConfigOption) LifecycleConfig {
+	cfg := &runConfig{}
+	for _, opt := range opts {
+		opt(cfg)
+	}
+	return *cfg
+}
+
+// WithFile sets the path to the docker-compose file.
+func WithFile(file string) ComposeConfigOption {
path: pkg/util/testutil/docker/config.go
user: login: gjulianm
body: Is there a common pattern to use in those cases? I left it like that to avoid having arguments + optionals, specially as it's test code and it will fail quickly if the file is not provided, but maybe there's a better way to have that.
created_at: 2025-05-09T18:47:05Z
author_association: CONTRIBUTOR
diff_hunk: @@ -154,31 +164,138 @@ func (c composeConfig) commandArgs(t subCommandType) []string {
 	}
 }
 
-func createBaseConfig(name string, timeout time.Duration, retries int, patternScanner *testutil.PatternScanner, env []string) baseConfig {
-	return baseConfig{
-		name:           name,
-		timeout:        timeout,
-		retries:        retries,
-		patternScanner: patternScanner,
-		env:            env,
+// WithImageName sets the Docker image name for the container configuration.
+func WithImageName(imageName string) RunConfigOption {
+	return func(c *runConfig) {
+		c.ImageName = imageName
+	}
+}
+
+// WithBinary sets the binary to run inside the container.
+func WithBinary(binary string) RunConfigOption {
+	return func(c *runConfig) {
+		c.Binary = binary
+	}
+}
+
+// WithBinaryArgs sets the arguments for the binary to run inside the container.
+func WithBinaryArgs(binaryArgs []string) RunConfigOption {
+	return func(c *runConfig) {
+		c.BinaryArgs = binaryArgs
+	}
+}
+
+// WithMounts sets the volume mounts for the container (host path -> container path).
+func WithMounts(mounts map[string]string) RunConfigOption {
+	return func(c *runConfig) {
+		c.Mounts = mounts
+	}
+}
+
+// WithNetworkMode sets the network mode for the container.
+func WithNetworkMode(networkMode string) RunConfigOption {
+	return func(c *runConfig) {
+		c.NetworkMode = networkMode
+	}
+}
+
+// WithPIDMode sets the PID mode for the container.
+func WithPIDMode(pidMode string) RunConfigOption {
+	return func(c *runConfig) {
+		c.PIDMode = pidMode
 	}
 }
 
 // NewRunConfig creates a new runConfig instance for a single docker container.
-func NewRunConfig(name string, timeout time.Duration, retries int, patternScanner *testutil.PatternScanner, env []string, imageName, binary string, binaryArgs []string, mounts map[string]string) LifecycleConfig {
-	return runConfig{
-		baseConfig: createBaseConfig(name, timeout, retries, patternScanner, env),
-		ImageName:  imageName,
-		Binary:     binary,
-		BinaryArgs: binaryArgs,
-		Mounts:     mounts,
+func NewRunConfig(opts ...RunConfigOption) LifecycleConfig {
+	cfg := &runConfig{}
+	for _, opt := range opts {
+		opt(cfg)
+	}
+	return *cfg
+}
+
+// WithFile sets the path to the docker-compose file.
+func WithFile(file string) ComposeConfigOption {
path: pkg/util/testutil/docker/config.go
user: login: brycekahle
body: Anything required should be an argument, that way you cannot mis-use it.
created_at: 2025-05-09T18:47:49Z
author_association: MEMBER
diff_hunk: @@ -154,31 +164,138 @@ func (c composeConfig) commandArgs(t subCommandType) []string {
 	}
 }
 
-func createBaseConfig(name string, timeout time.Duration, retries int, patternScanner *testutil.PatternScanner, env []string) baseConfig {
-	return baseConfig{
-		name:           name,
-		timeout:        timeout,
-		retries:        retries,
-		patternScanner: patternScanner,
-		env:            env,
+// WithImageName sets the Docker image name for the container configuration.
+func WithImageName(imageName string) RunConfigOption {
+	return func(c *runConfig) {
+		c.ImageName = imageName
+	}
+}
+
+// WithBinary sets the binary to run inside the container.
+func WithBinary(binary string) RunConfigOption {
+	return func(c *runConfig) {
+		c.Binary = binary
+	}
+}
+
+// WithBinaryArgs sets the arguments for the binary to run inside the container.
+func WithBinaryArgs(binaryArgs []string) RunConfigOption {
+	return func(c *runConfig) {
+		c.BinaryArgs = binaryArgs
+	}
+}
+
+// WithMounts sets the volume mounts for the container (host path -> container path).
+func WithMounts(mounts map[string]string) RunConfigOption {
+	return func(c *runConfig) {
+		c.Mounts = mounts
+	}
+}
+
+// WithNetworkMode sets the network mode for the container.
+func WithNetworkMode(networkMode string) RunConfigOption {
+	return func(c *runConfig) {
+		c.NetworkMode = networkMode
+	}
+}
+
+// WithPIDMode sets the PID mode for the container.
+func WithPIDMode(pidMode string) RunConfigOption {
+	return func(c *runConfig) {
+		c.PIDMode = pidMode
 	}
 }
 
 // NewRunConfig creates a new runConfig instance for a single docker container.
-func NewRunConfig(name string, timeout time.Duration, retries int, patternScanner *testutil.PatternScanner, env []string, imageName, binary string, binaryArgs []string, mounts map[string]string) LifecycleConfig {
-	return runConfig{
-		baseConfig: createBaseConfig(name, timeout, retries, patternScanner, env),
-		ImageName:  imageName,
-		Binary:     binary,
-		BinaryArgs: binaryArgs,
-		Mounts:     mounts,
+func NewRunConfig(opts ...RunConfigOption) LifecycleConfig {
+	cfg := &runConfig{}
+	for _, opt := range opts {
+		opt(cfg)
+	}
+	return *cfg
+}
+
+// WithFile sets the path to the docker-compose file.
+func WithFile(file string) ComposeConfigOption {
path: pkg/util/testutil/docker/config.go
user: login: gjulianm
body: Changed to use that distinction, let me know if it looks better now.
created_at: 2025-05-12T11:59:11Z
author_association: CONTRIBUTOR

PR comments:
user: login: agent-platform-auto-pr[bot]
created_at: 2025-05-07T12:54:23Z
body: ## Uncompressed package size comparison

Comparison with [ancestor](https://github.com/DataDog/datadog-agent/commit/dc52a8dd4b9a9a2d5dd80cb77a1af54b3230c738) `dc52a8dd4b9a9a2d5dd80cb77a1af54b3230c738`


<details>
  <summary> Diff per package </summary>

|package|diff|status|size|ancestor|threshold|
|--|--|--|--|--|--|
|datadog-agent-amd64-deb|0.00MB|✅|776.39MB|776.39MB|0.50MB|
|datadog-agent-x86_64-rpm|0.00MB|✅|785.34MB|785.34MB|0.50MB|
|datadog-agent-x86_64-suse|0.00MB|✅|785.34MB|785.34MB|0.50MB|
|datadog-agent-arm64-deb|0.00MB|✅|766.18MB|766.18MB|0.50MB|
|datadog-agent-aarch64-rpm|0.00MB|✅|775.10MB|775.10MB|0.50MB|
|datadog-dogstatsd-amd64-deb|0.00MB|✅|31.20MB|31.20MB|0.50MB|
|datadog-dogstatsd-x86_64-rpm|0.00MB|✅|31.28MB|31.28MB|0.50MB|
|datadog-dogstatsd-x86_64-suse|0.00MB|✅|31.28MB|31.28MB|0.50MB|
|datadog-dogstatsd-arm64-deb|0.00MB|✅|30.03MB|30.03MB|0.50MB|
|datadog-heroku-agent-amd64-deb|0.00MB|✅|377.90MB|377.90MB|0.50MB|
|datadog-iot-agent-amd64-deb|0.00MB|✅|60.57MB|60.57MB|0.50MB|
|datadog-iot-agent-x86_64-rpm|0.00MB|✅|60.65MB|60.65MB|0.50MB|
|datadog-iot-agent-x86_64-suse|0.00MB|✅|60.65MB|60.65MB|0.50MB|
|datadog-iot-agent-arm64-deb|0.00MB|✅|57.86MB|57.86MB|0.50MB|
|datadog-iot-agent-aarch64-rpm|0.00MB|✅|57.94MB|57.94MB|0.50MB|

</details>

## Decision
✅ Passed



author_association: CONTRIBUTOR
user: login: cit-pr-commenter[bot]
created_at: 2025-05-07T13:17:10Z
body: ## Regression Detector

# Regression Detector Results

[Metrics dashboard](https://app.datadoghq.com/dashboard/ykh-ua8-vcu/SMP-Regression-Detector-Metrics?fromUser=true&refresh_mode=paused&tpl_var_run-id%5B0%5D=14a4a147-8d23-4b12-8937-20767cb3dc2f&view=spans&from_ts=1747051397000&to_ts=1747051997000&live=false)  
[Target profiles](https://app.datadoghq.com/profiling/explorer?query=env%3Asingle-machine-performance%20service%3Adatadog-agent%20job_id%3A14a4a147-8d23-4b12-8937-20767cb3dc2f&agg_m=count&agg_m_source=base&agg_t=count&fromUser=false&viz=stream&start=1747044197000&end=1747055597000&paused=true)  
Run ID: 14a4a147-8d23-4b12-8937-20767cb3dc2f

Baseline: dc52a8dd4b9a9a2d5dd80cb77a1af54b3230c738
Comparison: 6112ee886d4b0ccfa290390b3d36d1d529e34b26
[Diff](dc52a8dd4b9a9a2d5dd80cb77a1af54b3230c738...6112ee886d4b0ccfa290390b3d36d1d529e34b26)


## Optimization Goals: ✅ No significant changes detected


<details>
<summary><h2>
Fine details of change detection per experiment
</h2></summary>

| perf | experiment                                   | goal               | Δ mean % | Δ mean % CI    | trials | links                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
|------|----------------------------------------------|--------------------|----------|----------------|--------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| ➖   | file_tree                                    | memory utilization | +1.37    | [+1.17, +1.57] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Afile_tree%20job_id%3A14a4a147-8d23-4b12-8937-20767cb3dc2f&agg_m=count&agg_m_source=base&agg_q=%40span.url&agg_q_source=base&agg_t=count&fromUser=true&index=single-machine-performance-target-logs&messageDisplay=inline&refresh_mode=paused&storage=hot&stream_sort=time%2Cdesc&top_n=100&top_o=top&viz=stream&x_missing=true&from_ts=1747044197000&to_ts=1747055597000&live=false)                                                                                                                                                                                                                                                                                                                       |
| ➖   | docker_containers_cpu                        | % cpu utilization  | +1.26    | [-2.54, +5.05] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Adocker_containers_cpu%20job_id%3A14a4a147-8d23-4b12-8937-20767cb3dc2f&agg_m=count&agg_m_source=base&agg_q=%40span.url&agg_q_source=base&agg_t=count&fromUser=true&index=single-machine-performance-target-logs&messageDisplay=inline&refresh_mode=paused&storage=hot&stream_sort=time%2Cdesc&top_n=100&top_o=top&viz=stream&x_missing=true&from_ts=1747044197000&to_ts=1747055597000&live=false)                                                                                                                                                                                                                                                                                                           |
| ➖   | ddot_logs                                    | memory utilization | +0.97    | [+0.84, +1.10] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Addot_logs%20job_id%3A14a4a147-8d23-4b12-8937-20767cb3dc2f&agg_m=count&agg_m_source=base&agg_q=%40span.url&agg_q_source=base&agg_t=count&fromUser=true&index=single-machine-performance-target-logs&messageDisplay=inline&refresh_mode=paused&storage=hot&stream_sort=time%2Cdesc&top_n=100&top_o=top&viz=stream&x_missing=true&from_ts=1747044197000&to_ts=1747055597000&live=false)                                                                                                                                                                                                                                                                                                                       |
| ➖   | quality_gate_logs                            | % cpu utilization  | +0.81    | [-1.95, +3.58] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Aquality_gate_logs%20job_id%3A14a4a147-8d23-4b12-8937-20767cb3dc2f&agg_m=count&agg_m_source=base&agg_q=%40span.url&agg_q_source=base&agg_t=count&fromUser=true&index=single-machine-performance-target-logs&messageDisplay=inline&refresh_mode=paused&storage=hot&stream_sort=time%2Cdesc&top_n=100&top_o=top&viz=stream&x_missing=true&from_ts=1747044197000&to_ts=1747055597000&live=false) [bounds checks dashboard](https://app.datadoghq.com/dashboard/vz3-jd5-bdi?fromUser=true&refresh_mode=paused&tpl_var_experiment%5B0%5D=quality_gate_logs&tpl_var_job_id%5B0%5D=14a4a147-8d23-4b12-8937-20767cb3dc2f&view=spans&from_ts=1747051397000&to_ts=1747051997000&live=false)                           |
| ➖   | ddot_metrics                                 | memory utilization | +0.29    | [+0.18, +0.41] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Addot_metrics%20job_id%3A14a4a147-8d23-4b12-8937-20767cb3dc2f&agg_m=count&agg_m_source=base&agg_q=%40span.url&agg_q_source=base&agg_t=count&fromUser=true&index=single-machine-performance-target-logs&messageDisplay=inline&refresh_mode=paused&storage=hot&stream_sort=time%2Cdesc&top_n=100&top_o=top&viz=stream&x_missing=true&from_ts=1747044197000&to_ts=1747055597000&live=false)                                                                                                                                                                                                                                                                                                                    |
| ➖   | file_to_blackhole_1000ms_latency_linear_load | egress throughput  | +0.04    | [-0.19, +0.27] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Afile_to_blackhole_1000ms_latency_linear_load%20job_id%3A14a4a147-8d23-4b12-8937-20767cb3dc2f&agg_m=count&agg_m_source=base&agg_q=%40span.url&agg_q_source=base&agg_t=count&fromUser=true&index=single-machine-performance-target-logs&messageDisplay=inline&refresh_mode=paused&storage=hot&stream_sort=time%2Cdesc&top_n=100&top_o=top&viz=stream&x_missing=true&from_ts=1747044197000&to_ts=1747055597000&live=false)                                                                                                                                                                                                                                                                                    |
| ➖   | file_to_blackhole_0ms_latency_http2          | egress throughput  | +0.02    | [-0.62, +0.66] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Afile_to_blackhole_0ms_latency_http2%20job_id%3A14a4a147-8d23-4b12-8937-20767cb3dc2f&agg_m=count&agg_m_source=base&agg_q=%40span.url&agg_q_source=base&agg_t=count&fromUser=true&index=single-machine-performance-target-logs&messageDisplay=inline&refresh_mode=paused&storage=hot&stream_sort=time%2Cdesc&top_n=100&top_o=top&viz=stream&x_missing=true&from_ts=1747044197000&to_ts=1747055597000&live=false)                                                                                                                                                                                                                                                                                             |
| ➖   | file_to_blackhole_500ms_latency              | egress throughput  | +0.01    | [-0.64, +0.65] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Afile_to_blackhole_500ms_latency%20job_id%3A14a4a147-8d23-4b12-8937-20767cb3dc2f&agg_m=count&agg_m_source=base&agg_q=%40span.url&agg_q_source=base&agg_t=count&fromUser=true&index=single-machine-performance-target-logs&messageDisplay=inline&refresh_mode=paused&storage=hot&stream_sort=time%2Cdesc&top_n=100&top_o=top&viz=stream&x_missing=true&from_ts=1747044197000&to_ts=1747055597000&live=false)                                                                                                                                                                                                                                                                                                 |
| ➖   | uds_dogstatsd_to_api                         | ingress throughput | +0.00    | [-0.28, +0.29] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Auds_dogstatsd_to_api%20job_id%3A14a4a147-8d23-4b12-8937-20767cb3dc2f&agg_m=count&agg_m_source=base&agg_q=%40span.url&agg_q_source=base&agg_t=count&fromUser=true&index=single-machine-performance-target-logs&messageDisplay=inline&refresh_mode=paused&storage=hot&stream_sort=time%2Cdesc&top_n=100&top_o=top&viz=stream&x_missing=true&from_ts=1747044197000&to_ts=1747055597000&live=false)                                                                                                                                                                                                                                                                                                            |
| ➖   | file_to_blackhole_0ms_latency                | egress throughput  | -0.00    | [-0.64, +0.63] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Afile_to_blackhole_0ms_latency%20job_id%3A14a4a147-8d23-4b12-8937-20767cb3dc2f&agg_m=count&agg_m_source=base&agg_q=%40span.url&agg_q_source=base&agg_t=count&fromUser=true&index=single-machine-performance-target-logs&messageDisplay=inline&refresh_mode=paused&storage=hot&stream_sort=time%2Cdesc&top_n=100&top_o=top&viz=stream&x_missing=true&from_ts=1747044197000&to_ts=1747055597000&live=false)                                                                                                                                                                                                                                                                                                   |
| ➖   | tcp_dd_logs_filter_exclude                   | ingress throughput | -0.01    | [-0.03, +0.01] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Atcp_dd_logs_filter_exclude%20job_id%3A14a4a147-8d23-4b12-8937-20767cb3dc2f&agg_m=count&agg_m_source=base&agg_q=%40span.url&agg_q_source=base&agg_t=count&fromUser=true&index=single-machine-performance-target-logs&messageDisplay=inline&refresh_mode=paused&storage=hot&stream_sort=time%2Cdesc&top_n=100&top_o=top&viz=stream&x_missing=true&from_ts=1747044197000&to_ts=1747055597000&live=false)                                                                                                                                                                                                                                                                                                      |
| ➖   | quality_gate_idle_all_features               | memory utilization | -0.01    | [-0.15, +0.12] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Aquality_gate_idle_all_features%20job_id%3A14a4a147-8d23-4b12-8937-20767cb3dc2f&agg_m=count&agg_m_source=base&agg_q=%40span.url&agg_q_source=base&agg_t=count&fromUser=true&index=single-machine-performance-target-logs&messageDisplay=inline&refresh_mode=paused&storage=hot&stream_sort=time%2Cdesc&top_n=100&top_o=top&viz=stream&x_missing=true&from_ts=1747044197000&to_ts=1747055597000&live=false) [bounds checks dashboard](https://app.datadoghq.com/dashboard/vz3-jd5-bdi?fromUser=true&refresh_mode=paused&tpl_var_experiment%5B0%5D=quality_gate_idle_all_features&tpl_var_job_id%5B0%5D=14a4a147-8d23-4b12-8937-20767cb3dc2f&view=spans&from_ts=1747051397000&to_ts=1747051997000&live=false) |
| ➖   | file_to_blackhole_100ms_latency              | egress throughput  | -0.02    | [-0.67, +0.63] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Afile_to_blackhole_100ms_latency%20job_id%3A14a4a147-8d23-4b12-8937-20767cb3dc2f&agg_m=count&agg_m_source=base&agg_q=%40span.url&agg_q_source=base&agg_t=count&fromUser=true&index=single-machine-performance-target-logs&messageDisplay=inline&refresh_mode=paused&storage=hot&stream_sort=time%2Cdesc&top_n=100&top_o=top&viz=stream&x_missing=true&from_ts=1747044197000&to_ts=1747055597000&live=false)                                                                                                                                                                                                                                                                                                 |
| ➖   | file_to_blackhole_300ms_latency              | egress throughput  | -0.02    | [-0.66, +0.62] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Afile_to_blackhole_300ms_latency%20job_id%3A14a4a147-8d23-4b12-8937-20767cb3dc2f&agg_m=count&agg_m_source=base&agg_q=%40span.url&agg_q_source=base&agg_t=count&fromUser=true&index=single-machine-performance-target-logs&messageDisplay=inline&refresh_mode=paused&storage=hot&stream_sort=time%2Cdesc&top_n=100&top_o=top&viz=stream&x_missing=true&from_ts=1747044197000&to_ts=1747055597000&live=false)                                                                                                                                                                                                                                                                                                 |
| ➖   | file_to_blackhole_1000ms_latency             | egress throughput  | -0.03    | [-0.64, +0.58] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Afile_to_blackhole_1000ms_latency%20job_id%3A14a4a147-8d23-4b12-8937-20767cb3dc2f&agg_m=count&agg_m_source=base&agg_q=%40span.url&agg_q_source=base&agg_t=count&fromUser=true&index=single-machine-performance-target-logs&messageDisplay=inline&refresh_mode=paused&storage=hot&stream_sort=time%2Cdesc&top_n=100&top_o=top&viz=stream&x_missing=true&from_ts=1747044197000&to_ts=1747055597000&live=false)                                                                                                                                                                                                                                                                                                |
| ➖   | file_to_blackhole_0ms_latency_http1          | egress throughput  | -0.05    | [-0.71, +0.61] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Afile_to_blackhole_0ms_latency_http1%20job_id%3A14a4a147-8d23-4b12-8937-20767cb3dc2f&agg_m=count&agg_m_source=base&agg_q=%40span.url&agg_q_source=base&agg_t=count&fromUser=true&index=single-machine-performance-target-logs&messageDisplay=inline&refresh_mode=paused&storage=hot&stream_sort=time%2Cdesc&top_n=100&top_o=top&viz=stream&x_missing=true&from_ts=1747044197000&to_ts=1747055597000&live=false)                                                                                                                                                                                                                                                                                             |
| ➖   | docker_containers_memory                     | memory utilization | -0.16    | [-0.23, -0.08] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Adocker_containers_memory%20job_id%3A14a4a147-8d23-4b12-8937-20767cb3dc2f&agg_m=count&agg_m_source=base&agg_q=%40span.url&agg_q_source=base&agg_t=count&fromUser=true&index=single-machine-performance-target-logs&messageDisplay=inline&refresh_mode=paused&storage=hot&stream_sort=time%2Cdesc&top_n=100&top_o=top&viz=stream&x_missing=true&from_ts=1747044197000&to_ts=1747055597000&live=false)                                                                                                                                                                                                                                                                                                        |
| ➖   | otlp_ingest_logs                             | memory utilization | -0.22    | [-0.34, -0.09] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Aotlp_ingest_logs%20job_id%3A14a4a147-8d23-4b12-8937-20767cb3dc2f&agg_m=count&agg_m_source=base&agg_q=%40span.url&agg_q_source=base&agg_t=count&fromUser=true&index=single-machine-performance-target-logs&messageDisplay=inline&refresh_mode=paused&storage=hot&stream_sort=time%2Cdesc&top_n=100&top_o=top&viz=stream&x_missing=true&from_ts=1747044197000&to_ts=1747055597000&live=false)                                                                                                                                                                                                                                                                                                                |
| ➖   | uds_dogstatsd_20mb_12k_contexts_20_senders   | memory utilization | -0.30    | [-0.34, -0.25] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Auds_dogstatsd_20mb_12k_contexts_20_senders%20job_id%3A14a4a147-8d23-4b12-8937-20767cb3dc2f&agg_m=count&agg_m_source=base&agg_q=%40span.url&agg_q_source=base&agg_t=count&fromUser=true&index=single-machine-performance-target-logs&messageDisplay=inline&refresh_mode=paused&storage=hot&stream_sort=time%2Cdesc&top_n=100&top_o=top&viz=stream&x_missing=true&from_ts=1747044197000&to_ts=1747055597000&live=false)                                                                                                                                                                                                                                                                                      |
| ➖   | otlp_ingest_metrics                          | memory utilization | -0.33    | [-0.47, -0.18] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Aotlp_ingest_metrics%20job_id%3A14a4a147-8d23-4b12-8937-20767cb3dc2f&agg_m=count&agg_m_source=base&agg_q=%40span.url&agg_q_source=base&agg_t=count&fromUser=true&index=single-machine-performance-target-logs&messageDisplay=inline&refresh_mode=paused&storage=hot&stream_sort=time%2Cdesc&top_n=100&top_o=top&viz=stream&x_missing=true&from_ts=1747044197000&to_ts=1747055597000&live=false)                                                                                                                                                                                                                                                                                                             |
| ➖   | quality_gate_idle                            | memory utilization | -0.39    | [-0.47, -0.30] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Aquality_gate_idle%20job_id%3A14a4a147-8d23-4b12-8937-20767cb3dc2f&agg_m=count&agg_m_source=base&agg_q=%40span.url&agg_q_source=base&agg_t=count&fromUser=true&index=single-machine-performance-target-logs&messageDisplay=inline&refresh_mode=paused&storage=hot&stream_sort=time%2Cdesc&top_n=100&top_o=top&viz=stream&x_missing=true&from_ts=1747044197000&to_ts=1747055597000&live=false) [bounds checks dashboard](https://app.datadoghq.com/dashboard/vz3-jd5-bdi?fromUser=true&refresh_mode=paused&tpl_var_experiment%5B0%5D=quality_gate_idle&tpl_var_job_id%5B0%5D=14a4a147-8d23-4b12-8937-20767cb3dc2f&view=spans&from_ts=1747051397000&to_ts=1747051997000&live=false)                           |
| ➖   | tcp_syslog_to_blackhole                      | ingress throughput | -1.03    | [-1.09, -0.98] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Atcp_syslog_to_blackhole%20job_id%3A14a4a147-8d23-4b12-8937-20767cb3dc2f&agg_m=count&agg_m_source=base&agg_q=%40span.url&agg_q_source=base&agg_t=count&fromUser=true&index=single-machine-performance-target-logs&messageDisplay=inline&refresh_mode=paused&storage=hot&stream_sort=time%2Cdesc&top_n=100&top_o=top&viz=stream&x_missing=true&from_ts=1747044197000&to_ts=1747055597000&live=false)                                                                                                                                                                                                                                                                                                         |
| ➖   | uds_dogstatsd_to_api_cpu                     | % cpu utilization  | -1.88    | [-2.71, -1.04] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Auds_dogstatsd_to_api_cpu%20job_id%3A14a4a147-8d23-4b12-8937-20767cb3dc2f&agg_m=count&agg_m_source=base&agg_q=%40span.url&agg_q_source=base&agg_t=count&fromUser=true&index=single-machine-performance-target-logs&messageDisplay=inline&refresh_mode=paused&storage=hot&stream_sort=time%2Cdesc&top_n=100&top_o=top&viz=stream&x_missing=true&from_ts=1747044197000&to_ts=1747055597000&live=false)                                                                                                                                                                                                                                                                                                        |
</details>


<details>
<summary><h2>
Bounds Checks: ✅ Passed
</h2></summary>

| perf | experiment                                   | bounds_check_name  | replicates_passed | links                                                                                                                                                                                                                                                                                            |
|------|----------------------------------------------|--------------------|-------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| ✅   | docker_containers_cpu                        | simple_check_run   | 10/10             |                                                                                                                                                                                                                                                                                                  |
| ✅   | docker_containers_memory                     | memory_usage       | 10/10             |                                                                                                                                                                                                                                                                                                  |
| ✅   | docker_containers_memory                     | simple_check_run   | 10/10             |                                                                                                                                                                                                                                                                                                  |
| ✅   | file_to_blackhole_0ms_latency                | lost_bytes         | 10/10             |                                                                                                                                                                                                                                                                                                  |
| ✅   | file_to_blackhole_0ms_latency                | memory_usage       | 10/10             |                                                                                                                                                                                                                                                                                                  |
| ✅   | file_to_blackhole_0ms_latency_http1          | lost_bytes         | 10/10             |                                                                                                                                                                                                                                                                                                  |
| ✅   | file_to_blackhole_0ms_latency_http1          | memory_usage       | 10/10             |                                                                                                                                                                                                                                                                                                  |
| ✅   | file_to_blackhole_0ms_latency_http2          | lost_bytes         | 10/10             |                                                                                                                                                                                                                                                                                                  |
| ✅   | file_to_blackhole_0ms_latency_http2          | memory_usage       | 10/10             |                                                                                                                                                                                                                                                                                                  |
| ✅   | file_to_blackhole_1000ms_latency             | memory_usage       | 10/10             |                                                                                                                                                                                                                                                                                                  |
| ✅   | file_to_blackhole_1000ms_latency_linear_load | memory_usage       | 10/10             |                                                                                                                                                                                                                                                                                                  |
| ✅   | file_to_blackhole_100ms_latency              | lost_bytes         | 10/10             |                                                                                                                                                                                                                                                                                                  |
| ✅   | file_to_blackhole_100ms_latency              | memory_usage       | 10/10             |                                                                                                                                                                                                                                                                                                  |
| ✅   | file_to_blackhole_300ms_latency              | lost_bytes         | 10/10             |                                                                                                                                                                                                                                                                                                  |
| ✅   | file_to_blackhole_300ms_latency              | memory_usage       | 10/10             |                                                                                                                                                                                                                                                                                                  |
| ✅   | file_to_blackhole_500ms_latency              | lost_bytes         | 10/10             |                                                                                                                                                                                                                                                                                                  |
| ✅   | file_to_blackhole_500ms_latency              | memory_usage       | 10/10             |                                                                                                                                                                                                                                                                                                  |
| ✅   | quality_gate_idle                            | intake_connections | 10/10             | [bounds checks dashboard](https://app.datadoghq.com/dashboard/vz3-jd5-bdi?fromUser=true&refresh_mode=paused&tpl_var_experiment%5B0%5D=quality_gate_idle&tpl_var_job_id%5B0%5D=14a4a147-8d23-4b12-8937-20767cb3dc2f&view=spans&from_ts=1747051397000&to_ts=1747051997000&live=false)              |
| ✅   | quality_gate_idle                            | memory_usage       | 10/10             | [bounds checks dashboard](https://app.datadoghq.com/dashboard/vz3-jd5-bdi?fromUser=true&refresh_mode=paused&tpl_var_experiment%5B0%5D=quality_gate_idle&tpl_var_job_id%5B0%5D=14a4a147-8d23-4b12-8937-20767cb3dc2f&view=spans&from_ts=1747051397000&to_ts=1747051997000&live=false)              |
| ✅   | quality_gate_idle_all_features               | intake_connections | 10/10             | [bounds checks dashboard](https://app.datadoghq.com/dashboard/vz3-jd5-bdi?fromUser=true&refresh_mode=paused&tpl_var_experiment%5B0%5D=quality_gate_idle_all_features&tpl_var_job_id%5B0%5D=14a4a147-8d23-4b12-8937-20767cb3dc2f&view=spans&from_ts=1747051397000&to_ts=1747051997000&live=false) |
| ✅   | quality_gate_idle_all_features               | memory_usage       | 10/10             | [bounds checks dashboard](https://app.datadoghq.com/dashboard/vz3-jd5-bdi?fromUser=true&refresh_mode=paused&tpl_var_experiment%5B0%5D=quality_gate_idle_all_features&tpl_var_job_id%5B0%5D=14a4a147-8d23-4b12-8937-20767cb3dc2f&view=spans&from_ts=1747051397000&to_ts=1747051997000&live=false) |
| ✅   | quality_gate_logs                            | intake_connections | 10/10             | [bounds checks dashboard](https://app.datadoghq.com/dashboard/vz3-jd5-bdi?fromUser=true&refresh_mode=paused&tpl_var_experiment%5B0%5D=quality_gate_logs&tpl_var_job_id%5B0%5D=14a4a147-8d23-4b12-8937-20767cb3dc2f&view=spans&from_ts=1747051397000&to_ts=1747051997000&live=false)              |
| ✅   | quality_gate_logs                            | lost_bytes         | 10/10             | [bounds checks dashboard](https://app.datadoghq.com/dashboard/vz3-jd5-bdi?fromUser=true&refresh_mode=paused&tpl_var_experiment%5B0%5D=quality_gate_logs&tpl_var_job_id%5B0%5D=14a4a147-8d23-4b12-8937-20767cb3dc2f&view=spans&from_ts=1747051397000&to_ts=1747051997000&live=false)              |
| ✅   | quality_gate_logs                            | memory_usage       | 10/10             | [bounds checks dashboard](https://app.datadoghq.com/dashboard/vz3-jd5-bdi?fromUser=true&refresh_mode=paused&tpl_var_experiment%5B0%5D=quality_gate_logs&tpl_var_job_id%5B0%5D=14a4a147-8d23-4b12-8937-20767cb3dc2f&view=spans&from_ts=1747051397000&to_ts=1747051997000&live=false)              |
</details>


<details>
<summary><h2>
Explanation
</h2></summary>

**Confidence level:** 90.00%
**Effect size tolerance:** |Δ mean %| ≥ 5.00%

Performance changes are noted in the **perf** column of each table:

* ✅ = significantly better comparison variant performance
* ❌ = significantly worse comparison variant performance
* ➖ = no significant change in performance

A regression test is an A/B test of target performance in a repeatable rig, where "performance" is measured as "comparison variant minus baseline variant" for an optimization goal (e.g., ingress throughput). Due to intrinsic variability in measuring that goal, we can only estimate its mean value for each experiment; we report uncertainty in that value as a 90.00% confidence interval denoted "Δ mean % CI".

For each experiment, we decide whether a change in performance is a "regression" -- a change worth investigating further -- if all of the following criteria are true:

1. Its estimated |Δ mean %| ≥ 5.00%, indicating the change is big enough to merit a closer look.

2. Its 90.00% confidence interval "Δ mean % CI" does not contain zero, indicating that *if our statistical model is accurate*, there is at least a 90.00% chance there is a difference in performance between baseline and comparison variants.

3. Its configuration does not mark it "erratic".
</details>

## CI Pass/Fail Decision

✅ **Passed.** All Quality Gates passed.

- **quality_gate_idle**, bounds check **intake_connections**: 10/10 replicas passed. Gate passed.
- **quality_gate_idle**, bounds check **memory_usage**: 10/10 replicas passed. Gate passed.
- **quality_gate_idle_all_features**, bounds check **intake_connections**: 10/10 replicas passed. Gate passed.
- **quality_gate_idle_all_features**, bounds check **memory_usage**: 10/10 replicas passed. Gate passed.
- **quality_gate_logs**, bounds check **intake_connections**: 10/10 replicas passed. Gate passed.
- **quality_gate_logs**, bounds check **lost_bytes**: 10/10 replicas passed. Gate passed.
- **quality_gate_logs**, bounds check **memory_usage**: 10/10 replicas passed. Gate passed.
author_association: NONE
user: login: agent-platform-auto-pr[bot]
created_at: 2025-05-07T15:21:34Z
body: ## Static quality checks

✅ Please find below the results from static quality gates


<details>
<summary>Successful checks</summary>

### Info

|Result|Quality gate|On disk size|On disk size limit|On wire size|On wire size limit|
|----|----|----|----|----|----|
|✅|static_quality_gate_agent_deb_amd64|751.17 MiB|778.06 MiB|185.02 MiB|191.06 MiB|
|✅|static_quality_gate_agent_deb_amd64_fips|749.04 MiB|776.09 MiB|184.68 MiB|190.72 MiB|
|✅|static_quality_gate_agent_heroku_amd64|368.36 MiB|434.99 MiB|98.03 MiB|114.34 MiB|
|✅|static_quality_gate_agent_msi|969.17 MiB|978.45 MiB|146.86 MiB|151.65 MiB|
|✅|static_quality_gate_agent_rpm_amd64|751.2 MiB|778.06 MiB|186.89 MiB|193.42 MiB|
|✅|static_quality_gate_agent_rpm_amd64_fips|749.02 MiB|776.06 MiB|185.78 MiB|192.61 MiB|
|✅|static_quality_gate_agent_rpm_arm64|741.26 MiB|768.33 MiB|169.25 MiB|174.71 MiB|
|✅|static_quality_gate_agent_rpm_arm64_fips|739.38 MiB|766.55 MiB|168.05 MiB|173.92 MiB|
|✅|static_quality_gate_agent_suse_amd64|751.15 MiB|778.08 MiB|186.89 MiB|193.42 MiB|
|✅|static_quality_gate_agent_suse_amd64_fips|748.86 MiB|776.11 MiB|185.78 MiB|192.78 MiB|
|✅|static_quality_gate_agent_suse_arm64|741.36 MiB|768.31 MiB|169.25 MiB|174.71 MiB|
|✅|static_quality_gate_agent_suse_arm64_fips|739.36 MiB|766.5 MiB|168.05 MiB|173.92 MiB|
|✅|static_quality_gate_docker_agent_amd64|845.36 MiB|862.5 MiB|285.3 MiB|292.0 MiB|
|✅|static_quality_gate_docker_agent_arm64|858.76 MiB|876.0 MiB|272.1 MiB|278.3 MiB|
|✅|static_quality_gate_docker_agent_jmx_amd64|845.36 MiB|862.5 MiB|285.3 MiB|292.0 MiB|
|✅|static_quality_gate_docker_agent_jmx_arm64|858.76 MiB|876.63 MiB|272.1 MiB|278.4 MiB|
|✅|static_quality_gate_docker_agent_windows1809|845.36 MiB|862.5 MiB|285.3 MiB|292.0 MiB|
|✅|static_quality_gate_docker_agent_windows1809_core|845.36 MiB|862.5 MiB|285.3 MiB|292.0 MiB|
|✅|static_quality_gate_docker_agent_windows1809_core_jmx|845.36 MiB|862.5 MiB|285.3 MiB|292.0 MiB|
|✅|static_quality_gate_docker_agent_windows1809_jmx|845.36 MiB|862.5 MiB|285.3 MiB|292.0 MiB|
|✅|static_quality_gate_docker_agent_windows2022|845.36 MiB|862.5 MiB|285.3 MiB|292.0 MiB|
|✅|static_quality_gate_docker_agent_windows2022_core|845.36 MiB|862.5 MiB|285.3 MiB|292.0 MiB|
|✅|static_quality_gate_docker_agent_windows2022_core_jmx|845.36 MiB|862.5 MiB|285.3 MiB|292.0 MiB|
|✅|static_quality_gate_docker_agent_windows2022_jmx|845.36 MiB|862.5 MiB|285.3 MiB|292.0 MiB|
|✅|static_quality_gate_docker_cluster_agent_amd64|259.71 MiB|263.4 MiB|101.95 MiB|104.07 MiB|
|✅|static_quality_gate_docker_cluster_agent_arm64|275.69 MiB|279.38 MiB|96.91 MiB|98.95 MiB|
|✅|static_quality_gate_docker_cws_instrumentation_amd64|6.66 MiB|7.12 MiB|2.82 MiB|3.29 MiB|
|✅|static_quality_gate_docker_cws_instrumentation_arm64|6.44 MiB|6.92 MiB|2.6 MiB|3.07 MiB|
|✅|static_quality_gate_docker_dogstatsd_amd64|37.97 MiB|46.39 MiB|14.64 MiB|17.78 MiB|
|✅|static_quality_gate_docker_dogstatsd_arm64|36.89 MiB|45.05 MiB|13.73 MiB|16.65 MiB|
|✅|static_quality_gate_dogstatsd_deb_amd64|29.83 MiB|38.4 MiB|7.89 MiB|10.26 MiB|
|✅|static_quality_gate_dogstatsd_deb_arm64|28.71 MiB|36.98 MiB|6.87 MiB|8.96 MiB|
|✅|static_quality_gate_dogstatsd_rpm_amd64|29.83 MiB|38.4 MiB|7.9 MiB|10.27 MiB|
|✅|static_quality_gate_dogstatsd_suse_amd64|29.83 MiB|38.4 MiB|7.9 MiB|10.27 MiB|
|✅|static_quality_gate_iot_agent_deb_amd64|57.85 MiB|58.51 MiB|14.56 MiB|15.02 MiB|
|✅|static_quality_gate_iot_agent_deb_arm64|55.27 MiB|55.94 MiB|12.58 MiB|13.05 MiB|
|✅|static_quality_gate_iot_agent_deb_armhf|54.03 MiB|54.32 MiB|12.59 MiB|13.05 MiB|
|✅|static_quality_gate_iot_agent_rpm_amd64|57.85 MiB|58.51 MiB|14.58 MiB|15.04 MiB|
|✅|static_quality_gate_iot_agent_rpm_arm64|55.27 MiB|55.94 MiB|12.6 MiB|13.07 MiB|
|✅|static_quality_gate_iot_agent_suse_amd64|57.85 MiB|58.51 MiB|14.58 MiB|15.04 MiB|

</details>

author_association: CONTRIBUTOR
user: login: datadog-datadog-prod-us1[bot]
created_at: 2025-05-12T11:46:33Z
body: # Datadog Summary

<b>✅&nbsp;Code Quality</b>&nbsp;&nbsp;&nbsp;&nbsp;<b>✅&nbsp;Code Security</b>&nbsp;&nbsp;&nbsp;&nbsp;<b>✅&nbsp;Dependencies</b>&nbsp;&nbsp;&nbsp;&nbsp;<a target='_blank' href='https://app.datadoghq.com/ci/pipeline-executions?query=ci_level%3Ajob+%40ci.status%3Aerror+%40git.commit.sha%3A6112ee886d4b0ccfa290390b3d36d1d529e34b26'><b>❌&nbsp;Pipelines</b></a>



## Next Steps


The following jobs failed due to platform errors:
<details>
<summary><a href="https://app.datadoghq.com/ci/pipeline-executions?query=ci_level%3Apipeline+ci.pipeline_correlation_id%3A38de7b51b91b8568">DataDog/datadog-agent</a> / <a href="https://app.datadoghq.com/ci/pipeline-executions?query=ci_level%3Ajob+ci.job_correlation_id%3A8f063a1ce6a80f39">docker_build_ot_agent_standalone_amd64</a></summary>
<blockquote>Job failed: execution took longer than 30m0s seconds due to timeout.</blockquote>
</details>


---
Was this helpful? Give us [feedback](https://dd.enterprise.slack.com/archives/C01FA7FASUR)!

author_association: CONTRIBUTOR
user: login: gjulianm
created_at: 2025-05-13T08:23:55Z
body: /merge
author_association: CONTRIBUTOR
user: login: dd-devflow[bot]
created_at: 2025-05-13T08:23:58Z
body: <!-- "FeedbackWorkflowId":"53af93a7-f64f-47f5-9d7f-ac06c50c1084_36" -->
[View all feedbacks in Devflow UI.](https://mosaic.us1.ddbuild.io/devflow/logs/53af93a7-f64f-47f5-9d7f-ac06c50c1084_36)

`2025-05-13 08:23:58 UTC` :information_source: Start processing command `/merge`

---
`2025-05-13 08:24:04 UTC` :information_source: **MergeQueue:** pull request added to the queue

The expected merge time in `main` is approximately 58m (p90).

---
`2025-05-13 08:49:17 UTC` :information_source: **MergeQueue:** Readding this merge request to the queue because another merge request processed with yours failed. No action is needed from your side.

---
`2025-05-13 09:34:58 UTC` :information_source: **MergeQueue:** This merge request was merged

author_association: NONE