概要
このリリースでは、OpenTelemetry の threading instrumentation と agentcore-worker-loop スレッドの互換性問題を修正しました。v1.3.3 以降、opentelemetry-instrument を Dockerfile の CMD として使用している環境で async ハンドラーを呼び出すとランタイムクラッシュが発生する問題がありましたが、本リリースで解消されました。
リリース: v1.6.2
バグ修正
OpenTelemetry threading instrumentation との互換性問題を修正 (#405)
修正内容:
opentelemetry-instrumentを Dockerfile の CMD として使用している環境(ACO の推奨オブザーバビリティパターン)で、async ハンドラー呼び出し時に発生していたランタイムクラッシュを修正しました
影響を受けていた状況:
bedrock-agentcore >= 1.3.3を使用opentelemetry-instrumentを Dockerfile の CMD として設定(Starter Toolkit でobservability_enabled=trueを設定した場合のパターン)- async ハンドラーを使用
発生していたエラー:
Exception in thread agentcore-worker-loop:
File "opentelemetry/instrumentation/threading/__init__.py", line 152, in __wrap_threading_run
File "bedrock_agentcore/runtime/app.py", line 545, in _run_worker_loop
self._worker_loop.run_forever()
RuntimeError: Cannot run the event loop while another loop is running
根本原因:
- OpenTelemetry の
opentelemetry-instrumentation-threadingは、すべてのThread.run()をラップしてトレースコンテキストを親スレッドから子スレッドに伝播します - このラッパーが親スレッドの「実行中のイベントループ」状態を子スレッドにリークしていました
- 以前は
_ensure_worker_loopがメインスレッドでイベントループを作成し、_run_worker_loopがワーカースレッドでrun_forever()を呼び出していました - OTEL のラッパーがメインスレッドの実行中ループ状態を伝播すると、
run_forever()が非 None の実行中ループを検出してRuntimeErrorを発生させていました
修正内容の詳細:
asyncio._set_running_loop(None)-_run_worker_loopの先頭で、親スレッドからリークした実行中ループ状態をクリア- イベントループの作成をワーカースレッド内に移動 -
asyncio.new_event_loop()とasyncio.set_event_loop()を_run_worker_loop内で実行し、クロススレッド状態のリークを排除 threading.Eventによる同期 - 親スレッドがワーカーループの開始を確実に待機するようになり、既存の競合状態も修正
ポイント:
- ACO の推奨オブザーバビリティパターン(
opentelemetry-instrumentを使用)を使用している場合、v1.3.3 以降でこの問題が発生していた可能性があります - 本バージョンにアップデートすることで、
opentelemetry-instrumentを削除したりOTEL_PYTHON_DISABLED_INSTRUMENTATIONS=threadingを設定したりする回避策は不要になります
まとめ
このリリースでは、OpenTelemetry との重要な互換性問題が修正されました。ACO のオブザーバビリティ機能(CloudWatch GenAI ダッシュボードへのトレース/スパン送信)を async ハンドラーと組み合わせて使用しているユーザーは、本バージョンへのアップデートを推奨します。