OpenCensus について調べて試した
OpenCensus
Google 発案の分散トレース/メトリクス収集の仕様および実装、のはず。
opentracing.io とは似て非なるもの。
分散トレーシングについての仕様がいくつかあるようなのだけれども、部分的なものや似たようなものがあるので、それを整理して一括りにしてみた、というイメージです。
組み込む方のインターフェースやスキーマ とか、ライブラリ構成 もあれば、伝播のための仕様もあります。
んで、その Scala Wrapper があるじゃあないですか、ということで試しました。
Github グループ
GitHub グループが 2 つあったんですねー、気が付かなかった。
1 つ目が OpenCensus のメイングループで、先ほど挙げた仕様もこのグループに所属してます。
2 つ目がメインを補完するグループで、今回試した opencensus-scala もこちらの所属です。
opencensus-scala
メイングループに所属してる opencensus-java の軽量 Wrapper とのこと。
と、いいつつ、akka-http
や http4s
、elastic4s
に対応してくれてます。Pray framework は 計画済み とのこと。
elastic4s でためす
HttpClientExampleApp.scala をちょっとばかし改造して、以下のようにしました。
package com.sksamuel.elastic4s.samples import com.sksamuel.elastic4s.{ElasticsearchClientUri, RefreshPolicy} import com.sksamuel.elastic4s.http.HttpClient import com.sksamuel.elastic4s.http.search.SearchResponse import com.sksamuel.elastic4s.http.ElasticDsl._ import com.github.sebruck.opencensus.elastic4s.implicits._ // ここ import scala.concurrent.ExecutionContext.Implicits.global object HttpClientExampleApp extends App { // you must import the DSL to use the syntax helpers val client = HttpClient(ElasticsearchClientUri("localhost", 9200)).traced // ここ client.execute { bulk( indexInto("myindex" / "mytype").fields("country" -> "Mongolia", "capital" -> "Ulaanbaatar"), indexInto("myindex" / "mytype").fields("country" -> "Namibia", "capital" -> "Windhoek") ).refresh(RefreshPolicy.WAIT_UNTIL) }.await def result: SearchResponse = client.execute { search("myindex").matchQuery("capital", "ulaanbaatar") }.await.right.get.result // prints out the original json println(Iterator.continually(result).take(1000).toIterable.last.hits.hits.head.sourceAsString) Thread.sleep(1000) client.close() }
あと設定ファイルも作りました。
opencensus-scala { trace { // The probability of which a trace gets sampled, the default is 1/10000 sampling-probability = 1.0, exporters { zipkin { // Wether the Zipkin exporter should be enabled enabled = true // Example http://127.0.0.1:9411/api/v2/spans v-2-url = "http://127.0.0.1:9411/api/v2/spans" // the local service name of the process service-name = "test" } } } }
今回はローカルに zipkin を作って、そこに投げてます。
これは openzipkin/docker-zipkin: Docker images for OpenZipkin で作りました。
その結果
— rohki (@r_ohki) 2018年7月9日
こんな感じでトレースできるようになりました。やったぜ。
とはいうものの
真価は複数段になってからなので、今回は「こんにちわ世界」と言った程度です。
どう適用させるかとか、お金のかかり具合とか。むずかしい。