概要
アプリのリクエストがどこ、どのくらいの時間をかけてを通ったかなど可視化することができます
環境
- macOS 15.3.1
- Python 3.12.9
- flask 3.1.0
- open-telemetry 0.51b0
- OpenTelemetry Collector 0.121.0
- Jaeger (all in one) 1.67.0
各種インストール
- pipenv install flask
- pipenv install open-telemetry
app.py
from random import randint
from flask import Flask, request
import logging
app = Flask(__name__)
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
@app.route("/rolldice")
def roll_dice():
player = request.args.get('player', default=None, type=str)
result = str(roll())
if player:
logger.warning("%s is rolling the dice: %s", player, result)
else:
logger.warning("Anonymous player is rolling the dice: %s", result)
return result
def roll():
return randint(1, 6)
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8080)
OpenTelemetry 用のログを自動で出力するように設定する
作成したアプリに自動でログを出力してくれるようにします
-
pipenv run opentelemetry-bootstrap -a install
これで再度アプリを起動します
OpenTelemetry 用のログが自動で出力されるようになります
-
export OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED=true && pipenv run opentelemetry-instrument --traces_exporter console --metrics_exporter console --logs_exporter console --service_name dice-server python app.py
これで起動し localhost:8080/rolldice にアクセスするとログが OpenTelemetry 形式になっているが確認できると思いますの
今回はすべてのログを自動で OpenTelemetry 形式にしているので flask の起動ログも OpenTelemetry 形式になっています
コレクターの起動
標準出力に吐かれているログをコレクターに送ることで可視化できます
まずはコレクターを起動します
コレクターは docker イメージが用意されているのでそれを使います
otel-collector-config.yaml
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
exporters:
# NOTE: Prior to v0.86.0 use `logging` instead of `debug`.
debug:
verbosity: detailed
processors:
batch:
service:
pipelines:
traces:
receivers: [otlp]
exporters: [debug]
processors: [batch]
metrics:
receivers: [otlp]
exporters: [debug]
processors: [batch]
logs:
receivers: [otlp]
exporters: [debug]
processors: [batch]
コンテナ起動
-
docker run -p 4317:4317 -v $(pwd)/otel-collector-config.yaml:/etc/otel-collector-config.yaml otel/opentelemetry-collector:latest --config=/etc/otel-collector-config.yaml
これで localhost:4317 にアクセスするとコレクタの画面が確認できます
ログをコレクターに送る
あとは先程標準出力に吐かれていた OpenTelemetry のログを起動したコレクターのエンドポイントに向けます
コレクターに送るためのプラグインが必要になるのでインストールします
-
pipenv install opentelemetry-exporter-otlp
そして再度アプリを OpenTelemetry ログ付きで起動します
console 時にくらべコマンドは短くなっています
-
export OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED=true && pipenv run opentelemetry-instrument --logs_exporter otlp --service_name dice-server python app.py
すると今度はアプリ側ではなくコレクター側に OpenTelemetry の情報が表示されるのが確認できると思います
トレース情報を Jaeger で可視化する
OpenTelemetry Collector は集めたデータを更に別の場所にエクスポートすることができます
トレースデータを Jaeger にエクスポートして WebUI で確認できるようにしてみます
まずは Jaeger を起動します
-
docker run --rm --name jaeger -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 -p 16686:16686 -p 14317:4317 -p 14318:4318 -p 14250:14250 -p 14268:14268 -p 14269:14269 -p 9411:9411 jaegertracing/all-in-one:latest
いろいろポートを開いていますが今回必要なのは OTLP 用の 4317 (ホスト側は 14317) と WebUI 用の 16686 になります
4317 と 4318 はすでにコレクターで使っているので同一ホストで動作させる場合は別ポートをしていします
次に OpenTelemetry Collector の設定ファイルを編集して exporters を追加します
- vim otel-collector-config.yaml
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
exporters:
debug:
verbosity: detailed
otlp/jaeger:
endpoint: 192.168.1.88:14317
tls:
insecure: true
processors:
batch:
service:
pipelines:
traces:
receivers: [otlp]
exporters: [otlp/jaeger]
processors: [batch]
metrics:
receivers: [otlp]
exporters: [debug]
processors: [batch]
logs:
receivers: [otlp]
exporters: [debug]
processors: [batch]
追加したのは exporters の部分です
ここに起動した Jaeger の OTLP ポートを指定しています
コレクターはコンテナで動いているので localhost ではなく Jaeger コンテナが動作しているホストの IP を指定しましょう
そして service.pipelines.traces.exporters を debug から otlp/jaeger に変更します
そしてコレクターを再起動しましょう
動作確認
Flask アプリ、OpenTelemetry Collector、Jaeger をそれぞれ起動し動作確認します
すべて起動できたら localhost:8080/rolldice にアクセスしましょう
そしてトレース情報を Jaeger で確認するため localhost:16686 にアクセスしてみましょう
今回追加した dice-server のトレースが見れるようになっていれば OK です
最後に
Flask アプリに OpenTelemetry を導入してトレース情報を Jaeger で可視化してみました
OpenTelemetry でトレースを可視化する流れは理解できたかなと思います
直接 OpenTelemetry 情報を Jaeger に送る方法はどうやら廃止されるらしく今後はコレクターを経由して Jaeger など別の可視化アプリなどに連携するのが主流になるようです
今回はすべてのログに自動で OpenTelemetry 化する方法を採用しましたがプロダクションなどであれば必要な箇所でスパンなどを定義して送信する必要があります
そのあたりの個別のスパンの作成方法なども機会があれば紹介したいと思います
0 件のコメント:
コメントを投稿