Bigquery table schemas

October 22, 2025 ยท View on GitHub

Network Next

Bigquery table schemas

Network Next writes data to bigquery so you can run data science and analytics queries.

For example, once every 10 seconds network performance data such as accelerated and non-accelerated latency (RTT), jitter, packet loss, bandwidth usage and out order packets for every session is written to bigquery.

At the end of each session a summary data entry is written, which makes it much faster and cheaper to query data on a per-session basis.

There is also data written each time a client pings relays at the start of each session, so you can look at direct ping results from clients to relays, and data from each server and relay in your fleet is sent so you can track their performance and uptime.

Data in bigquery is retained for 90 days by default to comply with GDPR. Within this dataset the "user hash" is considered pseudonymized data within the GDPR, and is personal data only if you have the ability to identify the player from the user hash plus other data that you have for this player. The client IP address and port are also considered personal data.

Schemas for all this data are described below.

Session Update

Session updates contain network performance data once every 10 seconds for a session. This is the primary network performance data, including everything shown in the portal for a session and much more.

FieldTypeDescription
timestampTIMESTAMPThe timestamp when the session update occurred
session_idINT64Unique identifier for this session
slice_numberINT64Slices are 10 second periods starting from slice number 0 at the start of the session
real_packet_lossFLOAT64Packet loss between the client and the server measured from game packets (%)
real_jitterFLOAT64Jitter between the client and the server measured from game packets (milliseconds)
real_out_of_orderFLOAT64Percentage of packets that arrive out of order between the client and the server (%)
session_eventsINT64Custom set of 64bit event flags. Optional. NULL if no flags are set
internal_eventsINT64Internal SDK event flags. Optional. NULL if no flags are set
direct_rttFLOAT64Latency between client and server as measured by direct pings (unaccelerated path). Milliseconds. IMPORTANT: Will be 0.0 on slice 0 always because it is not known yet
direct_jitterFLOAT64Jitter between client and server as measured by direct pings (unaccelerated path). Milliseconds. IMPORTANT: Will be 0.0 on slice 0 always because it is not known yet
direct_packet_lossFLOAT64Packet loss between client and server as measured by direct pings (unaccelerated path). Percent. Generally this is inaccurate and higher that real value, because direct pings are sent infrequently, any packet loss results in an outsized % of packet loss in a 10 second period.
direct_kbps_upINT64Bandwidth in the client to server direction along the direct path (unaccelerated). Kilobits per-second
direct_kbps_downINT64Bandwidth in the server to client direction along the direct path (unaccelerated). Kilobits per-second
nextBOOLTrue if this slice is being accelerated over network next
next_rttFLOAT64Latency between client and server as measured by next pings (accelerated path). Milliseconds. NULL if not on network next
next_jitterFLOAT64Jitter between client and server as measured by next pings (accelerated path). Milliseconds. NULL if not on network next
next_packet_lossFLOAT64Packet loss between client and server as measured by next pings (accelerated path). Percent. NULL if not on network next. Generally inaccurate and higher than real packet loss due to infrequent sending of ping packets
next_kbps_upFLOAT64Bandwidth in the client to server direction along the next path (accelerated). Kilobits per-second
next_kbps_downFLOAT64Bandwidth in the server to client direction along the next path (accelerated). Kilobits per-second
next_predicted_rttFLOAT64Conservative predicted latency between client and server from the control plane. Milliseconds. NULL if not on network next
next_route_relays[]INT64Array of relay ids for the network next path (accelerated). NULL if not on network next
fallback_to_directBOOLTrue if the SDK has encountered a fatal error and cannot continue acceleration. Typically this only happens when the system is misconfigured or overloaded.
reportedBOOLTrue if this session was reported by the player
latency_reductionBOOLTrue if this session took network next this slice to reduce latency
packet_loss_reductionBOOLTrue if this session took network next this slice to reduce packet loss
force_nextBOOLTrue if this session took network next this slice because it was forced to
long_session_updateBOOLTrue if the processing for this slice on the server backend took a long time. This may indicate that the server backend is overloaded.
vetoBOOLTrue if the routing logic decided that this session should no longer be accelerated for some reason.
disabledBOOLTrue if the buyer is disabled. Disabled buyers don't perform any acceleration or analytics on network next.
not_selectedBOOLIf the route shader selection % is any value other than 100%, then this is true for sessions that were not selected for acceleration.
aBOOLThis session was part of an AB test, and is in the A group. (potentially accelerated)
bBOOLThis session was part of an AB test, and is in the B group. (never accelerated)

Session Summary

A session summary is written at the end of each session, with the intent that if you want per-session data you can query it here, instead of needing to process all the 10 second slices belonging to that session to get the data you want.

FieldTypeDescription
timestampTIMESTAMPThe timestamp when the session summary was generated (at the end of the session).
session_idINT64Unique identifier for this session
datacenter_idINT64The datacenter the server is in
buyer_idINT64The buyer this session belongs to
user_hashINT64Pseudonymized hash of a unique user id passed up from the SDK
latitudeFLOAT64Approximate latitude of the player from ip2location
longitudeFLOAT64Approximate longitude of the player from ip2location
client_addressSTRINGAnonymized client address
server_addressSTRINGServer address and port number
connection_typeINT64Connection type: 0 = unknown, 1 = wired, 2 = wifi, 3 = cellular
platform_typeINT64Platform type: 0 = unknown, 1 = windows, 2 = mac, 3 = linux, 4 = switch, 5 = ps4, 6 = ios, 7 = xbox one, 8 = xbox series x, 9 = ps5
sdk_version_majorINT64The major SDK version on the server
sdk_version_minorINT64The minor SDK version on the server
sdk_version_patchINT64The patch SDK version on the server
client_to_server_packets_sentINT64The total number of game packets sent from client to server in this session
server_to_client_packets_sentINT64The total number of game packets sent from server to client in this session
client_to_server_packets_lostINT64The total number of game packets lost from client to server in this session
server_to_client_packets_lostINT64The total number of game packets lost from server to client in this session
client_to_server_packets_out_of_orderINT64The total number of game packets received out of order from client to server in this session
server_to_client_packets_out_of_orderINT64The total number of game packets received out of order from server to client in this session
total_next_envelope_bytes_upINT64The total number of envelope bytes sent across network next in the client to server direction for this session
total_next_envelope_bytes_downINT64The total number of envelope bytes sent across network next in the server to client direction for this session
duration_on_nextINT64Total time spent on network next in this session (time accelerated). Seconds
session_durationINT64Length of this session in seconds
start_timestampTIMESTAMPThe time when this session started
errorINT64Error flags to diagnose what's happening with a session. Look up SessionError_* in the codebase for a list of errors. 0 if no error has occurred.
reportedBOOLTrue if this session was reported by the player
latency_reductionBOOLTrue if this session took network next to reduce latency
packet_loss_reductionBOOLTrue if this session took network next to reduce packet loss
force_nextBOOLTrue if this session took network next because it was forced to
long_session_updateBOOLTrue if the processing for any slices in this session took a long time. This may indicate that the server backend is overloaded.
vetoBOOLTrue if the routing logic decided that this session should no longer be accelerated for some reason.
disabledBOOLTrue if the buyer is disabled. Disabled buyers don't perform any acceleration or analytics on network next.
not_selectedBOOLIf the route shader selection % is any value other than 100%, then this is true for sessions that were not selected for acceleration.
aBOOLThis session was part of an AB test, and is in the A group (potentially accelerated)
bBOOLThis session was part of an AB test, and is in the B group (never accelerated)

Server Init

Server init entries are added once when the server first connects with the Network Next backend. They are intended to let you quickly look up the datacenter name for servers, which is not included in the regular update.

FieldTypeDescription
timestampTIMESTAMPThe timestamp when the server init occurred
sdk_version_majorINT64The major SDK version number on the server
sdk_version_minorINT64The minor SDK version number on the server
sdk_version_patchINT64The patch SDK version number on the server
buyer_idINT64The buyer this server belongs to
datacenter_idINT64The datacenter this server is in
datacenter_nameSTRINGThe name of the datacenter, for example: 'google.iowa.1'
server_addressSTRINGThe address and port of the server, for example: '123.254.10.5:40000'

Server Update

This entry is updated once every 10 seconds while a server is running. The only value that changes is the number of sessions connected to the server, which you can use to track server utilization.

FieldTypeDescription
timestampTIMESTAMPThe timestamp when the server init occurred
sdk_version_majorINT64The major SDK version number on the server
sdk_version_minorINT64The minor SDK version number on the server
sdk_version_patchINT64The patch SDK version number on the server
buyer_idINT64The buyer this server belongs to
datacenter_idINT64The datacenter this server is in
server_addressSTRINGThe address and port of the server, for example: '123.254.10.5:40000'
num_sessionsINT64The number of client sessions currently connected to the server

Relay Update

This data is updated once every 10 seconds per-relay. It is useful for tracking the activity of your relay fleet, and identifying high and low performing relays.

FieldTypeDescription
timestampTIMESTAMPThe timestamp when the relay update occurred
relay_idINT64Unique relay id. The fnv1a hash of the relay address + port as a string
session_countINT64The number of sessions currently going through this relay
max_sessionsINT64The maximum number of sessions allowed through this relay (optional: NULL if not specified)
envelope_bandwidth_up_kbpsINT64The current amount of envelope bandwidth in the client to server direction through this relay
envelope_bandwidth_down_kbpsINT64The current amount of envelope bandwidth in the server to client direction through this relay
packets_sent_per_secondFLOAT64The number of packets sent per-second by this relay
packets_received_per_secondFLOAT64The number of packets received per-second by this relay
bandwidth_sent_kbpsFLOAT64The amount of bandwidth sent by this relay in kilobits per-second
bandwidth_received_kbpsFLOAT64The amount of bandwidth received by this relay in kilobits per-second
client_pings_per_secondFLOAT64The number of client relay pings received by this relay per-second
server_pings_per_secondFLOAT64The number of server relay pings received by this relay per-second
relay_pings_per_secondFLOAT64The number of relay pings sent from other relays received by this relay per-second
relay_flagsINT64The current value of the relay flags. See RelayFlags_* in the source code
num_routableINT64The number of other relays this relay can route to
num_unroutableINT64The number of other relays this relay cannot route to
start_timeINT64The start time of the relay as a unix timestamp according to the clock on the relay
current_timeINT64The start time of the relay as a unix timestamp according to the clock on the relay. Together with start_time and timestamp this can be used to determine relay uptime, and clock desynchronization between the relay and the backend.
relay_counters[]INT64Array of counters used to diagnose what is going on with a relay. Search for RELAY_COUNTER_ in the codebase for counter names

Client Relay Ping

These entries are written to bigquery at the start of each session when relays are pinged by the client.

FieldTypeDescription
timestampTIMESTAMPThe timestamp when the client relay ping occurred
buyer_idINT64The buyer this player belongs to
session_idINT64Unique id for the session
user_hashINT64Pseudonymized hash of a user id passed up from the SDK
latitudeFLOAT64Approximate latitude of the player from ip2location
longitudeFLOAT64Approximate longitude of the player from ip2location
client_addressSTRINGAnonymized client address
connection_typeINT64Connection type: 0 = unknown, 1 = wired, 2 = wifi, 3 = cellular
platform_typeINT64Platform type: 0 = unknown, 1 = windows, 2 = mac, 3 = linux, 4 = switch, 5 = ps4, 6 = ios, 7 = xbox one, 8 = xbox series x, 9 = ps5
client_relay_idINT64Relay id being pinged by the client
client_relay_rttINT64Round trip time ping between the client and the relay (milliseconds)
client_relay_jitterINT64Jitter between the client and the relay (milliseconds)
client_relay_packet_lossFLOAT64Packet loss between the client and the relay (%). Generally inaccurate and higher than true value because client relay pings are sent infrequently.

Server Relay Ping

These entries are written to bigquery at the start of each session contining pings between the server and destination relays in the same datacenter.

FieldTypeDescription
timestampTIMESTAMPThe timestamp when the server relay ping occurred
buyer_idINT64The buyer this player belongs to
session_idINT64Unique id for the session
datacenter_idINT64Unique id for the datacenter
server_addressSTRINGServer address and port number
server_relay_idINT64Relay id being pinged by the server
server_relay_rttINT64Round trip time ping between the server and the relay (milliseconds)
server_relay_jitterINT64Jitter between the server and the relay (milliseconds)
server_relay_packet_lossFLOAT64Packet loss between the server and the relay (%). Generally inaccurate and higher than true value because server relay pings are sent infrequently.

Route Matrix update

Updated once per-second with each route matrix updated. The route matrix is the core data structure used for route planning across relays. You can use this data to track the results of route optimization over time.

FieldTypeDescription
timestampTIMESTAMPThe timestamp when the route matrix update occurred
cost_matrix_sizeINT64The size of the cost matrix in bytes
route_matrix_sizeINT64The size of the route matrix in bytes
optimize_timeINT64Time it took produce this route matrix from the cost matrix (milliseconds)
num_relaysINT64The number of relays in the route matrix
num_active_relaysINT64The number of active relays in the relay manager
num_dest_relaysINT64The number of destination relays in the route matrix
num_datacentersINT64The number of datacenters in the route matrix
total_routesINT64The total number of routes in the route matrix
average_num_routesFLOAT64The average number of routes between any two relays
average_route_lengthFLOAT64The average number of relays per-route
no_route_percentFLOAT64The percent of relay pairs that have no route between them
one_route_percentFLOAT64The percent of relay pairs with only one route between them
no_direct_route_percentFLOAT64The percent of relay pairs with no direct route between them
rtt_bucket_no_improvementFLOAT64The percent of relay pairs with no improvement
rtt_bucket_0_5msFLOAT64The percent of relay pairs with 0-5ms reduction in latency
rtt_bucket_5_10msFLOAT64The percent of relay pairs with 5-10ms reduction in latency
rtt_bucket_10_15msFLOAT64The percent of relay pairs with 10-15ms reduction in latency
rtt_bucket_15_20msFLOAT64The percent of relay pairs with 15-20ms reduction in latency
rtt_bucket_20_25msFLOAT64The percent of relay pairs with 20-25ms reduction in latency
rtt_bucket_25_30msFLOAT64The percent of relay pairs with 25-30ms reduction in latency
rtt_bucket_30_35msFLOAT64The percent of relay pairs with 30-35ms reduction in latency
rtt_bucket_35_40msFLOAT64The percent of relay pairs with 35-40ms reduction in latency
rtt_bucket_40_45msFLOAT64The percent of relay pairs with 40-45ms reduction in latency
rtt_bucket_45_50msFLOAT64The percent of relay pairs with 45-50ms reduction in latency
rtt_bucket_50ms_plusFLOAT64The percent of relay pairs with 50ms+ reduction in latency

Relay to Relay Ping

This data is not uploaded by default because at 1000 relays the number of rows inserted is ~1 million per-second. However, in smaller relay fleets or dev the system can be modified to upload this data, which provides good visibility into intra-relay performance that you can analyze via bigquery data.

FieldTypeDescription
timestampTIMESTAMPThe timestamp when the relay ping occurred
source_relay_idINT64The id of the source relay
destination_relay_idINT64The id of the destination relay
rttINT64Round trip latency between the two relays (milliseconds)
jitterINT64Time variance in latency between the two relays (milliseconds)
packet_lossFLOAT64The packet loss between the two relays (%)

Back to main documentation