Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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と認証、認可

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

Copyright 2019 Red Hat K.K. CONFIDENTIAL Designator mixer 12 ● アクセスコントロールやService Mesh全体のポリシーを管 理 ● Envoyからのテレメトリ情報もここで収集する ● mixerにadapterを組み込むことで、様々な外部サービス (Prometheus等)にテレメトリを送信できる ○ adapterはpluginモデル

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

Copyright 2019 Red Hat K.K. CONFIDENTIAL Designator ● Googleが社内で利用しているメトリック収 集、分散トレーシングライブラリのOSS実 装 ○ TracingだけではなくMetricも含む ● 仕様とライブラリのセット ● グラフ化したい場合は別途Datadog, Prometheus, Zipkin, Jaeger等の別サー ビスが必要 ● Java, Go, C++, Erlang… 等様々な言語で 使用可能 OpenCensus 19

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

Copyright 2019 Red Hat K.K.

Slide 45

Slide 45 text

Copyright 2019 Red Hat K.K. なぜ

Slide 46

Slide 46 text

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 機能
 モノリスから...

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

Copyright 2019 Red Hat K.K. • スループットを考慮した設計 (リクエスト/秒)
 • 起動時のオーバーヘッド 
 − クラスの数, bytecode, JIT
 • メモリオーバーヘッド
 − クラスの数, metadata, コンパイル
 48 Java + コンテナについて隠された真実 RSS ヒープ メタスペース ネイティブ コード 内部

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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


Slide 51

Slide 51 text

Copyright 2019 Red Hat K.K. 51 フレームワークの起動時に何をするのか 起動時間をビルド時間に移動 • 設定ファイルの解析
 • クラスパスとクラスのスキャン
 − アノテーション、Getter、他のメタデータのため 
 • フレームワーク・メタモデル・オブジェクトを構築
 • リフレクションの準備とプロキシの構築
 • IO、スレッドなどを開始して開く


Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

Copyright 2019 Red Hat K.K. 閉じられた世界と仮定
 53 AOTC - GraalVM ネイティブイメージ - デットコードの除去 クラス クラス アプリ クラス ネイティブ 実行 イメージ

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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 最初の応答までの時間

Slide 57

Slide 57 text

Copyright 2019 Red Hat K.K. 57 サポートしてない ダークサイド • 動的クラスローディング
 • InvokeDynamic とメソッドハンドル
 • ファイナライザ
 • セキュリティマネージャ
 • JVMTI, JMX, native VM Interfaces
 使用上の注意 • リフレクション(手作業)
 • 動的プロキシ(手作業)
 • JNI (手作業)
 • Static 初期化
 • 参照
 その“良い” 部分


Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

Copyright 2019 Red Hat K.K. 発表 1.0
 Quarkusを気に入ったら, GitHubで★を付けてね https://github.com/quarkusio/quarkus

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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に定義

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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 ● エンドポイントの設定

Slide 64

Slide 64 text

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


Slide 65

Slide 65 text

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 (ややこしい!)

Slide 66

Slide 66 text

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)(ややこしい!!)

Slide 67

Slide 67 text

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が成熟すればもっとわかりやすくなるはず!

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

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)

Slide 71

Slide 71 text

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)

Slide 72

Slide 72 text

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)

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

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アプリより軽量かつシンプル ○ なぜならリクエストの転送しかしていないから

Slide 75

Slide 75 text

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

Slide 76

Slide 76 text

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  @レッドハット(恵比寿)

Slide 77

Slide 77 text

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

Slide 78

Slide 78 text

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