asopi tech
asopi techIndie Developer

Event Log Store

Alopex Trail

イベントログにちょうどいいストレージ

Trailはイベントログのためのストレージです。ユーザーの操作、外部から届いた通知、エージェントが呼んだツールの入出力。イベントログは1件ごとに中身が違い、後から書き換えません。Trailはその性質に合わせて作ります。だから、書く前に形を決める必要がありません。

イベントログを入れるのにちょうどいいストレージ。1件ごとに形が違うイベントログをそのまま貯める。

設計OSS
入れるもの
イベントログ
事前スキーマ定義
不要

Key points

  • 書く前に形を決めなくてよい
  • フィールドが増えても、型が変わっても、取り込みが止まらない
  • 読むときに、どの型で読むかを選べる
observabilitydatabaserust

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とアトミックなファイル公開

クラッシュしても書きかけが見えないSkulk v0.3.0で動いている層をそのまま使う

実装

Rust

Skulkと同じコードベースの上に載せる

Status

開発状況

設計は実装に着手できる段階まで固まっています。v0.1からv0.4で、スキーマを要求しない書き込み、保存、Pythonバインディングを順に用意します。ストレージエンジンはSkulk v0.3.0で動いているものを使います。

公開リソース

最新の資料・コード・コミュニティ導線をまとめています。

Get Involved

置き場所がしっくりこない記録はありますか

リレーショナルに入れるには形が変わりすぎる、時系列に入れるには数値でない。そういう記録の実例に合わせて詰めていきます。