Skip to content

Commit 87b5dfc

Browse files
clean-up repeated inline import in tracing metrics recording module
1 parent 8ecee7b commit 87b5dfc

4 files changed

Lines changed: 29 additions & 27 deletions

File tree

src/agentex/lib/core/observability/tests/test_tracing_metrics_recording.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ def __init__(self, enqueued_at: float | None) -> None:
1515
class TestIsMetricsEnabled:
1616
def setup_method(self) -> None:
1717
recording._metrics_enabled = None
18+
recording._tracing = None
1819

1920
def test_enabled_by_default(self, monkeypatch):
2021
monkeypatch.delenv("AGENTEX_TRACING_METRICS", raising=False)
@@ -29,6 +30,7 @@ def test_disabled_by_zero(self, monkeypatch):
2930
class TestRecordingHelpers:
3031
def setup_method(self) -> None:
3132
recording._metrics_enabled = None
33+
recording._tracing = None
3234

3335
def test_record_span_enqueued_when_disabled_does_not_load_metrics(self, monkeypatch):
3436
monkeypatch.setenv("AGENTEX_TRACING_METRICS", "0")

src/agentex/lib/core/observability/tracing_metrics_recording.py

Lines changed: 23 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class _HasEnqueuedAt(Protocol):
1717

1818

1919
_metrics_enabled: bool | None = None
20+
_tracing = None # lazy-loaded tracing_metrics module (loads OTel on first use)
2021

2122

2223
def is_metrics_enabled() -> bool:
@@ -28,6 +29,16 @@ def is_metrics_enabled() -> bool:
2829
return _metrics_enabled
2930

3031

32+
def _tracing_module():
33+
"""Return lazy-loaded ``tracing_metrics`` module (loads OTel on first use)."""
34+
global _tracing
35+
if _tracing is None:
36+
from agentex.lib.core.observability import tracing_metrics
37+
38+
_tracing = tracing_metrics
39+
return _tracing
40+
41+
3142
def monotonic_if_enabled() -> float | None:
3243
"""Return ``time.monotonic()`` when metrics are enabled, else ``None``."""
3344
if not is_metrics_enabled():
@@ -39,9 +50,9 @@ def record_span_enqueued(event_type: str) -> None:
3950
if not is_metrics_enabled():
4051
return
4152
try:
42-
from agentex.lib.core.observability.tracing_metrics import get_tracing_metrics
43-
44-
get_tracing_metrics().span_events_enqueued.add(1, {"event_type": event_type})
53+
_tracing_module().get_tracing_metrics().span_events_enqueued.add(
54+
1, {"event_type": event_type}
55+
)
4556
except Exception:
4657
pass
4758

@@ -50,9 +61,7 @@ def record_span_dropped(reason: str) -> None:
5061
if not is_metrics_enabled():
5162
return
5263
try:
53-
from agentex.lib.core.observability.tracing_metrics import get_tracing_metrics
54-
55-
get_tracing_metrics().span_events_dropped.add(1, {"reason": reason})
64+
_tracing_module().get_tracing_metrics().span_events_dropped.add(1, {"reason": reason})
5665
except Exception:
5766
pass
5867

@@ -65,9 +74,7 @@ def record_batch_coalesced(
6574
if not is_metrics_enabled():
6675
return
6776
try:
68-
from agentex.lib.core.observability.tracing_metrics import get_tracing_metrics
69-
70-
metrics = get_tracing_metrics()
77+
metrics = _tracing_module().get_tracing_metrics()
7178
metrics.queue_depth.record(max(queue_depth, 0))
7279
metrics.batch_items.record(len(batch_items))
7380

@@ -87,10 +94,8 @@ def record_batch_phase(*, phase: str, size: int, duration_ms: float) -> None:
8794
if not is_metrics_enabled():
8895
return
8996
try:
90-
from agentex.lib.core.observability.tracing_metrics import get_tracing_metrics
91-
9297
attrs = {"phase": phase}
93-
metrics = get_tracing_metrics()
98+
metrics = _tracing_module().get_tracing_metrics()
9499
metrics.batch_size.record(size, attrs)
95100
metrics.batch_drain_duration.record(duration_ms, attrs)
96101
except Exception:
@@ -101,10 +106,8 @@ def record_export_success(*, event_type: str, span_count: int, processor: str =
101106
if not is_metrics_enabled():
102107
return
103108
try:
104-
from agentex.lib.core.observability.tracing_metrics import get_tracing_metrics
105-
106109
attrs = {"processor": processor, "event_type": event_type}
107-
metrics = get_tracing_metrics()
110+
metrics = _tracing_module().get_tracing_metrics()
108111
metrics.export_batches.add(1, attrs)
109112
metrics.export_spans.add(span_count, attrs)
110113
except Exception:
@@ -121,21 +124,16 @@ def record_export_failure(
121124
if not is_metrics_enabled():
122125
return
123126
try:
124-
from agentex.lib.core.observability.tracing_metrics import (
125-
processor_label,
126-
get_tracing_metrics,
127-
classify_export_error,
128-
)
129-
130-
error_class, http_code = classify_export_error(exc)
131-
proc = processor_label(processor)
127+
tm = _tracing_module()
128+
error_class, http_code = tm.classify_export_error(exc)
129+
proc = tm.processor_label(processor)
132130
attrs = {
133131
"processor": proc,
134132
"event_type": event_type,
135133
"http_code": http_code,
136134
"error_class": error_class,
137135
}
138-
metrics = get_tracing_metrics()
136+
metrics = tm.get_tracing_metrics()
139137
metrics.export_batch_failures.add(1, attrs)
140138
metrics.export_span_failures.add(span_count, attrs)
141139
except Exception:
@@ -146,9 +144,7 @@ def record_shutdown_timeout(*, remaining_items: int) -> None:
146144
if not is_metrics_enabled():
147145
return
148146
try:
149-
from agentex.lib.core.observability.tracing_metrics import get_tracing_metrics
150-
151-
metrics = get_tracing_metrics()
147+
metrics = _tracing_module().get_tracing_metrics()
152148
metrics.shutdown_timeouts.add(1)
153149
metrics.shutdown_remaining_items.record(max(remaining_items, 0))
154150
except Exception:

tests/lib/core/tracing/processors/test_sgp_tracing_processor.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,7 @@ async def test_on_spans_start_records_export_success_metrics(self, monkeypatch):
227227
import agentex.lib.core.observability.tracing_metrics_recording as recording
228228

229229
recording._metrics_enabled = None
230+
recording._tracing = None
230231
processor, _, mock_client = self._make_processor()
231232
mock_metrics = MagicMock()
232233

tests/lib/core/tracing/test_span_queue.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,7 @@ async def test_enqueue_records_enqueued_metric(self, monkeypatch):
531531
import agentex.lib.core.observability.tracing_metrics_recording as recording
532532

533533
recording._metrics_enabled = None
534+
recording._tracing = None
534535
mock_metrics = MagicMock()
535536
proc = _make_processor()
536537
queue = AsyncSpanQueue()
@@ -550,6 +551,7 @@ async def test_processor_failure_records_export_failure(self, monkeypatch):
550551
import agentex.lib.core.observability.tracing_metrics_recording as recording
551552

552553
recording._metrics_enabled = None
554+
recording._tracing = None
553555
mock_metrics = MagicMock()
554556

555557
class ExportError(Exception):
@@ -576,6 +578,7 @@ async def test_enqueue_overhead_with_metrics_disabled(self, monkeypatch):
576578
import agentex.lib.core.observability.tracing_metrics_recording as recording
577579

578580
recording._metrics_enabled = None
581+
recording._tracing = None
579582
proc = _make_processor()
580583
queue = AsyncSpanQueue()
581584

0 commit comments

Comments
 (0)