Initial commit

This commit is contained in:
Patrick de Ruiter 2021-09-02 14:34:43 +02:00
commit 35ad394eec
6 changed files with 397 additions and 0 deletions

184
context.tf Normal file
View File

@ -0,0 +1,184 @@
module "this" {
source = "cloudposse/label/null"
version = "0.24.1" # requires Terraform >= 0.13.0
enabled = var.enabled
namespace = var.namespace
environment = var.environment
stage = var.stage
name = var.name
delimiter = var.delimiter
attributes = var.attributes
tags = var.tags
additional_tag_map = var.additional_tag_map
label_order = var.label_order
regex_replace_chars = var.regex_replace_chars
id_length_limit = var.id_length_limit
label_key_case = var.label_key_case
label_value_case = var.label_value_case
context = var.context
}
# Copy contents of cloudposse/terraform-null-label/variables.tf here
variable "context" {
type = any
default = {
enabled = true
namespace = null
environment = null
stage = null
name = null
delimiter = null
attributes = []
tags = {}
additional_tag_map = {}
regex_replace_chars = null
label_order = []
id_length_limit = null
label_key_case = null
label_value_case = null
}
description = <<-EOT
Single object for setting entire context at once.
See description of individual variables for details.
Leave string and numeric variables as `null` to use default value.
Individual variable settings (non-null) override settings in context object,
except for attributes, tags, and additional_tag_map, which are merged.
EOT
validation {
condition = lookup(var.context, "label_key_case", null) == null ? true : contains(["lower", "title", "upper"], var.context["label_key_case"])
error_message = "Allowed values: `lower`, `title`, `upper`."
}
validation {
condition = lookup(var.context, "label_value_case", null) == null ? true : contains(["lower", "title", "upper", "none"], var.context["label_value_case"])
error_message = "Allowed values: `lower`, `title`, `upper`, `none`."
}
}
variable "enabled" {
type = bool
default = null
description = "Set to false to prevent the module from creating any resources"
}
variable "namespace" {
type = string
default = null
description = "Namespace, which could be your organization name or abbreviation, e.g. 'eg' or 'cp'"
}
variable "environment" {
type = string
default = null
description = "Environment, e.g. 'uw2', 'us-west-2', OR 'prod', 'staging', 'dev', 'UAT'"
}
variable "stage" {
type = string
default = null
description = "Stage, e.g. 'prod', 'staging', 'dev', OR 'source', 'build', 'test', 'deploy', 'release'"
}
variable "name" {
type = string
default = null
description = "Solution name, e.g. 'app' or 'jenkins'"
}
variable "delimiter" {
type = string
default = null
description = <<-EOT
Delimiter to be used between `namespace`, `environment`, `stage`, `name` and `attributes`.
Defaults to `-` (hyphen). Set to `""` to use no delimiter at all.
EOT
}
variable "attributes" {
type = list(string)
default = []
description = "Additional attributes (e.g. `1`)"
}
variable "tags" {
type = map(string)
default = {}
description = "Additional tags (e.g. `map('BusinessUnit','XYZ')`"
}
variable "additional_tag_map" {
type = map(string)
default = {}
description = "Additional tags for appending to tags_as_list_of_maps. Not added to `tags`."
}
variable "label_order" {
type = list(string)
default = null
description = <<-EOT
The naming order of the id output and Name tag.
Defaults to ["namespace", "environment", "stage", "name", "attributes"].
You can omit any of the 5 elements, but at least one must be present.
EOT
}
variable "regex_replace_chars" {
type = string
default = null
description = <<-EOT
Regex to replace chars with empty string in `namespace`, `environment`, `stage` and `name`.
If not set, `"/[^a-zA-Z0-9-]/"` is used to remove all characters other than hyphens, letters and digits.
EOT
}
variable "id_length_limit" {
type = number
default = null
description = <<-EOT
Limit `id` to this many characters (minimum 6).
Set to `0` for unlimited length.
Set to `null` for default, which is `0`.
Does not affect `id_full`.
EOT
validation {
condition = var.id_length_limit == null ? true : var.id_length_limit >= 6 || var.id_length_limit == 0
error_message = "The id_length_limit must be >= 6 if supplied (not null), or 0 for unlimited length."
}
}
variable "label_key_case" {
type = string
default = null
description = <<-EOT
The letter case of label keys (`tag` names) (i.e. `name`, `namespace`, `environment`, `stage`, `attributes`) to use in `tags`.
Possible values: `lower`, `title`, `upper`.
Default value: `title`.
EOT
validation {
condition = var.label_key_case == null ? true : contains(["lower", "title", "upper"], var.label_key_case)
error_message = "Allowed values: `lower`, `title`, `upper`."
}
}
variable "label_value_case" {
type = string
default = null
description = <<-EOT
The letter case of output label values (also used in `tags` and `id`).
Possible values: `lower`, `title`, `upper` and `none` (no transformation).
Default value: `lower`.
EOT
validation {
condition = var.label_value_case == null ? true : contains(["lower", "title", "upper", "none"], var.label_value_case)
error_message = "Allowed values: `lower`, `title`, `upper`, `none`."
}
}
#### End of copy of cloudposse/terraform-null-label/variables.tf

9
main.tf Normal file
View File

@ -0,0 +1,9 @@
module "datadog_integration" {
source = "cloudposse/datadog-integration/aws"
version = "0.11.0"
namespace = "plaap"
stage = "test"
name = "datadog-integration"
integrations = [ "all" ]
}

137
monitors.tf Normal file
View File

@ -0,0 +1,137 @@
# Monitor CPU Utilisation
resource "datadog_monitor" "cpumonitor" {
name = "cpu monitor"
type = "metric alert"
message = "CPU usage alert"
query = "avg(last_1m):avg:system.cpu.system{*} by {host} > 60"
monitor_thresholds {
ok = 20
warning = 50
critical = 60
}
}
# Monitor Memory Utilisation
resource "datadog_monitor" "memorymonitor" {
name = "Usable Memory"
type = "query alert"
evaluation_delay = "15"
include_tags = true
locked = false
message = "Plaaper de plaaper de plaap"
new_host_delay = 300
no_data_timeframe = 0
#notify_audit = 0
#notify_no_data = 0
priority = 0
renotify_interval = 0
require_full_window = true
#restricted_roles = []
timeout_h = 0
query = "max(last_5m):avg:system.mem.usable{*} by {host} / avg:system.mem.total{*} by {host} * 100 < 5"
monitor_thresholds {
critical = 5
warning = 10
}
}
# Monitor System Load
resource "datadog_monitor" "systemload" {
name = "System Load"
type = "query alert"
evaluation_delay = "15"
include_tags = true
locked = false
new_host_delay = 300
no_data_timeframe = 0
#notify_audit = false
priority = 0
renotify_interval = 0
require_full_window = true
#restricted_roles = []
tags = []
timeout_h = 0
message = "System Load exceeding set Thresholg, please investigate"
query = "min(last_30m):( avg:system.load.norm.5{*} by {host} ) > 2.5"
monitor_thresholds {
critical = "2.5"
warning = "2"
}
}
# Monitor Disk Utilisation
resource "datadog_monitor" "disk_usage" {
name = "Disk Space"
type = "query alert"
evaluation_delay = 15
include_tags = true
locked = false
new_host_delay = 300
no_data_timeframe = 0
#notify_audit = 0
priority = 0
renotify_interval = 0
require_full_window = true
#restricted_roles = []
tags = []
timeout_h = 0
message = "Disk Usage is exceeding set threshold, please investigate"
query = "max(last_5m):avg:system.disk.in_use{*} by {host,device} * 100 > 90"
monitor_thresholds {
critical = "90"
warning = "80"
}
}
# Monitor Disk Inode Usage
resource "datadog_monitor" "disk_inodes" {
name = "Disk Inodes Usage"
type = "query alert"
evaluation_delay = 15
include_tags = true
locked = false
new_host_delay = 300
no_data_timeframe = 0
#notify_audit = 0
priority = 0
renotify_interval = 0
require_full_window = true
#restricted_roles = []
tags = []
timeout_h = 0
message = "Disk Inode Usage is exceeding set threshold, please investigate"
query = "min(last_5m):avg:system.fs.inodes.in_use{*} by {host,device} * 100 > 95"
monitor_thresholds {
critical = "95"
warning = "90"
}
}
# Monitor Disk Space Forecast
resource "datadog_monitor" "disk_forecast" {
name = "Disk Usage Forecast"
type = "query alert"
evaluation_delay = 15
include_tags = true
locked = false
new_host_delay = 300
no_data_timeframe = 0
#notify_audit = 0
priority = 0
renotify_interval = 0
require_full_window = true
#restricted_roles = []
tags = []
timeout_h = 0
message = "Disk Usage is exceeding set threshold, please investigate"
query = "max(next_1w):forecast(avg:system.disk.in_use{*} by {host,device} * 100, 'linear', 1, interval='60m', history='1w', model='default') >= 80"
monitor_thresholds {
critical = "80"
warning = "72"
}
}

16
outputs.tf Normal file
View File

@ -0,0 +1,16 @@
output "aws_account_id" {
value = module.datadog_integration.aws_account_id
description = "AWS Account ID of the IAM Role for Datadog to use for this integration"
}
output "aws_role_name" {
value = module.datadog_integration.aws_role_name
description = "Name of the AWS IAM Role for Datadog to use for this integration"
}
output "datadog_external_id" {
value = module.datadog_integration.datadog_external_id
description = "Datadog integration external ID"
}

33
variables.tf Normal file
View File

@ -0,0 +1,33 @@
variable "region" {
type = string
description = "The AWS region that the resources to be monitored reside in"
}
variable "api_key" {
type = string
description = "The api_key that is used to send logs, metrics and traces to the datadog account"
}
variable "app_key" {
type = string
description = "The app_key that is used to manipulate the datadog API"
}
variable "datadog_site" {
type = string
description = "Datadog site to connect to (EU or US)"
default = "https://api.datadoghq.eu/"
}
variable "aws_profile" {
type = string
description = "Which AWS account is this for"
}
variable "prefix_slug" {
type = string
}
variable "team" {
type = string
}

18
versions.tf Normal file
View File

@ -0,0 +1,18 @@
terraform {
required_version = ">= 0.13.0"
required_providers {
aws = {
source = "hashicorp/aws"
#version = ">= 2.0"
}
local = {
source = "hashicorp/local"
version = ">= 1.3"
}
datadog = {
source = "datadog/datadog"
#version = ">= 2.12"
}
}
}