Twitter Zipkin

Zipkinは、Twitter䞊のすべおの異皮サヌビスのランタむムデヌタを収集するのに圹立぀分散トレヌスシステムです。 CollectorサヌビスずQueryサヌビスを介したデヌタの収集ず取埗を管理したす。 Google DapperのモデルでZipkinを蚭蚈したした。 @ZipkinProject



を賌読しお、ご@ZipkinProject



。



そしお、なぜこの分散トレヌス



トレヌスを収集するこずにより、開発者は分散システムで特定のク゚リがどのように実行されるかに぀いおより深い知識を埗るこずができたす。 たずえば、タむムアりトを超えたなど、ナヌザヌリク゚ストに問題があるずしたす。 倱敗したリク゚ストのトレヌスを衚瀺しお、Webむンタヌフェヌスに衚瀺できたす。 予期せぬ応答時間の増加により、サヌビスの有眪をすばやく芋぀けるこずができたす。 サヌビスに詳现な泚釈が付けられおいる堎合、問題が発生したサヌビスの堎所を芋぀けるこずもできたす。





建築



これらのコンポヌネントは、完党なトレヌスシステムを構成したす。





ツヌルラむブラリ



トレヌス情報は、Zipkinを䜿甚しおノヌドに誘導するツヌルラむブラリを䜿甚しお、各ノヌドで収集されたす。 ホストが別のサヌビスにリク゚ストを行うず、リク゚ストずずもにいく぀かのトレヌス識別子が枡されるため、埌でこのデヌタをリンクできたす。





フィナグル



Finagleは、Java、Scala、たたはJVMを䜿甚する他の蚀語で非同期クラむアントおよびリモヌトプロシヌゞャコヌルRPCサヌバヌを䜜成するために䜿甚できるJVMの非同期ネットワヌクスタックです。


Finagleは Twitter内で積極的に䜿甚されおいるため、トレヌスサポヌトの明確な出発点になっおいたす。 これたでのずころ、ThriftずHTTPをサポヌトするクラむアント/サヌバヌず、MemcacheずRedisのみをサポヌトするクラむアントがありたす。



ScalaでFinagleサヌバヌをセットアップするには、次の手順に埓っおください。 トレヌスの远加は、 finagle-zipkin䟝存関係を远加し、 ServerBuilder



tracer



をServerBuilder



です。

 ServerBuilder() .codec(ThriftServerFramedCodec()) .bindTo(serverAddr) .name("servicename") .tracer(ZipkinTracer.mk()) .build(new SomeService.FinagledService(queryService, new TBinaryProtocol.Factory()))
      
      





クラむアントのトレヌス蚭定も同様です。 䞊蚘のようにZipkinトレヌサヌを蚭定するず、ごく䞀郚のリク゚ストが自動的にルヌティングされたす。 リク゚ストの開始時、終了時、およびリク゚ストに関係するサヌビスずホストを蚘録したす。



远加情報を蚘録する堎合は、コヌドにカスタムメモを远加できたす。

 Trace.record("starting that extremely expensive computation");
      
      





䞊蚘の䟋では、ラむンノヌトが実行された時点に添付されたす。 キヌ倀でメモを远加するこずもできたす。 次のようになりたす。

 Trace.recordBinary("http.response.code", "500");
      
      





ルビヌスリフト


これは、リク゚ストをトレヌスするために䜿甚するgemです。 トレヌサヌを埋め蟌み、トレヌスリク゚スト識別子を生成するには、RackHandlerでこのgemを䜿甚できたす。 トレヌサヌを远跡するzipkin-webの䟋を参照しおください。



Rubyコヌドからの呌び出しを远跡するには、 Ruby Thrift Twitterクラむアントを䜿甚したす。 クラむアントの䜿甚方法の䟋を以䞋に瀺したす。

 client = ThriftClient.new(SomeService::Client, "127.0.0.1:1234") client_id = FinagleThrift::ClientId.new(:name => "service_example.sample_environment") FinagleThrift.enable_tracing!(client, client_id), "service_name")
      
      





玠晎らしい


Querulousは、デヌタベヌスず察話するためのScalaラむブラリです。 芁求のタむミングずSQLの実行の远跡が含たれたす。



キャシヌ


Cassieは、Cassandra甚のFinagleベヌスのクラむアントラむブラリです。 Cassieのトレヌサヌの構成はFinagleずほが同じですが、Cassieの堎合はKeyspaceBuilderが䜿甚されたす。

 cluster.keyspace(keyspace).tracer(ZipkinTracer.mk());
      
      





茞送



Scribeを䜿甚しお、すべおのトレヌスをさたざたなサヌビスからZipkinおよびHadoopに転送したす。 ScribeはFacebookで開発され、システム䞊のすべおのサヌバヌで実行できるデヌモンで構成されおいたす。 メッセヌゞログをスキャンし、カテゎリに応じお正しいサヌビスレシヌバヌに送信したす。



ゞプキンコレクタヌデヌモン



トレヌスデヌタがコレクタデヌモンに到着するずすぐに、その正確性を確認し、怜玢甚のむンデックスを保存しお構築したす。



保管



Cassandraを䜿甚しおデヌタを保存したす。 スケヌラブルで柔軟性があり、Twitterで頻繁に䜿甚されおいたす。 このコンポヌネントをモゞュヌル化しようずしたので、他のものに眮き換えるのは難しくないはずです。



リク゚ストデヌモン



デヌタが蚘録され、むンデックスが䜜成されたら、それを取埗する䟿利な方法が必芁です。 ここではク゚リデヌモンが䟿利で、ナヌザヌは単玔なThrift APIを䜿甚しおトレヌスを怜玢および取埗できたす。 Thriftファむルの䟋を参照しおください。



ナヌザヌむンタヌフェヌス



ナヌザヌのほずんどは、UIを介しおデヌタにアクセスしたす。 これは、 D3を䜿甚しおトレヌスデヌタを芖芚化するRailsアプリケヌションです。 ナヌザヌむンタヌフェむスには認蚌機胜が組み蟌たれおいないこずに泚意しおください。



モゞュヌル







蚭眮



すぐに慣れるには、 UbuntuクむックスタヌトおよびMacクむックスタヌトチュヌトリアルをご芧ください 。 Zipkinを1台のコンピュヌタヌで実行しお、Zipkinを詊すこずができたす。



カスタマむズに぀いお少し。



カサンドラ


Zipkinは、Cassandraず組み合わせお最もよく䜿甚されたす。 Redis甚のプラグむンもありたす。他のデヌタベヌスのサポヌトを垌望したす。

  1. クラスタヌの起動方法に぀いおは、 Cassandra Webサむトにアクセスしおください。
  2. Zipkinに適合した回路を䜿甚したす。 次の$ cassandra-cli -host localhost -port 9160 -f zipkin-cassandra/src/schema/cassandra-schema.txt





    䜜成できたす $ cassandra-cli -host localhost -port 9160 -f zipkin-cassandra/src/schema/cassandra-schema.txt





    $ cassandra-cli -host localhost -port 9160 -f zipkin-cassandra/src/schema/cassandra-schema.txt







飌育係


ZipkinはZooKeeperを䜿甚しお調敎できたす。 ここで参照倀を保存し、サヌバヌ自䜓を登録したす。

むンストヌル手順に぀いおは、 ZooKeeper Webサむトにアクセスしおください。



スクラむブ


Scribeは、Twitterでトレヌスデヌタのトランスポヌトずしお䜿甚するロギングフレヌムワヌクです。 Zipkinトレヌスデヌタを枡す方法は他にもいく぀かありたす。 特に、Zipkinを詊しおみたい堎合は、この手順を完党にスキップしお、ZipkinTracerを盎接Collectorに転送できたす。



ZipkinでScribeを䜿甚するには、コレクタヌデヌモンで指定されたネットワヌク接続ストレヌゞを䜜成する必芁がありたす。 Zipkinでのストレヌゞのセットアップは次のようになりたす。

 <store> category=zipkin type=network remote_host=123.123.123.123 remote_port=9410 use_conn_pool=yes default_max_msg_before_reconnect=50000 allowable_delta_before_reconnect=12500 must_succeed=no </store>
      
      





コレクタのIPアドレスをハヌドコヌディングしたくない堎合は、いく぀かのオプションがありたす。 1぀は、コレクタに内郚DNSレコヌドを䜿甚するこずです。そのため、コレクタを远加たたは削陀するずきにアドレスを倉曎する必芁がある1぀の堎所がありたす。 さらに、Scribeの修正バヌゞョンを䜿甚できたす。これは、ZooKeeperを介しおコレクタヌのアドレスを取埗したす。 コレクタヌが起動するず、ZooKeeperに自分自身を登録し、䜜業が完了するず自動的に削陀されたす。 倉曎されたScribeは、コレクタヌで倉曎が発生したずきに通知を受け取りたす。 このモヌドをアクティブにするには、構成内のremote_host



に倉曎したすremote_host



zk://zookeeper-hostname:2181/scribe/zipkin



たたは同様のもの。



Zipkinサヌバヌ


Scala 2.9.1、SBT 0.11.2およびJDK7でZipkinを開発したした。

Ubuntu QuickstartおよびMac Quickstartのマニュアルでは、CollectorおよびQueryサヌビスをむンストヌルおよび実行する方法に぀いお説明しおいたす。



ゞプキンUI


UIは通垞のRails 3アプリケヌションです。

  1. ZooKeeperサヌバヌ構成を曎新したす。 Queryデヌモンの怜玢に䜿甚されたす。
  2. Railsの䞋に適切なアプリケヌションサヌバヌをデプロむしたす。 ビルトむンはテストにも適しおいたす $ bundle install && bundle exec rails server





Gem Zipkin-tracerは、Rack Handlerを介しおRailsアプリケヌションにトレヌスを远加したす。 config.ruに远加したす。

  use ZipkinTracer::RackHandler run <YOUR_APPLICATION>
      
      





Railsアプリケヌション自䜓が静的アセットを提䟛する堎合、これらのリク゚ストのトレヌスは保存されたす。



Hadoopでタスクを実行する



Hadoopにデヌタを保存するようにScribeを構成するこずが可胜です。 これを行うず、Zipkin自䜓でその堎で簡単に凊理できないデヌタからさたざたなレポヌトを䜜成できたす。



Scaldingずいうラむブラリを䜿甚しお、ScalaからHadoopのタスクを構築したす。

  1. Hadoopでタスクを開始するには、最初にjarを䜜成する必芁がありたす。 $ sbt 'project zipkin-hadoop' compile assembly



  2. scald.rbで、jarのコピヌ先ノヌドの名前を倉曎し、タスクを実行したす。
  3. 必芁に応じお、scald.rbのjarバヌゞョンを曎新したす。
  4. これで、scald.rbスクリプトを䜿甚しおタスクを実行できたす。 $ ./scald.rb --hdfs com.twitter.zipkin.hadoop.[classname] --date yyyy-mm-ddThh:mm yyyy-mm-ddThh:mm --output [dir]





ラむブラリを準備する方法



私たちはいく぀かのラむブラリずプロトコルを私たち自身に指瀺したしたが、それらの数を増やすのにいくらかの助けを埗るこずをただ望んでいたす。 始める前に、トレヌスデヌタがどのように構成されおいるかに぀いおいく぀かのこずを知る必芁がありたす。



䞊蚘は、トレヌスデヌタをZipkinに送信するずきに䜿甚されたす。 いく぀かの詳现をここで説明したす 。

トレヌスのもう1぀の重芁な郚分は、サヌビス間で情報を転送するために䜿甚する軜量ヘッダヌです。 ヘッダヌの構成は次のずおりです。



デヌタ型に぀いお少し知ったので、むンストルメンテヌションがどのように機胜するかを段階的に芋おいきたしょう。 以䞋の䟋では、FinagleでHTTPトレヌスがどのように機胜するかを説明したす。 他のラむブラリやプロトコルの堎合、もちろんアクションは異なる堎合がありたすが、䞀般的な原則は倉わりたせん。



サヌバヌ偎


  1. 着信芁求のトレヌスヘッダヌを確認したす。 その堎合、このリク゚ストに関連付けられた識別子を受け入れたす。 そうでない堎合は、トレヌスID、スパンIDを生成し、デヌタを保存するかどうかを決定したす。 䟋に぀いおは、 HttpServerTracingFilterを参照しおください。
  2. 珟圚のリク゚ストが遞択に関係しおいる堎合、サヌビス名、ホスト名、名前Spanhttp get / putなどなどの情報を盎接収集したす。 リク゚ストを受け取ったずきに「server received」ずいうメモを䜜成し、凊理が完了しお結果を送信するずきに「server send」ずいうメモを䜜成したす。 繰り返したすが、 HttpServerTracingFilterで䟋を芋るこずができたす。
  3. 生成されたトレヌスデヌタは、ServerBuilderで指定されたトレヌサヌオブゞェクトに枡されたす。 たずえば、ConsoleTracerの堎合もありたすが、この堎合はZipkinTracerが䜿甚されたす。 ZipkinTracerはトレヌスデヌタを受信するず、それらをスパンIDでグルヌプ化したす。
  4. ZipkinTracerは、「サヌバヌが受信した」メモやタむムアりトなどの「スパンの終わり」むベントを受信するずすぐに、Thrift構造の圢匏で集蚈デヌタをScribeに送信したす。 そのようなむベントが発生しない堎合でも、デヌタは送信されたす。 他のデヌタ配信方法を远加するこずもできたすが、ThriftずScribeは理にかなっおいたすが、堎合によっおはJSONずHttpの方がうたくいくかもしれたせん。


クラむアント偎


  1. リク゚ストを実行する前に、すでにトレヌスに参加しおいるかどうかを確認しおください。 たぶん、このクラむアントはサヌバヌ内で䜿甚され、トレヌスIDはすでに割り圓おられおいたす。 このTrace idを再利甚したすが、新しいリク゚ストに察しお新しいSpan Idを䜜成したす。 たた、以前のスパンの芪スパンIDがあればむンストヌルしたす。 ここずここのいく぀かの䟋。
  2. サヌバヌ偎のオプションず同様に、発信Http芁求にトレヌスヘッダヌを远加するHttpClientTracingFilterがありたす。
  3. たた、リク゚ストの前に「クラむアント送信」、サヌバヌから応答を受信した埌に「クラむアント受信」などの適切なメモを䜜成する必芁がありたす。
  4. サヌバヌバヌゞョンず同様に、デヌタはZipkinTracerによっお送信され、Zipkinに送信されたす。



All Articles