Observability Core - Foundation Library
WASM-native hexagonal observability foundation for structured logging
This is the core observability library providing structured logging, metrics collection, and distributed tracing with pure WASM compatibility and zero external dependencies.
๐ฏ Core Mission
Provide solid observability foundation with standard Rust logging integration:
let manager = new?;
manager.initialize?;
// Standard Rust logging is now structured and context-aware
info!;
๐๏ธ Hexagonal Architecture
๐ฆ observability_core/
โโโ ๐ง domain/ # Pure business logic (LogEntry, ProcessorChain, TraceContext)
โโโ ๐ ports/ # Abstract interfaces (TransportPort, FormatterPort, StandardLoggingPort)
โโโ ๐ง adapters/ # WASM implementations (WasmStdoutAdapter, StandardLogAdapter)
โโโ ๐ extension/ # Core components (ObservabilityManager, GlobalLoggerSingleton)
โโโ ๐ batching/ # Telemetry batching system
โโโ ๐ context/ # W3C trace context + thread-local management
โโโ ๐ญ noop/ # Zero-cost no-op implementations
โจ Core Features
๐ Standard Logging Integration
- โ
Rust log:: Integration:
log::info!,log::debug!work out of the box - โ Structured Fields: Support for structured JSON output
- โ Global Logger Singleton: Thread-safe, initialize-once pattern
- โ Context Enrichment: Automatic trace_id, timestamp injection
- โ Multiple Formatters: JSON, Compact, PlainText formatters
๐ Basic Metrics
- โ MetricsPort Interface: Counter, Histogram, Gauge abstractions
- โ MetricsEntry Domain: Core metrics data structures
- โ WASM Stdout Transport: Stdout-based metrics export
- โ Basic Types: BasicMetricType enumeration (Counter, Histogram, Gauge)
๐ Distributed Tracing
- โ W3C Trace Context: Full W3C traceparent/tracestate support
- โ Header Injection/Extraction: Automatic trace propagation
- โ Thread-Local Context: WASM-compatible context management
- โ
Scoped Execution:
with_context()for guaranteed cleanup - โ TraceContext Domain: Basic trace context management
๐ง Processing Pipeline
- โ ProcessorChain: Composable processing pipeline
- โ Built-in Processors: Timestamp, Context, StructuredFields, LevelFilter
- โ LogProcessor Trait: Interface for custom processors
- โ Enhanced Context: Context enrichment with metadata
๐ฆ Batching System
- โ BatchingManager: Memory-efficient telemetry batching
- โ BatchingConfig: Configurable batch size and flush intervals
- โ Multi-Type Support: Logs and metrics batching
- โ Buffer Statistics: Real-time buffer monitoring
๐ญ No-Op Implementations
- โ Zero-Cost Abstractions: Complete no-op implementations when disabled
- โ NoOpTransport: No-op transport for testing
- โ NoOpProcessor: No-op processor for benchmarking
๐ Core Integration
- โ Global Logger Singleton: Thread-safe, initialize-once pattern
- โ Configuration Management: JSON/YAML config support with validation
- โ Manager Interface: Simple ObservabilityManager for easy integration
- โ Factory Functions: Convenient creation from configuration
๐ Feature Flags
[]
= ["structured-logging"]
= ["otel-2025", "structured-logging", "prometheus-federation"]
= ["opentelemetry", "opentelemetry-semantic-conventions"]
= ["serde", "serde_json", "chrono", "log", "tracing"]
= ["prometheus"]
๐ Quick Start
1. Add to Cargo.toml
[]
= { = "../observability_core", = ["structured-logging"] }
= "0.4"
2. Create Configuration
use ;
let config = ObservabilityConfig ;
3. Use in Your Application
use ;
use ;
๐ Configuration
ObservabilityConfig
BatchingConfig
โ Verification Success Criteria
๐งช Unit Tests
- Configuration Tests: All config parsing and validation scenarios pass
- Processor Chain Tests: All built-in processors work correctly
- Formatter Tests: JSON, Compact, PlainText output validation passes
- Batching Tests: Memory management and flush strategies work
- Context Tests: W3C trace context and thread-local management
- No-Op Tests: Zero-cost abstractions verified
๐ Integration Tests
- Standard Logging:
log::info!produces structured JSON output - Extension Discovery: Auto-discovery via
component_core::Extensionworks - Config Loading: SpinConfig integration loads from Spin variables
- Context Propagation: TraceContext propagates correctly
- Formatter Integration: All formatters produce expected output
- Transport Integration: WasmStdoutAdapter transports correctly
๐ฏ End-to-End Tests with real_world_verification
- Agent Lifecycle: Full agent startup โ logging โ shutdown cycle
- Error Scenarios: Graceful handling of config errors, transport failures
- Performance: No significant overhead in logging hot paths
- Memory Safety: No leaks under normal and error conditions
- WASM Compatibility: Runs successfully in SpinKube environment
- Feature Flag Testing: All feature combinations work correctly
๐ Performance Benchmarks
- Logging Throughput: >5K structured log entries/second in WASM
- Memory Usage: <1MB total memory footprint for default configuration
- Startup Time: <25ms additional startup time for initialization
- Context Overhead: <20ns overhead for context-enriched logging
๐ Observability Validation
- Structured Output: All log entries contain required structured fields
- Trace Correlation: trace_id propagated correctly across operations
- Basic Metrics: MetricsPort interface works with simple metrics
- Error Tracking: All error conditions logged with appropriate context
- Health Monitoring: Extension health checks report accurate status
๐ Production Readiness
- Graceful Degradation: Continues working if transports fail
- Resource Limits: Respects memory constraints in WASM
- Error Recovery: Recovers from transient formatting errors
- Multi-Agent Support: Works correctly with multiple agent instances
๐ Examples
Available Examples
basic_metrics_demo.rs: Simple metrics collectionintegrated_context_demo.rs: Context management with dependency injectionraii_scoped_context_demo.rs: Exception-safe context cleanup patternsstandard_logging_demo.rs: Standard Rust logging integrationtracing_and_kv_demo.rs: Tracing integration and structured fields
Running Examples
# Standard logging integration
# Metrics demonstration
# Context management
# All features
๐ ๏ธ Development & Testing
Run Tests
# Unit tests
# Integration tests
# All features
Verify Extension Registration
# Check extension auto-discovery
๐ฏ Usage Patterns
Basic Agent Integration
// Automatic initialization via AgentBuilder
let agent = from_config?.init?;
// Standard logging works immediately
info!;
Custom Processing
// Add custom log processors
let chain = new
.add_processor
.add_processor
.add_processor;
Metrics Usage
// Use MetricsPort for basic metrics
let metrics_entry = MetricsEntry ;
Foundation โข WASM-Native โข Zero Dependencies โข Hexagonal Architecture