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:
[spoiler title=’prometheus.yml’ style=’default’ collapse_link=’true’]
# 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']
[/spoiler]
Надеюсь данная статья принесет кому-то пользу, если есть вопросы или замечания — пишите, буду рад критике.