6 ポイント 投稿者 0546530408 2023-08-17 | 1件のコメント | WhatsAppで共有

こんにちは。Odigos(https://github.com/keyval-dev/odigos) の共同創業者、Eden と Ari です。Odigos は、アプリケーションの分散トレース(distributed trace)を即座に生成し、ユーザーが簡単に活用できるよう支援するオープンソースプロジェクトです。Odigos は既存のモニタリングツールと互換性があり、ソースコードの変更も必要ありません。

これまでのモニタリングツールの体験には大きな不満がありました。複数のマイクロサービスを含む分散システムを監視する中で、問題の根本原因となるマイクロサービスを特定するのに、あまりにも多くの時間を費やしていることに気づきました。たとえば、あるアプリケーションが遅延を引き起こしていると疑って何時間もデバッグしたものの、最終的には別の関連アプリケーションが原因だったと後になって判明したことがありました。

その後、私たちはこの問題解決に適した分散トレーシング(distributed tracing)について研究しました。単一アプリケーションにおける特定時点のデータを捉えるメトリクスやログとは異なり、分散トレーシングはリクエストごとに一意の ID でタグ付けし、分散環境内で伝播したリクエストを追跡できるようにします。これにより、開発者は各リクエストのコンテキスト(context)や、分散アプリケーション群がどのように動作しているかを理解できます。

ただし、この方法には実装が難しいという欠点があります。単一アプリケーション向けのメトリクスやログとは異なり、分散トレーシングは複数のアプリケーションにまたがって実装されて初めて成立します。アプリケーションの中に分散トレースを生成しないものが 1 つでもあると、コンテキストの伝播が途切れ、そのトレースの価値は大きく損なわれます。

複数の企業向けに分散トレーシングを自ら実装してきた経験から言うと、完全な分散トレーシングを実現するために、すべての開発チームが各アプリケーションを計装するよう調整するのは非常に困難です。実装が完了すると、本番環境の問題をはるかに速く解決できるため価値は高いものでした。しかし、部分的な実装にはそれほど大きな価値はありませんでした。

私たちはこのプロセスの自動化に着手しました。プロセスの大部分については方法が分かっていましたが、最も難しかったのは、(Go のような)コンパイル言語で書かれたプログラムを自動的に計装する方法でした。この部分さえ自動化できれば、分散トレースを生成するプロセス全体を自動化できると考えました。研究の過程で、eBPF(Linux カーネルが外部プログラムをロードし、カーネル内で実行できるようにする技術)を使えば、コンパイル言語に対する自動計装が可能であることに気づきました。それがパズルの最後の 1 ピースであり、これによって私たちは Odigos を開発できました。

Odigos はまず、実行中のすべてのアプリケーションをスキャンし、eBPF と OpenTelemetry を用いて各アプリケーションのプログラミング言語を認識し、それに応じて自動計装します。また、データをバッファリング、フィルタリングし、選択したモニタリングツールへ転送するコレクターをデプロイし、トラフィック量に応じてオートスケール(auto scale)します。こうした自動化により、開発者は実装に数か月かかることもある手作業とは異なり、わずか数分で分散トレーシングを活用できます。

異なるプログラミング言語間での自動計装は、特に静的バイナリ(例: Go コンパイラが生成したバイナリ)を考慮すると、決して簡単な作業ではありません。私たちは、関連するヘッダーを安全かつ安定した方法で挿入できるよう、さまざまなメカニズムを導入し、さまざまなバージョンのオープンソースライブラリの機能や構造体を追跡するシステムを開発しました。さらに、eBPF でユーザー空間(userspace)のメモリ管理を行うシステムも開発しました。その結果、Odigos は Go や Rust のようなコンパイル言語に対して分散トレースを自動生成できる唯一のソリューションとなりました。他のソリューションでは、ユーザーが OpenTelemetry や eBPF の専門家である必要がありますが、私たちのソリューションでは observability 技術に関する事前知識は不要です。

私たちのソリューションは、単一のコマンドで Kubernetes クラスターにインストールできます。インストールされると、実行中のすべてのアプリケーションのプログラミング言語を検出し、適切な計装器を適用します。JIT 言語(Java および .NET)またはインタープリタ言語(JavaScript および Python)の場合は OpenTelemetry 計装器をデプロイします。コンパイル言語(Go、Rust、C)には eBPF ベースの計装器をデプロイします。これらはすべてユーザーから抽象化されているため、ユーザーは (1) 対象アプリケーションの一部または全部を選び、(2) モニタリングデータの送信先となるバックエンドを選ぶだけで済みます。

2022 年 5 月、私たちは eBPF をベースにした Go アプリケーション向け自動計装器という最初のオープンソースプロジェクトをリリースしました。その後、このプロジェクトを OpenTelemetry コミュニティに寄贈し、現在は Go Automatic Instrumentation SIG の一部として開発されています。

私たちはオープン標準を強く信じているため、Odigos で使用する計装器とコレクターはすべて OpenTelemetry コミュニティで開発されたオープンソースプロジェクトを基盤としています。これにより、特定ベンダーに縛られずに済みます。

現在、私たちはオープンソースプロジェクトの構築に注力しています。まだ価格設定や有料機能はありませんが、将来的にはエンタープライズ機能を含む Odigos のマネージド版も提供する予定です。

詳細は以下をご覧ください。

分散アプリケーションのトレーシングとモニタリングについて、皆さんの経験やさまざまなお話をぜひ聞かせてください。一緒に共有できればうれしいです!

1件のコメント

 
0546530408 2023-08-17

こんにちは。ここに投稿するのは今回が初めてです。私たちはコミュニティからのフィードバックをいただきたいと思っています。ぜひ気軽に Slack チャンネルに参加してください。
https://join.slack.com/t/odigos/…
ありがとうございます!