マイクロサービス化されたアプリケーションでは、パフォーマンス測定の一つとして分散トレーシングが挙げられます。
Akka HTTPをAPIサーバの一つとして構築した際に、他のサービスとのやり取りを含め全体のパフォーマンスを可視化するには、分散トレーシングの仕組みに載せる必要が出てきます。
そこで、数ある分散トレーシングの実装の中から、MetricsとTracingの実装の一つであるOpenCensusと、 OpenCensusが利用できる分散トレーシングのバックエンドの一つであるJaegerを用いて、 Akka HTTPのAPIサーバでの分散トレーシングの可視化を紹介します。
よしだ
Akkaで作られたアプリケーションの監視の必要に迫られた人
どの処理にどれくらい時間がかかっているかを知りたい。
分散トレーシングで可視化しよう
HTML('<iframe src="//www.slideshare.net/slideshow/embed_code/key/g5OEQjI18X0BNw" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/td-nttcom/open-tracingjaeger" title="分散トレーシング技術について(Open tracingやjaeger)" target="_blank">分散トレーシング技術について(Open tracingやjaeger)</a> </strong> from <strong><a href="https://www.slideshare.net/td-nttcom" target="_blank">NTT Communications Technology Development</a></strong> </div>')
- Tracing
- Span全体のStartからFinishまでを含むSpanの集合体
- 各Spanの間には関係性があり、有効巡回グラフ(DAG)で表すことができる。
- Span
- 一つのサービス(境界)内の処理
HTML('<script async class="speakerdeck-embed" data-id="1c62d2535c934a8fb213ffde3cdcf92f" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>')
CNCFの他のプロジェクトとの関わりは、TrailMapを参照。
https://github.com/cncf/landscape#trail-map
TrailMapについては、Japan Container Days、CNCFのCTOが語るクラウドネイティブへの道を参照。
https://opentracing.io/docs/supported-tracers/
ここのリストに挙げられているもの以外にも、プロダクトでサポートしているものは、以下のが挙げられる。
その他にもContributeされているものが、こちらのレポジトリ
現在の最新versionは 1.7
https://www.jaegertracing.io/docs/1.7/features/
# from https://www.jaegertracing.io/docs/1.7/architecture/
HTML('<img src="https://www.jaegertracing.io/img/architecture.png" alt="architecture" style="width: 720px;">')
開発や検証だけなら、all-in-oneなdocker imageが利用可能。
$ docker run -d --name jaeger \
-e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \
-p 5775:5775/udp \
-p 6831:6831/udp \
-p 6832:6832/udp \
-p 5778:5778 \
-p 16686:16686 \
-p 14268:14268 \
-p 9411:9411 \
jaegertracing/all-in-one:1.7
本番向けとして、k8sのmanifestが公開されている。
jaegertracing/jaeger-kubernetes
更にHelmのChartも公開されているので、デプロイもHelmから可能。
更にKubernetes Operatorも用意されたので、更にデプロイが省力化されている。
ここまでのまとめ
あれ? OpenTracing? OpenCensusじゃないの?
OpenCensus is a vendor-agnostic single distribution of libraries to provide metrics collection and tracing for your services.
ベンダー非依存なMetricsとTracing用のライブラリ
Scalaの実装があったから -> opencensus-scala
ちょっとした注意点
toString
そのままなのが気になる。JaegerのZipkin compatibility APIとは。
io.opencensus.scala.akka.http.TracingDirective
が用意されているので、Akka-HTTPでio.opencensus.trace.Span
を使うのが簡単に。io.opencensus.scala.Tracing
が用意されているので、対応していないframeworkでも実装が可能。Zipkin以外にも以下のようなHTTP headerがTracingに用いられている。
kayac/go-katsubushiで順序のあるIDを生成。
memcached プロトコルをAkka Streamで利用出来るように。
dockerのlogging driverとしてfluentdを利用。
Prometheusをバックエンドにすることで、opencensusからMetricsを転送することが可能。
(但し、opencensus-scalaではまだ計画中の段階)
今回は、opencensus-integrations/ocjdbc を利用して、JDBCのMetricsを可視化。
また、他のexporterと組み合わせることで、より詳細な監視が可能に。
OpenTracingとは別に、OpenMetrics といったプロジェクトがCNCFで立ち上がっているので、こちらも同様に注視しておくと良いかも。