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

OTel meets Wasm: プラグイン機構としてのWebAssemblyから見る次世代の...

OTel meets Wasm: プラグイン機構としてのWebAssemblyから見る次世代のObservability

OpenTelemetry (OTel) Collectorは、テレメトリーデータの受信、処理、エクスポートを行うベンダー非依存の実装です。これにより、個別のエージェントを導入せずに、さまざまなサービスに対応できます。公式が提供するバイナリには、最低限の機能を持つ「core」と、コミュニティ提供の機能を多く含む「contrib」があります。しかし、セキュリティ上の観点から、「contrib」バイナリの直接使用は推奨されていません。一方で、特定のプラグインのみを含むCollectorを用意するには、専用ツールを用いたビルドパイプラインの構築が必要であり、負担が大きいという課題があります。
本セッションでは、WebAssemblyを活用したプラグイン機構を利用し、手軽に必要最小限のOTel Collectorをデプロイする方法を探ります。まず、WebAssemblyを用いたプラグイン機構の実装方法について解説します。次に、PoCを通じて、実際に必要最低限の機能のみを有効化したバイナリをデプロイします。最後に、得られた利点と課題点に触れ、実環境への適用可能性を検討します。

More Decks by LINEヤフーTech (LY Corporation Tech)

Other Decks in Technology

Transcript

  1. © LY Corporation LINEヤフー株式会社 Kotaro Inoue (@musaprg) Tsuzuki Tsuchiya (@tsuzu)

    OTel meets Wasm: プラグイン機構としての WebAssemblyから見る 次世代のObservability
  2. © LY Corporation 2 自己紹介 井上 紘太朗 / INOUE Kotaro

    / @musaprg LINEヤフー株式会社 ソフトウェアエンジニア • Private Cloud、主にKaaSの開発に従事 • Kubernetes Org Member • Kubestronaut 土谷 続季 / TSUCHIYA Tsuzuki / @tsuzu LINEヤフー株式会社 ソフトウェアエンジニア • Private Cloud、主にKaaSの開発に従事 • Kubernetes Org Member https://github.com/cncf/artwork/blob/main/LICENSE.md
  3. © LY Corporation OpenTelemetryとは • Cloud Native Computing Foundation (CNCF)の

    Incubating プロジェクト • 可観測性(オブザーバビリティ)を実現するためのフレームワーク • オープンソースかつベンダーニュートラル • テレメトリー(メトリクス・ログ・トレースなど)の 生成・エクスポート・収集が主な責務 • 以下のコンポーネントを含む • テレメトリーのデータモデルや送受信に関する標準プロトコル (OTLP) • 各アプリケーションを計装するための各言語向けSDK • OpenTelemetry Collector 5 OpenTelemetry https://opentelemetry.io/ https://github.com/cncf/artwork
  4. © LY Corporation • テレメトリーデータのデータモデル・送受信に関する 標準プロトコル • 以下の2つで構成される • テレメトリーデータのエンコーディング

    (Protocol Buffers: protobuf) • テレメトリーデータの送受信に関するインターフェース (gRPC/HTTP) 6 OpenTelemetry Protocol (OTLP) https://github.com/open-telemetry/opentelemetry-proto
  5. © LY Corporation • テレメトリーの受信・加工・ 送出を担うベンダー非依存な 実装 • 複数のコンポーネントでパイ プラインを構築

    • Receiver: 受信 • Processor: 加工 • Exporter: 送出 • OTel CollectorはGo言語で実 装されている → Go言語で独自コンポーネン トの実装も可能 7 OpenTelemetry (OTel) Collector https://opentelemetry.io/docs/collector/
  6. © LY Corporation • 以下を含む • opentelemetry-collector(Core)リ ポジトリの 全コンポーネント •

    opentelemetry-collector-contrib (Contrib)リポジトリの 一部コンポーネント • Coreリポジトリのコンポーネント → 新規追加の対象 • Contribリポジトリのコンポーネント → 新規追加の対象外 Core Distro 9 OTel Collectorのディストリビューション • 以下を含む • opentelemetry-collector(Core)リ ポジトリの 全コンポーネント • opentelemetry-collector- contrib(Contrib)リポジトリの 全コンポーネント • ベンダーがサポートしている 多種多様なコンポーネントが含まれる • CoreリポジトリとContribリポジトリの 全コンポーネントが新規追加の対象 Contrib Distro https://github.com/open-telemetry/opentelemetry-collector-releases/blob/main/distributions
  7. © LY Corporation 10 OTel Collectorのディストリビューション • 以下を含む • opentelemetry-collector(Core)リ

    ポジトリの 全コンポーネント • opentelemetry-collector- contrib(Contrib)リポジトリの 全コンポーネント • ベンダーがサポートしている 多種多様なコンポーネントが含まれる • CoreリポジトリとContribリポジトリの 全コンポーネントが新規追加の対象 Contrib Distro https://github.com/open-telemetry/opentelemetry-collector-releases/blob/main/distributions 以下の観点から 本番環境での利用は非推奨 1. バイナリサイズ削減 2. セキュリティ面
  8. © LY Corporation • 自分だけのOTel Collectorが 作れるツール • 含めたいコンポーネントを YAML形式で列挙したBuilder

    manifestを定義(右図) • ocbは、Builder manifestをもと にビルド用のファイルを生成 11 OTel Collector builder (ocb) ビルド・配布・CI/CD整備 手間がかかる
  9. © LY Corporation 何かしらのプラグイン機構を導入して、 ユーザ側が任意の挙動を定義できるようにする • ドメイン固有言語(DSL)を使う • OTTL (OpenTelemetry

    Transform Language) • Processorにおけるテレメトリー加工に特化した言語 • Contribのtransformprocessorで実装されている • 汎用的な言語を使う • Lua • Python • WebAssembly ←今日はこの話 13 動的に挙動を変えるには?
  10. © LY Corporation ポータブルな仮想ISA+ランタイム仕様 • 当初は、Webブラウザ上でネイティブに近い 実行速度を実現するためのものだった • 近年は、ブラウザに限らず、 ホストアプリケーションにWasmの実行環境を

    組み込む形で活用されている (後述するWASIにも関連) • Wasmの特徴 • 実行が速く、また十分に効率的 • 多様な実装言語 • Go, TinyGo, Rust, Zig, C++ etc. • 安全性 • サンドボックス環境 • ポータビリティ • ランタイムさえ実装すれば動作 16 WebAssembly (Wasm) https://webassembly.github.io/spec/core/intro/introduction.html https://github.com/carlosbaraza/web-assembly-logo/blob/master/dist/icon/web-assembly-icon.svg
  11. © LY Corporation 様々なソフトウェアのプラグイン機構としてWebAssemblyが採用されている • Proxy-Wasm (Envoyなどのプロキシ) • Kubernetes Scheduler

    (kube-scheduler-wasm-extension) • Trivy (コンテナイメージの脆弱性スキャナ) • Open Policy Agent (ポリシーエンジン) 17 プラグイン機構としてのWasm
  12. © LY Corporation 既存のWasm Runtime実装 • ブラウザ • Firefox •

    Google Chrome • etc. • サーバーサイド • Wasmtime • WasmEdge • wazero • etc. 18 WebAssembly (Wasm) Server Host OS Wasm Runtime (Wasm Host) Wasm Guest
  13. © LY Corporation 19 Wasmを用いたプラグインのインターフェース Host Guest Host Function Guest

    Function ①ホストから 叩かれる関数 ②ゲストから 叩かれる関数 ③2者間のデータ フォーマット
  14. © LY Corporation Guest側からHost側の機能を使うためのAPI/ABI仕様 • Host側の資源や機能へのアクセスを Guest側にHost Functionとして提供する共通API群 → POSIXシステムコールのようなもの

    • ファイルシステム、システムクロック、etc. • 現状、WASIのバージョンは2種類(非互換) • WASI 0.1 (Preview1: p1) ←今回はこちら • 広く利用されている • WASI 0.2 (Preview2: p2) • 対応する言語やランタイムが限られる 20 WebAssembly System Interface (WASI) https://wasi.dev/interfaces https://github.com/syrusakbary/wasi-logo
  15. © LY Corporation Opened Socketに対するAPIのみ • sock_accept • POSIX accept(2)

    • sock_recv • POSIX recv(2), readv(2) • sock_send • POSIX send(2), writev(2) • sock_shutdown • POSIX shutdown(2) 21 WASI P1におけるSocket APIサポート状況 WASI P1のSocket APIだけでは HTTP Server等を書くには不十分 socket(2), bind(2), listen(2), etc. https://github.com/WebAssembly/WASI/blob/main/legacy/preview1/docs.md
  16. © LY Corporation • WASI P1で不足しているSocket APIをサポートすることが目的 • WasmEdge(CNCF傘下のWasmランタイム)に実装されている •

    JavaScript (Node.js), Rust, C, GoのSDKが存在 WasmEdge Socket Extension 22 WASI P1拡張APIでのSocket APIサポート WASIX • 完全なPOSIX互換を目指したWASI P1拡張 • Wasmer社が主導 • 同社が開発するWasmランタイム”Wasmer”に実装されている • Rust, CのSDKが存在
  17. © LY Corporation • WebAssemblyへのコンパイルをサポート (GOOS=js GOARCH=wasm) • 標準ライブラリのWasm対応 Go

    1.11 23 GoのWasm (WASI) サポート状況 • wasmimportディレクティブ → Host Functionが使用可能に • WASI Preview1へのコンパイル対応 (GOOS=wasip1 GOARCH=wasm) • 標準ライブラリのWASI Preview1対応 Go 1.21 • wasmexportディレクティブ → Guest Functionを公開できるように • WASI P1 Reactor Moduleの作成に対応 → main関数をもたないライブラリ Go 1.24 Go 1.24以前は、Wasmに対応しているTinyGoが主流 https://go.dev/doc https://github.com/tinygo-org/tinygo-site/blob/release/static/images/tinygo-logo.png
  18. © LY Corporation 24 GoのWASI P1サポート状況 https://go.dev/doc • 標準ライブラリでWASI P1をサポート

    • net • syscall • os • Socket Extension実装は、WasmEdge向けのものはある • dispatchrun/net: net.Dialerとnet.Listenerの実装を提供
  19. © LY Corporation • OTel Collector向けのWasm Plugin • 現時点ではGo言語SDKのみ提供 •

    以下のコンポーネントをサポート • Receiver • Processor • Exporter • 以下のテレメトリーをサポート • メトリクス • ログ • トレース • OTelWasm DistroのBuilder Manifest も用意 • Core Distro + Wasm Plugin OTelWasm 28
  20. © LY Corporation 29 (再掲)Wasmを用いたPluginのインターフェース Host Guest Host Function Guest

    Function ①ホストから 叩かれる関数 ②ゲストから 叩かれる関数 ③2者間のデータ フォーマット
  21. © LY Corporation 30 OTel Wasmのインターフェース Otel Col Guest Module

    • current*** • setResult*** • getPluginConfig • getShutdownRequested • start***Receiver • process*** • push*** ①ホストから 叩かれる関数 ②ゲストから 叩かれる関数 ③2者間のデータ フォーマット OTLP (Protocol Buffers) & JSON Wasm Runtime (wazero) Host
  22. © LY Corporation Go製のWasmランタイム実装 • 外部ライブラリへの依存がない • CGOへの依存もない • Goのアプリケーションに直接組み込める

    • 複数の実行モードを実装 • Interpreter • Compiler (only amd64/arm64) • 複数のOSSで利用実績がある • kube-scheduler-wasm-extension • Trivy 31 wazero
  23. © LY Corporation 32 wasmprocessorの処理フロー ト ーデータが れる から に

    ライ からデ ライ に ライ から にデ ライ の ン ー ントに し ト ー に から ス ータス
  24. © LY Corporation [課題] パフォーマンス問題 [課題] WASIの規格 [展望] Wasmバイナリの動的更新 [展望]

    多言語SDK対応 [展望] OTel Collector ContribへのUpstream 1 3 2 4 5 40 課題 / 今後の展望
  25. © LY Corporation 42 CPU time / op Benchmark: Processor

    ここにベンチマーク の表がくる Kind OtelWasm (Interpreter) OtelWasm (Compiler) Go-native Plugin Nop Processor 282995 ns 10349 ns 3.176 ns Attributes Processor 496283 ns 15965 ns 74.81 ns GOOS: linux GOARCH: amd64 CPU: 12th Gen Intel(R) Core(TM) i9-12900H
  26. © LY Corporation 43 OTel Wasmのインターフェース (再掲) Otel Col Guest

    Module • current*** • setResult*** • getPluginConfig • getShutdownRequested • start***Receiver • process*** • push*** ①ホストから 叩かれる関数 ②ゲストから 叩かれる関数 ③2者間のデータ フォーマット OTLP (Protocol Buffers) Wasm Runtime (Wazero) Host Marshal to OTLP Unmarshal from OTLP Unmarshal from OTLP Marshal to OTLP
  27. © LY Corporation 44 protobufのSerialize/Deserializeが遅い パフォーマンス向上 • 改善策 • メモリレイアウトをhost/guestで共有

    • ⇒ 他言語との互換性が失われる可能性 • より高速なバイナリフォーマットへ変更
  28. © LY Corporation 45 WASIの規格 Version Sockets Threads Rust Go

    Zig Wasm Runtime WASI Preview 1 Wasmtime WasmEdge Wasmer wazero WASI Preview 2 Wasmtime
  29. © LY Corporation 46 Binary sourceの多様化 Wasmバイナリの動的更新 • リモートソースのサポートを実現したい •

    ⇒ otel-collectorのライフサイクルとは独立したアップデートが出来る • サポート済み • Local files • 今後サポートしたい • HTTP(S) • OCI Artifacts
  30. © LY Corporation 47 OpAMPとの統合 Wasmバイナリの動的更新 • OpAMP: Open Agent

    Management Protocol • otel-collector等のagentをリモート管理するためのプロトコル • OpAMP Server • agentの管理を行うサーバー • OpAMP Supervisor/Client • OpAMP Serverに接続し、 設定を取得して利用するクライアント
  31. © LY Corporation 48 多言語SDK対応 • otel-collectorの拡張はGoのみ • OtelWasmは WASI

    P1対応の任意の言語を サポート可能 • Rust/Zigのサポートを 提供したい Rust Zig WASI P1 WasmEdge Socket Extension
  32. © LY Corporation 49 OTel Collector ContribへのUpstream • github.com/open-telemetry/otel-collector-contrib で管理できると嬉しい

    • 先駆者のissueがあったが動きがなくClose • コミュニティと協力して 進めていきたい https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/11772