fleetforge_telemetry/
lib.rs

1//! Observability bootstrap utilities and analytics sinks for FleetForge services.
2
3pub mod analytics;
4pub mod audit;
5pub mod context;
6pub mod exporters;
7pub mod metrics;
8pub mod otel;
9pub mod telemetry_core;
10
11/// Canonical OpenTelemetry attribute keys emitted for Trust Mesh metadata.
12pub const TRUST_ATTRIBUTE_KEYS: &[&str] = &[
13    "trust.attestation_ids",
14    "trust.attestation_id",
15    "trust.subject",
16    "trust.policy_decision_id",
17    "trust.capability_token_id",
18];
19
20use anyhow::Result;
21use opentelemetry_sdk::propagation::TraceContextPropagator;
22use tracing_subscriber::{
23    layer::SubscriberExt,
24    util::{SubscriberInitExt, TryInitError},
25    EnvFilter, Registry,
26};
27
28/// Guard that keeps telemetry pipelines alive until dropped.
29pub struct TelemetryGuard;
30
31impl TelemetryGuard {
32    /// Initialize tracing/logging exporters with OTLP gRPC targeting the configured Collector.
33    pub fn init(service_name: &str) -> Result<Self> {
34        init_telemetry(service_name)
35    }
36
37    /// Back-compat shim for earlier call sites.
38    pub fn init_default(service_name: &str) -> Result<Self> {
39        Self::init(service_name)
40    }
41}
42
43/// Configures tracing, metrics, and logs to export via OTLP over gRPC to the local Collector.
44pub fn init_telemetry(service_name: &str) -> Result<TelemetryGuard> {
45    crate::otel::set_text_map_propagator(TraceContextPropagator::new());
46
47    let telemetry_layer = crate::telemetry_core::otlp::build_layers(service_name)?;
48    let fmt_layer = tracing_subscriber::fmt::layer().with_target(true);
49    let env_filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info"));
50
51    let subscriber = Registry::default()
52        .with(env_filter)
53        .with(fmt_layer)
54        .with(telemetry_layer);
55
56    if let Err(err) = subscriber.try_init() {
57        let err: TryInitError = err;
58        eprintln!("tracing subscriber init: {err}");
59    }
60
61    Ok(TelemetryGuard)
62}
63
64impl Drop for TelemetryGuard {
65    fn drop(&mut self) {
66        crate::otel::shutdown_tracer_provider();
67    }
68}