68 lines
1.8 KiB
Go
68 lines
1.8 KiB
Go
|
|
package runtimeinfo
|
||
|
|
|
||
|
|
import (
|
||
|
|
"sync/atomic"
|
||
|
|
"time"
|
||
|
|
)
|
||
|
|
|
||
|
|
type Activity struct {
|
||
|
|
UploadSuccess uint64 `json:"upload_success"`
|
||
|
|
UploadFailure uint64 `json:"upload_failure"`
|
||
|
|
ReadFailure uint64 `json:"read_failure"`
|
||
|
|
DeleteSuccess uint64 `json:"delete_success"`
|
||
|
|
DeleteFailure uint64 `json:"delete_failure"`
|
||
|
|
LastUploadAt time.Time `json:"last_upload_at,omitempty"`
|
||
|
|
LastReadFailAt time.Time `json:"last_read_failure_at,omitempty"`
|
||
|
|
LastDeleteAt time.Time `json:"last_delete_at,omitempty"`
|
||
|
|
}
|
||
|
|
|
||
|
|
var counters struct {
|
||
|
|
uploadSuccess atomic.Uint64
|
||
|
|
uploadFailure atomic.Uint64
|
||
|
|
readFailure atomic.Uint64
|
||
|
|
deleteSuccess atomic.Uint64
|
||
|
|
deleteFailure atomic.Uint64
|
||
|
|
lastUpload atomic.Int64
|
||
|
|
lastReadFail atomic.Int64
|
||
|
|
lastDelete atomic.Int64
|
||
|
|
}
|
||
|
|
|
||
|
|
func RecordUploadSuccess() {
|
||
|
|
counters.uploadSuccess.Add(1)
|
||
|
|
counters.lastUpload.Store(time.Now().UTC().UnixMilli())
|
||
|
|
}
|
||
|
|
|
||
|
|
func RecordUploadFailure() { counters.uploadFailure.Add(1) }
|
||
|
|
|
||
|
|
func RecordReadFailure() {
|
||
|
|
counters.readFailure.Add(1)
|
||
|
|
counters.lastReadFail.Store(time.Now().UTC().UnixMilli())
|
||
|
|
}
|
||
|
|
|
||
|
|
func RecordDeleteSuccess() {
|
||
|
|
counters.deleteSuccess.Add(1)
|
||
|
|
counters.lastDelete.Store(time.Now().UTC().UnixMilli())
|
||
|
|
}
|
||
|
|
|
||
|
|
func RecordDeleteFailure() { counters.deleteFailure.Add(1) }
|
||
|
|
|
||
|
|
func Snapshot() Activity {
|
||
|
|
return Activity{
|
||
|
|
UploadSuccess: counters.uploadSuccess.Load(),
|
||
|
|
UploadFailure: counters.uploadFailure.Load(),
|
||
|
|
ReadFailure: counters.readFailure.Load(),
|
||
|
|
DeleteSuccess: counters.deleteSuccess.Load(),
|
||
|
|
DeleteFailure: counters.deleteFailure.Load(),
|
||
|
|
LastUploadAt: timestamp(counters.lastUpload.Load()),
|
||
|
|
LastReadFailAt: timestamp(counters.lastReadFail.Load()),
|
||
|
|
LastDeleteAt: timestamp(counters.lastDelete.Load()),
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func timestamp(milliseconds int64) time.Time {
|
||
|
|
if milliseconds <= 0 {
|
||
|
|
return time.Time{}
|
||
|
|
}
|
||
|
|
return time.UnixMilli(milliseconds).UTC()
|
||
|
|
}
|