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 accessErr(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?;