@@ -51,6 +51,7 @@ use bottlecap::{
5151 AggregatorHandle as LogsAggregatorHandle , AggregatorService as LogsAggregatorService ,
5252 } ,
5353 flusher:: LogsFlusher ,
54+ lambda:: DurableContextUpdate ,
5455 } ,
5556 otlp:: { agent:: Agent as OtlpAgent , should_enable_otlp_agent} ,
5657 proxy:: { interceptor, should_start_proxy} ,
@@ -149,7 +150,11 @@ async fn main() -> anyhow::Result<()> {
149150 let config = Arc :: new ( config:: get_config ( Path :: new ( & lambda_directory) ) ) ;
150151
151152 let aws_config = Arc :: new ( aws_config) ;
152- let api_key_factory = create_api_key_factory ( & config, & aws_config) ;
153+ // Build one shared reqwest::Client for metrics, logs, trace proxy flushing, and calls to
154+ // Datadog APIs (e.g. delegated auth). reqwest::Client is Arc-based internally, so cloning
155+ // just increments a refcount and shares the connection pool.
156+ let shared_client = bottlecap:: http:: get_client ( & config) ;
157+ let api_key_factory = create_api_key_factory ( & config, & aws_config, & shared_client) ;
153158
154159 let r = response
155160 . await
@@ -160,6 +165,7 @@ async fn main() -> anyhow::Result<()> {
160165 Arc :: clone ( & aws_config) ,
161166 & config,
162167 & client,
168+ shared_client,
163169 & r,
164170 Arc :: clone ( & api_key_factory) ,
165171 start_time,
@@ -245,17 +251,23 @@ fn get_flush_strategy_for_mode(
245251 }
246252}
247253
248- fn create_api_key_factory ( config : & Arc < Config > , aws_config : & Arc < AwsConfig > ) -> Arc < ApiKeyFactory > {
254+ fn create_api_key_factory (
255+ config : & Arc < Config > ,
256+ aws_config : & Arc < AwsConfig > ,
257+ client : & reqwest:: Client ,
258+ ) -> Arc < ApiKeyFactory > {
249259 let config = Arc :: clone ( config) ;
250260 let aws_config = Arc :: clone ( aws_config) ;
261+ let client = client. clone ( ) ;
251262 let api_key_secret_reload_interval = config. api_key_secret_reload_interval ;
252263
253264 Arc :: new ( ApiKeyFactory :: new_from_resolver (
254265 Arc :: new ( move || {
255266 let config = Arc :: clone ( & config) ;
256267 let aws_config = Arc :: clone ( & aws_config) ;
268+ let client = client. clone ( ) ;
257269
258- Box :: pin ( async move { resolve_secrets ( config, aws_config) . await } )
270+ Box :: pin ( async move { resolve_secrets ( config, aws_config, client ) . await } )
259271 } ) ,
260272 api_key_secret_reload_interval,
261273 ) )
@@ -284,6 +296,7 @@ async fn extension_loop_active(
284296 aws_config : Arc < AwsConfig > ,
285297 config : & Arc < Config > ,
286298 client : & Client ,
299+ shared_client : reqwest:: Client ,
287300 r : & RegisterResponse ,
288301 api_key_factory : Arc < ApiKeyFactory > ,
289302 start_time : Instant ,
@@ -293,20 +306,20 @@ async fn extension_loop_active(
293306 let account_id = r. account_id . as_ref ( ) . unwrap_or ( & "none" . to_string ( ) ) . clone ( ) ;
294307 let tags_provider = setup_tag_provider ( & Arc :: clone ( & aws_config) , config, & account_id) ;
295308
296- // Build one shared reqwest::Client for metrics, logs, and trace proxy flushing.
297- // reqwest::Client is Arc-based internally, so cloning just increments a refcount
298- // and shares the connection pool.
299- let shared_client = bottlecap :: http :: get_client ( config ) ;
300-
301- let ( logs_agent_channel , logs_flusher , logs_agent_cancel_token , logs_aggregator_handle ) =
302- start_logs_agent (
303- config,
304- Arc :: clone ( & api_key_factory) ,
305- & tags_provider,
306- event_bus_tx. clone ( ) ,
307- aws_config. is_managed_instance_mode ( ) ,
308- & shared_client,
309- ) ;
309+ let (
310+ logs_agent_channel ,
311+ logs_flusher ,
312+ logs_agent_cancel_token ,
313+ logs_aggregator_handle ,
314+ durable_context_tx ,
315+ ) = start_logs_agent (
316+ config,
317+ Arc :: clone ( & api_key_factory) ,
318+ & tags_provider,
319+ event_bus_tx. clone ( ) ,
320+ aws_config. is_managed_instance_mode ( ) ,
321+ & shared_client,
322+ ) ;
310323
311324 let ( metrics_flushers, metrics_aggregator_handle, dogstatsd_cancel_token) = start_dogstatsd (
312325 tags_provider. clone ( ) ,
@@ -325,6 +338,7 @@ async fn extension_loop_active(
325338 Arc :: clone ( & aws_config) ,
326339 metrics_aggregator_handle. clone ( ) ,
327340 Arc :: clone ( & propagator) ,
341+ durable_context_tx,
328342 ) ;
329343 tokio:: spawn ( async move {
330344 invocation_processor_service. run ( ) . await ;
@@ -1039,14 +1053,15 @@ fn start_logs_agent(
10391053 LogsFlusher ,
10401054 CancellationToken ,
10411055 LogsAggregatorHandle ,
1056+ Sender < DurableContextUpdate > ,
10421057) {
10431058 let ( aggregator_service, aggregator_handle) = LogsAggregatorService :: default ( ) ;
10441059 // Start service in background
10451060 tokio:: spawn ( async move {
10461061 aggregator_service. run ( ) . await ;
10471062 } ) ;
10481063
1049- let ( mut agent, tx) = LogsAgent :: new (
1064+ let ( mut agent, tx, durable_context_tx ) = LogsAgent :: new (
10501065 Arc :: clone ( tags_provider) ,
10511066 Arc :: clone ( config) ,
10521067 event_bus,
@@ -1068,7 +1083,13 @@ fn start_logs_agent(
10681083 config. clone ( ) ,
10691084 client. clone ( ) ,
10701085 ) ;
1071- ( tx, flusher, cancel_token, aggregator_handle)
1086+ (
1087+ tx,
1088+ flusher,
1089+ cancel_token,
1090+ aggregator_handle,
1091+ durable_context_tx,
1092+ )
10721093}
10731094
10741095#[ allow( clippy:: type_complexity) ]
0 commit comments