Stackdriver Traceを使ってみる(準備)

何らかのAPM(Application Performance Management)ツールを入れたい。以前はNew Relicを使っていたことがあるけど、サーバー(というかCPU)の数に応じて費用がどんどん高騰していくし、かといって以前やっていたように複数台のうちの1台に入れる、というのは出し分けの設定が面倒。

そこでGCPにあるStackdriver Traceを使ってみたい。

Google Cloud Platform のお客様は、Stackdriver Trace を追加料金なしでご利用いただけます。

まずどのライブラリを使えばよいのかがわかりづらかった。

(1) https://github.com/GoogleCloudPlatform/cloud-trace-java/

(2) https://github.com/GoogleCloudPlatform/google-cloud-java/tree/master/google-cloud-trace

なんか似たようなレポジトリがある。 これについては、ざっと中身を見たのと、下記のPRを発見(なぜ取り込まれてない...)

Directs users to cloud-trace-java for instrumentation by mtwo · Pull Request #2382 · GoogleCloudPlatform/google-cloud-java · GitHub

this library allows you to interact with the Stackdriver Trace API, but is not intended for instrumenting an application. If you are looking to send traces to your app, please use the cloud-trace-java SDK.

なのでGoogleCloudPlatform/cloud-trace-javaを使う。

ライブラリの依存関係がきつい。実は(2)のほうも依存ライブラリになっていて、(2)のバージョンが"0.24-alpha"指定になっている。

cloud-trace-java/pom.xml at 0.5.0 · GoogleCloudPlatform/cloud-trace-java · GitHub

最新は0.30で、他で使っていたものと競合してしまったが、いったん0.24のほうで全部合わせた。

500エラーで悩んだときのログ、REPLで試したところ、下記のエラー。

scala> import com.google.cloud.trace.service.TraceGrpcApiService
import com.google.cloud.trace.service.TraceGrpcApiService

scala> val traceService = TraceGrpcApiService.builder().setProjectId("xxxxxxxxx").setScheduledDelay(1).build()
java.lang.NoClassDefFoundError: com/google/api/gax/grpc/ChannelProvider
  at com.google.cloud.trace.service.TraceGrpcApiService.<init>(TraceGrpcApiService.java:162)
  at com.google.cloud.trace.service.TraceGrpcApiService.<init>(TraceGrpcApiService.java:43)
  at com.google.cloud.trace.service.TraceGrpcApiService$Builder.build(TraceGrpcApiService.java:141)
  ... 39 elided
Caused by: java.lang.ClassNotFoundException: com.google.api.gax.grpc.ChannelProvider
  at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
  ... 42 more

実行時エラーになってしまっていた。これは google-cloud-javaのバージョンを0.30を入れたときに出ていて(0.30と0.24が競合したときに0.30が採用されていた)、このエラーが出る。

そのエラーが出なくなって次に直面したのがこれ。

Welcome to Scala 2.12.3 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_152).
Type in expressions for evaluation. Or try :help.

scala> import com.google.cloud.trace.service.TraceGrpcApiService
import com.google.cloud.trace.service.TraceGrpcApiService

scala> val traceService = TraceGrpcApiService.builder().setProjectId("xxx").setScheduledDelay(1).build()
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGBUS (0xa) at pc=0x00000001271f5e40, pid=6617, tid=0x000000000000601b
#
# JRE version: Java(TM) SE Runtime Environment (8.0_152-b16) (build 1.8.0_152-b16)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.152-b16 mixed mode bsd-amd64 compressed oops)
# Problematic frame:
# C  0x00000001271f5e40
#
# Core dump written. Default location: /cores/core or core.6617
#
# An error report file with more information is saved as:
# /Users/xxxx/Documents/xxxxx/xxxxx/hs_err_pid6617.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
/usr/local/Cellar/sbt/0.13.15/libexec/bin/sbt-launch-lib.bash: line 46:  6617 Abort trap: 6           (core dumped) "$@"

コアダンプを吐いて落ちてしまっている。 ただこれはMacだからではないか(Linuxなら問題なくできるのでは)と思いやってみたらLinuxでは動いた。