Skip to main content

init_observability

Function init_observability 

Source
pub async fn init_observability(
    config: ObservabilityConfig,
) -> Result<ObservabilityHandle, ObservabilityError>
Expand description

Initialize the unified observability system.

This function provides a single entry point for initializing all observability components (logging, tracing, metrics server). It is idempotent - calling it multiple times will return an error after the first call.

§Components

  • Logging: Structured logging with configurable format and output
  • Tracing: Distributed tracing with OpenTelemetry support
  • Metrics Server: HTTP server exposing Prometheus metrics

All components are optional. Set a component to None in the config to disable it.

§Arguments

  • config - Unified observability configuration

§Returns

  • Ok(ObservabilityHandle) - Handle for graceful shutdown and metrics access
  • Err(ObservabilityError) - If initialization fails or already initialized

§Idempotency

This function can only be called once per process. Subsequent calls will return Err(ObservabilityError::AlreadyInitialized). This ensures that global state (logging subscriber, tracer provider) is only set once.

§Example

use elara_runtime::observability::{
    ObservabilityConfig, LoggingConfig, LogLevel, LogFormat, LogOutput,
    TracingConfig, TracingExporter, MetricsServerConfig, init_observability
};

let config = ObservabilityConfig {
    logging: Some(LoggingConfig {
        level: LogLevel::Info,
        format: LogFormat::Json,
        output: LogOutput::Stdout,
    }),
    tracing: Some(TracingConfig {
        service_name: "elara-node".to_string(),
        exporter: TracingExporter::Otlp {
            endpoint: "http://localhost:4317".to_string(),
        },
        sampling_rate: 0.1,
        resource_attributes: vec![
            ("environment".to_string(), "production".to_string()),
        ],
    }),
    metrics_server: Some(MetricsServerConfig {
        bind_address: "0.0.0.0".to_string(),
        port: 9090,
    }),
};

let handle = init_observability(config).await?;

// Use observability throughout your application
tracing::info!("Application started");

// Graceful shutdown
handle.shutdown().await?;

§Minimal Example (Logging Only)

use elara_runtime::observability::{
    ObservabilityConfig, LoggingConfig, LogLevel, LogFormat, LogOutput, init_observability
};

let config = ObservabilityConfig {
    logging: Some(LoggingConfig {
        level: LogLevel::Info,
        format: LogFormat::Pretty,
        output: LogOutput::Stdout,
    }),
    tracing: None,
    metrics_server: None,
};

let handle = init_observability(config).await?;