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",
]