Repository: DataDog/datadog-agent
Pull request #36705: [AGNTLOG-176] Add compression override over config for epforwaders 
Author: login: DDuongNguyen
Labels: name: changelog/no-changelog
description: No changelog entry needed
name: qa/done
description: QA done before merge and regressions are covered by tests
name: long review
description: PR is complex, plan time to review it
name: team/agent-log-pipelines
Created: 2025-05-06T18:00:46Z | Merged: 2025-05-09T20:40:08Z

### What does this PR do?
This PR modifies the event platform forwarder to force GZIP compression for DBM (Database Monitoring) events, overriding any existing configuration. This change ensures that DBM events are always compressed using GZIP instead of ZSTD, as the DBM backend currently does not support ZSTD compression.

Changes include:
- Added `forcedCompression` field to `LogsConfigKeys` struct to support compression override
- Added `WithForcedCompression` method to `LogsConfigKeys` to set forced compression
- Modified `compressionKind` method to respect forced compression settings
- Updated all DBM pipeline descriptions to use GZIP compression
- Added appropriate debug logging for compression type changes

### Motivation
The DBM backend currently does not support ZSTD compression, but our default configuration uses ZSTD. 

This causes issues when DBM events are compressed with ZSTD and sent to the backend. 

By forcing GZIP compression specifically for DBM events (and leave options for other events if necessary), we ensure compatibility with the current backend capabilities while allowing other event types to continue using ZSTD compression as configured.

### Describe how you validated your changes
1. Manual Testing:
   - Configured agent with ZSTD compression
   - Verified DBM events are sent with GZIP compression despite ZSTD configuration
   - Verified non-DBM events still use configured compression type
   - Monitored debug logs to confirm correct compression type is being used
   - Verified DBM backend successfully processes the GZIP compressed events

2. Validation Steps:
   ```bash
   # Run the agent with debug logging enabled
   DD_LOG_LEVEL=debug ./bin/agent/agent run

   # Verify compression type in logs
   # Should see "Initialized event platform forwarder pipeline .... eventType=dbm-* compression_kind=gzip, compression_level=6"

   # Instead of "Initialized event platform forwarder pipeline .... eventType=dbm-* compression_kind=zstd, compression_level=1"
   ```

### Possible Drawbacks / Trade-offs

### Additional Notes


Diff:
diff --git a/comp/forwarder/eventplatform/eventplatformimpl/epforwarder.go b/comp/forwarder/eventplatform/eventplatformimpl/epforwarder.go
index 3509807fd117..fcc8727d8af9 100644
--- a/comp/forwarder/eventplatform/eventplatformimpl/epforwarder.go
+++ b/comp/forwarder/eventplatform/eventplatformimpl/epforwarder.go
@@ -66,7 +66,9 @@ var passthroughPipelineDescs = []passthroughPipelineDesc{
 		defaultBatchMaxContentSize:    10e6,
 		defaultBatchMaxSize:           pkgconfigsetup.DefaultBatchMaxSize,
 		// High input chan size is needed to handle high number of DBM events being flushed by DBM integrations
-		defaultInputChanSize: 500,
+		defaultInputChanSize:  500,
+		forceCompressionKind:  config.GzipCompressionKind,
+		forceCompressionLevel: config.GzipCompressionLevel,
 	},
 	{
 		eventType:              eventTypeDBMMetrics,
@@ -80,7 +82,9 @@ var passthroughPipelineDescs = []passthroughPipelineDesc{
 		defaultBatchMaxContentSize:    20e6,
 		defaultBatchMaxSize:           pkgconfigsetup.DefaultBatchMaxSize,
 		// High input chan size is needed to handle high number of DBM events being flushed by DBM integrations
-		defaultInputChanSize: 500,
+		defaultInputChanSize:  500,
+		forceCompressionKind:  config.GzipCompressionKind,
+		forceCompressionLevel: config.GzipCompressionLevel,
 	},
 	{
 		eventType:   eventTypeDBMMetadata,
@@ -97,7 +101,9 @@ var passthroughPipelineDescs = []passthroughPipelineDesc{
 		defaultBatchMaxContentSize:    20e6,
 		defaultBatchMaxSize:           pkgconfigsetup.DefaultBatchMaxSize,
 		// High input chan size is needed to handle high number of DBM events being flushed by DBM integrations
-		defaultInputChanSize: 500,
+		defaultInputChanSize:  500,
+		forceCompressionKind:  config.GzipCompressionKind,
+		forceCompressionLevel: config.GzipCompressionLevel,
 	},
 	{
 		eventType:              eventTypeDBMActivity,
@@ -111,7 +117,9 @@ var passthroughPipelineDescs = []passthroughPipelineDesc{
 		defaultBatchMaxContentSize:    20e6,
 		defaultBatchMaxSize:           pkgconfigsetup.DefaultBatchMaxSize,
 		// High input chan size is needed to handle high number of DBM events being flushed by DBM integrations
-		defaultInputChanSize: 500,
+		defaultInputChanSize:  500,
+		forceCompressionKind:  config.GzipCompressionKind,
+		forceCompressionLevel: config.GzipCompressionLevel,
 	},
 	{
 		eventType:                     eventplatform.EventTypeNetworkDevicesMetadata,
@@ -374,6 +382,8 @@ type passthroughPipelineDesc struct {
 	defaultBatchMaxContentSize    int
 	defaultBatchMaxSize           int
 	defaultInputChanSize          int
+	forceCompressionKind          string
+	forceCompressionLevel         int
 }
 
 // newHTTPPassthroughPipeline creates a new HTTP-only event platform pipeline that sends messages directly to intake
@@ -386,15 +396,19 @@ func newHTTPPassthroughPipeline(
 	destinationsContext *client.DestinationsContext,
 	pipelineID int,
 ) (p *passthroughPipeline, err error) {
-
 	configKeys := config.NewLogsConfigKeys(desc.endpointsConfigPrefix, coreConfig)
-	endpoints, err := config.BuildHTTPEndpointsWithConfig(
+	compressionOptions := config.EndpointCompressionOptions{
+		CompressionKind:  desc.forceCompressionKind,
+		CompressionLevel: desc.forceCompressionLevel,
+	}
+	endpoints, err := config.BuildHTTPEndpointsWithCompressionOverride(
 		coreConfig,
 		configKeys,
 		desc.hostnameEndpointPrefix,
 		desc.intakeTrackType,
 		config.DefaultIntakeProtocol,
 		config.DefaultIntakeOrigin,
+		compressionOptions,
 	)
 	if err != nil {
 		return nil, err
@@ -461,8 +475,16 @@ func newHTTPPassthroughPipeline(
 			pipelineMonitor)
 	}
 
-	log.Debugf("Initialized event platform forwarder pipeline. eventType=%s mainHosts=%s additionalHosts=%s batch_max_concurrent_send=%d batch_max_content_size=%d batch_max_size=%d, input_chan_size=%d",
-		desc.eventType, joinHosts(endpoints.GetReliableEndpoints()), joinHosts(endpoints.GetUnReliableEndpoints()), endpoints.BatchMaxConcurrentSend, endpoints.BatchMaxContentSize, endpoints.BatchMaxSize, endpoints.InputChanSize)
+	log.Debugf("Initialized event platform forwarder pipeline. eventType=%s mainHosts=%s additionalHosts=%s batch_max_concurrent_send=%d batch_max_content_size=%d batch_max_size=%d, input_chan_size=%d, compression_kind=%s, compression_level=%d",
+		desc.eventType,
+		joinHosts(endpoints.GetReliableEndpoints()),
+		joinHosts(endpoints.GetUnReliableEndpoints()),
+		endpoints.BatchMaxConcurrentSend,
+		endpoints.BatchMaxContentSize,
+		endpoints.BatchMaxSize,
+		endpoints.InputChanSize,
+		endpoints.Main.CompressionKind,
+		endpoints.Main.CompressionLevel)
 	return &passthroughPipeline{
 		sender:                senderImpl,
 		strategy:              strategy,
diff --git a/comp/logs/agent/config/config.go b/comp/logs/agent/config/config.go
index a14c6760c337..b43734bd87e6 100644
--- a/comp/logs/agent/config/config.go
+++ b/comp/logs/agent/config/config.go
@@ -191,8 +191,18 @@ func BuildHTTPEndpointsWithVectorOverride(coreConfig pkgconfigmodel.Reader, inta
 	return BuildHTTPEndpointsWithConfig(coreConfig, defaultLogsConfigKeysWithVectorOverride(coreConfig), httpEndpointPrefix, intakeTrackType, intakeProtocol, intakeOrigin)
 }
 
-// BuildHTTPEndpointsWithConfig uses two arguments that instructs it how to access configuration parameters, then returns the HTTP endpoints to send logs to. This function is able to default to the 'classic' BuildHTTPEndpoints() w ldHTTPEndpointsWithConfigdefault variables logsConfigDefaultKeys and httpEndpointPrefix
+// BuildHTTPEndpointsWithCompressionOverride returns the HTTP endpoints to send logs to with compression options.
+func BuildHTTPEndpointsWithCompressionOverride(coreConfig pkgconfigmodel.Reader, logsConfig *LogsConfigKeys, endpointPrefix string, intakeTrackType IntakeTrackType, intakeProtocol IntakeProtocol, intakeOrigin IntakeOrigin, compressionOptions EndpointCompressionOptions) (*Endpoints, error) {
+	return buildHTTPEndpoints(coreConfig, logsConfig, endpointPrefix, intakeTrackType, intakeProtocol, intakeOrigin, compressionOptions)
+}
+
+// BuildHTTPEndpointsWithConfig returns the HTTP endpoints to send logs to.
 func BuildHTTPEndpointsWithConfig(coreConfig pkgconfigmodel.Reader, logsConfig *LogsConfigKeys, endpointPrefix string, intakeTrackType IntakeTrackType, intakeProtocol IntakeProtocol, intakeOrigin IntakeOrigin) (*Endpoints, error) {
+	return buildHTTPEndpoints(coreConfig, logsConfig, endpointPrefix, intakeTrackType, intakeProtocol, intakeOrigin, EndpointCompressionOptions{})
+}
+
+// buildHTTPEndpoints uses two arguments that instructs it how to access configuration parameters, then returns the HTTP endpoints to send logs to. This function is able to default to the 'classic' BuildHTTPEndpoints() w ldHTTPEndpointsWithConfigdefault variables logsConfigDefaultKeys and httpEndpointPrefix
+func buildHTTPEndpoints(coreConfig pkgconfigmodel.Reader, logsConfig *LogsConfigKeys, endpointPrefix string, intakeTrackType IntakeTrackType, intakeProtocol IntakeProtocol, intakeOrigin IntakeOrigin, compressionOptions EndpointCompressionOptions) (*Endpoints, error) {
 	// Provide default values for legacy settings when the configuration key does not exist
 	defaultNoSSL := logsConfig.logsNoSSL()
 
@@ -207,6 +217,11 @@ func BuildHTTPEndpointsWithConfig(coreConfig pkgconfigmodel.Reader, logsConfig *
 		main.Version = EPIntakeVersion1
 	}
 
+	if compressionOptions.CompressionKind != "" {
+		main.CompressionKind = compressionOptions.CompressionKind
+		main.CompressionLevel = compressionOptions.CompressionLevel
+	}
+
 	if vectorURL, vectorURLDefined := logsConfig.getObsPipelineURL(); logsConfig.obsPipelineWorkerEnabled() && vectorURLDefined {
 		host, port, useSSL, err := parseAddressWithScheme(vectorURL, defaultNoSSL, parseAddress)
 		if err != nil {
@@ -252,6 +267,7 @@ func BuildHTTPEndpointsWithConfig(coreConfig pkgconfigmodel.Reader, logsConfig *
 		e := NewEndpoint(coreConfig.GetString("multi_region_failover.api_key"), "multi_region_failover.api_key", mrfHost, mrfPort, mrfUseSSL)
 		e.IsMRF = true
 		e.UseCompression = main.UseCompression
+		e.CompressionKind = main.CompressionKind
 		e.CompressionLevel = main.CompressionLevel
 		e.BackoffBase = main.BackoffBase
 		e.BackoffMax = main.BackoffMax
diff --git a/comp/logs/agent/config/config_keys.go b/comp/logs/agent/config/config_keys.go
index 066dbb506229..edef33cb7f2e 100644
--- a/comp/logs/agent/config/config_keys.go
+++ b/comp/logs/agent/config/config_keys.go
@@ -131,11 +131,6 @@ func (l *LogsConfigKeys) compressionKind() string {
 	}
 
 	if compressionKind == ZstdCompressionKind || compressionKind == GzipCompressionKind {
-		pipelineName := "Main logs agent pipeline"
-		if !strings.Contains(l.prefix, "logs_config") {
-			pipelineName = "Pipeline " + l.prefix
-		}
-		log.Debugf("%s is using compression: %s", pipelineName, compressionKind)
 		return compressionKind
 	}
 
@@ -146,12 +141,16 @@ func (l *LogsConfigKeys) compressionKind() string {
 func (l *LogsConfigKeys) compressionLevel() int {
 	if l.compressionKind() == ZstdCompressionKind {
 		level := l.getConfig().GetInt(l.getConfigKey("zstd_compression_level"))
-		log.Debugf("Pipeline %s is using zstd compression level: %d", l.prefix, level)
+		if strings.HasPrefix(l.prefix, "logs_config.") {
+			log.Debugf("Logs pipeline is using compression zstd at level: %d", level)
+		}
 		return level
 	}
 
 	level := l.getConfig().GetInt(l.getConfigKey("compression_level"))
-	log.Debugf("Pipeline %s is using compression level: %d", l.prefix, level)
+	if strings.HasPrefix(l.prefix, "logs_config.") {
+		log.Debugf("Logs pipeline is using compression gzip atlevel: %d", level)
+	}
 	return level
 }
 
diff --git a/comp/logs/agent/config/endpoints.go b/comp/logs/agent/config/endpoints.go
index 47ee9dae7ccc..5e8f2805932a 100644
--- a/comp/logs/agent/config/endpoints.go
+++ b/comp/logs/agent/config/endpoints.go
@@ -9,11 +9,12 @@ import (
 	"fmt"
 	"time"
 
+	"go.uber.org/atomic"
+
 	pkgconfigsetup "github.com/DataDog/datadog-agent/pkg/config/setup"
 	pkgconfigutils "github.com/DataDog/datadog-agent/pkg/config/utils"
 	"github.com/DataDog/datadog-agent/pkg/util/log"
 	"github.com/DataDog/datadog-agent/pkg/util/scrubber"
-	"go.uber.org/atomic"
 )
 
 // EPIntakeVersion is the events platform intake API version
@@ -83,6 +84,12 @@ type unmarshalEndpoint struct {
 	Endpoint `mapstructure:",squash"`
 }
 
+// EndpointCompressionOptions is the compression options for the endpoint
+type EndpointCompressionOptions struct {
+	CompressionKind  string
+	CompressionLevel int
+}
+
 // NewEndpoint returns a new Endpoint with the minimal field initialized.
 func NewEndpoint(apiKey string, apiKeyConfigPath string, host string, port int, useSSL bool) Endpoint {
 	apiKey = pkgconfigutils.SanitizeAPIKey(apiKey)
@@ -115,6 +122,7 @@ func newTCPEndpoint(logsConfig *LogsConfigKeys) Endpoint {
 // newHTTPEndpoint returns a new HTTP Endpoint based on LogsConfigKeys The endpoint is by default reliable and will use
 // the settings related to HTTP from the configuration (compression, Backoff, recovery, ...).
 func newHTTPEndpoint(logsConfig *LogsConfigKeys) Endpoint {
+
 	apiKey, configPath := logsConfig.getMainAPIKey()
 	e := Endpoint{
 		apiKey:                  atomic.NewString(apiKey),
@@ -183,8 +191,8 @@ func loadHTTPAdditionalEndpoints(main Endpoint, l *LogsConfigKeys, intakeTrackTy
 
 		newE.isAdditionalEndpoint = true
 		newE.additionalEndpointsIdx = idx
-
 		newE.UseCompression = main.UseCompression
+		newE.CompressionKind = main.CompressionKind
 		newE.CompressionLevel = main.CompressionLevel
 		newE.ProxyAddress = e.ProxyAddress
 		newE.isReliable = e.IsReliable == nil || *e.IsReliable
diff --git a/comp/logs/agent/config/endpoints_test.go b/comp/logs/agent/config/endpoints_test.go
index 1016f1279885..4ac80ce3c3f7 100644
--- a/comp/logs/agent/config/endpoints_test.go
+++ b/comp/logs/agent/config/endpoints_test.go
@@ -830,6 +830,7 @@ func (suite *EndpointsTestSuite) TestloadHTTPAdditionalEndpoints() {
 			"is_reliable": false
 		}]`
 	suite.config.SetWithoutSource("logs_config.additional_endpoints", jsonString)
+	suite.config.SetWithoutSource("logs_config.compression_kind", "gzip") // has to set explicit compression kind to avoid fallback to defaults compression configs when additional endpoints are present
 
 	expected1 := Endpoint{
 		apiKey:                 atomic.NewString("apiKey2"),
@@ -883,52 +884,61 @@ func (suite *EndpointsTestSuite) TestloadHTTPAdditionalEndpoints() {
 }
 
 func (suite *EndpointsTestSuite) TestCompressionKindWithAdditionalEndpoints() {
-	// Test on logs_config endpoints
-	logsConfig := defaultLogsConfigKeys(suite.config)
-
-	// Test compression kind when no additional endpoints are present
-	suite.config.SetWithoutSource("logs_config.additional_endpoints", nil)
-	suite.Equal("zstd", logsConfig.compressionKind())
+	tests := []struct {
+		name                string
+		additionalEndpoints string
+		compressionKind     string
+		expectedMain        EndpointCompressionOptions
+	}{
+		{
+			name:                "No additional endpoints - use default",
+			additionalEndpoints: "",
+			expectedMain: EndpointCompressionOptions{
+				CompressionKind:  ZstdCompressionKind,
+				CompressionLevel: ZstdCompressionLevel,
+			},
+		},
+		{
+			name:                "Additional endpoints without explicit compression - fallback to gzip",
+			additionalEndpoints: `[{"api_key":"foo","host":"bar"}]`,
+			expectedMain: EndpointCompressionOptions{
+				CompressionKind:  GzipCompressionKind,
+				CompressionLevel: GzipCompressionLevel,
+			},
+		},
+		{
+			name:                "Additional endpoints with explicit compression - use configured",
+			additionalEndpoints: `[{"api_key":"foo","host":"bar"}]`,
+			compressionKind:     "zstd",
+			expectedMain: EndpointCompressionOptions{
+				CompressionKind:  ZstdCompressionKind,
+				CompressionLevel: ZstdCompressionLevel,
+			},
+		},
+	}
 
-	// Test compression kind when additional endpoints are present
-	suite.config.SetWithoutSource("logs_config.additional_endpoints", `[{"api_key":"foo","host":"bar"}]`)
-	suite.Equal("gzip", logsConfig.compressionKind())
+	for _, tt := range tests {
+		suite.Run(tt.name, func() {
+			logsConfig := defaultLogsConfigKeys(suite.config)
 
-	// Test compression kind when additional endpoints are present and compression_kind is set
-	suite.config.SetWithoutSource("logs_config.additional_endpoints", `[{"api_key":"foo","host":"bar"}]`)
-	suite.config.SetWithoutSource("logs_config.compression_kind", "zstd")
-	suite.Equal("zstd", logsConfig.compressionKind())
-
-	// Test invalid compression kind when additional endpoints are present and compression_kind is explicitly configured
-	suite.config.SetWithoutSource("logs_config.additional_endpoints", `[{"api_key":"foo","host":"bar"}]`)
-	suite.config.SetWithoutSource("logs_config.compression_kind", "meow")
-	suite.Equal("zstd", logsConfig.compressionKind())
-
-	// Test on other endpoint
-	dbmConfig := NewLogsConfigKeys("database_monitoring.metrics.", suite.config)
-
-	// Test compression kind when no additional endpoints are present
-	suite.config.SetWithoutSource("database_monitoring.metrics.compression_kind", "gzip")
-	suite.Equal("gzip", dbmConfig.compressionKind())
-
-	// Test compression kind when additional endpoints are present
-	suite.config.SetWithoutSource("logs_config.additional_endpoints", `[{"api_key":"foo","host":"bar"}]`)
-	suite.Equal("gzip", dbmConfig.compressionKind())
-
-	// Test compression kind when additional endpoints are present and compression_kind is set for other pipeline
-	suite.config.SetWithoutSource("database_monitoring.metrics.additional_endpoints", `[{"api_key":"foo","host":"bar"}]`)
-	suite.config.SetWithoutSource("database_monitoring.metrics.compression_kind", "zstd")
-	suite.Equal("zstd", dbmConfig.compressionKind())
-
-	// Test compression kind when global additional endpoints are present and compression_kind is set for other pipeline
-	suite.config.SetWithoutSource("logs_config.additional_endpoints", `[{"api_key":"foo","host":"bar"}]`)
-	suite.config.SetWithoutSource("database_monitoring.metrics.compression_kind", "gzip")
-	suite.Equal("gzip", dbmConfig.compressionKind())
-
-	// Test invalid compression kind when additional endpoints are present and compression_kind is explicitly configured for other pipeline
-	suite.config.SetWithoutSource("logs_config.additional_endpoints", `[{"api_key":"foo","host":"bar"}]`)
-	suite.config.SetWithoutSource("database_monitoring.metrics.compression_kind", "meow")
-	suite.Equal("zstd", dbmConfig.compressionKind())
+			// Setup test config
+			if tt.additionalEndpoints != "" {
+				suite.config.SetWithoutSource("logs_config.additional_endpoints", tt.additionalEndpoints)
+			}
+			if tt.compressionKind != "" {
+				suite.config.SetWithoutSource("logs_config.compression_kind", tt.compressionKind)
+			}
+
+			endpoints, err := BuildHTTPEndpointsWithConfig(
+				suite.config,
+				logsConfig,
+				"", "", "", "",
+			)
+			suite.Nil(err)
+			suite.Equal(tt.expectedMain.CompressionKind, endpoints.Main.CompressionKind)
+			suite.Equal(tt.expectedMain.CompressionLevel, endpoints.Main.CompressionLevel)
+		})
+	}
 }
 
 func TestEndpointsTestSuite(t *testing.T) {


Reviews:
user: login: ddrthall
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-06T18:31:46Z
user: login: DDuongNguyen
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-06T21:03:15Z
user: login: ddrthall
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-08T16:49:25Z
user: login: ddrthall
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-08T17:17:48Z
user: login: ddrthall
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-08T19:52:33Z
user: login: ddrthall
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-08T19:52:45Z
user: login: ddrthall
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-08T19:52:52Z
user: login: ddrthall
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-09T14:24:59Z
user: login: ddrthall
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-09T14:33:04Z
user: login: ddrthall
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-09T14:38:39Z
user: login: ddrthall
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-09T15:13:05Z
user: login: ddrthall
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-09T17:23:19Z
user: login: ddrthall
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-09T17:30:11Z

Review comments:
diff_hunk: @@ -388,6 +393,9 @@ func newHTTPPassthroughPipeline(
 ) (p *passthroughPipeline, err error) {
 
 	configKeys := config.NewLogsConfigKeys(desc.endpointsConfigPrefix, coreConfig)
+	if desc.forceCompressionKind != "" {
path: comp/forwarder/eventplatform/eventplatformimpl/epforwarder.go
user: login: ddrthall
body: Instead of extending the config entity for third way to customize values coming in from desc, would it make sense to either mimic desc.BatchMaxConcurrentSend's customization flow or desc.intakeTrackType's usage?
created_at: 2025-05-06T18:31:46Z
author_association: CONTRIBUTOR
diff_hunk: @@ -388,6 +393,9 @@ func newHTTPPassthroughPipeline(
 ) (p *passthroughPipeline, err error) {
 
 	configKeys := config.NewLogsConfigKeys(desc.endpointsConfigPrefix, coreConfig)
+	if desc.forceCompressionKind != "" {
path: comp/forwarder/eventplatform/eventplatformimpl/epforwarder.go
user: login: DDuongNguyen
body: I made some updates and decided to keep the `WithForcedCompression` flow since the pipeline still needs to go through `config_keys.go`. Rather than removing it, I tweaked it to return "none" when forced compression is set (since we'll override the actual compression settings later in `newHTTPPassthroughPipeline` anyway).

Let me know if you think we should remove this path entirely since the compression settings will be overridden.
created_at: 2025-05-06T21:03:15Z
author_association: CONTRIBUTOR
diff_hunk: @@ -118,7 +118,10 @@ func (l *LogsConfigKeys) devModeUseProto() bool {
 	return l.getConfig().GetBool(l.getConfigKey("dev_mode_use_proto"))
 }
 
-func (l *LogsConfigKeys) compressionKind() string {
+func (l *LogsConfigKeys) compressionKind(forceCompressionKind string) string {
path: comp/logs/agent/config/config_keys.go
user: login: ddrthall
body: I'm still of the opinion that we don't want the config_keys entity to care about anything but config management. All other overrides of all other config values are handled in other locations. 
created_at: 2025-05-08T16:49:25Z
author_association: CONTRIBUTOR
diff_hunk: @@ -186,11 +195,16 @@ func BuildHTTPEndpointsWithVectorOverride(coreConfig pkgconfigmodel.Reader, inta
 }
 
 // BuildHTTPEndpointsWithConfig uses two arguments that instructs it how to access configuration parameters, then returns the HTTP endpoints to send logs to. This function is able to default to the 'classic' BuildHTTPEndpoints() w ldHTTPEndpointsWithConfigdefault variables logsConfigDefaultKeys and httpEndpointPrefix
-func BuildHTTPEndpointsWithConfig(coreConfig pkgconfigmodel.Reader, logsConfig *LogsConfigKeys, endpointPrefix string, intakeTrackType IntakeTrackType, intakeProtocol IntakeProtocol, intakeOrigin IntakeOrigin) (*Endpoints, error) {
+func BuildHTTPEndpointsWithConfig(coreConfig pkgconfigmodel.Reader, logsConfig *LogsConfigKeys, endpointPrefix string, intakeTrackType IntakeTrackType, intakeProtocol IntakeProtocol, intakeOrigin IntakeOrigin, opts ...EndpointCompressionOptionFunc) (*Endpoints, error) {
path: comp/logs/agent/config/config.go
user: login: ddrthall
body: While variadic options can be quite powerful in certain contexts, go strongly encourages handing cases like this with default values in structs or by creating multiple functions with different signatures to deal with default arguments. I don't think that this is cleaner than having epforwarder having a desc.EndpointCompressionOption that gets passed in directly.
created_at: 2025-05-08T17:17:48Z
author_association: CONTRIBUTOR
diff_hunk: @@ -440,7 +454,7 @@ func newHTTPPassthroughPipeline(
 	var encoder compressioncommon.Compressor
 	encoder = compressor.NewCompressor("none", 0)
 	if endpoints.Main.UseCompression {
-		encoder = compressor.NewCompressor(endpoints.Main.CompressionKind, endpoints.Main.CompressionLevel)
+		encoder = compressor.NewCompressor(endpoints.CompressionKind, endpoints.CompressionLevel)
path: comp/forwarder/eventplatform/eventplatformimpl/epforwarder.go
user: login: ddrthall
body: Neither of these values seem to be set correctly, we appear to still be providing the defaults on endpoints.Main.
created_at: 2025-05-08T19:52:33Z
author_association: CONTRIBUTOR
diff_hunk: @@ -177,20 +177,20 @@ func buildTCPEndpoints(coreConfig pkgconfigmodel.Reader, logsConfig *LogsConfigK
 
 // BuildHTTPEndpoints returns the HTTP endpoints to send logs to.
 func BuildHTTPEndpoints(coreConfig pkgconfigmodel.Reader, intakeTrackType IntakeTrackType, intakeProtocol IntakeProtocol, intakeOrigin IntakeOrigin) (*Endpoints, error) {
-	return BuildHTTPEndpointsWithConfig(coreConfig, defaultLogsConfigKeys(coreConfig), httpEndpointPrefix, intakeTrackType, intakeProtocol, intakeOrigin)
+	return BuildHTTPEndpointsWithConfig(coreConfig, defaultLogsConfigKeys(coreConfig), httpEndpointPrefix, intakeTrackType, intakeProtocol, intakeOrigin, EndpointCompressionOptions{})
 }
 
 // BuildHTTPEndpointsWithVectorOverride returns the HTTP endpoints to send logs to.
 func BuildHTTPEndpointsWithVectorOverride(coreConfig pkgconfigmodel.Reader, intakeTrackType IntakeTrackType, intakeProtocol IntakeProtocol, intakeOrigin IntakeOrigin) (*Endpoints, error) {
-	return BuildHTTPEndpointsWithConfig(coreConfig, defaultLogsConfigKeysWithVectorOverride(coreConfig), httpEndpointPrefix, intakeTrackType, intakeProtocol, intakeOrigin)
+	return BuildHTTPEndpointsWithConfig(coreConfig, defaultLogsConfigKeysWithVectorOverride(coreConfig), httpEndpointPrefix, intakeTrackType, intakeProtocol, intakeOrigin, EndpointCompressionOptions{})
 }
 
 // BuildHTTPEndpointsWithConfig uses two arguments that instructs it how to access configuration parameters, then returns the HTTP endpoints to send logs to. This function is able to default to the 'classic' BuildHTTPEndpoints() w ldHTTPEndpointsWithConfigdefault variables logsConfigDefaultKeys and httpEndpointPrefix
-func BuildHTTPEndpointsWithConfig(coreConfig pkgconfigmodel.Reader, logsConfig *LogsConfigKeys, endpointPrefix string, intakeTrackType IntakeTrackType, intakeProtocol IntakeProtocol, intakeOrigin IntakeOrigin) (*Endpoints, error) {
+func BuildHTTPEndpointsWithConfig(coreConfig pkgconfigmodel.Reader, logsConfig *LogsConfigKeys, endpointPrefix string, intakeTrackType IntakeTrackType, intakeProtocol IntakeProtocol, intakeOrigin IntakeOrigin, compressionOptions EndpointCompressionOptions) (*Endpoints, error) {
 	// Provide default values for legacy settings when the configuration key does not exist
 	defaultNoSSL := logsConfig.logsNoSSL()
 
-	main := newHTTPEndpoint(logsConfig)
+	main := newHTTPEndpoint(logsConfig, compressionOptions)
path: comp/logs/agent/config/config.go
user: login: ddrthall
body: Nit: Any reason we pass down the compressionOptions instead of overriding the constructed main below like we do with intakeTrackType?
created_at: 2025-05-08T19:52:45Z
author_association: CONTRIBUTOR
diff_hunk: @@ -66,7 +66,9 @@ var passthroughPipelineDescs = []passthroughPipelineDesc{
 		defaultBatchMaxContentSize:    10e6,
 		defaultBatchMaxSize:           pkgconfigsetup.DefaultBatchMaxSize,
 		// High input chan size is needed to handle high number of DBM events being flushed by DBM integrations
-		defaultInputChanSize: 500,
+		defaultInputChanSize:  500,
+		forceCompressionKind:  config.GzipCompressionKind,
path: comp/forwarder/eventplatform/eventplatformimpl/epforwarder.go
user: login: ddrthall
body: Excessively ignorable nit: We can bake the EndpointCompressionType here instead of having a string/int that need translation. 
created_at: 2025-05-08T19:52:52Z
author_association: CONTRIBUTOR
diff_hunk: @@ -177,15 +184,27 @@ func loadTCPAdditionalEndpoints(main Endpoint, l *LogsConfigKeys) []Endpoint {
 func loadHTTPAdditionalEndpoints(main Endpoint, l *LogsConfigKeys, intakeTrackType IntakeTrackType, intakeProtocol IntakeProtocol, intakeOrigin IntakeOrigin) []Endpoint {
 	additionals, configKeyUsed := l.getAdditionalEndpoints()
 
+	// Check if we need gzip compatibility for additional endpoints
+	needsGzipCompatibility := len(additionals) > 0 && !l.config.IsConfigured(l.getConfigKey("compression_kind"))
path: comp/logs/agent/config/endpoints.go
user: login: ddrthall
body: Do we need this logic? My understanding is that main will already have this built in. 
created_at: 2025-05-09T14:24:59Z
author_association: CONTRIBUTOR
diff_hunk: @@ -177,16 +177,16 @@ func buildTCPEndpoints(coreConfig pkgconfigmodel.Reader, logsConfig *LogsConfigK
 
 // BuildHTTPEndpoints returns the HTTP endpoints to send logs to.
 func BuildHTTPEndpoints(coreConfig pkgconfigmodel.Reader, intakeTrackType IntakeTrackType, intakeProtocol IntakeProtocol, intakeOrigin IntakeOrigin) (*Endpoints, error) {
-	return BuildHTTPEndpointsWithConfig(coreConfig, defaultLogsConfigKeys(coreConfig), httpEndpointPrefix, intakeTrackType, intakeProtocol, intakeOrigin)
+	return BuildHTTPEndpointsWithConfig(coreConfig, defaultLogsConfigKeys(coreConfig), httpEndpointPrefix, intakeTrackType, intakeProtocol, intakeOrigin, EndpointCompressionOptions{})
 }
 
 // BuildHTTPEndpointsWithVectorOverride returns the HTTP endpoints to send logs to.
 func BuildHTTPEndpointsWithVectorOverride(coreConfig pkgconfigmodel.Reader, intakeTrackType IntakeTrackType, intakeProtocol IntakeProtocol, intakeOrigin IntakeOrigin) (*Endpoints, error) {
-	return BuildHTTPEndpointsWithConfig(coreConfig, defaultLogsConfigKeysWithVectorOverride(coreConfig), httpEndpointPrefix, intakeTrackType, intakeProtocol, intakeOrigin)
+	return BuildHTTPEndpointsWithConfig(coreConfig, defaultLogsConfigKeysWithVectorOverride(coreConfig), httpEndpointPrefix, intakeTrackType, intakeProtocol, intakeOrigin, EndpointCompressionOptions{})
 }
 
 // BuildHTTPEndpointsWithConfig uses two arguments that instructs it how to access configuration parameters, then returns the HTTP endpoints to send logs to. This function is able to default to the 'classic' BuildHTTPEndpoints() w ldHTTPEndpointsWithConfigdefault variables logsConfigDefaultKeys and httpEndpointPrefix
-func BuildHTTPEndpointsWithConfig(coreConfig pkgconfigmodel.Reader, logsConfig *LogsConfigKeys, endpointPrefix string, intakeTrackType IntakeTrackType, intakeProtocol IntakeProtocol, intakeOrigin IntakeOrigin) (*Endpoints, error) {
+func BuildHTTPEndpointsWithConfig(coreConfig pkgconfigmodel.Reader, logsConfig *LogsConfigKeys, endpointPrefix string, intakeTrackType IntakeTrackType, intakeProtocol IntakeProtocol, intakeOrigin IntakeOrigin, compressionOptions EndpointCompressionOptions) (*Endpoints, error) {
path: comp/logs/agent/config/config.go
user: login: ddrthall
body: Instead of overriding the public interface (which requires changing a lot of end users), we can add a new public function with a different signature and have both that new function and BuildHTTPEndpointWithConfig call the same private function. For example:
```
BuildHTTPEndpointsWithCompressionOverride(..., compression *EndpointCompression) {
     buildHTTPEndpoints(..., compression)
}
BuildHTTPEndpointsWithConfig(...) {
    buildHTTPEndpoints(..., nil)
}

buildHTTPEndpoints(..., compression *EndpointCompression) {
// all of the actual logic
}
```
created_at: 2025-05-09T14:33:04Z
author_association: CONTRIBUTOR
diff_hunk: @@ -201,6 +201,11 @@ func BuildHTTPEndpointsWithConfig(coreConfig pkgconfigmodel.Reader, logsConfig *
 		main.Version = EPIntakeVersion1
 	}
 
+	if compressionOptions.CompressionKind != "" {
+		main.CompressionKind = compressionOptions.CompressionKind
+		main.CompressionLevel = compressionOptions.CompressionLevel
path: comp/logs/agent/config/config.go
user: login: ddrthall
body: We probably want to carry this main setting over to the mrf endpoint creation below as well. 
created_at: 2025-05-09T14:38:39Z
author_association: CONTRIBUTOR
diff_hunk: @@ -329,6 +348,8 @@ type Endpoints struct {
 	BatchMaxSize           int
 	BatchMaxContentSize    int
 	InputChanSize          int
+	CompressionKind        string
path: comp/logs/agent/config/endpoints.go
user: login: ddrthall
body: We don't need these in the current architecture, I don't think we set them anywhere
created_at: 2025-05-09T15:13:05Z
author_association: CONTRIBUTOR
diff_hunk: @@ -183,7 +190,6 @@ func loadHTTPAdditionalEndpoints(main Endpoint, l *LogsConfigKeys, intakeTrackTy
 
 		newE.isAdditionalEndpoint = true
 		newE.additionalEndpointsIdx = idx
-
 		newE.UseCompression = main.UseCompression
 		newE.CompressionLevel = main.CompressionLevel
path: comp/logs/agent/config/endpoints.go
user: login: ddrthall
body: We'll want the compression kind override here as well
created_at: 2025-05-09T17:23:19Z
author_association: CONTRIBUTOR

PR comments:
user: login: agent-platform-auto-pr[bot]
created_at: 2025-05-06T18:30:12Z
body: ## Uncompressed package size comparison

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


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

|package|diff|status|size|ancestor|threshold|
|--|--|--|--|--|--|
|datadog-agent-x86_64-rpm|0.01MB|⚠️|785.30MB|785.29MB|0.50MB|
|datadog-agent-x86_64-suse|0.01MB|⚠️|785.30MB|785.29MB|0.50MB|
|datadog-agent-amd64-deb|0.01MB|⚠️|776.36MB|776.35MB|0.50MB|
|datadog-agent-arm64-deb|0.00MB|✅|766.14MB|766.14MB|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-agent-aarch64-rpm|0.00MB|✅|775.07MB|775.07MB|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-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-aarch64-rpm|0.00MB|✅|57.94MB|57.94MB|0.50MB|
|datadog-dogstatsd-amd64-deb|0.00MB|✅|31.20MB|31.20MB|0.50MB|
|datadog-dogstatsd-arm64-deb|0.00MB|✅|30.03MB|30.03MB|0.50MB|
|datadog-iot-agent-arm64-deb|0.00MB|✅|57.86MB|57.86MB|0.50MB|

</details>

## Decision
⚠️ Warning



author_association: CONTRIBUTOR
user: login: cit-pr-commenter[bot]
created_at: 2025-05-06T18:48:07Z
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=80efd62b-7233-41f5-bdfc-45f12f849e99&view=spans&from_ts=1746814121000&to_ts=1746814721000&live=false)  
[Target profiles](https://app.datadoghq.com/profiling/explorer?query=env%3Asingle-machine-performance%20service%3Adatadog-agent%20job_id%3A80efd62b-7233-41f5-bdfc-45f12f849e99&agg_m=count&agg_m_source=base&agg_t=count&fromUser=false&viz=stream&start=1746806921000&end=1746818321000&paused=true)  
Run ID: 80efd62b-7233-41f5-bdfc-45f12f849e99

Baseline: 2e1c7f60e53a46343005e021cb33ee8eda836155
Comparison: 5787db79d243b78bb193efc3867fd4f784c44dc9
[Diff](2e1c7f60e53a46343005e021cb33ee8eda836155...5787db79d243b78bb193efc3867fd4f784c44dc9)


## 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                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
|------|----------------------------------------------|--------------------|----------|----------------|--------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| ➖   | docker_containers_cpu                        | % cpu utilization  | +1.13    | [-2.75, +5.02] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Adocker_containers_cpu%20job_id%3A80efd62b-7233-41f5-bdfc-45f12f849e99&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=1746806921000&to_ts=1746818321000&live=false)                                                                                                                                                                                                                                                                                                           |
| ➖   | tcp_syslog_to_blackhole                      | ingress throughput | +0.49    | [+0.43, +0.56] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Atcp_syslog_to_blackhole%20job_id%3A80efd62b-7233-41f5-bdfc-45f12f849e99&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=1746806921000&to_ts=1746818321000&live=false)                                                                                                                                                                                                                                                                                                         |
| ➖   | ddot_metrics                                 | memory utilization | +0.27    | [+0.15, +0.39] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Addot_metrics%20job_id%3A80efd62b-7233-41f5-bdfc-45f12f849e99&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=1746806921000&to_ts=1746818321000&live=false)                                                                                                                                                                                                                                                                                                                    |
| ➖   | file_to_blackhole_0ms_latency_http2          | egress throughput  | +0.16    | [-0.48, +0.80] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Afile_to_blackhole_0ms_latency_http2%20job_id%3A80efd62b-7233-41f5-bdfc-45f12f849e99&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=1746806921000&to_ts=1746818321000&live=false)                                                                                                                                                                                                                                                                                             |
| ➖   | quality_gate_logs                            | % cpu utilization  | +0.15    | [-2.64, +2.95] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Aquality_gate_logs%20job_id%3A80efd62b-7233-41f5-bdfc-45f12f849e99&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=1746806921000&to_ts=1746818321000&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=80efd62b-7233-41f5-bdfc-45f12f849e99&view=spans&from_ts=1746814121000&to_ts=1746814721000&live=false)                           |
| ➖   | file_tree                                    | memory utilization | +0.12    | [+0.01, +0.23] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Afile_tree%20job_id%3A80efd62b-7233-41f5-bdfc-45f12f849e99&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=1746806921000&to_ts=1746818321000&live=false)                                                                                                                                                                                                                                                                                                                       |
| ➖   | uds_dogstatsd_20mb_12k_contexts_20_senders   | memory utilization | +0.12    | [+0.08, +0.16] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Auds_dogstatsd_20mb_12k_contexts_20_senders%20job_id%3A80efd62b-7233-41f5-bdfc-45f12f849e99&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=1746806921000&to_ts=1746818321000&live=false)                                                                                                                                                                                                                                                                                      |
| ➖   | quality_gate_idle                            | memory utilization | +0.08    | [-0.00, +0.17] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Aquality_gate_idle%20job_id%3A80efd62b-7233-41f5-bdfc-45f12f849e99&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=1746806921000&to_ts=1746818321000&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=80efd62b-7233-41f5-bdfc-45f12f849e99&view=spans&from_ts=1746814121000&to_ts=1746814721000&live=false)                           |
| ➖   | file_to_blackhole_0ms_latency                | egress throughput  | +0.07    | [-0.61, +0.75] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Afile_to_blackhole_0ms_latency%20job_id%3A80efd62b-7233-41f5-bdfc-45f12f849e99&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=1746806921000&to_ts=1746818321000&live=false)                                                                                                                                                                                                                                                                                                   |
| ➖   | file_to_blackhole_0ms_latency_http1          | egress throughput  | +0.05    | [-0.61, +0.71] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Afile_to_blackhole_0ms_latency_http1%20job_id%3A80efd62b-7233-41f5-bdfc-45f12f849e99&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=1746806921000&to_ts=1746818321000&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%3A80efd62b-7233-41f5-bdfc-45f12f849e99&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=1746806921000&to_ts=1746818321000&live=false)                                                                                                                                                                                                                                                                                    |
| ➖   | file_to_blackhole_300ms_latency              | egress throughput  | +0.03    | [-0.65, +0.70] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Afile_to_blackhole_300ms_latency%20job_id%3A80efd62b-7233-41f5-bdfc-45f12f849e99&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=1746806921000&to_ts=1746818321000&live=false)                                                                                                                                                                                                                                                                                                 |
| ➖   | file_to_blackhole_500ms_latency              | egress throughput  | +0.02    | [-0.61, +0.65] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Afile_to_blackhole_500ms_latency%20job_id%3A80efd62b-7233-41f5-bdfc-45f12f849e99&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=1746806921000&to_ts=1746818321000&live=false)                                                                                                                                                                                                                                                                                                 |
| ➖   | file_to_blackhole_1000ms_latency             | egress throughput  | +0.01    | [-0.63, +0.64] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Afile_to_blackhole_1000ms_latency%20job_id%3A80efd62b-7233-41f5-bdfc-45f12f849e99&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=1746806921000&to_ts=1746818321000&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%3A80efd62b-7233-41f5-bdfc-45f12f849e99&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=1746806921000&to_ts=1746818321000&live=false)                                                                                                                                                                                                                                                                                                            |
| ➖   | tcp_dd_logs_filter_exclude                   | ingress throughput | +0.00    | [-0.02, +0.02] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Atcp_dd_logs_filter_exclude%20job_id%3A80efd62b-7233-41f5-bdfc-45f12f849e99&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=1746806921000&to_ts=1746818321000&live=false)                                                                                                                                                                                                                                                                                                      |
| ➖   | otlp_ingest_metrics                          | memory utilization | -0.02    | [-0.17, +0.12] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Aotlp_ingest_metrics%20job_id%3A80efd62b-7233-41f5-bdfc-45f12f849e99&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=1746806921000&to_ts=1746818321000&live=false)                                                                                                                                                                                                                                                                                                             |
| ➖   | file_to_blackhole_100ms_latency              | egress throughput  | -0.03    | [-0.66, +0.60] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Afile_to_blackhole_100ms_latency%20job_id%3A80efd62b-7233-41f5-bdfc-45f12f849e99&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=1746806921000&to_ts=1746818321000&live=false)                                                                                                                                                                                                                                                                                                 |
| ➖   | quality_gate_idle_all_features               | memory utilization | -0.07    | [-0.15, +0.01] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Aquality_gate_idle_all_features%20job_id%3A80efd62b-7233-41f5-bdfc-45f12f849e99&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=1746806921000&to_ts=1746818321000&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=80efd62b-7233-41f5-bdfc-45f12f849e99&view=spans&from_ts=1746814121000&to_ts=1746814721000&live=false) |
| ➖   | ddot_logs                                    | memory utilization | -0.22    | [-0.34, -0.09] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Addot_logs%20job_id%3A80efd62b-7233-41f5-bdfc-45f12f849e99&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=1746806921000&to_ts=1746818321000&live=false)                                                                                                                                                                                                                                                                                                                       |
| ➖   | otlp_ingest_logs                             | memory utilization | -0.44    | [-0.56, -0.32] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Aotlp_ingest_logs%20job_id%3A80efd62b-7233-41f5-bdfc-45f12f849e99&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=1746806921000&to_ts=1746818321000&live=false)                                                                                                                                                                                                                                                                                                                |
| ➖   | docker_containers_memory                     | memory utilization | -0.98    | [-1.03, -0.93] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Adocker_containers_memory%20job_id%3A80efd62b-7233-41f5-bdfc-45f12f849e99&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=1746806921000&to_ts=1746818321000&live=false)                                                                                                                                                                                                                                                                                                        |
| ➖   | uds_dogstatsd_to_api_cpu                     | % cpu utilization  | -2.09    | [-2.93, -1.25] | 1      | [Logs](https://app.datadoghq.com/logs?query=experiment%3Auds_dogstatsd_to_api_cpu%20job_id%3A80efd62b-7233-41f5-bdfc-45f12f849e99&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=1746806921000&to_ts=1746818321000&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=80efd62b-7233-41f5-bdfc-45f12f849e99&view=spans&from_ts=1746814121000&to_ts=1746814721000&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=80efd62b-7233-41f5-bdfc-45f12f849e99&view=spans&from_ts=1746814121000&to_ts=1746814721000&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=80efd62b-7233-41f5-bdfc-45f12f849e99&view=spans&from_ts=1746814121000&to_ts=1746814721000&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=80efd62b-7233-41f5-bdfc-45f12f849e99&view=spans&from_ts=1746814121000&to_ts=1746814721000&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=80efd62b-7233-41f5-bdfc-45f12f849e99&view=spans&from_ts=1746814121000&to_ts=1746814721000&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=80efd62b-7233-41f5-bdfc-45f12f849e99&view=spans&from_ts=1746814121000&to_ts=1746814721000&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=80efd62b-7233-41f5-bdfc-45f12f849e99&view=spans&from_ts=1746814121000&to_ts=1746814721000&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_logs**, bounds check **memory_usage**: 10/10 replicas passed. Gate passed.
- **quality_gate_logs**, bounds check **lost_bytes**: 10/10 replicas passed. Gate passed.
- **quality_gate_logs**, 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**, bounds check **intake_connections**: 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.
author_association: NONE
user: login: agent-platform-auto-pr[bot]
created_at: 2025-05-06T19:25:23Z
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.16 MiB|778.06 MiB|184.99 MiB|191.06 MiB|
|✅|static_quality_gate_agent_deb_amd64_fips|749.02 MiB|776.09 MiB|184.69 MiB|190.72 MiB|
|✅|static_quality_gate_agent_heroku_amd64|368.33 MiB|434.99 MiB|98.03 MiB|114.34 MiB|
|✅|static_quality_gate_agent_msi|969.05 MiB|978.45 MiB|146.85 MiB|151.65 MiB|
|✅|static_quality_gate_agent_rpm_amd64|751.1 MiB|778.06 MiB|186.9 MiB|193.42 MiB|
|✅|static_quality_gate_agent_rpm_amd64_fips|748.87 MiB|776.06 MiB|185.81 MiB|192.61 MiB|
|✅|static_quality_gate_agent_rpm_arm64|741.33 MiB|768.33 MiB|169.24 MiB|174.71 MiB|
|✅|static_quality_gate_agent_rpm_arm64_fips|739.41 MiB|766.55 MiB|168.06 MiB|173.92 MiB|
|✅|static_quality_gate_agent_suse_amd64|751.14 MiB|778.08 MiB|186.9 MiB|193.42 MiB|
|✅|static_quality_gate_agent_suse_amd64_fips|749.0 MiB|776.11 MiB|185.81 MiB|192.78 MiB|
|✅|static_quality_gate_agent_suse_arm64|741.35 MiB|768.31 MiB|169.24 MiB|174.71 MiB|
|✅|static_quality_gate_agent_suse_arm64_fips|739.44 MiB|766.5 MiB|168.06 MiB|173.92 MiB|
|✅|static_quality_gate_docker_agent_amd64|845.33 MiB|862.5 MiB|285.28 MiB|292.0 MiB|
|✅|static_quality_gate_docker_agent_arm64|858.72 MiB|876.0 MiB|272.11 MiB|278.3 MiB|
|✅|static_quality_gate_docker_agent_jmx_amd64|845.33 MiB|862.5 MiB|285.28 MiB|292.0 MiB|
|✅|static_quality_gate_docker_agent_jmx_arm64|858.72 MiB|876.63 MiB|272.11 MiB|278.4 MiB|
|✅|static_quality_gate_docker_agent_windows1809|845.33 MiB|862.5 MiB|285.28 MiB|292.0 MiB|
|✅|static_quality_gate_docker_agent_windows1809_core|845.33 MiB|862.5 MiB|285.28 MiB|292.0 MiB|
|✅|static_quality_gate_docker_agent_windows1809_core_jmx|845.33 MiB|862.5 MiB|285.28 MiB|292.0 MiB|
|✅|static_quality_gate_docker_agent_windows1809_jmx|845.33 MiB|862.5 MiB|285.28 MiB|292.0 MiB|
|✅|static_quality_gate_docker_agent_windows2022|845.33 MiB|862.5 MiB|285.28 MiB|292.0 MiB|
|✅|static_quality_gate_docker_agent_windows2022_core|845.33 MiB|862.5 MiB|285.28 MiB|292.0 MiB|
|✅|static_quality_gate_docker_agent_windows2022_core_jmx|845.33 MiB|862.5 MiB|285.28 MiB|292.0 MiB|
|✅|static_quality_gate_docker_agent_windows2022_jmx|845.33 MiB|862.5 MiB|285.28 MiB|292.0 MiB|
|✅|static_quality_gate_docker_cluster_agent_amd64|259.71 MiB|263.4 MiB|101.96 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.88 MiB|45.05 MiB|13.72 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.57 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: ddrthall
created_at: 2025-05-08T19:55:44Z
body: General Question: Since we're opting to keep compression kind as a endpoint level entity (rather than at the aggregate "endpoints" level), we want to make sure that all related endpoints are correctly getting that value. Are we sure that these changes are enough to guarantee all additional endpoints are set with the correct compression kind?
author_association: CONTRIBUTOR
user: login: DDuongNguyen
created_at: 2025-05-09T20:04:14Z
body: /merge
author_association: CONTRIBUTOR
user: login: dd-devflow[bot]
created_at: 2025-05-09T20:04:18Z
body: <!-- "FeedbackWorkflowId":"24cb8c2c-317d-4db2-aa7d-2807fb2f82b4_36" -->
[View all feedbacks in Devflow UI.](https://mosaic.us1.ddbuild.io/devflow/logs/24cb8c2c-317d-4db2-aa7d-2807fb2f82b4_36)

`2025-05-09 20:04:18 UTC` :information_source: Start processing command `/merge`

---
`2025-05-09 20:04:22 UTC` :information_source: **MergeQueue:** pull request added to the queue

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

---
`2025-05-09 20:40:11 UTC` :information_source: **MergeQueue:** This merge request was merged

author_association: NONE