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
やったー! 動いたよー!