Неблагодарная задача.
Нет нормальной поддержки циклов, автодискавери и фильтрации.
* все примеры ниже без модулей, без костылей, без новой графаны, чистый терраформ и ямлописаки
Например у вас есть AWS Redis.
Банально с одним шардом для двух нод вам надо сделать буквально следующее:
# Alarm for Primary Node
resource "aws_cloudwatch_metric_alarm" "redis_cpu_primary" {
alarm_name = "${var.project_prefix}-${var.environment}-redis-cpu-primary"
comparison_operator = "GreaterThanThreshold"
evaluation_periods = "300"
metric_name = "CPUUtilization"
namespace = "AWS/ElastiCache"
period = "60"
statistic = "Average"
threshold = "80"
alarm_description = "Redis CPU utilization is too high on primary node"
alarm_actions = ["arn:aws:sns:us-east-1:${data.aws_caller_identity.this.account_id}:aws-health-notification"]
ok_actions = ["arn:aws:sns:us-east-1:${data.aws_caller_identity.this.account_id}:aws-health-notification"]
dimensions = {
CacheClusterId = "${aws_elasticache_replication_group.******.id}-001"
}
}
# Alarm for Replica Node
resource "aws_cloudwatch_metric_alarm" "redis_cpu_replica" {
alarm_name = "${var.project_prefix}-${var.environment}-redis-cpu-replica"
comparison_operator = "GreaterThanThreshold"
evaluation_periods = "300"
metric_name = "CPUUtilization"
namespace = "AWS/ElastiCache"
period = "60"
statistic = "Average"
threshold = "80"
alarm_description = "Redis CPU utilization is too high on replica node"
alarm_actions = ["arn:aws:sns:us-east-1:${data.aws_caller_identity.this.account_id}:aws-health-notification"]
ok_actions = ["arn:aws:sns:us-east-1:${data.aws_caller_identity.this.account_id}:aws-health-notification"]
dimensions = {
CacheClusterId = "${aws_elasticache_replication_group.******.id}-002"
}
}
Это лишь один шард, всего две ноды.
Помножить на существующие 4 кластера + 3 окружения итого у нас сотни строчек.
Потом это улетает в SNS, там, скорее всего на Lambda, оттуда скрипты питона на ваш Slack.
Прямо скажем неудобно.
Могу предложить решение лучше:
если у вас используется Alertmanager и AWS EKS(Kubernetes), то заметно удобнее держать его там.
Установка клаудвоч экспортера(разово):
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm upgrade cloudwatch-exporter prometheus-community/prometheus-cloudwatch-exporter \
--install \
--version 0.25.0 \
--namespace monitoring \
--set aws.aws_access_key_id="${{ secrets.AWS_ACCESS_KEY_ID }}" \
--set aws.aws_secret_access_key="${{ secrets.AWS_SECRET_ACCESS_KEY }}" \
--values=EKS/cloudwatch-values.yaml
Конфиг клаудвоч экспортёра:
config: |-
region: us-east-1
period_seconds: 30
delay_seconds: 30
metrics:
- aws_namespace: AWS/RDS
aws_metric_name: CPUUtilization
aws_dimensions: [DBInstanceIdentifier]
aws_dimension_select_regex:
DBInstanceIdentifier: [".*production.*"]
aws_statistics: [Average]
- aws_namespace: AWS/SQS
aws_metric_name: ApproximateNumberOfMessagesVisible
aws_dimensions: [QueueName]
aws_dimension_select_regex:
QueueName: [".*production.*"]
aws_statistics: [Sum]
- aws_namespace: AWS/ES
aws_metric_name: FreeStorageSpace
period_seconds: 60
aws_dimensions: [DomainName, ClientId, NodeId]
aws_statistics: [Minimum]
- aws_namespace: AWS/ElastiCache
aws_metric_name: CPUUtilization
period_seconds: 60
aws_dimensions: [CacheClusterId]
aws_statistics: [Average]
В данном примере показаны различные вариации использования.
Так же научите(разово) собирать метрики от вашего прометиуса/виктории метрикс
- job_name: 'cloudwatch-exporter'
scrape_interval: 30s
static_configs:
- targets: ['cloudwatch-exporter-prometheus-cloudwatch-exporter.monitoring.svc.cluster.local:9106']
#AWS