Prometheus: AWS EC2 service discovery

By | 06/11/2018
 

Для чего нам нужен EC2 service discovery? В первую очередь – что бы избежать необходимости открывать порт на Application Load Balancer и гонять трафик “через мир”.

Т.е. вместо того, что бы в конфиге Prometheus указывать статичный URL и URI, типа mainhost.domain.tld/metrics, который был бы направлен на AWS ALB, у которого было бы правило форвардить URI /metrics в AWS Target Group, у которой был бы таргет на порт 9253 (екскпортер, который собирает метрики с PHP-FPM, см. Prometheus: мониторинг PHP-FPM + Ansible роль) – мы просто указываем Prometheus выполнить поиск инстансов с определёнными тегами в AWS аккаунте, после чего он их резолвит по локальным IP.

Так мы экономим и трафик, который не будет передаваться через Load Balancer, обойдёмся без торчащих наружу портов для мониторинга, и упростим поиск и добавление новых ЕС2 в мониторинг, не говоря уже об упрощении схемы вообще (см. абзац выше).

Основное ограничение тут: EC2 должен быть либо в той же VPC, где запущен Prometheus, либо между VPC должен быть поднят VPC пиринг.

Ниже – пример использования Prometheus ec2_sd_configs на примере ЕС2 с node_exporter.

Подготовка

Запускаем ЕС2, на котором будем тестить, открываем доступ к нему из Security Group хоста мониторинга на порт 9100:

IAM

Что бы Prometheus мог получить доступ к инстансам – добавляем IAM пользователя с Programmatic access и добавляем ему полиси EC2 ReadOnly:

Используя Access и Secret ключи этого пользователя – будем настраивать сам Prometheus.

Настройка EC2

Подключаемся на инстанс:

ssh ubuntu@18.220.131.117 -i setevoy-testing-ohio.pem

Устанавливаем Docker:

root@ip-172-31-35-132:~# curl https://get.docker.com | bash

Запускаем node_exporter:

root@ip-10-0-1-192:~# docker run -d --net="host" --pid="host" quay.io/prometheus/node-exporter

Проверяем:

root@ip-172-31-35-132:~# curl -s localhost:9100/metrics | grep node | grep -v \# | head -5
node_arp_entries{device="eth0"} 1
node_boot_time_seconds 1.528708538e+09
node_context_switches_total 309303
node_cpu_guest_seconds_total{cpu="0",mode="nice"} 0
node_cpu_guest_seconds_total{cpu="0",mode="user"} 0

Настройка Prometehus

Теперь можно добавить хост в Prometheus.

Редактируем его конфиг, в данном случае это /opt/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: 'ec2'
    ec2_sd_configs:
      - region: us-east-2
        access_key: AKI***CUA
        secret_key: 0oP***ggW
        port: 9100

Перезапускаем:

root@betterme-monitonrig-dev:/opt/prometheus# docker-compose -f prometheus-compose.yml down
Stopping prometheus_prometheus-server_1 ... done
Removing prometheus_prometheus-server_1 ... done
Removing network prometheus_prometheus
root@betterme-monitonrig-dev:/opt/prometheus# docker-compose -f prometheus-compose.yml up
Creating network "prometheus_prometheus" with the default driver
Creating prometheus_prometheus-server_1 ... done
Attaching to prometheus_prometheus-server_1
...

Проверяем таргеты:

Тут http://10.0.1.175:9100/metrics – это сам ЕС2 с Prometheus, а котором не запущен node_exporterhttp://10.0.3.108:9100/metrics – “левый” хост в другой VPC, а http://10.0.1.192:9100/metrics – запущенный ранее ЕС2, который и будем мониторить.

Relabelling

Вернёмся к конфигу Prometheus, оставим сборк метрик только с хоста с тегом Name=prom-ec-sd:

...
    relabel_configs:
      - source_labels: [__meta_ec2_tag_Name]
        regex: prom-*
        action: keep
...

И переименуем его, что бы в метке instance вместо приватного IP выводился InstanceID, используя мета-лейбл __meta_ec2_instance_id:

...
      - source_labels: [__meta_ec2_instance_id]
        target_label: instance

Теперь полностью он выглядит так:

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: 'ec2'
    ec2_sd_configs:
      - region: "us-east-2"
        access_key: "AKI***CUA"
        secret_key: "0oP***ggW"
        port: 9100

    relabel_configs:
      - source_labels: [__meta_ec2_tag_Name]
        regex: prom-.*
        action: keep
      - source_labels: [__meta_ec2_instance_id]
        target_label: instance

Перезапускаем Prometheus, проверяем:

И в графиках:

Готово.

Ссылки по теме

ec2_sd_config

Automatically monitoring EC2 Instances