$30 off During Our Annual Pro Sale. View Details »

MicroProfile OpenTracing with Helidon

MicroProfile OpenTracing with Helidon

Yasunari Tanaka

February 26, 2020
Tweet

More Decks by Yasunari Tanaka

Other Decks in Programming

Transcript

  1. MicroProfile OpenTracing with Helidon FEBRUARY 26, 2020 JakartaOne Japan

  2. 1 Yasunari Tanaka / @7richi (http://yasu7ri.hatenablog.com/) ウルシステムズ株式会社 @広島 Software Engineer

    Certified Scrum Master 独自Javaフレームワークのメンテナンスや提案、最近ではAzureを使用したアプリケーション構築がメイン になってきた。社内ではLT駆動など個人のアウトプットを重視した活動を行っている。 また、個人の活動として広島Javaユーザグループなどのいくつかの広島IT系コミュニティで活動を行って います。 自己紹介
  3. 2 Helidon MPを使用して 分散トレーシングの可視化が行えるようになる 本日のゴール

  4. 3 MicroProfileとHelidon – MicroProfile について – Helidon について – Helidon

    MP DEMO Helidon MP を使用した分散トレーシング可視化 – OpenTracing について – Jaeger について – MicroProfile OpenTracing  単一サービス Tracing DEMO  複数サービスを跨いだ Tracing DEMO まとめ 本日のアジェンダ
  5. 4 MicroProfileについて MicroProfileとHelidon

  6. 5 MicroProfileは、従来から有るJava EEのAPI(JAX-RS、JSON-P、CDIなど)に、構成、メトリック、トレー シングなどのAPIを追加したマイクロサービス向けのEnterprise Java API仕様です。 (Latest version:3.3) MicroProfile とは

    https://microprofile.io
  7. 6 対応しているAPI APIの概要 JAX-RS RESTサービスのためのAPI JSON-P JSON文書をパースし、生成し、クエリを発行するためのAPI JSON-B JSON文書をJavaオブジェクトへバインドするためのAPI CDI

    コンテキストと依存性を注入するためのAPI MicroProfile Config さまざまなソースから構成情報を取得するためのAPI MicroProfile Fault Tolerance サービスの障害を他のサービスへ伝播することを防ぐためのAPI MicroProfile Health マイクロサービスの健全性を診断するためのAPI MicroProfile JWT Authentication JWT(JSON Web Token)認証を行うためのAPI MicroProfile Metrics メトリクスを取得するためのAPI MicroProfile OpenAPI OpenAPIの仕様に基づいたドキュメント生成のためのAPI MicroProfile OpenTracing OpenTracingの仕様に基づいたコンテキスト情報を引き回すための API MicroProfile Rest Client Rest Clientを生成するためのAPI MicroProfileのAPI
  8. 7 対応しているAPI APIの概要 JAX-RS RESTサービスのためのAPI JSON-P JSON文書をパースし、生成し、クエリを発行するためのAPI JSON-B JSON文書をJavaオブジェクトへバインドするためのAPI CDI

    コンテキストと依存性を注入するためのAPI MicroProfile Config さまざまなソースから構成情報を取得するためのAPI MicroProfile Fault Tolerance サービスの障害を他のサービスへ伝播することを防ぐためのAPI MicroProfile Health マイクロサービスの健全性を診断するためのAPI MicroProfile JWT Authentication JWT(JSON Web Token)認証を行うためのAPI MicroProfile Metrics メトリクスを取得するためのAPI MicroProfile OpenAPI OpenAPIの仕様に基づいたドキュメント生成のためのAPI MicroProfile OpenTracing OpenTracingの仕様に基づいたコンテキスト情報を引き回すための API MicroProfile Rest Client Rest Clientを生成するためのAPI MicroProfileのAPI 使用するAPI
  9. 8 Helidonについて MicroProfileとHelidon

  10. 9 アプリケーションサーバを必要としない ‒ Netty上で実行される Cloud Native ‒ Docker, Kubernetes への対応・連携

    2018年にOracle社より公開された、軽量マイクロサービス開発のためのオープンソース Javaライブラリー 群です。 (Latest version:1.4.1) Helidon とは 特徴 2つのプログラミングモデル – Helidon SE  関数型スタイル  インジェクション非対応  GraalVM Native Image – Helidon MP  Java EE/Jakarta EEスタイル (JAX-RS/CDI/など)  MaicroProfile の実装 (Helidon 1.4.1 は MicroProfile 3.2をサポート) https://helidon.io
  11. 10 Helidon SE Helidon SE と MP のコードスタイルの違い WebServer.create( Routing.builder()

    .get("/greet", (req, res) -> res.send("Hello World!")) .build()) .start(); Helidon MP public class GreetService { @GET @Path("/greet") public String getMsg() { return "Hello World!"; } } 関数型スタイルでのプラグラミング 従来型スタイルのプログラミング
  12. 11 Helidon SE Helidon SE と MP のコードスタイルの違い WebServer.create( Routing.builder()

    .get("/greet", (req, res) -> res.send("Hello World!")) .build()) .start(); Helidon MP public class GreetService { @GET @Path("/greet") public String getMsg() { return "Hello World!"; } } 関数型スタイルでのプラグラミング 従来型スタイルのプログラミング 使用するプログラミングスタイル
  13. 12 Helidon MP DEMO MicroProfileとHelidon

  14. 13 Mavenを使用し簡単にQuickstart のサンプルアプリケーションを作成出来ます。 Build AND Run サンプルRest API の呼び出し Quickstart

    Helidon MP DEMO mvn archetype:generate -DinteractiveMode=false ¥ -DarchetypeGroupId=io.helidon.archetypes ¥ -DarchetypeArtifactId=helidon-quickstart-mp ¥ -DarchetypeVersion=1.4.1 ¥ -DgroupId=io.helidon.examples ¥ -DartifactId=helidon-quickstart-mp ¥ -Dpackage=io.helidon.examples.quickstart.mp mvn package java -jar target/helidon-quickstart-mp.jar curl -X GET http://localhost:8080/greet {"message":"Hello World!"}
  15. 14 pom.xml MicroProfileの機能を使用出来る様にするMicroProfileバンドルの依存関係が追加されている。 この追加でMicroProfile 3.2のAPIが全て使用出来るようになっている。 サンプルアプリの内容確認 <dependency> <groupId>io.helidon.microprofile.bundles</groupId> <artifactId>helidon-microprofile</artifactId> </dependency>

  16. 15 Helidon MPでのサーバーの起動方法 Helidon が提供しているNetty ベースのWebServerを起動させています。 起動時にmicroprofile-config.propertiesに設定されているプロパティとMETA-INF/beans.xmlファ イルの設定によりBeanを検出します。 サンプルアプリの確認内容 public

    final class Main { private Main() { } public static void main(final String[] args) throws IOException { Server server = startServer(); System.out.println("http://localhost:" + server.port() + "/greet"); } static Server startServer() { return Server.create().start(); } }
  17. 16 META-INF/microprofile-config.propertiesファイルへServerが起動するポートとホストアドレスを構 成データへ指定します。 アプリケーション固有の構成情報を下記の様にファイルに追加しアプリケーションで取得し使用していま す。 サンプルアプリの確認内容 # Microprofile server properties

    server.port=8080 server.host=0.0.0.0 # Application properties app.greeting=Hello
  18. 17 Java Beanを検出する為にMETA-INF/beans.xmlファイルのbean-discovery-mode属性 へ”annotated”と指定しアプリケーションスコープのJava Beanを検出するように指定しています。 サンプルアプリの確認内容 <?xml version="1.0" encoding="UTF-8"?> <beans

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_2_0.xsd" bean-discovery-mode="annotated"> </beans>
  19. 18 JAX-RXアプリケーションの構成を表す為、リソースクラスの定義を行いっています。 (アプリケーションにはGreetResourceというリソースしか有りません) また、ApplicationScopedアノテーションが付けられ、このBeanがアプリケーションスコープの指定がさ れています。 サンプルアプリの確認内容 @ApplicationScoped @ApplicationPath("/") public class

    GreetApplication extends Application { @Override public Set<Class<?>> getClasses() { return CollectionsHelper.setOf(GreetResource.class); } }
  20. 19 “/greet”パスのリソースクラスです。 GETでのリクエストでレスポンスのJsonObjectを生成するメソッドが有ります。 サンプルアプリの確認内容 @Path("/greet") @RequestScoped public class GreetResource {

    @GET @Produces(MediaType.APPLICATION_JSON) public JsonObject getDefaultMessage() { return createResponse("World"); } }
  21. 20 OpenTracingについて Helidon MP を使用した分散トレーシング可視化

  22. 21 OpenTracing とは 最近では、マイクロサービスアーキテクチャでシステム全体を構成する事も多くなってきました。その際、従来 のモノリシックなシステムで使用していたメソッドベースのトレースなどでは複数のサービスを跨がる処理で 障害や遅延が起きた場合、どこで発生しているのか判別が難しいです。そのため、全体を通してトレースす る分散トレーシングと呼ばれる仕組みが必要になります。 OpenTracingは、容易にシステムへ分散トレーシングのトレーサ追加、や切り替えを行うことが出来るしく みを提供する、ベンダ非依存の仕様と各言語向けツール。 2016年10月にCNCFのプロジェクトになりホストされています。

    CNCF Landscape https://opentracing.io/
  23. 22 トレーシング情報の伝播 各Spanからのリクエストでは、HeaderへTrace ID, Span ID, Parent Span IDの情報を付与しトレー シングに必要な情報を伝播させていきます。

    分散トレーシングの概念 Span 処理の開始、終了時刻を持つ1つの処理単位を表します。 Trace Spanをネストし処理の因果関係と順序を表現するSpanの集 合です。システムで処理される実行パスを表すことが出来ま す。 Service A Service B Service C Service D Service E Trace ID=xxxA Span ID=yyyA Trace ID=xxxA Span ID=yyyB Parent Span ID=yyyA Trace ID=xxxA Span ID=yyyC Parent Span ID=yyyB Trace ID=xxxA Span ID=yyyD Parent Span ID=yyyC Trace ID=xxxA Span ID=yyyE Parent Span ID=yyyA Span A Span B Span C Span D Span E Trace
  24. 23 Jaegerについて Helidon MP を使用した分散トレーシング可視化

  25. 24 Jaegerとは GoogleのDapperやTwitterのOpenZipkinにインスパイヤーされUber Technologiesによって作成さ れオープンソース OpenTracing実装の分散トレースシステムです。 分散システムの監視やトラブルシューティングに使用されます。 https://www.jaegertracing.io

  26. 25 Jaegerのアーキテクチャ

  27. 26 Jaegerを動かしてみよう 検証用にAll in OneのDockerイメージが公開されています。 このイメージを利用するとメモリ内のストレージコンポーネントを使用してjaeger-ui、collector、 query、 およびagentを起動できます。 jaeger-ui docker

    run -d --name jaeger ¥ -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 ¥ -p 5775:5775/udp ¥ -p 6831:6831/udp ¥ -p 6832:6832/udp ¥ -p 5778:5778 ¥ -p 16686:16686 ¥ -p 14268:14268 ¥ -p 9411:9411 ¥ jaegertracing/all-in-one:1.16 http://localhost:16686 all-in-one Dockerイメージの守備範囲
  28. 27 MicroProfile OpenTracing Helidon MP を使用した分散トレーシング可視化

  29. 28 MicroProfile 1.3に追加されたOpenTracingに準拠した、JAX-RSアプリケーションで分散トレーシング を行うためのAPI実装です。 OpenTracing で提供されているAPIを使用する場合は、意識的にトレーシング情報の伝播を行わなけれ ばなりませんが、MicroProfile OpenTracingを使用する事で実装の必要なくトレーシング情報の伝播を 行ってくれます。 MicroProfile

    OpenTracingとは このレイヤー
  30. 29 単一サービス トレーシング DEMO Helidon MP を使用した分散トレーシング可視化

  31. 30 概要図 jaeger-agent jaeger-collector memory jaeger-query jaeger-ui Application MicroProfile OpenTracing

    OpenTracing API jaeger-client greet-service (Quickstart Helidon MP) console curl http://localhost:8080/greet Hello World jaegertracing/all-in-one
  32. 31 単一サービスのトレーシング Jaeger Clientの追加 pom.xml に以下の依存関係を追加し Helidonが提供しているJaeger Client の追加を行います。 トレーシング用のサービス名を記述

    Helidon から Jaeger に送信されるトレーシングデータとサービスを紐付ける為 サービス名をMETA-INF/microprofile-config.propertiesへ指定します。 <dependency> <groupId>io.helidon.tracing</groupId> <artifactId>helidon-tracing-jaeger</artifactId> </dependency> tracing.service=greet-service このレイヤー Application MicroProfile OpenTracing OpenTracing API jaeger-client greet-service (Quickstart Helidon MP)
  33. 32 単一サービスのトレーシング結果

  34. 33 単一サービスのトレーシング クラスやメソッドレベルでのトレーシング MicroProfile OpenTracingで提供されている@Tracedアノテーションを付与することで、任意のクラス やメソッドレベルでのトレーシングも可能になります。 @Traced @ApplicationScoped public class

    GreetingProvider { ... } 追加されたトレーシング
  35. 34 複数サービスを跨いだ トレーシング DEMO Helidon MP を使用した分散トレーシング可視化

  36. 35 概要図 jaeger-agent jaeger-collector memory jaeger-query jaeger-ui Application MicroProfile OpenTracing

    OpenTracing API jaeger-client greet-service (Quickstart Helidon MP) console curl http://localhost:8081/greet_proxy {"message":"Hello World!"} Application MicroProfile OpenTracing OpenTracing API jaeger-client greet-proxy-service {"message":"Hello World!"} curl http://localhost:8080/greet jaegertracing/all-in-one
  37. 36 MicroProfile Rest Clientを使用してgreet Serviceを呼び出します。 MicroProfile Rest Clientの作成 GreetServiceClient を使用しGreet

    Serviceの呼出を行います。 greet サービスの呼び出し @RegisterRestClient(baseUri=http://localhost:8080) public interface GreetServiceClient { @Path("/greet") @GET JsonObject getGreetMessage(); } @Inject @RestClient SecondServiceClient secondServiceClient; @GET @Produces(MediaType.APPLICATION_JSON) public JsonObject getDefaultMessage() { return secondServiceClient.getGreetMessage(); }
  38. 37 Jeagerが使用するトレーシング情報の伝播 “uber-trace-id”というHEDERにTraceId、SpanId、Parent SpanIdをURLエンコーディングしコロン区 切りで繋げたものを渡すことで伝播しています トレーシング情報の伝播

  39. 38 複数サービスを跨いだトレーシング結果 greet-proxy-service greet-service

  40. 39 まとめ

  41. 40 今回はMicroProfile OpenTracingを使用し分散トレーシングを試してみました。 分散システムを採用した場合に分散トレーシングの可視化が出来ている状態であれば、仮にシステムに障 害や遅延が発生しても把握しやすいのではないでしょうか。 このように、MicroProfile には OpenTracing の他にもMicroProfile MetricsやMicroProfile

    Fault Toleranceなどのマイクロサービス向けの仕様が用意されています。 現在のモノシリックなJavaEEを使用したアプリケーションからマイクロサービスへの移行を検討する際に、選 択として検討する事が出来るのではないでしょうか。 まとめ
  42. 41 END