Skip to content

Commit 9ab8308

Browse files
authored
Add _dd.tags.function to top level trace tags hashmap. (#516)
* Add _dd.tags.function to top level trace tags hashmap. * Tests for get_function_tags_map.
1 parent 63c6515 commit 9ab8308

3 files changed

Lines changed: 79 additions & 3 deletions

File tree

bottlecap/src/tags/lambda/tags.rs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ const SERVICE_KEY: &str = "service";
4444
const COMPUTE_STATS_KEY: &str = "_dd.compute_stats";
4545
// ComputeStatsValue is the tag value indicating trace stats should be computed
4646
const COMPUTE_STATS_VALUE: &str = "1";
47+
// FunctionTagsKey is the tag key for a function's tags to be set on the top level tracepayload
48+
const FUNCTION_TAGS_KEY: &str = "_dd.tags.function";
4749
// TODO(astuyve) decide what to do with the version
4850
const EXTENSION_VERSION_KEY: &str = "dd_extension_version";
4951
// TODO(duncanista) figure out a better way to not hardcode this
@@ -249,6 +251,17 @@ impl Lambda {
249251
pub fn get_tags_map(&self) -> &hash_map::HashMap<String, String> {
250252
&self.tags_map
251253
}
254+
255+
#[must_use]
256+
pub fn get_function_tags_map(&self) -> hash_map::HashMap<String, String> {
257+
let tags = self
258+
.tags_map
259+
.iter()
260+
.map(|(k, v)| format!("{k}:{v}"))
261+
.collect::<Vec<String>>()
262+
.join(",");
263+
hash_map::HashMap::from_iter([(FUNCTION_TAGS_KEY.to_string(), tags)])
264+
}
252265
}
253266

254267
#[cfg(test)]
@@ -371,4 +384,43 @@ mod tests {
371384
fs::remove_file(path).unwrap();
372385
assert_eq!(runtime, "provided.al2023");
373386
}
387+
388+
#[test]
389+
fn test_get_function_tags_map() {
390+
let mut metadata = hash_map::HashMap::new();
391+
metadata.insert(
392+
FUNCTION_ARN_KEY.to_string(),
393+
"arn:aws:lambda:us-west-2:123456789012:function:my-function".to_string(),
394+
);
395+
let config = Arc::new(Config {
396+
service: Some("my-service".to_string()),
397+
tags: Some("key1:value1,key2:value2".to_string()),
398+
env: Some("test".to_string()),
399+
version: Some("1.0.0".to_string()),
400+
..Config::default()
401+
});
402+
let tags = Lambda::new_from_config(config, &metadata);
403+
let function_tags = tags.get_function_tags_map();
404+
assert_eq!(function_tags.len(), 1);
405+
let fn_tags_map: hash_map::HashMap<String, String> = hash_map::HashMap::from_iter(
406+
function_tags
407+
.get(FUNCTION_TAGS_KEY)
408+
.unwrap()
409+
.split(',')
410+
.map(|tag| {
411+
let parts = tag.split(':').collect::<Vec<&str>>();
412+
(parts[0].to_string(), parts[1].to_string())
413+
}),
414+
);
415+
assert_eq!(fn_tags_map.len(), 14);
416+
assert_eq!(fn_tags_map.get("key1").unwrap(), "value1");
417+
assert_eq!(fn_tags_map.get("key2").unwrap(), "value2");
418+
assert_eq!(fn_tags_map.get(ACCOUNT_ID_KEY).unwrap(), "123456789012");
419+
assert_eq!(fn_tags_map.get(ENV_KEY).unwrap(), "test");
420+
assert_eq!(fn_tags_map.get(FUNCTION_ARN_KEY).unwrap(), "arn");
421+
assert_eq!(fn_tags_map.get(FUNCTION_NAME_KEY).unwrap(), "my-function");
422+
assert_eq!(fn_tags_map.get(REGION_KEY).unwrap(), "us-west-2");
423+
assert_eq!(fn_tags_map.get(SERVICE_KEY).unwrap(), "my-service");
424+
assert_eq!(fn_tags_map.get(VERSION_KEY).unwrap(), "1.0.0");
425+
}
374426
}

bottlecap/src/tags/provider.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,19 @@ impl Provider {
5656
pub fn get_tags_map(&self) -> &hash_map::HashMap<String, String> {
5757
self.tag_provider.get_tags_map()
5858
}
59+
60+
#[must_use]
61+
pub fn get_function_tags_map(&self) -> hash_map::HashMap<String, String> {
62+
self.tag_provider.get_function_tags_map()
63+
}
5964
}
6065

6166
trait GetTags {
6267
fn get_tags_vec(&self) -> Vec<String>;
6368
fn get_canonical_id(&self) -> Option<String>;
6469
fn get_canonical_resource_name(&self) -> Option<String>;
6570
fn get_tags_map(&self) -> &hash_map::HashMap<String, String>;
71+
fn get_function_tags_map(&self) -> hash_map::HashMap<String, String>;
6672
}
6773

6874
impl GetTags for TagProvider {
@@ -89,6 +95,12 @@ impl GetTags for TagProvider {
8995
TagProvider::Lambda(lambda_tags) => lambda_tags.get_tags_map(),
9096
}
9197
}
98+
99+
fn get_function_tags_map(&self) -> hash_map::HashMap<String, String> {
100+
match self {
101+
TagProvider::Lambda(lambda_tags) => lambda_tags.get_function_tags_map(),
102+
}
103+
}
92104
}
93105

94106
#[cfg(test)]

bottlecap/src/traces/trace_processor.rs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ use datadog_trace_obfuscation::obfuscation_config;
77
use datadog_trace_protobuf::pb;
88
use datadog_trace_utils::config_utils::trace_intake_url;
99
use datadog_trace_utils::tracer_header_tags;
10-
use datadog_trace_utils::tracer_payload::{TraceChunkProcessor, TraceCollection::V07};
10+
use datadog_trace_utils::tracer_payload::{
11+
TraceChunkProcessor, TraceCollection::V07, TracerPayloadCollection,
12+
};
1113
use ddcommon::Endpoint;
1214
use std::str::FromStr;
1315
use std::sync::Arc;
@@ -136,7 +138,7 @@ impl TraceProcessor for ServerlessTraceProcessor {
136138
body_size: usize,
137139
span_pointers: Option<Vec<SpanPointer>>,
138140
) -> SendData {
139-
let payload = trace_utils::collect_trace_chunks(
141+
let mut payload = trace_utils::collect_trace_chunks(
140142
V07(traces),
141143
&header_tags,
142144
&mut ChunkProcessor {
@@ -146,6 +148,16 @@ impl TraceProcessor for ServerlessTraceProcessor {
146148
},
147149
true,
148150
);
151+
match payload {
152+
TracerPayloadCollection::V04(_) => {}
153+
TracerPayloadCollection::V07(ref mut collection) => {
154+
// add function tags to all payloads in this TracerPayloadCollection
155+
let tags = tags_provider.get_function_tags_map();
156+
for tracer_payload in collection.iter_mut() {
157+
tracer_payload.tags.extend(tags.clone());
158+
}
159+
}
160+
}
149161
let intake_url = trace_intake_url(&config.site);
150162
let endpoint = Endpoint {
151163
url: hyper::Uri::from_str(&intake_url).expect("can't parse trace intake URL, exiting"),
@@ -296,7 +308,7 @@ mod tests {
296308
tags: HashMap::new(),
297309
dropped_trace: false,
298310
}],
299-
tags: HashMap::new(),
311+
tags: tags_provider.get_function_tags_map(),
300312
env: "test-env".to_string(),
301313
hostname: String::new(),
302314
app_version: String::new(),

0 commit comments

Comments
 (0)