Ubieという会社に入社して、brave-ktというライブラリを公開しました。 Ubie入社ブログエントリーは試用期間明けたら書くとして、このライブラリについて書いていこうと思います。
想定読者
- Ubieのシステムに興味ある人
- サーバサイドKotlin興味ある人
前提
今自分が関わってるプロジェクトではSpring Boot2.1+Kotlin1.3+GCP(GKE, CloudSQL)を利用して、RESTfulのAPIを開発しています。 ざっくり図にするとこんな感じです。
よくある構成だと思います。 ユーザがAPIを叩くと、最初にロードバランサーに到達し、アプリサーバを経由して、DBアクセスします。
ログ出力
この構成で問題になるのはログです。一つのリクエストを処理するのに複数のコンテナが関わっており、あるユーザのリクエストを追跡する場合、ログを一つ一つ確認していかなければなりません。
この問題を解決するために出てきたのであろうものがStackDriver Traceです。 導入すると以下の公式ドキュメントのquickstartの画像のようにTimelineのところで複数のコンテナのログを一つのリクエストごとにまとめてくれます。
Quickstart | Stackdriver Trace Documentation | Google Cloud
StackDriver Traceの導入
StackDriver Traceの導入には、Google Cloud SDKが必要です。
Installing Google Cloud SDK | Cloud SDK Documentation | Google Cloud
gcloudにログインして、project名を設定します。
gcloud auth application-default login gcloud config set project [PROJECT名]
Spring Bootでの導入には設定をいくつか追加します。Ubieではlogbackを利用しています。
ちなみに、spring-cloud-gcp-starter-trace
の1.0.0.RELEASEは動かないので注意して下さい。
build.gradle
repositories { // for spring-cloud-gcp-starter // There is a bug on 1.0.0.RELEASE maven { url "http://repo.spring.io/libs-milestone" } } dependencies { compile 'io.sentry:sentry-logback:1.7.5' def springCloudGcpVersion = '1.0.0.RC1' compile("org.springframework.cloud:spring-cloud-gcp-starter-trace:$springCloudGcpVersion") compile("org.springframework.cloud:spring-cloud-gcp-starter-logging:$springCloudGcpVersion") }
<configuration> <springProfile name="production"> <include resource="org/springframework/cloud/gcp/autoconfigure/logging/logback-appender.xml" /> <root level="INFO"> <appender-ref ref="STACKDRIVER" /> </root> </springProfile> </configuration>
application.yml
spring: cloud: gcp: trace: enabled: true logging: enabled: true sleuth: sampler: probability: 1.0
問題発生
さて、ここまでやってログを出してみたのですが、以下のようになってしまいました。
queryのログなどがまとまっています。しかし以下の赤線の部分がquery実行中になるはずなのですが、queryの実行時間などを見ることが出来ません。
これはCloudSQLがTraceなどに対応していないように見えます*1。
つまり以下のような感じになっているようです。
これを解決するためには、GCE上のSpring+Kotlin側で明示的にログを出力する以外手は無さそうです。
ようやく本題
この問題を解決するため、TraceのライブラリにあるScopedSpan
を使います。
val span = Tracing.currentTracer().startScopedSpan("db access") try { jdbcTemplate.query ( ... ) } finally { span.finish() }
こんな感じに表示されるようになります。良さそう。
それでこのコード見てて、Kotlinだしもうちょっと書きやすくできないかなーって思い、ライブラリを作りました。それがbrave-ktです。 これを導入すると以下のように書けるようになります。
val result = tracer.scopedSpan("db access") { jdbcTemplate.query ( ... ) }
以上!(二行しか紹介してない。。。)
宣伝
さて、Ubieでは、エンジニアを募集してます!
https://www.careers.dr-ubie.com/www.careers.dr-ubie.com
結構GCPにはヘビーに今後も依存していくので、その辺り関わりたいSREの方や、Spring+Kotlin書きたいサーバサイドKotlinやりたい人はぜひ応募して下さい! 雰囲気先に知りたいって方は以下のただ社員が遊ぶイベントがありますので、どんな感じか確認しにきてください。
ちょっと怖いから何からすればいいかわからない。という方はTwitterでDMして下さい。