pf_observability_core 0.1.0

Core observability types and traits for the PromptFleet agent ecosystem
Documentation
# 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:
```rust
let manager = ObservabilityManager::new(config)?;
manager.initialize()?;
// Standard Rust logging is now structured and context-aware
log::info!("Processing request");
```

## ๐Ÿ—๏ธ **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**

```toml
[features]
default = ["structured-logging"]
observability = ["otel-2025", "structured-logging", "prometheus-federation"] 
otel-2025 = ["opentelemetry", "opentelemetry-semantic-conventions"]
structured-logging = ["serde", "serde_json", "chrono", "log", "tracing"]
prometheus-federation = ["prometheus"]
```

## ๐Ÿš€ **Quick Start**

### 1. Add to Cargo.toml
```toml
[dependencies]
observability_core = { path = "../observability_core", features = ["structured-logging"] }
log = "0.4"
```

### 2. Create Configuration
```rust
use observability_core::{ObservabilityConfig, ObservabilityManager};

let config = ObservabilityConfig {
    level: "info".to_string(),
    format: "compact".to_string(),
    structured: true,
    context_enrichment: true,
    default_context: Default::default(),
};
```

### 3. Use in Your Application
```rust
use observability_core::{ObservabilityManager, ObservabilityResult};
use log::{info, debug, warn, error};

fn main() -> ObservabilityResult<()> {
    // Initialize observability manager
    let mut manager = ObservabilityManager::new(config)?;
    manager.initialize()?;
    
    // Standard Rust logging is now structured!
    info!("Application started successfully");
    debug!("Configuration loaded");
    warn!("High memory usage detected");
    
    Ok(())
}
```

## ๐Ÿ“Š **Configuration**

### ObservabilityConfig
```rust
#[derive(Serialize, Deserialize)]
pub struct ObservabilityConfig {
    /// Log level: "error", "warn", "info", "debug", "trace"
    pub level: String,
    
    /// Output format: "json", "compact", "plain"  
    pub format: String,
    
    /// Enable structured logging features
    pub structured: bool,
    
    /// Enable context enrichment
    pub context_enrichment: bool,
    
    /// Default context fields for all log entries
    pub default_context: HashMap<String, serde_json::Value>,
}
```

### BatchingConfig
```rust
#[derive(Clone)]
pub struct BatchingConfig {
    /// Maximum items per batch (default: 100)
    pub max_batch_size: usize,
    
    /// Flush interval (default: 5s)
    pub flush_interval: Duration,
    
    /// Memory limit in bytes (default: 1MB)
    pub max_memory_bytes: usize,
    
    /// Drop on overflow vs evict oldest (default: true)
    pub drop_on_overflow: bool,
}
```

## โœ… **Verification Success Criteria**

### ๐Ÿงช **Unit Tests**
- [x] **Configuration Tests**: All config parsing and validation scenarios pass
- [x] **Processor Chain Tests**: All built-in processors work correctly
- [x] **Formatter Tests**: JSON, Compact, PlainText output validation passes
- [x] **Batching Tests**: Memory management and flush strategies work
- [x] **Context Tests**: W3C trace context and thread-local management
- [x] **No-Op Tests**: Zero-cost abstractions verified

### ๐Ÿ”— **Integration Tests**  
- [ ] **Standard Logging**: `log::info!` produces structured JSON output
- [ ] **Extension Discovery**: Auto-discovery via `component_core::Extension` works
- [ ] **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 collection
- **`integrated_context_demo.rs`**: Context management with dependency injection
- **`raii_scoped_context_demo.rs`**: Exception-safe context cleanup patterns
- **`standard_logging_demo.rs`**: Standard Rust logging integration
- **`tracing_and_kv_demo.rs`**: Tracing integration and structured fields

### Running Examples
```bash
# Standard logging integration
cargo run --example standard_logging_demo --features structured-logging

# Metrics demonstration
cargo run --example basic_metrics_demo --features structured-logging

# Context management  
cargo run --example raii_scoped_context_demo

# All features
cargo run --example integrated_context_demo
```

## ๐Ÿ› ๏ธ **Development & Testing**

### Run Tests
```bash
# Unit tests
cargo test

# Integration tests  
cargo test --features structured-logging

# All features
cargo test --features observability
```

### Verify Extension Registration
```bash
# Check extension auto-discovery
cargo check --features structured-logging
```

## ๐ŸŽฏ **Usage Patterns**

### Basic Agent Integration
```rust
// Automatic initialization via AgentBuilder
let agent = AgentBuilder::from_config("config.json")?.init()?;

// Standard logging works immediately  
log::info!("Agent ready for requests");
```

### Custom Processing
```rust
// Add custom log processors
let chain = ProcessorChain::new()
    .add_processor(Box::new(TimestampProcessor))
    .add_processor(Box::new(ContextEnrichmentProcessor))
    .add_processor(Box::new(StructuredFieldsProcessor));
```

### Metrics Usage
```rust
// Use MetricsPort for basic metrics
let metrics_entry = MetricsEntry {
    name: "request_count".to_string(),
    metric_type: BasicMetricType::Counter,
    value: 1.0,
    labels: HashMap::new(),
    timestamp: Utc::now(),
};
```

---

**Foundation** โ€ข **WASM-Native** โ€ข **Zero Dependencies** โ€ข **Hexagonal Architecture**