# cloudwatch

Creates CloudWatch log groups, metric filters, metric alarms, composite alarms, and dashboards.

Manages the full CloudWatch observability stack: log groups with configurable retention and KMS encryption, metric filters that emit custom metrics from log patterns, threshold-based metric alarms with SNS actions, composite alarms for correlated alerting, and JSON-body dashboards.

## Usage

```hcl
module "cloudwatch" {
  source  = "hcassc.jfrog.io/iac-terraform-modules-virtual/observability/cloudwatch/aws"
  version = "0.1.0"

  log_groups = {
    app = { name = "/app/prod", retention_in_days = 30 }
  }

  alarms = {
    high_error_rate = {
      alarm_name          = "prod-high-error-rate"
      namespace           = "AWS/ApplicationELB"
      metric_name         = "HTTPCode_Target_5XX_Count"
      threshold           = 100
      comparison_operator = "GreaterThanThreshold"
      alarm_actions       = [module.sns.topic_arns["ops"]]
    }
  }
}
```

<!-- BEGIN_TF_DOCS — DO NOT EDIT BELOW THIS LINE -->
## Requirements

| Name | Version |
| ---- | ------- |
| <a name="requirement_terraform"></a> [terraform](#requirement_terraform) | ~> 1.5 |
| <a name="requirement_aws"></a> [aws](#requirement_aws) | ~> 6.50 |

## Providers

| Name | Version |
| ---- | ------- |
| <a name="provider_aws"></a> [aws](#provider_aws) | 6.50.0 |

## Resources

| Name | Type |
| ---- | ---- |
| [aws_cloudwatch_composite_alarm.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_composite_alarm) | resource |
| [aws_cloudwatch_dashboard.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_dashboard) | resource |
| [aws_cloudwatch_log_group.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_log_group) | resource |
| [aws_cloudwatch_log_metric_filter.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_log_metric_filter) | resource |
| [aws_cloudwatch_metric_alarm.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_metric_alarm) | resource |

## Inputs

| Name | Description | Type | Default | Required |
| ---- | ----------- | ---- | ------- | :------: |
| <a name="input_alarms"></a> [alarms](#input_alarms) | Map of CloudWatch metric alarms | <pre>map(object({<br/>    alarm_name          = string<br/>    alarm_description   = optional(string, "")<br/>    namespace           = string<br/>    metric_name         = string<br/>    statistic           = optional(string, "Sum")<br/>    period              = optional(number, 300)<br/>    evaluation_periods  = optional(number, 1)<br/>    threshold           = number<br/>    comparison_operator = string<br/>    treat_missing_data  = optional(string, "notBreaching")<br/>    dimensions          = optional(map(string), {})<br/>    alarm_actions       = optional(list(string), [])<br/>    ok_actions          = optional(list(string), [])<br/>    datapoints_to_alarm = optional(number, null)<br/>  }))</pre> | `{}` | no |
| <a name="input_composite_alarms"></a> [composite_alarms](#input_composite_alarms) | Map of composite CloudWatch alarms | <pre>map(object({<br/>    alarm_name        = string<br/>    alarm_description = optional(string, "")<br/>    alarm_rule        = string<br/>    alarm_actions     = optional(list(string), [])<br/>    ok_actions        = optional(list(string), [])<br/>  }))</pre> | `{}` | no |
| <a name="input_dashboards"></a> [dashboards](#input_dashboards) | Map of CloudWatch dashboard name to JSON body | `map(string)` | `{}` | no |
| <a name="input_log_groups"></a> [log_groups](#input_log_groups) | Map of CloudWatch log groups to create | <pre>map(object({<br/>    name              = string<br/>    retention_in_days = optional(number, 90)<br/>    kms_key_id        = optional(string, null)<br/>    skip_destroy      = optional(bool, false)<br/>  }))</pre> | `{}` | no |
| <a name="input_metric_filters"></a> [metric_filters](#input_metric_filters) | Map of metric filters on log groups | <pre>map(object({<br/>    log_group_key    = string<br/>    pattern          = string<br/>    metric_name      = string<br/>    metric_namespace = string<br/>    metric_value     = optional(string, "1")<br/>    default_value    = optional(string, "0")<br/>  }))</pre> | `{}` | no |
| <a name="input_tags"></a> [tags](#input_tags) | Resource tags to apply to all resources | `map(string)` | `{}` | no |

## Outputs

| Name | Description |
| ---- | ----------- |
| <a name="output_alarm_arns"></a> [alarm_arns](#output_alarm_arns) | Map of alarm logical key to ARN |
| <a name="output_composite_alarm_arns"></a> [composite_alarm_arns](#output_composite_alarm_arns) | Map of composite alarm logical key to ARN |
| <a name="output_dashboard_arns"></a> [dashboard_arns](#output_dashboard_arns) | Map of dashboard name to ARN |
| <a name="output_log_group_arns"></a> [log_group_arns](#output_log_group_arns) | Map of logical key to log group ARN |
| <a name="output_log_group_names"></a> [log_group_names](#output_log_group_names) | Map of logical key to log group name |
<!-- END_TF_DOCS — DO NOT EDIT ABOVE THIS LINE -->
