owncast/utils/performanceTimer.go
Gabe Kangas 6ea9affce0
HLS video handling/storage/state refactor (#151)
* WIP with new transcoder progress monitor

* A whole different WIP in progress monitoring via local PUTs

* Use an actual hls playlist parser to rewrite master playlist

* Cleanup

* Private vs public path for thumbnail generation

* Allow each storage provider to make decisions of how to store different types of files

* Simplify inbound file writes

* Revert

* Split out set stream as connected/disconnected state methods

* Update videojs

* Add comment about the hls handler

* Rework of the offline stream state.  For #85

* Delete old unreferenced video segment files from disk

* Cleanup all segments and revert to a completely offline state after 5min

* Stop thumbnail generation on stream stop. Copy logo to thumbnail on cleanup.

* Update transcoder test

* Add comment

* Return http 200 on success to transcoder. Tweak how files are written to disk

* Force pixel color format in transcoder

* Add debugging info for S3 transfers. Add default ACL.

* Fix cleanup timer

* Reset session stats when we cleanup the session.

* Put log file back

* Update test

* File should not be a part of this commit

* Add centralized shared performance timer for use anywhere

* Post-rebase cleanup

* Support returning nil from storage provider save

* Updates to reflect package changes + other updates in master

* Fix storage providers being overwritten

* Do not return pointer in save. Support cache headers with S3 providers

* Split out videojs + vhs and point to specific working versions of them

* Bump vjs and vhs versions

* Fix test

* Remove unused

* Update upload warning message

* No longer valid comment

* Pin videojs and vhs versions
2020-10-14 14:07:38 -07:00

50 lines
1.2 KiB
Go

package utils
import (
"sort"
"time"
)
// The "start" timestamp of a timing event
var _pointsInTime = make(map[string]time.Time)
// A collection of timestamp durations for returning the average of
var _durationStorage = make(map[string][]float64)
// StartPerformanceMonitor will keep track of the start time of this event
func StartPerformanceMonitor(key string) {
if len(_durationStorage[key]) > 30 {
_durationStorage[key] = removeHighAndLow(_durationStorage[key])
}
_pointsInTime[key] = time.Now()
}
// GetAveragePerformance will return the average durations for the event
func GetAveragePerformance(key string) float64 {
timestamp := _pointsInTime[key]
if timestamp.IsZero() {
return 0
}
delta := time.Since(timestamp).Seconds()
_durationStorage[key] = append(_durationStorage[key], delta)
if len(_durationStorage[key]) < 10 {
return 0
}
_durationStorage[key] = removeHighAndLow(_durationStorage[key])
return avg(_durationStorage[key])
}
func removeHighAndLow(values []float64) []float64 {
sort.Float64s(values)
return values[1 : len(values)-1]
}
func avg(values []float64) float64 {
total := 0.0
for _, number := range values {
total = total + number
}
average := total / float64(len(values))
return average
}