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:

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

[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

[dependencies]
observability_core = { path = "../observability_core", features = ["structured-logging"] }
log = "0.4"

2. Create Configuration

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

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

#[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

#[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

  • 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::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

# 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

# Unit tests
cargo test

# Integration tests  
cargo test --features structured-logging

# All features
cargo test --features observability

Verify Extension Registration

# Check extension auto-discovery
cargo check --features structured-logging

๐ŸŽฏ Usage Patterns

Basic Agent Integration

// Automatic initialization via AgentBuilder
let agent = AgentBuilder::from_config("config.json")?.init()?;

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

Custom Processing

// 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

// 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