Skip to content

Commit 2a6c234

Browse files
authored
feat: [Trace Stats] Handle hostname and env (#862)
## This PR 1. For `hostname` field: pass in `tags_provider` and use it to get function arn. Refer to existing code about: 1. how to get function arn: https://github.com/DataDog/datadog-lambda-extension/blob/3f90d2bb09b4213e3b683dc84333e48faeddba3a/bottlecap/src/logs/lambda/processor.rs#L65 2. use function arn as hostname: https://github.com/DataDog/datadog-lambda-extension/blob/3f90d2bb09b4213e3b683dc84333e48faeddba3a/bottlecap/src/logs/lambda/processor.rs#L259 2. Change the default value of `env` to `unknown-env`, following this RFC: https://docs.google.com/document/d/1NmGVxNyd9o8UQ7AvFKjOVq5tBDN6GN8jeQmvyBUnkrQ ## Notes Jira: https://datadoghq.atlassian.net/browse/SVLS-7593
1 parent 35a4671 commit 2a6c234

5 files changed

Lines changed: 41 additions & 10 deletions

File tree

bottlecap/src/bin/bottlecap/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1003,7 +1003,7 @@ fn start_trace_agent(
10031003
) {
10041004
// Stats
10051005
let (stats_concentrator_service, stats_concentrator_handle) =
1006-
StatsConcentratorService::new(Arc::clone(config));
1006+
StatsConcentratorService::new(Arc::clone(config), tags_provider.clone());
10071007
tokio::spawn(stats_concentrator_service.run());
10081008
let stats_aggregator: Arc<TokioMutex<StatsAggregator>> = Arc::new(TokioMutex::new(
10091009
StatsAggregator::new_with_concentrator(stats_concentrator_handle.clone()),

bottlecap/src/traces/stats_aggregator.rs

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,14 +89,22 @@ impl StatsAggregator {
8989
#[allow(clippy::unwrap_used)]
9090
mod tests {
9191
use super::*;
92+
use crate::LAMBDA_RUNTIME_SLUG;
9293
use crate::config::Config;
94+
use crate::tags::provider::Provider as TagProvider;
9395
use crate::traces::stats_concentrator_service::StatsConcentratorService;
96+
use std::collections::HashMap;
9497
use std::sync::Arc;
9598

9699
#[test]
97100
fn test_add() {
98101
let config = Arc::new(Config::default());
99-
let (_, concentrator) = StatsConcentratorService::new(config);
102+
let tags_provider = Arc::new(TagProvider::new(
103+
config.clone(),
104+
LAMBDA_RUNTIME_SLUG.to_string(),
105+
&HashMap::new(),
106+
));
107+
let (_, concentrator) = StatsConcentratorService::new(config, tags_provider);
100108
let mut aggregator = StatsAggregator::new_with_concentrator(concentrator);
101109
let payload = ClientStatsPayload {
102110
hostname: "hostname".to_string(),
@@ -123,7 +131,12 @@ mod tests {
123131
#[tokio::test]
124132
async fn test_get_batch() {
125133
let config = Arc::new(Config::default());
126-
let (_, concentrator) = StatsConcentratorService::new(config);
134+
let tags_provider = Arc::new(TagProvider::new(
135+
config.clone(),
136+
LAMBDA_RUNTIME_SLUG.to_string(),
137+
&HashMap::new(),
138+
));
139+
let (_, concentrator) = StatsConcentratorService::new(config, tags_provider);
127140
let mut aggregator = StatsAggregator::new_with_concentrator(concentrator);
128141
let payload = ClientStatsPayload {
129142
hostname: "hostname".to_string(),
@@ -150,7 +163,12 @@ mod tests {
150163
#[tokio::test]
151164
async fn test_get_batch_full_entries() {
152165
let config = Arc::new(Config::default());
153-
let (_, concentrator) = StatsConcentratorService::new(config);
166+
let tags_provider = Arc::new(TagProvider::new(
167+
config.clone(),
168+
LAMBDA_RUNTIME_SLUG.to_string(),
169+
&HashMap::new(),
170+
));
171+
let (_, concentrator) = StatsConcentratorService::new(config, tags_provider);
154172
let mut aggregator = StatsAggregator::new(640, concentrator);
155173
// Payload below is 115 bytes
156174
let payload = ClientStatsPayload {

bottlecap/src/traces/stats_concentrator.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use crate::config::Config;
2+
use crate::tags::provider::Provider as TagProvider;
23
use datadog_trace_protobuf::pb;
34
use std::time::{SystemTime, UNIX_EPOCH};
45
use std::{collections::HashMap, sync::Arc};
@@ -54,6 +55,7 @@ pub struct StatsConcentrator {
5455
config: Arc<Config>,
5556
tracer_metadata: TracerMetadata,
5657
buckets: HashMap<u64, Bucket>,
58+
hostname: String,
5759
}
5860

5961
// The number of latest buckets to not flush when force_flush is false.
@@ -71,11 +73,13 @@ const BUCKET_DURATION_NS: u64 = 10 * S_TO_NS; // 10 seconds
7173
// Aggregates stats into buckets, which are then pulled by the stats aggregator.
7274
impl StatsConcentrator {
7375
#[must_use]
74-
pub fn new(config: Arc<Config>) -> Self {
76+
pub fn new(config: Arc<Config>, tags_provider: Arc<TagProvider>) -> Self {
77+
let hostname = tags_provider.get_canonical_id().unwrap_or_default();
7578
Self {
7679
config,
7780
buckets: HashMap::new(),
7881
tracer_metadata: TracerMetadata::default(), // to be set when a trace is processed
82+
hostname,
7983
}
8084
}
8185

@@ -122,6 +126,7 @@ impl StatsConcentrator {
122126
aggregation_key,
123127
*stats,
124128
&self.tracer_metadata,
129+
&self.hostname,
125130
));
126131
}
127132
false
@@ -146,10 +151,10 @@ impl StatsConcentrator {
146151
aggregation_key: &AggregationKey,
147152
stats: Stats,
148153
tracer_metadata: &TracerMetadata,
154+
hostname: &str,
149155
) -> pb::ClientStatsPayload {
150156
pb::ClientStatsPayload {
151-
// TODO: handle this
152-
hostname: String::new(),
157+
hostname: hostname.to_string(),
153158
env: aggregation_key.env.clone(),
154159
// Version is not in the trace payload. Need to read it from config.
155160
version: config.version.clone().unwrap_or_default(),

bottlecap/src/traces/stats_concentrator_service.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use tokio::sync::{mpsc, oneshot};
22

33
use crate::config::Config;
4+
use crate::tags::provider::Provider as TagProvider;
45
use crate::traces::stats_concentrator::StatsConcentrator;
56
use crate::traces::stats_concentrator::StatsEvent;
67
use crate::traces::stats_concentrator::TracerMetadata;
@@ -99,10 +100,13 @@ pub struct StatsConcentratorService {
99100
// to avoid using mutex, which may cause lock contention.
100101
impl StatsConcentratorService {
101102
#[must_use]
102-
pub fn new(config: Arc<Config>) -> (Self, StatsConcentratorHandle) {
103+
pub fn new(
104+
config: Arc<Config>,
105+
tags_provider: Arc<TagProvider>,
106+
) -> (Self, StatsConcentratorHandle) {
103107
let (tx, rx) = mpsc::unbounded_channel();
104108
let handle = StatsConcentratorHandle::new(tx);
105-
let concentrator = StatsConcentrator::new(config);
109+
let concentrator = StatsConcentrator::new(config, tags_provider);
106110
let service: StatsConcentratorService = Self { concentrator, rx };
107111
(service, handle)
108112
}

bottlecap/src/traces/stats_generator.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,11 @@ impl StatsGenerator {
3939
let stats = StatsEvent {
4040
time: span.start.try_into().unwrap_or_default(),
4141
aggregation_key: AggregationKey {
42-
env: span.meta.get("env").cloned().unwrap_or_default(),
42+
env: span
43+
.meta
44+
.get("env")
45+
.cloned()
46+
.unwrap_or("unknown-env".to_string()),
4347
service: span.service.clone(),
4448
name: span.name.clone(),
4549
resource: span.resource.clone(),

0 commit comments

Comments
 (0)