Prometheus: Миграция на версию 2.0
Dec 25, 2017 11:41 · 495 words · 3 minute read
После прочтения статьи с анонсом второй версии 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.