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.
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/PKG-INFO +1 -1
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/instrumentations/a2a.py +60 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/instrumentations/slim.py +11 -7
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe_sdk.egg-info/PKG-INFO +1 -1
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/pyproject.toml +1 -1
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/LICENSE.md +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/README.md +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/__init__.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/__init__.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/client/__init__.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/client/client.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/client/http.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/config/__init__.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/connectors/__init__.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/connectors/slim.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/decorators/__init__.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/decorators/base.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/decorators/helpers.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/decorators/util.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/instrumentations/__init__.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/instrumentations/mcp.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/instrumentations/nats.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/instruments.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/logging/__init__.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/logging/logging.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/metrics/__init__.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/metrics/agent.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/metrics/agents/__init__.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/metrics/agents/agent_connections.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/metrics/agents/availability.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/metrics/agents/heuristics.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/metrics/agents/recovery_tracker.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/metrics/agents/tool_call_tracker.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/metrics/agents/tracker.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/metrics/metrics.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/telemetry.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/tracing/__init__.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/tracing/content_allow_list.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/tracing/context_manager.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/tracing/context_utils.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/tracing/manual.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/tracing/tracing.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/tracing/transform_span.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/utils/__init__.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/utils/const.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/utils/in_memory_span_exporter.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/utils/json_encoder.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/utils/package_check.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/version.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe_sdk.egg-info/SOURCES.txt +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe_sdk.egg-info/dependency_links.txt +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe_sdk.egg-info/requires.txt +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe_sdk.egg-info/top_level.txt +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/setup.cfg +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/tests/test_client.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/tests/test_instrumentor.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/tests/test_manual_instrumentation.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/tests/test_transform_span.py +0 -0
- {ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/tests/test_version.py +0 -0
|
@@ -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
|
-
#
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
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
|
|
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)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/instrumentations/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/metrics/agents/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/metrics/agents/availability.py
RENAMED
|
File without changes
|
{ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/metrics/agents/heuristics.py
RENAMED
|
File without changes
|
{ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/metrics/agents/recovery_tracker.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/tracing/content_allow_list.py
RENAMED
|
File without changes
|
{ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/tracing/context_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe/sdk/utils/in_memory_span_exporter.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ioa_observe_sdk-1.0.22 → ioa_observe_sdk-1.0.24}/ioa_observe_sdk.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|