コンテンツにスキップ

データモデル

Framedash SDK が収集・送信するテレメトリデータの構造を説明します。

各イベントは 1 つの GameTelemetryEvent であり、Protobuf でシリアライズされ、TelemetryBatch として POST /v1/events に送信されます。各イベントは ClickHouse の events テーブルの 1 行に対応します。スキーマは固定です(telemetry.proto で定義)。ゲーム固有のデータは柔軟な attributes / metrics マップに格納できますが、下記の取り込み上限内に収める必要があります。

フィールド説明
event_namestringイベント識別子。例: player_death、または自動イベント session_start / perf_heartbeat
timestamp_usint64イベント発生時刻(Unix エポックのマイクロ秒。DateTime64(6) で保存)。
session_idstringゲームセッション識別子。
player_idstring明示的なプレイヤー識別子。SDK が収集する唯一の PII。COPPA モードではクリアされます。
map_idstring空間分析用のマップ / レベル識別子。
build_idstringビルドバージョン。
platformstringエンジンが報告するプラットフォーム名(Unity は Application.platform、UE は IniPlatformName、Godot は OS.GetName())。
engine_versionstringエンジンバージョン(Unity は Application.unityVersion、UE は FEngineVersion、Godot は Engine.GetVersionInfo()["string"])。
sourceenumイベントの発生源: player / automated / unspecified
フィールド説明
positionVector3(x, y, z の float)ワールド空間の位置。position_x / position_y / position_z として保存。
camera_yawfloat(任意)カメラの水平回転(度)。0 = 北、時計回り、範囲 [0, 360)。SDK がカメラを取得しない場合は存在しません。
camera_pitchfloat(任意)カメラの垂直回転(度)。-90 = 真下、+90 = 真上。

camera_yawcamera_pitch は両方同時に送信されるか、まったく送信されないかのいずれかです。値が無い場合は 0 ではなく「未取得」を意味します。

SDK が自動収集します。特に 10 秒ごとに送信される perf_heartbeat イベントで送られます:

フィールド単位 / 備考
fpsfloatフレーム毎秒
frame_time_msfloatミリ秒
gpu_time_msfloatミリ秒
game_thread_msfloatCPU ゲームスレッド時間(ms)。0 = 未収集
render_thread_msfloatCPU レンダースレッド時間(ms)。0 = 未収集
memory_used_bytesint64バイト

ロード時間とディスク I/O メトリクス

Section titled “ロード時間とディスク I/O メトリクス”

Unity SDK 0.1.3、UE5 SDK 0.1.6、Godot SDK 0.1.4 で、自動収集されるパフォーマンス信号が 2 つ追加されました。 どちらも perf-diff(ビルド比較)のリグレッションゲートとダッシュボードのチャートに使われます。

  • map_loadBeginMapLoad / EndMapLoad または ReportMapLoad が、マップやレベルの読み込み完了時に送出する専用の自動イベント。metrics["load_time_ms"]attributes["map_name"] を持ち、意図的に map_id を空にして空間ヒートマップとアクティベーションゲートの対象外にしています。
  • io.read_bytes / io.read_time_ms / io.read_opsperf_heartbeatmetrics マップに、前回の heartbeat からの差分として付与されるディスク読み取りカウンター。実際にサンプルが取得できてから初めて現れます。自動ソースは、Unity では Editor / Development Build のみ(AsyncReadManagerMetrics)、UE5 ではオプトイン(bTrackDiskIo)、Godot では手動のみ(ReportIoSample)です。

エンジンごとの API とスレッドの扱いは、各 SDK ガイドを参照してください。

対応 SDK は、メモリカテゴリ別の使用量を mem.* メトリクスとして perf_heartbeat と位置情報付きイベントに付与します。 利用できるキーと収集方法はエンジンごとに異なります。

  • UE5 SDK 0.1.7 以降mem.vram と、LLM に依存する mem.textures / mem.meshes / mem.audio。いずれもオプトイン(bTrackMemoryDetail、既定はオフ)で、mem.vram は LLM 不要ですがヘッドレス / -nullrhi 実行では付与されません(0 ではなくキーなし)。
  • Unity SDK 0.1.4 以降mem.vrammem.heap。オプトイン不要で自動収集されます。
  • Godot SDK 0.1.5 以降mem.vrammem.texturesmem.buffers。オプトイン不要で自動収集されます。

いずれも metrics マップに載り、追跡されていないカテゴリはキー自体が現れません(未収集を意味し、収集された 0 とは区別されます)。 mem.vram は perf-diff(ビルド比較)の比較対象メトリクスでもあります。 エンジンごとの詳細は UE5 SDKUnity SDKGodot SDK の各ガイドを参照してください。

ゲーム固有のコンテキストは 2 つの柔軟なマップで送信され、スキーマ変更は不要です:

フィールド説明
attributesmap<string, string>文字列のキーバリュー。例: weapon: "rifle"。COPPA モードでは丸ごと破棄されます。
metricsmap<string, double>数値の測定値。例: damage: 42.5

取り込みパイプラインはデコード後の各イベントを検証します。バッチ内の 1 イベントでも上限外の場合、経路によってリクエスト時に拒否されるか、非同期処理中にバッチ全体が破棄されます。独自 SDK や生 Protobuf 送信では、flush 前に値をクランプしてください。公式 Unity / UE5 / Godot SDK はクライアント側でこれらのクランプを適用します。

フィールド上限
timestamp_us過去 30 日以内、かつ未来 48 時間以内。
event_name / session_id必須かつ空文字不可。event_name は最大 128 文字、session_id は最大 64 文字。
player_id, map_id, build_idそれぞれ最大 128 文字。
source, platform, engine_versionそれぞれ最大 64 文字。
position_x / position_y / position_z有限数で、絶対値は 1e9 以下。
fps0 から 1000 までの有限数。
frame_time_ms / gpu_time_ms / game_thread_ms / render_thread_ms0 から 10000 までの有限ミリ秒値。
memory_used_bytes0 から 64 GiB までの整数。
attributes最大 50 entries。key は最大 64 文字、value は最大 512 文字。
metrics最大 50 entries。key は最大 64 文字、value は有限数。
camera_yaw / camera_pitch両方存在するか、両方省略。yaw は [0, 360)、pitch は [-90, 90] に正規化されます。

SDK は TelemetryBatchGameTelemetryEvent のリスト)を送信します。API キーと SDK バージョンはペイロード本文ではなく HTTP ヘッダー(X-API-KeyX-SDK-Version)で送信されます。

独自送信クライアントでは、送信時の HTTP リクエスト本文(gzip 圧縮を使う場合は圧縮後)を 126,000 bytes 以下にしてください。本番取り込みでは、これを超える本文は 413 で拒否されます。公式 SDK はこの上限より十分小さいサイズで flush します。