おさかな日誌

魚類がプログラミング

Ruby でも Zipkin がしたい! 戀

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 で見てみるとこんな感じ。

f:id:aladhi:20141102030356p:plain

f:id:aladhi:20141102030422p:plain

アノテーションも見れる (けど2重で送られているような気がする...)

f:id:aladhi:20141102030444p:plain

アノテーションの内容で検索もできる。

f:id:aladhi:20141102030519p:plain

実際にサービスに組み込むならもうちょっとアノテーション増やして問題発生時に特定のリクエストを追えるようにしたいなーという感じ。faraday middleware 書くか〜。