tl;dr
Datadog APM が PHP にも対応するということで, DD Trace PHP について調べていたら, ドキュメントに以下のように書かれていたので OpenTracing について少しだけ深掘りしてみた.
In order to be familiar with tracing elements it is recommended to read the OpenTracing specification.
OpenTracing について
OpenTracing とは
こちら の資料から引用させて頂いた.
- 分散トレーシングシステムの標準化を目的とした実装
- ベンダーニュートラルな実装である為, 最小限のコード変更により, OpenTracing に準拠した分散トレースバックエンドから別の分散トレースバックエンドにアプリケーションを簡単に移植することが出来る
- OpenTracing プロジェクトは 2015 年に始まり, 2016 年 10 月には Kubernetesプロジェクトなどを主催する CNCF に受け入れている
そもそも分散トレーシングとは
こちらの記事より抜粋させて頂いた.
- マイクロサービス化により, モノリシックアーキテクチャと比較して, システム全体としての振る舞いを把握することが難しい
- システム障害発生時の原因究明が難しくなったり, パフォーマンスの分析が難しくなる
- 分散トレーシングは, 特定のクライアントリクエストを処理する為に関わったサービスを探したり, レイテンシに関するパフォーマンスをデバッグする時に利用される
- 実装のアプローチは大別すると以下の 2 種類
ありがとうございます.
Datadog x OpenTraning
こちら のブログによると, Datadog APM においても OpenTracing をサポートしており, ライブラリをインクルードして数行のコードを記述することで OpenTracing API を利用したトレースを開始出来るとある.
OpenTracing の用語
OpenTracing というか, 分散トレーシングに出てくる各種用語を簡単に.
こちら より引用させて頂いた.
- Span
- 一つのサービス (上図だと, Client や billing 等) 内の処理
- Trace
- Span の開始 (Start) から終了 (Finish) までを含む Span の集合体
こちら の資料から引用させて頂いた.
その他, Operation Name, Start, Finish の Timestamp, Span Context については必須となっている.
Jaeger で体験する OpenTracing
Jaeger
Jaeger はアプリケーションのトレース情報を可視化する OpenTracing に準拠した OSS 実装 (Go で実装されている) である. OpenTracing ドキュメントの Getting Started にも紹介されているので, これを使って OpenTracing を体験してみる. 尚, 本セクションを記述するにあたっては, 以下の記事を参考させて頂いた.
- https://qiita.com/ike_dai/items/f7d95852a86a46e1f19d
- http://blog.scoutapp.com/articles/2018/01/17/tutorial-distributed-tracing-in-ruby-with-opentracing
ありがとうございます.
Jaeger の起動
以下のように Jaeger が起動する
docker run -d -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 -p5775:5775/udp -p6831:6831/udp -p6832:6832/udp \ -p5778:5778 -p16686:16686 -p14268:14268 -p9411:9411 jaegertracing/all-in-one:latest
Jaeger を起動後, ブラウザで http://localhost:16686/ にアクセスすると, 以下のように Jaeger UI にアクセスすることが出来る.
Rack アプリケーション (Sinatra) を利用してトレース情報を送信する
利用するライブラリの導入
Ruby のバージョンは以下の通り.
$ ruby -v ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin17]
以下のように Gemfile を用意する.
# frozen_string_literal: true source "https://rubygems.org" git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } gem "sinatra" gem "opentracing" gem "rack-tracer" gem "jaeger-client"
シンプルなアプリケーション
以下, 本当にシンプルなアプリケーション.
require 'sinatra' require 'opentracing' require 'jaeger/client' require 'rack/tracer' OpenTracing.global_tracer = Jaeger::Client.build(service_name: 'hello') use Rack::Tracer random = Random.new get '/' do sleep(random.rand(0.1)) 'Hello' end
アプリケーションを起動.
bundle exec ruby hello.rb &
curl で適当にアクセスする.
watch 'curl -s localhost:4567 -w "\n"'
しばらく放置.
トレース情報を確認
トレース一覧.
トレース一覧をクリックすると, 下図のように Span ページが表示される.
Span をクリックするとリクエストの詳細等が表示される.
以上
OpenTracing について, 簡単にチュートリアルしてみた. 引き続き, もう少し複雑なアプリケーションを利用して Trace や Span 等の各要素について理解を深めていきたい.
参考
以下の各記事を参考にさせて頂いた.
- http://opentracing.io/
- http://opentracing.io/documentation/
- https://github.com/opentracing/specification/blob/master/specification.md
- https://yakst.com/ja/posts/4949
- https://www.datadoghq.com/blog/opentracing-datadog-cncf/
- https://qiita.com/ike_dai/items/f7d95852a86a46e1f19d
- https://techlife.cookpad.com/entry/2017/09/06/115710
- http://blog.scoutapp.com/articles/2018/01/17/tutorial-distributed-tracing-in-ruby-with-opentracing
ありがとうございます. 引き続き, よろしくお願いいたします.