test_collector.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. from __future__ import annotations
  2. from production_build_agents.observability import collector as collector_module
  3. from production_build_agents.observability.collector import MessageToolCollector
  4. from production_build_agents.observability.readable_events import (
  5. BusinessReadableFlowCollector,
  6. )
  7. def test_message_tool_collector_disables_automatic_modules(
  8. monkeypatch,
  9. ) -> None:
  10. calls: list[tuple[str, object]] = []
  11. handle = object()
  12. monkeypatch.setattr(
  13. collector_module,
  14. "_start_business_collector",
  15. lambda run_handle: (
  16. calls.append(("start", run_handle)) or "token"
  17. ),
  18. )
  19. monkeypatch.setattr(
  20. collector_module,
  21. "_stop_business_collector",
  22. lambda token: calls.append(("stop", token)),
  23. )
  24. collector = MessageToolCollector(
  25. warn_once=lambda *_args: None,
  26. warning_key="test",
  27. )
  28. collector.start(handle, enabled=True)
  29. collector.stop()
  30. assert calls == [
  31. ("start", handle),
  32. ("stop", "token"),
  33. ]
  34. def test_message_tool_collector_failure_never_escapes(
  35. monkeypatch,
  36. ) -> None:
  37. warnings: list[tuple[str, str]] = []
  38. def fail_start(*_args, **_kwargs):
  39. raise RuntimeError("collector unavailable")
  40. monkeypatch.setattr(
  41. collector_module,
  42. "_start_business_collector",
  43. fail_start,
  44. )
  45. collector = MessageToolCollector(
  46. warn_once=lambda key, exc: warnings.append(
  47. (key, type(exc).__name__)
  48. ),
  49. warning_key="test",
  50. )
  51. collector.start(object(), enabled=True)
  52. collector.stop()
  53. assert warnings == [("test_start", "RuntimeError")]
  54. def test_real_business_collector_keeps_messages_but_disables_modules() -> None:
  55. from obagent_sdk.observe.current import _COLLECTOR
  56. token = collector_module._start_business_collector(object())
  57. try:
  58. active = _COLLECTOR.get()
  59. assert isinstance(active, BusinessReadableFlowCollector)
  60. assert active.auto_module is False
  61. finally:
  62. collector_module._stop_business_collector(token)