Skip to content

Commit dbf21e6

Browse files
feat: No longer launch Go-based agent for compatibility/OTLP/AAP config (#788)
https://datadoghq.atlassian.net/browse/SVLS-7398 - As part of coming release, bottlecap agent no longer launches Go-based agent when compatibility/AAP/OTLP features are active - Emit the same metric when detecting any of above configuration - Update corresponding unit tests Manifests: - [Test lambda function](https://us-east-1.console.aws.amazon.com/lambda/home?region=us-east-1#/functions/ltn1-fullinstrument-bn-cold-python310-lambda?code=&subtab=envVars&tab=testing) with [logs](https://us-east-1.console.aws.amazon.com/cloudwatch/home?region=us-east-1#logsV2:log-groups/log-group/$252Faws$252Flambda$252Fltn1-fullinstrument-bn-cold-python310-lambda/log-events/2025$252F08$252F21$252F$255B$2524LATEST$255Df3788d359677452dad162488ff15456f$3FfilterPattern$3Dotel) showing compatibility/AAP/OTPL are enabled <img width="2260" height="454" alt="image" src="https://github.com/user-attachments/assets/5dfd4954-5191-4390-83f5-a8eb3bffb9d3" /> - [Logging](https://app.datadoghq.com/logs/livetail?query=functionname%3Altn1-fullinstrument-bn-cold-python310-lambda%20Metric&agg_m=count&agg_m_source=base&agg_t=count&cols=host%2Cservice&fromUser=true&messageDisplay=inline&refresh_mode=paused&storage=driveline&stream_sort=desc&viz=stream&from_ts=1755787655569&to_ts=1755787689060&live=false) <img width="1058" height="911" alt="image" src="https://github.com/user-attachments/assets/629f75d1-e115-4478-afac-ad16d9369fa7" /> - [Metric](https://app.datadoghq.com/screen/integration/aws_lambda_enhanced_metrics?fromUser=false&fullscreen_end_ts=1755788220000&fullscreen_paused=true&fullscreen_refresh_mode=paused&fullscreen_section=overview&fullscreen_start_ts=1755787200000&fullscreen_widget=2&graph-explorer__tile_def=N4IgbglgXiBcIBcD2AHANhAzgkAaEAxgK7ZIC2A%2BhgHYDWmcA2gLr4BOApgI5EfYOxGoTphRJqmDhQBmSNmQCGOeJgIK0CtnhA8ObCHyagAJkoUVMSImwIc4IMhwT6CDfNQWP7utgE8AjNo%2BvvaYRGSwpggKxkgA5gB0kmxgemh8mAkcAB4IHBIQ4gnSChBoSKlswAAkCgDumBQKBARW1Ai41ZxxhdSd0kTUBAi9AL4ABABGvuPAA0Mj4h6OowkKja2DCAAUAJTaCnFx3UpyoeEgo6wgsvJEGgJCN3Jk9wrevH6BV-iWbMqgTbtOAAJgADPg5MY9BRpkZEL4UHZ4LdXhptBBqNDsnAISAoXp7NDVJdmKMfiBsL50nBgOSgA&refresh_mode=sliding&from_ts=1755783890661&to_ts=1755787490661&live=true) <img width="1227" height="1196" alt="image" src="https://github.com/user-attachments/assets/2922eb54-9853-4512-a902-dfa97916b643" />
1 parent 7bfe4df commit dbf21e6

File tree

5 files changed

+186
-104
lines changed

5 files changed

+186
-104
lines changed

bottlecap/src/bin/bottlecap/main.rs

Lines changed: 50 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ use bottlecap::{
3737
},
3838
logger,
3939
logs::{agent::LogsAgent, flusher::LogsFlusher},
40+
metrics::enhanced::lambda::Lambda as enhanced_metrics,
4041
otlp::{agent::Agent as OtlpAgent, should_enable_otlp_agent},
4142
proxy::{interceptor, should_start_proxy},
4243
secrets::decrypt,
@@ -86,9 +87,7 @@ use std::{
8687
collections::{HashMap, hash_map},
8788
env,
8889
io::{Error, Result},
89-
os::unix::process::CommandExt,
9090
path::Path,
91-
process::Command,
9291
sync::Arc,
9392
time::{Duration, Instant},
9493
};
@@ -404,14 +403,7 @@ fn load_configs(start_time: Instant) -> (AwsConfig, AwsCredentials, Arc<Config>)
404403
let aws_credentials = AwsCredentials::from_env();
405404
let lambda_directory: String =
406405
env::var("LAMBDA_TASK_ROOT").unwrap_or_else(|_| "/var/task".to_string());
407-
let config = match config::get_config(Path::new(&lambda_directory)) {
408-
Ok(config) => Arc::new(config),
409-
Err(_e) => {
410-
let err = Command::new("/opt/datadog-agent-go").exec();
411-
panic!("Error starting the extension: {err:?}");
412-
}
413-
};
414-
406+
let config = Arc::new(config::get_config(Path::new(&lambda_directory)));
415407
(aws_config, aws_credentials, config)
416408
}
417409

@@ -510,12 +502,22 @@ async fn extension_loop_active(
510502
);
511503
start_dogstatsd_aggregator(metrics_aggr_service);
512504

505+
let metrics_intake_url = create_metrics_intake_url_prefix(config);
513506
let metrics_flushers = Arc::new(TokioMutex::new(start_metrics_flushers(
514507
Arc::clone(&api_key_factory),
515508
&metrics_aggr_handle,
509+
&metrics_intake_url,
516510
config,
517511
)));
518512

513+
// Create lambda enhanced metrics instance once
514+
let lambda_enhanced_metrics =
515+
enhanced_metrics::new(metrics_aggr_handle.clone(), Arc::clone(config));
516+
517+
// Send config issue metrics
518+
let config_issues = config::fallback(config);
519+
send_config_issue_metric(&config_issues, &lambda_enhanced_metrics);
520+
519521
let propagator = Arc::new(DatadogCompositePropagator::new(Arc::clone(config)));
520522
// Lifecycle Invocation Processor
521523
let invocation_processor = Arc::new(TokioMutex::new(InvocationProcessor::new(
@@ -1018,33 +1020,33 @@ fn start_logs_agent(
10181020
(logs_agent_channel, logs_flusher)
10191021
}
10201022

1021-
fn start_metrics_flushers(
1022-
api_key_factory: Arc<ApiKeyFactory>,
1023-
metrics_aggr_handle: &MetricsAggregatorHandle,
1024-
config: &Arc<Config>,
1025-
) -> Vec<MetricsFlusher> {
1026-
let mut flushers = Vec::new();
1027-
1028-
let metrics_intake_url = if !config.dd_url.is_empty() {
1023+
fn create_metrics_intake_url_prefix(config: &Config) -> MetricsIntakeUrlPrefix {
1024+
if !config.dd_url.is_empty() {
10291025
let dd_dd_url = DdDdUrl::new(config.dd_url.clone()).expect("can't parse DD_DD_URL");
1030-
10311026
let prefix_override = MetricsIntakeUrlPrefixOverride::maybe_new(None, Some(dd_dd_url));
1032-
MetricsIntakeUrlPrefix::new(None, prefix_override)
1027+
MetricsIntakeUrlPrefix::new(None, prefix_override).expect("can't parse DD_DD_URL prefix")
10331028
} else if !config.url.is_empty() {
10341029
let dd_url = DdUrl::new(config.url.clone()).expect("can't parse DD_URL");
1035-
10361030
let prefix_override = MetricsIntakeUrlPrefixOverride::maybe_new(Some(dd_url), None);
1037-
MetricsIntakeUrlPrefix::new(None, prefix_override)
1031+
MetricsIntakeUrlPrefix::new(None, prefix_override).expect("can't parse DD_URL prefix")
10381032
} else {
1039-
// use site
10401033
let metrics_site = MetricsSite::new(config.site.clone()).expect("can't parse site");
1041-
MetricsIntakeUrlPrefix::new(Some(metrics_site), None)
1042-
};
1034+
MetricsIntakeUrlPrefix::new(Some(metrics_site), None).expect("can't parse site prefix")
1035+
}
1036+
}
1037+
1038+
fn start_metrics_flushers(
1039+
api_key_factory: Arc<ApiKeyFactory>,
1040+
metrics_aggr_handle: &MetricsAggregatorHandle,
1041+
metrics_intake_url: &MetricsIntakeUrlPrefix,
1042+
config: &Arc<Config>,
1043+
) -> Vec<MetricsFlusher> {
1044+
let mut flushers = Vec::new();
10431045

10441046
let flusher_config = MetricsFlusherConfig {
10451047
api_key_factory,
10461048
aggregator_handle: metrics_aggr_handle.clone(),
1047-
metrics_intake_url_prefix: metrics_intake_url.expect("can't parse site or override"),
1049+
metrics_intake_url_prefix: metrics_intake_url.clone(),
10481050
https_proxy: config.proxy_https.clone(),
10491051
timeout: Duration::from_secs(config.flush_timeout),
10501052
retry_strategy: DsdRetryStrategy::Immediate(3),
@@ -1169,6 +1171,28 @@ fn start_trace_agent(
11691171
)
11701172
}
11711173

1174+
/// Sends metrics indicating issue with configuration.
1175+
///
1176+
/// # Arguments
1177+
/// * `issue_reasons` - Vector of messages describing the issue with the configurations
1178+
/// * `lambda_enhanced_metrics` - The lambda enhanced metrics instance
1179+
fn send_config_issue_metric(issue_reasons: &[String], lambda_enhanced_metrics: &enhanced_metrics) {
1180+
if issue_reasons.is_empty() {
1181+
return;
1182+
}
1183+
let now = std::time::UNIX_EPOCH
1184+
.elapsed()
1185+
.expect("can't poll clock")
1186+
.as_secs()
1187+
.try_into()
1188+
.unwrap_or_default();
1189+
1190+
// Setup a separate metric for each config issue reason
1191+
for issue_reason in issue_reasons {
1192+
lambda_enhanced_metrics.set_config_load_issue_metric(now, issue_reason);
1193+
}
1194+
}
1195+
11721196
fn start_dogstatsd_aggregator(aggr_service: MetricsAggregatorService) {
11731197
tokio::spawn(async move {
11741198
aggr_service.run().await;

0 commit comments

Comments
 (0)