Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -30,17 +30,17 @@ require (
github.com/stretchr/testify v1.11.1
github.com/twitchtv/twirp v8.1.3+incompatible
github.com/zeebo/xxh3 v1.0.2
go.opentelemetry.io/otel v1.39.0
go.opentelemetry.io/otel v1.40.0
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0
go.opentelemetry.io/otel/sdk v1.39.0
go.opentelemetry.io/otel/trace v1.39.0
go.opentelemetry.io/otel/sdk v1.40.0
go.opentelemetry.io/otel/trace v1.40.0
go.uber.org/atomic v1.11.0
go.uber.org/multierr v1.11.0
go.uber.org/zap v1.27.0
go.uber.org/zap/exp v0.3.0
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b
golang.org/x/mod v0.29.0
golang.org/x/sys v0.39.0
golang.org/x/sys v0.40.0
golang.org/x/text v0.31.0
google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217
google.golang.org/grpc v1.77.0
Expand Down Expand Up @@ -89,7 +89,7 @@ require (
github.com/wlynxg/anet v0.0.5 // indirect
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0 // indirect
go.opentelemetry.io/otel/metric v1.39.0 // indirect
go.opentelemetry.io/otel/metric v1.40.0 // indirect
go.opentelemetry.io/proto/otlp v1.9.0 // indirect
golang.org/x/crypto v0.45.0 // indirect
golang.org/x/net v0.47.0 // indirect
Expand Down
24 changes: 12 additions & 12 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -217,20 +217,20 @@ github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0=
github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48=
go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8=
go.opentelemetry.io/otel v1.40.0 h1:oA5YeOcpRTXq6NN7frwmwFR0Cn3RhTVZvXsP4duvCms=
go.opentelemetry.io/otel v1.40.0/go.mod h1:IMb+uXZUKkMXdPddhwAHm6UfOwJyh4ct1ybIlV14J0g=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0 h1:f0cb2XPmrqn4XMy9PNliTgRKJgS5WcL/u0/WRYGz4t0=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0/go.mod h1:vnakAaFckOMiMtOIhFI2MNH4FYrZzXCYxmb1LlhoGz8=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0 h1:Ckwye2FpXkYgiHX7fyVrN1uA/UYd9ounqqTuSNAv0k4=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0/go.mod h1:teIFJh5pW2y+AN7riv6IBPX2DuesS3HgP39mwOspKwU=
go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0=
go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs=
go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18=
go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE=
go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2WKg+sEJTtB8=
go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew=
go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI=
go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA=
go.opentelemetry.io/otel/metric v1.40.0 h1:rcZe317KPftE2rstWIBitCdVp89A2HqjkxR3c11+p9g=
go.opentelemetry.io/otel/metric v1.40.0/go.mod h1:ib/crwQH7N3r5kfiBZQbwrTge743UDc7DTFVZrrXnqc=
go.opentelemetry.io/otel/sdk v1.40.0 h1:KHW/jUzgo6wsPh9At46+h4upjtccTmuZCFAc9OJ71f8=
go.opentelemetry.io/otel/sdk v1.40.0/go.mod h1:Ph7EFdYvxq72Y8Li9q8KebuYUr2KoeyHx0DRMKrYBUE=
go.opentelemetry.io/otel/sdk/metric v1.40.0 h1:mtmdVqgQkeRxHgRv4qhyJduP3fYJRMX4AtAlbuWdCYw=
go.opentelemetry.io/otel/sdk/metric v1.40.0/go.mod h1:4Z2bGMf0KSK3uRjlczMOeMhKU2rhUqdWNoKcYrtcBPg=
go.opentelemetry.io/otel/trace v1.40.0 h1:WA4etStDttCSYuhwvEa8OP8I5EWu24lkOzp+ZYblVjw=
go.opentelemetry.io/otel/trace v1.40.0/go.mod h1:zeAhriXecNGP/s2SEG3+Y8X9ujcJOTqQ5RgdEJcawiA=
go.opentelemetry.io/proto/otlp v1.9.0 h1:l706jCMITVouPOqEnii2fIAuO3IVGBRPV5ICjceRb/A=
go.opentelemetry.io/proto/otlp v1.9.0/go.mod h1:xE+Cx5E/eEHw+ISFkwPLwCZefwVjY+pqKg1qcK03+/4=
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
Expand Down Expand Up @@ -274,8 +274,8 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk=
golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ=
golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
Expand Down
149 changes: 149 additions & 0 deletions observability/egressobs/egress.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
package egressobs

import (
"encoding/json"

"google.golang.org/protobuf/encoding/protojson"

"github.com/pkg/errors"

"github.com/livekit/protocol/livekit"
)

type EgressResults struct {
FileResults []*livekit.FileInfo
StreamResults []*livekit.StreamInfo
SegmentResults []*livekit.SegmentsInfo
ImageResults []*livekit.ImagesInfo
}

func GetSourceType(info *livekit.EgressInfo) SessionSourceType {
switch info.SourceType {
case livekit.EgressSourceType_EGRESS_SOURCE_TYPE_WEB:
return SessionSourceTypeWeb
case livekit.EgressSourceType_EGRESS_SOURCE_TYPE_SDK:
return SessionSourceTypeSdk
default:
return SessionSourceTypeUndefined
}
}

func GetRequestType(info *livekit.EgressInfo) EgressRequestType {
switch info.Request.(type) {
case *livekit.EgressInfo_RoomComposite:
return EgressRequestTypeRoomComposite
case *livekit.EgressInfo_Web:
return EgressRequestTypeWeb
case *livekit.EgressInfo_Participant:
return EgressRequestTypeParticipant
case *livekit.EgressInfo_TrackComposite:
return EgressRequestTypeTrackComposite
case *livekit.EgressInfo_Track:
return EgressRequestTypeTrack
default:
return EgressRequestTypeUndefined
}
}

func GetStatus(info *livekit.EgressInfo) SessionStatus {
switch info.Status {
case livekit.EgressStatus_EGRESS_STARTING:
return SessionStatusStarting
case livekit.EgressStatus_EGRESS_ACTIVE:
return SessionStatusActive
case livekit.EgressStatus_EGRESS_ENDING:
return SessionStatusEnding
case livekit.EgressStatus_EGRESS_COMPLETE:
return SessionStatusComplete
case livekit.EgressStatus_EGRESS_ABORTED:
return SessionStatusAborted
case livekit.EgressStatus_EGRESS_LIMIT_REACHED:
return SessionStatusLimitReached
case livekit.EgressStatus_EGRESS_FAILED:
return SessionStatusFailed
default:
return SessionStatusUndefined
}
}

func GetRequest(info *livekit.EgressInfo) (string, error) {
switch req := info.Request.(type) {
case *livekit.EgressInfo_RoomComposite:
b, err := protojson.Marshal(req.RoomComposite)
if err != nil {
return "", errors.Wrap(err, "failed serializing RoomComposite request")
}
return string(b), nil
case *livekit.EgressInfo_Web:
b, err := protojson.Marshal(req.Web)
if err != nil {
return "", errors.Wrap(err, "failed serializing Web request")
}
return string(b), nil
case *livekit.EgressInfo_Participant:
b, err := protojson.Marshal(req.Participant)
if err != nil {
return "", errors.Wrap(err, "failed serializing Participant request")
}
return string(b), nil
case *livekit.EgressInfo_TrackComposite:
b, err := protojson.Marshal(req.TrackComposite)
if err != nil {
return "", errors.Wrap(err, "failed serializing TrackComposite request")
}
return string(b), nil
case *livekit.EgressInfo_Track:
b, err := protojson.Marshal(req.Track)
if err != nil {
return "", errors.Wrap(err, "failed serializing Track request")
}
return string(b), nil
default:
return "", nil
}
}

func GetResult(info *livekit.EgressInfo) (string, error) {
if file := info.GetFile(); file != nil {
b, err := protojson.Marshal(file)
if err != nil {
return "", errors.Wrap(err, "failed serializing File result")
}
return string(b), nil
} else if stream := info.GetStream(); stream != nil {
b, err := protojson.Marshal(stream)
if err != nil {
return "", errors.Wrap(err, "failed serializing Stream result")
}
return string(b), nil
} else if segments := info.GetSegments(); segments != nil {
b, err := protojson.Marshal(segments)
if err != nil {
return "", errors.Wrap(err, "failed serializing Segments result")
}
return string(b), nil
} else {
results := &EgressResults{
FileResults: info.FileResults,
StreamResults: info.StreamResults,
SegmentResults: info.SegmentResults,
ImageResults: info.ImageResults,
}
b, err := json.Marshal(results)
if err != nil {
return "", errors.Wrap(err, "failed serializing Multiple result")
}
return string(b), nil
}
}

func GetAudioOnly(info *livekit.EgressInfo) bool {
switch req := info.Request.(type) {
case *livekit.EgressInfo_RoomComposite:
return req.RoomComposite.AudioOnly
case *livekit.EgressInfo_Web:
return req.Web.AudioOnly
default:
return false
}
}
Loading