ioa-observe-sdk 1.0.22__tar.gz → 1.0.24__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/PKG-INFO +1 -1
  2. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/instrumentations/a2a.py +60 -0
  3. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/instrumentations/slim.py +11 -7
  4. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe_sdk.egg-info/PKG-INFO +1 -1
  5. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/pyproject.toml +1 -1
  6. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/LICENSE.md +0 -0
  7. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/README.md +0 -0
  8. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/__init__.py +0 -0
  9. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/__init__.py +0 -0
  10. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/client/__init__.py +0 -0
  11. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/client/client.py +0 -0
  12. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/client/http.py +0 -0
  13. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/config/__init__.py +0 -0
  14. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/connectors/__init__.py +0 -0
  15. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/connectors/slim.py +0 -0
  16. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/decorators/__init__.py +0 -0
  17. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/decorators/base.py +0 -0
  18. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/decorators/helpers.py +0 -0
  19. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/decorators/util.py +0 -0
  20. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/instrumentations/__init__.py +0 -0
  21. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/instrumentations/mcp.py +0 -0
  22. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/instrumentations/nats.py +0 -0
  23. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/instruments.py +0 -0
  24. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/logging/__init__.py +0 -0
  25. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/logging/logging.py +0 -0
  26. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/metrics/__init__.py +0 -0
  27. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/metrics/agent.py +0 -0
  28. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/metrics/agents/__init__.py +0 -0
  29. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/metrics/agents/agent_connections.py +0 -0
  30. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/metrics/agents/availability.py +0 -0
  31. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/metrics/agents/heuristics.py +0 -0
  32. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/metrics/agents/recovery_tracker.py +0 -0
  33. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/metrics/agents/tool_call_tracker.py +0 -0
  34. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/metrics/agents/tracker.py +0 -0
  35. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/metrics/metrics.py +0 -0
  36. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/telemetry.py +0 -0
  37. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/tracing/__init__.py +0 -0
  38. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/tracing/content_allow_list.py +0 -0
  39. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/tracing/context_manager.py +0 -0
  40. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/tracing/context_utils.py +0 -0
  41. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/tracing/manual.py +0 -0
  42. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/tracing/tracing.py +0 -0
  43. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/tracing/transform_span.py +0 -0
  44. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/utils/__init__.py +0 -0
  45. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/utils/const.py +0 -0
  46. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/utils/in_memory_span_exporter.py +0 -0
  47. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/utils/json_encoder.py +0 -0
  48. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/utils/package_check.py +0 -0
  49. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/version.py +0 -0
  50. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe_sdk.egg-info/SOURCES.txt +0 -0
  51. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe_sdk.egg-info/dependency_links.txt +0 -0
  52. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe_sdk.egg-info/requires.txt +0 -0
  53. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe_sdk.egg-info/top_level.txt +0 -0
  54. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/setup.cfg +0 -0
  55. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/tests/test_client.py +0 -0
  56. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/tests/test_instrumentor.py +0 -0
  57. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/tests/test_manual_instrumentation.py +0 -0
  58. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/tests/test_transform_span.py +0 -0
  59. {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/tests/test_version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ioa-observe-sdk
3
- Version: 1.0.22
3
+ Version: 1.0.24
4
4
  Summary: IOA Observability SDK
5
5
  License-Expression: Apache-2.0
6
6
  Requires-Python: >=3.10
@@ -89,6 +89,60 @@ class A2AInstrumentor(BaseInstrumentor):
89
89
 
90
90
  A2AClient.send_message = instrumented_send_message
91
91
 
92
+ # Instrument broadcast_message
93
+ if hasattr(A2AClient, "broadcast_message"):
94
+ original_broadcast_message = A2AClient.broadcast_message
95
+
96
+ @functools.wraps(original_broadcast_message)
97
+ async def instrumented_broadcast_message(self, request, *args, **kwargs):
98
+ # Put context into A2A message metadata instead of HTTP headers
99
+ with _global_tracer.start_as_current_span("a2a.broadcast_message"):
100
+ traceparent = get_current_traceparent()
101
+ session_id = None
102
+ if traceparent:
103
+ session_id = kv_store.get(f"execution.{traceparent}")
104
+ if session_id:
105
+ kv_store.set(f"execution.{traceparent}", session_id)
106
+
107
+ # Ensure metadata dict exists
108
+ try:
109
+ md = getattr(request.params, "metadata", None)
110
+ except AttributeError:
111
+ md = None
112
+ metadata = md if isinstance(md, dict) else {}
113
+
114
+ observe_meta = dict(metadata.get("observe", {}))
115
+
116
+ # Inject W3C trace context + baggage into observe_meta
117
+ TraceContextTextMapPropagator().inject(carrier=observe_meta)
118
+ W3CBaggagePropagator().inject(carrier=observe_meta)
119
+
120
+ if traceparent:
121
+ observe_meta["traceparent"] = traceparent
122
+ if session_id:
123
+ observe_meta["session_id"] = session_id
124
+ baggage.set_baggage(f"execution.{traceparent}", session_id)
125
+
126
+ metadata["observe"] = observe_meta
127
+
128
+ # Write back metadata (pydantic models are mutable by default in v2)
129
+ try:
130
+ request.params.metadata = metadata
131
+ except Exception:
132
+ # Fallback
133
+ request = request.model_copy(
134
+ update={
135
+ "params": request.params.model_copy(
136
+ update={"metadata": metadata}
137
+ )
138
+ }
139
+ )
140
+
141
+ # Call through without transport-specific kwargs
142
+ return await original_broadcast_message(self, request, *args, **kwargs)
143
+
144
+ A2AClient.broadcast_message = instrumented_broadcast_message
145
+
92
146
  # Instrument server handler
93
147
  from a2a.server.request_handlers import DefaultRequestHandler
94
148
 
@@ -156,6 +210,12 @@ class A2AInstrumentor(BaseInstrumentor):
156
210
 
157
211
  A2AClient.send_message = A2AClient.send_message.__wrapped__
158
212
 
213
+ # Uninstrument `broadcast_message`
214
+ if hasattr(A2AClient, "broadcast_message") and hasattr(
215
+ A2AClient.broadcast_message, "__wrapped__"
216
+ ):
217
+ A2AClient.broadcast_message = A2AClient.broadcast_message.__wrapped__
218
+
159
219
  # Uninstrument server handler
160
220
  from a2a.server.request_handlers import DefaultRequestHandler
161
221
 
@@ -478,15 +478,19 @@ class SLIMInstrumentor(BaseInstrumentor):
478
478
  slim_bindings.Slim.listen_for_session = instrumented_listen_for_session
479
479
 
480
480
  def _instrument_session_methods(self, slim_bindings):
481
- # In v0.6.0+, we need to instrument session classes dynamically
482
481
  # Try to find session-related classes in the slim_bindings module
483
482
  session_classes = []
484
483
 
485
- # Look for common session class names
486
- for attr_name in ["Session", "P2PSession", "GroupSession"]:
487
- if hasattr(slim_bindings, attr_name):
488
- session_class = getattr(slim_bindings, attr_name)
489
- session_classes.append((attr_name, session_class))
484
+ # Check for v0.6.0+ Session classes
485
+ if hasattr(slim_bindings, "Session"):
486
+ for attr_name in ["Session", "P2PSession", "GroupSession"]:
487
+ if hasattr(slim_bindings, attr_name):
488
+ session_class = getattr(slim_bindings, attr_name)
489
+ session_classes.append((attr_name, session_class))
490
+
491
+ # Check for older PySession class (pre-v0.6.0)
492
+ if hasattr(slim_bindings, "PySession"):
493
+ session_classes.append(("PySession", slim_bindings.PySession))
490
494
 
491
495
  # Also look for any class that has session-like methods
492
496
  for attr_name in dir(slim_bindings):
@@ -497,7 +501,7 @@ class SLIMInstrumentor(BaseInstrumentor):
497
501
  session_classes.append((attr_name, attr))
498
502
 
499
503
  # Instrument session methods for found classes
500
- for _, session_class in session_classes:
504
+ for class_name, session_class in session_classes:
501
505
  # Instrument get_message (v0.6.0+ replacement for receive)
502
506
  if hasattr(session_class, "get_message"):
503
507
  self._instrument_session_get_message(session_class)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ioa-observe-sdk
3
- Version: 1.0.22
3
+ Version: 1.0.24
4
4
  Summary: IOA Observability SDK
5
5
  License-Expression: Apache-2.0
6
6
  Requires-Python: >=3.10
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
5
5
 
6
6
  [project]
7
7
  name = "ioa-observe-sdk"
8
- version = "1.0.22"
8
+ version = "1.0.24"
9
9
  license = "Apache-2.0"
10
10
  description = "IOA Observability SDK"
11
11
  readme = "README.md"