Rotate a database target's archive monthly, daily or hourly (closes #379)
check / check (push) Successful in 3m31s

A database target's rotation (none, monthly, daily or hourly) puts the
UTC period of each event's receive time in its archive file name, so
each file holds exactly its period's events. It is on the new webhook
page, the add target form and the target edit form, and shown in the
target list.

Renames move every one of a target's files and move them back if one
fails. The sweep prunes every file, one at a time under the target's
lock, and deletes a rotated file it leaves empty. Download lists the
files, then opens one at a time, oldest first, finding each again under
the target's current names, and gives each row its period. The target
list names the current file and totals the size of all of them.

Model: opus-5-5
This commit is contained in:
2026-10-03 00:47:31 +00:00
parent bcdd4791ec
commit e55134532c
36 changed files with 2120 additions and 406 deletions
+11 -2
View File
@@ -192,8 +192,9 @@ func maxRetriesField(t *database.Target) ConfigField {
// databaseConfigFields describes an archive target by its
// expiry in plain units, such as "30 days", or "never" when
// the archive is kept forever. An expiry that is set but not
// a valid duration is reported as unavailable rather than
// the archive is kept forever, and by its rotation. An expiry
// that is set but not a valid duration, or a rotation that is
// not one of the four, is reported as unavailable rather than
// echoed back.
func databaseConfigFields(configJSON string) []ConfigField {
expiry, err := parseArchiveExpiry(configJSON)
@@ -201,6 +202,11 @@ func databaseConfigFields(configJSON string) []ConfigField {
return unavailableConfigFields()
}
rotation, err := parseArchiveRotation(configJSON)
if err != nil {
return unavailableConfigFields()
}
value := archiveExpiryNever
if expiry > 0 {
value = plainDuration(expiry)
@@ -209,6 +215,9 @@ func databaseConfigFields(configJSON string) []ConfigField {
return []ConfigField{{
Label: "Archive Expiry",
Value: value,
}, {
Label: "Archive Rotation",
Value: rotation,
}}
}