Implement observability alertgroups (#778)

* feat: implement observability alertgroups

* review changes
This commit is contained in:
Mauritz Uphoff 2025-04-14 13:21:30 +02:00 committed by GitHub
parent 44103a1ffd
commit 289746c7d1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 1987 additions and 4 deletions

View file

@ -41,6 +41,17 @@ var scrapeConfigResource = map[string]string{
"saml2_enable_url_parameters": "false",
}
var alertGroupResource = map[string]string{
"name": fmt.Sprintf("alertgroup-%s", acctest.RandStringFromCharSet(7, acctest.CharSetAlphaNum)),
"name_updated": fmt.Sprintf("alertgroup-%s", acctest.RandStringFromCharSet(7, acctest.CharSetAlphaNum)),
"interval": "5h",
"interval_updated": "1h",
"alert": "alert1",
"expression": "expression1",
"expression_updated": "expression2",
"for": "60s",
}
var credentialResource = map[string]string{
"project_id": testutil.ProjectId,
}
@ -228,8 +239,31 @@ func credentialResourceConfig() string {
}`
}
func resourceConfig(acl, metricsRetentionDays, metricsRetentionDays1hDownsampling, metricsRetentionDays5mDownsampling, alertConfig *string, instanceName, planName, target, saml2EnableUrlParameters string) string {
return fmt.Sprintf("%s\n\n%s\n\n%s\n\n%s",
func alertGroupResourceConfig(name, interval, expression string) string {
return fmt.Sprintf(
`resource "stackit_observability_alertgroup" "alertgroup" {
project_id = stackit_observability_instance.instance.project_id
instance_id = stackit_observability_instance.instance.instance_id
name = "%s"
interval = "%s"
rules = [
{
alert = "%s"
expression = "%s"
for = "%s"
}
]
}`,
name,
interval,
alertGroupResource["alert"],
expression,
alertGroupResource["for"],
)
}
func resourceConfig(acl, metricsRetentionDays, metricsRetentionDays1hDownsampling, metricsRetentionDays5mDownsampling, alertConfig *string, instanceName, planName, target, saml2EnableUrlParameters, alertGroupName, alertGroupInterval, alertGroupRule1Expression string) string {
return fmt.Sprintf("%s\n\n%s\n\n%s\n\n%s\n\n%s",
testutil.ObservabilityProviderConfig(),
instanceResourceConfig(acl,
metricsRetentionDays,
@ -240,6 +274,7 @@ func resourceConfig(acl, metricsRetentionDays, metricsRetentionDays1hDownsamplin
planName),
scrapeConfigResourceConfig(target, saml2EnableUrlParameters),
credentialResourceConfig(),
alertGroupResourceConfig(alertGroupName, alertGroupInterval, alertGroupRule1Expression),
)
}
@ -265,6 +300,9 @@ func TestAccResource(t *testing.T) {
instanceResource["plan_name"],
scrapeConfigResource["urls"],
scrapeConfigResource["saml2_enable_url_parameters"],
alertGroupResource["name"],
alertGroupResource["interval"],
alertGroupResource["expression"],
),
Check: resource.ComposeAggregateTestCheckFunc(
// Instance data
@ -349,6 +387,18 @@ func TestAccResource(t *testing.T) {
),
resource.TestCheckResourceAttrSet("stackit_observability_credential.credential", "username"),
resource.TestCheckResourceAttrSet("stackit_observability_credential.credential", "password"),
// alertgroup
resource.TestCheckResourceAttr("stackit_observability_alertgroup.alertgroup", "project_id", credentialResource["project_id"]),
resource.TestCheckResourceAttrPair(
"stackit_observability_instance.instance", "instance_id",
"stackit_observability_alertgroup.alertgroup", "instance_id",
),
resource.TestCheckResourceAttrSet("stackit_observability_alertgroup.alertgroup", "name"),
resource.TestCheckResourceAttrSet("stackit_observability_alertgroup.alertgroup", "interval"),
resource.TestCheckResourceAttrSet("stackit_observability_alertgroup.alertgroup", "rules.0.alert"),
resource.TestCheckResourceAttrSet("stackit_observability_alertgroup.alertgroup", "rules.0.expression"),
resource.TestCheckResourceAttrSet("stackit_observability_alertgroup.alertgroup", "rules.0.for"),
),
},
// Update Alert Config with complete Receiver (email, webhook and opsgenie configs), global options and Route with child routes
@ -368,6 +418,9 @@ func TestAccResource(t *testing.T) {
instanceResource["plan_name"],
scrapeConfigResource["urls"],
scrapeConfigResource["saml2_enable_url_parameters"],
alertGroupResource["name"],
alertGroupResource["interval"],
alertGroupResource["expression"],
),
Check: resource.ComposeAggregateTestCheckFunc(
// Instance data
@ -461,6 +514,18 @@ func TestAccResource(t *testing.T) {
),
resource.TestCheckResourceAttrSet("stackit_observability_credential.credential", "username"),
resource.TestCheckResourceAttrSet("stackit_observability_credential.credential", "password"),
// alertgroup
resource.TestCheckResourceAttr("stackit_observability_alertgroup.alertgroup", "project_id", credentialResource["project_id"]),
resource.TestCheckResourceAttrPair(
"stackit_observability_instance.instance", "instance_id",
"stackit_observability_alertgroup.alertgroup", "instance_id",
),
resource.TestCheckResourceAttrSet("stackit_observability_alertgroup.alertgroup", "name"),
resource.TestCheckResourceAttrSet("stackit_observability_alertgroup.alertgroup", "interval"),
resource.TestCheckResourceAttrSet("stackit_observability_alertgroup.alertgroup", "rules.0.alert"),
resource.TestCheckResourceAttrSet("stackit_observability_alertgroup.alertgroup", "rules.0.expression"),
resource.TestCheckResourceAttrSet("stackit_observability_alertgroup.alertgroup", "rules.0.for"),
),
},
// Update without ACL, partial metrics retention days and NO alert configs
@ -475,6 +540,9 @@ func TestAccResource(t *testing.T) {
instanceResource["plan_name"],
scrapeConfigResource["urls"],
scrapeConfigResource["saml2_enable_url_parameters"],
alertGroupResource["name"],
alertGroupResource["interval"],
alertGroupResource["expression"],
),
Check: resource.ComposeAggregateTestCheckFunc(
// Instance data
@ -530,6 +598,18 @@ func TestAccResource(t *testing.T) {
),
resource.TestCheckResourceAttrSet("stackit_observability_credential.credential", "username"),
resource.TestCheckResourceAttrSet("stackit_observability_credential.credential", "password"),
// alertgroup
resource.TestCheckResourceAttr("stackit_observability_alertgroup.alertgroup", "project_id", credentialResource["project_id"]),
resource.TestCheckResourceAttrPair(
"stackit_observability_instance.instance", "instance_id",
"stackit_observability_alertgroup.alertgroup", "instance_id",
),
resource.TestCheckResourceAttrSet("stackit_observability_alertgroup.alertgroup", "name"),
resource.TestCheckResourceAttrSet("stackit_observability_alertgroup.alertgroup", "interval"),
resource.TestCheckResourceAttrSet("stackit_observability_alertgroup.alertgroup", "rules.0.alert"),
resource.TestCheckResourceAttrSet("stackit_observability_alertgroup.alertgroup", "rules.0.expression"),
resource.TestCheckResourceAttrSet("stackit_observability_alertgroup.alertgroup", "rules.0.for"),
),
},
// Update with empty ACL, NO metrics retention days and NO alert configs
@ -544,6 +624,9 @@ func TestAccResource(t *testing.T) {
instanceResource["plan_name"],
scrapeConfigResource["urls"],
scrapeConfigResource["saml2_enable_url_parameters"],
alertGroupResource["name"],
alertGroupResource["interval"],
alertGroupResource["expression"],
),
Check: resource.ComposeAggregateTestCheckFunc(
// Instance data
@ -599,6 +682,18 @@ func TestAccResource(t *testing.T) {
),
resource.TestCheckResourceAttrSet("stackit_observability_credential.credential", "username"),
resource.TestCheckResourceAttrSet("stackit_observability_credential.credential", "password"),
// alertgroup
resource.TestCheckResourceAttr("stackit_observability_alertgroup.alertgroup", "project_id", credentialResource["project_id"]),
resource.TestCheckResourceAttrPair(
"stackit_observability_instance.instance", "instance_id",
"stackit_observability_alertgroup.alertgroup", "instance_id",
),
resource.TestCheckResourceAttrSet("stackit_observability_alertgroup.alertgroup", "name"),
resource.TestCheckResourceAttrSet("stackit_observability_alertgroup.alertgroup", "interval"),
resource.TestCheckResourceAttrSet("stackit_observability_alertgroup.alertgroup", "rules.0.alert"),
resource.TestCheckResourceAttrSet("stackit_observability_alertgroup.alertgroup", "rules.0.expression"),
resource.TestCheckResourceAttrSet("stackit_observability_alertgroup.alertgroup", "rules.0.for"),
),
},
// Data source
@ -616,6 +711,12 @@ func TestAccResource(t *testing.T) {
instance_id = stackit_observability_scrapeconfig.scrapeconfig.instance_id
name = stackit_observability_scrapeconfig.scrapeconfig.name
}
data "stackit_observability_alertgroup" "alertgroup" {
project_id = stackit_observability_alertgroup.alertgroup.project_id
instance_id = stackit_observability_alertgroup.alertgroup.instance_id
name = stackit_observability_alertgroup.alertgroup.name
}
`,
resourceConfig(
utils.Ptr(fmt.Sprintf(
@ -631,6 +732,9 @@ func TestAccResource(t *testing.T) {
instanceResource["plan_name"],
scrapeConfigResource["urls"],
scrapeConfigResource["saml2_enable_url_parameters"],
alertGroupResource["name"],
alertGroupResource["interval"],
alertGroupResource["expression"],
),
),
Check: resource.ComposeAggregateTestCheckFunc(
@ -670,6 +774,18 @@ func TestAccResource(t *testing.T) {
resource.TestCheckResourceAttr("data.stackit_observability_scrapeconfig.scrapeconfig", "scrape_interval", scrapeConfigResource["scrape_interval"]),
resource.TestCheckResourceAttr("stackit_observability_scrapeconfig.scrapeconfig", "sample_limit", scrapeConfigResource["sample_limit"]),
resource.TestCheckResourceAttr("data.stackit_observability_scrapeconfig.scrapeconfig", "saml2.enable_url_parameters", scrapeConfigResource["saml2_enable_url_parameters"]),
// alertgroup
resource.TestCheckResourceAttr("data.stackit_observability_alertgroup.alertgroup", "project_id", credentialResource["project_id"]),
resource.TestCheckResourceAttrPair(
"stackit_observability_instance.instance", "instance_id",
"data.stackit_observability_alertgroup.alertgroup", "instance_id",
),
resource.TestCheckResourceAttrSet("data.stackit_observability_alertgroup.alertgroup", "name"),
resource.TestCheckResourceAttrSet("data.stackit_observability_alertgroup.alertgroup", "interval"),
resource.TestCheckResourceAttrSet("data.stackit_observability_alertgroup.alertgroup", "rules.0.alert"),
resource.TestCheckResourceAttrSet("data.stackit_observability_alertgroup.alertgroup", "rules.0.expression"),
resource.TestCheckResourceAttrSet("data.stackit_observability_alertgroup.alertgroup", "rules.0.for"),
),
},
// Import 1
@ -711,6 +827,27 @@ func TestAccResource(t *testing.T) {
ImportState: true,
ImportStateVerify: true,
},
// Import 3
{
ResourceName: "stackit_observability_alertgroup.alertgroup",
ImportStateIdFunc: func(s *terraform.State) (string, error) {
r, ok := s.RootModule().Resources["stackit_observability_alertgroup.alertgroup"]
if !ok {
return "", fmt.Errorf("couldn't find resource stackit_observability_alertgroup.alertgroup")
}
instanceId, ok := r.Primary.Attributes["instance_id"]
if !ok {
return "", fmt.Errorf("couldn't find attribute instance_id")
}
name, ok := r.Primary.Attributes["name"]
if !ok {
return "", fmt.Errorf("couldn't find attribute name")
}
return fmt.Sprintf("%s,%s,%s", testutil.ProjectId, instanceId, name), nil
},
ImportState: true,
ImportStateVerify: true,
},
// Update
{
Config: resourceConfig(
@ -727,6 +864,9 @@ func TestAccResource(t *testing.T) {
instanceResource["new_plan_name"],
"",
"true",
alertGroupResource["name_updated"],
alertGroupResource["interval_updated"],
alertGroupResource["expression_updated"],
),
Check: resource.ComposeAggregateTestCheckFunc(
// Instance
@ -782,6 +922,18 @@ func TestAccResource(t *testing.T) {
// Credentials
resource.TestCheckResourceAttrSet("stackit_observability_credential.credential", "username"),
resource.TestCheckResourceAttrSet("stackit_observability_credential.credential", "password"),
// alertgroup
resource.TestCheckResourceAttr("stackit_observability_alertgroup.alertgroup", "project_id", credentialResource["project_id"]),
resource.TestCheckResourceAttrPair(
"stackit_observability_instance.instance", "instance_id",
"stackit_observability_alertgroup.alertgroup", "instance_id",
),
resource.TestCheckResourceAttrSet("stackit_observability_alertgroup.alertgroup", "name"),
resource.TestCheckResourceAttrSet("stackit_observability_alertgroup.alertgroup", "interval"),
resource.TestCheckResourceAttrSet("stackit_observability_alertgroup.alertgroup", "rules.0.alert"),
resource.TestCheckResourceAttrSet("stackit_observability_alertgroup.alertgroup", "rules.0.expression"),
resource.TestCheckResourceAttrSet("stackit_observability_alertgroup.alertgroup", "rules.0.for"),
),
},
// Update and remove saml2 attribute