何らかの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を発見(なぜ取り込まれてない...)
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では動いた。