Event Log Store
Alopex Trail
イベントログにちょうどいいストレージ
Trailはイベントログのためのストレージです。ユーザーの操作、外部から届いた通知、エージェントが呼んだツールの入出力。イベントログは1件ごとに中身が違い、後から書き換えません。Trailはその性質に合わせて作ります。だから、書く前に形を決める必要がありません。
イベントログを入れるのにちょうどいいストレージ。1件ごとに形が違うイベントログをそのまま貯める。
- 入れるもの
- イベントログ
- 事前スキーマ定義
- 不要
Key points
- 書く前に形を決めなくてよい
- フィールドが増えても、型が変わっても、取り込みが止まらない
- 読むときに、どの型で読むかを選べる
Challenge
書きやすさと読みの速さが両立していない
形を問わずに書けるストレージは貯めた後に探すのが遅くなります。速く読めるストレージは書く前に形を決めろと要求します。Trailが挑むのは、書くときに形を問わず、読むときは列指向の速さで引くことです。
- 形を問わない製品は、貯めた後に探すのが遅い
- 速く読める製品は、書く前にスキーマを要求する
- 両方が要るので、片方を諦めるか、二重に持つことになる
イベントログは1件ごとに中身が違い、書いた後から書き換えません。ユーザーの操作、外部から届いた通知、エージェントが呼んだツールの入出力。どれもそうです。
リレーショナルは書く前に形を要求します。時系列は名前とタグが安定した数値を前提にします。ドキュメントは形を問わない代わりに、貯めた後に探すのが遅くなります。
Trailはこの性質に合わせます。書くときはスキーマを要求せず、届いた形のまま受け取ります。どの型で読むかは読むときに選びます。ストレージエンジンはSkulkのものを使います。時系列とイベントログの両方をダッシュボードごとまとめたものがAlopex OTelです。
届いた形のまま貯める
Trailは書き込みにスキーマを要求しません。フィールドが増えても、型が食い違っても、そのまま受け取ります。解釈するのは読むときです。整形のためのコードと、それが壊れたときの対応がなくなります。
- 取り込みが型の変化で止まらないので、欠測が出ない
- JSON文字列に押し込まずに済み、中身が検索できる形で残る
- 同じフィールドを、数値として読むことも文字列として読むこともできる
- 整形コード
- 不要
- スキーマ変更
- 不要
Use Cases
3つの使いどころ
どんな記録を入れて、後でどう読むか。
アプリケーションの出来事を残す
操作ログ・監査ログ
- 入れるもの: ユーザーの操作、状態の遷移、エラー、外部API呼び出しの結果
- 使い方: 障害が起きた時刻の前後を並べて、何が起きていたかを追う
- 機能を足して属性が増えても、定義を直さずに書き続けられる
外から届くイベントログを受ける
Webhook・連携先の通知
- 入れるもの: 送信側の都合で構造が変わるWebhookや通知
- 使い方: 変換せずに貯めておき、必要な属性が決まった時点で読み出す
- 連携先がAPIのバージョンを上げても、取り込みが止まらない
エージェントとデバイスの記録を残す
実行ログ・IoTのイベントログ
- 入れるもの: ツール呼び出しの入出力、機種ごとに属性が違うデバイスのイベントログ
- 使い方: 実行を1件ずつ再現する、機種をまたいで同じ属性だけを拾う
- 毎回中身が変わる記録でも、そのまま残せる
Features
主要機能
イベントログを貯めて読むために備えている機能。
スキーマを要求しない書き込み
書く前に形を決める必要がありません。新しいフィールドが増えても、定義を直さずに書き続けられます。
型が食い違っても捨てない
同じフィールドが数値で届いても文字列で届いても、どちらも残します。取り込みが止まらないので欠測が出ません。
読むときに型を選ぶ
どの型で読むかは読むときに決めます。数値として扱いたい場面と、文字列として扱いたい場面の両方に対応できます。
タイムスタンプを必須にしない
時刻のない記録も、ペイロードが空のイベントログも受け取ります。タグとフィールドの区別も要りません。
外部ツールから読めるParquet
貯めたデータはParquetのまま置かれます。分析のためにエクスポートする必要がありません。
Tech Stack
技術スタック
Skulkのストレージエンジンをそのまま土台にします。
ストレージ
Skulkのエンジン(Apache Parquet)
耐久性
WALとアトミックなファイル公開
実装
Rust
Status
開発状況
設計は実装に着手できる段階まで固まっています。v0.1からv0.4で、スキーマを要求しない書き込み、保存、Pythonバインディングを順に用意します。ストレージエンジンはSkulk v0.3.0で動いているものを使います。