Thank you for reading this post, don't forget to subscribe!
Prometheus со всеми необходимыми компонентами давно успешно работал в docker-контейнерах, как кописано в этой статье.
“С наскоку” меняю версию docker-образа в файле docker-compose.yml
, было:
1 2 3 4 |
... image: prom/prometheus:v1.8.1 ... |
стало:
1 2 3 4 |
... image: prom/prometheus:v2.0.0 ... |
Обновляю контейнер с помощью команды:
1 2 |
docker-compose up <span class="hljs-_">-d</span> |
и он не запускается:
1 2 3 |
<span class="hljs-attribute">CONTAINER</span> ID IMAGE COMMAND CREATED STATUS PORTS NAMES de3aa8198732 prom/prometheus:v2.<span class="hljs-number">0</span>.<span class="hljs-number">0</span> <span class="hljs-string">"/bin/prometheus -…"</span> <span class="hljs-number">21</span> seconds ago Restarting (<span class="hljs-number">1</span>) <span class="hljs-number">2</span> seconds ago prometheus |
Смотрим логи:
1 2 3 4 5 6 |
docker logs prometheus Error parsing commandline arguments: unknown short flag <span class="hljs-string">'-c'</span> prometheus: error: unknown short flag <span class="hljs-string">'-c'</span> Error parsing commandline arguments: unknown short flag <span class="hljs-string">'-c'</span> prometheus: error: unknown short flag <span class="hljs-string">'-c'</span> |
С помощью гугла выясняем, что в 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
, добавляя дефисы, запускаем контейнер — он опять не стартует! В логах:
1 2 3 4 5 6 |
docker logs prometheus Error parsing commandline arguments: unknown long flag <span class="hljs-string">'--alertmanager.url'</span> prometheus: error: unknown long flag <span class="hljs-string">'--alertmanager.url'</span> Error parsing commandline arguments: unknown long flag <span class="hljs-string">'--alertmanager.url'</span> prometheus: error: unknown long flag <span class="hljs-string">'--alertmanager.url'</span> |
Находим, что теперь URL для alertmanager’а нельзя задавать как параметр командной строки, его следует указывать в самом конфигурационном файле Prometheus вот так.
Исправляемся, пробуем запуститься — и снова неудача! Смотрим логи:
1 2 3 4 5 |
docker logs prometheus Error parsing commandline arguments: unknown long flag <span class="hljs-string">'--storage.local.path'</span> prometheus: error: unknown long flag <span class="hljs-string">'--storage.local.path'</span> Error parsing commandline arguments: unknown long flag <span class="hljs-string">'--storage.local.path'</span> |
В связи с новым хранилищем для метрик в Prometheus 2.0 вместо --storage.local.path=/prometheus
нужно использовать --storage.tsdb.path=/prometheus
, а параметр --storage.local.memory-chunks
вообще удалить, иначе в логах будут ошибки вида:
1 2 3 4 |
docker logs prometheus Error parsing commandline arguments: unknown long flag <span class="hljs-string">'--storage.local.memory-chunks'</span> prometheus: error: unknown long flag <span class="hljs-string">'--storage.local.memory-chunks'</span> |
Вновь запускаем docker-контейнер с новой версией Prometheus, результат тот же. В логах на этот раз:
1 2 3 4 |
docker logs prometheus level=error ts=2017-11-10T09:31:06.058617408Z <span class="hljs-built_in">caller</span>=main.go:413 msg=<span class="hljs-string">"Failed to apply configuration"</span> err=<span class="hljs-string">"error loading rules, previous rule set restored"</span> level=error ts=2017-11-10T09:31:06.058628726Z <span class="hljs-built_in">caller</span>=main.go:356 msg=<span class="hljs-string">"Error loading config"</span> err=<span class="hljs-string">"one or more errors occurred while applying the new configuration (--config.file=/etc/prometheus/prometheus.yml)"</span> |
Оказывается, теперь в контейнере prometheus
запускается от пользователя nobody, а не root. Правим права доступа на примонтированный том, в котором хранятся метрики и наконец-то Prometheus запускается!
Однако, приключения на этом не заканчиваются — на дашбордах в графане часть метрик не отображаются, а именно метрики, использующие функцию count_scalar()
. Для исправления ситуации в моем случае пришлось заменить выражение:
1 2 |
sum(rate(node_cpu{<span class="hljs-built_in">alias</span>=<span class="hljs-string">"<span class="hljs-variable">$host</span>"</span>}[<span class="hljs-variable">$interval</span>])) by (mode) * 100 / count_scalar(node_cpu{mode=<span class="hljs-string">"user"</span>, <span class="hljs-built_in">alias</span>=<span class="hljs-string">"<span class="hljs-variable">$host</span>"</span>}) |
на следующее:
1 2 |
sum without(cpu)(rate(node_cpu{<span class="hljs-built_in">alias</span>=<span class="hljs-string">"<span class="hljs-variable">$host</span>"</span>}[<span class="hljs-variable">$interval</span>])) * 100 / ignoring(mode) group_left count without(cpu)(node_cpu{mode=<span class="hljs-string">"user"</span>, <span class="hljs-built_in">alias</span>=<span class="hljs-string">"<span class="hljs-variable">$host</span>"</span>}) |
а такое выражение:
1 2 |
100 - sum(rate(node_cpu{<span class="hljs-built_in">alias</span>=<span class="hljs-string">"<span class="hljs-variable">$host</span>"</span>, mode=<span class="hljs-string">"idle"</span>}[<span class="hljs-variable">$interval</span>])) by (mode) * 100 / count_scalar(node_cpu{mode=<span class="hljs-string">"user"</span>, <span class="hljs-built_in">alias</span>=<span class="hljs-string">"<span class="hljs-variable">$host</span>"</span>}) |
на:
1 2 |
100 - sum without(cpu)(rate(node_cpu{<span class="hljs-built_in">alias</span>=<span class="hljs-string">"<span class="hljs-variable">$host</span>"</span>, mode=<span class="hljs-string">"idle"</span>}[<span class="hljs-variable">$interval</span>])) * 100 / ignoring(mode) group_left count without(cpu)(node_cpu{mode=<span class="hljs-string">"user"</span>, <span class="hljs-built_in">alias</span>=<span class="hljs-string">"<span class="hljs-variable">$host</span>"</span>}) |
Кроме того, изменился также формат alertrules,
Стоит отметить, что многих «приключений» можно избежать, если вовремя читать release notes или migration guide.