Files
files/internal/runtimeinfo/storage.go
2026-09-09 16:42:21 +08:00

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()
}