-
Notifications
You must be signed in to change notification settings - Fork 94
/
Copy pathextract_from_transaction.rs
103 lines (85 loc) · 3.36 KB
/
extract_from_transaction.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
use std::collections::BTreeMap;
use chrono::SecondsFormat;
use relay_common::SpanStatus;
use relay_general::protocol::{AsPair, Context, ContextInner, Event, TraceContext};
use relay_general::types::Annotated;
pub fn extract_transaction_metadata(event: &Event) -> BTreeMap<String, String> {
let mut tags = BTreeMap::new();
if let Some(release) = event.release.as_str() {
tags.insert("release".to_owned(), release.to_owned());
}
if let Some(dist) = event.dist.as_str() {
tags.insert("dist".to_owned(), dist.to_owned());
}
if let Some(dist) = event.dist.value() {
tags.insert("dist".to_owned(), dist.clone());
}
if let Some(environment) = event.environment.as_str() {
tags.insert("environment".to_owned(), environment.to_owned());
}
if let Some(transaction) = event.transaction.value() {
tags.insert("transaction".to_owned(), transaction.to_owned());
}
if let Some(trace_context) = get_trace_context(event) {
let status = extract_transaction_status(trace_context);
tags.insert("transaction.status".to_owned(), status.to_string());
if let Some(op) = trace_context.op.value() {
tags.insert("transaction.op".to_owned(), op.to_owned());
}
}
if let Some(http_method) = extract_http_method(event) {
tags.insert("http.method".to_owned(), http_method);
}
if let Some(timestamp) = event.start_timestamp.value() {
tags.insert(
"transaction.start".to_owned(),
timestamp
.into_inner()
.to_rfc3339_opts(SecondsFormat::Nanos, false),
);
}
if let Some(timestamp) = event.timestamp.value() {
tags.insert(
"transaction.end".to_owned(),
timestamp
.into_inner()
.to_rfc3339_opts(SecondsFormat::Nanos, false),
);
}
tags
}
pub fn extract_transaction_tags(event: &Event) -> BTreeMap<String, String> {
let mut tags = BTreeMap::new();
// XXX(slow): event tags are a flat array
if let Some(event_tags) = event.tags.value() {
for tag_entry in &**event_tags {
if let Some(entry) = tag_entry.value() {
let (key, value) = entry.as_pair();
if let (Some(key), Some(value)) = (key.as_str(), value.as_str()) {
tags.insert(key.to_owned(), value.to_owned());
}
}
}
}
tags
}
/// Extract transaction status, defaulting to [`SpanStatus::Unknown`].
/// Must be consistent with `process_trace_context` in [`relay_general::store`].
fn extract_transaction_status(trace_context: &TraceContext) -> SpanStatus {
*trace_context.status.value().unwrap_or(&SpanStatus::Unknown)
}
/// Extract HTTP method
/// See <https://github.com/getsentry/snuba/blob/2e038c13a50735d58cc9397a29155ab5422a62e5/snuba/datasets/errors_processor.py#L64-L67>.
fn extract_http_method(transaction: &Event) -> Option<String> {
let request = transaction.request.value()?;
let method = request.method.value()?;
Some(method.clone())
}
fn get_trace_context(event: &Event) -> Option<&TraceContext> {
let contexts = event.contexts.value()?;
let trace = contexts.get("trace").and_then(Annotated::value);
if let Some(ContextInner(Context::Trace(trace_context))) = trace {
return Some(trace_context.as_ref());
}
None
}