- Вопрос или проблема
- Ответ или решение
- Как объединить метки из различных метрик в одну метрику в Prometheus
- 1. Определение метрик и их ключевых значений
- 2. Использование PromQL для агрегирования метрик
- 3. Составление новой метрики с помощью label_replace
- 4. Итоговое определение метрики с помощью sum
- 5. Пример финального запроса
- Заключение
Вопрос или проблема
Я пытаюсь объединить метки из разных 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
, которые помогут визуализировать и настраивать экспорт данных более наглядно.
С помощью вышеописанных методов вы сможете успешно интегрировать метрики и провести их анализ по всем необходимым параметрам.