Slide 1

Slide 1 text

@ymtdzzz otel-tuiでOpenTelemetry 計装のフィードバックサイクルを 高速化する 2025.05.14 Wed. Jagu'e'r オブザービリティ分科会 Meetup#2

Slide 2

Slide 2 text

Yosuke MATSUDA (@ymtdzzz) 株式会社SmartHR プロダクトエンジニア ● 仕事ではRubyを書いています(その前はGolangを3年程) ● プライベートではOpenTelemetryにコントリビュートしたり 関連ツールを作ったりしています ● OpenTelemetryに関連した登壇など 2

Slide 3

Slide 3 text

突然ですが

Slide 4

Slide 4 text

Production環境で OpenTelemetryを利用して いる人󰢧󰢨

Slide 5

Slide 5 text

OpenTelemetryの採用事例の増加 5 ● 成熟してきたAPIや言語別SDK、ドキュメント ● オブザーバビリティSaaSのOTLP対応 ● OpenTelemetry関連の技術書 ● ミドルウェアや各種ライブラリのネイティブ計装

Slide 6

Slide 6 text

OpenTelemetryの採用事例の増加 ● 成熟してきたAPIや言語別SDK、ドキュメント ● オブザーバビリティSaaSのOTLP対応 ● OpenTelemetry関連の技術書 ● ミドルウェアや各種ライブラリのネイティブ計装 その先に待ち受けているものは? 6

Slide 7

Slide 7 text

OpenTelemetryの運用!

Slide 8

Slide 8 text

● SREやPlatform Engineer ○ 組織全体のテレメトリーパイプラインや分析基盤の整備 ○ サンプリングやフィルタリング方針の検討や共通化 ● アプリケーション開発者 ○ 計装ライブラリの設定調整(アプリレイヤーでのフィルタリ ングなど) ○ ドメインに即したテレメトリー属性の設定 ○ 必要に応じてマニュアル計装 継続的な改善 8

Slide 9

Slide 9 text

トラブルシューティング 9 ● トレースの不具合 ○ 不完全なトレース ● バックエンドやフォーマット関連の不具合 ○ 計装によってスパンの表示のされ方が異なる ○ 変換が上手くいかない(Prometheus→OTelなど)

Slide 10

Slide 10 text

トラブルシューティング 10 ● トレースの不具合 ○ 不完全なトレース ● バックエンドやフォーマット関連の不具合 ○ 計装によってスパンの表示のされ方が異なる ○ 変換が上手くいかない(Prometheus→OTelなど) 解決に時間がかかるケースも・・・

Slide 11

Slide 11 text

OpenTelemetryの難しさ

Slide 12

Slide 12 text

「不完全なトレース」のケース 12

Slide 13

Slide 13 text

「不完全なトレース」のケース 13 RPS制限超過 取り込み上限超過 Sampled flagの伝 搬ができていない 実装内部で Contextを 引き回せていない middlewareや言語 毎の計装の設定不備

Slide 14

Slide 14 text

「不完全なトレース」のケース 14 RPS制限超過 取り込み上限超過 Sampled flagの伝 搬ができていない 実装内部で Contextを 引き回せていない middlewareや言語 毎の計装の設定不備 関連するコンポーネントが多い・・・

Slide 15

Slide 15 text

「計装によってスパンの表示のされ方が異なる」ケース 15 実際の事例(Golang) ● net/httpのOTel計装ライブラリで出したSpan名が上手く出てくれない ● EchoのOTel計装ライブラリだと{method} {path}で出てくれる

Slide 16

Slide 16 text

「計装によってスパンの表示のされ方が異なる」ケース 16 想定外の見え方 計装ライブラリ間の実 装差異 ? ? ?

Slide 17

Slide 17 text

「計装によってスパンの表示のされ方が異なる」ケース 17 計装ライブラリ間の実 装差異 ブラックボックス化されたテレメトリー生成 ? ? ? 想定外の見え方

Slide 18

Slide 18 text

どうすればいい?

Slide 19

Slide 19 text

テレメトリー生成に近いところから可能性を潰す 19 RPS制限超過 取り込み上限超過 Sampled flagの伝 搬ができていない 実装内部で Contextを 引き回せていない middlewareや言語 毎の計装の設定不備 「不完全なトレース」のケース

Slide 20

Slide 20 text

テレメトリー生成に近いところから可能性を潰す 20 RPS制限超過 取り込み上限超過 Sampled flagの伝 搬ができていない 実装内部で Contextを 引き回せていない middlewareや言語 毎の計装の設定不備 「不完全なトレース」のケース 生成から遠くなるほど検証コストが高くつく

Slide 21

Slide 21 text

ローカルで素早くフィードバックを得たい 21 ● ローカルからSaaSやクラウド上に構築したバックエン ドに送信する ○ APIキーの管理やコストの問題 ● ローカルでバックエンドを立ち上げる ○ 今日のテーマ!

Slide 22

Slide 22 text

既存プロダクトを用いた ローカルデバッグの課題

Slide 23

Slide 23 text

● セットアップが結構大変 ○ volume、データソースの設定(Jaegerとかは楽) ● リッチで高コストな機能とUI ○ 各種テレメトリを見に行くための導線が長い ○ テレメトリー(OTLP)がどのようにUIとして表現されるかを理 解するために時間が必要 ● Webベースなのでリロードが必要 ○ トライアンドエラーが必要なローカル開発では無視できない 既存OSSプロダクト(Grafanaなど)をローカルで動かす 23

Slide 24

Slide 24 text

● セットアップが結構大変 ○ volume、データソースの設定(Jaegerとかは楽) ● リッチで高コストな機能とUI ○ 各種テレメトリを見に行くための導線が長い ○ テレメトリー(OTLP)がどのようにUIとして表現されるかを理 解するために時間が必要 ● Webベースなのでリロードが必要 ○ トライアンドエラーが必要なローカル開発では無視できない →徐々にMP(?)が削られていく... 既存OSSプロダクト(Grafanaなど)をローカルで動かす 24

Slide 25

Slide 25 text

用途が違うのでそれはそう 25 ● 出力されるテレメトリーをリアルタイムで確認したい ● テレメトリーはOTLPレベルである程度の見やすさで確認 したい ● 面倒な設定なしで手軽に開発フローに組み込みたい 計装を調整する開発者 既存OSSプロダクト ● 豊富でリッチな分析機能及びUI ● データの永続化、様々な運用に耐えうる多様なオプション

Slide 26

Slide 26 text

otel-desktop-viewerも良さそうだったが・・・ 26 https://github.com/CtrlSpice/otel-desktop-viewer ● Webベースなのでリア ルタイム更新不可 ● 件数が増えると激重に なる→雑に垂れ流すこ とができない

Slide 27

Slide 27 text

debug-exporterは? 27 https://opentelemetry.io/docs/collector/troubleshooting/ ● 手軽だけど可視性はいまい ち ● 「トレースが出ているか?」 の確認なら使えそう ● どちらかというと計装ライ ブラリの開発者向けな印象

Slide 28

Slide 28 text

無いなら作るぞ! ターミナルでトレース表示できたらかっこよさそうだし...

Slide 29

Slide 29 text

otel-tuiの紹介

Slide 30

Slide 30 text

30 計装の動作確認を最速で行うため のターミナルアプリ

Slide 31

Slide 31 text

想定ユーザー 31 ● OTel SDKや計装ライブラリの開発者 ○ opentelemetry-go(-contrib)など ● 自アプリの計装の調整やデバッグをしたい開発者 ○ contextの伝搬、カスタム属性の付与、フィルタリング な ど ● OTel collectorの調整をしたいSRE ○ 主にreceiverとprocessor周り

Slide 32

Slide 32 text

基本的な使い方

Slide 33

Slide 33 text

ホストマシン上で動かす 33 インストール $ go install github.com/ymtdzzz/otel-tui@latest $ brew install ymtdzzz/tap/otel-tui $ nix develop github:ymtdzzz/otel-tui 起動 $ otel-tui テレメトリーの送信 $ OTEL_EXPORTER_OTLP_ENDPOINT=localhost:4317 otel-cli exec --service my-service --name "curl google" curl https://google.com

Slide 34

Slide 34 text

Dockerで開発環境に組み込む docker-compose.yml oteltui: image: ymtdzzz/otel-tui:latest container_name: otel-tui stdin_open: true tty: true collectorやexporterの向き先を修正 exporters: otlp: endpoint: oteltui:4317 service: pipelines: traces: exporters: [otlp] 34

Slide 35

Slide 35 text

確認したいタイミングでattach (中断はCtrl+p -> Ctrl+q) $ docker compose attach oteltui Dockerで開発環境に組み込む 35 すぐに利用開始!

Slide 36

Slide 36 text

こだわりポイント

Slide 37

Slide 37 text

● 開発フローに組み込みやすい ○ yamlを数行編集するだけ ○ debug exporterと同じようなノリで組み込める ● otel-tui自体の汎用性向上 ○ receiverなどOTelの資産をそのまま使える ○ prometheusやzipkin統合可のため移行検証にも○ OTel custom collectorとして実装 37

Slide 38

Slide 38 text

リアルタイム更新とローテーション ● テレメトリー受信したら即反映 ○ リロードは不要 ○ powered by rivo/tview ● ローテーションでメモリに優しく ○ 1000件のサービスエントリースパンまでインメモリに保持 ○ Ctrl+Lで即時Flushも可 38

Slide 39

Slide 39 text

リアルタイム更新とローテーション 39 リアルタイム更新 検索機能 サービスエントリー スパンの情報

Slide 40

Slide 40 text

OTLPの生データに近い情報表示 ● 「計装によってどのようなデータが生成されたかが」が 一目でわかる ○ ツリー表示で折りたたみ可能 ○ jsonのpretty printもサポート 40

Slide 41

Slide 41 text

トレースの確認に不可欠なフレームグラフ 41 フレームグラフ (折りたたみ可) スパンの情報 (OTLP準拠) スパンの関連ログ

Slide 42

Slide 42 text

その他の機能 42 ● ログやメトリクスの表示(WIP) ● トレースの関連ログの表示 ● ログから関連スパンへのジャンプ ● 各領域のサイズ変更 ● サービストポロジー(WIP)

Slide 43

Slide 43 text

otel-tuiの活用例

Slide 44

Slide 44 text

(再掲) 「計装によってスパンの表示のされ方が異なる」ケース 44 実際の事例(Golang) ● net/httpのOTel計装ライブラリで出したSpan名が上手く出てくれない ● EchoのOTel計装ライブラリだと{method} {path}で出てくれる

Slide 45

Slide 45 text

計装の違いが一目でわかる 45 net/http(上手く表示されない) echo(上手く表示される) http.routeがある http.routeがない

Slide 46

Slide 46 text

Prometheus→OTel→Google Cloudの変換 46 ● PrometheusをOTelで取得してどこかに送信したい ○ 例:COS上のアプリのPrometheus MetricsをCloud Monitoringに 送る ● PrometheusをOpenTelemetryに移行する際の影響調査 上手く出てくれない OTel上はどんなメトリク スになる?

Slide 47

Slide 47 text

otel-tuiで可視化 47 Prometheus endpoint otel-tui ● Resource Detectorはどのような属性を付与する? ● Transform Processorは想定通り変換している? などなど

Slide 48

Slide 48 text

その他の例 48 ● LBからのヘルスチェックを除外→フィルタリング設定 の動作確認 ● ParentBasedSamplerの動作確認 ● contextの渡し漏れ(計装ミス)の修正確認(Golang など)

Slide 49

Slide 49 text

PRの証跡としても貼りやすい👍 49 https://github.com/open-telemetry/opentelemetry-ruby-contrib/pull/1313

Slide 50

Slide 50 text

カンファレンスでのデモにも是非お使いください 50 Simplifying OpenTelemetry with Configuration - Alex Boten, Honeycomb & Jack Berg, New Relic (逆井 sanのツイートで知りました)

Slide 51

Slide 51 text

まとめ

Slide 52

Slide 52 text

OTel計装修正時の動作確認や検証を快適にする 52 ● 可能な限りローカルで完結させる ● 雑にテレメトリーを投げられる環境を作る ● OTLPの生データに近い情報を確認する

Slide 53

Slide 53 text

OTel計装修正時の動作確認や検証を快適にする 53 ● 可能な限りローカルで完結させる ● 雑にテレメトリーを投げられる環境を作る ● OTLPの生データに近い情報を確認する otel-tuiがお役に立てるかも!

Slide 54

Slide 54 text

フィードバック&PRお待ちしています! 54 ● TODOはまだまだあります ○ メトリクスの改善 ○ 全体的なUIの改善 ○ 柔軟な設定 ○ 自動テストが足りてない箇所がある

Slide 55

Slide 55 text

最後に少しだけ宣伝🙏

Slide 56

Slide 56 text

SmartHRでもOpenTelemetryの波がキタ 56 ● アプリはNewRelic計装が多いものの ● ミドルウェアのネイティブ計装起因でOTelを送信する ケースが出てきた! ● NewRelic計装との相互運用性も良さそうなので 本格運用に期待

Slide 57

Slide 57 text

そんなSmartHRはエンジニアを募集しています! 57 エンジニア採用サイト https://hello-world.smarthr.co.jp/ SmartHR Tech Blog https://tech.smarthr.jp/

Slide 58

Slide 58 text

ありがとうございました!