Skip to main content

Debugging & Monitoring

NetRay provides built-in signals and utilities to help you understand its internal behavior, track down issues, and monitor performance.

Enabling Debug Mode​

To receive detailed logs and events from NetRay's debug signals, you first need to enable monitoring globally:

Do this early in your initialization script (client or server)

NetRay.Debug.EnableMonitoring({ enabled = true })

Optional: You might add logging levels later if needed

NetRay.Debug.EnableMonitoring({ enabled = true, level = "verbose" })
info

Simply enabling monitoring makes NetRay fire the signals. You still need to connect listeners to these signals to actually see or act upon the information.

Debug Signals​

Access signals under the NetRay.Debug table.

1. NetRay.Debug.GlobalEvent​

This signal fires for a wide range of internal library events, providing a trace of operations.

NetRay.Debug.GlobalEvent:Connect(function(context, signalName, ...)
-- context: "Server" or "Client"
-- signalName: Name of the internal signal that fired
-- ...: Arguments specific to that internal signal

local args = {...}
local argsString = ""
-- Basic serialization of args for printing
for i, v in ipairs(args) do
argsString = argsString .. tostring(v) .. (i < #args and ", " or "")
end

print(`[NetRay GLOBAL|${context}] ${signalName}(${argsString})`)
end)

Example Output:

[NetRay GLOBAL|Server] EventRegistered(PlayerAction)
[NetRay GLOBAL|Client] RequestSent(GetInventory, {userId=123})
[NetRay GLOBAL|Server] EventFired(PlayerAction, Player1, {...})
[NetRay GLOBAL|Client] ThrottleExceeded(burst, 21, 20)

Internal signals proxied through GlobalEvent include (but may not be limited to):

  • EventRegistered, EventFired
  • RequestSent, RequestReceived
  • RateLimitExceeded, ThrottleExceeded (Client/Server Manager specific signals)
  • CircuitBroken, CircuitReset (Circuit Breaker signals)
  • PlayerJoined, PlayerLeft (Server Manager signals)

2. NetRay.Debug.Error​

This signal fires when errors are caught within NetRay's core operations (e.g., middleware execution, message queue processing, internal pcalls).

NetRay.Debug.Error:Connect(function(context, source, ...)
-- context: "Server" or "Client"
-- source: Where the error originated (e.g., "Middleware", "ProcessMessage", "ServerManager", "ClientManager")
-- ...: Error message(s) or details

warn(`[NetRay ERROR|${context}] Source: ${tostring(source)} -`, ...)
end)

Example Output:

[NetRay ERROR|Client] Source: Middleware - [NetRay] Middleware error in 'BadValidator': attempt to index nil with 'userId'
[NetRay ERROR|Server] Source: ProcessMessage - Error processing queued message: ...

3. NetRay.Debug.NetworkTraffic​

Placeholder

The NetworkTraffic signal is currently defined but acts as a placeholder. It is not automatically connected to measure actual network bytes sent/received. Implementing this would require deeper hooks into the RemoteEvent/Function:Fire... calls or estimates based on serialized data sizes just before sending.

Example conceptual connection if traffic stats were implemented:

NetRay.Debug.NetworkTraffic:Connect(function(stats)
print("NetRay Traffic - Sent/s:", stats.bytesSentPerSec, "Recv/s:", stats.bytesReceivedPerSec)
end)

Monitoring Specific Components​

You can often access internal components for more targeted monitoring.

Circuit Breaker Signals​

Monitor state changes or failures for a specific endpoint.

local cb = NetRay:GetCircuitBreaker("MyRiskyRequest")
if cb then
cb.Signals.StateChanged:Connect(function(oldState, newState)
warn(("Circuit Breaker 'MyRiskyRequest' state: %s -> %s"):format(oldState, newState))
end)
cb.Signals.FailureRecorded:Connect(function()
print("Failure recorded for MyRiskyRequest circuit breaker.")
end)
end

Middleware Metrics​

Access performance metrics for the middleware system. (Accessing NetRay.Server/Client.Middleware depends on implementation details, might not be stable public API).

-- Server side example (Assuming access path is stable)
task.delay(60, function()
while true do
if NetRay.Server and NetRay.Server.Middleware then
local metrics = NetRay.Server.Middleware:GetMetrics()
print("--- Middleware Metrics (Server) ---")
print(" Executions:", metrics.totalExecutions)
print(" Avg Time (ms):", metrics.avgExecutionTime and (metrics.avgExecutionTime * 1000) or "N/A")
print(" Blocked:", metrics.blocked, " Errors:", metrics.errors)
print(" Cache Hits:", metrics.cacheHits, " Misses:", metrics.cacheMisses)
print("----------------------------------")
end
task.wait(60) -- Log every minute
end)
end

Example of Custom Event Handler with Debug Logging​

-- Example of custom event handler with debug logging
local myEvent = NetRay:RegisterEvent("PlayerAction", {
typeDefinition = { action = "string", data = "table" }
})

myEvent.OnServerEvent:Connect(function(player, action, data)
-- Basic debug logging
print("[Event] PlayerAction triggered by", player.Name)
print("Action:", action)
print("Data:", data)

-- More detailed logging
local args = {...}
local argsString = ""
-- Basic serialization of args for printing
for i, v in ipairs(args) do
argsString = argsString .. string.format("%s: %s", i, tostring(v))
if i < #args then
argsString = argsString .. ", "
end
end
print("[Debug] Event arguments:", argsString)

-- Process the event
processPlayerAction(player, action, data)
end)

Tips for Debugging​

  1. Enable Debug Monitoring: Start with NetRay.Debug.EnableMonitoring({ enabled = true }).
  2. Use GlobalEvent: Connect a listener to GlobalEvent to see the general flow of registrations, fires, and receives.
  3. Check for Errors: Monitor NetRay.Debug.Error for any internal issues caught by the library.
  4. Validate Types: If using type checking, ensure your definitions match the actual data being sent. Check warnings for validation failures.
  5. Middleware Issues: Add print() statements within your middleware functions to see the data at each stage and check if any middleware is incorrectly returning false.
  6. Circuit Breakers: Monitor the StateChanged signal of relevant circuit breakers if requests seem blocked unexpectedly. Use cb:GetMetrics().
  7. Client/Server Context: Pay attention to the context ("Client" or "Server") provided in the debug signals to know where the event originated.