From e32dae9d7dea3bea9b2d6b3bc007e5d73e2650a1 Mon Sep 17 00:00:00 2001 From: Laurent Piroelle Date: Tue, 3 Oct 2023 16:14:02 +0200 Subject: [PATCH] Rework Azure Key Vault --- docs/severity.md | 4 +- modules/integration_azure-key-vault/README.md | 8 +- .../conf/01-api-result.yaml | 28 ++++ .../conf/02-api-latency.yaml | 23 +++ .../conf/readme.yaml | 2 +- .../detectors-gen.tf | 94 +++++++++++ .../detectors-keyvault.tf | 83 ---------- modules/integration_azure-key-vault/moved.tf | 4 + .../integration_azure-key-vault/outputs.tf | 6 +- .../{variables.tf => variables-gen.tf} | 147 +++++++++++------- 10 files changed, 248 insertions(+), 151 deletions(-) create mode 100644 modules/integration_azure-key-vault/conf/01-api-result.yaml create mode 100644 modules/integration_azure-key-vault/conf/02-api-latency.yaml create mode 100644 modules/integration_azure-key-vault/detectors-gen.tf delete mode 100644 modules/integration_azure-key-vault/detectors-keyvault.tf create mode 100644 modules/integration_azure-key-vault/moved.tf rename modules/integration_azure-key-vault/{variables.tf => variables-gen.tf} (50%) diff --git a/docs/severity.md b/docs/severity.md index cb76d9fb2..fe0f4a277 100644 --- a/docs/severity.md +++ b/docs/severity.md @@ -566,8 +566,8 @@ |Detector|Critical|Major|Minor|Warning|Info| |---|---|---|---|---|---| -|Azure Key Vault API result rate|X|X|-|-|-| -|Azure Key Vault API latency|-|X|X|-|-| +|Azure Key Vault api result rate|X|X|-|-|-| +|Azure Key Vault api latency|-|X|X|-|-| ## integration_azure-load-balancer diff --git a/modules/integration_azure-key-vault/README.md b/modules/integration_azure-key-vault/README.md index dde03013d..e8d2c0a26 100644 --- a/modules/integration_azure-key-vault/README.md +++ b/modules/integration_azure-key-vault/README.md @@ -57,7 +57,7 @@ Note the following parameters: These 3 parameters alongs with all variables defined in [common-variables.tf](common-variables.tf) are common to all [modules](../) in this repository. Other variables, specific to this module, are available in -[variables.tf](variables.tf). +[variables-gen.tf](variables-gen.tf). In general, the default configuration "works" but all of these Terraform [variables](https://www.terraform.io/language/values/variables) make it possible to customize the detectors behavior to better fit your needs. @@ -75,8 +75,8 @@ This module creates the following SignalFx detectors which could contain one or |Detector|Critical|Major|Minor|Warning|Info| |---|---|---|---|---|---| -|Azure Key Vault API result rate|X|X|-|-|-| -|Azure Key Vault API latency|-|X|X|-|-| +|Azure Key Vault api result rate|X|X|-|-|-| +|Azure Key Vault api latency|-|X|X|-|-| ## How to collect required metrics? @@ -105,4 +105,4 @@ Here is the list of required metrics for detectors in this module. * [Terraform SignalFx provider](https://registry.terraform.io/providers/splunk-terraform/signalfx/latest/docs) * [Terraform SignalFx detector](https://registry.terraform.io/providers/splunk-terraform/signalfx/latest/docs/resources/detector) * [Splunk Observability integrations](https://docs.splunk.com/Observability/gdi/get-data-in/integrations.html) -* [Azure Monitor metrics](https://docs.microsoft.com/en-us/azure/azure-monitor/essentials/metrics-supported#microsoftkeyvaultvaults) +* [Azure Monitor metrics](https://learn.microsoft.com/en-us/azure/azure-monitor/reference/supported-metrics/microsoft-keyvault-vaults-metrics) diff --git a/modules/integration_azure-key-vault/conf/01-api-result.yaml b/modules/integration_azure-key-vault/conf/01-api-result.yaml new file mode 100644 index 000000000..2bf82de7c --- /dev/null +++ b/modules/integration_azure-key-vault/conf/01-api-result.yaml @@ -0,0 +1,28 @@ +--- +module: "Azure Key Vault" +name: "API result rate" +filtering: "filter('resource_type', 'Microsoft.KeyVault/vaults') and filter('primary_aggregation_type', 'true')" +aggregation: ".sum(by=['azure_resource_name', 'azure_resource_group_name', 'azure_region'])" +transformation: true +value_unit: "%" +signals: + api_success: + metric: ServiceApiResult + extrapolation: zero + filter: filter('statuscode', '200') + api_all: + metric: ServiceApiResult + extrapolation: zero + signal: + formula: (api_success/api_all).scale(100).fill(100) +rules: + critical: + threshold: 10 + comparator: "<" + lasting_duration: '5m' + major: + threshold: 30 + comparator: "<" + lasting_duration: '5m' + dependency: critical +... diff --git a/modules/integration_azure-key-vault/conf/02-api-latency.yaml b/modules/integration_azure-key-vault/conf/02-api-latency.yaml new file mode 100644 index 000000000..1e77c3be7 --- /dev/null +++ b/modules/integration_azure-key-vault/conf/02-api-latency.yaml @@ -0,0 +1,23 @@ +--- +module: "Azure Key Vault" +name: "API latency" +filtering: "filter('resource_type', 'Microsoft.KeyVault/vaults') and filter('primary_aggregation_type', 'true')" +aggregation: ".mean(by=['azure_resource_name', 'azure_resource_group_name', 'azure_region'])" +transformation: true +value_unit: "ms" +signals: + signal: + metric: ServiceApiLatency + extrapolation: zero + filter: not filter('activityname', 'secretlist') +rules: + major: + threshold: 500 + comparator: ">" + lasting_duration: '1h' + minor: + threshold: 500 + comparator: ">" + lasting_duration: '30m' + dependency: major +... diff --git a/modules/integration_azure-key-vault/conf/readme.yaml b/modules/integration_azure-key-vault/conf/readme.yaml index 5840af911..839f5d4eb 100644 --- a/modules/integration_azure-key-vault/conf/readme.yaml +++ b/modules/integration_azure-key-vault/conf/readme.yaml @@ -1,3 +1,3 @@ documentations: - name: Azure Monitor metrics - url: 'https://docs.microsoft.com/en-us/azure/azure-monitor/essentials/metrics-supported#microsoftkeyvaultvaults' + url: 'https://learn.microsoft.com/en-us/azure/azure-monitor/reference/supported-metrics/microsoft-keyvault-vaults-metrics' diff --git a/modules/integration_azure-key-vault/detectors-gen.tf b/modules/integration_azure-key-vault/detectors-gen.tf new file mode 100644 index 000000000..4ab47b4dc --- /dev/null +++ b/modules/integration_azure-key-vault/detectors-gen.tf @@ -0,0 +1,94 @@ +resource "signalfx_detector" "api_result_rate" { + name = format("%s %s", local.detector_name_prefix, "Azure Key Vault api result rate") + + authorized_writer_teams = var.authorized_writer_teams + teams = try(coalescelist(var.teams, var.authorized_writer_teams), null) + tags = compact(concat(local.common_tags, local.tags, var.extra_tags)) + + viz_options { + label = "signal" + value_suffix = "%" + } + + program_text = <<-EOF + base_filtering = filter('resource_type', 'Microsoft.KeyVault/vaults') and filter('primary_aggregation_type', 'true') + api_success = data('ServiceApiResult', filter=base_filtering and filter('statuscode', '200') and ${module.filtering.signalflow}, extrapolation='zero')${var.api_result_rate_aggregation_function}${var.api_result_rate_transformation_function} + api_all = data('ServiceApiResult', filter=base_filtering and ${module.filtering.signalflow}, extrapolation='zero')${var.api_result_rate_aggregation_function}${var.api_result_rate_transformation_function} + signal = (api_success/api_all).scale(100).fill(100).publish('signal') + detect(when(signal < ${var.api_result_rate_threshold_critical}, lasting=%{if var.api_result_rate_lasting_duration_critical == null}None%{else}'${var.api_result_rate_lasting_duration_critical}'%{endif}, at_least=${var.api_result_rate_at_least_percentage_critical})).publish('CRIT') + detect(when(signal < ${var.api_result_rate_threshold_major}, lasting=%{if var.api_result_rate_lasting_duration_major == null}None%{else}'${var.api_result_rate_lasting_duration_major}'%{endif}, at_least=${var.api_result_rate_at_least_percentage_major}) and (not when(signal < ${var.api_result_rate_threshold_critical}, lasting=%{if var.api_result_rate_lasting_duration_critical == null}None%{else}'${var.api_result_rate_lasting_duration_critical}'%{endif}, at_least=${var.api_result_rate_at_least_percentage_critical}))).publish('MAJOR') +EOF + + rule { + description = "is too low < ${var.api_result_rate_threshold_critical}%" + severity = "Critical" + detect_label = "CRIT" + disabled = coalesce(var.api_result_rate_disabled_critical, var.api_result_rate_disabled, var.detectors_disabled) + notifications = try(coalescelist(lookup(var.api_result_rate_notifications, "critical", []), var.notifications.critical), null) + runbook_url = try(coalesce(var.api_result_rate_runbook_url, var.runbook_url), "") + tip = var.api_result_rate_tip + parameterized_subject = var.message_subject == "" ? local.rule_subject : var.message_subject + parameterized_body = var.message_body == "" ? local.rule_body : var.message_body + } + + rule { + description = "is too low < ${var.api_result_rate_threshold_major}%" + severity = "Major" + detect_label = "MAJOR" + disabled = coalesce(var.api_result_rate_disabled_major, var.api_result_rate_disabled, var.detectors_disabled) + notifications = try(coalescelist(lookup(var.api_result_rate_notifications, "major", []), var.notifications.major), null) + runbook_url = try(coalesce(var.api_result_rate_runbook_url, var.runbook_url), "") + tip = var.api_result_rate_tip + parameterized_subject = var.message_subject == "" ? local.rule_subject : var.message_subject + parameterized_body = var.message_body == "" ? local.rule_body : var.message_body + } + + max_delay = var.api_result_rate_max_delay +} + +resource "signalfx_detector" "api_latency" { + name = format("%s %s", local.detector_name_prefix, "Azure Key Vault api latency") + + authorized_writer_teams = var.authorized_writer_teams + teams = try(coalescelist(var.teams, var.authorized_writer_teams), null) + tags = compact(concat(local.common_tags, local.tags, var.extra_tags)) + + viz_options { + label = "signal" + value_suffix = "ms" + } + + program_text = <<-EOF + base_filtering = filter('resource_type', 'Microsoft.KeyVault/vaults') and filter('primary_aggregation_type', 'true') + signal = data('ServiceApiLatency', filter=base_filtering and not filter('activityname', 'secretlist') and ${module.filtering.signalflow}, extrapolation='zero')${var.api_latency_aggregation_function}${var.api_latency_transformation_function}.publish('signal') + detect(when(signal > ${var.api_latency_threshold_major}, lasting=%{if var.api_latency_lasting_duration_major == null}None%{else}'${var.api_latency_lasting_duration_major}'%{endif}, at_least=${var.api_latency_at_least_percentage_major})).publish('MAJOR') + detect(when(signal > ${var.api_latency_threshold_minor}, lasting=%{if var.api_latency_lasting_duration_minor == null}None%{else}'${var.api_latency_lasting_duration_minor}'%{endif}, at_least=${var.api_latency_at_least_percentage_minor}) and (not when(signal > ${var.api_latency_threshold_major}, lasting=%{if var.api_latency_lasting_duration_major == null}None%{else}'${var.api_latency_lasting_duration_major}'%{endif}, at_least=${var.api_latency_at_least_percentage_major}))).publish('MINOR') +EOF + + rule { + description = "is too high > ${var.api_latency_threshold_major}ms" + severity = "Major" + detect_label = "MAJOR" + disabled = coalesce(var.api_latency_disabled_major, var.api_latency_disabled, var.detectors_disabled) + notifications = try(coalescelist(lookup(var.api_latency_notifications, "major", []), var.notifications.major), null) + runbook_url = try(coalesce(var.api_latency_runbook_url, var.runbook_url), "") + tip = var.api_latency_tip + parameterized_subject = var.message_subject == "" ? local.rule_subject : var.message_subject + parameterized_body = var.message_body == "" ? local.rule_body : var.message_body + } + + rule { + description = "is too high > ${var.api_latency_threshold_minor}ms" + severity = "Minor" + detect_label = "MINOR" + disabled = coalesce(var.api_latency_disabled_minor, var.api_latency_disabled, var.detectors_disabled) + notifications = try(coalescelist(lookup(var.api_latency_notifications, "minor", []), var.notifications.minor), null) + runbook_url = try(coalesce(var.api_latency_runbook_url, var.runbook_url), "") + tip = var.api_latency_tip + parameterized_subject = var.message_subject == "" ? local.rule_subject : var.message_subject + parameterized_body = var.message_body == "" ? local.rule_body : var.message_body + } + + max_delay = var.api_latency_max_delay +} + diff --git a/modules/integration_azure-key-vault/detectors-keyvault.tf b/modules/integration_azure-key-vault/detectors-keyvault.tf deleted file mode 100644 index c00c84d6c..000000000 --- a/modules/integration_azure-key-vault/detectors-keyvault.tf +++ /dev/null @@ -1,83 +0,0 @@ -resource "signalfx_detector" "api_result" { - name = format("%s %s", local.detector_name_prefix, "Azure Key Vault API result rate") - - authorized_writer_teams = var.authorized_writer_teams - teams = try(coalescelist(var.teams, var.authorized_writer_teams), null) - tags = compact(concat(local.common_tags, local.tags, var.extra_tags)) - - program_text = <<-EOF - base_filter = filter('resource_type', 'Microsoft.KeyVault/vaults') and filter('primary_aggregation_type', 'true') - A = data('ServiceApiResult', extrapolation="zero", filter=base_filter and filter('statuscode', '200') and ${module.filtering.signalflow})${var.api_result_aggregation_function} - B = data('ServiceApiResult', extrapolation="zero", filter=base_filter and ${module.filtering.signalflow})${var.api_result_aggregation_function} - signal = (A/B).scale(100).fill(100).publish('signal') - detect(when(signal < threshold(${var.api_result_threshold_critical}), lasting="${var.api_result_lasting_duration_critical}")).publish('CRIT') - detect(when(signal < threshold(${var.api_result_threshold_major}), lasting="${var.api_result_lasting_duration_major}") and (not when(signal < ${var.api_result_threshold_critical}, lasting="${var.api_result_lasting_duration_critical}"))).publish('MAJOR') - EOF - - rule { - description = "is too low < ${var.api_result_threshold_critical}%" - severity = "Critical" - detect_label = "CRIT" - disabled = coalesce(var.api_result_disabled_critical, var.api_result_disabled, var.detectors_disabled) - notifications = try(coalescelist(lookup(var.api_result_notifications, "critical", []), var.notifications.critical), null) - runbook_url = try(coalesce(var.api_result_runbook_url, var.runbook_url), "") - tip = var.api_result_tip - parameterized_subject = var.message_subject == "" ? local.rule_subject : var.message_subject - parameterized_body = var.message_body == "" ? local.rule_body : var.message_body - } - - rule { - description = "is too low < ${var.api_result_threshold_major}%" - severity = "Major" - detect_label = "MAJOR" - disabled = coalesce(var.api_result_disabled_major, var.api_result_disabled, var.detectors_disabled) - notifications = try(coalescelist(lookup(var.api_result_notifications, "major", []), var.notifications.major), null) - runbook_url = try(coalesce(var.api_result_runbook_url, var.runbook_url), "") - tip = var.api_result_tip - parameterized_subject = var.message_subject == "" ? local.rule_subject : var.message_subject - parameterized_body = var.message_body == "" ? local.rule_body : var.message_body - } - - max_delay = var.api_result_max_delay -} - -resource "signalfx_detector" "api_latency" { - name = format("%s %s", local.detector_name_prefix, "Azure Key Vault API latency") - - authorized_writer_teams = var.authorized_writer_teams - teams = try(coalescelist(var.teams, var.authorized_writer_teams), null) - tags = compact(concat(local.common_tags, local.tags, var.extra_tags)) - - program_text = <<-EOF - base_filter = filter('resource_type', 'Microsoft.KeyVault/vaults') and filter('primary_aggregation_type', 'true') - signal = data('ServiceApiLatency', extrapolation="zero", filter=base_filter and not filter('activityname', 'secretlist') and ${module.filtering.signalflow})${var.api_latency_aggregation_function}.publish('signal') - detect(when(signal > threshold(${var.api_latency_threshold_major}), lasting="${var.api_latency_lasting_duration_major}")).publish('MAJOR') - detect(when(signal > threshold(${var.api_latency_threshold_minor}), lasting="${var.api_latency_lasting_duration_minor}") and (not when(signal > ${var.api_latency_threshold_major}, lasting="${var.api_latency_lasting_duration_major}"))).publish('MINOR') - EOF - - rule { - description = "is too high > ${var.api_latency_threshold_major}ms" - severity = "Major" - detect_label = "MAJOR" - disabled = coalesce(var.api_latency_disabled_major, var.api_latency_disabled, var.detectors_disabled) - notifications = try(coalescelist(lookup(var.api_latency_notifications, "major", []), var.notifications.major), null) - runbook_url = try(coalesce(var.api_latency_runbook_url, var.runbook_url), "") - tip = var.api_latency_tip - parameterized_subject = var.message_subject == "" ? local.rule_subject : var.message_subject - parameterized_body = var.message_body == "" ? local.rule_body : var.message_body - } - - rule { - description = "is too high > ${var.api_latency_threshold_minor}ms" - severity = "Minor" - detect_label = "MINOR" - disabled = coalesce(var.api_latency_disabled_minor, var.api_latency_disabled, var.detectors_disabled) - notifications = try(coalescelist(lookup(var.api_latency_notifications, "minor", []), var.notifications.minor), null) - runbook_url = try(coalesce(var.api_latency_runbook_url, var.runbook_url), "") - tip = var.api_latency_tip - parameterized_subject = var.message_subject == "" ? local.rule_subject : var.message_subject - parameterized_body = var.message_body == "" ? local.rule_body : var.message_body - } - - max_delay = var.api_latency_max_delay -} diff --git a/modules/integration_azure-key-vault/moved.tf b/modules/integration_azure-key-vault/moved.tf new file mode 100644 index 000000000..5b2fdf1e7 --- /dev/null +++ b/modules/integration_azure-key-vault/moved.tf @@ -0,0 +1,4 @@ +moved { + from = signalfx_detector.api_result + to = signalfx_detector.api_result_rate +} \ No newline at end of file diff --git a/modules/integration_azure-key-vault/outputs.tf b/modules/integration_azure-key-vault/outputs.tf index cb226c310..26aef1074 100644 --- a/modules/integration_azure-key-vault/outputs.tf +++ b/modules/integration_azure-key-vault/outputs.tf @@ -3,8 +3,8 @@ output "api_latency" { value = signalfx_detector.api_latency } -output "api_result" { - description = "Detector resource for api_result" - value = signalfx_detector.api_result +output "api_result_rate" { + description = "Detector resource for api_result_rate" + value = signalfx_detector.api_result_rate } diff --git a/modules/integration_azure-key-vault/variables.tf b/modules/integration_azure-key-vault/variables-gen.tf similarity index 50% rename from modules/integration_azure-key-vault/variables.tf rename to modules/integration_azure-key-vault/variables-gen.tf index 4675bede2..085c7c21b 100644 --- a/modules/integration_azure-key-vault/variables.tf +++ b/modules/integration_azure-key-vault/variables-gen.tf @@ -1,81 +1,113 @@ -# Module specific +# api_result_rate detector -# api_result detector +variable "api_result_rate_notifications" { + description = "Notification recipients list per severity overridden for api_result_rate detector" + type = map(list(string)) + default = {} +} + +variable "api_result_rate_aggregation_function" { + description = "Aggregation function and group by for api_result_rate detector (i.e. \".mean(by=['host'])\")" + type = string + default = ".sum(by=['azure_resource_name', 'azure_resource_group_name', 'azure_region'])" +} -variable "api_result_max_delay" { - description = "Enforce max delay for api_result detector (use \"0\" or \"null\" for \"Auto\")" +variable "api_result_rate_transformation_function" { + description = "Transformation function for api_result_rate detector (i.e. \".mean(over='5m')\")" + type = string + default = "" +} + +variable "api_result_rate_max_delay" { + description = "Enforce max delay for api_result_rate detector (use \"0\" or \"null\" for \"Auto\")" type = number default = null } -variable "api_result_tip" { +variable "api_result_rate_tip" { description = "Suggested first course of action or any note useful for incident handling" type = string default = "" } -variable "api_result_runbook_url" { +variable "api_result_rate_runbook_url" { description = "URL like SignalFx dashboard or wiki page which can help to troubleshoot the incident cause" type = string default = "" } -variable "api_result_disabled" { - description = "Disable all alerting rules for api_result detector" +variable "api_result_rate_disabled" { + description = "Disable all alerting rules for api_result_rate detector" type = bool default = null } -variable "api_result_disabled_critical" { - description = "Disable critical alerting rule for api_result detector" +variable "api_result_rate_disabled_critical" { + description = "Disable critical alerting rule for api_result_rate detector" type = bool default = null } -variable "api_result_disabled_major" { - description = "Disable major alerting rule for api_result detector" +variable "api_result_rate_disabled_major" { + description = "Disable major alerting rule for api_result_rate detector" type = bool default = null } -variable "api_result_notifications" { - description = "Notification recipients list per severity overridden for api_result detector" - type = map(list(string)) - default = {} -} - -variable "api_result_aggregation_function" { - description = "Aggregation function and group by for api_result detector (i.e. \".mean(by=['host'])\")" - type = string - default = ".sum(by=['azure_resource_name', 'azure_resource_group_name', 'azure_region'])" +variable "api_result_rate_threshold_critical" { + description = "Critical threshold for api_result_rate detector in %" + type = number + default = 10 } -variable "api_result_lasting_duration_critical" { - description = "Evaluation window for api_result detector (i.e. 5m, 20m, 1h, 1d)" +variable "api_result_rate_lasting_duration_critical" { + description = "Minimum duration that conditions must be true before raising alert" type = string default = "5m" } -variable "api_result_threshold_critical" { - description = "Critical threshold for api_result detector" +variable "api_result_rate_at_least_percentage_critical" { + description = "Percentage of lasting that conditions must be true before raising alert (>= 0.0 and <= 1.0)" type = number - default = 10 + default = 1 +} +variable "api_result_rate_threshold_major" { + description = "Major threshold for api_result_rate detector in %" + type = number + default = 30 } -variable "api_result_lasting_duration_major" { - description = "Evaluation window for api_result detector (i.e. 5m, 20m, 1h, 1d)" +variable "api_result_rate_lasting_duration_major" { + description = "Minimum duration that conditions must be true before raising alert" type = string default = "5m" } -variable "api_result_threshold_major" { - description = "Major threshold for api_result detector" +variable "api_result_rate_at_least_percentage_major" { + description = "Percentage of lasting that conditions must be true before raising alert (>= 0.0 and <= 1.0)" type = number - default = 30 + default = 1 } - # api_latency detector +variable "api_latency_notifications" { + description = "Notification recipients list per severity overridden for api_latency detector" + type = map(list(string)) + default = {} +} + +variable "api_latency_aggregation_function" { + description = "Aggregation function and group by for api_latency detector (i.e. \".mean(by=['host'])\")" + type = string + default = ".mean(by=['azure_resource_name', 'azure_resource_group_name', 'azure_region'])" +} + +variable "api_latency_transformation_function" { + description = "Transformation function for api_latency detector (i.e. \".mean(over='5m')\")" + type = string + default = "" +} + variable "api_latency_max_delay" { description = "Enforce max delay for api_latency detector (use \"0\" or \"null\" for \"Auto\")" type = number @@ -100,50 +132,49 @@ variable "api_latency_disabled" { default = null } -variable "api_latency_disabled_minor" { - description = "Disable minor alerting rule for api_latency detector" - type = bool - default = null -} - variable "api_latency_disabled_major" { description = "Disable major alerting rule for api_latency detector" type = bool default = null } -variable "api_latency_notifications" { - description = "Notification recipients list per severity overridden for api_latency detector" - type = map(list(string)) - default = {} -} - -variable "api_latency_aggregation_function" { - description = "Aggregation function and group by for api_latency detector (i.e. \".mean(by=['host'])\")" - type = string - default = ".mean(by=['azure_resource_name', 'azure_resource_group_name', 'azure_region'])" +variable "api_latency_disabled_minor" { + description = "Disable minor alerting rule for api_latency detector" + type = bool + default = null } -variable "api_latency_lasting_duration_minor" { - description = "Evaluation window for api_latency detector (i.e. 5m, 20m, 1h, 1d)" - type = string - default = "30m" +variable "api_latency_threshold_major" { + description = "Major threshold for api_latency detector in ms" + type = number + default = 500 } variable "api_latency_lasting_duration_major" { - description = "Evaluation window for api_latency detector (i.e. 5m, 20m, 1h, 1d)" + description = "Minimum duration that conditions must be true before raising alert" type = string default = "1h" } +variable "api_latency_at_least_percentage_major" { + description = "Percentage of lasting that conditions must be true before raising alert (>= 0.0 and <= 1.0)" + type = number + default = 1 +} variable "api_latency_threshold_minor" { - description = "Minor threshold for api_latency detector" + description = "Minor threshold for api_latency detector in ms" type = number default = 500 } -variable "api_latency_threshold_major" { - description = "Major threshold for api_latency detector" +variable "api_latency_lasting_duration_minor" { + description = "Minimum duration that conditions must be true before raising alert" + type = string + default = "30m" +} + +variable "api_latency_at_least_percentage_minor" { + description = "Percentage of lasting that conditions must be true before raising alert (>= 0.0 and <= 1.0)" type = number - default = 500 + default = 1 }