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
use prima_tracing::{builder, configure_subscriber, init_subscriber, Country, Environment};
use tracing::{info, info_span};
#[tokio::main]
async fn main() {
let service_name = "datadog-logger".to_string();
let subscriber = configure_subscriber(
builder(&service_name)
.with_env(Environment::Dev)
.with_country(Country::Common)
.with_version("1.0".to_string())
// We need a tracer if we want trace and span IDs to be created and propagated, otherwise logs won't contain these correlation IDs
// You can also setup custom tracer and custom subscriber if you don't wanna use the `traces` feature
.with_telemetry("http://localhost:55681".to_string(), service_name)
.build(),
);
let _guard = init_subscriber(subscriber);
// If inside a span the JSON logs will contain `"dd":{"span_id": u64,"trace_id": u64}` at root level and Datadog will use it to correlate logs and traces.
// If you don't use Datadog for logging you can search for the span_id on the APM/Traces dashboard.
let main_span = info_span!("MainSpan");
main_span.in_scope(|| {
// this log will be correlated to the MainSpan span_id
info!("Starting my awesome app in the MainSpan");
let hello_span = info_span!("HelloSpan");
// all the logs inside this scope will be correlated to the HelloSpan span_id
hello_span.in_scope(|| {
hello();
});
});
}
fn hello() {
info!("Hello!");
hola();
}
fn hola() {
info!("Hola!");
halo();
}
fn halo() {
info!("Halo!");
}