feat(observability): Min/Max acceptance tests (#805)

Signed-off-by: Alexander Dahmen <alexander.dahmen@inovex.de>
This commit is contained in:
Alexander Dahmen 2025-05-07 10:49:34 +02:00 committed by GitHub
parent ab99821c30
commit c473560332
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 1062 additions and 908 deletions

View file

@ -175,6 +175,7 @@ func (a *alertGroupResource) Schema(_ context.Context, _ resource.SchemaRequest,
"interval": schema.StringAttribute{
Description: descriptions["interval"],
Optional: true,
Computed: true,
Validators: []validator.String{
validate.ValidDurationString(),
},

View file

@ -409,6 +409,12 @@ func (d *instanceDataSource) Read(ctx context.Context, req datasource.ReadReques
return
}
metricsRetentionResp, err := d.client.GetMetricsStorageRetention(ctx, instanceId, projectId).Execute()
if err != nil {
core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading instance", fmt.Sprintf("Calling API to get metrics retention: %v", err))
return
}
alertConfigResp, err := d.client.GetAlertConfigs(ctx, instanceId, projectId).Execute()
if err != nil {
core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading instance", fmt.Sprintf("Calling API to get alert config: %v", err))
@ -421,18 +427,49 @@ func (d *instanceDataSource) Read(ctx context.Context, req datasource.ReadReques
core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading instance", fmt.Sprintf("Processing API payload: %v", err))
return
}
// Set state to instance populated data
diags = resp.State.Set(ctx, model)
resp.Diagnostics.Append(diags...)
if resp.Diagnostics.HasError() {
return
}
err = mapACLField(aclListResp, &model)
if err != nil {
core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading instance", fmt.Sprintf("Processing API response for the ACL: %v", err))
return
}
// Set state to fully populated data
diags = setACL(ctx, &resp.State, &model)
resp.Diagnostics.Append(diags...)
if resp.Diagnostics.HasError() {
return
}
// Map response body to schema
err = mapMetricsRetentionField(metricsRetentionResp, &model)
if err != nil {
core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading instance", fmt.Sprintf("Processing API response for the metrics retention: %v", err))
return
}
// Set state to fully populated data
diags = setMetricsRetentions(ctx, &resp.State, &model)
resp.Diagnostics.Append(diags...)
if resp.Diagnostics.HasError() {
return
}
err = mapAlertConfigField(ctx, alertConfigResp, &model)
if err != nil {
core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Processing API response for the alert config: %v", err))
return
}
diags = resp.State.Set(ctx, model)
// Set state to fully populated data
diags = setAlertConfig(ctx, &resp.State, &model)
resp.Diagnostics.Append(diags...)
if resp.Diagnostics.HasError() {
return

View file

@ -175,6 +175,7 @@ func (l *logAlertGroupResource) Schema(_ context.Context, _ resource.SchemaReque
"interval": schema.StringAttribute{
Description: descriptions["interval"],
Optional: true,
Computed: true,
Validators: []validator.String{
validate.ValidDurationString(),
},

View file

@ -0,0 +1,212 @@
variable "project_id" {}
variable "alertgroup_name" {}
variable "alert_rule_name" {}
variable "alert_rule_expression" {}
variable "alert_for_time" {}
variable "alert_label" {}
variable "alert_annotation" {}
variable "alert_interval" {}
variable "instance_name" {}
variable "plan_name" {}
##variable "instance_parameters" {}
variable "metrics_retention_days" {}
variable "metrics_retention_days_5m_downsampling" {}
variable "metrics_retention_days_1h_downsampling" {}
variable "instance_acl_1" {}
variable "instance_acl_2" {}
variable "receiver_name" {}
variable "auth_identity" {}
variable "auth_password" {}
variable "auth_username" {}
variable "email_from" {}
variable "smart_host" {}
variable "email_to" {}
variable "opsgenie_api_key" {}
variable "opsgenie_api_tags" {}
variable "opsgenie_api_url" {}
variable "webhook_configs_url" {}
variable "ms_teams" {}
variable "group_by" {}
variable "group_interval" {}
variable "group_wait" {}
variable "repeat_interval" {}
variable "resolve_timeout" {}
variable "smtp_auth_identity" {}
variable "smtp_auth_password" {}
variable "smtp_auth_username" {}
variable "smtp_from" {}
variable "smtp_smart_host" {}
variable "match" {}
variable "match_regex" {}
variable "logalertgroup_name" {}
variable "logalertgroup_alert" {}
variable "logalertgroup_expression" {}
variable "logalertgroup_for_time" {}
variable "logalertgroup_label" {}
variable "logalertgroup_annotation" {}
variable "logalertgroup_interval" {}
variable "scrapeconfig_name" {}
variable "scrapeconfig_metrics_path" {}
variable "scrapeconfig_targets_url_1" {}
variable "scrapeconfig_targets_url_2" {}
variable "scrapeconfig_label" {}
variable "scrapeconfig_interval" {}
variable "scrapeconfig_limit" {}
variable "scrapeconfig_enable_url_params" {}
variable "scrapeconfig_scheme" {}
variable "scrapeconfig_timeout" {}
variable "scrapeconfig_auth_username" {}
variable "scrapeconfig_auth_password" {}
resource "stackit_observability_alertgroup" "alertgroup" {
project_id = var.project_id
instance_id = stackit_observability_instance.instance.instance_id
name = var.alertgroup_name
rules = [
{
alert = var.alert_rule_name
expression = var.alert_rule_expression
for = var.alert_for_time
labels = {
label1 = var.alert_label
},
annotations = {
annotation1 = var.alert_annotation
}
}
]
interval = var.alert_interval
}
resource "stackit_observability_credential" "credential" {
project_id = var.project_id
instance_id = stackit_observability_instance.instance.instance_id
}
resource "stackit_observability_instance" "instance" {
project_id = var.project_id
name = var.instance_name
plan_name = var.plan_name
metrics_retention_days = var.metrics_retention_days
metrics_retention_days_5m_downsampling = var.metrics_retention_days_5m_downsampling
metrics_retention_days_1h_downsampling = var.metrics_retention_days_1h_downsampling
acl = [var.instance_acl_1, var.instance_acl_2]
// alert config
alert_config = {
receivers = [
{
name = var.receiver_name
email_configs = [
{
auth_identity = var.auth_identity
auth_password = var.auth_password
auth_username = var.auth_username
from = var.email_from
smart_host = var.smart_host
to = var.email_to
}
]
opsgenie_configs = [
{
api_key = var.opsgenie_api_key
tags = var.opsgenie_api_tags
api_url = var.opsgenie_api_url
}
]
webhooks_configs = [
{
url = var.webhook_configs_url
ms_teams = var.ms_teams
}
]
},
],
route = {
group_by = [var.group_by]
group_interval = var.group_interval
group_wait = var.group_wait
receiver = var.receiver_name
repeat_interval = var.repeat_interval
routes = [
{
group_by = [var.group_by]
group_interval = var.group_interval
group_wait = var.group_wait
receiver = var.receiver_name
repeat_interval = var.repeat_interval
match = {
match1 = var.match
}
match_regex = {
match_regex1 = var.match_regex
}
}
]
},
global = {
opsgenie_api_key = var.opsgenie_api_key
opsgenie_api_url = var.opsgenie_api_url
resolve_timeout = var.resolve_timeout
smtp_auth_identity = var.smtp_auth_identity
smtp_auth_password = var.smtp_auth_password
smtp_auth_username = var.smtp_auth_username
smtp_from = var.smtp_from
smtp_smart_host = var.smtp_smart_host
}
}
}
resource "stackit_observability_logalertgroup" "logalertgroup" {
project_id = var.project_id
instance_id = stackit_observability_instance.instance.instance_id
name = var.logalertgroup_name
rules = [
{
alert = var.logalertgroup_alert
expression = var.logalertgroup_expression
for = var.logalertgroup_for_time
labels = {
label1 = var.logalertgroup_label
},
annotations = {
annotation1 = var.logalertgroup_annotation
}
}
]
interval = var.logalertgroup_interval
}
resource "stackit_observability_scrapeconfig" "scrapeconfig" {
project_id = var.project_id
instance_id = stackit_observability_instance.instance.instance_id
name = var.scrapeconfig_name
metrics_path = var.scrapeconfig_metrics_path
targets = [{
urls = [var.scrapeconfig_targets_url_1, var.scrapeconfig_targets_url_2]
labels = {
label1 = var.scrapeconfig_label
}
}]
scheme = var.scrapeconfig_scheme
scrape_timeout = var.scrapeconfig_timeout
basic_auth = {
username = var.scrapeconfig_auth_username
password = var.scrapeconfig_auth_password
}
scrape_interval = var.scrapeconfig_interval
sample_limit = var.scrapeconfig_limit
saml2 = {
enable_url_parameters = var.scrapeconfig_enable_url_params
}
}

View file

@ -0,0 +1,69 @@
variable "project_id" {}
variable "alertgroup_name" {}
variable "alert_rule_name" {}
variable "alert_rule_expression" {}
variable "instance_name" {}
variable "plan_name" {}
variable "logalertgroup_name" {}
variable "logalertgroup_alert" {}
variable "logalertgroup_expression" {}
variable "scrapeconfig_name" {}
variable "scrapeconfig_metrics_path" {}
variable "scrapeconfig_targets_url" {}
resource "stackit_observability_alertgroup" "alertgroup" {
project_id = var.project_id
instance_id = stackit_observability_instance.instance.instance_id
name = var.alertgroup_name
rules = [
{
alert = var.alert_rule_name
expression = var.alert_rule_expression
}
]
}
resource "stackit_observability_credential" "credential" {
project_id = var.project_id
instance_id = stackit_observability_instance.instance.instance_id
}
resource "stackit_observability_instance" "instance" {
project_id = var.project_id
name = var.instance_name
plan_name = var.plan_name
}
resource "stackit_observability_logalertgroup" "logalertgroup" {
project_id = var.project_id
instance_id = stackit_observability_instance.instance.instance_id
name = var.logalertgroup_name
rules = [
{
alert = var.logalertgroup_alert
expression = var.logalertgroup_expression
}
]
}
resource "stackit_observability_scrapeconfig" "scrapeconfig" {
project_id = var.project_id
instance_id = stackit_observability_instance.instance.instance_id
name = var.scrapeconfig_name
metrics_path = var.scrapeconfig_metrics_path
targets = [{ urls = [var.scrapeconfig_targets_url] }]
}