Для чего нам нужен 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