Перейти к основному содержимому
Версия: 2.0 (WIP)

Источники данных виджетов

Виджеты дашбордов используют следующие типы источников данных:

  • Статические данные
  • Метрики
  • Атрибуты
  • Индикаторы здоровья
  • OpenSearch

Метрики

Для получения метрик используется PromQL запрос. PromQL запрос бывает нескольких типов:

  • query
  • query_range

Отличие между query (instant) и query_range (range) в PromQL

Характеристикаquery (instant)query_range (range)
Тип запросаМгновенный запрос (одна точка во времени)Запрос за диапазон времени (интервал)
Возвращаемые данныеПоследнее значение метрикиМассив значений за указанный период
Формат ответа"resultType": "vector""resultType": "matrix"
Структура ответа"value": [timestamp, "value"]"values": [[ts1, "v1"], [ts2, "v2"], ...]
ИспользованиеТекущее состояние (например, CPU сейчас)Графики, тренды (например, CPU за час)
Пример PromQLup{job="node"}up{job="node"}[5m]

Instant Query

Возвращает одно актуальное значение метрики на момент выполнения запроса. Используется для отображения текущего состояния (например, статус сервиса, текущая загрузка CPU).

Пример запроса:

http_requests_total{handler="/api"}

Пример ответа:

[
{
"status": "success",
"data": {
"resultType": "vector",
"result": [
{
"metric": {},
"value": [1743080341, "1"]
}
]
}
},
{
"status": "success",
"data": {
"resultType": "vector",
"result": [
{
"metric": {},
"value": [1743080341, "2"]
}
]
}
}
]

Range Query

Возвращает массив значений за указанный временной диапазон (например, последние 5 минут). Используется для построения графиков или анализа трендов.

Пример запроса:

http_requests_total{handler="/api"}[5m]

Пример ответа:

[
{
"status": "success",
"data": {
"resultType": "matrix",
"result": [
{
"metric": {},
"values": [
[1743079579, "1"],
[1743079580, "1"]
]
}
]
}
},
{
"status": "success",
"data": {
"resultType": "matrix",
"result": [
{
"metric": {},
"values": [
[1743079579, "2"],
[1743079580, "2"]
]
}
]
}
}
]

Ключевые различия

Тип данных:

  • queryvector (одно значение + метки).
  • query_rangematrix (набор значений с метками).

Применение:

  • query → Дашборды с текущими показателями (например, "Сейчас онлайн: 42").
  • query_range → Графики изменения метрик (например, "Запросы за последний час").

Синтаксис PromQL:

  • Для query_range обязательно указывать диапазон в квадратных скобках (например, [5m]).

Для query_range должна существовать опция "Использовать последнее значение", которая берет крайнюю правую точку из matrix (аналог query).

Статическое значение

Статическое значение задаётся напрямую в настройках виджета как массив объектов. Каждый объект содержит:

  • legend — название (подпись) значения
  • value — числовое значение

Формат данных:

[
{ "legend": "<имя>", "value": <число> }
]

Пример:

[
{ "legend": "Метрика #1", "value": 123 },
{ "legend": "Метрика #2", "value": 456 }
]

В рамках одного виджета каждая запись из массива визуально отображается отдельно.

Значения атрибутов

Значения атрибутов — это данные о конфигурационных единицах (КЕ), полученные из CMDB. Каждая КЕ имеет поле attribute_values — массив объектов, содержащих имя и значение атрибута.

Формат атрибута КЕ:

{
"attribute_name": "<имя атрибута>",
"value": "<значение>"
}

Формат данных:

Ответ преобразуется в массив объектов { legend, value } для каждого атрибута каждой КЕ. legend берётся из attribute_name, value — из соответствующего поля объекта КЕ.

[
{ "legend": "<имя атрибута>", "value": "<значение атрибута>" },
{ "legend": "<имя атрибута>", "value": "<значение атрибута>" }
]

OpenSearch

OpenSearch используется для запросов к индексам логов и документов. В отличие от метрик (Prometheus), OpenSearch работает с полнотекстовым поиском и агрегациями над структурированными данными.

Для получения данных из OpenSearch используется его REST API с отправкой запроса в формате DSL (Domain Specific Language).

При использовании OpenSearch в качестве источника данных виджетов допускается только один запрос. Несколько запросов к OpenSearch не поддерживаются.

Пример запроса

{
"query": {
"bool": {
"must": [
{ "match": { "level": "error" } },
{ "range": { "@timestamp": { "gte": "now-1h", "lte": "now" } } }
]
}
},
"size": 0,
"aggs": {
"logs_per_minute": {
"date_histogram": {
"field": "@timestamp",
"calendar_interval": "1m"
},
"aggs": {
"error_count": {
"value_count": {
"field": "_id"
}
}
}
}
}
}

Пример ответа

{
"took": 42,
"timed_out": false,
"hits": {
"total": { "value": 1523 },
"hits": []
},
"aggregations": {
"logs_per_minute": {
"buckets": [
{
"key_as_string": "2024-03-26T10:00:00Z",
"key": 1711442400000,
"doc_count": 245,
"error_count": { "value": 245 }
},
{
"key_as_string": "2024-03-26T10:01:00Z",
"key": 1711442460000,
"doc_count": 198,
"error_count": { "value": 198 }
}
]
}
}
}

Ключевые особенности

  • Запрос: отправляется как JSON DSL на endpoint POST /{index}/_search.
  • Фильтрация: используется bool query с must, filter, should для комбинирования условий.
  • Агрегации: поддерживаются date_histogram, terms, avg, sum, cardinality и другие для построения графиков и статистики.
  • Временной диапазон: фильтруется через поле времени (например, @timestamp) в range query или передаётся через параметры ?from и ?size.
  • Pagination: параметры from и size управляют смещением и количеством возвращаемых документов.

Для дашбордов рекомендуется использовать агрегации (aggs) вместо возврата сырых документов (size: 0), чтобы минимизировать объём передаваемых данных и нагрузку на кластер.

Преобразование данных из OpenSearch

Для виджетов, использующих OpenSearch в качестве источника данных, данные из OpenSearch преобразуются в формат, понятный виджету, с помощью JSONata — лёгкого языка запросов и трансформаций для JSON.

Принцип работы

  1. Виджет отправляет запрос к OpenSearch и получает ответ в формате DSL-ответа OpenSearch.
  2. Пользователь задаёт JSONata-выражение, которое преобразует ответ OpenSearch в нужный для виджета формат.

Пример трансформации из OpenSearch в формат виджета «Одно значение»

Ниже приведён пример: исходный ответ OpenSearch, JSONata-выражение и результат в формате виджета «Одно значение".

Исходные данные (ответ OpenSearch)

{
"took": 42,
"timed_out": false,
"hits": { "total": { "value": 1523 }, "hits": [] }
}

JSONata-выражение

$map($.hits.hits, function($v, $i) {
{
"legend": $v._index,
"value": $i
}
})

Результат

[
{
"legend": "logs",
"value": 0
},
{
"legend": "logs",
"value": 1
}
]
ПолеОписание
legendОтображаемое название значения (например, строка времени)
valueЧисловое значение метрики