寝て起きて寝る

過ぎたるは及ばざるが如し

Spring BootでJaegerを使用してトレーシングしてみた

Spring BootでJaegerを使用してトレーシングしてみた

今回のサービスの構成

今回の構成はmainサービス、formatterサービス、publisherサービスの3つのサービスを作成します。

  • formatterサービスは、クエリーパラメータで渡された文字列を"Hello, %s!"の形式に変換し返します。
  • publisherサービスは、クエリーパラメータで渡された文字列をSystem.out.println(String)で標準出力します。
  • mainサービスは、クエリーパラメータで渡された文字列をformatterサービスへ渡し変換します。そして、その変換後の文字列をpublisherサービスへ渡します。
formatterサービス
@RestController
@RequestMapping("/formatter")
public class FormatController {
    @RequestMapping(method = RequestMethod.GET)
    public String format(@RequestParam String str) {
        return String.format("Hello, %s!", str);
    }
}
publisherサービス
@RestController
@RequestMapping("/publisher")
public class PublishController {
    @RequestMapping(method = RequestMethod.GET)
    public String publish(String str) {
        System.out.println(str);
        return "published:" + str;
    }
}
mainサービス
@RestController
@RequestMapping("/main")
public class MainController {
    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping(method = RequestMethod.GET)
    public String main(@RequestParam String str) {
        ResponseEntity<String> FormatResponse = restTemplate.getForEntity(
                "http://localhost:8081/formatter?str={str}",
                String.class,
                str);
        String formatString = FormatResponse.getBody();

        ResponseEntity<String> publishResponse = restTemplate.getForEntity(
                "http://localhost:8082/publisher?str={str}",
                String.class,
                formatString);
        return publishResponse.getBody();
    }
}

Spring BootでJaegerを使用する方法

前回まではOpenTracingのチュートリアルに沿ってSpanコンテキストを伝播させる仕組みなどを独自に実装していきましたが、 今回のSpring Bootで作成されてたREST APIの場合は、その様にすればトレーニング出来るのかを見てみたいと思います。

まず、下記のページにOpenTracingのトレーサーの実装とその他のアドインが掲載されいますので目的に沿ったプロジェクトを探します。 github.com

今回はSpring BootでREST APIを作成するので、この中からTracerにjava-spring-jaeger - Spring starter for JaegerをOpenTracingの実装にjava-spring-web - Springを使用します。

ライブラリの依存関係(pom.xml)
    <!-- https://mvnrepository.com/artifact/io.opentracing.contrib/opentracing-spring-web-starter -->
    <dependency>
      <groupId>io.opentracing.contrib</groupId>
      <artifactId>opentracing-spring-web-starter</artifactId>
      <version>1.0.1</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/io.opentracing.contrib/opentracing-spring-jaeger-web-starter -->
    <dependency>
      <groupId>io.opentracing.contrib</groupId>
      <artifactId>opentracing-spring-jaeger-web-starter</artifactId>
      <version>1.0.1</version>
    </dependency>

行う事はこれだけです!

Spring BootでJaegerを使用したトレーシング結果

mainサービスへリクエストした際のトレーシング結果です。

f:id:yasu7ri:20181214163751j:plain

こちらがトレースした結果を展開したもの

f:id:yasu7ri:20181214163316j:plain

Spring BootでJaegerを使用してトレース情報を可視化は、ライブラリの追加だけで既存のソースコードに手を入れなくてもトレース情報を取得出来るのでとてもお手軽に出来ました。