次に、Distributed Tracingの考え方を導入し、1リクエスト中の各サービスの呼び出しに関してどこでどのくらいの時間がかかっているのかを把握しましょう。 トレージングデータを収集、検索、視覚化するサーバーとしてZipkinを利用します。 各サービスからトレージングデータを透過的に送信するクライアント(instrumentation)としてSpring Cloud Sleuthを利用します。
本ページで作成するソースコードはこちら(07_distributed-tracing
ブランチ)から参照可能です。
-
- Cloud Config ->
Config Client
- Cloud Config ->
-
src/main/java/com/metflix/ZipkinServerApplication.java
をこの内容に変更 -
src/main/resources/application.properties
を削除 -
src/main/resources
を右クリック -> New -> File -
File name:
bootstrap.properties
-
src/main/resources/bootstrap.properties
をこの内容に変更 -
forkした
metflix-confg
プロジェクトのservice-registry
ブランチにzipkin-server.properties
を作成して、この内容に変更
Package ExplorerのZipkinServerApplication.java
を右クリック -> Run As -> Spring Boot App
コンソールを確認。9411番ポートで起動していない場合はConfig Serverの設定が正しくありません。
Zipkin Serverは以下のように実行可能jarをダウンロードすることでも実行可能です。
$ wget -O zipkin.jar 'https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec' $ java -jar zipkin.jarストレージの変更やプロパティの変更を行う場合は、Zipkin Server用のプロジェクトを作成した方がメンテナンスしやすいです。今回はConfig Clientの設定を追加したため、あえてプロジェクトを作成しました。
Zipkinクライアントとして、各サービスにSpring Cloud Sleuth(org.springframework.cloud:spring-cloud-starter-zipkin
)を依存関係を追加します。この依存関係を追加することにより、Springアプリケーションからの外部へのリクエスト情報(Span)が蓄積され、org.springframework.cloud.sleuth.zipkin.ZipkinSpanReporter
クラスが非同期にZipkin Serverに情報を送信するための設定が自動で行われます。Instrument対象はこちら。
ZipkinSpanReporter
の実装としてデフォルトではorg.springframework.cloud.sleuth.zipkin.HttpZipkinSpanReporter
(HTTPで送信)が使用されます。
リクエスト情報はorg.springframework.cloud.sleuth.Sampler
実装クラスによってサンプリングされます。ここではorg.springframework.cloud.sleuth.sampler.PercentageBasedSampler
が使用され、リクエストの10%がZipkin Serverに送信されます。この割合はspring.sleuth.sampler.percentage
プロパティで変更できます(デフォルトは0.1
)。
membership
のpom.xml
をこの内容に変更
recommendations
のpom.xml
をこの内容に変更
membership
、recommendations
、ui
を再起動
http://localhost:8080に何回かアクセスしてください。
ログに[appname,traceId,spanId,exportable]
が含まれることを確認してください。
http://localhost:9411にアクセスし、「Find Traces
」ボタンを押してください。
複数のTraceが表示されます。一つクリックしてください。
選択したTraceの中の各Spanでどのくらいの時間を要しているのかが視覚的にわかります(「Expand All
」ボタンを押すと見やすいです)。
「Dependencies」タブをクリックするとサービスの依存関係がわかります。
次にサンプリング率を変更して全てのリクエストが収集されるようにしましょう。
forkしたmetflix-confg
プロジェクトのservice-registry
ブランチのapplication.properties
に
spring.sleuth.sampler.percentage=1.0
を追加してください。
各サービスを再起動するか/refresh
にPOSTでリクエストを送ってください。開発中はこの設定が便利です。
「Cloud Foundryにデプロイ」でデプロイしたサービスにZipkin Serverを連携させましょう。
$ cd $WORKSHOP/zipkin-server
$ ./mvnw clean package -Dmaven.test.skip=true
zipkin-server
プロジェクト直下にmanifest.yml
を作成してこの内容を設定し、cf push
でデプロイします。(tmaki
の部分は自分のアカウント名またはイニシャルに置き換えてください。)
$ cf push zipkin-server-tmaki
次にこのZipkin ServerをService Instanceとして他のサービスにバインドできるようにUser Provider Serviceを作成します。
$ cf create-user-provided-service zipkin-server -p '{"uri":"http://zipkin-server-tmaki.cfapps.io"}'
membership
, recommendations
, ui
の接続先のZipkin ServerのURLをUser Provided Serviceのcredintials
の値を使うように、Config Serverのプロパティをを設定します。またCloud Foundry上ではspring.sleuth.sampler.percentage
が0.1
になるように設定します。
Cloud Foundryで起動する場合にのみ適用されるようにapplication-cloud.properties
を、この内容を変更してください。
次に各サービスのmanifest.yml
にzipkin-server
サービスをバインドするように設定します。
manifest.yml
をこの内容に変更。
$ cd $WORKSHOP/membership
$ ./mvnw clean package -Dmaven.test.skip=true
$ cf push membership-tmaki
manifest.yml
をこの内容に変更。
$ cd $WORKSHOP/recommendations
$ ./mvnw clean package -Dmaven.test.skip=true
$ cf push recommendations-tmaki
manifest.yml
をこの内容に変更。
$ cd $WORKSHOP/ui
$ ./mvnw clean package -Dmaven.test.skip=true
$ cf push ui-tmaki
http://ui-tmaki.cfapps.ioにアクセス (tmakiを自分のアカウントまたはイニシャルに変更してください)。
http://zipkin-server-tmaki.cfapps.ioにアクセス
デフォルトではZipkin ServerのStrageはインメモリ実装(zipkin.storage.InMemoryStorage
)なので、再起動するとデータが揮発します。また、アプリケーションのヒープを圧迫するので、開発中以外には利用できません。
ZipkinはStrageの実装にMySQL、Cassandra、Elasticsearchを選択できます。
ストレージをMySQLに変更しましょう。依存関係にio.zipkin.java:zipkin-autoconfigure-storage-mysql
を追加すれば自動で設定されます。(zipkin-server
プロジェクトのpom.xml
をこの内容に変更してください。)
Zipkin ServerのストレージとしてMySQLを使うためのプロパティをConfig Serverに設定します。Cloud Foundryで起動する場合にのみ適用されるようにzipkin-server-cloud.properties
を作成して、この内容を設定してください。
Pivotal Web Servicesで使えるMySQLサービス(cleardb
)のフリープラン(spark
)でzipkin-mysql
というService Instanceを作成します。
$ cf create-service cleardb spark zipkin-mysql
zipkin-mysql
サービスをバインドするようにmanifest.yml
をこの内容に変更して、cf push
でデプロイしましょう。
$ cd $WORKSHOP/zipkin-server
$ ./mvnw clean package -Dmaven.test.skip=true
$ cf push zipkin-server-tmaki
これで、Zipkin Serverのデータが永続化され、再起動しても消えません。
ZipkinのストレージとしてのMySQLはパフォーマンスの問題が知られています。高負荷下での利用を検討している場合は、CassandraやElasticsearchも検討してください。Pivotal Web ServicesではElasticsearchのサービスとして
searchly
を利用できます。$ cf create-service searchly starter zipkin-elasticsearch
zipkin-autoconfigure-storage-mysql
の代わりにzipkin-storage-elasticsearch
を使用してください。
本章で説明したZipkin ClientはHTTPのみに対応していましたが、spring-cloud-sleuth-zipkin-stream
を使用することによりSpring Cloud Streamによるメッセージングのトレーシングも可能になります。またZipkin ServerへのレポートもSpring Cloud StreamがサポートするbinderであるRabbitMQまたはKafkaを経由して行われます。
この場合は、Zipkin Serverの実装はZipkinServerApplication
クラスに@EnableZipkinServer
の代わりに@EnableZipkinStreamServer
をつけます。