Segment context not propagated when `asyncio.run_in_executor` is used
- 主要言語
- Python
- スター
- 339
- フォーク
- 147
- PR マージ指標
- 30日以内にマージされた PR はありません
説明
(Minimised) Example code:
```python
import asyncio
from aws_xray_sdk.core import xray_recorder
from aws_xray_sdk.core import patch_all
from aws_xray_sdk.core.async_context import AsyncContext
import boto3
xray_recorder.configure(service="Test app", sampling=False, context=AsyncContext())
patch_all()
def run_task():
s3_client = boto3.client("s3")
s3_client.list_buckets()
async def main():
loop = asyncio.get_running_loop()
xray_recorder.begin_segment("test")
await loop.run_in_executor(None, run_task)
xray_recorder.end_segment()
asyncio.run(main())
```
Output:
```
cannot find the current segment/subsegment, please make sure you have a segment open
No segment found, cannot begin subsegment s3.
cannot find the current segment/subsegment, please make sure you have a segment open
cannot find the current segment/subsegment, please make sure you have a segment open
No segment to end
cannot find the current segment/subsegment, please make sure you have a segment open
```
I understand from the README that when using a thread pool (which is the default executor), the trace entity needs to be manually propagated. Could it be propagated automatically?
I'm asking because in the use case I have, a 3rd party library I'm using is making the call so I couldn't patch the call sites easily.
コントリビューションガイド
調査の方向性
README のスレッドプールでのトレース伝播に関する説明と、loop.run_in_executor とともに使用される AsyncContext のエントリーポイントから始めます。最小化された例を再現し、次に run_task が現在のセグメントを取得する方法を追跡し、伝播が自動の場合に、セグメント不足またはサブセグメント不足のメッセージなしで例が完了することを確認します。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- aws, python
- 領域
- backend, observability-sre
- issue の種類
- 機能追加
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 35/100