読者です 読者をやめる 読者になる 読者になる

ようへいの日々精進XP

よかろうもん

Datadog APM の Python 用クライアント dd-trace-py をざっくりチュートリアルする 〜 botocore 編〜

引き続き

github.com

を弄っています。

ソースコードやドキュメントの端々に

ドキュメント には、以下のように…

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 をお使いの方なら馴染み深い botobotocore の文字が踊っています。

dd-trace-py は botobotocore にもパッチを当てるようにして、リクエストに要した処理時間等のデータを Datadog APM送信する事が出来るようです。

botocore とは

今回は botocore を題材として取り上げてみたいと思います。

github.com

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 では

f:id:inokara:20170401091540p:plain

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 の画面を見ると…

f:id:inokara:20170401092732p:plain

ちゃんと Trace されていて、List Buckets の API コールが叩かれている事が確認出来ます。

ということで

dd-trace-py を利用すれば botocore でも API コールについて可視化出来ることが解りました。AWSAPI を叩くようなアプリケーションを実装する場合、どうしてもパフォーマンスが出ないとか、継続的にパフォーマンスを監視したい場合等に仕込んでみると良さそうです。