@@ -2119,4 +2119,75 @@ mod tests {
21192119 "Should return None when no trace context found"
21202120 ) ;
21212121 }
2122+
2123+ /// Verifies that `client_computed_stats` set on a context via `add_tracer_span` is
2124+ /// propagated all the way through `send_ctx_spans` to the `aws.lambda` payload sent
2125+ /// to the backend, so the extension does not generate duplicate stats.
2126+ #[ tokio:: test]
2127+ #[ allow( clippy:: unwrap_used) ]
2128+ async fn test_client_computed_stats_propagated_to_aws_lambda_span ( ) {
2129+ use crate :: traces:: stats_concentrator_service:: StatsConcentratorService ;
2130+ use crate :: traces:: stats_generator:: StatsGenerator ;
2131+ use libdd_trace_obfuscation:: obfuscation_config:: ObfuscationConfig ;
2132+ use tokio:: sync:: mpsc;
2133+
2134+ let config = Arc :: new ( config:: Config {
2135+ apm_dd_url : "https://trace.agent.datadoghq.com" . to_string ( ) ,
2136+ ..config:: Config :: default ( )
2137+ } ) ;
2138+ let tags_provider = Arc :: new ( provider:: Provider :: new (
2139+ Arc :: clone ( & config) ,
2140+ LAMBDA_RUNTIME_SLUG . to_string ( ) ,
2141+ & HashMap :: from ( [ ( "function_arn" . to_string ( ) , "test-arn" . to_string ( ) ) ] ) ,
2142+ ) ) ;
2143+ let aws_config = Arc :: new ( AwsConfig {
2144+ region : "us-east-1" . into ( ) ,
2145+ aws_lwa_proxy_lambda_runtime_api : None ,
2146+ function_name : "test-function" . into ( ) ,
2147+ sandbox_init_time : Instant :: now ( ) ,
2148+ runtime_api : "***" . into ( ) ,
2149+ exec_wrapper : None ,
2150+ initialization_type : "on-demand" . into ( ) ,
2151+ } ) ;
2152+ let ( aggregator_service, aggregator_handle) =
2153+ AggregatorService :: new ( EMPTY_TAGS , 1024 ) . expect ( "failed to create aggregator service" ) ;
2154+ tokio:: spawn ( aggregator_service. run ( ) ) ;
2155+ let propagator = Arc :: new ( DatadogCompositePropagator :: new ( Arc :: clone ( & config) ) ) ;
2156+ let mut p = Processor :: new (
2157+ Arc :: clone ( & tags_provider) ,
2158+ Arc :: clone ( & config) ,
2159+ aws_config,
2160+ aggregator_handle,
2161+ propagator,
2162+ ) ;
2163+
2164+ let ( trace_tx, mut trace_rx) = mpsc:: channel ( 10 ) ;
2165+ let ( stats_concentrator_service, stats_concentrator_handle) =
2166+ StatsConcentratorService :: new ( Arc :: clone ( & config) ) ;
2167+ tokio:: spawn ( stats_concentrator_service. run ( ) ) ;
2168+ let trace_sender = Arc :: new ( SendingTraceProcessor {
2169+ appsec : None ,
2170+ processor : Arc :: new ( trace_processor:: ServerlessTraceProcessor {
2171+ obfuscation_config : Arc :: new (
2172+ ObfuscationConfig :: new ( ) . expect ( "Failed to create ObfuscationConfig" ) ,
2173+ ) ,
2174+ } ) ,
2175+ trace_tx,
2176+ stats_generator : Arc :: new ( StatsGenerator :: new ( stats_concentrator_handle) ) ,
2177+ } ) ;
2178+
2179+ let mut context = Context :: from_request_id ( "req-1" ) ;
2180+ context. invocation_span . trace_id = 1 ;
2181+ context. invocation_span . span_id = 2 ;
2182+ context. client_computed_stats = true ;
2183+
2184+ p. send_ctx_spans ( & tags_provider, & trace_sender, context)
2185+ . await ;
2186+
2187+ let payload = trace_rx. recv ( ) . await . expect ( "expected payload from trace_tx" ) ;
2188+ assert ! (
2189+ payload. header_tags. client_computed_stats,
2190+ "client_computed_stats must be propagated to the aws.lambda span payload"
2191+ ) ;
2192+ }
21222193}
0 commit comments