Prometheus?
Prometheus, что это такое, не нужно объяснять в наши дни никому. Одни любят его за то, что он модный, другие за то, что он легкий, третьи ненавидят его за то, что не хотят что-то менять в своей жизни. Так или иначе prometheus в нашем мире есть, и его порой нужно использовать, но просто поставить его где-то на виртуальной машине и забыть — не мой путь, посему я решил заморочиться и собрать свой docker-образ…
Тут никаких подводных камней меня не ожидало, приложения на go оказались крайне простыми для запуска в контейнере:
Укажем базовый образ на основе которого будем собирать контейнер:
FROM ubuntu:16.04
Зададим переменную окружения с указанием версии prometheus, чтобы можно было поменять ее единожды в случае необходимости:
ENV version 1.7.1
Укажем откуда скачать нужный нам пакет и куда его поместить(обратите внимание, что в ссылке используется переменная ($version), значение которой мы устанавливаем ранее):
ADD https://github.com/prometheus/prometheus/releases/download/v$version/prometheus-$version.linux-amd64.tar.gz /prometheus/server/
Перейдем в директорию «/prometheus/server»:
WORKDIR /prometheus/server
Распакуем скаченный ранее архив, извлечем из него приложение и удалим все лишнее (в имени архива так же используется значение переменной «version»):
RUN tar -xvzf ./prometheus-$version.linux-amd64.tar.gz -C ./ && \ mv ./prometheus-$version.linux-amd64/* ./ && \ rm -rf ./prometheus-$version.linux-amd64* && \ ln -s /prometheus/server/prometheus /usr/bin && \ mkdir ./data
Скопируем конфигурационный файл:
COPY prometheus.yml .
Укажем, что при вызове контейнера без параметров нужно запускать «prometheus»:
CMD ["/usr/bin/prometheus"]
Когда Dockerfile готов, необходимо на его основе собрать docker-образ, просто выполним эту команду в директории с Dockerfile’ом:
docker build -t prometheus .
После не долгой процедуры сборки образа, проверим что он появился в выводе команды:
docker images
Теперь можно запустить контейнер на базе этого образа, для этого выполним команду:
docker run --name=prometheus -v /mnt/data/Docker/Dockerfiles/prometheus/data:/prometheus/server/data prometheus:latest
Здесь присутствует параметр «-v», который указывает на то, что директорию"/mnt/data/Docker/Dockerfiles/prometheus/data"
нашей «хостовой» системы мы монтируем в директорию «/prometheus/server/data
» контейнера.
Сделано это для того, чтобы мы могли сохранять данные prometheus’a при перезапуске контейнера.
На мой взгляд использовать bash для запуска docker-контейнеров не самый удобный и привычный способ. Я обернул команду запуска в systemd-сервис (данная система инициализации фактически является стандартом, продвигаемым большинством дистрибутивов, а так же позволяет манипулировать контейнером на уровне обычного сервиса операционной системы):
[Unit] Description=prometheus in Docker After=docker.service Requires=docker.service [Service] TimeoutStartSec=0 ExecStartPre=-/usr/bin/docker kill prometheus ExecStartPre=-/usr/bin/docker rm prometheus ExecStart=/usr/bin/docker run --name=prometheus -v /mnt/data/Docker/Dockerfiles/prometheus/data:/prometheus/server/data prometheus:latest ExecStop=/usr/bin/docker stop prometheus [Install] WantedBy=multi-user.target Alias=prometheus.service
После чего я смог без лишних сложностей используя стандартные команды управления сервисом запускать и останавливать контейнер:
service prometheus start service prometheus status systemctl enable prometheus
Пример конфигурационного файла для prometheus:
[code lang=»bash»]
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Attach these labels to any time series or alerts when communicating with
# external systems (federation, remote storage, Alertmanager).
external_labels:
monitor: ‘codelab-monitor’
# Load rules once and periodically evaluate them according to the global ‘evaluation_interval’.
rule_files:
# — "first.rules"
# — "second.rules"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it’s Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
— job_name: ‘prometheus’
# metrics_path defaults to ‘/metrics’
# scheme defaults to ‘http’.
static_configs:
— targets: [‘localhost:9090’]
scrape_configs:
— job_name: "node"
scrape_interval: "15s"
static_configs:
— targets: [‘172.18.0.1:9100’]
scrape_configs:
— job_name: "graphite_exporter"
honor_labels: true
scrape_interval: "15s"
static_configs:
— targets: [‘172.18.0.1:9108’]
[/code]
Надеюсь данная статья принесет кому-то пользу, если есть вопросы или замечания — пишите, буду рад критике.
Что-то не так с конфигом prometheus.yml. не могу запустить контейнер:
evgin$ docker run prometheus:latest
time=»2018-02-17T08:28:28Z» level=info msg=»Starting prometheus (version=1.7.1, branch=master, revision=3afb3fffa3a29c3de865e1172fb740442e9d0133)» source=»main.go:88″
time=»2018-02-17T08:28:28Z» level=info msg=»Build context (go=go1.8.3, user=root@0aa1b7fc430d, date=20170612-11:44:05)» source=»main.go:89″
time=»2018-02-17T08:28:28Z» level=info msg=»Host details (Linux 4.9.60-linuxkit-aufs #1 SMP Mon Nov 6 16:00:12 UTC 2017 x86_64 7b8877069ab2 (none))» source=»main.go:90″
time=»2018-02-17T08:28:28Z» level=info msg=»Loading configuration file prometheus.yml» source=»main.go:252″
time=»2018-02-17T08:28:28Z» level=error msg=»Error loading config: couldn’t load configuration (-config.file=prometheus.yml): unknown fields in config: monitor, static_configs, honor_labels, scrape_interval, evaluation_interval, external_labels» source=»main.go:160″
проблема в форматировании yml файла в wp, сейчас что-нибудь придумаю.