iii-sdk 0.11.0.dev3__tar.gz → 0.11.0.dev5__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.
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/PKG-INFO +3 -6
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/pyproject.toml +3 -7
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/src/iii/iii.py +25 -45
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/src/iii/logger.py +2 -5
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/src/iii/telemetry.py +62 -122
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/.gitignore +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/README.md +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/src/iii/__init__.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/src/iii/channels.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/src/iii/format_utils.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/src/iii/iii_constants.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/src/iii/iii_types.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/src/iii/otel_worker_gauges.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/src/iii/state.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/src/iii/stream.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/src/iii/telemetry_exporters.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/src/iii/telemetry_types.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/src/iii/triggers.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/src/iii/types.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/src/iii/utils.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/src/iii/worker_metrics.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/tests/conftest.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/tests/test_api_triggers.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/tests/test_async_api.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/tests/test_bridge.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/tests/test_channel_close_delay.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/tests/test_context_propagation.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/tests/test_data_channels.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/tests/test_format_utils.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/tests/test_healthcheck.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/tests/test_hold_process.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/tests/test_http_external_functions_integration.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/tests/test_iii_registration_dedup.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/tests/test_init_api.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/tests/test_invocation_exception.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/tests/test_logger_function_ids.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/tests/test_logger_otel.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/tests/test_middleware.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/tests/test_pubsub.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/tests/test_queue_integration.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/tests/test_rbac_workers.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/tests/test_register_function_args.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/tests/test_state.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/tests/test_streams.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/tests/test_streams_runtime_annotations.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/tests/test_sync_api.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/tests/test_telemetry.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/tests/test_telemetry_exporters.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/tests/test_telemetry_types.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/tests/test_trace_helpers.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/tests/test_trigger_metadata.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/tests/test_utils.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/tests/test_worker_metrics.py +0 -0
- {iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: iii-sdk
|
|
3
|
-
Version: 0.11.0.
|
|
3
|
+
Version: 0.11.0.dev5
|
|
4
4
|
Summary: III SDK for Python
|
|
5
5
|
Project-URL: Homepage, https://github.com/iii-hq/sdk
|
|
6
6
|
Project-URL: Repository, https://github.com/iii-hq/sdk
|
|
@@ -14,6 +14,8 @@ Classifier: Programming Language :: Python :: 3.10
|
|
|
14
14
|
Classifier: Programming Language :: Python :: 3.11
|
|
15
15
|
Classifier: Programming Language :: Python :: 3.12
|
|
16
16
|
Requires-Python: >=3.10
|
|
17
|
+
Requires-Dist: opentelemetry-api>=1.25
|
|
18
|
+
Requires-Dist: opentelemetry-sdk>=1.25
|
|
17
19
|
Requires-Dist: pydantic>=2.0
|
|
18
20
|
Requires-Dist: websockets>=12.0
|
|
19
21
|
Provides-Extra: dev
|
|
@@ -21,15 +23,10 @@ Requires-Dist: aiohttp>=3.9; extra == 'dev'
|
|
|
21
23
|
Requires-Dist: anyio>=4.0; extra == 'dev'
|
|
22
24
|
Requires-Dist: griffe>=1.0; extra == 'dev'
|
|
23
25
|
Requires-Dist: mypy>=1.8; extra == 'dev'
|
|
24
|
-
Requires-Dist: opentelemetry-api>=1.25; extra == 'dev'
|
|
25
|
-
Requires-Dist: opentelemetry-sdk>=1.25; extra == 'dev'
|
|
26
26
|
Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
|
|
27
27
|
Requires-Dist: pytest-cov>=6.0; extra == 'dev'
|
|
28
28
|
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
29
29
|
Requires-Dist: ruff>=0.2; extra == 'dev'
|
|
30
|
-
Provides-Extra: otel
|
|
31
|
-
Requires-Dist: opentelemetry-api>=1.25; extra == 'otel'
|
|
32
|
-
Requires-Dist: opentelemetry-sdk>=1.25; extra == 'otel'
|
|
33
30
|
Description-Content-Type: text/markdown
|
|
34
31
|
|
|
35
32
|
# iii-sdk
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "iii-sdk"
|
|
7
|
-
version = "0.11.0.
|
|
7
|
+
version = "0.11.0.dev5"
|
|
8
8
|
description = "III SDK for Python"
|
|
9
9
|
authors = [{ name = "III" }]
|
|
10
10
|
license = { text = "Apache-2.0" }
|
|
@@ -22,6 +22,8 @@ classifiers = [
|
|
|
22
22
|
dependencies = [
|
|
23
23
|
"websockets>=12.0",
|
|
24
24
|
"pydantic>=2.0",
|
|
25
|
+
"opentelemetry-api>=1.25",
|
|
26
|
+
"opentelemetry-sdk>=1.25",
|
|
25
27
|
]
|
|
26
28
|
|
|
27
29
|
[project.urls]
|
|
@@ -29,10 +31,6 @@ Homepage = "https://github.com/iii-hq/sdk"
|
|
|
29
31
|
Repository = "https://github.com/iii-hq/sdk"
|
|
30
32
|
|
|
31
33
|
[project.optional-dependencies]
|
|
32
|
-
otel = [
|
|
33
|
-
"opentelemetry-api>=1.25",
|
|
34
|
-
"opentelemetry-sdk>=1.25",
|
|
35
|
-
]
|
|
36
34
|
dev = [
|
|
37
35
|
"pytest>=8.0",
|
|
38
36
|
"pytest-asyncio>=0.23",
|
|
@@ -41,8 +39,6 @@ dev = [
|
|
|
41
39
|
"aiohttp>=3.9",
|
|
42
40
|
"mypy>=1.8",
|
|
43
41
|
"ruff>=0.2",
|
|
44
|
-
"opentelemetry-api>=1.25",
|
|
45
|
-
"opentelemetry-sdk>=1.25",
|
|
46
42
|
"griffe>=1.0",
|
|
47
43
|
]
|
|
48
44
|
|
|
@@ -186,20 +186,17 @@ class III:
|
|
|
186
186
|
from an async context.
|
|
187
187
|
"""
|
|
188
188
|
self._running = True
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
if self._options.otel:
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
attach_event_loop(loop)
|
|
201
|
-
except ImportError:
|
|
202
|
-
log.debug("OpenTelemetry not available")
|
|
189
|
+
from .telemetry import attach_event_loop, init_otel
|
|
190
|
+
|
|
191
|
+
loop = asyncio.get_running_loop()
|
|
192
|
+
otel_cfg: OtelConfig | None = None
|
|
193
|
+
if self._options.otel:
|
|
194
|
+
if isinstance(self._options.otel, OtelConfig):
|
|
195
|
+
otel_cfg = self._options.otel
|
|
196
|
+
else:
|
|
197
|
+
otel_cfg = OtelConfig(**self._options.otel)
|
|
198
|
+
init_otel(config=otel_cfg, loop=loop)
|
|
199
|
+
attach_event_loop(loop)
|
|
203
200
|
self._set_connection_state("connecting")
|
|
204
201
|
await self._do_connect()
|
|
205
202
|
|
|
@@ -238,12 +235,9 @@ class III:
|
|
|
238
235
|
|
|
239
236
|
self._set_connection_state("disconnected")
|
|
240
237
|
|
|
241
|
-
|
|
242
|
-
from .telemetry import shutdown_otel_async
|
|
238
|
+
from .telemetry import shutdown_otel_async
|
|
243
239
|
|
|
244
|
-
|
|
245
|
-
except ImportError:
|
|
246
|
-
log.debug("OpenTelemetry not available")
|
|
240
|
+
await shutdown_otel_async()
|
|
247
241
|
|
|
248
242
|
# Schedule the event loop to stop on the next iteration so the
|
|
249
243
|
# non-daemon background thread exits and the process can terminate.
|
|
@@ -418,26 +412,20 @@ class III:
|
|
|
418
412
|
future.set_result(result)
|
|
419
413
|
|
|
420
414
|
def _inject_traceparent(self) -> str | None:
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
from opentelemetry import propagate
|
|
415
|
+
from opentelemetry import context as otel_context
|
|
416
|
+
from opentelemetry import propagate
|
|
424
417
|
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
except ImportError:
|
|
429
|
-
return None
|
|
418
|
+
carrier: dict[str, str] = {}
|
|
419
|
+
propagate.inject(carrier, context=otel_context.get_current())
|
|
420
|
+
return carrier.get("traceparent")
|
|
430
421
|
|
|
431
422
|
def _inject_baggage(self) -> str | None:
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
from opentelemetry import propagate
|
|
423
|
+
from opentelemetry import context as otel_context
|
|
424
|
+
from opentelemetry import propagate
|
|
435
425
|
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
except ImportError:
|
|
440
|
-
return None
|
|
426
|
+
carrier: dict[str, str] = {}
|
|
427
|
+
propagate.inject(carrier, context=otel_context.get_current())
|
|
428
|
+
return carrier.get("baggage")
|
|
441
429
|
|
|
442
430
|
async def _invoke_with_otel_context(
|
|
443
431
|
self,
|
|
@@ -446,16 +434,8 @@ class III:
|
|
|
446
434
|
traceparent: str | None,
|
|
447
435
|
baggage: str | None,
|
|
448
436
|
) -> tuple[Any, str | None]:
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
from opentelemetry import propagate, trace
|
|
452
|
-
|
|
453
|
-
otel_available = True
|
|
454
|
-
except ImportError:
|
|
455
|
-
otel_available = False
|
|
456
|
-
|
|
457
|
-
if not otel_available:
|
|
458
|
-
return await handler(data), None
|
|
437
|
+
from opentelemetry import context as otel_context
|
|
438
|
+
from opentelemetry import propagate, trace
|
|
459
439
|
|
|
460
440
|
carrier: dict[str, str] = {}
|
|
461
441
|
if traceparent:
|
|
@@ -18,12 +18,9 @@ _SEVERITY_MAP = {
|
|
|
18
18
|
|
|
19
19
|
def is_initialized() -> bool:
|
|
20
20
|
"""Return True if OTel has been initialized (importable without circular dep)."""
|
|
21
|
-
|
|
22
|
-
from .telemetry import is_initialized as _is_init
|
|
21
|
+
from .telemetry import is_initialized as _is_init
|
|
23
22
|
|
|
24
|
-
|
|
25
|
-
except ImportError:
|
|
26
|
-
return False
|
|
23
|
+
return _is_init()
|
|
27
24
|
|
|
28
25
|
|
|
29
26
|
class Logger:
|
|
@@ -55,15 +55,10 @@ def init_otel(
|
|
|
55
55
|
if not enabled:
|
|
56
56
|
return
|
|
57
57
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
from opentelemetry.sdk.trace.export import BatchSpanProcessor
|
|
63
|
-
except ImportError as exc:
|
|
64
|
-
raise ImportError(
|
|
65
|
-
"opentelemetry-api and opentelemetry-sdk are required. Install with: pip install 'iii-sdk[otel]'"
|
|
66
|
-
) from exc
|
|
58
|
+
from opentelemetry import trace
|
|
59
|
+
from opentelemetry.sdk.resources import SERVICE_NAME, SERVICE_VERSION, Resource
|
|
60
|
+
from opentelemetry.sdk.trace import TracerProvider
|
|
61
|
+
from opentelemetry.sdk.trace.export import BatchSpanProcessor
|
|
67
62
|
|
|
68
63
|
service_name = cfg.service_name or os.environ.get("OTEL_SERVICE_NAME") or _DEFAULT_SERVICE_NAME
|
|
69
64
|
service_version = cfg.service_version or os.environ.get("SERVICE_VERSION") or "unknown"
|
|
@@ -119,15 +114,11 @@ def _configure_meter_provider(
|
|
|
119
114
|
) -> None:
|
|
120
115
|
"""Set up a global MeterProvider with EngineMetricsExporter."""
|
|
121
116
|
global _meter, _meter_provider
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader
|
|
117
|
+
from opentelemetry import metrics
|
|
118
|
+
from opentelemetry.sdk.metrics import MeterProvider
|
|
119
|
+
from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader
|
|
126
120
|
|
|
127
|
-
|
|
128
|
-
except ImportError:
|
|
129
|
-
logging.getLogger("iii.telemetry").warning("opentelemetry-sdk metrics not available; metrics export skipped.")
|
|
130
|
-
return
|
|
121
|
+
from .telemetry_exporters import EngineMetricsExporter
|
|
131
122
|
|
|
132
123
|
metrics_exporter = EngineMetricsExporter(connection)
|
|
133
124
|
metric_reader = PeriodicExportingMetricReader(
|
|
@@ -168,15 +159,11 @@ def _resolve_int(
|
|
|
168
159
|
def _configure_log_provider(resource: Any, connection: Any, cfg: OtelConfig) -> None:
|
|
169
160
|
"""Set up a global SdkLoggerProvider with EngineLogExporter."""
|
|
170
161
|
global _log_provider
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
|
|
162
|
+
from opentelemetry import _logs
|
|
163
|
+
from opentelemetry.sdk._logs import LoggerProvider as SdkLoggerProvider
|
|
164
|
+
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
|
|
175
165
|
|
|
176
|
-
|
|
177
|
-
except ImportError:
|
|
178
|
-
logging.getLogger("iii.telemetry").warning("opentelemetry-sdk logs not available; log export skipped.")
|
|
179
|
-
return
|
|
166
|
+
from .telemetry_exporters import EngineLogExporter
|
|
180
167
|
|
|
181
168
|
log_exporter = EngineLogExporter(connection)
|
|
182
169
|
|
|
@@ -222,20 +209,14 @@ def _enable_fetch_instrumentation() -> None:
|
|
|
222
209
|
"""
|
|
223
210
|
global _fetch_patched, _original_opener_open
|
|
224
211
|
|
|
225
|
-
try:
|
|
226
|
-
from opentelemetry import context as otel_ctx
|
|
227
|
-
from opentelemetry.propagate import inject as otel_inject
|
|
228
|
-
from opentelemetry.trace import SpanKind, StatusCode
|
|
229
|
-
except ImportError:
|
|
230
|
-
logging.getLogger("iii.telemetry").warning(
|
|
231
|
-
"opentelemetry-api not installed; urllib auto-instrumentation skipped."
|
|
232
|
-
)
|
|
233
|
-
return
|
|
234
|
-
|
|
235
212
|
import socket
|
|
236
213
|
import urllib.request
|
|
237
214
|
from urllib.parse import urlparse
|
|
238
215
|
|
|
216
|
+
from opentelemetry import context as otel_ctx
|
|
217
|
+
from opentelemetry.propagate import inject as otel_inject
|
|
218
|
+
from opentelemetry.trace import SpanKind, StatusCode
|
|
219
|
+
|
|
239
220
|
_original_opener_open = urllib.request.OpenerDirector.open
|
|
240
221
|
original = _original_opener_open
|
|
241
222
|
|
|
@@ -396,27 +377,21 @@ def get_meter() -> Any:
|
|
|
396
377
|
|
|
397
378
|
def current_trace_id() -> str | None:
|
|
398
379
|
"""Return current active trace_id as 32-char hex, or None when unavailable."""
|
|
399
|
-
|
|
400
|
-
from opentelemetry import trace
|
|
380
|
+
from opentelemetry import trace
|
|
401
381
|
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
except ImportError:
|
|
406
|
-
return None
|
|
382
|
+
span_ctx = trace.get_current_span().get_span_context()
|
|
383
|
+
if span_ctx.is_valid:
|
|
384
|
+
return format(span_ctx.trace_id, "032x")
|
|
407
385
|
return None
|
|
408
386
|
|
|
409
387
|
|
|
410
388
|
def current_span_id() -> str | None:
|
|
411
389
|
"""Return current active span_id as 16-char hex, or None when unavailable."""
|
|
412
|
-
|
|
413
|
-
from opentelemetry import trace
|
|
390
|
+
from opentelemetry import trace
|
|
414
391
|
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
except ImportError:
|
|
419
|
-
return None
|
|
392
|
+
span_ctx = trace.get_current_span().get_span_context()
|
|
393
|
+
if span_ctx.is_valid:
|
|
394
|
+
return format(span_ctx.span_id, "016x")
|
|
420
395
|
return None
|
|
421
396
|
|
|
422
397
|
|
|
@@ -429,12 +404,9 @@ def get_logger() -> Any:
|
|
|
429
404
|
"""Return the active OTel logger, or None if OTel has not been initialized."""
|
|
430
405
|
if not _initialized:
|
|
431
406
|
return None
|
|
432
|
-
|
|
433
|
-
from opentelemetry import _logs
|
|
407
|
+
from opentelemetry import _logs
|
|
434
408
|
|
|
435
|
-
|
|
436
|
-
except ImportError:
|
|
437
|
-
return None
|
|
409
|
+
return _logs.get_logger("iii-python-sdk")
|
|
438
410
|
|
|
439
411
|
|
|
440
412
|
async def with_span(
|
|
@@ -476,14 +448,10 @@ async def with_span(
|
|
|
476
448
|
|
|
477
449
|
return await fn(_NoopSpan())
|
|
478
450
|
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
from opentelemetry.trace import StatusCode
|
|
484
|
-
|
|
485
|
-
except ImportError:
|
|
486
|
-
return await fn(None)
|
|
451
|
+
from opentelemetry import context as otel_ctx
|
|
452
|
+
from opentelemetry.propagate import extract as otel_extract
|
|
453
|
+
from opentelemetry.trace import SpanKind as _SpanKind
|
|
454
|
+
from opentelemetry.trace import StatusCode
|
|
487
455
|
|
|
488
456
|
span_kind = kind if kind is not None else _SpanKind.INTERNAL
|
|
489
457
|
parent_context = otel_ctx.get_current()
|
|
@@ -503,103 +471,75 @@ async def with_span(
|
|
|
503
471
|
|
|
504
472
|
def inject_traceparent() -> str | None:
|
|
505
473
|
"""Inject the current trace context into a W3C traceparent header string."""
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
from opentelemetry.propagate import inject as otel_inject
|
|
474
|
+
from opentelemetry import context as otel_ctx
|
|
475
|
+
from opentelemetry.propagate import inject as otel_inject
|
|
509
476
|
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
except ImportError:
|
|
514
|
-
return None
|
|
477
|
+
carrier: dict[str, str] = {}
|
|
478
|
+
otel_inject(carrier, context=otel_ctx.get_current())
|
|
479
|
+
return carrier.get("traceparent")
|
|
515
480
|
|
|
516
481
|
|
|
517
482
|
def extract_traceparent(traceparent: str) -> Any:
|
|
518
483
|
"""Extract a trace context from a W3C traceparent header string."""
|
|
519
|
-
|
|
520
|
-
from opentelemetry.propagate import extract as otel_extract
|
|
484
|
+
from opentelemetry.propagate import extract as otel_extract
|
|
521
485
|
|
|
522
|
-
|
|
523
|
-
except ImportError:
|
|
524
|
-
return None
|
|
486
|
+
return otel_extract({"traceparent": traceparent})
|
|
525
487
|
|
|
526
488
|
|
|
527
489
|
def inject_baggage() -> str | None:
|
|
528
490
|
"""Inject the current baggage into a W3C baggage header string."""
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
from opentelemetry.propagate import inject as otel_inject
|
|
491
|
+
from opentelemetry import context as otel_ctx
|
|
492
|
+
from opentelemetry.propagate import inject as otel_inject
|
|
532
493
|
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
except ImportError:
|
|
537
|
-
return None
|
|
494
|
+
carrier: dict[str, str] = {}
|
|
495
|
+
otel_inject(carrier, context=otel_ctx.get_current())
|
|
496
|
+
return carrier.get("baggage")
|
|
538
497
|
|
|
539
498
|
|
|
540
499
|
def extract_baggage(baggage: str) -> Any:
|
|
541
500
|
"""Extract baggage from a W3C baggage header string."""
|
|
542
|
-
|
|
543
|
-
from opentelemetry.propagate import extract as otel_extract
|
|
501
|
+
from opentelemetry.propagate import extract as otel_extract
|
|
544
502
|
|
|
545
|
-
|
|
546
|
-
except ImportError:
|
|
547
|
-
return None
|
|
503
|
+
return otel_extract({"baggage": baggage})
|
|
548
504
|
|
|
549
505
|
|
|
550
506
|
def extract_context(traceparent: str | None = None, baggage: str | None = None) -> Any:
|
|
551
507
|
"""Extract both trace context and baggage from their respective headers."""
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
return otel_extract(carrier)
|
|
561
|
-
except ImportError:
|
|
562
|
-
return None
|
|
508
|
+
from opentelemetry.propagate import extract as otel_extract
|
|
509
|
+
|
|
510
|
+
carrier: dict[str, str] = {}
|
|
511
|
+
if traceparent:
|
|
512
|
+
carrier["traceparent"] = traceparent
|
|
513
|
+
if baggage:
|
|
514
|
+
carrier["baggage"] = baggage
|
|
515
|
+
return otel_extract(carrier)
|
|
563
516
|
|
|
564
517
|
|
|
565
518
|
def get_baggage_entry(key: str) -> str | None:
|
|
566
519
|
"""Get a baggage entry value from the current context."""
|
|
567
|
-
|
|
568
|
-
from opentelemetry import baggage as otel_baggage
|
|
520
|
+
from opentelemetry import baggage as otel_baggage
|
|
569
521
|
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
except ImportError:
|
|
573
|
-
return None
|
|
522
|
+
val = otel_baggage.get_baggage(key)
|
|
523
|
+
return str(val) if val is not None else None
|
|
574
524
|
|
|
575
525
|
|
|
576
526
|
def set_baggage_entry(key: str, value: str) -> Any:
|
|
577
527
|
"""Set a baggage entry in the current context. Returns the new context."""
|
|
578
|
-
|
|
579
|
-
from opentelemetry import baggage as otel_baggage
|
|
528
|
+
from opentelemetry import baggage as otel_baggage
|
|
580
529
|
|
|
581
|
-
|
|
582
|
-
return ctx
|
|
583
|
-
except ImportError:
|
|
584
|
-
return None
|
|
530
|
+
return otel_baggage.set_baggage(key, value)
|
|
585
531
|
|
|
586
532
|
|
|
587
533
|
def remove_baggage_entry(key: str) -> Any:
|
|
588
534
|
"""Remove a baggage entry from the current context. Returns the new context."""
|
|
589
|
-
|
|
590
|
-
from opentelemetry import baggage as otel_baggage
|
|
535
|
+
from opentelemetry import baggage as otel_baggage
|
|
591
536
|
|
|
592
|
-
|
|
593
|
-
except ImportError:
|
|
594
|
-
return None
|
|
537
|
+
return otel_baggage.remove_baggage(key)
|
|
595
538
|
|
|
596
539
|
|
|
597
540
|
def get_all_baggage() -> dict[str, str]:
|
|
598
541
|
"""Get all baggage entries from the current context."""
|
|
599
|
-
|
|
600
|
-
from opentelemetry import baggage as otel_baggage
|
|
542
|
+
from opentelemetry import baggage as otel_baggage
|
|
601
543
|
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
except ImportError:
|
|
605
|
-
return {}
|
|
544
|
+
entries = otel_baggage.get_all()
|
|
545
|
+
return {k: str(v) for k, v in entries.items()} if entries else {}
|
|
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
|
|
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
|
{iii_sdk-0.11.0.dev3 → iii_sdk-0.11.0.dev5}/tests/test_http_external_functions_integration.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
|
|
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
|
|
File without changes
|