diff --git a/README.md b/README.md index db806cc..1cc513d 100644 --- a/README.md +++ b/README.md @@ -102,6 +102,7 @@ The `//` is very important, it's a terraform specific syntax used to separate gi - [filter-tags](https://bitbucket.org/morea/terraform.feature.datadog/src/master/common/filter-tags/) - [database](https://bitbucket.org/morea/terraform.feature.datadog/src/master/database/) - [mongodb](https://bitbucket.org/morea/terraform.feature.datadog/src/master/database/mongodb/) + - [mysql](https://bitbucket.org/morea/terraform.feature.datadog/src/master/database/mysql/) - [redis](https://bitbucket.org/morea/terraform.feature.datadog/src/master/database/redis/) - [middleware](https://bitbucket.org/morea/terraform.feature.datadog/src/master/middleware/) - [apache](https://bitbucket.org/morea/terraform.feature.datadog/src/master/middleware/apache/) diff --git a/database/mysql/README.md b/database/mysql/README.md new file mode 100644 index 0000000..9e5d507 --- /dev/null +++ b/database/mysql/README.md @@ -0,0 +1,120 @@ +# DATABASE MYSQL DataDog monitors + +## How to use this module + +``` +module "datadog-monitors-database-mysql" { + source = "git::ssh://git@bitbucket.org/morea/terraform.feature.datadog.git//database/mysql?ref={revision}" + + environment = "${var.environment}" + message = "${module.datadog-message-alerting.alerting-message}" +} + +``` + +## Purpose + +Creates DataDog monitors with the following checks: + +- Mysql server does not respond +- Mysql Connections limit +- Mysql Aborted connects +- Mysql Slow queries +- Mysql Innodb buffer pool efficiency +- Mysql Innodb buffer pool utilization +- Mysql threads changed abnormally +- Mysql queries changed abnormally + +## Inputs + +| Name | Description | Type | Default | Required | +|------|-------------|:----:|:-----:|:-----:| +| environment | Environment | string | - | yes | +| evaluation_delay | Delay in seconds for the metric evaluation | string | `15` | no | +| filter_tags_custom | Tags used for custom filtering when filter_tags_use_defaults is false | string | `*` | no | +| filter_tags_use_defaults | Use default filter tags convention | string | `true` | no | +| message | Message sent when an alert is triggered | string | - | yes | +| mysql_aborted_extra_tags | Extra tags for MySQL aborted connects monitor | list | `` | no | +| mysql_aborted_message | Custom message for MySQL aborted connects monitor | string | `` | no | +| mysql_aborted_silenced | Groups to mute MySQL aborted connects monitor | map | `` | no | +| mysql_aborted_threshold_critical | Maximum critical acceptable percent of aborted connects | string | `10` | no | +| mysql_aborted_threshold_warning | Maximum warning acceptable percent of aborted connects | string | `5` | no | +| mysql_aborted_time_aggregator | Monitor time aggregator for MySQL aborted connects monitor [available values: min, max or avg] | string | `avg` | no | +| mysql_aborted_timeframe | Monitor timeframe for MySQL aborted connects monitor [available values: `last_#m` (1, 5, 10, 15, or 30), `last_#h` (1, 2, or 4), or `last_1d`] | string | `last_10m` | no | +| mysql_availability_extra_tags | Extra tags for Mysql availability monitor | list | `` | no | +| mysql_availability_message | Custom message for Mysql availability monitor | string | `` | no | +| mysql_availability_silenced | Groups to mute for Mysql availability monitor | map | `` | no | +| mysql_availability_threshold_critical | Mysql availability monitor (critical threshold) | string | `1.1754943508222875e-38` | no | +| mysql_connection_extra_tags | Extra tags for MySQL connection monitor | list | `` | no | +| mysql_connection_message | Custom message for MySQL connection monitor | string | `` | no | +| mysql_connection_silenced | Groups to mute MySQL connection monitor | map | `` | no | +| mysql_connection_threshold_critical | Maximum critical acceptable percent of connections | string | `80` | no | +| mysql_connection_threshold_warning | Maximum warning acceptable percent of connections | string | `70` | no | +| mysql_connection_time_aggregator | Monitor time aggregator for MySQL connection monitor [available values: min, max or avg] | string | `avg` | no | +| mysql_connection_timeframe | Monitor timeframe for MySQL connection monitor [available values: `last_#m` (1, 5, 10, 15, or 30), `last_#h` (1, 2, or 4), or `last_1d`] | string | `last_10m` | no | +| mysql_pool_efficiency_extra_tags | Extra tags for MySQL innodb buffer pool efficiency monitor | list | `` | no | +| mysql_pool_efficiency_message | Custom message for MySQL innodb buffer pool efficiency monitor | string | `` | no | +| mysql_pool_efficiency_silenced | Groups to mute MySQL innodb buffer pool efficiency monitor | map | `` | no | +| mysql_pool_efficiency_threshold_critical | Maximum critical acceptable percent of innodb buffer pool efficiency | string | `20` | no | +| mysql_pool_efficiency_threshold_warning | Maximum warning acceptable percent of innodb buffer pool efficiency | string | `1` | no | +| mysql_pool_efficiency_time_aggregator | Monitor time aggregator for MySQL innodb buffer pool efficiency monitor [available values: min, max or avg] | string | `sum` | no | +| mysql_pool_efficiency_timeframe | Monitor timeframe for MySQL innodb buffer pool efficiency monitor [available values: `last_#m` (1, 5, 10, 15, or 30), `last_#h` (1, 2, or 4), or `last_1d`] | string | `last_1h` | no | +| mysql_pool_utilization_extra_tags | Extra tags for MySQL innodb buffer pool utilization monitor | list | `` | no | +| mysql_pool_utilization_message | Custom message for MySQL innodb buffer pool utilization monitor | string | `` | no | +| mysql_pool_utilization_silenced | Groups to mute MySQL innodb buffer pool utilization monitor | map | `` | no | +| mysql_pool_utilization_threshold_critical | Maximum critical acceptable percent of innodb buffer pool utilization | string | `90` | no | +| mysql_pool_utilization_threshold_warning | Maximum warning acceptable percent of innodb buffer pool utilization | string | `75` | no | +| mysql_pool_utilization_time_aggregator | Monitor time aggregator for MySQL innodb buffer pool utilization monitor [available values: min, max or avg] | string | `min` | no | +| mysql_pool_utilization_timeframe | Monitor timeframe for MySQL innodb buffer pool utilization monitor [available values: `last_#m` (1, 5, 10, 15, or 30), `last_#h` (1, 2, or 4), or `last_1d`] | string | `last_4h` | no | +| mysql_queries_alert_window | Alert window. | string | `last_15m` | no | +| mysql_queries_count_default_zero | Count default zero. | string | `true` | no | +| mysql_queries_detection_algorithm | Anomaly Detection Algorithm used | string | `agile` | no | +| mysql_queries_deviations | Deviations to detect the anomaly | string | `5` | no | +| mysql_queries_direction | Direction of the anomaly. It can be both, below or above. | string | `both` | no | +| mysql_queries_extra_tags | Extra tags for MySQL queries monitor | list | `` | no | +| mysql_queries_interval | Interval. | string | `60` | no | +| mysql_queries_message | Custom message for MySQL queries monitor | string | `` | no | +| mysql_queries_seasonality | Seasonality of the algorithm | string | `daily` | no | +| mysql_queries_silenced | Groups to mute mysql queries monitor | map | `` | no | +| mysql_queries_threshold_critical | Maximum critical acceptable number of queries | string | `1` | no | +| mysql_queries_time_aggregator | Monitor time aggregator for MySQL queries monitor [available values: min, max or avg] | string | `avg` | no | +| mysql_queries_timeframe | Monitor timeframe for MySQL queries monitor [available values: `last_#m` (1, 5, 10, 15, or 30), `last_#h` (1, 2, or 4), or `last_1d`] | string | `last_4h` | no | +| mysql_slow_extra_tags | Extra tags for MySQL slow queries monitor | list | `` | no | +| mysql_slow_message | Custom message for MySQL slow queries monitor | string | `` | no | +| mysql_slow_silenced | Groups to mute MySQL slow queries monitor | map | `` | no | +| mysql_slow_threshold_critical | Maximum critical acceptable percent of slow queries | string | `20` | no | +| mysql_slow_threshold_warning | Maximum warning acceptable percent of slow queries | string | `5` | no | +| mysql_slow_time_aggregator | Monitor time aggregator for MySQL slow queries monitor [available values: min, max or avg] | string | `avg` | no | +| mysql_slow_timeframe | Monitor timeframe for MySQL slow queries monitor [available values: `last_#m` (1, 5, 10, 15, or 30), `last_#h` (1, 2, or 4), or `last_1d`] | string | `last_15m` | no | +| mysql_threads_alert_window | Alert window. | string | `last_15m` | no | +| mysql_threads_count_default_zero | Count default zero. | string | `true` | no | +| mysql_threads_detection_algorithm | Anomaly Detection Algorithm used | string | `basic` | no | +| mysql_threads_deviations | Deviations to detect the anomaly | string | `2` | no | +| mysql_threads_direction | Direction of the anomaly. It can be both, below or above. | string | `above` | no | +| mysql_threads_extra_tags | Extra tags for MySQL threads monitor | list | `` | no | +| mysql_threads_interval | Interval. | string | `60` | no | +| mysql_threads_message | Custom message for MySQL threads monitor | string | `` | no | +| mysql_threads_seasonality | Seasonality of the algorithm | string | `daily` | no | +| mysql_threads_silenced | Groups to mute mysql threads monitor | map | `` | no | +| mysql_threads_threshold_critical | Maximum critical acceptable number of threads | string | `1` | no | +| mysql_threads_time_aggregator | Monitor time aggregator for MySQL threads monitor [available values: min, max or avg] | string | `avg` | no | +| mysql_threads_timeframe | Monitor timeframe for MySQL threads monitor [available values: `last_#m` (1, 5, 10, 15, or 30), `last_#h` (1, 2, or 4), or `last_1d`] | string | `last_4h` | no | +| new_host_delay | Delay in seconds for the metric evaluation | string | `300` | no | + +## Outputs + +| Name | Description | +|------|-------------| +| mysql_aborted_id | id for monitor mysql_aborted | +| mysql_availability_id | id for monitor mysql_availability | +| mysql_connection_id | id for monitor mysql_connection | +| mysql_pool_efficiency_id | id for monitor mysql_pool_efficiency | +| mysql_pool_utilization_id | id for monitor mysql_pool_utilization | +| mysql_queries_anomaly_id | id for monitor mysql_queries_anomaly | +| mysql_slow_id | id for monitor mysql_slow | +| mysql_threads_anomaly_id | id for monitor mysql_threads_anomaly | + +Related documentation +--------------------- + +DataDog documentation: [https://docs.datadoghq.com/integrations/mysql/](https://docs.datadoghq.com/integrations/mysql/) diff --git a/database/mysql/inputs.tf b/database/mysql/inputs.tf new file mode 100644 index 0000000..f20d62d --- /dev/null +++ b/database/mysql/inputs.tf @@ -0,0 +1,440 @@ +variable "environment" { + description = "Environment" + type = "string" +} + +variable "evaluation_delay" { + description = "Delay in seconds for the metric evaluation" + default = 15 +} + +variable "new_host_delay" { + description = "Delay in seconds for the metric evaluation" + default = 300 +} + +variable "message" { + description = "Message sent when an alert is triggered" +} + +variable "filter_tags_use_defaults" { + description = "Use default filter tags convention" + default = "true" +} + +variable "filter_tags_custom" { + description = "Tags used for custom filtering when filter_tags_use_defaults is false" + default = "*" +} + +# MySQL specific + +################################# +### MySQL availability ### +################################# + +variable "mysql_availability_silenced" { + description = "Groups to mute for Mysql availability monitor" + type = "map" + default = {} +} + +variable "mysql_availability_extra_tags" { + description = "Extra tags for Mysql availability monitor" + type = "list" + default = [] +} + +variable "mysql_availability_message" { + description = "Custom message for Mysql availability monitor" + type = "string" + default = "" +} + +variable "mysql_availability_threshold_critical" { + description = "Mysql availability monitor (critical threshold)" + type = "string" + default = 1.1754943508222875e-38 +} + +################################# +### MySQL connections ### +################################# + +variable "mysql_connection_threshold_critical" { + default = 80 + description = "Maximum critical acceptable percent of connections" +} + +variable "mysql_connection_threshold_warning" { + default = 70 + description = "Maximum warning acceptable percent of connections" +} + +variable "mysql_connection_time_aggregator" { + description = "Monitor time aggregator for MySQL connection monitor [available values: min, max or avg]" + type = "string" + default = "avg" +} + +variable "mysql_connection_timeframe" { + description = "Monitor timeframe for MySQL connection monitor [available values: `last_#m` (1, 5, 10, 15, or 30), `last_#h` (1, 2, or 4), or `last_1d`]" + type = "string" + default = "last_10m" +} + +variable "mysql_connection_silenced" { + description = "Groups to mute MySQL connection monitor" + type = "map" + default = {} +} + +variable "mysql_connection_message" { + description = "Custom message for MySQL connection monitor" + type = "string" + default = "" +} + +variable "mysql_connection_extra_tags" { + description = "Extra tags for MySQL connection monitor" + type = "list" + default = [] +} + +################################# +### MySQL aborted connects ### +################################# + +variable "mysql_aborted_threshold_critical" { + default = 10 + description = "Maximum critical acceptable percent of aborted connects" +} + +variable "mysql_aborted_threshold_warning" { + default = 5 + description = "Maximum warning acceptable percent of aborted connects" +} + +variable "mysql_aborted_time_aggregator" { + description = "Monitor time aggregator for MySQL aborted connects monitor [available values: min, max or avg]" + type = "string" + default = "avg" +} + +variable "mysql_aborted_timeframe" { + description = "Monitor timeframe for MySQL aborted connects monitor [available values: `last_#m` (1, 5, 10, 15, or 30), `last_#h` (1, 2, or 4), or `last_1d`]" + type = "string" + default = "last_10m" +} + +variable "mysql_aborted_silenced" { + description = "Groups to mute MySQL aborted connects monitor" + type = "map" + default = {} +} + +variable "mysql_aborted_message" { + description = "Custom message for MySQL aborted connects monitor" + type = "string" + default = "" +} + +variable "mysql_aborted_extra_tags" { + description = "Extra tags for MySQL aborted connects monitor" + type = "list" + default = [] +} + +################################# +### MySQL slow queries ### +################################# + +variable "mysql_slow_threshold_critical" { + default = 20 + description = "Maximum critical acceptable percent of slow queries" +} + +variable "mysql_slow_threshold_warning" { + default = 5 + description = "Maximum warning acceptable percent of slow queries" +} + +variable "mysql_slow_time_aggregator" { + description = "Monitor time aggregator for MySQL slow queries monitor [available values: min, max or avg]" + type = "string" + default = "avg" +} + +variable "mysql_slow_timeframe" { + description = "Monitor timeframe for MySQL slow queries monitor [available values: `last_#m` (1, 5, 10, 15, or 30), `last_#h` (1, 2, or 4), or `last_1d`]" + type = "string" + default = "last_15m" +} + +variable "mysql_slow_silenced" { + description = "Groups to mute MySQL slow queries monitor" + type = "map" + default = {} +} + +variable "mysql_slow_message" { + description = "Custom message for MySQL slow queries monitor" + type = "string" + default = "" +} + +variable "mysql_slow_extra_tags" { + description = "Extra tags for MySQL slow queries monitor" + type = "list" + default = [] +} + +################################# +# MySQL innodb pool efficiency # +################################# + +variable "mysql_pool_efficiency_threshold_critical" { + default = 20 + description = "Maximum critical acceptable percent of innodb buffer pool efficiency" +} + +variable "mysql_pool_efficiency_threshold_warning" { + default = 1 + description = "Maximum warning acceptable percent of innodb buffer pool efficiency" +} + +variable "mysql_pool_efficiency_time_aggregator" { + description = "Monitor time aggregator for MySQL innodb buffer pool efficiency monitor [available values: min, max or avg]" + type = "string" + default = "sum" +} + +variable "mysql_pool_efficiency_timeframe" { + description = "Monitor timeframe for MySQL innodb buffer pool efficiency monitor [available values: `last_#m` (1, 5, 10, 15, or 30), `last_#h` (1, 2, or 4), or `last_1d`]" + type = "string" + default = "last_1h" +} + +variable "mysql_pool_efficiency_silenced" { + description = "Groups to mute MySQL innodb buffer pool efficiency monitor" + type = "map" + default = {} +} + +variable "mysql_pool_efficiency_message" { + description = "Custom message for MySQL innodb buffer pool efficiency monitor" + type = "string" + default = "" +} + +variable "mysql_pool_efficiency_extra_tags" { + description = "Extra tags for MySQL innodb buffer pool efficiency monitor" + type = "list" + default = [] +} + +################################# +# MySQL innodb pool utilization # +################################# + +variable "mysql_pool_utilization_threshold_critical" { + default = 90 + description = "Maximum critical acceptable percent of innodb buffer pool utilization" +} + +variable "mysql_pool_utilization_threshold_warning" { + default = 75 + description = "Maximum warning acceptable percent of innodb buffer pool utilization" +} + +variable "mysql_pool_utilization_time_aggregator" { + description = "Monitor time aggregator for MySQL innodb buffer pool utilization monitor [available values: min, max or avg]" + type = "string" + default = "min" +} + +variable "mysql_pool_utilization_timeframe" { + description = "Monitor timeframe for MySQL innodb buffer pool utilization monitor [available values: `last_#m` (1, 5, 10, 15, or 30), `last_#h` (1, 2, or 4), or `last_1d`]" + type = "string" + default = "last_4h" +} + +variable "mysql_pool_utilization_silenced" { + description = "Groups to mute MySQL innodb buffer pool utilization monitor" + type = "map" + default = {} +} + +variable "mysql_pool_utilization_message" { + description = "Custom message for MySQL innodb buffer pool utilization monitor" + type = "string" + default = "" +} + +variable "mysql_pool_utilization_extra_tags" { + description = "Extra tags for MySQL innodb buffer pool utilization monitor" + type = "list" + default = [] +} + +################################# +### MySQL threads ### +################################# + +variable "mysql_threads_threshold_critical" { + default = 1 + description = "Maximum critical acceptable number of threads" +} + +variable "mysql_threads_detection_algorithm" { + description = "Anomaly Detection Algorithm used" + type = "string" + default = "basic" +} + +variable "mysql_threads_deviations" { + description = "Deviations to detect the anomaly" + type = "string" + default = 2 +} + +variable "mysql_threads_direction" { + description = "Direction of the anomaly. It can be both, below or above." + type = "string" + default = "above" +} + +variable "mysql_threads_alert_window" { + description = "Alert window." + type = "string" + default = "last_15m" +} + +variable "mysql_threads_interval" { + description = "Interval." + type = "string" + default = 60 +} + +variable "mysql_threads_count_default_zero" { + description = "Count default zero." + type = "string" + default = "true" +} + +variable "mysql_threads_seasonality" { + description = "Seasonality of the algorithm" + type = "string" + default = "daily" +} + +variable "mysql_threads_time_aggregator" { + description = "Monitor time aggregator for MySQL threads monitor [available values: min, max or avg]" + type = "string" + default = "avg" +} + +variable "mysql_threads_timeframe" { + description = "Monitor timeframe for MySQL threads monitor [available values: `last_#m` (1, 5, 10, 15, or 30), `last_#h` (1, 2, or 4), or `last_1d`]" + type = "string" + default = "last_4h" +} + +variable "mysql_threads_silenced" { + description = "Groups to mute mysql threads monitor" + type = "map" + default = {} +} + +variable "mysql_threads_message" { + description = "Custom message for MySQL threads monitor" + type = "string" + default = "" +} + +variable "mysql_threads_extra_tags" { + description = "Extra tags for MySQL threads monitor" + type = "list" + default = [] +} + +################################# +### MySQL queries ### +################################# + +variable "mysql_queries_threshold_critical" { + default = 1 + description = "Maximum critical acceptable number of queries" +} + +variable "mysql_queries_detection_algorithm" { + description = "Anomaly Detection Algorithm used" + type = "string" + default = "agile" +} + +variable "mysql_queries_deviations" { + description = "Deviations to detect the anomaly" + type = "string" + default = 5 +} + +variable "mysql_queries_direction" { + description = "Direction of the anomaly. It can be both, below or above." + type = "string" + default = "both" +} + +variable "mysql_queries_alert_window" { + description = "Alert window." + type = "string" + default = "last_15m" +} + +variable "mysql_queries_interval" { + description = "Interval." + type = "string" + default = 60 +} + +variable "mysql_queries_count_default_zero" { + description = "Count default zero." + type = "string" + default = "true" +} + +variable "mysql_queries_seasonality" { + description = "Seasonality of the algorithm" + type = "string" + default = "daily" +} + +variable "mysql_queries_time_aggregator" { + description = "Monitor time aggregator for MySQL queries monitor [available values: min, max or avg]" + type = "string" + default = "avg" +} + +variable "mysql_queries_timeframe" { + description = "Monitor timeframe for MySQL queries monitor [available values: `last_#m` (1, 5, 10, 15, or 30), `last_#h` (1, 2, or 4), or `last_1d`]" + type = "string" + default = "last_4h" +} + +variable "mysql_queries_silenced" { + description = "Groups to mute mysql queries monitor" + type = "map" + default = {} +} + +variable "mysql_queries_message" { + description = "Custom message for MySQL queries monitor" + type = "string" + default = "" +} + +variable "mysql_queries_extra_tags" { + description = "Extra tags for MySQL queries monitor" + type = "list" + default = [] +} diff --git a/database/mysql/modules.tf b/database/mysql/modules.tf new file mode 100644 index 0000000..a494121 --- /dev/null +++ b/database/mysql/modules.tf @@ -0,0 +1,8 @@ +module "filter-tags" { + source = "../../common/filter-tags" + + environment = "${var.environment}" + resource = "mysql" + filter_tags_use_defaults = "${var.filter_tags_use_defaults}" + filter_tags_custom = "${var.filter_tags_custom}" +} diff --git a/database/mysql/monitors-mysql.tf b/database/mysql/monitors-mysql.tf new file mode 100644 index 0000000..2a13d9c --- /dev/null +++ b/database/mysql/monitors-mysql.tf @@ -0,0 +1,262 @@ +resource "datadog_monitor" "mysql_availability" { + name = "[${var.environment}] Mysql server does not respond" + message = "${coalesce(var.mysql_availability_message, var.message)}" + + type = "service check" + + query = < ${var.mysql_connection_threshold_critical} + EOF + + evaluation_delay = "${var.evaluation_delay}" + new_host_delay = "${var.new_host_delay}" + + thresholds { + warning = "${var.mysql_connection_threshold_warning}" + critical = "${var.mysql_connection_threshold_critical}" + } + + notify_no_data = false + renotify_interval = 0 + require_full_window = true + timeout_h = 0 + include_tags = true + + silenced = "${var.mysql_connection_silenced}" + + tags = ["env:${var.environment}", "type:database", "provider:mysql", "resource:mysql", "team:claranet", "created-by:terraform", "${var.mysql_connection_extra_tags}"] +} + +resource "datadog_monitor" "mysql_aborted" { + name = "[${var.environment}] Mysql Aborted connects {{#is_alert}}{{{comparator}}} {{threshold}}% ({{value}}%){{/is_alert}}{{#is_warning}}{{{comparator}}} {{warn_threshold}}% ({{value}}%){{/is_warning}}" + message = "${coalesce(var.mysql_aborted_message, var.message)}" + type = "metric alert" + + query = < ${var.mysql_aborted_threshold_critical} + EOF + + evaluation_delay = "${var.evaluation_delay}" + new_host_delay = "${var.new_host_delay}" + + thresholds { + warning = "${var.mysql_aborted_threshold_warning}" + critical = "${var.mysql_aborted_threshold_critical}" + } + + notify_no_data = false + renotify_interval = 0 + require_full_window = true + timeout_h = 0 + include_tags = true + + silenced = "${var.mysql_aborted_silenced}" + + tags = ["env:${var.environment}", "type:database", "provider:mysql", "resource:mysql", "team:claranet", "created-by:terraform", "${var.mysql_aborted_extra_tags}"] +} + +resource "datadog_monitor" "mysql_slow" { + name = "[${var.environment}] Mysql Slow queries {{#is_alert}}{{{comparator}}} {{threshold}}% ({{value}}%){{/is_alert}}{{#is_warning}}{{{comparator}}} {{warn_threshold}}% ({{value}}%){{/is_warning}}" + message = "${coalesce(var.mysql_slow_message, var.message)}" + type = "metric alert" + + query = < ${var.mysql_slow_threshold_critical} + EOF + + evaluation_delay = "${var.evaluation_delay}" + new_host_delay = "${var.new_host_delay}" + + thresholds { + warning = "${var.mysql_slow_threshold_warning}" + critical = "${var.mysql_slow_threshold_critical}" + } + + notify_no_data = false + renotify_interval = 0 + require_full_window = true + timeout_h = 0 + include_tags = true + + silenced = "${var.mysql_slow_silenced}" + + tags = ["env:${var.environment}", "type:database", "provider:mysql", "resource:mysql", "team:claranet", "created-by:terraform", "${var.mysql_slow_extra_tags}"] +} + +resource "datadog_monitor" "mysql_pool_efficiency" { + name = "[${var.environment}] Mysql Innodb buffer pool efficiency {{#is_alert}}{{{comparator}}} {{threshold}} ({{value}}){{/is_alert}}{{#is_warning}}{{{comparator}}} {{warn_threshold}} ({{value}}){{/is_warning}}" + message = "${coalesce(var.mysql_pool_efficiency_message, var.message)}" + type = "metric alert" + + query = < ${var.mysql_pool_efficiency_threshold_critical} + EOF + + evaluation_delay = "${var.evaluation_delay}" + new_host_delay = "${var.new_host_delay}" + + thresholds { + warning = "${var.mysql_pool_efficiency_threshold_warning}" + critical = "${var.mysql_pool_efficiency_threshold_critical}" + } + + notify_no_data = false + renotify_interval = 0 + require_full_window = true + timeout_h = 0 + include_tags = true + + silenced = "${var.mysql_pool_efficiency_silenced}" + + tags = ["env:${var.environment}", "type:database", "provider:mysql", "resource:mysql", "team:claranet", "created-by:terraform", "${var.mysql_pool_efficiency_extra_tags}"] +} + +resource "datadog_monitor" "mysql_pool_utilization" { + name = "[${var.environment}] Mysql Innodb buffer pool utilization {{#is_alert}}{{{comparator}}} {{threshold}} ({{value}}){{/is_alert}}{{#is_warning}}{{{comparator}}} {{warn_threshold}} ({{value}}){{/is_warning}}" + message = "${coalesce(var.mysql_pool_utilization_message, var.message)}" + type = "metric alert" + + query = < ${var.mysql_pool_utilization_threshold_critical} + EOF + + evaluation_delay = "${var.evaluation_delay}" + new_host_delay = "${var.new_host_delay}" + + thresholds { + warning = "${var.mysql_pool_utilization_threshold_warning}" + critical = "${var.mysql_pool_utilization_threshold_critical}" + } + + notify_no_data = false + renotify_interval = 0 + require_full_window = true + timeout_h = 0 + include_tags = true + + silenced = "${var.mysql_pool_utilization_silenced}" + + tags = ["env:${var.environment}", "type:database", "provider:mysql", "resource:mysql", "team:claranet", "created-by:terraform", "${var.mysql_pool_utilization_extra_tags}"] +} + +resource "datadog_monitor" "mysql_threads_anomaly" { + name = "[${var.environment}] Mysql threads changed abnormally" + message = "${coalesce(var.mysql_threads_message, var.message)}" + type = "metric alert" + + query = <= ${var.mysql_threads_threshold_critical} + EOF + + evaluation_delay = "${var.evaluation_delay}" + new_host_delay = "${var.new_host_delay}" + + thresholds { + critical = "${var.mysql_threads_threshold_critical}" + critical_recovery = 0 + } + + notify_no_data = false + renotify_interval = 0 + require_full_window = true + timeout_h = 0 + include_tags = true + + silenced = "${var.mysql_threads_silenced}" + + tags = ["env:${var.environment}", "type:database", "provider:mysql", "resource:mysql", "team:claranet", "created-by:terraform", "${var.mysql_threads_extra_tags}"] +} + +resource "datadog_monitor" "mysql_queries_anomaly" { + name = "[${var.environment}] Mysql queries changed abnormally" + message = "${coalesce(var.mysql_queries_message, var.message)}" + type = "metric alert" + + query = <= ${var.mysql_queries_threshold_critical} + EOF + + evaluation_delay = "${var.evaluation_delay}" + new_host_delay = "${var.new_host_delay}" + + thresholds { + critical = "${var.mysql_queries_threshold_critical}" + critical_recovery = 0 + } + + notify_no_data = false + renotify_interval = 0 + require_full_window = true + timeout_h = 0 + include_tags = true + + silenced = "${var.mysql_queries_silenced}" + + tags = ["env:${var.environment}", "type:database", "provider:mysql", "resource:mysql", "team:claranet", "created-by:terraform", "${var.mysql_queries_extra_tags}"] +} diff --git a/database/mysql/outputs.tf b/database/mysql/outputs.tf new file mode 100644 index 0000000..143b534 --- /dev/null +++ b/database/mysql/outputs.tf @@ -0,0 +1,39 @@ +output "mysql_availability_id" { + description = "id for monitor mysql_availability" + value = "${datadog_monitor.mysql_availability.id}" +} + +output "mysql_connection_id" { + description = "id for monitor mysql_connection" + value = "${datadog_monitor.mysql_connection.id}" +} + +output "mysql_aborted_id" { + description = "id for monitor mysql_aborted" + value = "${datadog_monitor.mysql_aborted.id}" +} + +output "mysql_slow_id" { + description = "id for monitor mysql_slow" + value = "${datadog_monitor.mysql_slow.id}" +} + +output "mysql_pool_efficiency_id" { + description = "id for monitor mysql_pool_efficiency" + value = "${datadog_monitor.mysql_pool_efficiency.id}" +} + +output "mysql_pool_utilization_id" { + description = "id for monitor mysql_pool_utilization" + value = "${datadog_monitor.mysql_pool_utilization.id}" +} + +output "mysql_threads_anomaly_id" { + description = "id for monitor mysql_threads_anomaly" + value = "${datadog_monitor.mysql_threads_anomaly.id}" +} + +output "mysql_queries_anomaly_id" { + description = "id for monitor mysql_queries_anomaly" + value = "${datadog_monitor.mysql_queries_anomaly.id}" +}