From 42672121aac309d262ecf73ba897dbb2a4aa95c6 Mon Sep 17 00:00:00 2001 From: Milos Pesic Date: Tue, 14 Jul 2026 20:06:19 +0200 Subject: [PATCH 1/2] Log egress hw stats at the end with the info level These metrics are quite important and interesting, making sure info level logs also include it. --- pkg/server/server_rpc.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/server/server_rpc.go b/pkg/server/server_rpc.go index 3910dde2..26bf70f3 100644 --- a/pkg/server/server_rpc.go +++ b/pkg/server/server_rpc.go @@ -188,7 +188,7 @@ func (s *Server) processEnded(req *rpc.StartEgressRequest, info *livekit.EgressI avgCPU, maxCPU, maxMemory := s.monitor.EgressEnded(req) if maxCPU > 0 { - logger.Debugw("egress metrics", + logger.Infow("egress metrics", "egressID", info.EgressId, "avgCPU", avgCPU, "maxCPU", maxCPU, From 30add44ecc769f6a99bbbe11f6b07f1a843c3a61 Mon Sep 17 00:00:00 2001 From: Milos Pesic Date: Tue, 14 Jul 2026 20:50:00 +0200 Subject: [PATCH 2/2] Add sdk soruce type logging as well as egress type --- pkg/config/pipeline.go | 27 +++++++++++++++++++++++++++ pkg/server/server_rpc.go | 4 ++++ 2 files changed, 31 insertions(+) diff --git a/pkg/config/pipeline.go b/pkg/config/pipeline.go index 2903c987..b31a2974 100644 --- a/pkg/config/pipeline.go +++ b/pkg/config/pipeline.go @@ -542,6 +542,33 @@ func ShouldUseSDKSource(req interface { return req.GetAudioOnly() && req.GetLayout() == "" && req.GetCustomBaseUrl() == "" } +func IsSDKSourceRequest(req *rpc.StartEgressRequest) bool { + switch r := req.Request.(type) { + case *rpc.StartEgressRequest_RoomComposite: + return ShouldUseSDKSource(r.RoomComposite) + case *rpc.StartEgressRequest_Web: + return false + case *rpc.StartEgressRequest_Egress: + return isV2SDKSource(r.Egress) + case *rpc.StartEgressRequest_Replay: + return isV2SDKSource(r.Replay) + } + return true +} + +func isV2SDKSource(req egress.EgressRequest) bool { + if req == nil { + return true + } + if req.GetWeb() != nil { + return false + } + if t := req.GetTemplate(); t != nil { + return ShouldUseSDKSource(t) + } + return true +} + // applyV2Source handles the shared Template/Web/Media source switch for the v2 // request shape. Satisfied by both *livekit.StartEgressRequest and *livekit.ExportReplayRequest. func (p *PipelineConfig) applyV2Source(req egress.EgressRequest) (connectionInfoRequired bool, err error) { diff --git a/pkg/server/server_rpc.go b/pkg/server/server_rpc.go index 26bf70f3..bb13a3d9 100644 --- a/pkg/server/server_rpc.go +++ b/pkg/server/server_rpc.go @@ -188,8 +188,12 @@ func (s *Server) processEnded(req *rpc.StartEgressRequest, info *livekit.EgressI avgCPU, maxCPU, maxMemory := s.monitor.EgressEnded(req) if maxCPU > 0 { + requestType, outputType := egress.GetTypes(info.Request) logger.Infow("egress metrics", "egressID", info.EgressId, + "requestType", requestType, + "outputType", outputType, + "sdkSource", config.IsSDKSourceRequest(req), "avgCPU", avgCPU, "maxCPU", maxCPU, "maxMemory", maxMemory,