use sideways_otel::prelude::*;
use sideways_otel::{init_telemetry, TelemetryConfig};
#[tokio::main]
async fn main() {
let config = TelemetryConfig::from_env();
let telemetry = init_telemetry(&config);
let _open_connections = observable_gauge("orders.open_connections", |observer| {
observer.observe(3.0, &[KeyValue::new("pool", "primary")]);
});
process_order("order-42").await;
telemetry.shutdown();
}
#[tracing::instrument]
async fn process_order(order_id: &str) {
tracing::info!("Processing order");
set_attribute(KeyValue::new("order.id", order_id.to_string()));
{
let _guard = tracing::info_span!("order.validate").entered();
tracing::info!("Validating order");
}
use tracing::Instrument;
async {
tracing::info!("Charging card");
}
.instrument(tracing::info_span!("order.charge_card"))
.await;
save_order(order_id, &DbPool).await;
let requests = counter("orders.processed");
requests.add(1, &[KeyValue::new("status", "success")]);
let latency = histogram("order.processing_duration_ms");
latency.record(12.5, &[KeyValue::new("order.id", order_id.to_string())]);
let queue_depth = up_down_counter("orders.queue_depth");
queue_depth.add(-1, &[]);
let mut carrier = std::collections::HashMap::new();
opentelemetry::global::get_text_map_propagator(|propagator| {
propagator.inject_context(&tracing::Span::current().context(), &mut HashMapCarrier(&mut carrier));
});
tracing::info!(?carrier, "Headers to send with the outgoing request");
}
struct HashMapCarrier<'a>(&'a mut std::collections::HashMap<String, String>);
impl opentelemetry::propagation::Injector for HashMapCarrier<'_> {
fn set(&mut self, key: &str, value: String) {
self.0.insert(key.to_string(), value);
}
}
struct DbPool;
#[tracing::instrument(skip_all, fields(order.id = %order_id))]
async fn save_order(order_id: &str, _db: &DbPool) {
tracing::info!("Saving order to database");
}