opentelemetry-rust/opentelemetry-stdout/examples/basic.rs

196 lines
4.9 KiB
Rust

//! run with `$ cargo run --example basic
use once_cell::sync::Lazy;
use opentelemetry::{global, KeyValue};
#[cfg(feature = "trace")]
use opentelemetry::trace::Tracer;
#[cfg(feature = "metrics")]
use opentelemetry_sdk::metrics::SdkMeterProvider;
#[cfg(feature = "trace")]
use opentelemetry_sdk::trace::SdkTracerProvider;
use opentelemetry_sdk::Resource;
static RESOURCE: Lazy<Resource> = Lazy::new(|| {
Resource::builder()
.with_service_name("basic-stdout-example")
.build()
});
#[cfg(feature = "trace")]
fn init_trace() -> SdkTracerProvider {
let exporter = opentelemetry_stdout::SpanExporter::default();
let provider = SdkTracerProvider::builder()
.with_simple_exporter(exporter)
.with_resource(RESOURCE.clone())
.build();
global::set_tracer_provider(provider.clone());
provider
}
#[cfg(feature = "metrics")]
fn init_metrics() -> opentelemetry_sdk::metrics::SdkMeterProvider {
let exporter = opentelemetry_stdout::MetricExporter::default();
let provider = SdkMeterProvider::builder()
.with_periodic_exporter(exporter)
.with_resource(RESOURCE.clone())
.build();
global::set_meter_provider(provider.clone());
provider
}
#[cfg(feature = "logs")]
fn init_logs() -> opentelemetry_sdk::logs::SdkLoggerProvider {
use opentelemetry_appender_tracing::layer;
use opentelemetry_sdk::logs::SdkLoggerProvider;
use tracing_subscriber::prelude::*;
let exporter = opentelemetry_stdout::LogExporter::default();
let provider: SdkLoggerProvider = SdkLoggerProvider::builder()
.with_simple_exporter(exporter)
.with_resource(RESOURCE.clone())
.build();
let layer = layer::OpenTelemetryTracingBridge::new(&provider);
tracing_subscriber::registry().with(layer).init();
provider
}
#[cfg(feature = "trace")]
fn emit_span() {
use opentelemetry::{trace::TraceContextExt, InstrumentationScope};
let scope = InstrumentationScope::builder("stdout-example")
.with_version("v1")
.with_attributes([KeyValue::new("scope_key", "scope_value")])
.build();
let tracer = global::tracer_with_scope(scope);
tracer.in_span("example-span", |cx| {
let span = cx.span();
span.set_attribute(KeyValue::new("my-attribute", "my-value"));
span.add_event(
"example-event-name",
vec![KeyValue::new("event_attribute1", "event_value1")],
);
emit_log();
})
}
#[cfg(feature = "metrics")]
fn emit_metrics() {
let meter = global::meter("stdout-example");
let c = meter.u64_counter("example_counter").build();
c.add(
1,
&[
KeyValue::new("name", "apple"),
KeyValue::new("color", "green"),
],
);
c.add(
1,
&[
KeyValue::new("name", "apple"),
KeyValue::new("color", "green"),
],
);
c.add(
2,
&[
KeyValue::new("name", "apple"),
KeyValue::new("color", "red"),
],
);
c.add(
1,
&[
KeyValue::new("name", "banana"),
KeyValue::new("color", "yellow"),
],
);
c.add(
11,
&[
KeyValue::new("name", "banana"),
KeyValue::new("color", "yellow"),
],
);
let h = meter.f64_histogram("example_histogram").build();
h.record(
1.0,
&[
KeyValue::new("name", "apple"),
KeyValue::new("color", "green"),
],
);
h.record(
1.0,
&[
KeyValue::new("name", "apple"),
KeyValue::new("color", "green"),
],
);
h.record(
2.0,
&[
KeyValue::new("name", "apple"),
KeyValue::new("color", "red"),
],
);
h.record(
1.0,
&[
KeyValue::new("name", "banana"),
KeyValue::new("color", "yellow"),
],
);
h.record(
11.0,
&[
KeyValue::new("name", "banana"),
KeyValue::new("color", "yellow"),
],
);
}
#[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")]
let tracer_provider = init_trace();
#[cfg(feature = "metrics")]
let meter_provider = init_metrics();
#[cfg(feature = "logs")]
let logger_provider = init_logs();
#[cfg(feature = "logs")]
emit_log();
#[cfg(feature = "trace")]
emit_span();
#[cfg(feature = "metrics")]
emit_metrics();
#[cfg(feature = "trace")]
tracer_provider.shutdown()?;
#[cfg(feature = "metrics")]
meter_provider.shutdown()?;
#[cfg(feature = "logs")]
logger_provider.shutdown()?;
Ok(())
}