Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

    View Slide

  2. 1
    Yasunari Tanaka / @7richi
    (http://yasu7ri.hatenablog.com/)
    ウルシステムズ株式会社
    @広島
    Software Engineer
    Certified Scrum Master
    独自Javaフレームワークのメンテナンスや提案、最近ではAzureを使用したアプリケーション構築がメイン
    になってきた。社内ではLT駆動など個人のアウトプットを重視した活動を行っている。
    また、個人の活動として広島Javaユーザグループなどのいくつかの広島IT系コミュニティで活動を行って
    います。
    自己紹介

    View Slide

  3. 2
    Helidon MPを使用して
    分散トレーシングの可視化が行えるようになる
    本日のゴール

    View Slide

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

    View Slide

  5. 4
    MicroProfileについて
    MicroProfileとHelidon

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  9. 8
    Helidonについて
    MicroProfileとHelidon

    View Slide

  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

    View Slide

  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!";
    }
    }
    関数型スタイルでのプラグラミング 従来型スタイルのプログラミング

    View Slide

  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!";
    }
    }
    関数型スタイルでのプラグラミング 従来型スタイルのプログラミング
    使用するプログラミングスタイル

    View Slide

  13. 12
    Helidon MP DEMO
    MicroProfileとHelidon

    View Slide

  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!"}

    View Slide

  15. 14
    pom.xml
    MicroProfileの機能を使用出来る様にするMicroProfileバンドルの依存関係が追加されている。
    この追加でMicroProfile 3.2のAPIが全て使用出来るようになっている。
    サンプルアプリの内容確認

    io.helidon.microprofile.bundles
    helidon-microprofile

    View Slide

  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();
    }
    }

    View Slide

  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

    View Slide

  18. 17
    Java Beanを検出する為にMETA-INF/beans.xmlファイルのbean-discovery-mode属性
    へ”annotated”と指定しアプリケーションスコープのJava Beanを検出するように指定しています。
    サンプルアプリの確認内容

    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">

    View Slide

  19. 18
    JAX-RXアプリケーションの構成を表す為、リソースクラスの定義を行いっています。
    (アプリケーションにはGreetResourceというリソースしか有りません)
    また、ApplicationScopedアノテーションが付けられ、このBeanがアプリケーションスコープの指定がさ
    れています。
    サンプルアプリの確認内容
    @ApplicationScoped
    @ApplicationPath("/")
    public class GreetApplication extends Application {
    @Override
    public Set> getClasses() {
    return CollectionsHelper.setOf(GreetResource.class);
    }
    }

    View Slide

  20. 19
    “/greet”パスのリソースクラスです。
    GETでのリクエストでレスポンスのJsonObjectを生成するメソッドが有ります。
    サンプルアプリの確認内容
    @Path("/greet")
    @RequestScoped
    public class GreetResource {
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public JsonObject getDefaultMessage() {
    return createResponse("World");
    }
    }

    View Slide

  21. 20
    OpenTracingについて
    Helidon MP を使用した分散トレーシング可視化

    View Slide

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

    View Slide

  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

    View Slide

  24. 23
    Jaegerについて
    Helidon MP を使用した分散トレーシング可視化

    View Slide

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

    View Slide

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

    View Slide

  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イメージの守備範囲

    View Slide

  28. 27
    MicroProfile OpenTracing
    Helidon MP を使用した分散トレーシング可視化

    View Slide

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

    View Slide

  30. 29
    単一サービス
    トレーシング DEMO
    Helidon MP を使用した分散トレーシング可視化

    View Slide

  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

    View Slide

  32. 31
    単一サービスのトレーシング
    Jaeger Clientの追加
    pom.xml に以下の依存関係を追加し Helidonが提供しているJaeger Client の追加を行います。
    トレーシング用のサービス名を記述
    Helidon から Jaeger に送信されるトレーシングデータとサービスを紐付ける為
    サービス名をMETA-INF/microprofile-config.propertiesへ指定します。

    io.helidon.tracing
    helidon-tracing-jaeger

    tracing.service=greet-service
    このレイヤー
    Application
    MicroProfile
    OpenTracing
    OpenTracing API
    jaeger-client
    greet-service
    (Quickstart Helidon MP)

    View Slide

  33. 32
    単一サービスのトレーシング結果

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  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();
    }

    View Slide

  38. 37
    Jeagerが使用するトレーシング情報の伝播
    “uber-trace-id”というHEDERにTraceId、SpanId、Parent SpanIdをURLエンコーディングしコロン区
    切りで繋げたものを渡すことで伝播しています
    トレーシング情報の伝播

    View Slide

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

    View Slide

  40. 39
    まとめ

    View Slide

  41. 40
    今回はMicroProfile OpenTracingを使用し分散トレーシングを試してみました。
    分散システムを採用した場合に分散トレーシングの可視化が出来ている状態であれば、仮にシステムに障
    害や遅延が発生しても把握しやすいのではないでしょうか。
    このように、MicroProfile には OpenTracing の他にもMicroProfile MetricsやMicroProfile Fault
    Toleranceなどのマイクロサービス向けの仕様が用意されています。
    現在のモノシリックなJavaEEを使用したアプリケーションからマイクロサービスへの移行を検討する際に、選
    択として検討する事が出来るのではないでしょうか。
    まとめ

    View Slide

  42. 41
    END

    View Slide