Datadog APM を使用した非同期 Python コードのトレース | Datadog

Datadog APM を使用した非同期 Python コードのトレース

Author Emily Chang

Last updated: 11月 13, 2019

この数年間で非同期プログラミングは、I/O バウンドアプリケーションを最適化する Python 開発者の間で人気が高まっています。そんな熱心な開発者を対象に、Datadog の APM Python トレーシングクライアントライブラリは多数の非同期ライブラリ(asyncio、aiohttp、gevent、Tornado を含む)と統合できることをご紹介します。そのため、エンドツーエンドのフレームグラフと最小限の設定で、分散アプリケーションをすばやく可視化できます。

Trace async python
This flame graph shows the path of an asynchronous Pylons request. As highlighted above, you can see two tasks executing concurrently within the same request.

非同期を念頭に置いた開発

非同期プログラミングは、マルチスレッドではなく疑似マルチタスクを実装することで、I/O バウンドの Python アプリケーションのパフォーマンスを最適化するのに役立ちます(これは CPU バウンドのアプリケーションにのみ利点があります)。たとえば、asyncio を使用すると、ネットワークイベントやデータベースの応答をブロックするのではなく、Web アプリケーションは単一スレッドのイベントループ内で別のタスクやコルーチンへ戦略的に切り替えることができます。しかしこの疑似マルチタスク動作も、厳密には非同期コードのトレースとデバッグをより困難にします。

多くのトレーシングツールには、非同期アプリケーションで発生するコンテキストの切り替えをトレースする方法がないため、異なるリクエストからデータが単一のトレースに結合されるなど、不正確なトレースが発生する可能性があります。Datadog の Python APM クライアントは、非同期のサポートに対応できるように特別に設計されており、同期コードと非同期コードのどちらを実行しているかに関係なく、あらゆる種類のアプリケーションを簡単に計測できます。

完全なトレース

Datadog APM のエンドツーエンドのフレームグラフは、非同期のタスクが環境全体でどのように並行して実行されるかを可視化します。各フレームグラフ内で、サービスの境界を越えて単一の要求を追跡できます。またその過程でエラーまたは過度の遅延が発生したかどうか、またいつ発生したのかを特定できます。以下の例は、最初のコルーチンはエラーを検出しましたが、2 番目のコルーチンは正常に完了しています。フルスタックトレースを表示すると、エラーをデバッグするのに役立つ追加のコンテキストが確認できます。

Trace async python
This Pylons request executes two tasks concurrently, one of which results in an error.

非同期のリクエストをトレースすると、特定のタスクが他のタスクより遅い理由を調べたり、どのコードパスがエラーを引き起こしているのかを正確に特定できます。Datadog でこのような情報の収集をはじめると、他のメトリクスと同様、簡単にサービスレベルの指標をアラートで発行できます。たとえば、重要なサービスの p95 レイテンシが増加しているときや、サービスが 5xx エラー率の高さを示しはじめたときにアラートを発行するように、ターゲット APM モニターを設定できます。

トレーシングを待機

非同期 Python アプリケーションのトレースを開始するには、使用している非同期フレームワークまたはライブラリに合わせて、正しいコンテキストプロバイダを使用するようにトレーサを設定するだけです。Datadog APM は aiohttp や aiopg のようないくつかのライブラリを自動的に計測します(これらの機能を利用するには、Python APM クライアントのバージョン 0.9.0以降を実行していることを確認してください)。

現在 Datadog を使用していて、まだ APM を試していない場合は、こちらで詳細を確認してください。Datadog をはじめて使用する場合は、にサインアップしてください。

謝辞

Datadog は、Python トレーシングクライアントでの非同期サポートの強化に貢献してくれた Alex Mohr に感謝の意を評します。このライブラリはオープンソースなので、寄稿にご協力いただける場合、こちらのリポジトリをチェックしてください。