@@ -277,6 +277,24 @@ pub struct EnvConfig {
277277 #[ serde( deserialize_with = "deserialize_optional_string" ) ]
278278 pub statsd_metric_namespace : Option < String > ,
279279
280+ /// @env `DD_DOGSTATSD_SO_RCVBUF`
281+ /// Size of the receive buffer for `DogStatsD` UDP packets, in bytes (`SO_RCVBUF`).
282+ /// Increase to reduce packet loss under high-throughput metric bursts.
283+ #[ serde( deserialize_with = "deserialize_option_lossless" ) ]
284+ pub dogstatsd_so_rcvbuf : Option < usize > ,
285+
286+ /// @env `DD_DOGSTATSD_BUFFER_SIZE`
287+ /// Maximum size of a single read from any transport (UDP or named pipe), in bytes.
288+ /// Defaults to 8192.
289+ #[ serde( deserialize_with = "deserialize_option_lossless" ) ]
290+ pub dogstatsd_buffer_size : Option < usize > ,
291+
292+ /// @env `DD_DOGSTATSD_QUEUE_SIZE`
293+ /// Internal queue capacity between the socket reader and metric processor.
294+ /// Defaults to 1024. Increase if the processor can't keep up with burst traffic.
295+ #[ serde( deserialize_with = "deserialize_option_lossless" ) ]
296+ pub dogstatsd_queue_size : Option < usize > ,
297+
280298 // OTLP
281299 //
282300 // - APM / Traces
@@ -554,6 +572,11 @@ fn merge_config(config: &mut Config, env_config: &EnvConfig) {
554572 config. statsd_metric_namespace = parse_metric_namespace ( namespace) ;
555573 }
556574
575+ // DogStatsD
576+ merge_option ! ( config, env_config, dogstatsd_so_rcvbuf) ;
577+ merge_option ! ( config, env_config, dogstatsd_buffer_size) ;
578+ merge_option ! ( config, env_config, dogstatsd_queue_size) ;
579+
557580 // OTLP
558581 merge_option_to_value ! ( config, env_config, otlp_config_traces_enabled) ;
559582 merge_option_to_value ! (
@@ -830,6 +853,11 @@ mod tests {
830853 ) ;
831854 jail. set_env ( "DD_OTLP_CONFIG_LOGS_ENABLED" , "true" ) ;
832855
856+ // DogStatsD
857+ jail. set_env ( "DD_DOGSTATSD_SO_RCVBUF" , "1048576" ) ;
858+ jail. set_env ( "DD_DOGSTATSD_BUFFER_SIZE" , "65507" ) ;
859+ jail. set_env ( "DD_DOGSTATSD_QUEUE_SIZE" , "2048" ) ;
860+
833861 // AWS Lambda
834862 jail. set_env (
835863 "DD_API_KEY_SECRET_ARN" ,
@@ -984,6 +1012,9 @@ mod tests {
9841012 otlp_config_traces_probabilistic_sampler_sampling_percentage : Some ( 50 ) ,
9851013 otlp_config_logs_enabled : true ,
9861014 statsd_metric_namespace : None ,
1015+ dogstatsd_so_rcvbuf : Some ( 1048576 ) ,
1016+ dogstatsd_buffer_size : Some ( 65507 ) ,
1017+ dogstatsd_queue_size : Some ( 2048 ) ,
9871018 api_key_secret_arn : "arn:aws:secretsmanager:region:account:secret:datadog-api-key"
9881019 . to_string ( ) ,
9891020 kms_api_key : "test-kms-key" . to_string ( ) ,
@@ -1170,4 +1201,43 @@ mod tests {
11701201 Ok ( ( ) )
11711202 } ) ;
11721203 }
1204+
1205+ #[ test]
1206+ fn test_dogstatsd_config_from_env ( ) {
1207+ figment:: Jail :: expect_with ( |jail| {
1208+ jail. clear_env ( ) ;
1209+ jail. set_env ( "DD_DOGSTATSD_SO_RCVBUF" , "1048576" ) ;
1210+ jail. set_env ( "DD_DOGSTATSD_BUFFER_SIZE" , "65507" ) ;
1211+ jail. set_env ( "DD_DOGSTATSD_QUEUE_SIZE" , "2048" ) ;
1212+
1213+ let mut config = Config :: default ( ) ;
1214+ let env_config_source = EnvConfigSource ;
1215+ env_config_source
1216+ . load ( & mut config)
1217+ . expect ( "Failed to load config" ) ;
1218+
1219+ assert_eq ! ( config. dogstatsd_so_rcvbuf, Some ( 1048576 ) ) ;
1220+ assert_eq ! ( config. dogstatsd_buffer_size, Some ( 65507 ) ) ;
1221+ assert_eq ! ( config. dogstatsd_queue_size, Some ( 2048 ) ) ;
1222+ Ok ( ( ) )
1223+ } ) ;
1224+ }
1225+
1226+ #[ test]
1227+ fn test_dogstatsd_config_defaults_to_none ( ) {
1228+ figment:: Jail :: expect_with ( |jail| {
1229+ jail. clear_env ( ) ;
1230+
1231+ let mut config = Config :: default ( ) ;
1232+ let env_config_source = EnvConfigSource ;
1233+ env_config_source
1234+ . load ( & mut config)
1235+ . expect ( "Failed to load config" ) ;
1236+
1237+ assert_eq ! ( config. dogstatsd_so_rcvbuf, None ) ;
1238+ assert_eq ! ( config. dogstatsd_buffer_size, None ) ;
1239+ assert_eq ! ( config. dogstatsd_queue_size, None ) ;
1240+ Ok ( ( ) )
1241+ } ) ;
1242+ }
11731243}
0 commit comments