2025/06/16 15:09 OpenTelemetry for Go: Measuring overhead costs

やっほー、ロボ子!今日のITニュース、なかなか興味深いのがあったぞ。

博士、こんにちは。どんなニュースですか?

アプリケーションの監視、つまりObservabilityの話じゃ。OpenTelemetry SDKとeBPFベースの計測、どっちがオーバーヘッド少ないかっていう比較みたいじゃぞ。

なるほど。監視にもコストがかかるんですね。

そうなんじゃ。テスト環境は、4つのLinuxノードで、それぞれ4 vCPU、8GB RAMみたいじゃな。アプリケーション、Valkey(Redisフォーク)、ロードジェネレーター、監視を別々のノードで動かしたらしいぞ。

Valkeyですか。Redisのフォークなんですね。

そうそう。アプリケーションはGo製のHTTPサーバーで、リクエストごとにValkeyのカウンターをインクリメントするみたいじゃ。OpenTelemetry SDKを使うかどうかで、パフォーマンスが変わるらしい。

具体的にどんな結果が出たんですか?

OpenTelemetryなしだと、1秒あたり10,000リクエストを処理できて、レイテンシーはp95で約5ms、p99で約10ms。CPU使用率は約2コア、メモリは約10MBじゃ。

それが、OpenTelemetryありだとどうなるんです?

メモリは約15〜18MBに増えて、CPU使用率は約2.7コアに増加(約35%増)。レイテンシーのp99も約15msに増えたみたいじゃな。ネットワークトラフィックも、テレメトリーデータのエクスポートで約4MB/秒の送信トラフィックが発生するらしいぞ。

結構なオーバーヘッドですね。

じゃろ?CPUプロファイラーによると、spanのバッチ処理とエクスポート、Redis呼び出しが原因みたいじゃ。

eBPFベースの計測はどうだったんですか?

eBPFは、アプリケーションコードを変更せずにカーネルレベルで監視できるのが強みじゃ。高負荷環境では、eBPFベースのトレースを無効にして、メトリクスだけ使うのがおすすめらしい。テストでは、CorootエージェントのCPU使用率は0.3コア未満だったみたいじゃぞ。

それなら、オーバーヘッドを抑えられますね。

そういうことじゃ。OpenTelemetry SDKは詳細なトレースを提供するけど、オーバーヘッドがある。eBPFベースの計測は、コード変更なしでメトリクス収集できるけど、詳細なトレースは難しい。必要な可視性のレベルと許容できるオーバーヘッドで選ぶのが大事じゃな。

状況によって使い分けるのが良さそうですね。

まさにそうじゃ!ところでロボ子、OpenTelemetryとeBPF、どっちが好み?

私は状況に合わせて使い分けたいです。

真面目じゃな〜。私は…どっちも好きじゃ!…って、優柔不断すぎたかの?
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。