Source code for structum_lab.plugins.observability

# src/structum_lab.plugins.observability/__init__.py
# SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: 2025 PythonWoods

"""Structum Observability Plugin.

Implementation of logging and metrics interfaces using Structlog and contextvars.
"""

from contextvars import ContextVar

import structum_lab.logging as core_logging
import structum_lab.monitoring

from .metrics import MetricsCollector, track_operation
from .observability import StructuredLogger, configure_structlog, get_structlog_logger

# Context Vars (Re-exported for convenience)
request_id_ctx: ContextVar[str] = ContextVar("request_id", default="")
user_ctx: ContextVar[str] = ContextVar("user", default="")

# Alias for compatibility if needed, or internal usage
StructlogAdapter = StructuredLogger


# --- Auto-Initialization ---
[docs] def initialize(log_level: str = "INFO", json_logs: bool = True): """Manual initialization function.""" configure_structlog(log_level, json_logs) # Create local logger for this module APTER configuration log = get_structlog_logger(__name__) # Patch core logging with structlog wrapper core_logging._logger_factory = lambda name: StructuredLogger(name) log.info("Structlog integration enabled for Structum") # Patch Metrics (Prometheus) try: from .prometheus import PrometheusMetrics # Set Prometheus as the global metrics backend structum_lab.monitoring.set_metrics_backend(PrometheusMetrics()) log.info("Prometheus metrics integration enabled for Structum") except ImportError as e: log.warning(f"Prometheus metrics not available: {e}") except Exception as e: log.error(f"Failed to enable Prometheus metrics: {e}")
# Auto-run with defaults (can be re-configured by app) initialize() __all__ = [ "configure_structlog", "StructuredLogger", "MetricsCollector", "track_operation", "request_id_ctx", "user_ctx", "initialize", ]