Для чего нам нужен 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
Подключаемся на инстанс:
[simterm]
$ ssh [email protected] -i setevoy-testing-ohio.pem
[/simterm]
Устанавливаем Docker:
[simterm]
root@ip-172-31-35-132:~# curl https://get.docker.com | bash
[/simterm]
Запускаем node_exporter:
[simterm]
root@ip-10-0-1-192:~# docker run -d --net="host" --pid="host" quay.io/prometheus/node-exporter
[/simterm]
Проверяем:
[simterm]
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
[/simterm]
Настройка 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
Перезапускаем:
[simterm]
root@bttrm-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@bttrm-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 ...
[/simterm]
Проверяем таргеты:
Тут http://10.0.1.175:9100/metrics — это сам ЕС2 с Prometheus, а котором не запущен node_exporter, http://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, проверяем:
И в графиках:
Готово.
Ссылки по теме
Automatically monitoring EC2 Instances










