brave-ktをリリースしました

Ubieという会社に入社して、brave-ktというライブラリを公開しました。 Ubie入社ブログエントリーは試用期間明けたら書くとして、このライブラリについて書いていこうと思います。

想定読者

  • Ubieのシステムに興味ある人
  • サーバサイドKotlin興味ある人

前提

今自分が関わってるプロジェクトではSpring Boot2.1+Kotlin1.3+GCP(GKE, CloudSQL)を利用して、RESTfulのAPIを開発しています。 ざっくり図にするとこんな感じです。

f:id:shiraji:20181103114707p:plain

よくある構成だと思います。 ユーザがAPIを叩くと、最初にロードバランサーに到達し、アプリサーバを経由して、DBアクセスします。

ログ出力

この構成で問題になるのはログです。一つのリクエストを処理するのに複数のコンテナが関わっており、あるユーザのリクエストを追跡する場合、ログを一つ一つ確認していかなければなりません。

f:id:shiraji:20181103114819p:plain

この問題を解決するために出てきたのであろうものがStackDriver Traceです。 導入すると以下の公式ドキュメントのquickstartの画像のようにTimelineのところで複数のコンテナのログを一つのリクエストごとにまとめてくれます。

f:id:shiraji:20181103113249p:plain 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")
}

logback-spring.xml

<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

問題発生

さて、ここまでやってログを出してみたのですが、以下のようになってしまいました。

f:id:shiraji:20181103115315p:plain

queryのログなどがまとまっています。しかし以下の赤線の部分がquery実行中になるはずなのですが、queryの実行時間などを見ることが出来ません。

f:id:shiraji:20181103115520p:plain

これはCloudSQLがTraceなどに対応していないように見えます*1

つまり以下のような感じになっているようです。 f:id:shiraji:20181103115826p:plain

これを解決するためには、GCE上のSpring+Kotlin側で明示的にログを出力する以外手は無さそうです。

ようやく本題

この問題を解決するため、TraceのライブラリにあるScopedSpanを使います。

val span = Tracing.currentTracer().startScopedSpan("db access")
try {
    jdbcTemplate.query ( ... )
} finally {
    span.finish()
}

こんな感じに表示されるようになります。良さそう。 f:id:shiraji:20181103121824p:plain

それでこのコード見てて、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やりたい人はぜひ応募して下さい! 雰囲気先に知りたいって方は以下のただ社員が遊ぶイベントがありますので、どんな感じか確認しにきてください。

bosyu.me

ちょっと怖いから何からすればいいかわからない。という方はTwitterでDMして下さい。