Slide 1

Slide 1 text

© LY Corporation LINEヤフー株式会社 Kotaro Inoue (@musaprg) Tsuzuki Tsuchiya (@tsuzu) OTel meets Wasm: プラグイン機構としての WebAssemblyから見る 次世代のObservability

Slide 2

Slide 2 text

© 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

Slide 3

Slide 3 text

© LY Corporation OpenTelemetry(OTel) Collectorの概要と、その運用上の課題について知る WebAssembly(Wasm)の概要と、プラグイン機構としての活用方法を知る Wasmをプラグイン機構としてOTel Collectorへ組み込み、動かしてみる(OTelWasm) OTelWasmを本番環境に適用する際、その実現可能性と課題について考える 01 03 02 04 3 本発表のゴール

Slide 4

Slide 4 text

© LY Corporation OpenTelemetryの概要・ 運用上の課題 4

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

© LY Corporation • テレメトリーデータのデータモデル・送受信に関する 標準プロトコル • 以下の2つで構成される • テレメトリーデータのエンコーディング (Protocol Buffers: protobuf) • テレメトリーデータの送受信に関するインターフェース (gRPC/HTTP) 6 OpenTelemetry Protocol (OTLP) https://github.com/open-telemetry/opentelemetry-proto

Slide 7

Slide 7 text

© LY Corporation • テレメトリーの受信・加工・ 送出を担うベンダー非依存な 実装 • 複数のコンポーネントでパイ プラインを構築 • Receiver: 受信 • Processor: 加工 • Exporter: 送出 • OTel CollectorはGo言語で実 装されている → Go言語で独自コンポーネン トの実装も可能 7 OpenTelemetry (OTel) Collector https://opentelemetry.io/docs/collector/

Slide 8

Slide 8 text

© LY Corporation 8 典型的なパイプライン https://opentelemetry.io/docs/collector/architecture/

Slide 9

Slide 9 text

© 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

Slide 10

Slide 10 text

© 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. セキュリティ面

Slide 11

Slide 11 text

© LY Corporation • 自分だけのOTel Collectorが 作れるツール • 含めたいコンポーネントを YAML形式で列挙したBuilder manifestを定義(右図) • ocbは、Builder manifestをもと にビルド用のファイルを生成 11 OTel Collector builder (ocb) ビルド・配布・CI/CD整備 手間がかかる

Slide 12

Slide 12 text

© LY Corporation OTel Collectorを再ビルドせずに 動的にコンポーネントの種類や挙動を変えたい 12 モチベーション

Slide 13

Slide 13 text

© LY Corporation 何かしらのプラグイン機構を導入して、 ユーザ側が任意の挙動を定義できるようにする • ドメイン固有言語(DSL)を使う • OTTL (OpenTelemetry Transform Language) • Processorにおけるテレメトリー加工に特化した言語 • Contribのtransformprocessorで実装されている • 汎用的な言語を使う • Lua • Python • WebAssembly ←今日はこの話 13 動的に挙動を変えるには?

Slide 14

Slide 14 text

© LY Corporation OpenTelemetry(OTel) Collectorの概要と、その運用上の課題について知る WebAssembly(Wasm)の概要と、プラグイン機構としての活用方法を知る Wasmをプラグイン機構としてOTel Collectorへ組み込み、動かしてみる(OTelWasm) OTelWasmを本番環境に適用する際、その実現可能性と課題について考える 03 02 04 14 本発表のゴール

Slide 15

Slide 15 text

© LY Corporation WebAssemblyの概要・ プラグイン機構としての活用 15

Slide 16

Slide 16 text

© 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

Slide 17

Slide 17 text

© LY Corporation 様々なソフトウェアのプラグイン機構としてWebAssemblyが採用されている • Proxy-Wasm (Envoyなどのプロキシ) • Kubernetes Scheduler (kube-scheduler-wasm-extension) • Trivy (コンテナイメージの脆弱性スキャナ) • Open Policy Agent (ポリシーエンジン) 17 プラグイン機構としてのWasm

Slide 18

Slide 18 text

© LY Corporation 既存のWasm Runtime実装 • ブラウザ • Firefox • Google Chrome • etc. • サーバーサイド • Wasmtime • WasmEdge • wazero • etc. 18 WebAssembly (Wasm) Server Host OS Wasm Runtime (Wasm Host) Wasm Guest

Slide 19

Slide 19 text

© LY Corporation 19 Wasmを用いたプラグインのインターフェース Host Guest Host Function Guest Function ①ホストから 叩かれる関数 ②ゲストから 叩かれる関数 ③2者間のデータ フォーマット

Slide 20

Slide 20 text

© 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

Slide 21

Slide 21 text

© 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

Slide 22

Slide 22 text

© 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が存在

Slide 23

Slide 23 text

© 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

Slide 24

Slide 24 text

© LY Corporation 24 GoのWASI P1サポート状況 https://go.dev/doc • 標準ライブラリでWASI P1をサポート • net • syscall • os • Socket Extension実装は、WasmEdge向けのものはある • dispatchrun/net: net.Dialerとnet.Listenerの実装を提供

Slide 25

Slide 25 text

© LY Corporation 25 wasibuilder • コンパイル時に標準ライブラリの一部をWasmEdge Socket Extension対応に差し替えてくれるツール • 既存のGoコードをそのままWasmへ移植可能

Slide 26

Slide 26 text

© LY Corporation OpenTelemetry(OTel) Collectorの概要と、その運用上の課題について知る WebAssembly(Wasm)の概要と、プラグイン機構としての活用方法を知る Wasmをプラグイン機構としてOTel Collectorへ組み込み、動かしてみる(OTelWasm) OTelWasmを本番環境に適用する際、その実現可能性と課題について考える 03 04 26 本発表のゴール

Slide 27

Slide 27 text

© LY Corporation OpenTelemetry + WebAssembly = OTelWasm 27

Slide 28

Slide 28 text

© LY Corporation • OTel Collector向けのWasm Plugin • 現時点ではGo言語SDKのみ提供 • 以下のコンポーネントをサポート • Receiver • Processor • Exporter • 以下のテレメトリーをサポート • メトリクス • ログ • トレース • OTelWasm DistroのBuilder Manifest も用意 • Core Distro + Wasm Plugin OTelWasm 28

Slide 29

Slide 29 text

© LY Corporation 29 (再掲)Wasmを用いたPluginのインターフェース Host Guest Host Function Guest Function ①ホストから 叩かれる関数 ②ゲストから 叩かれる関数 ③2者間のデータ フォーマット

Slide 30

Slide 30 text

© 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

Slide 31

Slide 31 text

© LY Corporation Go製のWasmランタイム実装 • 外部ライブラリへの依存がない • CGOへの依存もない • Goのアプリケーションに直接組み込める • 複数の実行モードを実装 • Interpreter • Compiler (only amd64/arm64) • 複数のOSSで利用実績がある • kube-scheduler-wasm-extension • Trivy 31 wazero

Slide 32

Slide 32 text

© LY Corporation 32 wasmprocessorの処理フロー ト ーデータが れる から に ライ からデ ライ に ライ から にデ ライ の ン ー ントに し ト ー に から ス ータス

Slide 33

Slide 33 text

© LY Corporation Demo: 実際に動かしてみよう 33

Slide 34

Slide 34 text

© LY Corporation 34 The pipeline of otel-collector Demoの流れ

Slide 35

Slide 35 text

© LY Corporation 35 Wasmを利用しない場合のopentelemetry-collector-builder Demo

Slide 36

Slide 36 text

© LY Corporation 36 Demo ここにデ 動画がくる

Slide 37

Slide 37 text

© LY Corporation 37 OTelWasmのopentelemetry-collector-builder Demo

Slide 38

Slide 38 text

© LY Corporation 38 Demo ここにデ 動画がくる

Slide 39

Slide 39 text

© LY Corporation OpenTelemetry(OTel) Collectorの概要と、その運用上の課題について知る WebAssembly(Wasm)の概要と、プラグイン機構としての活用方法を知る Wasmをプラグイン機構としてOTel Collectorへ組み込み、動かしてみる(OTelWasm) OTelWasmを本番環境に適用する際、その実現可能性と課題について考える 04 39 本発表のゴール

Slide 40

Slide 40 text

© LY Corporation [課題] パフォーマンス問題 [課題] WASIの規格 [展望] Wasmバイナリの動的更新 [展望] 多言語SDK対応 [展望] OTel Collector ContribへのUpstream 1 3 2 4 5 40 課題 / 今後の展望

Slide 41

Slide 41 text

© LY Corporation 41 パフォーマンス問題 • 課題 • protobufのSerialize/Deserializeが遅い

Slide 42

Slide 42 text

© 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

Slide 43

Slide 43 text

© 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

Slide 44

Slide 44 text

© LY Corporation 44 protobufのSerialize/Deserializeが遅い パフォーマンス向上 • 改善策 • メモリレイアウトをhost/guestで共有 • ⇒ 他言語との互換性が失われる可能性 • より高速なバイナリフォーマットへ変更

Slide 45

Slide 45 text

© LY Corporation 45 WASIの規格 Version Sockets Threads Rust Go Zig Wasm Runtime WASI Preview 1 Wasmtime WasmEdge Wasmer wazero WASI Preview 2 Wasmtime

Slide 46

Slide 46 text

© LY Corporation 46 Binary sourceの多様化 Wasmバイナリの動的更新 • リモートソースのサポートを実現したい • ⇒ otel-collectorのライフサイクルとは独立したアップデートが出来る • サポート済み • Local files • 今後サポートしたい • HTTP(S) • OCI Artifacts

Slide 47

Slide 47 text

© LY Corporation 47 OpAMPとの統合 Wasmバイナリの動的更新 • OpAMP: Open Agent Management Protocol • otel-collector等のagentをリモート管理するためのプロトコル • OpAMP Server • agentの管理を行うサーバー • OpAMP Supervisor/Client • OpAMP Serverに接続し、 設定を取得して利用するクライアント

Slide 48

Slide 48 text

© LY Corporation 48 多言語SDK対応 • otel-collectorの拡張はGoのみ • OtelWasmは WASI P1対応の任意の言語を サポート可能 • Rust/Zigのサポートを 提供したい Rust Zig WASI P1 WasmEdge Socket Extension

Slide 49

Slide 49 text

© 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

Slide 50

Slide 50 text

© LY Corporation 私たちと一緒に、Kubernetesを活用した最高のプラットフォームを作りませんか? 50 We’re hiring!

Slide 51

Slide 51 text

© LY Corporation 51 私たちと一緒に、Kubernetesを活用した最高のプラットフォームを作りませんか? We’re hiring! Thank You! Q&A

Slide 52

Slide 52 text

© LY Corporation Appendix 52

Slide 53

Slide 53 text

© LY Corporation 53 Processor実装例 (nop)

Slide 54

Slide 54 text

© LY Corporation 54 Processor実装例 (attributesprocessor)

Slide 55

Slide 55 text

© LY Corporation 55 (attributesprocessor) factorybuilderを使ったWasm Plugin化

Slide 56

Slide 56 text

© LY Corporation 56 Collector Configの一例

Slide 57

Slide 57 text

© LY Corporation