Wavefront + OpenTelemetry Auto Instrumentationで分散トレーシング
OpenTelemetryのAuto Instrumentation機能を使えば、分散トレーシングも楽々です。
はじめに
OpenTelemetryというプロジェクトがCNCF界隈で現在盛り上がっています。これは分散トレーシングをより手ごろにという目的で、分散トレーシングの規約などを作っています。
そもそも分散トレーシングとは?の人は、以下を参照して下さい。
さて、もともとこの回でも紹介したように、PythonなどのLLでの分散トレーシングはコードのアップデート箇所が多く、ハードルが高いものでした。
しかし、そんな中、OpenTelemetryにはコーディングをほとんどしなくていいAuto Instrumentation機能の開発と提供がされています。
今回はそれを試すだけでなく、Wavefront(aka Tanzu Observability)と連携する方法を紹介します。
前提
今回必要なのは以下です。
- Python 3
インストール方法はこちらを参照してください。 相変わらずですが高度なエディターは不要です。
Pythonがインストールできたら、まずは、依存関係をローカルでのみテストしたいので、virtualenv
を作ります。任意のディレクトリーで以下を実行してください。
1virtualenv env
2source env/bin/activate
また何かしらのWavefrontのアカウントが必要です。無料で済ませたい場合、この回で書いたようとりあえず、Spring Boot経由でFreemiumライセンスを取得することでも試せます。
ソースコード
ここに公開しています。
https://github.com/mhoshi-vm/wf-python-opentelemetry
構成
構成図のイメージは以下です。
ポイントは以下です。
- OpenTelemetry Auto InstrumentationがPythonのアプリケーションを監視
- OpenTelemetery のZipkin Exporterを使いトレース・スパンを転送
- Wavefront ProxyのZipkin Listen Portでトレースを受け取り
- Wavefront ProxyからTanzu Observabiityへ転送
手順
レポジトリーのクローン
どこでもいいので、いかのようにレポジトリーをクローンします。
1git clone https://github.com/mhoshi-vm/wf-python-opentelemetry
2cd wf-python-opentelemetry
Wavefront Proxyのインストール
以下の手順にしたがって、Wavefront Proxyをインストールします。
https://docs.wavefront.com/proxies_installing.html
OSによって違いますが、例えばMacOSなら以下で実施できます。
1brew tap wavefrontHQ/wavefront
2brew install wfproxy
Wavefront Proxy の起動
まず、wavefront_mon.conf
を少しいじります。
1vi wavefront_mod.conf
以下の行をWavefrontのアカウント情報にします。
1server=https://wavefront.surf/
2token=xxxx
そして、以下の方法でWavefront Proxyを起動します。
1wfproxy -f wavefront_mod.conf
別プロンプトで作業を進めます。
Pythonの依存関係のインストール
以下のコマンドで依存関係をインストールします。なお執筆時点では、OpenTelemetery関連のライブラリー全てのバージョンを0.17b0に統一しないとうまく動きませんでした。
1pip install -r requirements.txt
アプリケーションの起動
まず、今回のアプリケーションですが、以下のとおり超シンプルなHello Worldのアプリです。コード側には一切の分散トレーシングのロジックはないです。
1from flask import Flask
2
3app = Flask(__name__)
4
5@app.route("/")
6def hello():
7 return "Hello World!"
8
9if __name__ == '__main__':
10 app.run(debug=True,host='0.0.0.0')
まず、起動前に以下の環境変数をExportします。
1export OTEL_EXPORTER=zipkin
2export OTEL_EXPORTER_ZIPKIN_ENDPOINT=http://localhost:9411/api/v2/spans
3export OTEL_SERVICE_NAME="hello"
そしていよいよ以下のコマンドでアプリを起動します。
1opentelemetry-instrument python3 ./hello.py
無事に起動したら別のプロンプトで、以下のようにcurlで数回アクセスします。
1curl localhost:5000
動作確認
Wavefrontにログインします。うまくいくと以下のようにトレース情報がみえてくるはずです。
ダッシュボードも以下のようになります。
そして、個別のトレースもいかのように出現します。
素晴らしい。繰り返しですが、Python側に特に分散トレーシングのコードを仕込まなくてもこのレベルの情報が取れています。
なお、OpenTelemetryはまだ発展中のプロジェクトのため、飛びつくことはお勧めしませんが、このように検証として使ってみて、実用を検討するのはありだと思います。
まとめ
OpenTelemetryのAuto Instrumentationで自動的に分散トレーシングをする方法を紹介しました。 またWavefrontとの連携も楽にできることを紹介しました。