世界を動かす技術を、日本語で。

広範なイベントを取り入れ、OTelを置き換えることで観測性プラットフォームを拡張する

概要

  • LogHouse は、ClickHouse Cloud監視のために構築された大規模な内部ログ基盤
  • データ量 は19 PiBから100 PB、行数は40兆から500兆行へと急増
  • OpenTelemetry (OTel) の限界を超え、独自のパイプライン(SysEx)を開発
  • CPU効率 は20倍のイベント増加に対し、従来の10%未満で処理可能に
  • HyperDX導入 により、ClickHouseネイティブな観測・分析UIを実現

観測基盤LogHouseの進化と課題

  • LogHouse はClickHouse Cloudの監視・分析基盤として自社開発

  • 初期は19 PiB・40兆行のログ管理で、Datadogからのコスト削減にも成功

  • 1年で100 PB・500兆行までスケール、設計やツールの大幅な見直しが必要に

  • OpenTelemetry (OTel) 採用でKubernetes全Podから統一的にログ収集

  • スケール増大に伴い、OTelのパース・マーシャリングがCPUボトルネック化

  • SysEx というClickHouse専用エクスポータを開発し、主要ログの収集効率化を実現

    • SysEx はClickHouseのsystem tableからネイティブ形式でデータを直接転送
    • OTel経由ではJSON→OTel形式→ClickHouse形式と多重変換が発生
    • SysExはバイト単位でコピーし、変換コストやデータ劣化を排除
    • スクレイパはHash Ringで分散、各Podのsystem tableを定期的にスキャン
    • 過去5分程度の遅延バッファを持つことで、バッファフラッシュ漏れも回避
  • OTel 利用時は、Kubernetesノード上のCollectorがCPUリミットでドロップ発生

  • OTelパイプライン維持には8,000 CPUコア必要という非現実的な規模感

  • SysEx導入により、20倍のイベント増加でも従来の10%以下のCPUで安定運用

HyperDXとClickStackによる次世代観測UI

  • HyperDX はClickHouseネイティブな観測UIとして導入
  • Luceneライクなクエリ構文で探索・相関・根本原因分析が容易
  • これまでのGrafanaベースカスタムUIから、ClickHouse統合型UIへ移行開始
  • ClickStack はClickHouse中心のエンドツーエンド観測スタック
  • 大規模データの安価な保存・高速クエリが可能となり、他チームでも採用拡大

SysExの技術的詳細と運用ノウハウ

  • SysExはGo製、ClickHouse Goクライアントに独自パッチを適用
  • データのマーシャリング/アンマーシャリングを完全バイパス
  • システムテーブルのスキーマは頻繁に変化するため、動的スキーマ生成&管理
    • ハッシュでスキーマバージョン管理、LogHouse側も自動で新テーブル作成
    • クエリ時はClickHouseのUNION ALLで複数スキーマを横断的に検索
  • SysExはPull型で定期取得、LogHouse障害時もバックフィルでデータ欠損を防止
  • OTelのような大量バッファや複雑なリトライ処理は不要

今後の展望と他社への示唆

  • LogHouseの経験は、従来型ベンダー製品の限界やコスト課題に悩む他社にも有用
  • 汎用的なOTelと、目的特化型パイプラインの適材適所が重要
  • ClickHouse/HyperDX/ClickStackの組み合わせで、スケーラブルかつコスト効率的な観測基盤構築が可能
  • ClickHouse Cloudは無料クレジット付きですぐに試用可能

参考:

  • LogHouse, SysEx, HyperDX, ClickStack, OpenTelemetry, ClickHouse Cloud
  • Go, Kubernetes, CPU効率, スキーマ管理, 大規模データ運用

Hackerたちの意見

ClickhouseからPostgresに戻ると、毎回びっくりするんだよね。20Gのダンプをインポートするのに、何で数分もかかるの?数秒で終わるべきじゃないの?

Clickhouseを使うたびに頭が爆発しそうになるよ、特にPostgresがあるって知ってるから。Clickhouseに場所がないとは言わないし、PostgresがClickhouseのすべてをできるとも思わない。ただ、Clickhouseでの作業がすごく嫌いなんだ、変な足元の銃が多すぎて。特定の、私の意見では限られた使い方をしない限り、あらゆる面でPostgresよりも悪く感じる。

注目すべき点: 「サービスがクラッシュループしているかダウンしている場合、SysExは必要なシステムテーブルが利用できないため、データをスクレイピングできません。一方、OpenTelemetryは受動的に動作します。サービスが失敗状態にあっても、stdoutやstderrに出力されたログをキャッチします。これにより、インシデント中にログを収集し、サービスが完全に健康でなくても根本原因分析が可能になります。」

私がやったOTelはすべてアクティブだったから、あんまり注目すべきことじゃないと思う。むしろ、間違った情報か不完全な情報だね。

そうだね、これはClickhouseからログを収集することにだけ関係ある話だ。他の何かのログには関係ない。彼らには良いことだけど、Clickhouseが大好きなんだけど、あんまり関係ないね。

パーティーでは楽しそうだね。

ClickHouseレベルのスケールで働いたことはないけど、このボリュームでログデータを検索できるの?ElasticSearchは小規模なログデータのクエリ機能があると思うけど、歴史的なログデータをjsonファイルとして保存する代わりにClickHouseを使う理由は何なの?

スケールとコストの問題。私の職場ではログのスケールに直面しているんだ。「jsonをsplunkにプッシュする」だけだと、年間600万ドル以上かかるけど、承認されるのはせいぜい5〜10%くらい。記事では、彼らのjsonログを処理するのに8kのCPUが必要だと言っているけど、その後は90CPUだけで済むって。

「このボリュームでログデータを検索できますか?」(文脈: 私はこのスケールで働いています)はい。ただ、想像できるように、処理コストはかなり大きくなる可能性があります。インデックス作成や順序付け、クラスタリングの戦略がうまく設定されていないと、「この文字列を含むレコードを探す」みたいな単純なクエリでも、1ドルから10ドルかかることが簡単にあります。私の経験も彼らと一致していて、ペタバイトのデータを移動するスケールでは、最良の最適化は「できるだけ少ないデータに触れること」と「できるだけ少ないデータを移動すること」だよね。シリアライズやデシリアライズを行うたび、ディスクやネットワークI/Oを行うたびに、パフォーマンスコストが増えて、結果的に財布へのコストも増える。だから、OTelは効率と真っ向から対立することがある。OTelコレクターは追加のI/Oとシリアライズのホップだからね。でも、ペタバイトスケールで運用しているなら、1つのホップを捨てることで節約できる金額は、シリアライザーやデシリアライザーのロジックを書くエンジニアの給料を十分にカバーできるかもしれない。

数年前、ClickHouseはフルテキスト検索があまり得意じゃなかったから、それが最大の欠点だったと思う。確かに速いし、ESスケールも扱えるけど、ユースケースによっては、事前にインデックスを作らずにFTSやグルーピングをする場合、ESをクエリする方がずっと速いよ。

なんでログデータを歴史的なログデータとしてJSONファイルに保存する代わりにClickHouseを使うの?理由はいくつかあるよ。1. ログに最適化されたデータベース(ClickHouseやVictoriaLogsなど)は、ログを圧縮された形で保存するんだ。各ログフィールドの値がグループ化されて個別に圧縮される(いわゆるカラム指向ストレージ)。これにより、JSONログのプレーンファイルと比べてストレージスペースが小さくなるんだ。たとえ圧縮してもね。2. ログに最適化されたデータベースは、JSONファイルに対するgrepよりもずっと速く典型的なクエリを実行できる。パフォーマンスの向上は1000倍以上になることもあるよ。これらのデータベースは不要なデータを読み飛ばすからね。詳細はここを見てね:https://chronicles.mad-scientist.club/tales/grepping-logs-re... 3. 100ペタバイトのJSONファイルをgrepするつもりなの?ログに最適化されたデータベースは、ストレージノードを追加して水平スケーリングできるから、そんなに大量のログをクエリできるんだ。

この業界は、半端な基準や進行中の基準で溢れていて、エコシステムの分断を招いてるんだよね。GraphQLからOpenAPI、MCPまで、完璧なものはないし、それでいいと思う。ただ、仕様を作った人たちが試行錯誤のアプローチをただ続けてるのは、ちょっと狂ってるよ。

正直、それは自慢にならないよ。100PBのログを保存してるってことは、実際に何がログに残す価値があるのか、まだ分かってないってことだし。メトリクスと構造化イベントがあれば、90%のストーリーは語れるよ。残りは?トレースレベルの混沌で、プロダクションが燃えてない限り誰も読まない。もっと良くできたことは、アラートが一度も見たことのないログや、3ヶ月間検索クエリに引っかからなかったログを自動で整理することだね。これを「注意重視の保持」とでも呼ぼうか。それまでは、ただの高級デジタルゴミ箱に圧縮されてるだけだよ。

確かに、でもデータがすでにあるなら、それは選別と整理の問題で、必要なら取り込んだ後にやればいいことだよね。全データを持っていて、必要ない方がいいのは、必要なのに持ってないよりもマシだから。最初に取り込むリソースがある前提だけど、それが彼らの最適化作業の焦点みたいだね。

俺は逆の意見だな。全部取り込んでから、オブザーバビリティプラットフォームで不要なものをフィルタリングする方がいいと思う。デバッグログをフィルタリングする問題は、必要ないと思っても、いざ必要になると困るってことだよね。そして、デバッグできないイベントを再現しようとするのは、しばしば不可能だから。だから、隠れているけどすでにあるデバッグログを取り出す方が簡単だと思う。

トレースレベルの混乱なんて、プロダクションが燃えてない限り誰も読まないよ。神様、なんでこんな消火器を置いてるんだろう、99.999%の時間使われてないのに。

そのログ取得、送信側では無料じゃないからね。特に、プログラムがクラッシュした理由を知るためにディスクにログを急いで書き込む言語では。あと、スキャンの盲点も多いし。余計なデータが多すぎると、他のログエントリとの相関関係が隠れちゃうんだよね。バグがすでに解決された後のログの価値は半減期があって、結構短いし。統計の方が好きだな、集約されるから。ただ、GIL言語のモデルの中にはOTELみたいにオーバーヘッドが高すぎるものもあるけど。

いろんな会社で、ログを減らしてメトリクスや限られたイベントにシフトしようとする動きがあったよ。だいたい「データドッグ使ってるし、契約更新の時期だし、数字がすごいから」って理由で。問題は、何がうまくいかないか分かってたら、もう直してるってこと。だから、何かが正しく動かなかったって報告があった時に、何が起こったのか知りたいとき、詳細なログが役立つけど、再発する問題がないとどのログが役立つか分からないんだよね。

誰も見たことのないログを自動的に剪定するって、どこかで誰かが、過去に見られたログに基づいて、特定のログが見られる可能性を予測するAIを作ってるに違いない。24時間は全て保存して、7日間は少し少なめに、データが古くなるにつれてもっと積極的に剪定していけば、1年後にはストーリーが薄くなる―大惨事だけが残る。

「注意重視の保持」って概念、すごくいいね。ログパターンごとにクエリやアラートのヒット数を追跡するシンプルなカウンターを使って、ほとんどの可観測性プラットフォームでTTLポリシーに活用できる。これで、全てのアクション可能なデータを保持しつつ、ストレージコストを70%削減できたよ。

大企業で働いてると、たくさんの開発チームがいろんな製品をサポートしてるから、「何が実際にログを取る価値があるのか分からない」ってのは、そのチームの開発者のインセンティブ(機能を早く出す、問題をもっと早く解決する、そんな無駄なことに時間はない)や運用のインセンティブ(サーバーが燃えてるのに、開発者が十分にログを取ってない)から切り離されてるんだよね。FinOpsは最後に来るし、可観測性スイートでチームごとのコスト追跡があるかも怪しい。データドッグが440億ドルの時価総額を持ってる理由が分からないんだね。クラウドへの移行で、すべてのエンジニアに企業クレジットカードが与えられて、支出管理もできないし、ファイナンスがその流れを止める方法もないっていう、また別のファイナンスの不満の例だよ。

え、何それ? > 下で読むと、これで年間数百万ドルの節約ができて、観測コストを気にせずにClickHouse Cloudサービスをスケールアウトできるんだ。ログデータの保持について妥協する必要もないしね。https://clickhouse.com/blog/building-a-logging-platform-with...

やあ!ClickHouseで働いてるよ。ちょっと説明すると、100PBの大半は構造化されたイベントなんだ。うちの場合、ログは補足的なものだよ。

オブザーバビリティの最大主義はカルトだね。しかも、かなり裕福なカルト。

まあ、未知の未知を調査したいなら、あまり選択肢はないよね。

問題を出しておいて、月額料金で解決してくれるなんて面白いよね。

ログの保持期間がどれくらいなのかは見なかったな。数ヶ月後には要約や集約データが必要になるかもしれないけど、生データについてはよく分からない。

180日間保存してるよ。

幅広いイベントって、そんなにスペースを取る必要あるの?観測性って、基本的にはサンプリングの問題で、最小限のストレージで環境の状態を再構築する能力を最大化することが目標だと思うんだ。サンプル数を減らすか、圧縮能力を向上させることでそれを達成できるよね。後者については、圧縮の大半を絞り取ったとは思えないんだけど。冗長なデータには絶対に大きな低ランク構造があるはずだよ。確かに、これらの企業はすでに逆インデックスや様々な木構造を使っているけど、もっと研究的なアプローチ(例えば低ランクテンソル分解)があって、それを効率的に実行できる方法が見つかれば、既存の方法を超えると思ってたんだ。でも、業界にいないから、何か見落としてるかもしれないね。

幅広いイベントって、そんなにスペースを取る必要あるの?100PBは、フルリテンション期間(180日)の生の未圧縮データの総量だよ。圧縮がコスト効率を良くしてるんだ。このデータセットでは約15倍の圧縮が見られるから、実際には約6.5PBだけ保存してるよ。

相関についての情報があまりないね。ステートフルなユースケースにおける観測の最先端のツールや技術は何かな?例えば、SFUベースのビデオ会議アプリを考えてみて。ユーザーのデバイスがセッションに参加するために複数のAPIコールを通過するんだ。で、あるユーザーが他の参加者の動画が見えないって報告したとする。こういう問題はどうやって効果的に追跡できるのかな?もちろん、最初のユーザーのログやトレースを手動でフィルタリングして、次に二人目のユーザーを見て、シグナリングのやり取りやフロントエンド/バックエンドのエラーを確認することはできるけど、もっと良いアプローチはあるのかな?