Commit 32b05cc
authored
fix(telemetry): drop use_span from _TracedStream.__anext__; eager-prime SSE under captured ctx (#277)
* fix(telemetry): drop use_span from _TracedStream.__anext__; eager-prime SSE under captured ctx
`_TracedStream.__anext__` wrapped `await self._inner.__anext__()` in
`with use_span(self._span, end_on_exit=False):` to make the GenAI span
the parent of HTTPX child spans. Under FastAPI StreamingResponse the
attach/detach pair fired across asyncio tasks, raising
`ValueError: Token was created in a different Context` ~19x per chat
session. Closes #276.
Capture an OTel context snapshot with the GenAI span active in `_stream`
(sync `with use_span`, no await between attach and detach). Schedule the
SSE iterator's first __anext__ as `asyncio.create_task(coro, context=ctx)`
so the HTTP request fires under the snapshot; HTTPX auto-instrumentation
captures the GenAI span as parent at request emission. Subsequent reads
run in the consumer's own context and pull bytes from the open response.
Drop the `with use_span` block from `_TracedStream.__anext__`.
* fix(telemetry): cancel prime task when consumer is cancelled before first chunk
Without this, a cancellation interrupting `await task` in
`_prime_with_context` left the underlying create_task running in the
background, holding the open SSE/HTTP connection. Add a `BaseException`
catch that calls `task.cancel()` then re-raises. Add regression test
covering cancel-mid-first-pull.
* refactor(telemetry): move bind_first_pull_to_span helper from client.py to telemetry.py
The first pass parked an async-task + contextvars helper at the top of
client.py and added asyncio + contextvars imports there. That leaked
telemetry mechanism into the module that defines the SDK base layering.
Move the helper to telemetry.py (where it joins trace_stream / record_*
/ use_span and where contextvars belongs); rename to
bind_first_pull_to_span; revert client.py imports and drop the inline
ctx-capture block from `_stream`. `_stream` regains its single-verb
orchestration rhythm with one new line:
sse_iterator = telemetry.bind_first_pull_to_span(sse_iterator, span)
Same behavior, same tests (signatures updated to pass a span instead of
a Context; new test asserts the first pull sees the span as current
OTel context and subsequent pulls don't).1 parent a1bd78b commit 32b05cc
3 files changed
Lines changed: 146 additions & 13 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
313 | 313 | | |
314 | 314 | | |
315 | 315 | | |
| 316 | + | |
316 | 317 | | |
317 | 318 | | |
318 | 319 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
| 4 | + | |
4 | 5 | | |
5 | 6 | | |
6 | 7 | | |
7 | | - | |
| 8 | + | |
8 | 9 | | |
9 | 10 | | |
10 | 11 | | |
| |||
435 | 436 | | |
436 | 437 | | |
437 | 438 | | |
438 | | - | |
439 | | - | |
440 | | - | |
441 | | - | |
442 | | - | |
443 | | - | |
444 | | - | |
445 | | - | |
446 | | - | |
447 | | - | |
448 | | - | |
449 | | - | |
| 439 | + | |
| 440 | + | |
| 441 | + | |
| 442 | + | |
| 443 | + | |
| 444 | + | |
| 445 | + | |
| 446 | + | |
| 447 | + | |
| 448 | + | |
| 449 | + | |
450 | 450 | | |
451 | 451 | | |
452 | 452 | | |
| |||
541 | 541 | | |
542 | 542 | | |
543 | 543 | | |
| 544 | + | |
| 545 | + | |
| 546 | + | |
| 547 | + | |
| 548 | + | |
| 549 | + | |
| 550 | + | |
| 551 | + | |
| 552 | + | |
| 553 | + | |
| 554 | + | |
| 555 | + | |
| 556 | + | |
| 557 | + | |
| 558 | + | |
| 559 | + | |
| 560 | + | |
| 561 | + | |
| 562 | + | |
| 563 | + | |
| 564 | + | |
| 565 | + | |
| 566 | + | |
| 567 | + | |
544 | 568 | | |
545 | 569 | | |
546 | 570 | | |
547 | 571 | | |
| 572 | + | |
548 | 573 | | |
549 | 574 | | |
550 | 575 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
| 3 | + | |
3 | 4 | | |
4 | 5 | | |
| 6 | + | |
5 | 7 | | |
6 | 8 | | |
| 9 | + | |
7 | 10 | | |
8 | 11 | | |
9 | 12 | | |
| |||
235 | 238 | | |
236 | 239 | | |
237 | 240 | | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
| 320 | + | |
| 321 | + | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
| 325 | + | |
| 326 | + | |
| 327 | + | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + | |
| 344 | + | |
0 commit comments