ソモサン

私rohkiによる活動や読書の記録をつらつらと書くページです

OpenCensus について調べて試した

OpenCensus

Google 発案の分散トレース/メトリクス収集の仕様および実装、のはず。
opentracing.io とは似て非なるもの。
分散トレーシングについての仕様がいくつかあるようなのだけれども、部分的なものや似たようなものがあるので、それを整理して一括りにしてみた、というイメージです。

組み込む方のインターフェースやスキーマ とか、ライブラリ構成 もあれば、伝播のための仕様もあります。

んで、その Scala Wrapper があるじゃあないですか、ということで試しました。

Github グループ

GitHub グループが 2 つあったんですねー、気が付かなかった。
1 つ目が OpenCensus のメイングループで、先ほど挙げた仕様もこのグループに所属してます。
2 つ目がメインを補完するグループで、今回試した opencensus-scala もこちらの所属です。

opencensus-scala

メイングループに所属してる opencensus-java の軽量 Wrapper とのこと。
と、いいつつ、akka-httphttp4selastic4s に対応してくれてます。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 で作りました。
その結果

こんな感じでトレースできるようになりました。やったぜ。

とはいうものの

真価は複数段になってからなので、今回は「こんにちわ世界」と言った程度です。
どう適用させるかとか、お金のかかり具合とか。むずかしい。