Skip to content

Commit

Permalink
Merge pull request #114 from OdyseeTeam/fix-missing-playlist
Browse files Browse the repository at this point in the history
Send fragment retrieval errors to sentry
  • Loading branch information
anbsky authored Jan 21, 2025
2 parents aae1d43 + eaa995f commit 8b0674a
Show file tree
Hide file tree
Showing 7 changed files with 84 additions and 23 deletions.
5 changes: 3 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ require (
github.com/c2h5oh/datasize v0.0.0-20231215233829-aa82cc1e6500
github.com/ekyoung/gin-nice-recovery v0.0.0-20160510022553-1654dca486db
github.com/gaissmai/bart v0.13.1
github.com/getsentry/sentry-go v0.28.1
github.com/getsentry/sentry-go v0.31.1
github.com/getsentry/sentry-go/gin v0.31.1
github.com/gin-contrib/pprof v1.5.0
github.com/gin-gonic/gin v1.10.0
github.com/golang-jwt/jwt/v4 v4.5.1
Expand Down Expand Up @@ -121,7 +122,7 @@ require (
golang.org/x/crypto v0.31.0 // indirect
golang.org/x/exp v0.0.0-20240213143201-ec583247a57a // indirect
golang.org/x/mod v0.17.0 // indirect
golang.org/x/net v0.25.0 // indirect
golang.org/x/net v0.33.0 // indirect
golang.org/x/sys v0.28.0 // indirect
golang.org/x/text v0.21.0 // indirect
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect
Expand Down
14 changes: 8 additions & 6 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -126,8 +126,10 @@ github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uq
github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk=
github.com/gaissmai/bart v0.13.1 h1:aykavwogyHXZPeZFsMtVrZsxTq6m2mHNZVkR1YGE4CQ=
github.com/gaissmai/bart v0.13.1/go.mod h1:qSes2fnJ8hB410BW0ymHUN/eQkuGpTYyJcN8sKMYpJU=
github.com/getsentry/sentry-go v0.28.1 h1:zzaSm/vHmGllRM6Tpx1492r0YDzauArdBfkJRtY6P5k=
github.com/getsentry/sentry-go v0.28.1/go.mod h1:1fQZ+7l7eeJ3wYi82q5Hg8GqAPgefRq+FP/QhafYVgg=
github.com/getsentry/sentry-go v0.31.1 h1:ELVc0h7gwyhnXHDouXkhqTFSO5oslsRDk0++eyE0KJ4=
github.com/getsentry/sentry-go v0.31.1/go.mod h1:CYNcMMz73YigoHljQRG+qPF+eMq8gG72XcGN/p71BAY=
github.com/getsentry/sentry-go/gin v0.31.1 h1:lvOOO5j0o0IhYIXoHCmQ+D4ExhXWRCnDusV176dXWDA=
github.com/getsentry/sentry-go/gin v0.31.1/go.mod h1:iMF6gA5uO2t3KVMj4QpjLi9B0U+oMidAiHAdPcJMMdQ=
github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/gin-contrib/pprof v1.5.0 h1:E/Oy7g+kNw94KfdCy3bZxQFtyDnAX2V7axRS7sNYVrU=
Expand Down Expand Up @@ -438,8 +440,8 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=
go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU=
go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
Expand Down Expand Up @@ -530,8 +532,8 @@ golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v
golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac=
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
Expand Down
4 changes: 2 additions & 2 deletions pkg/logger/logger.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package logger

import (
"io/ioutil"
"io"

"github.com/sirupsen/logrus"
)
Expand Down Expand Up @@ -37,5 +37,5 @@ func GetLogger() *logrus.Logger {
// DisableLogger turns off logging output for this module logger
func DisableLogger(l *logrus.Logger) {
l.SetLevel(logrus.PanicLevel)
l.SetOutput(ioutil.Discard)
l.SetOutput(io.Discard)
}
20 changes: 20 additions & 0 deletions pkg/logger/sentry.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,26 @@ func ConfigureSentry(release, env string) {
}
}

// SendToSentry sends an error to Sentry with optional extra details.
func SendToSentry(err error, details ...string) *sentry.EventID {
extra := map[string]string{}
var eventID *sentry.EventID
for i := 0; i < len(details); i += 2 {
if i+1 > len(details)-1 {
break
}
extra[details[i]] = details[i+1]
}

sentry.WithScope(func(scope *sentry.Scope) {
for k, v := range extra {
scope.SetExtra(k, v)
}
sentry.CaptureException(err)
})
return eventID
}

func filterEvent(event *sentry.Event, hint *sentry.EventHint) *sentry.Event {
for _, exc := range event.Exception {
for _, ignored := range IgnoredExceptions {
Expand Down
33 changes: 33 additions & 0 deletions pkg/logger/sentry_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package logger

import (
"errors"
"testing"

"github.com/getsentry/sentry-go"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

func TestSentryMiddleware(t *testing.T) {
var event *sentry.Event
ConfigureSentry("test", EnvTest)

SendToSentry(errors.New("general error"))
event = TestSentryTransport.LastEvent
require.NotNil(t, event)
assert.Equal(t, "general error", event.Exception[0].Value)
assert.Empty(t, event.Extra)

SendToSentry(errors.New("general error"), "user", "someUser")
event = TestSentryTransport.LastEvent
require.NotNil(t, event)
assert.Equal(t, "general error", event.Exception[0].Value)
assert.Equal(t, map[string]any{"user": "someUser"}, event.Extra)

SendToSentry(errors.New("general error"), "user", "someUser", "dangling param")
event = TestSentryTransport.LastEvent
require.NotNil(t, event)
assert.Equal(t, "general error", event.Exception[0].Value)
assert.Equal(t, map[string]any{"user": "someUser"}, event.Extra)
}
8 changes: 5 additions & 3 deletions pkg/logger/testing.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,16 @@ type TestTransport struct {
LastEvent *sentry.Event
}

func (t TestTransport) Flush(timeout time.Duration) bool {
func (t *TestTransport) Flush(timeout time.Duration) bool {
return true
}

func (t TestTransport) Configure(options sentry.ClientOptions) {

func (t *TestTransport) Configure(options sentry.ClientOptions) {
}

func (t *TestTransport) SendEvent(event *sentry.Event) {
t.LastEvent = event
}

func (t *TestTransport) Close() {
}
23 changes: 13 additions & 10 deletions player/http_handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import (
"github.com/OdyseeTeam/player-server/internal/iapi"
"github.com/OdyseeTeam/player-server/internal/metrics"
"github.com/OdyseeTeam/player-server/pkg/app"
"github.com/OdyseeTeam/player-server/pkg/logger"
tclient "github.com/OdyseeTeam/transcoder/client"

"github.com/getsentry/sentry-go"
Expand Down Expand Up @@ -92,8 +93,7 @@ var allowedXRequestedWith = "com.odysee.app"

// Handle is responsible for all HTTP media delivery via player module.
func (h *RequestHandler) Handle(c *gin.Context) {
addCSPHeaders(c)
addPoweredByHeaders(c)
addExtraResponseHeaders(c)
c.Header("player-request-method", c.Request.Method)
if c.Request.Method == http.MethodHead {
c.Header("Cache-Control", "no-store, No-cache")
Expand Down Expand Up @@ -304,8 +304,7 @@ func (h *RequestHandler) Handle(c *gin.Context) {

func (h *RequestHandler) HandleTranscodedFragment(c *gin.Context) {
uri := c.Param("claim_id")
addCSPHeaders(c)
addPoweredByHeaders(c)
addExtraResponseHeaders(c)
metrics.StreamsRunning.WithLabelValues(metrics.StreamTranscoded).Inc()
defer metrics.StreamsRunning.WithLabelValues(metrics.StreamTranscoded).Dec()

Expand All @@ -331,6 +330,13 @@ func (h *RequestHandler) HandleTranscodedFragment(c *gin.Context) {
}
size, err := h.player.tclient.PlayFragment(uri, c.Param("sd_hash"), c.Param("fragment"), c.Writer, c.Request)
if err != nil {
logger.SendToSentry(
err,
"uri", uri,
"sd_hash", c.Param("sd_hash"),
"fragment", c.Param("fragment"),
"url", c.Request.RequestURI,
)
writeErrorResponse(c.Writer, http.StatusNotFound, err.Error())
}
metrics.TcOutBytes.Add(float64(size))
Expand Down Expand Up @@ -407,14 +413,11 @@ func addBreadcrumb(r *http.Request, category, message string) {
}
}

func addPoweredByHeaders(c *gin.Context) {
c.Header("X-Powered-By", playerName)
c.Header("Access-Control-Expose-Headers", "X-Powered-By")
}

func addCSPHeaders(c *gin.Context) {
func addExtraResponseHeaders(c *gin.Context) {
c.Header("Report-To", `{"group":"default","max_age":31536000,"endpoints":[{"url":"https://6fd448c230d0731192f779791c8e45c3.report-uri.com/a/d/g"}],"include_subdomains":true}`)
c.Header("Content-Security-Policy", "script-src 'none'; report-uri https://6fd448c230d0731192f779791c8e45c3.report-uri.com/r/d/csp/enforce; report-to default")
c.Header("Access-Control-Expose-Headers", "X-Powered-By, X-77-Cache")
c.Header("X-Powered-By", playerName)
}

func getPlaylistURL(fullPath string, query url.Values, tcPath string, stream *Stream) string {
Expand Down

0 comments on commit 8b0674a

Please sign in to comment.