Сейчас в Prometehus мы собираем метрики из AWS CLoudWatch с помощью CloudWatch exporter от самого AWS, см. Prometheus: CloudWatch exporter — сбор метрик из AWS и графики в Grafana, однако, у него есть несколько недостатков:
- написан на Java, тяжёлый – грузит хост мониторнига
- не подтягивает теги
- использует
GetMetricStatistics
для получения метрик - умеет собирать метрики только из одного региона – для нескольких регионов потребутеся запускать несколько експортёров
Что бы избавиться от этих проблем – используем вместо него yet-another-cloudwatch-exporter
.
Содержание
AWS CloudWatch – недостатки
Tags
Первое, что крайне неудобно – это отсутствие тегов в метриках, собираемых дефолтным експортёром.
Например, Application Load Balancer возвращается в таком виде:
Тогда как у самого ALB тегов намного больше:
И сейчас в Grafana нет никакой возможности эти теги использовать для выборки.
GetMetricStatistics
vs GetMetricData
Второй нюанс – это то, как експортер собирает метрики, т.к. он использует AWS API GetMetricStatistics
.
Два года тому была открыта issue Reduce cost of api operations by using GetMetricData API instead of GetMetricStatistics API – но воз и ныне там.
Проблема заключается в том, что при GetMetricStatistics
на каждую метрику выполняется отдельный API-запрос.
Т.е., если у вас 100 ЕС2-инстансов, и у каждого 10 метрик – то cloudwatch-exporter
будет выполнять 1000 запросов каждые 60 секунд, что в результате выливается в приличные деньги:
В отличии от AWS cloudwatch-exporter
, в yet-another-cloudwatch-exporter
используется запрос GetMetricData
, который позволяет получить до 500 метрик при выполнении единого запроса.
Запуск yet-another-cloudwatch-exporter
Попробуем получить данные.
Создаём файл с данными доступа к AWS, назовём его alb-cred:
[default] aws_region = us-east-2 aws_access_key_id = AKI***D4Q aws_secret_access_key = QUC***BTI
Либо можно использовать AWS EC2 Instance Profile, но в его политику надо добавить разрешения на выполенние таких вызовов:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "CloudWatchExporterPolicy", "Effect": "Allow", "Action": [ "tag:GetResources", "cloudwatch:ListTagsForResource", "cloudwatch:GetMetricData", "cloudwatch:ListMetrics" ], "Resource": "*" } ] }
Создаём файл настроек самого експортёра:
discovery: jobs: - regions: - us-east-2 type: elb enableMetricData: true metrics: - name: ActiveConnectionCount statistics: - Sum period: 300 length: 600
Запускаем его:
И пробуем метрики:
Теперь видим все теги.
Настройка yet-another-cloudwatch-exporter
exportedTagsOnMetrics
Список тегов, которые експортер будет получать вместе с метриками может быть ограничен exportedTagsOnMetrics
.
Например – оставим только теги:
discovery: exportedTagsOnMetrics: alb: - Name - kubernetes.io/service-name - ingress.k8s.aws/cluster - kubernetes.io/namespace ...
SeacrhTags
Также, можно граничить список ресурсов, с которых будем собирать метрики (аналог tag_selections
в експортёре от AWS).
Например, ограничим выбор кластером “bttrm-eks-prod-1” – приводим файл к виду:
discovery: exportedTagsOnMetrics: alb: - Name - kubernetes.io/service-name - ingress.k8s.aws/cluster - kubernetes.io/namespace jobs: - type: alb regions: - us-east-2 searchTags: - Key: ingress.k8s.aws/cluster Value: bttrm-eks-prod-1 metrics: - name: UnHealthyHostCount statistics: [Maximum] period: 60 length: 600 - name: ActiveConnectionCount statistics: [Sum] period: 300 length: 600
Проверяем:
Теперь получаем метрики только с одного кластера, и только нужными нам тегами.
Запуск в Prometheus
У нас весь стек мониторинга запускается из Docker Compose – добавляем туда новый ексопртёр:
... yace-clouwatch-exporter: image: quay.io/invisionag/yet-another-cloudwatch-exporter:v0.19.1-alpha networks: - prometheus ports: - 5000:5000 volumes: - /etc/prometheus/prometheus-yace-cloudwatch-exporter.yaml:/tmp/config.yml:ro restart: unless-stopped
Обновляем конфиг самого Prometheus – добавляем новый таргет:
... scrape_configs: - job_name: 'yace-clouwatch-exporter' metrics_path: '/metrics' static_configs: - targets: ['yace-clouwatch-exporter:5000'] ...
Проверяем таргет:
И метрики:
Графики в Grafana
И теперь можем использовать эти метрики в Grafana с выборкой по, например, окружению – dev, stage, prod (см. Grafana: создание dashboard):
А $env
формируется из нашей лейблы ekscluster
, которая добавляется ко всем ресурсам во время создания кластера из CloudFormation (см. AWS Elastic Kubernetes Service: автоматизация создания кластера, часть 1 — CloudFormation):
Готово.
Ссылки по теме
- Improving the Prometheus exporter for Amazon CloudWatch
- Monitoring AWS Lambda with Prometheus and Sysdig