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