引き続き
を弄っています。
ソースコードやドキュメントの端々に
ドキュメント には、以下のように…
DATADOG_PATCH_MODULES=module:patch,module:patch… e.g. boto:true,redis:false : override the modules patched for this execution of the program (default: none)
ソースコードには…
... # Default set of modules to automatically patch or not PATCH_MODULES = { 'boto': False, 'botocore': False, 'bottle': False, 'cassandra': True, ...
そうなんです、AWS をお使いの方なら馴染み深い boto
や botocore
の文字が踊っています。
dd-trace-py は boto
や botocore
にもパッチを当てるようにして、リクエストに要した処理時間等のデータを Datadog APM に送信する事が出来るようです。
botocore とは
今回は botocore を題材として取り上げてみたいと思います。
botocore とは文字通り、我々が愛して止まない boto3 の core となっているモジュールで、boto3 よりも低いレベルの API 操作を行うモジュールです(という認識です)ので、同じことを boto3 と botocore で実装したい場合、若干ですが書き方が異なってくるようです。
例えば、EC2 を操作出来るポリシーが付与された IAM Role を持つ EC2 上で boto3 を使って describe instances を実行したい場合…
import boto3 client = boto3.client('ec2') response = client.describe_instances() print response.__class__
botocore で書こうとすると以下のようになりました。
import botocore.session session = botocore.session.get_session() client = session.create_client('ec2') response = client.describe_instances() print response.__class__
認証部分が boto3 から botocore の botocore.session.get_session() を呼んでいたりするのかなと妄想しています。ということで、普段 boto3 を使っていれば、ほとんど意識することは無いと思っていますので、あーこんなんのが boto3 の裏で暗躍しているんだという位に留めておきます。
ということで
ddtrace-run x botocore
上記の boto3 を利用したスクリプトで ddtrace-run で describe instances を追跡してみたいと思います。
$ python trace-demo-botocore.py <type 'dict'>
普通に実行すると上記のように出力されるだけですが、ddtrace-run と一緒に実行すると…
$ DATADOG_PATCH_MODULES=botocore:true ddtrace-run python trace-demo-botocore.py <type 'dict'>
出力には特に違いは見られませんが、Datadog APM では
Describe Instances の API コールが投げられている事が確認出来ます。
Patch
以下のように botocore にパッチを当てて S3 に対して List Buckets を行ってみたいと思います。
import boto3 from ddtrace import Pin, patch patch(botocore=True) client = boto3.client('s3') Pin.override(client, service='s3-demo-access') response = client.list_buckets() print response.__class__
以下のように実行します。
$ python trace-demo-botocore.py <type 'dict'>
出力は特に何も変わりませんが、Datadog APM の画面を見ると…
ちゃんと Trace されていて、List Buckets の API コールが叩かれている事が確認出来ます。
ということで
dd-trace-py を利用すれば botocore でも API コールについて可視化出来ることが解りました。AWS の API を叩くようなアプリケーションを実装する場合、どうしてもパフォーマンスが出ないとか、継続的にパフォーマンスを監視したい場合等に仕込んでみると良さそうです。