4 releases
0.2.0 | Jun 9, 2020 |
---|---|
0.1.2 | Feb 14, 2020 |
0.1.1 | Feb 14, 2020 |
0.1.0 | Feb 14, 2020 |
#5 in #apm
20KB
355 lines
datadog apm
Unofficial Datadog APM for Rust.
Based on datadog documentation.
Usage
Check the docs for usage instructions.
Examples
Check the examples/ folder!
License
This project is licensed under the MIT license.
lib.rs
:
Unofficial Datadog APM for Rust.
Based on datadog documentation.
Overview
- built for high throughput without block the caller (using tokio channel);
- high configurable with sensible defaults;
- efficient network and resource usage:
traces
buffering + serializing to messagepack; - discard traces when the buffer queue is full;
- low-level, so it does not automatically instrument your code;
Usage
Add datadog_apm
and tokio
to your dependencies:
tokio = { version = "0.2", features = ["full"] }
datadog-apm = "0.2"
- Create the client: (remember to reuse the same client instead of create a new one everytime, so the buffer can work)
use datadog_apm::{Client, Config};
let client = Client::new(Config {
env: Some("production".to_string()),
service: "my-crate".to_string(),
..Default::default()
});
- create a trace with spans: (for this example there is a span for a http request and a child-span for the sql transaction)
use datadog_apm::{Trace, Span, HttpInfo, ErrorInfo, SqlInfo};
use std::collections::HashMap;
use std::time::{Duration, SystemTime};
let trace = Trace {
id: 123,
priority: 1,
spans: vec![Span {
id: 1,
parent_id: None,
name: "request".to_string(),
resource: "GET /path".to_string(),
r#type: "web".to_string(),
start: SystemTime::now(),
duration: Duration::from_millis(50),
http: Some(HttpInfo {
url: String::from("/path/2?param=true"),
method: String::from("GET"),
status_code: String::from("500"),
}),
error: Some(ErrorInfo {
r#type: "unknown".to_string(),
msg: "Internal error".to_string(),
stack: "stack here".to_string(),
}),
sql: None,
tags: HashMap::new(),
}, Span {
id: 2,
parent_id: Some(1),
name: "database".to_string(),
resource: "select".to_string(),
r#type: "db".to_string(),
start: SystemTime::now(),
duration: Duration::from_millis(20),
http: None,
error: None,
sql: Some(SqlInfo {
query: "select 1".to_string(),
rows: "1".to_string(),
db: "test".to_string(),
}),
tags: HashMap::new(),
}]
};
- send the trace:
client.send_trace(trace);
And that's it! The trace will be buffered and sent without block the current caller.
Config
Check Config
for all available configurations.
Features that are not included yet: (Contributions welcome!)
Dependencies
~10MB
~169K SLoC