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.
Event Trigger Key Fields [Centrifuge] OnConnecting startedClient initiates connection client_id, transport[Centrifuge] OnConnecting succeededConnection authentication successful client_id, user_id[Centrifuge] JWT verification failed, rejecting connectionJWT verification failed client_id, error[Centrifuge] OnConnect startedConnection established client_id[Centrifuge] client connectedClient connection ready client_id, user_id[Centrifuge] OnConnect panicConnection handling exception panic, stackCheckOrigin: origin allowedCORS check passed originCheckOrigin: origin NOT allowedCORS check rejected origin
Event Trigger Key Fields [RPC] ->RPC request received method, user, device[RPC] <- okRPC response successful method, elapsed[RPC] <- errRPC response failed method, error, elapsed[RPC] marshal response failedRPC response serialization failed method, errorRPC handler returned non-API errorRPC handler returned unexpected error method, error
Event Trigger Key Fields HTTP requestRequest successful (2xx/3xx) method, path, status, duration, trace_idHTTP request client errorClient error (4xx) method, path, status, duration, trace_id, error_responseHTTP request failedServer error (5xx) method, path, status, duration, trace_id, error_responseWebSocket upgrade request completedWebSocket upgrade request method, path, duration, trace_id
Event Trigger Key Fields Readyz: DB check failedDatabase health check failed errorReadyz: Redis check failedRedis health check failed errorReadyz: Centrifuge check failedCentrifuge health check failed errorReadyz check failedOverall health check failed checks
Event Trigger Key Fields authorization_code authentication succeededOAuth2 login successful provider, user_idrefresh_token refresh succeededToken refresh successful user_idExchangeCode failedAuthorization code exchange failed provider, errorfindOrCreateUser: concurrent create detectedConcurrent user creation conflict (auto-handled) provider, external_id
Event Description 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
Event Trigger Key Fields [UpdatePublisher] published updateUpdate push successful channel, update_type[UpdatePublisher] push failedPush failed (data already committed) error[UpdatePublisher] publish to centrifuge failedCentrifuge publish failed error[UpdatePublisher] saved user_updatesUser updates persisted count
{service="server"} | json | msg=~"\\[Centrifuge\\] (OnConnecting|OnConnect|client connected|JWT verification failed)"
{service="server"} | json client_id="client_id" | msg=~"\\[Centrifuge\\]" | client_id="client-xyz"
{service="server"} | json | msg="[Centrifuge] JWT verification failed, rejecting connection"
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"
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))
Alert Condition Description High HTTP 5xx rate 5xx request ratio > 1% Server-side anomaly High RPC error rate RPC error rate > 5% RPC handler anomaly Health check failure Readyz check failed persistsDependency service unavailable High WebSocket authentication failure rate JWT verification failure rate > 10% Possible attack or token expiration