2021年1月12日火曜日

Sinatra で Zipkin 超入門

概要

zipkin はトレーシングシステムです
複数の Web アプリケーションを使っているようなシステムで 1 つのリクエストがどうのような経路を辿ったかを可視化したりすることができます

今回は Sinatra アプリケーションを使って Zipkin と連携してみました

環境

  • macOS 11.1
  • Ruby 3.0.0
    • zipkin-tracer 0.47.3
    • sinatra 2.1.0
  • Zipkin 2.23

Zipkin の起動

今回は docker を使います
jar でも動かせるようですが一番簡単な docker を使います

  • docker run -d -p 9411:9411 openzipkin/zipkin

http://localhost:9411/zipkin/ にアクセスすると zipkin の UI が起動しているのが確認できると思います

Sinatra アプリケーションの作成

zipkin-ruby という Rack のミドルウェアとして使えるトレーサライブラリがあるのでこれを使います
使い方は簡単で Sinatra アプリ内でミドルウェアを use するだけです

今回は zipkin に直接トレーサ情報を送信するので特に細かい設定はしていませんがエンドポイントが異なっていたり SQS や RabbitMQ に送信する場合は config を変更してください

  • bundle init
  • vim Gemfile
gem "zipkin-tracer"
gem "sinatra"
gem "thin"
  • bundle config path vendor
  • bundle install

アプリケーションを書いていきます
config.ru 内で rack のミドルウェアとして宣言します

  • vim config.ru
require './app'
require 'zipkin-tracer'
require 'rack'

config = {
  service_name: 'zipkin-test',
  json_api_host: 'http://localhost:9411',
  sample_rate: 1.0,
  sampled_as_boolean: false
}
use ZipkinTracer::RackHandler, config

run ZipkinTest


service_name は必須パラメータです
UI で検索する場合に必ず必要になります
json_api_host は先程 docker 上に構築した Zipkin のエンドポイントを指定します
sample_rate はトレースするリクエストの割合を指定します
0 から 1 の間で指定し、1.0 の場合はすべてのリクエストが Zipkin に送信されます
アクセスが多い場合などは割合を小さくすることで HTTP 通信によるオーバヘッドも小さくすることができます
sampled_as_boolean は false に設定しないと警告が出るので設定しておきます

  • vim app.rb
require 'sinatra'

class ZipkinTest < Sinatra::Base
  get '/' do
    'ok'
  end
end


Sinatra アプリ側は特に何もしません

  • bundle exec rackup config.ru

これで起動しましょう
localhost:9292 でアプリが起動しているのが確認できれば OK です

動作確認

  • curl localhost:9292

でアプリにアクセスしてみましょう
そしてその後で Zipkin の UI から serviceName=zipkin-test で検索すると以下のようにリクエストのトレース情報が格納されているのが確認できると思います
何かしらのクエリで検索しないと結果が表示されないので注意しましょう

最後に

Sinatra を使って Zipkin に入門してみました
主要な各言語にはライブラリが用意されているのでアプリケーションには簡単に導入することができるかなと思います

Zipkin 自体も docker で簡単に起動することができます
ただ今回は Zipkin のデータは永続化していないので永続化する場合はこの辺りを参考に格納ストレージを選択してください

あと気になったのは自分で管理できないような外部のリソースのトレースでそういった場合はどうするのか気になりました

参考サイト

0 件のコメント:

コメントを投稿