分散トレーシングを普通のアプリで使うのも便利じゃないかなと思って、
色々書いてみようと思います。
分散トレーシング、OpenTracingとOpenTelemetryについて
分散トレースは、マイクロサービスのような分散ソフトウェアアーキテクチャのデバッグとモニタリングに便利なものです。
分散トレーシングで有名なのがOpenTracingで、色んな実装が乱立してきて良くないから、
仕様として統一しない?みたいなもんだと思います。
OpenCensusというのもあって、OpenTracingとOpenCensusをガッチャンコしたプロジェクトがOpenTelemetryとなってます。
なので、OpenTracingとOpenCensusは2019年に終了してます。
OpenTracing APIとOpenTelemetry APIの互換
これからは、OpenTelemetry APIの時代みたいなんですが、
OpenTracing APIとの関係は↓に記載があります。
https://opentelemetry.io/docs/migration/opentracing/
分散トレーシングをざっくり
Trace: ざっくり言うと1リクエストと同等です。後述するSpanの集まりです。
Span: ひとつの境界内の処理。粒度としては、関数単位でもありますし、マイクロサービスのサービス単位でもあります。
Root Span: Traceの最初のSpanで、Trace全体の時間とほぼ同じです。下図のSpan Aが該当します。
色々なユースケースがありますが、プロセスを跨るやつとかに使えそうです。
https://opentelemetry.io/registry/ を見てると、
たとえば、Apache → Webアプリ、 Apache Camel → Apache Kafkaの流れで、
一気通貫でトレースが追えて性能ボトルネックを見つけれそうです。
ざっくり動かす
トレーサーのJaegerの起動
有名なトレーサーの一つで、Uberさんが開発されたそうでです。
参考:https://www.jaegertracing.io/
dockerでAll in Oneで入れるとすぐ動かせます。
参考:https://www.jaegertracing.io/docs/1.35/getting-started/
$ docker run -d --name jaeger \
-e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \
-e COLLECTOR_OTLP_ENABLED=true \
-p 6831:6831/udp \
-p 6832:6832/udp \
-p 5778:5778 \
-p 16686:16686 \
-p 4317:4317 \
-p 4318:4318 \
-p 14250:14250 \
-p 14268:14268 \
-p 14269:14269 \
-p 9411:9411 \
jaegertracing/all-in-one:1.35
http://localhost:16686/ でJaegerの画面が確認できます。
サンプルのJavaアプリを動かす
gRPCのサンプルがあるので、それを動かしてみます。
https://opentelemetry.io/docs/instrumentation/java/getting-started/
$ git clone -b v1.47.0 --depth 1 https://github.com/grpc/grpc-java
$ cd grpc-java/examples
$ ./gradlew installDist
grpc-java/examplesに、opentelemetry-javaagent.jar をダウンロードして置いておきます。
サーバを起動
$ cd grpc-java/examples # examplesで実行してください。opentelemetry-javaagent.jarもここに置いておく
$ export OTEL_TRACES_EXPORTER=jaeger
$ export JAVA_OPTS="-javaagent:./opentelemetry-javaagent.jar"
$ ./build/install/examples/bin/hello-world-server
クライアントを起動
$ cd grpc-java/examples
$ ./build/install/examples/bin/hello-world-client
http://localhost:16686/ でJaegerの画面を見ます。
unknown_service:javaとかになってますが、出力されてます。
opentelemetryの出力を環境変数(OTEL_TRACES_EXPORTER)やシステムプロパティで簡単に切り替えらるので、便利ですね。
次は、Apache CamelやApache Kafkaなどで複数プロセス組合わたものでやってみようと思います。