SDK Event Logging
Summarizes the runtime events that the SDK automatically collects and sends to the platform without user code. This is not a document about what I should instrument, what is already being instrumentedis a document that checks it.
How is it enabled?
Runtime/Helpers/AIT.PerformanceLogger.csof AITPerformanceLoggeris [RuntimeInitializeOnLoadMethod(BeforeSceneLoad)]is automatically initialized. There is nothing to install or call.
Transmission is only in WebGL builds happens. In Unity Editor and other platforms, SendLogreturns immediately upon entry, so events are neither created nor sent. This is because the bridge exists only in WebGL builds.
All events' log_typeis unity_runtimeand the event type is log_namedistinguished by.
Event category
unity_scene_transition
SceneManager.sceneLoaded / sceneUnloaded
None
unity_first_interactive
Original first scene load complete
Once per session
unity_low_memory
Application.lowMemory
Once every 30 seconds
unity_error
Application.logMessageReceived (Error/Exception/Assert)
10 times per 60 seconds + deduplication
unity_lifecycle
AITVisibilityHelper.OnVisibilityChanged, Application.quitting
focus_changed: 1 time every 5 seconds
unity_frame_stall
Time.unscaledDeltaTime > 500ms
5 times per 60 seconds
unity_screen_change
Screen.width/height/orientation change detected
1 time every 2 seconds
unity_gc_collection
GC.CollectionCount(0) change detected
5 times per 60 seconds
unity_timescale_change
Time.timeScale change detected
1 time every 5 seconds
Polled net (frame_stall, screen_change, gc_collection, timescale_change) is a dedicated AITPerformanceLoggerMonitor GameObject's Updatechecks every frame. This object HideAndDontSave + DontDestroyOnLoadso it is not visible in the Hierarchy and survives scene transitions.
Note: focus events come from
Application.focusChangednot the SDK's ownAITVisibilityHelperbecause in WebGL, browser tab visibility is the real signal.
Parameters by event
All events include the common parameters below.
event_type
within the same log_name distinguish detailed types
time_since_start_sec
Elapsed time since app start (1 decimal place)
unity_first_interactivethe only exception time_since_start_sec instead time_since_start_msis used.
unity_scene_transition
event_type
scene_loaded or scene_unloaded
All
scene_name
Scene name
All
scene_build_index
Build Settings index
All
load_mode
Single or Additive
scene_loaded only
previous_scene
Name of the previously loaded Scene
scene_loaded only
total_loaded_scenes
Number of currently loaded Scenes (SceneManager.sceneCount)
All
unity_first_interactive
This event measures the moment when loading of the original first scene ends, that is, when the game actually becomes playable. It is sent only once per session.
There are two rules for determining the trigger.
AITProxyBootScenes starting with The proxy boot scene injected by the SDK is not the game's original first scene.The "first" is determined in the earliest target scene regardless of whether it is active. Even if logging is off, the flag is fixed in that scene, so scenes loaded later are not reported as first afterward.
Whether it is active is checked once via jslib for the value baked into the template at build time, and then cached. If the lookup fails, considered activeit is considered active (fail-open).
Note: The boot first scene load happens just before first-paint, so in builds without separate optimization, this value is almost the same as the first-paint time. If the gap between the two metrics widens, it is a sign that the first scene has become heavier.
unity_low_memory
unity_error
event_type
error, exception, assert
message
Error message (truncated at 500 characters)
stack_trace
Stack trace (truncated at 200 characters)
log_type
Unity LogType (Error, Exception, Assert)
Deduplication is based on message hash within a 60-second windowThe same message repeated within the window sends only the first one, and once the window passes the hash set is cleared and reported again. Even if the stack trace differs, the same message is treated as the same.
unity_lifecycle
total_scenes_loadedis the cumulative scene count loaded during the session, unity_scene_transitionof total_loaded_scenes(current simultaneous loaded count), a different value.
unity_frame_stall
The basis is Time.unscaledDeltaTime, not Time.deltaTime. Pause periods with Time.timeScale set to 0 are not captured as stalls.
unity_screen_change
If size and orientation change together, orientation_change only one is sent. Since rotation usually accompanies a size change, this prevents the two events from overlapping.
unity_gc_collection
Detection is only the gen0 counter change is observed. generation These gen*_totalare more reliable because they are cumulative since process start.
unity_timescale_change
Checking in the debug console
When the debug console is on, open the console with the button at the bottom left of the screen and Metrics you can view these events as-is in the tab. Because the event list and cumulative counts by category are shown, you can immediately verify whether instrumentation is running without looking at the platform dashboard.
The debug console is enabled by default in the Dev Server profile, and in other profiles too build profileof AIT_DEBUG_CONSOLE environment variable.
Note: The count table by category matches the above 8 category names as substrings.
unity_first_interactivedoes not match any of them, so it appears as a separate row at the bottom of the table. This is not missing data but a difference in classification.
Safeguards
try-catch
Wrapping all handlers so logging failures do not stop the game
Reentry prevention
_isSending as a guard logMessageReceived → SendLog → warning log → logMessageReceived Infinite loop prevention
Rate limiting
Prevents excessive sending with fixed per-category limits
String truncation
Cuts error messages and stack traces at a fixed length
Reentry guard is especially important. SendLogIn environments other than WebGL, Debug.LogWarningis not used for the same reason — if a warning is logged, that warning comes back through logMessageReceivedagain.
Related documents
build profile — Turn the debug console on and off
Sentry integration — Send errors to Sentry too
API usage patterns — Analytics API for sending events directly
Was this helpful?