Используем prometheus/cloudwatch_exporter.
Клиент написан, внезапно, на Java, из минусов – не умеет экпортировать теги AWS в метки Prometheus (есть альтернативный клиент – technofy/cloudwatch_exporter, который вроде бы умеет).
Содержание
IAM пользователь
Для IAM пользователя, доступы которого будет использовать експортёр требуются роли cloudwatch:ListMetrics
и cloudwatch:GetMetricStatistics
(надо проверить – сработает ли роль CloudWatchAgentServerPolicy
, подключенная к EC2, что бы не использовать Access/Secret ключи).
Переходим в IAM, создаём новую политику – Create policy:
- в Service выбираем CloudWatch
- в Access level – выбираем List > ListMetrics и Read > GetMetricStatistics
Сохраняем её – Create policy:
Переходим в Users – Add user:
Создаём пользователя с Programmatic access:
Выбираем Attach existing policies directly, и находим созданную ранее политику:
Получаем его Access и Secret ключи:
Сохраняем их.
Проверка prometheus/cloudwatch_exporter
Сначала запустим експортер из Docker образа с тестовым конфигом.
Создаём файл его настроек, назовём к примеру prometheus-exporter.yml
:
region: us-east-2 metrics: - aws_namespace: AWS/EC2 aws_metric_name: CPUUtilization aws_dimensions: [InstanceId]
Важный момент: хотя в документации к екпортёру сказано, что aws_dimensions
и aws_statistics
являются optional параметрами – на самом деле без как минимум aws_dimensions
метрики не собираются. На этот счёт даже есть открытая issue тут>>>, но на неё как-то не реагируют вообще.
Список dimensions для типа EC2 можно найти в документации AWS тут>>>., а для всех остальных типов – тут>>>.
Что бы определить какой тип dimensions использовать – переходим в CloudWatch, выбираем тип метрик, в данном случае EC2, и открываем список метрик:
Тут InstanceId
как раз является искомым фильтром.
Запускаем контейнер, передавая в переменных ключи, и через docker volumes – файл настроек:
[simterm]
$ sudo docker run -d -p 9106:9106 -e AWS_ACCESS_KEY_ID=AKI***ZZA -e AWS_SECRET_ACCESS_KEY=7vb***lDqi -v /home/setevoy/Temp/prometheus-exporter.yml:/config/config.yml prom/cloudwatch-exporter
[/simterm]
Проверяем:
[simterm]
$ curl -s localhost:9106/metrics | grep -v \# | grep -v cloud aws_ec2_cpuutilization_sum{job="aws_ec2",instance="",instance_id="i-0ad3a71827218abcd",} 7.66666666666652 1529488320000 aws_ec2_cpuutilization_sum{job="aws_ec2",instance="",instance_id="i-01dc5f648589e273f",} 8.63661202185913 1529488500000 aws_ec2_cpuutilization_sample_count{job="aws_ec2",instance="",instance_id="i-0ad3a71827218abcd",} 5.0 1529488320000 aws_ec2_cpuutilization_sample_count{job="aws_ec2",instance="",instance_id="i-01dc5f648589e273f",} 5.0 1529488500000 aws_ec2_cpuutilization_minimum{job="aws_ec2",instance="",instance_id="i-0ad3a71827218abcd",} 1.33333333333288 1529488320000 aws_ec2_cpuutilization_minimum{job="aws_ec2",instance="",instance_id="i-01dc5f648589e273f",} 1.66666666666667 1529488500000 aws_ec2_cpuutilization_maximum{job="aws_ec2",instance="",instance_id="i-0ad3a71827218abcd",} 1.66666666666667 1529488320000 aws_ec2_cpuutilization_maximum{job="aws_ec2",instance="",instance_id="i-01dc5f648589e273f",} 1.83333333333394 1529488500000 aws_ec2_cpuutilization_average{job="aws_ec2",instance="",instance_id="i-0ad3a71827218abcd",} 1.5333333333333041 1529488320000 aws_ec2_cpuutilization_average{job="aws_ec2",instance="",instance_id="i-01dc5f648589e273f",} 1.7273224043718258 1529488500000
[/simterm]
cloudwatch-exporter в Prometheus
Теперь добавим експортёр в Prometheus.
На хосте мониторинга создаём файл настроек для екпортёра, в данном случае это будет /etc/prometheus/prometheus-cloudwatch-exporter.yml
.
region: us-east-2 metrics: - aws_namespace: AWS/EC2 aws_metric_name: CPUUtilization aws_dimensions: [InstanceId] aws_statistics: [Average] - aws_namespace: AWS/EC2 aws_metric_name: DiskReadOps aws_dimensions: [InstanceId] aws_statistics: [Sum] - aws_namespace: AWS/EC2 aws_metric_name: DiskWriteOps aws_dimensions: [InstanceId] aws_statistics: [Sum]
Обновляем Compose файл с Prometheus и Grafana – добавляем запуск контейнера с cloudwatch-exporter, тут это /opt/prometheus/prometheus-compose.yml
:
version: '3.3' networks: prometheus: services: prometheus-server: image: prom/prometheus:v1.8.2 networks: - prometheus ports: - 9090:9090 volumes: - /etc/prometheus/prometheus-server-conf.yml:/etc/prometheus.yml - /data/prometheus/prometheus:/prometheus command: - '-config.file=/etc/prometheus.yml' - '-storage.local.path=/prometheus' - '-web.external-url=http://dev.monitor.domain.world/prometheus' restart: always grafana-ui: image: grafana/grafana networks: - prometheus ports: - 3000:3000 volumes: - /etc/grafana:/etc/grafana/ - /data/grafana:/var/lib/grafana depends_on: - prometheus-server cloudwatch-exporter: image: prom/cloudwatch-exporter networks: - prometheus ports: - 9106:9106 volumes: - /etc/prometheus/prometheus-cloudwatch-exporter.yml:/config/config.yml environment: - AWS_ACCESS_KEY_ID=AKI***ZZA - AWS_SECRET_ACCESS_KEY=7vb***Dqi
Обновляем файл настроек самого Prometheus, тут это /etc/prometheus/prometheus-server-conf.yml
– указываем ему сбор метрик с этого експортёра:
global: scrape_interval: 15s external_labels: monitor: 'btrm-monitor' scrape_configs: - job_name: 'prometheus' metrics_path: '/prometheus/metrics' static_configs: - targets: ['localhost:9090'] - job_name: backend-dev honor_labels: true params: match[]: - '{job!=""}' metrics_path: '/federate' ec2_sd_configs: - region: us-east-2 access_key: AKI***A4A secret_key: Onh***0X+ port: 9090 relabel_configs: - source_labels: [__meta_ec2_tag_Name] regex: mobile.* action: keep - source_labels: [__meta_ec2_tag_Name] target_label: instance - job_name: cloudwatch-exporter honor_labels: true metrics_path: '/metrics' static_configs: - targets: ['cloudwatch-exporter:9106']
В имени хоста в targets
– указываем имя контейнера в Compose файле.
Запускаем Prometheus, Grafana и cloudwatch-exporter:
[simterm]
# docker-compose -f prometheus-compose.yml up Creating network "prometheus_prometheus" with the default driver Creating prometheus_cloudwatch-exporter_1 ... done Creating prometheus_prometheus-server_1 ... done Creating prometheus_grafana-ui_1 ... done Attaching to prometheus_prometheus-server_1, prometheus_cloudwatch-exporter_1, prometheus_grafana-ui_1 ...
[/simterm]
Проверяем targets:
Проверяем метрики:
И они же в панели самого CloudWatch:
Осталось создать дашборд в Grafana.
Grafana dashboard
Создаём новый башборд, тип Graph:
Переходим в Settings > General, задаём имя борды и теги:
Добавляем переменную с именем instance, тип Query:
- в Datasource выбираем Prometehus
- в самом запросе вызываем
aws_ec2_cpuutilization_average{job="aws_ec2"}
, который вернёт нам все инстансы с меткой job=”aws_ec2″ - в регулярке – получаем только ID инстанса –
/.*instance_id="(.*)",/
Жмём Add.
Переходим к редактированию панели, задаём имя:
В Metrics задаём datasource и запрос aws_ec2_cpuutilization_average{instance_id=~"$instance"}
:
Проверяем:
Готово.