Skip to content

Commit a5fd87c

Browse files
authored
Revert "Improve Argus metrics data retention policy (#401)" (#404)
This reverts commit 33e4417.
1 parent 33e4417 commit a5fd87c

3 files changed

Lines changed: 115 additions & 59 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 = 365
7-
metrics_retention_days_5m_downsampling = 60
8-
metrics_retention_days_1h_downsampling = 10
6+
metrics_retention_days = 7
7+
metrics_retention_days_5m_downsampling = 30
8+
metrics_retention_days_1h_downsampling = 365
99
}

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

Lines changed: 58 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,6 @@ 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-
4639
type Model struct {
4740
Id types.String `tfsdk:"id"` // needed by TF
4841
ProjectId types.String `tfsdk:"project_id"`
@@ -216,17 +209,17 @@ func (r *instanceResource) Schema(_ context.Context, _ resource.SchemaRequest, r
216209
Sensitive: true,
217210
},
218211
"metrics_retention_days": schema.Int64Attribute{
219-
Description: "Specifies for how many days the raw metrics are kept. Default is set to `90`.",
212+
Description: "Specifies for how many days the raw metrics are kept.",
220213
Optional: true,
221214
Computed: true,
222215
},
223216
"metrics_retention_days_5m_downsampling": schema.Int64Attribute{
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).",
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).",
225218
Optional: true,
226219
Computed: true,
227220
},
228221
"metrics_retention_days_1h_downsampling": schema.Int64Attribute{
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).",
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).",
230223
Optional: true,
231224
Computed: true,
232225
},
@@ -370,17 +363,26 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques
370363
return
371364
}
372365

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-
}
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+
}
379374

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
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+
}
380+
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+
}
384386
}
385387

386388
// Get metrics retention policy after update
@@ -563,16 +565,25 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques
563565
return
564566
}
565567

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
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+
}
576587
}
577588

578589
// Get metrics retention policy after update
@@ -789,35 +800,37 @@ func toCreatePayload(model *Model) (*argus.CreateInstancePayload, error) {
789800
}, nil
790801
}
791802

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
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+
}
798811

799812
if retentionDaysRaw == nil {
800-
retentionTimeRaw = DefaultMetricsRetentionDays
813+
retentionTimeRaw = *resp.MetricsRetentionTimeRaw
801814
} else {
802-
retentionTimeRaw = *retentionDaysRaw
815+
retentionTimeRaw = fmt.Sprintf("%dd", *retentionDaysRaw)
803816
}
804817

805818
if retentionDays5m == nil {
806-
retentionTime5m = DefaultMetricsRetentionDays5mDownsampling
819+
retentionTime5m = *resp.MetricsRetentionTime5m
807820
} else {
808-
retentionTime5m = *retentionDays5m
821+
retentionTime5m = fmt.Sprintf("%dd", *retentionDays5m)
809822
}
810823

811824
if retentionDays1h == nil {
812-
retentionTime1h = DefaultMetricsRetentionDays1hDownsampling
825+
retentionTime1h = *resp.MetricsRetentionTime1h
813826
} else {
814-
retentionTime1h = *retentionDays1h
827+
retentionTime1h = fmt.Sprintf("%dd", *retentionDays1h)
815828
}
816829

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

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

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

33
import (
44
"context"
5-
"fmt"
65
"testing"
76

87
"github.com/google/go-cmp/cmp"
@@ -396,6 +395,7 @@ func TestToUpdateMetricsStorageRetentionPayload(t *testing.T) {
396395
retentionDaysRaw *int64
397396
retentionDays1h *int64
398397
retentionDays5m *int64
398+
getMetricsResp *argus.GetMetricsStorageRetentionResponse
399399
expected *argus.UpdateMetricsStorageRetentionPayload
400400
isValid bool
401401
}{
@@ -404,6 +404,11 @@ 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+
},
407412
&argus.UpdateMetricsStorageRetentionPayload{
408413
MetricsRetentionTimeRaw: utils.Ptr("120d"),
409414
MetricsRetentionTime1h: utils.Ptr("60d"),
@@ -416,10 +421,15 @@ func TestToUpdateMetricsStorageRetentionPayload(t *testing.T) {
416421
utils.Ptr(int64(120)),
417422
nil,
418423
nil,
424+
&argus.GetMetricsStorageRetentionResponse{
425+
MetricsRetentionTimeRaw: utils.Ptr("60d"),
426+
MetricsRetentionTime1h: utils.Ptr("30d"),
427+
MetricsRetentionTime5m: utils.Ptr("7d"),
428+
},
419429
&argus.UpdateMetricsStorageRetentionPayload{
420430
MetricsRetentionTimeRaw: utils.Ptr("120d"),
421-
MetricsRetentionTime1h: utils.Ptr(fmt.Sprintf("%dd", DefaultMetricsRetentionDays1hDownsampling)),
422-
MetricsRetentionTime5m: utils.Ptr(fmt.Sprintf("%dd", DefaultMetricsRetentionDays5mDownsampling)),
431+
MetricsRetentionTime1h: utils.Ptr("30d"),
432+
MetricsRetentionTime5m: utils.Ptr("7d"),
423433
},
424434
true,
425435
},
@@ -428,10 +438,15 @@ func TestToUpdateMetricsStorageRetentionPayload(t *testing.T) {
428438
nil,
429439
utils.Ptr(int64(60)),
430440
nil,
441+
&argus.GetMetricsStorageRetentionResponse{
442+
MetricsRetentionTimeRaw: utils.Ptr("60d"),
443+
MetricsRetentionTime1h: utils.Ptr("30d"),
444+
MetricsRetentionTime5m: utils.Ptr("7d"),
445+
},
431446
&argus.UpdateMetricsStorageRetentionPayload{
432-
MetricsRetentionTimeRaw: utils.Ptr(fmt.Sprintf("%dd", DefaultMetricsRetentionDays)),
447+
MetricsRetentionTimeRaw: utils.Ptr("60d"),
433448
MetricsRetentionTime1h: utils.Ptr("60d"),
434-
MetricsRetentionTime5m: utils.Ptr(fmt.Sprintf("%dd", DefaultMetricsRetentionDays5mDownsampling)),
449+
MetricsRetentionTime5m: utils.Ptr("7d"),
435450
},
436451
true,
437452
},
@@ -440,9 +455,14 @@ func TestToUpdateMetricsStorageRetentionPayload(t *testing.T) {
440455
nil,
441456
nil,
442457
utils.Ptr(int64(14)),
458+
&argus.GetMetricsStorageRetentionResponse{
459+
MetricsRetentionTimeRaw: utils.Ptr("60d"),
460+
MetricsRetentionTime1h: utils.Ptr("30d"),
461+
MetricsRetentionTime5m: utils.Ptr("7d"),
462+
},
443463
&argus.UpdateMetricsStorageRetentionPayload{
444-
MetricsRetentionTimeRaw: utils.Ptr(fmt.Sprintf("%dd", DefaultMetricsRetentionDays)),
445-
MetricsRetentionTime1h: utils.Ptr(fmt.Sprintf("%dd", DefaultMetricsRetentionDays1hDownsampling)),
464+
MetricsRetentionTimeRaw: utils.Ptr("60d"),
465+
MetricsRetentionTime1h: utils.Ptr("30d"),
446466
MetricsRetentionTime5m: utils.Ptr("14d"),
447467
},
448468
true,
@@ -452,17 +472,40 @@ func TestToUpdateMetricsStorageRetentionPayload(t *testing.T) {
452472
nil,
453473
nil,
454474
nil,
475+
&argus.GetMetricsStorageRetentionResponse{
476+
MetricsRetentionTimeRaw: utils.Ptr("60d"),
477+
MetricsRetentionTime1h: utils.Ptr("30d"),
478+
MetricsRetentionTime5m: utils.Ptr("7d"),
479+
},
455480
&argus.UpdateMetricsStorageRetentionPayload{
456-
MetricsRetentionTimeRaw: utils.Ptr(fmt.Sprintf("%dd", DefaultMetricsRetentionDays)),
457-
MetricsRetentionTime1h: utils.Ptr(fmt.Sprintf("%dd", DefaultMetricsRetentionDays1hDownsampling)),
458-
MetricsRetentionTime5m: utils.Ptr(fmt.Sprintf("%dd", DefaultMetricsRetentionDays5mDownsampling)),
481+
MetricsRetentionTimeRaw: utils.Ptr("60d"),
482+
MetricsRetentionTime1h: utils.Ptr("30d"),
483+
MetricsRetentionTime5m: utils.Ptr("7d"),
459484
},
460485
true,
461486
},
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+
},
462505
}
463506
for _, tt := range tests {
464507
t.Run(tt.description, func(t *testing.T) {
465-
output, err := toUpdateMetricsStorageRetentionPayload(tt.retentionDaysRaw, tt.retentionDays5m, tt.retentionDays1h)
508+
output, err := toUpdateMetricsStorageRetentionPayload(tt.retentionDaysRaw, tt.retentionDays5m, tt.retentionDays1h, tt.getMetricsResp)
466509
if !tt.isValid && err == nil {
467510
t.Fatalf("Should have failed")
468511
}

0 commit comments

Comments
 (0)