Source code for structum.monitoring
# src/structum/monitoring/__init__.py
# SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: 2025 PythonWoods
"""
Monitoring subsystem for Structum Framework.
**Architectural Role**:
This module acts as the **Observability Facade** (DP-6). It provides a unified,
safe API for emitting metrics (`get_metrics()`) that:
1. **Never Fails**: Uses Null Objects (`NoOpMetrics`) if no backend is configured.
2. **Zero Coupling**: Application code doesn't import Prometheus or Datadog libraries.
3. **Hot-Patchable**: Plugins inject the real backend at runtime.
"""
from .interfaces import MetricsInterface, NoOpMetrics
# Global metrics instance (can be patched by plugins)
_metrics_instance: MetricsInterface = NoOpMetrics()
[docs]
def get_metrics(namespace: str = "structum") -> MetricsInterface:
"""
Get (or create) a metrics emitter for a specific namespace.
**Architectural Role**: Factory Accessor.
This function isolates the application from the instantiation complexity
of metric backends.
Args:
namespace: Logical grouping (e.g., 'structum.database', 'myapp.orders').
Returns:
MetricsInterface: A thread-safe metrics emitter (NoOp or Real).
"""
# For now, return the global instance
# Plugins can patch _metrics_instance
return _metrics_instance
[docs]
def set_metrics_backend(backend: MetricsInterface) -> None:
"""Set the global metrics backend.
This is called by monitoring plugins (e.g., structum_observability)
to inject their implementation.
Args:
backend: MetricsInterface implementation
"""
global _metrics_instance
_metrics_instance = backend
__all__ = [
"MetricsInterface",
"NoOpMetrics",
"get_metrics",
"set_metrics_backend",
]