Skip to content

Realtime Communication Logs

The realtime communication layer is built on Centrifuge for WebSocket bidirectional communication. All client interactions are handled through RPC Handlers. These logs cover connection management, RPC call chains, and HTTP requests.

EventTriggerKey Fields
[Centrifuge] OnConnecting startedClient initiates connectionclient_id, transport
[Centrifuge] OnConnecting succeededConnection authentication successfulclient_id, user_id
[Centrifuge] JWT verification failed, rejecting connectionJWT verification failedclient_id, error
[Centrifuge] OnConnect startedConnection establishedclient_id
[Centrifuge] client connectedClient connection readyclient_id, user_id
[Centrifuge] OnConnect panicConnection handling exceptionpanic, stack
CheckOrigin: origin allowedCORS check passedorigin
CheckOrigin: origin NOT allowedCORS check rejectedorigin
EventTriggerKey Fields
[RPC] ->RPC request receivedmethod, user, device
[RPC] <- okRPC response successfulmethod, elapsed
[RPC] <- errRPC response failedmethod, error, elapsed
[RPC] marshal response failedRPC response serialization failedmethod, error
RPC handler returned non-API errorRPC handler returned unexpected errormethod, error
EventTriggerKey Fields
HTTP requestRequest successful (2xx/3xx)method, path, status, duration, trace_id
HTTP request client errorClient error (4xx)method, path, status, duration, trace_id, error_response
HTTP request failedServer error (5xx)method, path, status, duration, trace_id, error_response
WebSocket upgrade request completedWebSocket upgrade requestmethod, path, duration, trace_id
EventTriggerKey Fields
Readyz: DB check failedDatabase health check failederror
Readyz: Redis check failedRedis health check failederror
Readyz: Centrifuge check failedCentrifuge health check failederror
Readyz check failedOverall health check failedchecks
EventTriggerKey Fields
authorization_code authentication succeededOAuth2 login successfulprovider, user_id
refresh_token refresh succeededToken refresh successfuluser_id
ExchangeCode failedAuthorization code exchange failedprovider, error
findOrCreateUser: concurrent create detectedConcurrent user creation conflict (auto-handled)provider, external_id
EventDescription
pubsub message missing meta/data separatorPubSub message format anomaly
pubsub message invalid meta formatMetadata parsing failed
failed to handle publication for channelMessage handling failed
failed to handle join for channelJoin event handling failed
failed to handle leave for channelLeave event handling failed
EventTriggerKey Fields
[UpdatePublisher] published updateUpdate push successfulchannel, update_type
[UpdatePublisher] push failedPush failed (data already committed)error
[UpdatePublisher] publish to centrifuge failedCentrifuge publish failederror
[UpdatePublisher] saved user_updatesUser updates persistedcount
{service="server"} | json | msg=~"\\[Centrifuge\\] (OnConnecting|OnConnect|client connected|JWT verification failed)"

Trace connection chain for a specific client

Section titled “Trace connection chain for a specific client”
{service="server"} | json client_id="client_id" | msg=~"\\[Centrifuge\\]" | client_id="client-xyz"
{service="server"} | json | msg="[Centrifuge] JWT verification failed, rejecting connection"

View users with the most active connections

Section titled “View users with the most active connections”
topk(10, count by (user_id) ({service="server"} | json user_id="user_id" | msg="[Centrifuge] client connected"))
{service="server"} | json method="method" | msg=~"\\[RPC\\] (->|<-)" | method="SendMessage"
{service="server"} | json elapsed="elapsed", method="method" | msg="[RPC] <- ok"
{service="server"} | json method="method", error="error" | msg="[RPC] <- err"
topk(10,
count by (method) ({service="server"} | json method="method" | msg="[RPC] <- err")
/
count by (method) ({service="server"} | json method="method" | msg=~"\\[RPC\\] <- (ok|err)")
)
{service="server"} | json elapsed="elapsed" | msg="[RPC] <- ok" | elapsed > 1000
{service="server"} | json | msg="HTTP request failed"
{service="server"} | json path="path" | msg=~"HTTP request" | path=~"/api/.*"
{service="server"} | json duration="duration" | msg="HTTP request"
sum by (path) (count_over_time({service="server"} | json path="path" | msg="HTTP request"[1m]))
{service="server"} | json | msg=~"Readyz.*failed"
{service="server"} | json | msg=~"(authorization_code|refresh_token).*succeeded"
{service="server"} | json | msg=~"(ExchangeCode|failed to).*(failed|error)"
{service="server"} | json | msg=~"\\[UpdatePublisher\\].*failed"
{service="server"} | msg=~"pubsub message|failed to handle (publication|join|leave)"
{service="server"} | json origin="origin" | msg="CheckOrigin: origin NOT allowed"

HTTP logs automatically include trace_id, which can be used with Tempo:

{service="server"} | json trace_id="trace_id", path="path" | msg="HTTP request failed" | trace_id="abc123"

HTTP-related metrics are automatically exposed via middleware (standard Go HTTP metrics).

# HTTP request rate (by status code)
sum by (status) (rate(http_requests_total[5m]))
# HTTP request latency P95
histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le))
AlertConditionDescription
High HTTP 5xx rate5xx request ratio > 1%Server-side anomaly
High RPC error rateRPC error rate > 5%RPC handler anomaly
Health check failureReadyz check failed persistsDependency service unavailable
High WebSocket authentication failure rateJWT verification failure rate > 10%Possible attack or token expiration