Skip to content

Commit 33e4417

Browse files
authored
Improve Argus metrics data retention policy (#401)
* update argus instance examples * Set update metrics to default when not provided * address PR comments
1 parent 205763c commit 33e4417

3 files changed

Lines changed: 59 additions & 115 deletions

File tree

examples/resources/stackit_argus_instance/resource.tf

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ resource "stackit_argus_instance" "example" {
33
name = "example-instance"
44
plan_name = "Monitoring-Medium-EU01"
55
acl = ["1.1.1.1/32", "2.2.2.2/32"]
6-
metrics_retention_days = 7
7-
metrics_retention_days_5m_downsampling = 30
8-
metrics_retention_days_1h_downsampling = 365
6+
metrics_retention_days = 365
7+
metrics_retention_days_5m_downsampling = 60
8+
metrics_retention_days_1h_downsampling = 10
99
}

stackit/internal/services/argus/instance/resource.go

Lines changed: 45 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,13 @@ var (
3636
_ resource.ResourceWithImportState = &instanceResource{}
3737
)
3838

39+
const (
40+
// We need to set these defaults because we need to revert to them if the user stops setting them
41+
DefaultMetricsRetentionDays int64 = 90
42+
DefaultMetricsRetentionDays5mDownsampling int64 = 0
43+
DefaultMetricsRetentionDays1hDownsampling int64 = 0
44+
)
45+
3946
type Model struct {
4047
Id types.String `tfsdk:"id"` // needed by TF
4148
ProjectId types.String `tfsdk:"project_id"`
@@ -209,17 +216,17 @@ func (r *instanceResource) Schema(_ context.Context, _ resource.SchemaRequest, r
209216
Sensitive: true,
210217
},
211218
"metrics_retention_days": schema.Int64Attribute{
212-
Description: "Specifies for how many days the raw metrics are kept.",
219+
Description: "Specifies for how many days the raw metrics are kept. Default is set to `90`.",
213220
Optional: true,
214221
Computed: true,
215222
},
216223
"metrics_retention_days_5m_downsampling": schema.Int64Attribute{
217-
Description: "Specifies for how many days the 5m downsampled metrics are kept. must be less than the value of the general retention. Default is set to `0` (disabled).",
224+
Description: "Specifies for how many days the 5m downsampled metrics are kept. It must be less than the value of the general retention. Default is set to `0` (disabled).",
218225
Optional: true,
219226
Computed: true,
220227
},
221228
"metrics_retention_days_1h_downsampling": schema.Int64Attribute{
222-
Description: "Specifies for how many days the 1h downsampled metrics are kept. must be less than the value of the 5m downsampling retention. Default is set to `0` (disabled).",
229+
Description: "Specifies for how many days the 1h downsampled metrics are kept. It must be less than the value of the 5m downsampling retention. Default is set to `0` (disabled).",
223230
Optional: true,
224231
Computed: true,
225232
},
@@ -363,26 +370,17 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques
363370
return
364371
}
365372

366-
// If any of the metrics retention days are set, set the metrics retention policy
367-
if metricsRetentionDays != nil || metricsRetentionDays5mDownsampling != nil || metricsRetentionDays1hDownsampling != nil {
368-
// Need to get the metrics retention policy because update endpoint is a PUT and we need to send all fields
369-
metricsResp, err := r.client.GetMetricsStorageRetentionExecute(ctx, *instanceId, projectId)
370-
if err != nil {
371-
core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Getting metrics retention policy: %v", err))
372-
return
373-
}
374-
375-
metricsRetentionPayload, err := toUpdateMetricsStorageRetentionPayload(metricsRetentionDays, metricsRetentionDays5mDownsampling, metricsRetentionDays1hDownsampling, metricsResp)
376-
if err != nil {
377-
core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Building metrics retention policy payload: %v", err))
378-
return
379-
}
373+
// Update metrics retention policy
374+
metricsRetentionPayload, err := toUpdateMetricsStorageRetentionPayload(metricsRetentionDays, metricsRetentionDays5mDownsampling, metricsRetentionDays1hDownsampling)
375+
if err != nil {
376+
core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Building metrics retention policy payload: %v", err))
377+
return
378+
}
380379

381-
_, err = r.client.UpdateMetricsStorageRetention(ctx, *instanceId, projectId).UpdateMetricsStorageRetentionPayload(*metricsRetentionPayload).Execute()
382-
if err != nil {
383-
core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Setting metrics retention policy: %v", err))
384-
return
385-
}
380+
_, err = r.client.UpdateMetricsStorageRetention(ctx, *instanceId, projectId).UpdateMetricsStorageRetentionPayload(*metricsRetentionPayload).Execute()
381+
if err != nil {
382+
core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Setting metrics retention policy: %v", err))
383+
return
386384
}
387385

388386
// Get metrics retention policy after update
@@ -565,25 +563,16 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques
565563
return
566564
}
567565

568-
// If any of the metrics retention days are set, set the metrics retention policy
569-
if metricsRetentionDays != nil || metricsRetentionDays5mDownsampling != nil || metricsRetentionDays1hDownsampling != nil {
570-
// Need to get the metrics retention policy because update endpoint is a PUT and we need to send all fields
571-
metricsResp, err := r.client.GetMetricsStorageRetentionExecute(ctx, instanceId, projectId)
572-
if err != nil {
573-
core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Getting metrics retention policy: %v", err))
574-
return
575-
}
576-
577-
metricsRetentionPayload, err := toUpdateMetricsStorageRetentionPayload(metricsRetentionDays, metricsRetentionDays5mDownsampling, metricsRetentionDays1hDownsampling, metricsResp)
578-
if err != nil {
579-
core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Building metrics retention policy payload: %v", err))
580-
return
581-
}
582-
_, err = r.client.UpdateMetricsStorageRetention(ctx, instanceId, projectId).UpdateMetricsStorageRetentionPayload(*metricsRetentionPayload).Execute()
583-
if err != nil {
584-
core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Setting metrics retention policy: %v", err))
585-
return
586-
}
566+
// Update metrics retention policy
567+
metricsRetentionPayload, err := toUpdateMetricsStorageRetentionPayload(metricsRetentionDays, metricsRetentionDays5mDownsampling, metricsRetentionDays1hDownsampling)
568+
if err != nil {
569+
core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Building metrics retention policy payload: %v", err))
570+
return
571+
}
572+
_, err = r.client.UpdateMetricsStorageRetention(ctx, instanceId, projectId).UpdateMetricsStorageRetentionPayload(*metricsRetentionPayload).Execute()
573+
if err != nil {
574+
core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Setting metrics retention policy: %v", err))
575+
return
587576
}
588577

589578
// Get metrics retention policy after update
@@ -800,37 +789,35 @@ func toCreatePayload(model *Model) (*argus.CreateInstancePayload, error) {
800789
}, nil
801790
}
802791

803-
func toUpdateMetricsStorageRetentionPayload(retentionDaysRaw, retentionDays5m, retentionDays1h *int64, resp *argus.GetMetricsStorageRetentionResponse) (*argus.UpdateMetricsStorageRetentionPayload, error) {
804-
var retentionTimeRaw string
805-
var retentionTime5m string
806-
var retentionTime1h string
807-
808-
if resp == nil || resp.MetricsRetentionTimeRaw == nil || resp.MetricsRetentionTime5m == nil || resp.MetricsRetentionTime1h == nil {
809-
return nil, fmt.Errorf("nil response")
810-
}
792+
// toUpdateMetricsStorageRetentionPayload creates a payload for updating the metrics storage retention policy.
793+
// If the retentionDaysRaw, retentionDays5m, or retentionDays1h are nil, the default values are used.
794+
func toUpdateMetricsStorageRetentionPayload(retentionDaysRaw, retentionDays5m, retentionDays1h *int64) (*argus.UpdateMetricsStorageRetentionPayload, error) {
795+
var retentionTimeRaw int64
796+
var retentionTime5m int64
797+
var retentionTime1h int64
811798

812799
if retentionDaysRaw == nil {
813-
retentionTimeRaw = *resp.MetricsRetentionTimeRaw
800+
retentionTimeRaw = DefaultMetricsRetentionDays
814801
} else {
815-
retentionTimeRaw = fmt.Sprintf("%dd", *retentionDaysRaw)
802+
retentionTimeRaw = *retentionDaysRaw
816803
}
817804

818805
if retentionDays5m == nil {
819-
retentionTime5m = *resp.MetricsRetentionTime5m
806+
retentionTime5m = DefaultMetricsRetentionDays5mDownsampling
820807
} else {
821-
retentionTime5m = fmt.Sprintf("%dd", *retentionDays5m)
808+
retentionTime5m = *retentionDays5m
822809
}
823810

824811
if retentionDays1h == nil {
825-
retentionTime1h = *resp.MetricsRetentionTime1h
812+
retentionTime1h = DefaultMetricsRetentionDays1hDownsampling
826813
} else {
827-
retentionTime1h = fmt.Sprintf("%dd", *retentionDays1h)
814+
retentionTime1h = *retentionDays1h
828815
}
829816

830817
return &argus.UpdateMetricsStorageRetentionPayload{
831-
MetricsRetentionTimeRaw: &retentionTimeRaw,
832-
MetricsRetentionTime5m: &retentionTime5m,
833-
MetricsRetentionTime1h: &retentionTime1h,
818+
MetricsRetentionTimeRaw: utils.Ptr(fmt.Sprintf("%dd", retentionTimeRaw)),
819+
MetricsRetentionTime5m: utils.Ptr(fmt.Sprintf("%dd", retentionTime5m)),
820+
MetricsRetentionTime1h: utils.Ptr(fmt.Sprintf("%dd", retentionTime1h)),
834821
}, nil
835822
}
836823

stackit/internal/services/argus/instance/resource_test.go

Lines changed: 11 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package argus
22

33
import (
44
"context"
5+
"fmt"
56
"testing"
67

78
"github.com/google/go-cmp/cmp"
@@ -395,7 +396,6 @@ func TestToUpdateMetricsStorageRetentionPayload(t *testing.T) {
395396
retentionDaysRaw *int64
396397
retentionDays1h *int64
397398
retentionDays5m *int64
398-
getMetricsResp *argus.GetMetricsStorageRetentionResponse
399399
expected *argus.UpdateMetricsStorageRetentionPayload
400400
isValid bool
401401
}{
@@ -404,11 +404,6 @@ func TestToUpdateMetricsStorageRetentionPayload(t *testing.T) {
404404
utils.Ptr(int64(120)),
405405
utils.Ptr(int64(60)),
406406
utils.Ptr(int64(14)),
407-
&argus.GetMetricsStorageRetentionResponse{
408-
MetricsRetentionTimeRaw: utils.Ptr("60d"),
409-
MetricsRetentionTime1h: utils.Ptr("30d"),
410-
MetricsRetentionTime5m: utils.Ptr("7d"),
411-
},
412407
&argus.UpdateMetricsStorageRetentionPayload{
413408
MetricsRetentionTimeRaw: utils.Ptr("120d"),
414409
MetricsRetentionTime1h: utils.Ptr("60d"),
@@ -421,15 +416,10 @@ func TestToUpdateMetricsStorageRetentionPayload(t *testing.T) {
421416
utils.Ptr(int64(120)),
422417
nil,
423418
nil,
424-
&argus.GetMetricsStorageRetentionResponse{
425-
MetricsRetentionTimeRaw: utils.Ptr("60d"),
426-
MetricsRetentionTime1h: utils.Ptr("30d"),
427-
MetricsRetentionTime5m: utils.Ptr("7d"),
428-
},
429419
&argus.UpdateMetricsStorageRetentionPayload{
430420
MetricsRetentionTimeRaw: utils.Ptr("120d"),
431-
MetricsRetentionTime1h: utils.Ptr("30d"),
432-
MetricsRetentionTime5m: utils.Ptr("7d"),
421+
MetricsRetentionTime1h: utils.Ptr(fmt.Sprintf("%dd", DefaultMetricsRetentionDays1hDownsampling)),
422+
MetricsRetentionTime5m: utils.Ptr(fmt.Sprintf("%dd", DefaultMetricsRetentionDays5mDownsampling)),
433423
},
434424
true,
435425
},
@@ -438,15 +428,10 @@ func TestToUpdateMetricsStorageRetentionPayload(t *testing.T) {
438428
nil,
439429
utils.Ptr(int64(60)),
440430
nil,
441-
&argus.GetMetricsStorageRetentionResponse{
442-
MetricsRetentionTimeRaw: utils.Ptr("60d"),
443-
MetricsRetentionTime1h: utils.Ptr("30d"),
444-
MetricsRetentionTime5m: utils.Ptr("7d"),
445-
},
446431
&argus.UpdateMetricsStorageRetentionPayload{
447-
MetricsRetentionTimeRaw: utils.Ptr("60d"),
432+
MetricsRetentionTimeRaw: utils.Ptr(fmt.Sprintf("%dd", DefaultMetricsRetentionDays)),
448433
MetricsRetentionTime1h: utils.Ptr("60d"),
449-
MetricsRetentionTime5m: utils.Ptr("7d"),
434+
MetricsRetentionTime5m: utils.Ptr(fmt.Sprintf("%dd", DefaultMetricsRetentionDays5mDownsampling)),
450435
},
451436
true,
452437
},
@@ -455,14 +440,9 @@ func TestToUpdateMetricsStorageRetentionPayload(t *testing.T) {
455440
nil,
456441
nil,
457442
utils.Ptr(int64(14)),
458-
&argus.GetMetricsStorageRetentionResponse{
459-
MetricsRetentionTimeRaw: utils.Ptr("60d"),
460-
MetricsRetentionTime1h: utils.Ptr("30d"),
461-
MetricsRetentionTime5m: utils.Ptr("7d"),
462-
},
463443
&argus.UpdateMetricsStorageRetentionPayload{
464-
MetricsRetentionTimeRaw: utils.Ptr("60d"),
465-
MetricsRetentionTime1h: utils.Ptr("30d"),
444+
MetricsRetentionTimeRaw: utils.Ptr(fmt.Sprintf("%dd", DefaultMetricsRetentionDays)),
445+
MetricsRetentionTime1h: utils.Ptr(fmt.Sprintf("%dd", DefaultMetricsRetentionDays1hDownsampling)),
466446
MetricsRetentionTime5m: utils.Ptr("14d"),
467447
},
468448
true,
@@ -472,40 +452,17 @@ func TestToUpdateMetricsStorageRetentionPayload(t *testing.T) {
472452
nil,
473453
nil,
474454
nil,
475-
&argus.GetMetricsStorageRetentionResponse{
476-
MetricsRetentionTimeRaw: utils.Ptr("60d"),
477-
MetricsRetentionTime1h: utils.Ptr("30d"),
478-
MetricsRetentionTime5m: utils.Ptr("7d"),
479-
},
480455
&argus.UpdateMetricsStorageRetentionPayload{
481-
MetricsRetentionTimeRaw: utils.Ptr("60d"),
482-
MetricsRetentionTime1h: utils.Ptr("30d"),
483-
MetricsRetentionTime5m: utils.Ptr("7d"),
456+
MetricsRetentionTimeRaw: utils.Ptr(fmt.Sprintf("%dd", DefaultMetricsRetentionDays)),
457+
MetricsRetentionTime1h: utils.Ptr(fmt.Sprintf("%dd", DefaultMetricsRetentionDays1hDownsampling)),
458+
MetricsRetentionTime5m: utils.Ptr(fmt.Sprintf("%dd", DefaultMetricsRetentionDays5mDownsampling)),
484459
},
485460
true,
486461
},
487-
{
488-
"nil_response",
489-
nil,
490-
nil,
491-
nil,
492-
nil,
493-
nil,
494-
false,
495-
},
496-
{
497-
"empty_response",
498-
nil,
499-
nil,
500-
nil,
501-
&argus.GetMetricsStorageRetentionResponse{},
502-
nil,
503-
false,
504-
},
505462
}
506463
for _, tt := range tests {
507464
t.Run(tt.description, func(t *testing.T) {
508-
output, err := toUpdateMetricsStorageRetentionPayload(tt.retentionDaysRaw, tt.retentionDays5m, tt.retentionDays1h, tt.getMetricsResp)
465+
output, err := toUpdateMetricsStorageRetentionPayload(tt.retentionDaysRaw, tt.retentionDays5m, tt.retentionDays1h)
509466
if !tt.isValid && err == nil {
510467
t.Fatalf("Should have failed")
511468
}

0 commit comments

Comments
 (0)