aws / aws/aws-xray-sdk-python

psycopg connection context manager drops X-Ray tracing wrapper, so cursor execute calls are not traced

オープン
#490 コメント 1 件 リアクション 0 件 担当者 0 名 GitHub で見る
主要言語
Python
スター
338
フォーク
147
PR マージ指標
30日以内にマージされた PR はありません

説明

I am seeing a gap in the psycopg integration for aws-xray-sdk.

When patching psycopg succeeds, `psycopg.connect()` returns an `XRayTracedConn` proxy as expected. However, if the connection is used as a context manager with `with conn as c:`, the object returned from enter is the raw psycopg `Connection`, not the X-Ray wrapper. As a result, `c.cursor(...)` returns a raw psycopg Cursor, and `execute()` calls do not produce X-Ray subsegments.

### Observed behavior

`patch(("psycopg",), raise_errors=True) `succeeds
`psycopg.connect()` returns `aws_xray_sdk.ext.dbapi2.XRayTracedConn`
entering the connection context manager unwraps the proxy
`cursor()` on that entered object returns `psycopg.Cursor`
`execute()` on the cursor is not traced
if I create an explicit subsegment manually, that subsegment appears in X-Ray, which confirms the request has a valid segment and the DB code path is running

### Expected behavior

The psycopg X-Ray wrapper should preserve tracing across the connection context manager
`with conn as c:` should still return a wrapped connection, or otherwise ensure cursors created from the entered object are still traced
`execute()` should generate the native DB subsegment without needing manual instrumentation

### Reproduction

Install aws-xray-sdk 2.15.0
Install psycopg 3.3.4 and psycopg-pool 3.2.7
Call patch(("psycopg",), raise_errors=True)
Call psycopg.connect(...)
Use the connection in a with block
Create a cursor and execute a query
Observe that the cursor is raw psycopg.Cursor and no DB subsegment is emitted

### Environment details

aws-xray-sdk 2.15.0
psycopg 3.3.4
psycopg-pool 3.2.7
Python 3.12
Running in AWS Lambda

コントリビューションガイド

コントリビューションガイドを開く

調査の方向性

Start with the psycopg integration around patch() and XRayTracedConn, then reproduce the with conn as c: flow described in the issue. Done means the entered connection remains wrapped, its cursor is traced, and execute() produces the native database subsegment without manual instrumentation.

索引モデルが issue の本文から書いたものです。

評価

技術スタック
aws, python
領域
observability
issue の種類
バグ
難易度
3/5
見積もり時間
1〜2日
活発さ
活発
明瞭さ
おおむね明確
初心者へのやさしさ
68/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。