Technical Dashboard
Monitor game performance, track errors and crashes, and maintain a healthy player experience.
Overview
The Technical Dashboard provides real-time visibility into your game's health:
- Health Score -- Composite metric based on stability and performance
- System Uptime -- Availability across your player base
- Performance Score -- FPS and memory efficiency
- Error Rates and Trends -- Error frequency over time
- Crash Rates and Trends -- Crash frequency and resolution tracking
- Error Analysis -- Patterns, categories, and root-cause grouping
Required Events
| Event | SDK Method | Auto-Tracked | Priority |
|---|---|---|---|
| FPS samples | GRMetricsCollector | Yes | Required |
| Memory samples | GRMetricsCollector | Yes | Required |
log (errors) | TrackLog() | No | Recommended |
log (crashes) | TrackLog() | No | Recommended |
FPS and memory are tracked automatically by the GRMetricsCollector component, which the SDK creates on successful initialization. Error and crash logging requires manual instrumentation.
Event Implementation
Performance Metrics (Automatic)
The GRMetricsCollector MonoBehaviour is auto-created as a hidden, persistent GameObject after Initialize() succeeds. It records:
- FPS -- Every frame via
GameRebellion.RecordFrame(fps). - Memory -- Sampled locally at a configurable interval (default 0.5s) via
GameRebellion.RecordMemory(memoryMB). Metrics are sent to the server once per 30 seconds (controlled by the batch flush interval).
You can customize its behavior by adding it manually to a GameObject:
var collector = gameObject.AddComponent<GRMetricsCollector>();
collector.trackFPS = true;
collector.trackMemory = true;
collector.memorySampleInterval = 0.5f; // seconds between memory samples
collector.logMetrics = false; // set true to print metrics to console
collector.logInterval = 5f; // seconds between console logs
Error Tracking
Track application errors to power the Error Timeline and Error Analysis panels.
using GameRebellionSdk.Unity;
// Network error
GameRebellion.TrackLog(new GrLogEvent
{
Type = "error",
Category = "network",
Message = "API request failed: 503 Service Unavailable",
ErrorCode = "HTTP_503",
FeatureName = "leaderboard",
MethodName = "FetchLeaderboard",
IsUserAffected = true
});
// Gameplay error
GameRebellion.TrackLog(new GrLogEvent
{
Type = "error",
Category = "gameplay",
Message = "Invalid item reference in inventory",
ErrorCode = "ITEM_NOT_FOUND",
ErrorDomain = "inventory_system",
FeatureName = "inventory"
});
Crash Tracking
Log unhandled exceptions and crashes for the Crash Timeline panel.
// Hook into Unity's unhandled exception handler
Application.logMessageReceived += (message, stackTrace, type) =>
{
if (type == LogType.Exception)
{
GameRebellion.TrackLog(new GrLogEvent
{
Type = "crash",
Category = "unhandled_exception",
Message = message,
StackTrace = stackTrace,
ExceptionType = "UnhandledException",
IsUserAffected = true
});
}
};
Warning / Debug Logs
For non-critical issues that you want to track patterns on:
GameRebellion.TrackLog(new GrLogEvent
{
Type = "warning",
Category = "performance",
Message = "Frame drop detected: 8 FPS for 2 seconds",
FeatureName = "rendering"
});
GrLogEvent Fields
| Field | Type | Required | Description |
|---|---|---|---|
Type | string | Yes | Severity: "error", "crash", "warning", "info", "debug". |
Category | string | No | Grouping (e.g., "network", "gameplay", "rendering"). |
Message | string | No | Human-readable description. |
Description | string | No | Additional context. |
ErrorCode | string | No | Machine-readable error code. |
ErrorDomain | string | No | System or module where the error originated. |
FeatureName | string | No | Feature affected by the issue. |
StackTrace | string | No | Stack trace for debugging. |
ExceptionType | string | No | Exception class name. |
MethodName | string | No | Method where the error occurred. |
LineNumber | double? | No | Source line number. |
ThreadId | string | No | Thread identifier. |
IsUserAffected | bool? | No | Whether the issue impacted the player's experience. |
Metrics Unlocked
| Metric | Description | Event Source |
|---|---|---|
| Health Score | Composite stability metric | All technical events |
| System Uptime | Availability percentage | Sessions + crash data |
| Performance Score | FPS and memory efficiency | FPS + memory samples |
| Error Rate | Errors per session | log (type: error) |
| Error Timeline | Error frequency over time | log (type: error) |
| Error Analysis | Grouped by category, code, feature | log (type: error) |
| Crash Rate | Crashes per session | log (type: crash) |
| Crash Timeline | Crash frequency over time | log (type: crash) |
| Resolution Time | Time to fix issues (tracked over deploys) | log events |
| Technical Issues | Active issues list | All log events |
Best Practices
- Categorize consistently. Use a fixed set of categories (
"network","gameplay","rendering","audio","storage") so the Error Analysis panel can group issues meaningfully. - Include error codes. Machine-readable codes (
"HTTP_503","ITEM_NOT_FOUND") enable automated grouping and alerting. - Track user impact. Set
IsUserAffected = truewhen the error degrades the player experience. This helps prioritize fixes. - Hook into Unity's exception handler. The
Application.logMessageReceivedcallback captures unhandled exceptions that would otherwise go untracked. - Avoid logging high-frequency debug events in production. Use
Type = "debug"sparingly to prevent noise in your dashboard.
Implementation Checklist
- SDK initialized (FPS + memory tracked automatically)
-
TrackLog()added for caught errors with category and error codes - Unhandled exception handler connected via
Application.logMessageReceived - Consistent category and error code naming convention established