То, с чем вы столкнулись, является следствием эфемерной природы контейнера, одной из проблем при мониторинге контейнерных приложений. Прежде чем мы перейдем к рассмотрению каких-либо вариантов решения, давайте посмотрим ...
Как так получилось, что Grafana показывает больше примеров, чем есть.
Прометей - это база данных временных рядов. Время от времени он связывается со своими целями очистки и собирает метрики. Эти метрики сохраняются с отметкой времени и набором меток, одна из которых является меткой «экземпляр».
Метка экземпляра обычно состоит из адреса (имени хоста / домена или IP-адреса) и порта, который Prometheus использует для очистки метрик. В этом примере адрес экземпляра является IP-адресом, потому что список целей получается через DNS-сервер (dns_sd_configs
в определении задания).
Когда вы развернули стек, docker создал как минимум один контейнер для каждой службы, включая node-exporter и prometheus. Вскоре после этого прометей начал получать метрики от экземпляра узла-экспортера, однако через некоторое время контейнер узла-экспортера был воссоздан. Либо вы обновили его, либо убили, либо он разбился - я не знаю, но главное - у вас был новый контейнер. Контейнер нового узла-экспортера получил другой IP-адрес, и из-за этого метрики из нового экземпляра получили другую метку «экземпляр».
Помните, что Прометей - это база данных временных рядов? Вы не потеряли метрики отключившегося экземпляра, они все еще находятся в базе данных. Как раз в этот момент вы начали собирать метрики узла-экспортера с другим набором меток (по крайней мере, новый IP-адрес в метке «экземпляр»). Когда Grafana запрашивает ярлыки для вас, она запрашивает показатели за период, установленный в данный момент на панели управления. Поскольку период был «сегодня», вы видели случаи, которые были присутствовали сегодня. Другими словами, когда вы запрашиваете список возможных значений экземпляра, вы получаете список значений за период без какой-либо фильтрации для текущих активных экземпляров.
Общее решение.
Для этой задачи вам нужно использовать статические метки. Ярлыки «instance» или «pod_name» (K8s) - плохой выбор, если вам не нравится видеть мертвые экземпляры в списке. Выберите ярлык, который представляет вещь или устройство, за которым вы хотите наблюдать, и придерживайтесь его. Поскольку узел-экспортер должен отслеживать метрики узла, я думаю, подойдет метка имени хоста.
Если вы не видите способа избежать использования динамических меток, вы можете использовать короткий временной диапазон на панели инструментов, чтобы функция label_values()
не возвращала длинные мертвые метки. Вы хотите установить для параметра обновления переменной значение «При изменении диапазона времени», чтобы вы могли использовать короткий интервал панели управления для просмотра и выбора активных в данный момент экземпляров и длительный период для любого другого случая.
Вариант именно для этой проблемы.
Как я сказал ранее, в этом случае будет лучше использовать метку имени хоста. Проблема в том, что в рассматриваемой метрике такой метки нет. Проверяя репозиторий swarmprom, я обнаружил, что этот экспортер узлов был настроен так, чтобы отображать имя хоста с помощью метки node_meta
( здесь). Таким образом, можно сопоставить имя хоста экземпляру (-ам) с помощью связанных переменных.
Другая проблема заключается в том, что это решение может потребовать изменений в запросах панели. Поскольку одно имя хоста может быть преобразовано в несколько экземпляров, важно, чтобы запросы панели использовали регулярное выражение для метки "экземпляр" (то есть =~
вместо =
).
Вот как все это сделать:
- Создайте новую переменную с именем hostname, установите для параметра обновления значение «On Time Range Change» и используйте это для поля запроса:
label_values(node_meta, node_name)
Он будет использоваться в качестве селектора на панели инструментов.
- Обновите переменную 'node': установите параметр обновления на 'On Time Range Change', включите 'Multi-value' и 'Add All option', замените запрос следующим:
label_values(node_meta{node_name="$hostname"}, instance)
Это вернет набор меток «экземпляров», соответствующих выбранному «имени хоста». Если вы выберете все и обновите запросы панели для поддержки многозначной метки экземпляра, вы сможете просматривать метрики из всех экземпляров контейнера, связанных с выбранным именем хоста.
- Откройте модель JSON панели инструментов и скопируйте ее в свой любимый текстовый редактор. Замените все вхождения
instance=
на instance=~
, затем скопируйте и вставьте отредактированную модель в Grafana.
person
anemyte
schedule
08.03.2021
node
переменнойRefresh
наOn time range change
. Затем измените временной диапазон на панели управления на что-нибудь короткое, например, пять последних минут. Если я прав, вы должны увидеть в списке только один экземпляр. - person anemyte   schedule 07.03.2021node-exported
проблематичен? - person tandathuynh148   schedule 08.03.2021prometheus.yml
- job_name: 'node-exporter' dns_sd_configs: - names: - 'tasks.node-exporter' type: 'A' port: 9100
. Вы знаете, какой атрибут я могу добавить для фильтрации этих работающих контейнеров? - person tandathuynh148   schedule 08.03.2021