LoginSignup
1

More than 5 years have passed since last update.

AWS X-Rayでmysql-connector-pythonにバッチを当ててリクエストをトレースしてみる

Posted at

はじめに

アプリケーションが処理する各種リクエストをトレースするため、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リクエストがサブセグメントとして乗ってます。

スクリーンショット 2019-02-18 14.07.05.png

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

ここの情報はSELECT・INSERT・DELETEとも同じです。

スクリーンショット 2019-02-18 14.07.23.png

注意点

X-Rayにトレースしてもらうためには、 必ず mysql.connector.connect 関数を使ってコネクションを作る必要があります。

当初はコネクションプールの操作のため mysql.connector.pooling.MySQLConnectionPool を使ってましたが全然トレースしてくれませんでした

バッチライブラリの中でも、サポートされている関数/されていない関数があるようなので、ご注意を・・・

まとめ

これでMySQLサーバーへのリクエストがトレースできましたが、基本的には接続先と処理時間くらいしかトレースしてくれないので、より細かい情報を取りたい場合はSQLAlchemy ORMを使うべきかなと思います。また別途検証したいと思います。

参考

MySQL Connector/Python Developer Guide

aws/aws-xray-sdk-python - GitHub

PythonからMySQLへ接続する

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1