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

Distributed Tracing@JJUG CCC 2019 Fall

16yuki0702
November 23, 2019

Distributed Tracing@JJUG CCC 2019 Fall

16yuki0702

November 23, 2019
Tweet

More Decks by 16yuki0702

Other Decks in Technology

Transcript

  1. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    1
    Javaでトレーシング
    Hiroyuki Sasagawa ([email protected])

    Middleware Specialist SA

    2019/11/23

    OPTIONAL SECTION MARKER OR TITLE

    View full-size slide

  2. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    ● 自己紹介
    ● Service Meshとは
    ● Service Meshの一機能である分散トレーシングの歴史
    ○ OpenTracing, OpenCensus, OpenTelemetry
    ● 分散トレーシングの概念
    ○ なぜ必要か
    ○ Trace, Span等々の仕様の話
    ● 実際にJavaでトレーシングサンプルを作って動かす
    ○ Quarkusのご紹介
    ● まとめ
    今日話すこと
    2

    View full-size slide

  3. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    マイクロサービスとは
    3
    ● マイクロサービスは個々のサービスが独立して構築され、相互
    に通信して成り立つ
    ○ 組織も各サービスに応じて作られる (のが理想)
    ○ それぞれ独立して平行に進化し続ける為、スピーディに
    サービスを構築できる
    ○ DevOpsの導入
    ● それぞれのサービスはPolyglotで構成され、通信や監視のロ
    ジックは個別に実装される
    ○ 各サービスに最適なツールを選択できる余地がある
    ● 大規模なアプリケーションを素早く、効率的に作る為の構成とし
    て近年普及

    View full-size slide

  4. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    マイクロサービスの課題
    4
    ● サービスの構成が複雑になればなるほど個々のサービス間の監視は難
    しくなる
    ○ どこでリクエストが失敗したか?
    ○ 失敗を追跡する為のログは正しく出力されているか?
    ○ 失敗した時のRetry, Timeoutは設定されているか?
    ○ Rate limit (流量制限)を入れる必要はあるか?
    ○ 一つのサービスがダウンしていても全体として正しくユーザーに
    サービスを提供できるか?
    ○ Circuit Breakingを入れているか?
    ○ サービス間の遅延はすぐにきづくことができるか?
    ○ サービス間の通信は暗号化できているか?
    ○ サービス毎の名前解決の仕組みは?
    ● これらの課題をアプリケーションのロジックに入れ込み、可視化させるの
    は非常に困難

    View full-size slide

  5. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    Servie Meshの登場
    5
    ● Service Meshはサービス間通信のロジックをアプリケーション
    レイヤーから抜き出し、インフラレイヤーへ抽象化する
    ○ これによりアプリケーションレイヤーは必要なビジネスロ
    ジックのみに集中できる (アプリケーションレイヤーで通
    信、通信のエラーハンドリング、または通信状態の監視
    等のロジックを入れ込む必要が無くなるということ)
    ● Service Meshは個々のアプリケーションに設置させるProxy
    が相互に通信しあい、ネットワークを構成する
    ● Proxyが通信状態の監視、メトリクスの収集を行いデータを可
    視化できるようにする
    ● 課題だったものがService Mesh層を追加することによって解
    決できる

    View full-size slide

  6. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    Istio
    6
    ● Google, IBM, Lyftが開発
    ● Service Meshの実装として最も有名
    ● Http, GRPC, WebSocket, TCPのロードバランシング
    ● トラフィックの制御、ルーティング、リトライ、フェイルオー
    バー、fault injection
    ● Rate limit, quotaの設定
    ● Metric, Log収集、トレーシングもサポート
    ● Pluggableなポリシー設定
    ● proxy間のmTLSと認証、認可

    View full-size slide

  7. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    Istio Architecture
    7

    View full-size slide

  8. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    Pilot
    8
    ● トラフィックの管理、サービスディスカバリを担当
    ● コンポーネントとしては下記に細分される
    ○ Envoy
    ○ Pilot-agent
    ○ Pilot-Discovery

    View full-size slide

  9. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    Envoy
    9
    ● OSS Proxy
    ● C++製のハイパフォーマンスで動作するL4/L7Proxy
    ● IstioにおけるコアコンポーントでSidecarの役割を受け持つ
    ● Envoyが相互に通信することでmeshが構成され、Envoyが
    telemetry情報も収集してくれる
    ● API経由による再起動無しの設定変更に対応

    View full-size slide

  10. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    pilot-agent
    10
    ● Envoyをラップするコンポーネント
    ● Pilot-agent経由でEnvoy構成ファイルを作成し、
    Pilot-agentがEnvoyコマンドを叩くことでProxyが起動する
    ● EnvoyのLifecycle管理を行う

    View full-size slide

  11. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    pilot-discovery
    11
    ● Envoyに対してService Discoveryの機能を提供
    ○ Envoyが直接Discoveryサーバーとやりとりする
    ● EnvoyにTraffic Control (A/Bテスト, Canary Release,
    Timeout, Retry, Circuit Breaking…)設定をpush

    View full-size slide

  12. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    mixer
    12
    ● アクセスコントロールやService Mesh全体のポリシーを管

    ● Envoyからのテレメトリ情報もここで収集する
    ● mixerにadapterを組み込むことで、様々な外部サービス
    (Prometheus等)にテレメトリを送信できる
    ○ adapterはpluginモデル

    View full-size slide

  13. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    Galley
    13
    ● Istio全体の構成管理を行う
    ○ 構成とはyamlファイルで定義されたIstioの構成のこと
    ● Kubernetes Validationwebhookを利用して設定の
    validationを行ったりする

    View full-size slide

  14. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    Citadel
    14
    ● 鍵と証明書の管理を行う
    ● サービス間認証とエンドユーザー認証管理
    ● 暗号化されていないTrafficをUpgrade

    View full-size slide

  15. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    Observe Observe
    Secure
    Control
    Connect
    Jaeger Prometheus
    Istio
    https://blog.openshift.com/self-serviced-end-to-end-encryption-approaches-for-applications-deployed-in-openshift/
    OpenShift Service Mesh / Istio
    15

    View full-size slide

  16. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    サービス間通信を安全で高パフォーマンスな信頼できるものにするオープンなプラットフォーム
    通信可視化
    ポリシーの適用
    サービス認証と
    セキュリティ
    トラフィック管理
    分散トランザクション監視
    サービス間の依存関係分析
    根本原因の分析
    分散コンテキストの伝播
    パフォーマンスと
    レイテンシの最適化
    分散トレーシング
    設定の検証
    メトリクスの収集と
    グラフ化
    サービスのグラフ化
    サービスディスカバリと
    ヘルス状態の算出
    Istio Jaeger
    Kiali
    OpenShift Service Mesh
    16

    View full-size slide

  17. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    Observe Observe
    Secure
    Control
    Connect
    Jaeger Prometheus
    Istio
    https://blog.openshift.com/self-serviced-end-to-end-encryption-approaches-for-applications-deployed-in-openshift/
    分散トレーシングコンポーネント
    17

    View full-size slide

  18. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    ● CNCF傘下のプロジェクト(incubating)
    ● 分散トレーシングの標準化を進める
    ● Tracing APIの仕様を定める
    ○ 実装が乱立してきたので仕様としてまと
    めようぜ!ってなった
    ● 各トレーサがTracingi APIを実装する
    (Zipkin, Jeager, etc...)
    ● Tracingのみ提供
    OpenTracing
    18

    View full-size slide

  19. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    ● Googleが社内で利用しているメトリック収
    集、分散トレーシングライブラリのOSS実

    ○ TracingだけではなくMetricも含む
    ● 仕様とライブラリのセット
    ● グラフ化したい場合は別途Datadog,
    Prometheus, Zipkin, Jaeger等の別サー
    ビスが必要
    ● Java, Go, C++, Erlang… 等様々な言語で
    使用可能
    OpenCensus
    19

    View full-size slide

  20. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    ● CNCF傘下のプロジェクトとしてOpenCensusと
    OpenTracingが合体
    ● 標準化を進める為のシステムコンポーネント、言
    語毎のライブラリを提供
    ● OpenTelemetry仕様の大部分は分散トレーシン
    グに関する物
    ● Tracing、Metric、最終的にはLogも含む
    ● agent/collectorモデル(OpenCensusと同様)
    ● 11/6 OpenTracing,OpenCensusは正式に終了
    OpenTelemetry
    20

    View full-size slide

  21. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    ● マイクロサービスは小さなサービスの集まり
    ● サービスがスケールすればするほどサービス間の関係は複雑さを増す
    ● サービス間のリクエストで問題が発生した場合どうする??
    ○ 特定の条件でサービスが極端に遅くなる
    ○ サービス単体では問題なさそう
    ○ どこかのサービス間、かつ特定のタイミングのみ遅くなる
    ■ ログとメトリック収集だけではこの事象を素早く特定するのは非常に困難
    なぜ分散トレーシングが重要なのか??
    21

    View full-size slide

  22. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    ● 分散トレーシングではサービス間の
    リクエストの詳細な状態を記録する
    ○ リクエストパスの追跡
    ○ サービス間(ホップ)のレイテンシ
    ○ サービス間のエラー状況
    ● 複雑なマイクロサービス間の関係をビュー
    として確認することができる
    ○ トラブルシューティングが容易
    ■ どこのサービス間でエラーが起きて
    いるか、遅延が起きているか
    なぜ分散トレーシングが重要なのか??
    22

    View full-size slide

  23. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    ● Trace
    ○ 分散システム間のリクエストの記録
    ○ Spanのツリー、またはDAG(有効非巡回グラフ - git commit treeと一緒) で表
    現される
    ● Span
    ○ Trace内の連続した作業セグメント
    ○ 名前と時間を持つ
    ○ 他のSpanと親子関係等を持ち関連しあう
    ○ フォーマットはOpenTracingとOpenCensusで異なる
    ■ OpenTelemetryは両方と互換性がある
    分散トレーシングの概念
    23

    View full-size slide

  24. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    ● Root Span
    ○ Traceの最初のSpan
    ○ Root Spanの時間はTrace全体の時間を表すか、非常に近くなる
    ● Context Propagation
    ○ Tracingはコンテキストの伝搬で成り立つ
    ■ GolangのContextパッケージを考えると想像しやすそう
    ○ 複数サービスを横断するリクエストが辿るパス内で、一意にどのリクエストか識
    別可能な情報
    分散トレーシングの概念
    24

    View full-size slide

  25. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    ● Tracer Interface
    ○ Spanの作成とSpan間でやりとりするInterfaceを定義
    ○ OpenTracingではマイクロサービス間でSpanを送信するのに必要なメタデータ
    のinject, extractを行うTracerをベンダーが実装する
    ○ OpenTelemetryの実装ライブラリは OpenCensusが採用していた
    agent/collectorと同様のモデルを使用する
    分散トレーシングの概念
    25

    View full-size slide

  26. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    ● SpanAはRoot Span
    ● SpanBとCはSpanAの子
    ● SpanGはSpanAの後に開始
    分散トレーシングの概念
    26

    View full-size slide

  27. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    ● Operation name
    ○ 大抵はspanを開始したAPIの参照
    ● Start/finish timestamp
    ○ spanがいつ開始/終了したか
    ● Tags
    ○ クエリ/フィルタ用にユーザで定義するannotation
    ● Logs
    ○ span追跡用のkey/valueペア
    ● SpanContext
    ○ Span境界を超えて伝搬されるメタデータ
    Spanのフォーマット (OpenTracing)
    27

    View full-size slide

  28. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    ● Name
    ○ Spanが何かを定義する文字列
    ● SpanID
    ○ SpanのID
    ● TraceID
    ○ Spanが所属するTraceのID
    ● ParantSpanID
    ○ Spanの親ID
    ● StartTime/EndTime
    ○ Spanがいつ開始/終了したか
    Spanのフォーマット (OpenCensus)
    28

    View full-size slide

  29. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    ● Status
    ○ ある時点のスパンの状態を表現
    ● Time event
    ○ ある時点で発生したイベントを定義
    ● Link
    ○ Trace内のspan間の関係を定義
    ● SpanKind
    ○ Span間の関係の定義
    ● TraceOptions
    ○ Spanがサンプリングされるかどうか。バイトで定義
    ● TraceState
    ○ Spanの位置/順序に関する詳細
    Spanのフォーマット 2 (OpenCensus)
    29

    View full-size slide

  30. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    ● OpenTracing, OpenCensus両方に互換性を持つ
    Spanのフォーマット (OpenTelemetry)
    30

    View full-size slide

  31. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    ● OpenTracing実装の一つ
    ● Twitterが開発
    ● Envoyで使われている (対応している)
    ● 2012年くらいから存在し結構歴史は古い
    ● バックエンドはJavaで実装され、UIも提供
    ● C#, Go, Java, JavaScript, Ruby, Scala, PHP等色々な言語でクライアント提供
    Tracing実装 - Zipkin
    31

    View full-size slide

  32. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    Zipkin
    32

    View full-size slide

  33. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    ● OpenTracing実装の一つ
    ● Uberが開発 (2017)
    ● OpenTelemetryのバックエンドとして機能できる
    ● Client LibraryはOpenTelemetry APIを当面実装して対応
    ○ 将来的には凍結し、独自機能はOpenTelemetryに組み込む予定
    ● agent/collector のモデルで動作する (OpenCensusと非常に似ている)
    ○ OpenTracing実装でありつつ、OpenCensusと同じようなアーキテクチャ
    ● OpenShift Service Mesh (Istio) 内でバックエンドコンポーネントとして使用される
    ● OpenTelemetryと少しずつ統合していくと思われる
    Tracing実装 - Jaeger
    33

    View full-size slide

  34. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    Jaeger
    34

    View full-size slide

  35. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    ● OpenTelemetry
    ○ 複数言語にAPI, SDKを提供し、テレメトリデータをバックエンドにエクスポートで
    きる機構を提供
    ● Jaeger
    ○ agent/collectorで動作するが、主な目的はテレメトリデータを受信し、データの
    処理、集約、マイニング、可視化することが目的
    ■ 主にトレースバックエンドとして動作する
    ○ クライアントライブラリを持つが、大部分がOpenTelemetryと重複する為将来的
    に独自機能をOpenTelemetryに組み込み凍結予定
    ● OpenTelemetryはJaegerをバックエンドとしてネイティブにサポート
    ● 主とする領域がそれぞれある
    JaegerとOpenTelemetryを整理
    35

    View full-size slide

  36. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    ● OpenShift Service Meshを使う
    ○ https://docs.openshift.com/container-platform/4.1/service_mesh/service
    _mesh_day_two/ossm-example-bookinfo.html
    ○ Operatorで簡単にインストール可能
    ● annotations: sidecar.istio.io/inject: "true" をDeployment Configに設定すると
    sidecarが立ち上がる
    分散トレーシングを試してみる
    36

    View full-size slide

  37. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    ● gateway appを通して後ろのdest1,
    dest2, dest3へリクエストを転送
    ○ 単純にリクエストを転送するだけし
    か行わない
    ● そのアプリケーションが目的地だった場
    合 Hello from dest1 みたいなレスポン
    スを返す
    サンプルアプリケーションの構成
    37

    View full-size slide

  38. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    ● Envoy(Sidecar Proxy)がトレーシング情報を直接Tracing Backend(Jaeger)に送信
    ● Envoyが以下行う
    ○ リクエスト通過時にRequestID, トレースヘッダー(X-B3-TraceID)を生成
    ○ リクエスト、レスポンスのメタデータ(レスポンスタイム等)に基づき各リクエストの
    Trace Spanを生成
    ○ 生成されたTrace Spanをトレースバックエンド(Jaeger)に送信
    ○ Traceヘッダーをproxyされるアプリケーションに送信
    ● Istio/EnvoyではLightStep, Zipkinをサポート。Zipkin API互換バックエンド(Jaeger)を
    サポート
    Envoy-Based Tracing
    38

    View full-size slide

  39. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    Key : uber-trace-id
    Value : {trace-id}:{span-id}:{parent-span-id}:{flags}
    Propagation Format - Jaeger
    39
    ● Jaegerはデフォルトだと上記フォーマットでHttp headerにPropagation情報を転送し
    てくる
    ● Istio/Envoyはこのフォーマットは対応していない
    ● Zipkinのヘッダーフォーマットであるb3-propagationを使う必要がある
    ○ もしくはLightStep

    View full-size slide

  40. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    x-b3-traceid
    x-b3-parentspanid
    x-b3-spanid
    x-b3-sampled
    Propagation Format - b3(Zipkin)
    40
    ● リクエストを中継するサービスは上記ヘッダーをExtractし
    て次のサービスにPropagationさせる
    ● Twitterではシステム名を鳥にちなんで名付けることが多
    く、Zipkinは元々Big Brother Bird 略してB3と呼ばれてい
    たらしい。
    ○ なのでheaderのprefixにもb3

    View full-size slide

  41. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    x-ot-span-context
    Propagation Format - 余談
    41
    ● LightStep形式の場合は上記ヘッダーが必要

    View full-size slide

  42. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    ● アプリケーションはproxyからリクエストを受け取ったらcontextをextractし次のリクエ
    ストに必要なheader(x-b3-*)をinjectする
    ○ Request-Idだけライブラリでinjectされないので自前で設定する
    ○ outgoingもIstioが拾ってspanを生成してくれる
    ● 末端(リクエストを中継しない)アプリケーションは特別な実装は不要
    Envoy-Based Tracing - Application側で必要な実装まとめ
    42

    View full-size slide

  43. Copyright 2019 Red Hat K.K.
    Supersonic. Subatomic. Java.

    View full-size slide

  44. Copyright 2019 Red Hat K.K.

    View full-size slide

  45. Copyright 2019 Red Hat K.K.
    なぜ

    View full-size slide

  46. Copyright 2019 Red Hat K.K.
    46
    モノリス
    F F
    F
    F
    F
    F
    F
    F
    F
    F
    F F
    F
    F
    F
    F
    F
    F
    F
    F
    F F
    F
    F
    F
    F
    F
    F
    F
    F
    F F
    F
    F
    F
    F
    F
    F
    F
    F
    F F
    F
    F
    F
    F
    F
    F
    F
    F
    F F
    F
    F
    F
    F
    F
    F
    F
    F
    F F
    F
    F
    F
    F
    F
    F
    F
    F
    F F
    F
    F
    F
    F
    F
    F
    F
    F
    F F
    F
    F
    F
    F
    F
    F
    F
    F
    F F
    F
    F
    F
    F
    F
    F
    F
    F
    F F
    F
    F
    F
    F
    F
    F
    F
    F
    F F
    F
    F
    F
    F
    F
    F
    F
    F
    F F
    F
    F
    F
    F
    F
    F
    F
    F
    F F
    F
    F
    F
    F
    F
    F
    F
    F
    F F
    F
    F
    F
    F
    F
    F
    F
    F
    F F
    F
    F
    F
    F
    F
    F
    F
    F
    F F
    F
    F
    F
    F
    F
    F
    F
    F
    F F
    F
    F
    F
    F
    F
    F
    F
    F
    1 モノリス ≈ 20 microservices ≈ 200 機能

    モノリスから...

    View full-size slide

  47. Copyright 2019 Red Hat K.K.
    47
    なぜこの痛みを経験するのか?
    機敏性、拡張性、迅速なビジネス反応性
    コンテナ・プラットフォーム

    View full-size slide

  48. Copyright 2019 Red Hat K.K.
    • スループットを考慮した設計 (リクエスト/秒)

    • 起動時のオーバーヘッド 

    − クラスの数, bytecode, JIT

    • メモリオーバーヘッド

    − クラスの数, metadata, コンパイル

    48
    Java + コンテナについて隠された真実
    RSS
    ヒープ
    メタスペース ネイティブ
    コード 内部

    View full-size slide

  49. Copyright 2019 Red Hat K.K.
    49
    コンテナ・プラットフォーム
    ノード ノード
    ノード
    ヒープ
    ヒープ
    ヒープ
    ヒープ
    Java + コンテナについて隠された真実

    View full-size slide

  50. Copyright 2019 Red Hat K.K.
    とは何か
    QUARK: 素粒子 / US: コンピュータ科学で最も難しいこと


    View full-size slide

  51. Copyright 2019 Red Hat K.K.
    51
    フレームワークの起動時に何をするのか
    起動時間をビルド時間に移動
    • 設定ファイルの解析

    • クラスパスとクラスのスキャン

    − アノテーション、Getter、他のメタデータのため

    • フレームワーク・メタモデル・オブジェクトを構築

    • リフレクションの準備とプロキシの構築

    • IO、スレッドなどを開始して開く


    View full-size slide

  52. Copyright 2019 Red Hat K.K.
    事前作業, ビルド, ランタイム
    コンパイル プロビジョン 配線と組立
    ネイティブコ
    ンパイル
    実行可能イメージ
    ネイティブ実行
    イメージ

    View full-size slide

  53. Copyright 2019 Red Hat K.K.
    閉じられた世界と仮定

    53
    AOTC - GraalVM ネイティブイメージ - デットコードの除去
    クラス
    クラス
    アプリ
    クラス
    ネイティブ
    実行
    イメージ

    View full-size slide

  54. Copyright 2019 Red Hat K.K.
    Supersonic Subatomic Java
    Quarkus + Native (GraalVMを使用)
    12 MB
    Quarkus + JDK (OpenJDKを使用)
    73 MB
    典型的なクラウドネイティブスタック
    Traditional Cloud-Native Stack
    136 MB

    View full-size slide

  55. Copyright 2019 Red Hat K.K.
    Supersonic Subatomic Java
    Quarkus + AOT (GraalVMを使用)
    28 MB
    Quarkus + JDK (OpenJDKを使用)
    145 MB
    典型的なクラウドネイティブスタック
    209 MB

    View full-size slide

  56. Copyright 2019 Red Hat K.K.
    Supersonic Subatomic Java
    Quarkus + AOT (GraalVMを使用) 0.016 Seconds
    Quarkus + JDK (OpenJDKを使用) 0.943 Seconds
    Quarkus + AOT (GraalVMを使用) 0.042 Seconds
    Quarkus + JDK (OpenJDKを使用) 2.033 Seconds
    典型的なクラウドネイティブスタック 9.5 Seconds
    典型的なクラウドネイティブスタック 4.3 Seconds
    最初の応答までの時間

    View full-size slide

  57. Copyright 2019 Red Hat K.K.
    57
    サポートしてない
    ダークサイド
    • 動的クラスローディング

    • InvokeDynamic とメソッドハンドル

    • ファイナライザ

    • セキュリティマネージャ

    • JVMTI, JMX, native VM Interfaces

    使用上の注意
    • リフレクション(手作業)

    • 動的プロキシ(手作業)

    • JNI (手作業)

    • Static 初期化

    • 参照

    その“良い” 部分


    View full-size slide

  58. Copyright 2019 Red Hat K.K.
    拡張
    JDK JIT - HotSpot AOTC - GraalVM ネイティブイメージ

    View full-size slide

  59. Copyright 2019 Red Hat K.K.
    発表
    1.0

    Quarkusを気に入ったら, GitHubで★を付けてね
    https://github.com/quarkusio/quarkus

    View full-size slide

  60. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    https://code.quarkus.io/
    60

    View full-size slide

  61. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    実装 1
    61
    package org.acme;
    import org.eclipse.microprofile.rest.client.inject.RestClient;
    ...
    @Path("/")
    public class ExampleResource {
    @Inject
    @RestClient
    TracingService tracingService;
    @GET
    @Path("/todest1")
    @Produces(MediaType.TEXT_PLAIN)
    public String todest1(@HeaderParam("x-request-id") String requestId,
    @HeaderParam("x-b3-traceid") String traceId,
    @HeaderParam("x-b3-spanid") String spanId,
    @HeaderParam("x-b3-sampled") String sampled,
    @HeaderParam("x-b3-flags") String flags,
    @HeaderParam("user-agent") String userAgent
    ) {
    return tracingService.getResponse(requestId, traceId, spanId, sampled, flags, userAgent);
    }
    }
    ● 必要なヘッダー(x-b3-*)を
    HeaderParamに定義

    View full-size slide

  62. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    実装 2
    62
    package org.acme;
    import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
    import javax.ws.rs.HeaderParam;
    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.Produces;
    @Path("/")
    @RegisterRestClient
    public interface TracingService {
    @GET
    @Path("/dest1")
    @Produces("text/plain")
    String getResponse(@HeaderParam("x-request-id") String requestId,
    @HeaderParam("x-b3-traceid") String traceId,
    @HeaderParam("x-b3-spanid") String spanId,
    @HeaderParam("x-b3-sampled") String sampled,
    @HeaderParam("x-b3-flags") String flags,
    @HeaderParam("user-agent") String userAgent
    );
    }
    ● TracingServiceに渡すHeaderを
    HeaderParamで指定するだけ。これで必要
    なHeader Propagationが可能になる。
    ○ 今回はわかりやすさの為この形式
    ○ 詳しくはこちら
    Rest Client for MicroProfile
    https://download.eclipse.org/microprofil
    e/microprofile-rest-client-1.3/micropro
    file-rest-client-1.3.html

    View full-size slide

  63. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    実装 3
    63
    org.acme.TracingService/mp-rest/url=http://dest1:8080
    org.acme.TracingService/mp-rest/scope=javax.inject.Singleton
    ● エンドポイントの設定

    View full-size slide

  64. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    図を交えてもう一度整理
    64
    Pilot-agent
    (Envoy)
    dest3

    app
    Pilot-agent
    (Envoy)
    istio-ingressgateway

    Pilot-agent
    (Envoy)
    gateway

    app
    Pilot-agent
    (Envoy)
    dest1

    app
    Pilot-agent
    (Envoy)
    dest2

    app
    Request
    Zipkin
    (k8s Service)
    Jaeger
    (Collector)
    Jaeger UI


    View full-size slide

  65. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    図を交えてもう一度整理
    65
    Pilot-agent
    (Envoy)
    dest3

    app
    Pilot-agent
    (Envoy)
    istio-ingressgateway

    Pilot-agent
    (Envoy)
    gateway

    app
    Pilot-agent
    (Envoy)
    dest1

    app
    Pilot-agent
    (Envoy)
    dest2

    app
    Request
    Zipkin
    (k8s Service)
    Jaeger
    (Collector)
    Jaeger UI

    ● EnvoyがInbound, Outbound時にSpan生成、proxyされたアプリケーションに渡す。
    TracerにはOpenTracing(Zipkin)を使用
    ● Envoyが直接istio-system内のZipkin Serviceにテレメトリ送信
    ○ Zipkinの後ろに控えているのはJaeger Collector (ややこしい!)

    View full-size slide

  66. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    図を交えてもう一度整理
    66
    Pilot-agent
    (Envoy)
    dest3

    app
    Pilot-agent
    (Envoy)
    istio-ingressgateway

    Pilot-agent
    (Envoy)
    gateway

    app
    Pilot-agent
    (Envoy)
    dest1

    app
    Pilot-agent
    (Envoy)
    dest2

    app
    Request
    Zipkin
    (k8s Service)
    Jaeger
    (Collector)
    Jaeger UI

    ● ProxyされたアプリケーションはOpenTracing(Jaeger)を使用して、Proxyから渡って
    きたContextをProgateする
    ○ ただしヘッダーの形式はIstio/Envoyと合わせてZipkin(B3)(ややこしい!!)

    View full-size slide

  67. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    図を交えてもう一度整理
    67
    Pilot-agent
    (Envoy)
    dest3

    app
    Pilot-agent
    (Envoy)
    istio-ingressgateway

    Pilot-agent
    (Envoy)
    gateway

    app
    Pilot-agent
    (Envoy)
    dest1

    app
    Pilot-agent
    (Envoy)
    dest2

    app
    Request
    Zipkin
    (k8s Service)
    Jaeger
    (Collector)
    Jaeger UI

    ● Envoy(Zipkin)とアプリケーション(Jaeger)で異なるライブラリを使用していても、
    OpenTracing実装なので正しくContextをPropagateできる
    ○ OpenTracingの恩恵
    ○ OpenTelemetryが成熟すればもっとわかりやすくなるはず!

    View full-size slide

  68. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    kialiで確認
    68

    View full-size slide

  69. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    Jaegerでも確認
    69
    Outbound
    Inbound

    View full-size slide

  70. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    Headerを見てみる (gateway)
    70
    X-Request-Id, [5465a62d-e194-99a0-9230-d44a52231e60]
    X-B3-Traceid, [a8cfcf72af6f01b2548c9f9605ac2b1f]
    X-B3-Spanid, [845a979942ca2aa4]
    X-B3-Parentspanid, [548c9f9605ac2b1f]
    X-B3-Sampled, [1]
    X-Forwarded-Host: [istio-ingressgateway-istio-system.apps.opensh...]
    ● X-Forwarded-Hostをみるとistio-ingressgatewayからリクエストからきていること
    がわかる
    ● isito-ingressgatewayがX-Request-ID, X-B3-Traceidを生成
    ● X-B3-Parentspanidはisito-ingressgatewayが生成したSpanを指す
    ● X-B3-Spanidはistio-sidecarがリクエストを受け取った時に生成(inbound)

    View full-size slide

  71. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    Headerを見てみる (dest1)
    71
    X-Request-Id, [5465a62d-e194-99a0-9230-d44a52231e60]
    X-B3-Traceid, [a8cfcf72af6f01b2548c9f9605ac2b1f]
    X-B3-Spanid, [02b0374724e15993]
    X-B3-Parentspanid, [60a1097e8035b5e2]
    X-B3-Sampled, [1]
    ● X-B3-Parentspanidはgateway のOutbound Spanを指す
    ● X-B3-Spanidはistio-sidecarがリクエストを受け取った時に生成(inbound)

    View full-size slide

  72. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    Headerを見てみる (dest2)
    72
    X-Request-Id, [5465a62d-e194-99a0-9230-d44a52231e60]
    X-B3-Traceid, [a8cfcf72af6f01b2548c9f9605ac2b1f]
    X-B3-Spanid, [8959f06229087845]
    X-B3-Parentspanid, [f96978dbdc3effb1]
    X-B3-Sampled, [1]
    ● X-B3-Parentspanidはdest1 のOutbound Spanを指す
    ● X-B3-Spanidはistio-sidecarがリクエストを受け取った時に生成(inbound)

    View full-size slide

  73. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    Spanの関係
    73
    548c9f9605ac2b1f
    845a979942ca2aa4
    60a1097e8035b5e2
    02b0374724e15993
    f96978dbdc3effb1
    8959f06229087845

    View full-size slide

  74. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    Sample置き場
    74
    ● https://github.com/16yuki0702/tracing-app-java

    ○ 今回のサンプル - ひとまずdest1のみ
    ● https://github.com/16yuki0702/tracing-app
    ○ こちらはGo Version
    ■ dest2, dest3もあるフルバージョン
    ● Tracing試したいだけならBookinfoアプリより軽量かつシンプル
    ○ なぜならリクエストの転送しかしていないから

    View full-size slide

  75. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    まとめ
    75
    ● マイクロサービスにServie Meshは必須
    ● 分散トレーシングでマイクロサービスを可視化しよう
    ● OpenShift Service Meshで分散トレーシングするなら、アプリ側でちょっと実装入れ
    るだけで割と簡単に試せるはず
    ○ ただしSideCarに対するInbound/Outboundだけでなく、もっと細かくSpan取りた
    いなら自分でStartSpanとかする必要あり
    ■ 例えば特定の関数だけ細かく取りたいとか
    ● Quarkusでマイクロサービス作ろう

    View full-size slide

  76. Copyright 2019 Red Hat K.K.
    Red Hat
    Quarkus (1.0 GAおめでとう)、Droolsなど! 
    Connpassで「Red Hat」で検索
    76
    Japan JBoss User Group
    勉強会
    https://ossbyredhat.connpass.com/event/153523
    /
    12月11日(水)19:00 - 20:30 
    @レッドハット(恵比寿)

    View full-size slide

  77. Copyright 2019 Red Hat K.K.
    Red Hat
    77
    アンケートにご協力よろしくお願いします
    お手元の紙のQRコード、または
    https://red.ht/JJUG_CCC2019
    からフォームへ回答ください
    ⇨Red Hatロゴグッズをプレゼント!

    View full-size slide

  78. Copyright 2019 Red Hat K.K.
    CONFIDENTIAL Designator
    linkedin.com/company/red-hat
    youtube.com/user/RedHatVideos
    facebook.com/redhatinc
    twitter.com/RedHat
    78
    Red Hat is the world’s leading provider of enterprise
    open source software solutions. Award-winning
    support, training, and consulting services make Red Hat
    a trusted adviser to the Fortune 500. 

    Thank you
    OPTIONAL SECTION MARKER OR TITLE

    View full-size slide