Ruby でも Zipkin がしたい! 戀
前回は1つのアプリケーションで Zipkin collector に情報をおくるところまでやった。今回は関連がある2つのアプリケーションのログを Zipkin collcetor に送る。client <-> test-app2 <-> test-app
という経路。
まずは HTTP client で Zipkin の規約にそった HTTP request header を送らなければならない。faraday middleware が良さそうだなとおもって実装しようとしたら、すでに実装されているものを見つけた。https://github.com/Oscil8/faraday-zipkin
とりあえず faraday-zipkin を使って送ることにしてみる。test-app を port: 4567 で立てて、test-app2 を port: 3000 で立ててリクエストハンドラ内で test-app のデータをフェッチするようにする。
require 'base64' require 'open-uri' require 'pry' require 'sinatra' require 'zipkin-tracer' require 'faraday' require 'faraday/zipkin' set :port, 3000 config = { service_name: 'test-app2', service_port: 3000, sample_rate: 1, } use ZipkinTracer::RackHandler, config get '/' do conn = Faraday.new(url: 'http://localhost:4567') do |faraday| faraday.use Faraday::Zipkin::TraceHeaders, 'test-app2' faraday.response :logger faraday.adapter Faraday.default_adapter end r = conn.get r.body + '!!!!' end
しかし bundler の依存解決ができない。とりあえず gemspec を書き換えてみる。
お次は、client_recv アノテーションの binary annotation の送信で encode 関係で実行時エラーになる。調べてみると faraday-zipkin は i16 で http status を送信しているつもりが、thrift ライブラリの内部では string として送信しようとしてバイト列を無理やり UTF8 に変換しようとしてダメっぽい。なので、ひとまず http status は string で送信することにした。このへんの work around 込みのブランチは https://github.com/taiki45/faraday-zipkin/tree/zipkin-tracer-compatible にある。
work around を入れて実際にサーバーへリクエストを送ると無事 Zipkin collector に送信された。
Zipkin web で見てみるとこんな感じ。
アノテーションも見れる (けど2重で送られているような気がする...)
アノテーションの内容で検索もできる。
実際にサービスに組み込むならもうちょっとアノテーション増やして問題発生時に特定のリクエストを追えるようにしたいなーという感じ。faraday middleware 書くか〜。