magnificent-monitor-48407
12/27/2025, 7:58 PMtall-airline-16756
12/27/2025, 7:58 PMtall-airline-16756
12/27/2025, 7:59 PMparticipant_joined.
2. For testing, start egress then immediately connect a client (or a small automated client) to the room so egress sees a participant and begins recording.
3. If rooms are created/closed automatically, increase the room empty_timeout so the room stays available longer while egress and participants connect.
4. Verify egress can reach S3 and has valid credentials — this isn’t the root cause of the start-signal error, but required to successfully upload the file later.
Quick checks to share if you want me to dig deeper
• Did any participant join that room within ±1 minute of the egress start time? If so, paste the participant join timestamps or webhook events.
• Are you creating rooms via API or letting clients create them on join?
• Do you want a simple client script to auto-join the room immediately after egress starts for testing?
If you confirm participant join attempts (or share the join events), I’ll help trace why egress didn’t detect them.
Sources: Server-side | livekit/livekit_composite | DeepWiki | server-sdk-js | livekit/livekit_composite | DeepWiki | CreateRoom() is Taking Too Long | sip | livekit/livekit_composite | DeepWikimagnificent-monitor-48407
12/27/2025, 8:02 PMtall-airline-16756
12/27/2025, 8:02 PMstart_immediately, `room_name`/`room_id`, empty_timeout, source_type).
1. Logs
• From the LiveKit server: participant join event lines around the join time.
• From the egress worker: lines around egress start to the 412 error.
If you prefer, paste the three small log snippets (egress start, participant join, egress error with timestamps). I’ll look for missed signals (timing, missing published tracks, or event routing issues) and give the exact next step.
Sources: Universal Egress | server-sdk-js | livekit/livekit_composite | DeepWiki | CreateRoom() is Taking Too Long | Server-side | livekit/livekit_composite | DeepWikimagnificent-monitor-48407
12/27/2025, 8:03 PMtall-airline-16756
12/27/2025, 8:03 PMparticipant_joined for the room.
• If you have Redis logs showing pub/sub activity at those times, include them.
1. Egress request details
• How is egress being started in k8s? Provide the request payload fields: `room_name`/`room_id`, source_type, start_immediately, empty_timeout.
• Was egress started before or after the participant joined (timestamps)?
Quick checks you can run now
• Restart an egress pod and tail its logs while you trigger a participant join—see whether the egress logs show it receiving the join event.
• From inside the egress pod, run a small script or curl to list participants (if you have an admin endpoint) to confirm the pod can observe room state.
If you paste:
• the egress pod logs (start → error) and
• the LiveKit server participant join log lines (same timeframe) and
• the Redis connection env vars
I’ll analyze them and point to the exact misconfiguration (most likely Redis/ connectivity or event routing).magnificent-monitor-48407
12/27/2025, 8:05 PM2025-12-27T19:54:29.903Z INFO egress stats/monitor.go:145 cpu available: 2.000000 max cost: 4.000000 {"nodeID": "NE_F6wJcgynrENN", "clusterID": ""}
2025-12-27T19:54:29.911Z INFO egress server/server.go:155 service ready {"nodeID": "NE_F6wJcgynrENN", "clusterID": ""}
2025-12-27T19:56:59.401Z INFO egress server/server_rpc.go:59 request received {"nodeID": "NE_F6wJcgynrENN", "clusterID": "", "egressID": "EG_9J2qDbgScgqr"}
2025-12-27T19:56:59.402Z INFO egress server/server_rpc.go:69 request validated {"nodeID": "NE_F6wJcgynrENN", "clusterID": "", "egressID": "EG_9J2qDbgScgqr", "requestType": "room_composite", "sourceType": "EGRESS_SOURCE_TYPE_WEB", "outputType": "file", "room": "dispatch-audio-call-dcabc54d-0738-4792-a2f6-847eabd23c18", "request": {"RoomComposite":{"room_name":"dispatch-audio-call-dcabc54d-0738-4792-a2f6-847eabd23c18","audio_only":true,"Output":null,"Options":null,"file_outputs":[{"file_type":2,"filepath":"30175f6c-9219-40f9-893d-1ca4917d1c07/dcabc54d-0738-4792-a2f6-847eabd23c18.ogg","Output":{"S3":{"access_key":"{access_key}","secret":"{secret}","region":"us-east-1","bucket":"sandbox-featherhq-audio-recordings"}}}],"webhooks":[{"url":"<https://sandbox.featherhq.com/lk/webhook>","signing_key":"API25510e2982c030d7"}]}}}
2025-12-27T19:56:59.435Z INFO egress redis/redis.go:144 connecting to redis {"nodeID": "NE_F6wJcgynrENN", "handlerID": "EGH_nGiD6Tsscmfu", "clusterID": "", "egressID": "EG_9J2qDbgScgqr", "simple": true, "addr": "livekit-redis-sandbox-redis-headless.default.svc.cluster.local:6379"}
2025-12-27T19:57:01.227Z ERROR egress logging/handler.go:60 irectory {"nodeID": "NE_F6wJcgynrENN", "clusterID": "", "handlerID": "EGH_nGiD6Tsscmfu", "egressID": "EG_9J2qDbgScgqr"}
<http://github.com/livekit/egress/pkg/logging.NewHandlerLogger.func1|github.com/livekit/egress/pkg/logging.NewHandlerLogger.func1>
/workspace/pkg/logging/handler.go:60
<http://github.com/livekit/protocol/logger/medialogutils.(*CmdLogger).Write|github.com/livekit/protocol/logger/medialogutils.(*CmdLogger).Write>
/root/go/pkg/mod/github.com/livekit/protocol@v1.43.3-0.20251202235353-eec8df247cf9/logger/medialogutils/cmd.go:29
io.copyBuffer
/root/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.24.3.linux-amd64/src/io/io.go:431
io.Copy
/root/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.24.3.linux-amd64/src/io/io.go:388
os.genericWriteTo
/root/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.24.3.linux-amd64/src/os/file.go:275
os.(*File).WriteTo
/root/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.24.3.linux-amd64/src/os/file.go:253
io.copyBuffer
/root/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.24.3.linux-amd64/src/io/io.go:411
io.Copy
/root/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.24.3.linux-amd64/src/io/io.go:388
os/exec.(*Cmd).writerDescriptor.func1
/root/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.24.3.linux-amd64/src/os/exec/exec.go:596
os/exec.(*Cmd).Start.func2
/root/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.24.3.linux-amd64/src/os/exec/exec.go:749
2025-12-27T19:57:01.377Z INFO egress source/web.go:328 chrome: END_RECORDING {"nodeID": "NE_F6wJcgynrENN", "handlerID": "EGH_nGiD6Tsscmfu", "clusterID": "", "egressID": "EG_9J2qDbgScgqr"}
2025-12-27T19:57:02.150Z INFO egress info/io.go:269 egress_aborted {"nodeID": "NE_F6wJcgynrENN", "clusterID": "", "egressID": "EG_9J2qDbgScgqr", "requestType": "room_composite", "outputType": "file", "error": "Start signal not received", "code": 412, "details": "End reason: Source closed"}
2025-12-27T20:01:20.233Z INFO egress server/server_rpc.go:59 request received {"nodeID": "NE_F6wJcgynrENN", "clusterID": "", "egressID": "EG_uWowiW7VPgwZ"}
2025-12-27T20:01:20.234Z INFO egress server/server_rpc.go:69 request validated {"nodeID": "NE_F6wJcgynrENN", "clusterID": "", "egressID": "EG_uWowiW7VPgwZ", "requestType": "room_composite", "sourceType": "EGRESS_SOURCE_TYPE_WEB", "outputType": "file", "room": "dispatch-audio-call-06072aaa-7bda-484a-9fda-93bb2b301a52", "request": {"RoomComposite":{"room_name":"dispatch-audio-call-06072aaa-7bda-484a-9fda-93bb2b301a52","audio_only":true,"Output":null,"Options":null,"file_outputs":[{"file_type":2,"filepath":"30175f6c-9219-40f9-893d-1ca4917d1c07/06072aaa-7bda-484a-9fda-93bb2b301a52.ogg","Output":{"S3":{"access_key":"{access_key}","secret":"{secret}","region":"us-east-1","bucket":"sandbox-featherhq-audio-recordings"}}}],"webhooks":[{"url":"<https://sandbox.featherhq.com/lk/webhook>","signing_key":"API25510e2982c030d7"}]}}}
2025-12-27T20:01:20.271Z INFO egress redis/redis.go:144 connecting to redis {"nodeID": "NE_F6wJcgynrENN", "handlerID": "EGH_uftJKZmsrh9d", "clusterID": "", "egressID": "EG_uWowiW7VPgwZ", "simple": true, "addr": "livekit-redis-sandbox-redis-headless.default.svc.cluster.local:6379"}
2025-12-27T20:01:21.483Z INFO egress source/web.go:328 chrome: END_RECORDING {"nodeID": "NE_F6wJcgynrENN", "handlerID": "EGH_uftJKZmsrh9d", "clusterID": "", "egressID": "EG_uWowiW7VPgwZ"}
2025-12-27T20:01:21.632Z INFO egress info/io.go:269 egress_aborted {"nodeID": "NE_F6wJcgynrENN", "clusterID": "", "egressID": "EG_uWowiW7VPgwZ", "requestType": "room_composite", "outputType": "file", "error": "Start signal not received", "code": 412, "details": "End reason: Source closed"}tall-airline-16756
12/27/2025, 8:06 PMparticipant_joined line(s) with timestamps that match the egress attempt (around 2025-12-27T195659–195702 and 200120–200122).
1. Check for duplicate/mismatched Redis
• Ensure LiveKit server and egress pods are using the exact same Redis host/port/password (show the REDIS_ADDR/REDIS_URL env from both the LiveKit server pod and the egress pod; mask secrets).
1. Reproduce with live tails
• Restart one egress pod, then tail its logs while you cause a participant to join. Paste the egress log lines from pod start → join → outcome.
Quick mitigations to try now
• If participant was already in room before you started egress, restart egress with start_immediately: true.
• Temporarily increase any empty_timeout or start egress after confirming the participant is present.
• If you suspect network policies/Service DNS, try port-forwarding the Redis service to your local machine and test connectivity from the egress pod.
If you paste the redis-cli PING, the LiveKit participant_joined log lines, and the REDIS env values from both server and egress pods, I’ll analyze them and point to the exact misconfiguration.