Перейти к основному содержимому

Агрегации

seq-db поддерживает различные типы агрегаций: функциональные агрегации, гистограммы и таймсерии (временные ряды). Каждый из этих типов опирается на использование обратного индекса, поэтому для вычисления агрегаций по полям поле должно быть проиндексировано.

Функциональные агрегации

Агрегации позволяют вычислять статистические значения по полям документов, соответствующих запросу. Например, вычисление количества логов, записанных каждым сервисом в заданном интервале, или всех уникальных значений поля.

seq-db поддерживает различные функции агрегации:

  • AGG_FUNC_SUM — сумма значений поля
  • AGG_FUNC_AVG — среднее значение поля
  • AGG_FUNC_MIN — минимальное значение поля
  • AGG_FUNC_MAX — максимальное значение поля
  • AGG_FUNC_QUANTILE — квантиль поля
  • AGG_FUNC_UNIQUE — уникальные значения поля (не работает у таймсерий)
  • AGG_FUNC_COUNT — количество документов для каждого уникального значения поля

Для ознакомления с API функций обратитесь к документации публичного API

Чтобы лучше понять, как работают агрегации, проиллюстрируем примеры с аналогичными SQL-запросами.

Sum, average, minimum, maximum, quantile

Вычисление вышеупомянутых агрегаций требует:

  • AGG_FUNC - одна из функций AGG_FUNC_SUM, AGG_FUNC_AVG, AGG_FUNC_MIN, AGG_FUNC_MAX, AGG_FUNC_QUANTILE,
  • aggregate_by_field - поле, к которому применяется агрегация
  • group_by_field - поле, по которому группируются значения (используется не для всех агрегаций)
  • filtering_query- запрос чтобы отфильтровать только интересующие нас логи
  • quantile - только для AGG_FUNC_QUANTILE

В общем случае это преобразуется в следующий SQL-запрос:

SELECT <group_by_field>, AGG_FUNC(<aggregate_by_field>)
FROM db
WHERE <filtering_query>
GROUP BY <group_by_field>

Используя наш API:

grpcurl -plaintext -d '
{
"query": {
"from": "2000-01-01T00:00:00Z",
"to": "2077-01-01T00:00:00Z",
"query": "<filtering_query>"
},
"aggs": [
{
"field": "<aggregate_by_field>",
"func": "AGG_FUNC",
"group_by": "<group_by_field>"
}
]
}' localhost:9004 seqproxyapi.v1.SeqProxyApi/GetAggregation

Рассматривая реальный пример, нам может потребоваться вычислить среднее время ответа для сервисов, имеющих поле response_time. Тогда мы бы написали следующий запрос:

SELECT service, AVG(response_time)
FROM db
WHERE response_time:* -- meaning that `response_time` field exists in logs
GROUP BY service

Используя наш API:

grpcurl -plaintext -d '
{
"query": {
"from": "2000-01-01T00:00:00Z",
"to": "2077-01-01T00:00:00Z",
"query": "response_time:*"
},
"aggs": [
{
"field": "response_time",
"func": "AGG_FUNC_AVG",
"group_by": "service"
}
]
}' localhost:9004 seqproxyapi.v1.SeqProxyApi/GetAggregation

Count, unique

Агрегации Count и Unique очень похожи на приведенные выше примеры, за исключением того, что для этих агрегаций нет необходимости в дополнительном group_by_field, поскольку мы уже группируем по aggregate_by_field.

SQL-запрос для агрегации AGG_FUNC_COUNT:

SELECT <aggregate_by_field>, COUNT (*)
FROM db
WHERE <filtering_query>
GROUP BY <aggregate_by_field>

Используя наш API:

grpcurl -plaintext -d '
{
"query": {
"from": "2000-01-01T00:00:00Z",
"to": "2077-01-01T00:00:00Z",
"query": "<filtering_query>"
},
"aggs": [
{
"field": "<aggregate_by_field>",
"func": "AGG_FUNC_COUNT"
}
]
}' localhost:9004 seqproxyapi.v1.SeqProxyApi/GetAggregation

Рассматривая реальный пример, мы можем захотеть вычислить количество логов для каждого уровня логирования (debug, info и т.д.) для определенного сервиса, например, seq-db. Тогда мы можем написать следующий запрос:

SELECT level, COUNT(*)
FROM db
WHERE service:seq-db
GROUP BY level

Используя наш API:

grpcurl -plaintext -d '
{
"query": {
"from": "2000-01-01T00:00:00Z",
"to": "2077-01-01T00:00:00Z",
"query": "service:seq-db"
},
"aggs": [
{
"field": "level",
"func": "AGG_FUNC_COUNT"
}
]
}' localhost:9004 seqproxyapi.v1.SeqProxyApi/GetAggregation

Гистограммы

Гистограммы позволяют пользователям визуально интерпретировать распределение логов, удовлетворяющих заданному запросу. Например, количество логов определенного сервиса за заданный интервал времени.

Гистограммы можно запрашивать отдельно, используя GetHistogram, или вместе с документами и функциональными агрегациями, используя ComplexSearch.

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

Таймсерии

Таймсерии позволяют вычислять агрегации для интервалов и визуализировать их. Они представляют собой нечто среднее между гистограммами и функциональными агрегациями: они позволяют одновременно вычислять несколько гистограмм для заданных функций агрегации.

Рассмотрим предыдущий пример с гистограммами, где мы визуализировали количество логов во времени только для одного сервиса за раз. Используя возможности таймсерий, мы можем одновременно вычислить количество логов для каждого сервиса, используя AGG_FUNC_COUNT по полю service.

Другой пример использования таймсерий — визуализация количества логов для каждого уровня логирования во времени. Это может быть особенно полезно, когда необходимо отлаживать проблемы в реальном времени. Мы можем просто визуализировать количество логов для каждого уровня и найти необычные всплески и связанные с ними логи.

Поскольку временные ряды по сути являются агрегациями, они имеют тот же API, что и агрегации, за исключением того, что присутствует новое поле interval для вычисления количества интервалов для расчета агрегации. Для получения подробной информации обратитесь к публичному API.