はじめに
アプリケーションが処理する各種リクエストをトレースするため、AWS X-Rayを使用しています。
リクエスト処理に使うライブラリのうち、AWS SDKを含むいくつかについてはX-Ray SDK内でデフォルトでサポートされており、パッチを適用すれば簡単に処理をトレースしてくれます。
今回は、PythonでDBを操作するアプリケーションを想定し、X-Ray SDK for Pythonがサポートしている mysql-connector-python にパッチを適用してみようと思います。
AWS X-Ray - ライブラリを実装ダウンストリーム呼び出しにパッチする
環境
検証は、ローカルで行いました。
OS: macOS High Sierra
Python: 3.6.5
MySQL: 5.6
実行
MySQLサーバー
適当に用意。今回はDockerでmysql:5.6イメージをプルして実行。
データベースとテーブルの用意
以下のクエリを実行。
# データベース
create database xray_test;
# テーブル
create table user (id char(10), name char(20));
X Ray デーモン
トレースした情報をAWS上のX-Rayサービスへ投げるためにX-Rayデーモンを実行させる必要があります。
今回はローカルで検証したため、macOSで実行可能なスクリプトを落として -o
オプションをつけて実行。
AWS X-Ray - ローカルで X-Ray デーモンを実行する
./xray_mac -o
Pythonスクリプト実行
今回はSELECT・INSERT・DELETEをトレースしてみます。
import mysql.connector
from aws_xray_sdk.core import xray_recorder
from aws_xray_sdk.core import patch
# パッチ適用 patch_allでも可
libraries = ('mysql',)
patch(libraries)
# X Ray の設定
xray_recorder.configure(service='mysql-connector',
daemon_address="127.0.0.1:2000")
# mysql セグメント開始
segment = xray_recorder.begin_segment('mysql')
# 接続
conn = mysql.connector.connect(user='root', password='password', host='127.0.0.1', database='xray_test')
cur = conn.cursor()
# INSERT
cur.execute("insert into user values ('01', 'hoge');")
conn.commit()
# SELECT
cur.execute("select * from user;")
for row in cur.fetchall():
print(row[0],row[1])
# DELETE
cur.execute("delete from user where id = '01';")
conn.commit()
cur.close()
conn.close()
# mysql セグメント終了
xray_recorder.end_segment()
結果
AWSコンソールで確認してみます。
トレース詳細に、こんな感じでちゃんと3リクエストがサブセグメントとして乗ってます。

試しにサプセグメントを選択すると、SQLタブが出てます。これを開くと、DBのタイプやバージョン、接続したユーザー名が表示されます。
ここの情報はSELECT・INSERT・DELETEとも同じです。

注意点
X-Rayにトレースしてもらうためには、 必ず mysql.connector.connect
関数を使ってコネクションを作る必要があります。
当初はコネクションプールの操作のため mysql.connector.pooling.MySQLConnectionPool
を使ってましたが全然トレースしてくれませんでした
バッチライブラリの中でも、サポートされている関数/されていない関数があるようなので、ご注意を・・・
まとめ
これでMySQLサーバーへのリクエストがトレースできましたが、基本的には接続先と処理時間くらいしかトレースしてくれないので、より細かい情報を取りたい場合はSQLAlchemy ORMを使うべきかなと思います。また別途検証したいと思います。
参考
MySQL Connector/Python Developer Guide