Pro Yearly is on sale from $80 to $50! »

Distributed Tracing@JJUG CCC 2019 Fall

Bf109c5ab1d917cf6c5e227389ef467b?s=47 16yuki0702
November 23, 2019

Distributed Tracing@JJUG CCC 2019 Fall

Bf109c5ab1d917cf6c5e227389ef467b?s=128

16yuki0702

November 23, 2019
Tweet

Transcript

  1. Copyright 2019 Red Hat K.K. CONFIDENTIAL Designator 1 Javaでトレーシング Hiroyuki

    Sasagawa (hsasagaw@redhat.com)
 Middleware Specialist SA
 2019/11/23
 OPTIONAL SECTION MARKER OR TITLE
  2. Copyright 2019 Red Hat K.K. CONFIDENTIAL Designator • 自己紹介 •

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

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

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

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

  8. Copyright 2019 Red Hat K.K. CONFIDENTIAL Designator Pilot 8 •

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

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

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

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

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

    鍵と証明書の管理を行う • サービス間認証とエンドユーザー認証管理 • 暗号化されていないTrafficをUpgrade
  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
  16. Copyright 2019 Red Hat K.K. CONFIDENTIAL Designator サービス間通信を安全で高パフォーマンスな信頼できるものにするオープンなプラットフォーム 通信可視化 ポリシーの適用

    サービス認証と セキュリティ トラフィック管理 分散トランザクション監視 サービス間の依存関係分析 根本原因の分析 分散コンテキストの伝播 パフォーマンスと レイテンシの最適化 分散トレーシング 設定の検証 メトリクスの収集と グラフ化 サービスのグラフ化 サービスディスカバリと ヘルス状態の算出 Istio Jaeger Kiali OpenShift Service Mesh 16
  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
  18. Copyright 2019 Red Hat K.K. CONFIDENTIAL Designator • CNCF傘下のプロジェクト(incubating) •

    分散トレーシングの標準化を進める • Tracing APIの仕様を定める ◦ 実装が乱立してきたので仕様としてまと めようぜ!ってなった • 各トレーサがTracingi APIを実装する (Zipkin, Jeager, etc...) • Tracingのみ提供 OpenTracing 18
  19. Copyright 2019 Red Hat K.K. CONFIDENTIAL Designator • Googleが社内で利用しているメトリック収 集、分散トレーシングライブラリのOSS実

    装 ◦ TracingだけではなくMetricも含む • 仕様とライブラリのセット • グラフ化したい場合は別途Datadog, Prometheus, Zipkin, Jaeger等の別サー ビスが必要 • Java, Go, C++, Erlang… 等様々な言語で 使用可能 OpenCensus 19
  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
  21. Copyright 2019 Red Hat K.K. CONFIDENTIAL Designator • マイクロサービスは小さなサービスの集まり •

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

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

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

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

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

    • SpanBとCはSpanAの子 • SpanGはSpanAの後に開始 分散トレーシングの概念 26
  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
  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
  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
  30. Copyright 2019 Red Hat K.K. CONFIDENTIAL Designator • OpenTracing, OpenCensus両方に互換性を持つ

    Spanのフォーマット (OpenTelemetry) 30
  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
  32. Copyright 2019 Red Hat K.K. CONFIDENTIAL Designator Zipkin 32

  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
  34. Copyright 2019 Red Hat K.K. CONFIDENTIAL Designator Jaeger 34

  35. Copyright 2019 Red Hat K.K. CONFIDENTIAL Designator • OpenTelemetry ◦

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

    dest2, dest3へリクエストを転送 ◦ 単純にリクエストを転送するだけし か行わない • そのアプリケーションが目的地だった場 合 Hello from dest1 みたいなレスポン スを返す サンプルアプリケーションの構成 37
  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
  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
  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
  41. Copyright 2019 Red Hat K.K. CONFIDENTIAL Designator x-ot-span-context Propagation Format

    - 余談 41 • LightStep形式の場合は上記ヘッダーが必要
  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
  43. Copyright 2019 Red Hat K.K. Supersonic. Subatomic. Java.

  44. Copyright 2019 Red Hat K.K.

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

  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 機能
 モノリスから...
  47. Copyright 2019 Red Hat K.K. 47 なぜこの痛みを経験するのか? 機敏性、拡張性、迅速なビジネス反応性 コンテナ・プラットフォーム

  48. Copyright 2019 Red Hat K.K. • スループットを考慮した設計 (リクエスト/秒)
 • 起動時のオーバーヘッド

    
 − クラスの数, bytecode, JIT
 • メモリオーバーヘッド
 − クラスの数, metadata, コンパイル
 48 Java + コンテナについて隠された真実 RSS ヒープ メタスペース ネイティブ コード 内部
  49. Copyright 2019 Red Hat K.K. 49 コンテナ・プラットフォーム ノード ノード ノード

    ヒープ ヒープ ヒープ ヒープ Java + コンテナについて隠された真実
  50. Copyright 2019 Red Hat K.K. とは何か QUARK: 素粒子 / US:

    コンピュータ科学で最も難しいこと

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


    • クラスパスとクラスのスキャン
 − アノテーション、Getter、他のメタデータのため 
 • フレームワーク・メタモデル・オブジェクトを構築
 • リフレクションの準備とプロキシの構築
 • IO、スレッドなどを開始して開く

  52. Copyright 2019 Red Hat K.K. 事前作業, ビルド, ランタイム コンパイル プロビジョン

    配線と組立 ネイティブコ ンパイル 実行可能イメージ ネイティブ実行 イメージ
  53. Copyright 2019 Red Hat K.K. 閉じられた世界と仮定
 53 AOTC - GraalVM

    ネイティブイメージ - デットコードの除去 クラス クラス アプリ クラス ネイティブ 実行 イメージ
  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
  55. Copyright 2019 Red Hat K.K. Supersonic Subatomic Java Quarkus +

    AOT (GraalVMを使用) 28 MB Quarkus + JDK (OpenJDKを使用) 145 MB 典型的なクラウドネイティブスタック 209 MB
  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 最初の応答までの時間
  57. Copyright 2019 Red Hat K.K. 57 サポートしてない ダークサイド • 動的クラスローディング


    • InvokeDynamic とメソッドハンドル
 • ファイナライザ
 • セキュリティマネージャ
 • JVMTI, JMX, native VM Interfaces
 使用上の注意 • リフレクション(手作業)
 • 動的プロキシ(手作業)
 • JNI (手作業)
 • Static 初期化
 • 参照
 その“良い” 部分

  58. Copyright 2019 Red Hat K.K. 拡張 JDK JIT - HotSpot

    AOTC - GraalVM ネイティブイメージ
  59. Copyright 2019 Red Hat K.K. 発表 1.0
 Quarkusを気に入ったら, GitHubで★を付けてね https://github.com/quarkusio/quarkus

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

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

  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 (ややこしい!)
  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)(ややこしい!!)
  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が成熟すればもっとわかりやすくなるはず!
  68. Copyright 2019 Red Hat K.K. CONFIDENTIAL Designator kialiで確認 68

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

    Inbound
  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)
  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)
  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)
  73. Copyright 2019 Red Hat K.K. CONFIDENTIAL Designator Spanの関係 73 548c9f9605ac2b1f

    845a979942ca2aa4 60a1097e8035b5e2 02b0374724e15993 f96978dbdc3effb1 8959f06229087845
  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アプリより軽量かつシンプル ◦ なぜならリクエストの転送しかしていないから
  75. Copyright 2019 Red Hat K.K. CONFIDENTIAL Designator まとめ 75 •

    マイクロサービスにServie Meshは必須 • 分散トレーシングでマイクロサービスを可視化しよう • OpenShift Service Meshで分散トレーシングするなら、アプリ側でちょっと実装入れ るだけで割と簡単に試せるはず ◦ ただしSideCarに対するInbound/Outboundだけでなく、もっと細かくSpan取りた いなら自分でStartSpanとかする必要あり ▪ 例えば特定の関数だけ細かく取りたいとか • Quarkusでマイクロサービス作ろう
  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  @レッドハット(恵比寿)
  77. Copyright 2019 Red Hat K.K. Red Hat 77 アンケートにご協力よろしくお願いします お手元の紙のQRコード、または

    https://red.ht/JJUG_CCC2019 からフォームへ回答ください ⇨Red Hatロゴグッズをプレゼント!
  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