в docker, monitoring, prometheus

Prometheus: Миграция на версию 2.0

prometheus
После прочтения статьи с анонсом второй версии Prometheus сразу решил: надо брать! Думал, достаточно будет обновить версию docker-контейнера и все заработает, но нет… Давайте разберемся!

Prometheus со всеми необходимыми компонентами давно успешно работал в docker-контейнерах, как кописано в этой статье.

«С наскоку» меняю версию docker-образа в файле docker-compose.yml, было:

...
    image: prom/prometheus:v1.8.1
...

стало:

...
    image: prom/prometheus:v2.0.0
...

Обновляю контейнер с помощью команды:

docker-compose up -d

и он не запускается:

CONTAINER ID     IMAGE                    COMMAND                  CREATED          STATUS              PORTS                    NAMES
de3aa8198732     prom/prometheus:v2.0.0   "/bin/prometheus -..."   21 seconds ago   Restarting (1) 2 seconds ago                 prometheus

Смотрим логи:

docker logs prometheus
Error parsing commandline arguments: unknown short flag '-c'
prometheus: error: unknown short flag '-c'
Error parsing commandline arguments: unknown short flag '-c'
prometheus: error: unknown short flag '-c'

С помощью гугла выясняем, что в Prometheus 2.0 параметры командной строки нужно задавать через два дефиса, а не один, как было раньше:

First, we moved to a new flag library, which uses the more common double-dash — prefix for flags instead of the single dash Prometheus used so far

Правим docker-compose.yml, добавляя дефисы, запускаем контейнер — он опять не стартует! В логах:

docker logs prometheus
Error parsing commandline arguments: unknown long flag '--alertmanager.url'
prometheus: error: unknown long flag '--alertmanager.url'
Error parsing commandline arguments: unknown long flag '--alertmanager.url'
prometheus: error: unknown long flag '--alertmanager.url'

Находим, что теперь URL для alertmanager’а нельзя задавать как параметр командной строки, его следует указывать в самом конфигурационном файле Prometheus вот так.

Исправляемся, пробуем запуститься — и снова неудача! Смотрим логи:

docker logs prometheus
Error parsing commandline arguments: unknown long flag '--storage.local.path'
prometheus: error: unknown long flag '--storage.local.path'
Error parsing commandline arguments: unknown long flag '--storage.local.path'

В связи с новым хранилищем для метрик в Prometheus 2.0 вместо --storage.local.path=/prometheus нужно использовать --storage.tsdb.path=/prometheus, а параметр --storage.local.memory-chunks вообще удалить, иначе в логах будут ошибки вида:

docker logs prometheus
Error parsing commandline arguments: unknown long flag '--storage.local.memory-chunks'
prometheus: error: unknown long flag '--storage.local.memory-chunks'

Вновь запускаем docker-контейнер с новой версией Prometheus, результат тот же. В логах на этот раз:

docker logs prometheus
level=error ts=2017-11-10T09:31:06.058617408Z caller=main.go:413 msg="Failed to apply configuration" err="error loading rules, previous rule set restored"
level=error ts=2017-11-10T09:31:06.058628726Z caller=main.go:356 msg="Error loading config" err="one or more errors occurred while applying the new configuration (--config.file=/etc/prometheus/prometheus.yml)"

Оказывается, теперь в контейнере prometheus запускается от пользователя nobody, а не root. Правим права доступа на примонтированный том, в котором хранятся метрики и наконец-то Prometheus запускается!

Однако, приключения на этом не заканчиваются — на дашбордах в графане часть метрик не отображаются, а именно метрики, использующие функцию count_scalar(). Для исправления ситуации в моем случае пришлось заменить выражение:

sum(rate(node_cpu{alias="$host"}[$interval])) by (mode) * 100 / count_scalar(node_cpu{mode="user", alias="$host"})

на следующее:

sum without(cpu)(rate(node_cpu{alias="$host"}[$interval])) * 100 / ignoring(mode) group_left count without(cpu)(node_cpu{mode="user", alias="$host"})

а такое выражение:

100 - sum(rate(node_cpu{alias="$host", mode="idle"}[$interval])) by (mode) * 100 / count_scalar(node_cpu{mode="user", alias="$host"})

на:

100 - sum without(cpu)(rate(node_cpu{alias="$host", mode="idle"}[$interval])) * 100 / ignoring(mode) group_left count without(cpu)(node_cpu{mode="user", alias="$host"})

Кроме того, изменился также формат alertrules, но об этом отдельная статья.

Стоит отметить, что многих «приключений» можно избежать, если вовремя читать release notes или migration guide.

HashFlare

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