Установка prometheus в docker

Prometheus?

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:

prometheus.yml
# 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']

[свернуть]

Надеюсь данная статья принесет кому-то пользу, если есть вопросы или замечания — пишите, буду рад критике.

2 комментария для “Установка prometheus в docker”

  1. Что-то не так с конфигом 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, [email protected], 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″

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.