ようへいの日々精進XP

よかろうもん

Datadog APM について調べていたら, OpenTracing に辿り着いた (1)

tl;dr

Datadog APMPHP にも対応するということで, 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 種類
    • Black-box schemes ... システム (コード) に手を入れる必要がないことが利点, 特定のリクエストに対する分析が出来ない
    • Annotation-based schemes ... 各サービスに分散トレーシング用のメタデータを付加して下流サービスへと伝播させる実装が必要になるが, 特定のリクエストを分析することが出来る

ありがとうございます.

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 を体験してみる. 尚, 本セクションを記述するにあたっては, 以下の記事を参考させて頂いた.

ありがとうございます.

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 にアクセスすることが出来る.

f:id:inokara:20180812133742p:plain

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"'

しばらく放置.

トレース情報を確認

トレース一覧.

f:id:inokara:20180812134151p:plain

トレース一覧をクリックすると, 下図のように Span ページが表示される.

f:id:inokara:20180812134204p:plain

Span をクリックするとリクエストの詳細等が表示される.

f:id:inokara:20180812134540p:plain

以上

OpenTracing について, 簡単にチュートリアルしてみた. 引き続き, もう少し複雑なアプリケーションを利用して Trace や Span 等の各要素について理解を深めていきたい.

参考

以下の各記事を参考にさせて頂いた.

ありがとうございます. 引き続き, よろしくお願いいたします.