Как объединить метки из разных метрик в одну конкретную метрику в Prometheus

Вопрос или проблема

Я пытаюсь объединить метки из разных oid в одну для каждого места (если это возможно, то с пользовательским именем), между всеми oid есть общее значение.

Таким образом, вместо этого массивного массива я бы получил

# HELP pd_RG RG name - 1.3.6.1.4.1.22274.1.2.1.1.3
# TYPE pd_RG gauge
pd_RG{pd_RG="Pool_01_SSD",pd_location="1"} 1
pd_RG{pd_RG="Pool_01_SSD",pd_location="2"} 1
pd_RG{pd_RG="Pool_01_SSD",pd_location="3"} 1
# HELP pd_command_queuing command queuing - 1.3.6.1.4.1.22274.1.2.1.1.13
# TYPE pd_command_queuing gauge
pd_command_queuing{pd_command_queuing="Enabled",pd_location="1"} 1
pd_command_queuing{pd_command_queuing="Enabled",pd_location="10"} 1
pd_command_queuing{pd_command_queuing="Enabled",pd_location="11"} 1
# HELP pd_location PD location - 1.3.6.1.4.1.22274.1.2.1.1.1
# TYPE pd_location gauge
pd_location{pd_location="0"} 1
pd_location{pd_location="1"} 1
pd_location{pd_location="10"} 1
pd_location{pd_location="11"} 1
# HELP pd_performance PD performance (size:KB) - 1.3.6.1.4.1.22274.1.2.1.1.14
# TYPE pd_performance gauge
pd_performance{pd_location="1",pd_performance="2496"} 1
pd_performance{pd_location="10",pd_performance="8148"} 1
pd_performance{pd_location="11",pd_performance="12748"} 1
# HELP pd_readahead readahead enable - 1.3.6.1.4.1.22274.1.2.1.1.12
# TYPE pd_readahead gauge
pd_readahead{pd_location="1",pd_readahead="Enabled"} 1
pd_readahead{pd_location="10",pd_readahead="Enabled"} 1
pd_readahead{pd_location="11",pd_readahead="Enabled"} 1
# HELP pd_serial serial number - 1.3.6.1.4.1.22274.1.2.1.1.8
# TYPE pd_serial gauge
pd_serial{pd_location="1",pd_serial="843IPLHT"} 1
pd_serial{pd_location="10",pd_serial="5KKLY7KGT"} 1
pd_serial{pd_location="11",pd_serial="6UHYGKGT"} 1
# HELP pd_size Size(GB) - 1.3.6.1.4.1.22274.1.2.1.1.2
# TYPE pd_size gauge
pd_size{pd_location="1",pd_size="3575"} 1
pd_size{pd_location="10",pd_size="16762"} 1
pd_size{pd_location="11",pd_size="16762"} 1
# HELP pd_standby standby timeout - 1.3.6.1.4.1.22274.1.2.1.1.11
# TYPE pd_standby gauge
pd_standby{pd_location="1",pd_standby="Disabled"} 1
pd_standby{pd_location="10",pd_standby="Disabled"} 1
pd_standby{pd_location="11",pd_standby="Disabled"} 1
# HELP pd_status status - 1.3.6.1.4.1.22274.1.2.1.1.4
# TYPE pd_status gauge
pd_status{pd_location="1",pd_status="Online"} 1
pd_status{pd_location="10",pd_status="Online"} 1
pd_status{pd_location="11",pd_status="Online"} 1
# HELP pd_status_health health - 1.3.6.1.4.1.22274.1.2.1.1.5
# TYPE pd_status_health gauge
pd_status_health{pd_location="1",pd_status_health="Good"} 1
pd_status_health{pd_location="10",pd_status_health="Good"} 1
pd_status_health{pd_location="11",pd_status_health="Good"} 1
# HELP pd_status_usage usage - 1.3.6.1.4.1.22274.1.2.1.1.6
# TYPE pd_status_usage gauge
pd_status_usage{pd_location="1",pd_status_usage="RD"} 1
pd_status_usage{pd_location="10",pd_status_usage="RD"} 1
pd_status_usage{pd_location="11",pd_status_usage="RD"} 1
# HELP pd_type type - 1.3.6.1.4.1.22274.1.2.1.1.9
# TYPE pd_type gauge
pd_type{pd_location="1",pd_type=""} 1
pd_type{pd_location="10",pd_type=""} 1
pd_type{pd_location="11",pd_type=""} 1
# HELP pd_vendor vendor - 1.3.6.1.4.1.22274.1.2.1.1.7
# TYPE pd_vendor gauge
pd_vendor{pd_location="1",pd_vendor="SAMSUNG"} 1
pd_vendor{pd_location="10",pd_vendor="WDC"} 1
pd_vendor{pd_location="11",pd_vendor="WDC"} 1
# HELP pd_write_cache write cache enable - 1.3.6.1.4.1.22274.1.2.1.1.10
# TYPE pd_write_cache gauge
pd_write_cache{pd_location="1",pd_write_cache="Enabled"} 1
pd_write_cache{pd_location="10",pd_write_cache="Enabled"} 1
pd_write_cache{pd_location="11",pd_write_cache="Enabled"} 1

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

pd_info_loc_1{pd_RG="Pool_01_SSD",pd_location="1",pd_command_queuing="Enabled",pd_performance="2496",pd_readahead="Enabled",pd_serial="843IPLHT", pd_size="3575",pd_status_health="Good"} 1  
pd_info_loc_10{pd_RG="Pool_01_SSD",pd_location="10",pd_command_queuing="Enabled",pd_performance="8148",pd_readahead="Enabled",pd_serial="5KKLY7KGT", pd_size="16762",pd_status_health="Good"} 1  
pd_info_loc_11{pd_RG="Pool_01_SSD",pd_location="11",pd_command_queuing="Enabled",pd_performance="12748",pd_readahead="Enabled",pd_serial="6UHYGKGT", pd_size="16762",pd_status_health="Good"} 1

Ответ или решение

Как объединить метки из различных метрик в одну метрику в Prometheus

Объединение меток из различных метрик в одну метрику в Prometheus может показаться сложной задачей, но это вполне реализуемо с использованием некоторых функций языка запросов PromQL.

В вашем случае, вы хотите агрегировать различные метрики, связанные с местоположением, в новую метрику (pd_info_loc_x), которая будет содержать атрибуты из нескольких метрик, сгруппированные по pd_location. Ниже приводится пошаговое руководство по выполнению этой задачи.

1. Определение метрик и их ключевых значений

Для начала необходимо четко определить, какие метрики вы хотите объединить. Из вашего примера это:

  • pd_RG
  • pd_command_queuing
  • pd_performance
  • pd_readahead
  • pd_serial
  • pd_size
  • pd_status_health

Каждая из этих метрик имеет общую метку pd_location, которая будет использоваться для группировки данных.

2. Использование PromQL для агрегирования метрик

Prometheus позволяет использовать функции агрегации и временные ряды для объединения и переработки метрик. Основная цель здесь — создать временные ряды, которые объединяют значения метрик по ключевым меткам.

Используйте функцию group() или sum()

Вот как можно создать новую метрику, агрегируя метрики по pd_location:

pd_info_loc_1 = on(pd_location) group(pd_RG) * 1 
pd_info_loc_10 = on(pd_location) group(pd_command_queuing) * 1
pd_info_loc_11 = on(pd_location) group(pd_performance) * 1

Однако в данном случае вам нужно будет вручную собрать метрики, поскольку Prometheus не позволяет таким образом напрямую объединять метрики. Поэтому вам понадобится выполнить несколько шагов агрегации.

3. Составление новой метрики с помощью label_replace

Используйте label_replace для объединения значений в одну метрику:

pd_info_loc = label_replace(
                label_replace(
                    label_replace(
                        label_replace(pd_command_queuing, "pd_location", "$1", "pd_location", "(.*)"),
                        "pd_performance", "$1", "pd_performance", "(.*)"
                    ),
                    "pd_readahead", "$1", "pd_readahead", "(.*)"
                ),
                "pd_serial", "$1", "pd_serial", "(.*)"
);

Здесь показан пример, как можно использовать многоуровневый label_replace для добавления значений меток. Конечно, вам нужно будет сделать это для всех необходимых метрик.

4. Итоговое определение метрики с помощью sum

По завершении всех замен и манипуляций, создайте итоговую метрику с помощью sum:

sum(pd_info_loc) by (pd_location)

5. Пример финального запроса

Таким образом, полностью готовый запрос для создания новой метрики pd_info_loc_x может выглядеть так:

pd_info_loc_x{pd_RG="Pool_01_SSD", 
               pd_location=group(pd_location), 
               pd_command_queuing=group(pd_command_queuing), 
               pd_performance=group(pd_performance), 
               pd_readahead=group(pd_readahead), 
               pd_serial=group(pd_serial), 
               pd_size=group(pd_size),
               pd_status_health=group(pd_status_health)} 1

Заключение

Следует отметить, что процесс может потребовать настройки в зависимости от специфики ваших метрик и их названий. Также учтите, что для сложных манипуляций может потребоваться использование временных рядов и дополнительных логических условий. Prometheus обеспечивает гибкость, но не гарантирует, что все операции будут производиться за один шаг; иногда может потребоваться несколько запросов для достижения желаемого результата.

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

С помощью вышеописанных методов вы сможете успешно интегрировать метрики и провести их анализ по всем необходимым параметрам.

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

Капча загружается...