Запрос ошибки в Grafana / Prometheus с нод-экспортером в режиме docker swarm

У меня проблема с запросом Grafana variable в конфигурации Dashboard. Переменная запроса должна возвращать количество узлов, присоединившихся к рой, но этого не произошло. В моем случае у меня только один узел роя, но переменная в Grafana возвращает до 5 узлов. Я не понимаю, что вызывает ошибку.

Вот ситуация: я настроил docker swarm на своем ноутбуке в качестве менеджера, только мой ноутбук с режимом swarm, никакие другие узлы не присоединились. Я использовал источник из https://github.com/stefanprodan/swarmprom для мониторинга хоста с помощью node-exporter . Я сохранил prometheus.yml в оригинале.

когда я выполняю метрику из prometheus, возвращается только один хост. Это правильно, потому что у меня был только один узел. Вы можете увидеть рисунок ниже  введите описание изображения здесь

Но когда я сделал запрос в Grafana, Grafana вернула 5 хостов. Здесь действительно было странно. Я не знаю, почему у меня было 5 хостов, потому что у меня был только один узел роя. введите описание изображения здесь

Я снова проверил репозиторий git с помощью play-with-docker, настроил один узел-менеджер и 2 клиентских узла. Все нормально работало. Запрос в Grafana вернул 3 хоста. введите описание изображения здесь

Вот формула запроса: label_values(node_uname_info{job="node-exporter"}, instance) Большое спасибо за вашу поддержку.


person tandathuynh148    schedule 07.03.2021    source источник
comment
Что для других экземпляров? Вы видите их показатели (попробуйте широкий временной диапазон)? Они заканчиваются в какой-то момент?   -  person anemyte    schedule 07.03.2021
comment
Я вижу только одного хоста в таблице прометея для широкого диапазона времени.   -  person tandathuynh148    schedule 07.03.2021
comment
Дело в том, что вы можете получать новый экземпляр каждый раз при перезапуске контейнера экспортера. Это связано с тем, что IP-адрес контейнера не является статическим, а значение метки вашего экземпляра привязано к IP-адресу. Попробуйте изменить параметр node переменной Refresh на On time range change. Затем измените временной диапазон на панели управления на что-нибудь короткое, например, пять последних минут. Если я прав, вы должны увидеть в списке только один экземпляр.   -  person anemyte    schedule 07.03.2021
comment
Да, я встречал случай, о котором вы упоминали ранее. Работало более одного контейнера экспортера, поэтому они вызывали несколько IP-адресов. Мне нужно выйти и снова запустить режим роя, чтобы убедиться, что работает только один node_exportes   -  person tandathuynh148    schedule 07.03.2021
comment
Этим утром я проверил еще раз, и теперь он показывает только 3 ips localhost с моим настоящим сервером. Это правильно, но вчера вечером он показывает 8 ips localhost. Как вы думаете, контейнер для node-exported проблематичен?   -  person tandathuynh148    schedule 08.03.2021
comment
Нет, я отправлю тебе ответ позже   -  person anemyte    schedule 08.03.2021
comment
Похоже, что я нашел проблему, другой IP-адрес был остановлен IP-адресом старого докера. Может быть, то, что я установил в prometheus.yml - job_name: 'node-exporter' dns_sd_configs: - names: - 'tasks.node-exporter' type: 'A' port: 9100. Вы знаете, какой атрибут я могу добавить для фильтрации этих работающих контейнеров?   -  person tandathuynh148    schedule 08.03.2021
comment
@anemyte, я отправляю новую ветку с причиной и цифрами для более подробной информации: stackoverflow.com/questions/66526433/   -  person tandathuynh148    schedule 08.03.2021


Ответы (1)


То, с чем вы столкнулись, является следствием эфемерной природы контейнера, одной из проблем при мониторинге контейнерных приложений. Прежде чем мы перейдем к рассмотрению каких-либо вариантов решения, давайте посмотрим ...

Как так получилось, что Grafana показывает больше примеров, чем есть.

Прометей - это база данных временных рядов. Время от времени он связывается со своими целями очистки и собирает метрики. Эти метрики сохраняются с отметкой времени и набором меток, одна из которых является меткой «экземпляр».

Метка экземпляра обычно состоит из адреса (имени хоста / домена или IP-адреса) и порта, который Prometheus использует для очистки метрик. В этом примере адрес экземпляра является IP-адресом, потому что список целей получается через DNS-сервер (dns_sd_configs в определении задания).

Когда вы развернули стек, docker создал как минимум один контейнер для каждой службы, включая node-exporter и prometheus. Вскоре после этого прометей начал получать метрики от экземпляра узла-экспортера, однако через некоторое время контейнер узла-экспортера был воссоздан. Либо вы обновили его, либо убили, либо он разбился - я не знаю, но главное - у вас был новый контейнер. Контейнер нового узла-экспортера получил другой IP-адрес, и из-за этого метрики из нового экземпляра получили другую метку «экземпляр».

Помните, что Прометей - это база данных временных рядов? Вы не потеряли метрики отключившегося экземпляра, они все еще находятся в базе данных. Как раз в этот момент вы начали собирать метрики узла-экспортера с другим набором меток (по крайней мере, новый IP-адрес в метке «экземпляр»). Когда Grafana запрашивает ярлыки для вас, она запрашивает показатели за период, установленный в данный момент на панели управления. Поскольку период был «сегодня», вы видели случаи, которые были присутствовали сегодня. Другими словами, когда вы запрашиваете список возможных значений экземпляра, вы получаете список значений за период без какой-либо фильтрации для текущих активных экземпляров.

Общее решение.

Для этой задачи вам нужно использовать статические метки. Ярлыки «instance» или «pod_name» (K8s) - плохой выбор, если вам не нравится видеть мертвые экземпляры в списке. Выберите ярлык, который представляет вещь или устройство, за которым вы хотите наблюдать, и придерживайтесь его. Поскольку узел-экспортер должен отслеживать метрики узла, я думаю, подойдет метка имени хоста.

Если вы не видите способа избежать использования динамических меток, вы можете использовать короткий временной диапазон на панели инструментов, чтобы функция label_values() не возвращала длинные мертвые метки. Вы хотите установить для параметра обновления переменной значение «При изменении диапазона времени», чтобы вы могли использовать короткий интервал панели управления для просмотра и выбора активных в данный момент экземпляров и длительный период для любого другого случая.

Вариант именно для этой проблемы.

Как я сказал ранее, в этом случае будет лучше использовать метку имени хоста. Проблема в том, что в рассматриваемой метрике такой метки нет. Проверяя репозиторий swarmprom, я обнаружил, что этот экспортер узлов был настроен так, чтобы отображать имя хоста с помощью метки node_meta ( здесь). Таким образом, можно сопоставить имя хоста экземпляру (-ам) с помощью связанных переменных.

Другая проблема заключается в том, что это решение может потребовать изменений в запросах панели. Поскольку одно имя хоста может быть преобразовано в несколько экземпляров, важно, чтобы запросы панели использовали регулярное выражение для метки "экземпляр" (то есть =~ вместо =).

Вот как все это сделать:

  1. Создайте новую переменную с именем hostname, установите для параметра обновления значение «On Time Range Change» и используйте это для поля запроса:
label_values(node_meta, node_name)

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

  1. Обновите переменную 'node': установите параметр обновления на 'On Time Range Change', включите 'Multi-value' и 'Add All option', замените запрос следующим:
label_values(node_meta{node_name="$hostname"}, instance)

Это вернет набор меток «экземпляров», соответствующих выбранному «имени хоста». Если вы выберете все и обновите запросы панели для поддержки многозначной метки экземпляра, вы сможете просматривать метрики из всех экземпляров контейнера, связанных с выбранным именем хоста.

  1. Откройте модель JSON панели инструментов и скопируйте ее в свой любимый текстовый редактор. Замените все вхождения instance= на instance=~, затем скопируйте и вставьте отредактированную модель в Grafana.
person anemyte    schedule 08.03.2021
comment
Я очень ценю вашу помощь, при первой попытке у него возникли проблемы с multime ip с тем же именем хоста. Например node_meta{container_label_com_docker_swarm_node_id="bfcuw6gwdmri0i0431aharleb",instance="10.0.1.160:9100",job="node-exporter",node_id="bfcuw6gwdmri0i0431aharleb",node_name="database"} node_meta{container_label_com_docker_swarm_node_id="bfcuw6gwdmri0i0431aharleb",instance="10.0.1.160:9100",job="node-exporter",node_id="bfcuw6gwdmri0i0431aharleb",node_name="database"} Но после нескольких попыток он работает нормально - person tandathuynh148; 09.03.2021