forked from open-telemetry/opentelemetry-rust
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbasic.rs
113 lines (89 loc) · 3.1 KB
/
basic.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
104
105
106
107
108
109
110
111
112
113
//! run with `$ cargo run --example basic
use opentelemetry::{global, KeyValue};
#[cfg(feature = "trace")]
use opentelemetry::trace::{Span, Tracer};
#[cfg(feature = "metrics")]
use opentelemetry_sdk::runtime;
#[cfg(feature = "metrics")]
use opentelemetry_sdk::metrics::{PeriodicReader, SdkMeterProvider};
#[cfg(feature = "trace")]
use opentelemetry_sdk::trace::TracerProvider;
#[cfg(feature = "trace")]
fn init_trace() {
let exporter = opentelemetry_stdout::SpanExporter::default();
let provider = TracerProvider::builder()
.with_simple_exporter(exporter)
.build();
global::set_tracer_provider(provider);
}
#[cfg(feature = "metrics")]
fn init_metrics() -> opentelemetry_sdk::metrics::SdkMeterProvider {
let exporter = opentelemetry_stdout::MetricsExporter::default();
let reader = PeriodicReader::builder(exporter, runtime::Tokio).build();
let provider = SdkMeterProvider::builder().with_reader(reader).build();
global::set_meter_provider(provider.clone());
provider
}
#[cfg(feature = "logs")]
fn init_logs() -> opentelemetry_sdk::logs::LoggerProvider {
use opentelemetry_appender_tracing::layer;
use opentelemetry_sdk::logs::LoggerProvider;
use tracing_subscriber::prelude::*;
let exporter = opentelemetry_stdout::LogExporter::default();
let provider: LoggerProvider = LoggerProvider::builder()
.with_simple_exporter(exporter)
.build();
let layer = layer::OpenTelemetryTracingBridge::new(&provider);
tracing_subscriber::registry().with(layer).init();
provider
}
#[cfg(feature = "trace")]
fn emit_span() {
let tracer = global::tracer("stdout-test");
let mut span = tracer.start("test_span");
span.set_attribute(KeyValue::new("test_key", "test_value"));
span.add_event(
"test_event",
vec![KeyValue::new("test_event_key", "test_event_value")],
);
span.end();
}
#[cfg(feature = "metrics")]
fn emit_metrics() {
let meter = global::meter("stdout-test");
let c = meter.u64_counter("test_counter").init();
c.add(1, &[KeyValue::new("test_key", "test_value")]);
}
#[cfg(feature = "logs")]
fn emit_log() {
use tracing::error;
error!(name: "my-event-name", target: "my-system", event_id = 20, user_name = "otel", user_email = "otel@opentelemetry.io");
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
#[cfg(feature = "trace")]
init_trace();
#[cfg(feature = "metrics")]
let meter_provider = init_metrics();
#[cfg(feature = "logs")]
let logger_provider = init_logs();
#[cfg(feature = "logs")]
emit_log();
println!(
"======================================================================================"
);
#[cfg(feature = "trace")]
emit_span();
println!(
"======================================================================================"
);
#[cfg(feature = "metrics")]
emit_metrics();
#[cfg(feature = "trace")]
global::shutdown_tracer_provider();
#[cfg(feature = "metrics")]
meter_provider.shutdown()?;
#[cfg(feature = "logs")]
logger_provider.shutdown()?;
Ok(())
}