Saliya Samarawickrama
03/12/2026, 9:36 AM2026-03-12T09:20:44.817436+0000 | fastapi_websocket_rpc.websocket_rpc_e...| INFO | Client disconnected - 43490 :: d78ae83fc0b4447a98a544a81f7465e0
2026-03-12T09:20:44.817686+0000 | websockets.legacy.server | INFO | connection closed
2026-03-12T09:20:44.889455+0000 | fastapi_websocket_rpc.websocket_rpc_e...| INFO | Client connected
2026-03-12T09:20:44.889886+0000 | websockets.legacy.server | INFO | connection open
2026-03-12T09:20:44.894689+0000 | fastapi_websocket_rpc.websocket_rpc_e...| INFO | Client disconnected - 39376 :: dee642b8daa4491a8ba991f19a80b981
2026-03-12T09:20:44.894872+0000 | websockets.legacy.server | INFO | connection closed
2026-03-12T09:20:46.382346+0000 | fastapi_websocket_rpc.websocket_rpc_e...| INFO | Client connected
2026-03-12T09:20:46.382868+0000 | websockets.legacy.server | INFO | connection open
2026-03-12T09:20:46.388795+0000 | fastapi_websocket_rpc.websocket_rpc_e...| INFO | Client disconnected - 37782 :: 44457ab56137481e9fb742fd39fe10b0
2026-03-12T09:20:46.389028+0000 | websockets.legacy.server | INFO | connection closed
2026-03-12T09:20:47.124470+0000 | fastapi_websocket_rpc.websocket_rpc_e...| INFO | Client connected
OPAL client log:
File "/usr/local/lib/python3.10/site-packages/fastapi_websocket_rpc/rpc_channel.py", line 433, in async_call
await self.send(msg)
ā ā ā RpcMessage(request=RpcRequest(method='_ping_', arguments={}, call_id='5369bcdcc34a4b4a9c32e3837ddec06a'), response=None)
ā ā <function RpcChannel.send at 0x7c45cc2e69e0>
ā <fastapi_websocket_rpc.rpc_channel.RpcChannel object at 0x7c45c541a890>
File "/usr/local/lib/python3.10/site-packages/fastapi_websocket_rpc/rpc_channel.py", line 211, in send
await self.socket.send(data)
ā ā ā ā RpcMessage(request=RpcRequest(method='_ping_', arguments={}, call_id='5369bcdcc34a4b4a9c32e3837ddec06a'), response=None)
ā ā ā <function JsonSerializingWebSocket.send at 0x7c45cc2e7c70>
ā ā <fastapi_websocket_rpc.simplewebsocket.JsonSerializingWebSocket object at 0x7c45c54183d0>
ā <fastapi_websocket_rpc.rpc_channel.RpcChannel object at 0x7c45c541a890>
File "/usr/local/lib/python3.10/site-packages/fastapi_websocket_rpc/simplewebsocket.py", line 44, in send
await self._websocket.send(self._serialize(msg))
ā ā ā ā ā ā RpcMessage(request=RpcRequest(method='_ping_', arguments={}, call_id='5369bcdcc34a4b4a9c32e3837ddec06a'), response=None)
ā ā ā ā ā <function JsonSerializingWebSocket._serialize at 0x7c45cc2e7b50>
ā ā ā ā <fastapi_websocket_rpc.simplewebsocket.JsonSerializingWebSocket object at 0x7c45c54183d0>
ā ā ā <function WebSocketsClientHandler.send at 0x7c45cc2fc280>
ā ā <fastapi_websocket_rpc.websocket_rpc_client.WebSocketsClientHandler object at 0x7c45c753c280>
ā <fastapi_websocket_rpc.simplewebsocket.JsonSerializingWebSocket object at 0x7c45c54183d0>
File "/usr/local/lib/python3.10/site-packages/fastapi_websocket_rpc/websocket_rpc_client.py", line 147, in send
await self._websocket.send(msg)
ā ā ā ā '{"request": {"method": "_ping_", "arguments": {}, "call_id": "5369bcdcc34a4b4a9c32e3837ddec06a"}, "response": null}'
ā ā ā <function Connection.send at 0x7c45c754cd30>
ā ā <websockets.asyncio.client.ClientConnection object at 0x7c45c547c790>
ā <fastapi_websocket_rpc.websocket_rpc_client.WebSocketsClientHandler object at 0x7c45c753c280>
File "/usr/local/lib/python3.10/site-packages/websockets/asyncio/connection.py", line 476, in send
async with self.send_context():
ā ā <function Connection.send_context at 0x7c45c754d360>
ā <websockets.asyncio.client.ClientConnection object at 0x7c45c547c790>
File "/usr/local/lib/python3.10/contextlib.py", line 199, in __aenter__
return await anext(self.gen)
ā ā <async_generator object Connection.send_context at 0x7c45c75f5fc0>
ā <contextlib._AsyncGeneratorContextManager object at 0x7c45c541aaa0>
File "/usr/local/lib/python3.10/site-packages/websockets/asyncio/connection.py", line 957, in send_context
raise self.protocol.close_exc from original_exc
ā ā ā ā None
ā ā ā <property object at 0x7c45c7e9f830>
ā ā <websockets.client.ClientProtocol object at 0x7c45c547c6d0>
ā <websockets.asyncio.client.ClientConnection object at 0x7c45c547c790>
websockets.exceptions.ConnectionClosedOK: received 1000 (OK); then sent 1000 (OK)
2026-03-12T09:21:48.511830+0000 | opal_client.policy_store.opa_client |WARNING | OPA client health: False (policy: False, data: False)
2026-03-12T09:21:48.512277+0000 | uvicorn.protocols.http.httptools_impl | INFO | 10.246.16.157:55704 - "GET /healthcheck HTTP/1.1" 503
2026-03-12T09:21:52.514744+0000 | opal_client.policy_store.opa_client |WARNING | OPA client health: False (policy: False, data: False)
2026-03-12T09:21:52.515261+0000 | uvicorn.protocols.http.httptools_impl | INFO | 10.246.16.157:57878 - "GET /healthcheck HTTP/1.1" 503
2026-03-12T09:22:04.668932+0000 | opal_client.policy_store.opa_client |WARNING | OPA client health: False (policy: False, data: False)
2026-03-12T09:22:04.669366+0000 | uvicorn.protocols.http.httptools_impl | INFO | 10.246.16.157:54528 - "GET /healthcheck HTTP/1.1" 503
2026-03-12T09:22:04.672225+0000 | opal_client.policy_store.opa_client |WARNING | OPA client health: False (policy: False, data: False)
2026-03-12T09:22:04.672794+0000 | uvicorn.protocols.http.httptools_impl | INFO | 10.246.16.157:54536 - "GET /healthcheck HTTP/1.1" 503
2026-03-12T09:22:19.672953+0000 | opal_client.policy_store.opa_client |WARNING | OPA client health: False (policy: False, data: False)
2026-03-12T09:22:19.673463+0000 | uvicorn.protocols.http.httptools_impl | INFO | 10.246.16.157:44232 - "GET /healthcheck HTTP/1.1" 503
2026-03-12T09:22:34.672830+0000 | opal_client.policy_store.opa_client |WARNING | OPA client health: False (policy: False, data: False)
2026-03-12T09:22:34.673382+0000 | uvicorn.protocols.http.httptools_impl | INFO | 10.246.16.157:35314 - "GET /healthcheck HTTP/1.1" 503Ask Inkeep
03/12/2026, 9:36 AMAsk Inkeep
03/12/2026, 9:36 AMConnectionClosedOK: received 1000 (OK)) during ping operations, followed by health check failures. The server logs show rapid connect/disconnect cycles.
This intermittent connection issue between OPAL server and client can have several causes:
ā*Network/Infrastructure Considerations:*ā
⢠WebSocket connection stability in Kubernetes can be affected by load balancers, ingress controllers, or network policies that don't properly handle long-lived connections
⢠GCP-specific networking configurations or firewall rules may be intermittently dropping connections
⢠Resource constraints (CPU/memory) on either server or client pods could cause connection handling issues
ā*Configuration to Review:*ā
Check your broadcast channel configuration. OPAL uses Redis or PostgreSQL for pub/sub communication. (1) Ensure your OPAL_BROADCAST_URI is properly configured and the backing service (Redis/PostgreSQL) is stable.
Review timeout settings:
⢠PDP_CONTROL_PLANE_TIMEOUT (default: 75 seconds) controls timeout for control plane requests
⢠Connection keepalive settings may need adjustment for your environment
ā*Troubleshooting Steps:*ā
To help investigate further, please provide:
1. Which Workspace / Project / Env you are using
2. What calls are the OPAL client and server performing (configuration snippets or CURL examples)
3. Which PDP version you are running
4. Complete logs from both OPAL server and client during a failure event, including any earlier connection establishment logs
ā*Additional Information Needed:*ā
⢠Your Helm chart configuration for OPAL server and client
⢠Redis/PostgreSQL configuration and health status
⢠Kubernetes service and ingress configurations
⢠Any recent infrastructure or configuration changes
The fact that restarting the OPAL server resolves the issue temporarily suggests a state or resource accumulation problem rather than a fundamental configuration error.Ask Inkeep
03/12/2026, 9:36 AMOr Weis
03/12/2026, 9:53 AMSaliya Samarawickrama
03/12/2026, 10:09 AMDavid Rennalls
03/20/2026, 10:27 PMpermit support automation2
03/20/2026, 10:27 PM