playbackMetrics.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package controllers
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "github.com/owncast/owncast/metrics"
  6. "github.com/owncast/owncast/utils"
  7. log "github.com/sirupsen/logrus"
  8. )
  9. // ReportPlaybackMetrics will accept playback metrics from a client and save
  10. // them for future video health reporting.
  11. func ReportPlaybackMetrics(w http.ResponseWriter, r *http.Request) {
  12. if r.Method != POST {
  13. WriteSimpleResponse(w, false, r.Method+" not supported")
  14. return
  15. }
  16. type reportPlaybackMetricsRequest struct {
  17. Bandwidth float64 `json:"bandwidth"`
  18. Latency float64 `json:"latency"`
  19. Errors float64 `json:"errors"`
  20. DownloadDuration float64 `json:"downloadDuration"`
  21. QualityVariantChanges float64 `json:"qualityVariantChanges"`
  22. }
  23. decoder := json.NewDecoder(r.Body)
  24. var request reportPlaybackMetricsRequest
  25. if err := decoder.Decode(&request); err != nil {
  26. log.Errorln("error decoding playback metrics payload:", err)
  27. WriteSimpleResponse(w, false, err.Error())
  28. return
  29. }
  30. clientID := utils.GenerateClientIDFromRequest(r)
  31. metrics.RegisterPlaybackErrorCount(clientID, request.Errors)
  32. if request.Bandwidth != 0.0 {
  33. metrics.RegisterPlayerBandwidth(clientID, request.Bandwidth)
  34. }
  35. if request.Latency != 0.0 {
  36. metrics.RegisterPlayerLatency(clientID, request.Latency)
  37. }
  38. if request.DownloadDuration != 0.0 {
  39. metrics.RegisterPlayerSegmentDownloadDuration(clientID, request.DownloadDuration)
  40. }
  41. metrics.RegisterQualityVariantChangesCount(clientID, request.QualityVariantChanges)
  42. }