おさかな日誌

魚類がプログラミング

Ruby でも Zipkin がしたい!

Ruby application でも Zipkin collctor に tracing data を送ってトレーストレースするためのメモ第1弾。まずは SERVER_RECV と SERVER_SEND だけを Zipkin collector に送信するやりかた。

経路としては App -> fluentd in-scribe-plugin -> fluentd out-scribe-plugin -> zipkin collector という経路にする。

使用したコードは https://gist.github.com/taiki45/057d50a5a3e5a9aa0407

fluentd の設定

scribe のデフォルトポートで待ち受けて、zipkin collector のポートへ送信する。

<source>
  type scribe
  port 1463
</source>

<match zipkin.**>
  type scribe
  port 9410
</match>

port の指定は zipkin-collector-core/src/main/scala/com/twitter/zipkin/collector/builder/CollectorServiceBuilder.scala にデフォルト値がある。Admin port がなにに使われるのかはまだ調べてない。config ファイルで指定できるはずだ!(まだわかってない)

Zipkin の Rack middleware を挿入する

まずは対象アプリケーションで zipkin-tracer gem で定義されている Rack middleware を use する。

zipkin-tracer gem は RubyGems 経由だと古いのしかないので、bulder の git オプションで HEAD を使いたいところだけど、zipkin のディレクトリ構成的に git オプションで解決するのは難しかったのでローカルにクローンして path オプションで指定する。本アプリケーションだと git submodule とかがいいと思う。

あとは configration を Zipkin の Rack Middleware に渡す。configration の詳細は zipkin-tracer gem の lib-zipkin-tracer.rb に書いてある。

主なオプション

  • scribe_server: scribe server のアドレス。"127.0.0.1:1463" のような String を渡す。今回は fluentd へ scribe protocol で送信するので fluentd へ到達するように設定する。
  • service_name: zipkin 上での service name
  • sample_rate: 0 < x < 1 の範囲で設定する。

Sinatra だとこんな感じ。

require 'base64' # finagle-tracer needs this

require 'sinatra'
require 'zipkin-tracer'


config = {
  service_name: 'test-app',
  service_port: 3000,
  sample_rate: 1,
}

use ZipkinTracer::RackHandler, config

get '/' do
  'hello'
end

Rails の場合 config/application.rb とかで application config に設定しておいて RackMIddleware を引数なしで use すると勝手に config.zipkin_tracer 読んでくれるのでそのキーに configuration 入れておくとよさそう。

Zipkin collector, query, web の起動

このへんはドキュメント通りに

./bin/collector
./bin/query
./bin/web

試してみる

fluentd を起動しておいて、さきほどの Sinatra アプリケーションを起動してリクエストすると zipkin-collector に届いてる。 Mac OS で thrift gem をビルドする時は configure option 渡さないと build failed する。ref

bundle config build.thrift --with-cppflags='-D_FORTIFY_SOURCE=0'
bundle install
bundle exec ruby app.rb -p3000

❯ curl http://localhost:3000
hello

やったー! 動いたよー!

f:id:aladhi:20141027040858p:plain