From f17ac756d924b8c641a1c09bd064ed2e2f8b25d7 Mon Sep 17 00:00:00 2001 From: Vladimir Iliakov Date: Wed, 8 Apr 2026 11:18:28 +0200 Subject: [PATCH] STAC-24557: Show backup sizes in victoria-metrics list command --- cmd/victoriametrics/list.go | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/cmd/victoriametrics/list.go b/cmd/victoriametrics/list.go index dc6c95e..fd62f5e 100644 --- a/cmd/victoriametrics/list.go +++ b/cmd/victoriametrics/list.go @@ -78,6 +78,7 @@ func runList(appCtx *app.Context) error { vmBackups = append(vmBackups, s3client.Object{ Key: fmt.Sprintf("%s/%s", bucket, key.Key), LastModified: getVMBackupTime(s3Client, bucket, key.Key), + Size: getVMBackupSize(s3Client, bucket, key.Key), }) } } @@ -92,7 +93,7 @@ func runList(appCtx *app.Context) error { }) table := output.Table{ - Headers: []string{"NAME ({bucket}/{instance}-{created})", "UPDATED"}, + Headers: []string{"NAME ({bucket}/{instance}-{created})", "UPDATED", "SIZE"}, Rows: make([][]string, 0, len(vmBackups)), } @@ -100,6 +101,7 @@ func runList(appCtx *app.Context) error { row := []string{ obj.Key, obj.LastModified.Format("2006-01-02 15:04:05 MST"), + output.FormatBytes(obj.Size), } table.Rows = append(table.Rows, row) } @@ -123,3 +125,33 @@ func getVMBackupTime(s3client s3client.Interface, bucket, key string) time.Time return *vmbackup.LastModified } + +// getVMBackupSize calculates total size of all objects in a VM backup directory +func getVMBackupSize(client s3client.Interface, bucket, prefix string) int64 { + var totalSize int64 + var continuationToken *string + + for { + input := &s3.ListObjectsV2Input{ + Bucket: aws.String(bucket), + Prefix: aws.String(prefix), + ContinuationToken: continuationToken, + } + + result, err := client.ListObjectsV2(context.Background(), input) + if err != nil { + return 0 + } + + for _, obj := range result.Contents { + totalSize += aws.ToInt64(obj.Size) + } + + if !aws.ToBool(result.IsTruncated) { + break + } + continuationToken = result.NextContinuationToken + } + + return totalSize +}