OpenTelemetry(Java)のAnnotationsを試してみた

# はじめに

以下にあるAnnotations機能を試してみました。

https://opentelemetry.io/docs/instrumentation/java/automatic/annotations/

以前試したチュートリアルの内容を使って試したので、その続きとなってます。

https://qiita.com/ta-n/items/59f992ad59282c48e8f9


# 実施内容
### ソースコードの修正

* 修正対象

grpc-java/examples/src/main/java/io/grpc/examples/helloworld/HelloWorldServer.java

* 修正内容

import文の追加
```java
import io.opentelemetry.instrumentation.annotations.SpanAttribute;
import io.opentelemetry.instrumentation.annotations.WithSpan;
```
SPANの追加
```java
  static class GreeterImpl extends GreeterGrpc.GreeterImplBase {

    @Override
    public void sayHello(HelloRequest req, StreamObserver<HelloReply> responseObserver) {
      test01();  // （追加部分）追加したメソッドを呼び出すようにする
      HelloReply reply = HelloReply.newBuilder().setMessage("Hello " + req.getName()).build();
      responseObserver.onNext(reply);
      responseObserver.onCompleted();
    }

    // （追加部分）追加したメソッド。このメソッドを1つのSPANとして扱う
    @WithSpan
    public void test01(){
      logger.info("test01");
    }

  }
````

* build.gradleの修正
```
dependencies {
    implementation "io.grpc:grpc-protobuf:${grpcVersion}"
    implementation "io.grpc:grpc-stub:${grpcVersion}"
    compileOnly "org.apache.tomcat:annotations-api:6.0.53"

    // examples/advanced need this for JsonFormat
    implementation "com.google.protobuf:protobuf-java-util:${protobufVersion}"

    runtimeOnly "io.grpc:grpc-netty-shaded:${grpcVersion}"

    testImplementation "io.grpc:grpc-testing:${grpcVersion}"
    testImplementation "junit:junit:4.12"
    testImplementation "org.mockito:mockito-core:3.4.0"

    // （追加部分）ライブラリの追加
    implementation('io.opentelemetry.instrumentation:opentelemetry-instrumentation-annotations:1.18.0-alpha')
}
```

* 再ビルド
~~~
$ ./gradlew installDist
~~~

### プログラム実行

* サーバサイドプログラムの起動
~~~
$ ./build/install/examples/bin/hello-world-server
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
[otel.javaagent 2022-09-18 02:31:57:354 +0000] [main] INFO io.opentelemetry.javaagent.tooling.VersionLogger - opentelemetry-javaagent - version: 1.18.0
Sep 18, 2022 2:32:00 AM io.grpc.examples.helloworld.HelloWorldServer start
INFO: Server started, listening on 50051
~~~

* （サーバサイドプログラムを起動した状態で別プロンプトを立ち上げて）クライアントプログラムの起動
~~~
$ ./build/install/examples/bin/hello-world-client
Sep 18, 2022 2:32:32 AM io.grpc.examples.helloworld.HelloWorldClient greet
INFO: Will try to greet world ...
Sep 18, 2022 2:32:33 AM io.grpc.examples.helloworld.HelloWorldClient greet
INFO: Greeting: Hello world
~~~

* クライアントプログラムを起動すると、サーバサイドプログラム側のプロンプトでOpenTelemetryのログが出力される
修正前と比較すると test01 が新たなSPANとしてログ表示される（上から３行目）
~~~
Sep 18, 2022 2:32:32 AM io.grpc.examples.helloworld.HelloWorldServer$GreeterImpl test01
INFO: test01
[otel.javaagent 2022-09-18 02:32:32:987 +0000] [grpc-default-executor-0] INFO io.opentelemetry.exporter.logging.LoggingSpanExporter - 'GreeterImpl.test01' : dd9921f3c0314654ae197242432cc9f9 4c4efffdbbe35918 INTERNAL [tracer: io.opentelemetry.opentelemetry-instrumentation-annotations-1.16:1.18.0-alpha] AttributesMap{data={thread.name=grpc-default-executor-0, code.namespace=io.grpc.examples.helloworld.HelloWorldServer$GreeterImpl, thread.id=16, code.function=test01}, capacity=128, totalAddedValues=4}
[otel.javaagent 2022-09-18 02:32:33:041 +0000] [grpc-default-executor-0] INFO io.opentelemetry.exporter.logging.LoggingSpanExporter - 'helloworld.Greeter/SayHello' : dd9921f3c0314654ae197242432cc9f9 de6954583ab49d1f SERVER [tracer: io.opentelemetry.grpc-1.6:1.18.0-alpha] AttributesMap{data={net.host.port=50051, rpc.system=grpc, thread.name=grpc-default-executor-0, net.sock.peer.port=56540, net.transport=ip_tcp, thread.id=16, net.host.name=localhost, rpc.method=SayHello, rpc.grpc.status_code=0, rpc.service=helloworld.Greeter, net.sock.peer.addr=127.0.0.1}, capacity=128, totalAddedValues=11}
~~~

適当に整形すると以下
~~~
[otel.javaagent 2022-09-18 02:32:32:987 +0000] [grpc-default-executor-0] INFO
io.opentelemetry.exporter.logging.LoggingSpanExporter - 'GreeterImpl.test01' :
    dd9921f3c0314654ae197242432cc9f9    # TraceID、helloworld.Greeter/SayHelloと同じ
    4c4efffdbbe35918    # SpanID、helloworld.Greeter/SayHelloと異なる
    INTERNAL [tracer: io.opentelemetry.opentelemetry-instrumentation-annotations-1.16:1.18.0-alpha] 
    AttributesMap { 
      data = {
        thread.name=grpc-default-executor-0,
        code.namespace=io.grpc.examples.helloworld.HelloWorldServer$GreeterImpl,
        thread.id=16,
        code.function=test01
      },
      capacity=128,
      totalAddedValues=4
    }
~~~