For the complete documentation index, see llms.txt. This page is also available as Markdown.

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

log_name
Trigger
Rate Limit

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 own AITVisibilityHelperbecause in WebGL, browser tab visibility is the real signal.

Parameters by event

All events include the common parameters below.

Parameter
Description

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

Parameter
Description
event_type

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

Parameter
Description

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

Item
Description

try-catch

Wrapping all handlers so logging failures do not stop the game

Reentry prevention

_isSending as a guard logMessageReceivedSendLog → 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.

Was this helpful?