イベントスキーマ
Framedash は生のテレメトリを ClickHouse の events テーブルに保存します。
このテーブルは次の 3 つの経路から SQL で読み取れます。
- REST の
POST /v1/queryエンドポイント framedash queryCLI コマンド- MCP の
queryツール
このページはカラムとバリデータの規則を示します。 Claude Code プラグインがなくてもクエリを書けるようにするためのものです。
アクセスと scope
Section titled “アクセスと scope”raw SQL には data:admin scope を持つ API キー(Full プリセット)が必要です。
Read-only キーは組み込みの分析エンドポイントと MCP ツールを使えますが、raw な query 経路は使えません。
Ingest(events:write)キーは設計上クエリを実行できず、自身のプロジェクトを列挙することもできません。
クエリはバリデーションされ、プロジェクト分離を強制するよう書き換えられ、読み取り専用の接続で実行されます。 バリデータは次を強制します。
SELECTのみ。INSERT/UPDATE/DELETE/DROP/ALTER/CREATE/TRUNCATE/SYSTEM/OPTIMIZE/KILL、UNION/EXCEPT/INTERSECTは不可。FROM/JOINに書けるテーブルは 2 つだけ。events(生イベント)とdaily_sessions_project_mv(日次セッションの事前集計)。FROM eventsと素直に書けば、分離フィルタは自動で注入されます。- SQL 内で
tenant_idやproject_idを参照しない。これらは自動でスコープされ、直接参照すると拒否されます。 - 文字列リテラルはシングルクォートのみ。ダブルクォートとバッククォートは拒否されます。
SETTINGS/FORMAT/GLOBAL句は不可。IN (SELECT ...)とIN ('a','b')は可、IN some_tableは不可。- トップレベルの
LIMITを省くと自動で付与されます。
結果は { "rows": [ { "col": "value" } ], "rowCount": 123 } の形です。CLI と MCP ツールはこの形のまま返します。REST エンドポイントを直接呼ぶ場合は、標準の API エンベロープで包まれます: { "success": true, "data": { "rows": [...], "rowCount": 123 } }。
MCP の query ツールは最大 1000 行、REST エンドポイントと CLI は最大 10000 行です。
より大きな抽出では LIMIT ... OFFSET ... でページングするか、timestamp の範囲を絞ってください。
| カラム | 型 | 補足 |
|---|---|---|
event_name | String | イベント名。例: player_death、level_start、perf_heartbeat |
timestamp | DateTime64(6) | イベント時刻(UTC) |
session_id | String | プレイセッション ID |
player_id | String | 安定したプレイヤー/デバイス ID |
position_x, position_y, position_z | Float32 | ワールド座標 |
map_id | String | マップ/レベル識別子 |
fps | Float32 | フレームレート(perf イベント) |
frame_time_ms | Float32 | フレームタイム ms(perf イベント) |
memory_used_bytes | Int64 | メモリ量 byte(perf イベント) |
gpu_time_ms | Float32 | GPU 時間 ms(perf イベント) |
game_thread_ms | Float32 | ゲームスレッド時間 ms |
render_thread_ms | Float32 | レンダースレッド時間 ms |
camera_yaw, camera_pitch | Nullable(Float32) | カメラの向き |
source | String | SDK 自身の内部イベント(session_start、perf_heartbeat)は automated。あなたの Track(...) 呼び出しは player。CI の指標ではありません(下記の規約を参照) |
build_id | String | ビルド識別子(perf-diff の候補) |
platform | String | 例: windows、android |
engine_version | String | エンジン/ビルドのバージョン文字列 |
attributes | Map(String, String) | カスタムの文字列属性 |
metrics | Map(String, Float64) | カスタムの数値メトリクス |
Map 型のカラムはブラケットでアクセスします。attributes['ci.branch']、metrics['score'] の形です。
server_timestamp というカラムはありません。
イベント時刻には timestamp を使ってください。
存在しないカラムを指定するとクエリエラーになるため、先に上の名前を確認してください。
却下されたクエリは HTTP 400 で ClickHouse の診断メッセージ(未知のカラム、テーブル、関数、構文エラー、型の不一致、禁止された操作)を返し、インフラ側の障害のみ 500 を返します。
- 自動のパフォーマンスイベントは
perf_heartbeatです。perf のクエリはWHERE event_name = 'perf_heartbeat'で絞ってください。すべてのイベントがfps/frame_time_msを持つわけではありません。 source = 'automated'は SDK 自身の内部イベント(session_start、perf_heartbeat)を示すもので、あなたのTrack(...)呼び出しと区別するためのものです。CI かどうかに関わらず全セッションで設定されるため、これ単体では CI 実行を識別できません。- CI プロファイリングデータを絞り込むには、
sourceではなくbuild_idまたはattributes['ci.*']タグ(BeginAutomatedSession/BeginAutomatedSessionFromEnvironmentが設定)を使ってください。 - CI のメタデータは
attributesに載ります。attributes['ci.branch']、attributes['ci.commit']、attributes['ci.scenario']と、第一級のbuild_idカラムです。 - イベント名は
Track(...)で自分が選ぶ自由な文字列です。公式 SDK のサンプルはsnake_case(player_death、level_start)を使います。タイトル全体で一つの規約に揃えてください。 timestampは常に範囲を絞ってください。テーブルは日付でパーティション分割されているため、範囲を絞るとパーティションが刈り込まれて高速になります。
今日のアクティブプレイヤー数。
SELECT uniqExact(player_id) AS dauFROM eventsWHERE timestamp >= today()直近 7 日のイベント名別の件数。
SELECT event_name, count() AS events, uniqExact(session_id) AS sessionsFROM eventsWHERE timestamp >= today() - 7GROUP BY event_nameORDER BY events DESCビルドごとのパフォーマンスパーセンタイル。
SELECT build_id, count() AS samples, round(quantile(0.50)(fps), 1) AS fps_p50, round(quantile(0.95)(frame_time_ms), 2) AS frametime_p95_msFROM eventsWHERE event_name = 'perf_heartbeat' AND timestamp >= today() - 14GROUP BY build_idORDER BY samples DESC次のステップ
Section titled “次のステップ”- API 概要: 認証とクエリエンドポイント
- CLI リファレンス:
framedash query - トラブルシューティング: クエリの前にイベント到達を確認する