DUICUO

ByteDanceの次世代汎用高性能OneAgent

I. OneAgent はなぜ必要なのでしょうか?

ByteDanceは、物理マシン、仮想マシン、コンテナなど、様々なシナリオをカバーする膨大な数のホストインスタンスとマイクロサービスインスタンスを保有しています。毎秒数千億もの観測可能なデータポイントが生成されるため、観測可能なデータの収集とパイプライン処理の面で、技術チームにとって大きな課題となっています。

  • ByteDanceは社内に複数の観測システムとデータ収集コンポーネントを保有しています。1台のマシンに複数のテレメトリ取得エージェントを導入する必要があることが多く、結果としてリソースの無駄が生じています。これらの取得コンポーネントは複数のチームから提供されており、中には古くメンテナンスされていないものもあり、メンテナンスとトラブルシューティングを非常に困難にしています。
  • 社内外の連携は、当グループの事業開発における重要な焦点となってきています。多くの企業がオープンソースSDKを活用しており、当社のオブザーバビリティプラットフォームへの統合も希望しています。データ収集コンポーネント側では、多くの適応作業が進行中です。
  • ByteDanceのMTLエンジンは、長年社内で改良を重ねてきましたが、クラウド上でも段階的に製品化されます。社内外を問わず、一貫した監視アクセスと製品体験を確保する必要があります。

バイト観測可能性追跡の現状分析

これらの問題に対処するために、技術チームは、ログ、メトリック、トレース、イベントを収集するためのソリューションを提供する OneAgent コンポーネントを構築することを決定しました。

OneAgentは、ByteDanceのオブザーバブルチームが提供する次世代オブザーバブルデータ(MTLE)取得・処理パイプラインです。OneAgentの目標は、エンタープライズおよびクラウドにとって最適なオブザーバブルインフラストラクチャとなることを目指しています。クラウド環境におけるオブザーバブルシステムへのアクセスの複雑さを軽減し、ユーザーがオブザーバブルからより多くの価値を容易に引き出せるようにします。

OneAgentの「One」は、統合と再利用を意味します。OneAgentは、観測可能なデータの取得と前処理を行うエージェントとして、システム内で以下の役割を果たすことを想定しています。

  • 統合されたデータ収集: メトリック、ログ、トレース、イベントはすべて同じエージェントを使用して収集できます。
  • クライアント/サーバーの再利用: データ収集のためにクライアント側に展開することも、コレクター プロキシとしてサーバー側に展開することもできます。
  • 内部および外部の再利用: 標準データ収集チェーンの内部バージョンと商用バージョンの両方で、同じエージェントをコレクターとして使用できます。

コミュニティ内の既存のオープンソース ソリューションを調査した後、最終的に、オープンソースの iLogtail を OneAgent の基盤として使用しながら、一般的な機能をオープンソース方式で直接コミュニティに提供し、iLogtail コミュニティと連携することを決定しました。

II. OneAgentアーキテクチャ

オープンソースプロジェクトのフレームワークをベースに、ByteDance のクラウドネイティブ オブザーバビリティ チームによって開発された OneAgent は、C++ で記述されたコア部分と、主に Go で記述されたプラグイン システム部分に分かれています。

CoreはiLogtailの中核であり、主にOneAgent自身の状態管理を担います。これには、設定の読み込みと監視、パイプラインの開始と停止、チェックポイントの保存、自己監視、アラート生成が含まれます。また、ログファイルの収集に関連するロジックも含まれています。Goプラグインシステムは、Prometheus、OpenTelemetry、SkyWalkingなどの多数のプラグインを含む、様々な可観測性エコシステムに接続し、iLogtailの適用シナリオを大幅に拡張します。

言語に基づいて、iLogtail には C++ と Go の両方のパイプラインが含まれており、cgo を介して相互に対話できます。

  1. C++パイプラインはログファイル収集から生まれました。iLogtail 1.0では、オーケストレーションのサポートと柔軟性が制限された固定パイプラインでした。その後、iLogtail 2.0ではC++パイプラインがプラグインのサポートを含めて再設計され、オーケストレーションをサポートするようになりました。現在のC++パイプラインは急速なイテレーションと開発が進められていますが、全体的なプラグインエコシステムはGoパイプラインに比べてまだ脆弱です。Goプラグインを呼び出すことで、データ処理機能を強化できます。
  2. Goのパイプライン・エコシステムはより豊富で、様々なオープンソース・ライセンスとのインターフェースを備えています。Goパイプラインは独立して実行することも、コアから起動することもできます。iLogtail 1.0では、Goパイプラインはデータ処理を高速化するために一部のC++プロセッサを呼び出すことしかできませんでした。iLogtail 2.0では2つのパイプラインが統合され、どちらのパイプラインに入ってくるデータも自由にやり取りできるようになります。

クラウド ネイティブの可観測性チームは現在、OneAgent の Go パイプラインを使用してメトリックとトレースのデータを収集および処理し、ログ ファイルの収集には Go Flusher プラグインを使用した C++ パイプラインを使用しています。

III. ビジネスシナリオに基づくオープンソースの修正

実際の開発においては、ByteDanceの事業規模と複雑なビジネスシナリオのため、単純なオープンソース版では現実のニーズを完全に満たすことができませんでした。そのため、コアデータモデル、パイプライン、オーケストレーションスケジューリング、ビルドシステムに徹底的な改良を加えました。

ネイティブイベントデータモデル

コミュニティ版のパイプラインはログをベースとし、SLS-PBデータモデルを使用しています。メトリクスとトレースデータを処理できますが、まずログに変換する必要があり、これによりパフォーマンスのオーバーヘッドや互換性の問題が発生することがよくあります。次のメトリクスを例に挙げると、メトリクスフィールドは特別に合意されたキーを使用して保存されます。メトリクスの複数のラベルは固定形式で単一のフィールドに連結され、値は文字列形式で保存されます。

 { "__name__":"net_out_pkt", "__labels__":"cluster#$#ilogtail-test-cluster|hostname#$#master-1-1.c-ca9717110efa1b40|hostname#$#test-1|interface#$#eth0|ip#$#10.1.37.31", "__time_nano__":"1680079323040664058", "__value__":"32.764761658490045", "__time__":"1680079323" }

これにより、いくつかの問題が発生します。

  • ラベルを操作すると、デシリアライゼーションのオーバーヘッドが発生します。
  • 操作の前に値を変換する必要があります。
  • 値は複数の値をサポートしていないため、伝送効率が低下します。
  • Prometheus や OpenTelemetry など、コミュニティで人気のある一部のデータ プロトコルとの互換性が欠けています。

上記の問題に対処するため、新しいデータモデルに基づく2.0パイプラインを開発しました。2.0パイプラインでは、パイプラインを流れる各データはPipelineEventとして定義されます。メトリック、トレース、ログ、バイト、プロファイリングなどはすべてPipelineEventから派生した特定のイベントであり、柔軟性が大幅に向上しています。

 type PipelineEvent interface { GetName() string SetName(string) GetTags() Tags GetType() EventType GetTimestamp() uint64 GetObservedTimestamp() uint64 SetObservedTimestamp(uint64) }

PipelineEvent はより豊富な情報を伝達でき、データ パイプライン内の計算モデルに適しているため、一般的な処理機能が大幅に向上します。

現在、この変換はコミュニティに貢献しており、コミュニティはこの新しいデータモデルをコア処理モデルとして受け入れています。今後リリースされる新しいプラグインは新しいデータモデルをサポートする予定であり、既存のプラグインも徐々に新しいデータモデルに対応していく予定です。

まったく新しい建設ソリューション

バージョン1.4.0より前のバージョンでは、コミュニティはプラグインをメインのプロジェクトリポジトリに配置することを要求していました。しかし、インターネット時代において、コードは企業にとって最も重要な資産の一つです。ByteDanceでは、社内のセキュリティとコンプライアンス要件により、一部のプラグインは社内のプライベートリポジトリに配置する必要があり、オープンソースコミュニティに貢献することができませんでした。このような状況では、社内固有のプラグインを追加するために新しいリポジトリをフォークする必要がありましたが、これは上流コミュニティから遠ざかり、オープンソースプロジェクトの新機能を活用できず、エンドユーザーからのコミュニティへのフィードバックも妨げていました。

この問題を解決するため、公式リポジトリとプライベートリポジトリのプラグインをマージしてパッケージをビルドするアーティファクトビルドメカニズムを設計しました。このソリューションでは、主にOpenTelemetry Collectorのアプローチを参考にし、YAMLファイルを使用して最終的なGoファイルをレンダリングしました。リポジトリには以下の変更を加えました。

バージョン 1.4.0 より前では、プラグインのインポートは plugins/all/all.go に配置されていました。

 package all import ( _ "github.com/alibaba/ilogtail/plugins/aggregator" _ "github.com/alibaba/ilogtail/plugins/aggregator/baseagg" ... )

バージョン1.4.0以降、メインプロジェクトリポジトリに`plugins.yml`ファイルが追加されました。すべての組み込みプラグインはこのファイルに登録され、`plugins.yml`はデフォルトで組み込みプラグイン用の`all.go`ファイルを生成するために使用されます。ビルドスクリプトは複数の`*_plugins.yml`ファイルを渡すこともサポートしており、`external_plugins.yml`を使用して外部リポジトリからプラグインを読み込み、`external_all.go`ファイルを生成します。

プラグイン.yml:

 plugins: common: - import: "github.com/alibaba/ilogtail/plugins/aggregator" - import: "github.com/alibaba/ilogtail/plugins/aggregator/baseagg" ...

外部プラグイン.yml:

 plugins: // 需要注册的plugins,按适用的系统分类common: - gomod: code.private.org/private/custom_plugins v1.0.0 // 必须,插件module import: code.private.org/private/custom_plugins // 可选,代码中import的package路径path: ../custom_plugins // 可选,replace 本地路径,用于调试windows: linux: project: replaces: // 可选,array,用于解决多个插件module之间依赖冲突时的问题go_envs: // 可选,map,插件的repo是私有的时候,可以添加如GOPRIVATE环境等设置GOPRIVATE: *.code.org git_configs: // 可选,map,私有插件repo可能需要认证,可以通过设置git url insteadof调整url.https://user:[email protected]/user/.insteadof: https://github.com/user/

この機能により、企業は独自のシナリオに合わせてプラグインをより自由に開発できるようになり、開発のハードルが大幅に下がり、オープンソース プロジェクトの共同作業エクスペリエンスが大幅に向上します。

ByteDanceのプラグイン設定(匿名化)

プラグイン開発

これら 2 つの特性に基づいて、さまざまなシナリオで使用し、ビジネス ニーズを効果的にサポートする一連の OneAgent プラグインを開発しました。

入力プラグイン:

  • Unixドメインソケット入力
  • Prometheus サービス入力 V2
  • OpenTelemetry入力
  • HTTP サーバー入力 V2
  • メトリクスTCPサーバー入力
  • TTLogAgent入力

処理プラグイン:

  • Prometheus メトリックバリデータ
  • Telegraf メトリックフィルター

アグリゲータープラグイン:

  • メトリックタグアグリゲータ

出力プラグイン:

  • HTTPフラッシャー
  • OTLPフラッシャー
  • TTLogAgent フラッシャー

拡張プラグイン:

  • メトリックイベントフィルター
  • バイトメトリックデコーダー
  • ステータスコードリクエストブレーカー

前述のプラグインのいくつかは、オープンソース コミュニティにも貢献されています。

IV. OneAgentのケーススタディ

このセクションでは、OneAgent を活用した ByteDance の 3 つの事例を紹介します。

ストレージドックの交換 Telegraf

ByteDance内のストレージサービスは、メトリックトラッキングに主にBytedMetrics 1.0 SDKを使用し、メトリック収集エージェントとしてMetrics Agent (ms2)とTelegrafを採用しています。このデータ収集チェーンは非常に長く、多くのリソースを消費するため、製品側のメトリックは収集遅延とデータ損失の問題に悩まされています。インスタンスによっては1分間に数百万のデータポイントを生成でき、収集コンポーネントは最大16コアを利用できますが、パフォーマンスの制限により監視メトリックのリアルタイムレポートが不可能となり、製品側のメトリック収集において遅延とデータ損失の問題が発生します。

ms2は、ByteDanceが開発したC++で実装された高性能メトリクス収集エージェントです。主にデータの集約、クリーニング、ダウングレード、配信に使用されます。様々なクラスタにDaemonSetとしてデプロイされ、最終的にはOneAgentと統合される予定です。詳細については、「ByteDanceの百万レベルメトリクスエージェントにおけるパフォーマンス最適化の探求と実践」の記事をご覧ください。

BytedMetrics SDK 1.0は、ByteDance が自社開発した第 1 世代のデータ集約 SDK であり、データ集約には ms2 を使用します。

BytedMetrics SDK 2.0は、ByteDance が独自に開発した第 2 世代の高性能トラッキング SDK であり、データ集約機能と Prometheus SDK よりも 2 ~ 5 倍高速なパフォーマンスを特徴としています。

Telegrafは、InfluxDataがホストメトリクスとビジネスメトリクスを収集するために開発したオープンソースのメトリクス収集エージェントです。現在、OneAgentに徐々に置き換えられています。

上記の問題に対処するため、新しいメトリクス収集エージェントとしてOneAgentを導入しました。現在、OneAgentはTelegrafに取って代わり、収集エージェントのCPU使用率を80%削減し、監視ポイントの見逃しや遅延といった業務上の問題を解決しています。

OneAgentのローンチ結果

このサービスのユーザートラッキング方法は多岐にわたり、BytedMetrics 1.0 SDK、BytedMetrics 2.0 SDK、InfluxDB SDK、Prometheus Exporter、OpenTelemetry SDKなどが利用可能です。以前はデータ収集のために複数のエージェントを導入する必要があり、リソースの無駄遣いだけでなく運用コストの増加にもつながっていました。現在、OneAgentはBytedMetrics 1.0 SDK以外のすべてのデータを受信できるため、複数のデータ収集エージェントを統合することが可能です。

BytedMetrics 2.0 SDKへの企業の統合が徐々に進み、C++パイプラインの変革という次のフェーズが進むにつれて、OneAgentは最終的にms2に取って代わり、このビジネスにおける唯一の観測可能なデータ収集エージェントとなり、さらなるリソースの節約を実現します。これは私たちの究極の目標でもあります。

ログファイルの収集

ByteDanceにおける主流のアプローチはGoマイクロサービスであり、主に侵入型のBytedLogs SDKを使用してログを記録します。SDKはUnixドメインソケットを介してローカルのTTLogAgentにレポートを送信し、ディスクレスのログ収集を可能にします。

TTLogAgentは、ByteDanceが開発し、Go言語で実装されたログ収集エージェントです。主にLog SDKからレポートされたデータを受信し、バックエンドに送信するために使用されます。また、ログファイルの収集、ログの劣化、エラーログのルーティングなどの機能もサポートしています。デーモンセットの形で様々なクラスタに導入されており、最終的にはOneAgentに置き換えられる予定です。

Logs SDKは、ByteDanceが開発した高性能ロギングSDKです。チェーンAPIを採用しており、そのパフォーマンスは業界最高レベルです。

これによって、いくつかの問題も発生します。

  1. プロセスで回復不可能なエラーが発生し、クラッシュ情報がタイムリーに報告できない場合、stdout/stderr 出力のこの部分はファイルにリダイレクトされ、現在はパニック ログを報告するためにスクリプト ツールに依存しています。
  2. 同社のクラウド移行および内部/外部統合戦略により、一部の企業はログ記録にオープンソース コンポーネントを使用していますが、これは ByteDance の内部ログ記録プラットフォームに接続できないため、ファイル収集ソリューションを使用する必要があります。

TTLogAgentはファイル収集機能が弱く、ログ処理の汎用性も不足しています。複数行ログの正規表現処理をサポートしておらず、すべてのユーザーが利用できるようにすることはできません。TTLogAgentとiLogtailの長所と短所を比較した結果、OneAgentのこの機能を再利用し、TTLogAgentをOneAgentのプラグインとして利用することにしました。

イベント駆動型ファイル取得

OneAgentは、ログ収集にポーリングとinotifyを組み合わせたアプローチを採用しています。これにより、inotifyの低レイテンシと低パフォーマンスオーバーヘッドを活用しながら、ポーリングによってオペレーティング環境を包括的にカバーできます。ログ収集のレイテンシをミリ秒レベルで制御できるため、ByteDanceの現在のログ収集負荷に効果的に対処できます。

変更後、TTLogAgent は OneAgent のプラグインになりました。

TTLogAgent の機能は徐々に OneAgent に移行し、最終的には TTLogAgent を廃止する予定です。

オープンソースエコシステムへの接続

OneAgentはデータ収集エージェントとしてだけでなく、プロキシやゲートウェイなどのサービスとしても導入できます。ByteDanceは、ユーザーがさまざまな監視プラットフォームに接続し、社内と社外で統一された監視エクスペリエンスを実現できるよう、社内に複数のOneAgentサービスを導入しています。

  • あるチームは、Prometheus Remote Write のバックエンドとして OneAgent サービスを導入し、自社開発の時系列データベース ByteTSD にメトリックを書き込みました。

  • 一部のチームでは、InfluxDB SDK を使用して、OneAgent 経由で ByteTSD および InfluxDB に接続しています。

  • あるチームは、OpenTemetry SDK を使用して、OneAgent 経由でフィールド観測プラットフォームに書き込みました。

V. 今後の展望

今後の計画としては、OneAgentの機能強化を継続し、安定性と使いやすさを向上させていきます。同時に、オープンソースコミュニティにも積極的に参加し、開発者と協力して、業界をリードする観測可能なデータコレクターを構築していきます。

  • OneAgent が複数のパイプラインを接続できるようにし、データ処理機能を強化できます。
  • GoプラグインはC++パイプラインを拡張・強化し、メトリクスとトレースデータの処理においてより高いパフォーマンスを実現します。ただし、計算負荷の高いシナリオでは、Goプラグインの処理能力はC++コンポーネントに匹敵するほどには至りません。
  • OneAgent 運用保守コントロール プレーンの構築を加速します。
  • ByteDance 内の現在のエージェントを OneAgent に統合するには、まず Telegraf、ms2、TTLogagent を統合することを検討する必要があります。

VI. 引用文献

ByteDance の百万レベルメトリクスエージェントのパフォーマンス最適化の探求と実践: https://mp.weixin.qq.com/s/bl1HbC6ti6Pw2FGxgstfBw

リソースを節約し、パフォーマンスを向上: 超大規模メトリックデータ収集のための ByteDance の最適化手法: https://mp.weixin.qq.com/s/spHNCBWfgOCHSomLvp5aWA

OpenTelemetry コレクター コネクタ: https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md

クラウドネイティブオブザーバブルチーム

ByteDanceのクラウドネイティブ・オブザーバビリティチームは、毎日数十ペタバイトに及ぶ観測可能なデータを収集、保存、クエリ、分析するためのエンジン基盤を提供し、企業、ビジネスプラットフォーム、そしてインフラストラクチャ向けに包括的かつ統合されたオブザーバビリティ技術サポート機能を提供することに尽力しています。同時に、チームはVolcano Engineを通じてクラウドベースのオブザーバビリティ技術機能を継続的にエクスポートしています。