Перейти к основному содержимому
Версия: 4.1

Транслируемые команды

Поиск по хранилищу Clickhouse поддерживает трансляцию команд source, search, aggs, timeaggs и peval.

source

Особенности трансляции source см. в основы поиска Clickhouse

Выполняет поиск по данным. Основная документация по search.

Примеры

Пример №1

В примере будут запрошены события, у которых значение поля host.hostname попадает под wildcard host1*.

source clk:sysmon
| search host.hostname = "host1*"
| table host.hostname

В результате выполнения запроса можно получить следующий результат:

host.hostname
host11
host14
host17
host156

Пример №2

В примере события должны попадать под следующие фильтры:

  • поле host.name попадает под wildcard host1*
  • поле host.ip попадает под маску 178.0.0.0/8
  • поле name равно CPU utilization
source clk:sysmon
| search host.name = "host1*" and cidr host.ip = "178.0.0.0/8" and name = "CPU utilization"
| talbe host.name, host.ip, name

В результате выполнения запроса можно получить следующий результат:

host.namehost.ipname
host12178.16.0.33CPU utilization
host133178.26.0.89CPU utilization

aggs

Выполняет статистические операции над данными с помощью внутренних механизмов хранилища. Основная документация по aggs.

Отличия от OpenSearch
  • Не нужно использовать .keyword для обращения к текстовым полям
  • Нет параметра composite
  • Доступны функции last, first, range, stdev и list

Список доступных функций для команды aggs в Clickhouse:

ПараметрСинтаксисОписание
countcount | count(<field>)Вычисляет количество событий, содержащих поле. Если поле не указано, рассчитывает общее количество событий.
valuesvalues(<field>)Вычисляет массив уникальных значений по заданному полю.
avgavg(<field>)Вычисляет среднее значение по заданному полю.
dcdc(<field>)Вычисляет количество уникальных значений в заданном поле.
earliestearliest(<field>)Вычисляет значение поля для самого раннего события. В качестве второго (опционального) параметра передается имя поля с временной меткой. По умолчанию @timestamp.
firstfirst(<field>)Вычисляет первое значение по заданному полю.
lastlast(<field>)Вычисляет последнее значение по заданному полю.
latestlatest(<field>)Вычисляет значение поля для самого позднего события. В качестве второго (опционального) параметра передается имя поля с временной меткой. По умолчанию @timestamp.
listlist(<field>)Вычисляет массив всех значений по заданному полю.
maxmax(<field>)Вычисляет максимальное значение по заданному полю.
minmin(<field>)Вычисляет минимальное значение по заданному полю.
rangerange(<field>)Вычисляет разницу между максимальным и минимальным значением по заданному полю.
stdevstdev(<field>)Вычисляет среднеквадратическое отклонение по заданному полю.
sumsum(<field>)Вычисляет сумму значений по заданному полю.

Примеры

Пример №1

В примере будет рассчитано количество событий для каждого уникального значения event.code:

source clk:sysmon
| aggs count by event.code

В результате выполнения запроса можно получить следующий результат:

event.codecount
1346
7232
12783
22456

Пример №2

В примере будут рассчитаны значение последнего process_id и количество уникальных значений process_id для каждой уникальной пары event.code и host.hostname:

source clk:sysmon
| aggs latest(process_id), dc(process_id) by event.code, host.hostname

В результате выполнения запроса можно получить следующий результат:

event.codehost.hostnamelatest(process_id)dc(process_id)
1host1991580128
7host2996541226
7host387123498
12host1965323765

timeaggs

Выполняет поиск и генерацию массива данных, распределенных по временной шкале с помощью внутренних механизмов хранилища. Основная документация по timeaggs.

Отличия от OpenSearch
  • Не нужно использовать .keyword для обращения к текстовым полям
  • Нет параметра composite
  • В поле _time нет миллисекунд
  • Правая граница временного промежутка не включается, если в ней нет событий

Примеры

Пример №1

В примере будет построен график количества событий для каждого значения host.hostname:

source clk:sysmon
| timeaggs count by host.hostname

В результате выполнения запроса можно получить следующий результат:

Пример №2

В примере будут построены графики для средних и максимальных значений загрузки для CPU и свободной оперативной памяти:

source clk:zabbix
| timeaggs avg(value) as 'Среднее значение', max(value) as 'Максимальное значение' by name

В результате выполнения запроса можно получить следующий результат:

peval

Выполняет различные операции над данными. Базируется на внутренних механизмах хранилища. Основная документация по peval.

Отличия от OpenSearch
  • При обращении к несуществующему полю произойдет ошибка
  • Значения true и false обязательно должны вызываться как true() и false() соответственно
  • Чтобы записать null в поле, оно должно иметь свойство Nullable

Отличия функций от eval

предупреждение

Функции mvdedup и exact недоступны в Clickhouse.

Название функцииОсобенности в Clickhouse
mvzipРаботает только с массивами одинаковой длины.
printfНе доступно форматирование.
coalesceРаботает только для полей одного типа.
matchМожно не использовать регулярное выражение.
tonumberНе доступно для массивов.
tostringМожно использовать и для multivalue.
mvappendНельзя использовать для разных типов данных.
strftimeОтличается формат времени (например %Y-%m-%d %R:%S).
strptimeНе нужен второй аргумент.
md5Можно использовать только для String.
absМожно использовать только числа.
floorМожно использовать только числа.
ceilМожно использовать только числа.
logМожно рассчитывать логарифм только по основанию 2 или 10.
tonumberКонвертирует в float64.
typeofОтличаются названия типов: вместо Boolean - Bool, Integer - UInt8 и т.д.
lenНе считает длину числа, для этого нужно обернуть число в tostring().
ltrimОтсекает только обычные пробелы, не нужен второй аргумент.
replaceНе работает с регулярными выражениями.
rtrimАналогично ltrim.
substrПри отрицательном индексе считает от 0 или включает первую границу.
trimНе нужен второй аргумент.

Примеры

Пример №1

В примере полю type будет присвоено значение "CPU", если поле name равно "CPU utilization", в противном случае полю type будет присвоено значение "MEM":

source clk:zabbix
| peval type = if (name == "CPU utilization", "CPU", "MEM")
| table name, type

В результате выполнения запроса можно получить следующий результат:

nametype
CPU utilizationCPU
CPU utilizationCPU
Available memory in %MEM

Пример №2

В примере поле type примет значение, аналогичное первому примеру, поле value округлится до целого. После этого выполнится фильтрация событий, при которой в финальную выборку попадут события, у которых значение поля type равно CPU, а value больше 10:

source clk:zabbix
| peval type = if (name == "CPU utilization", "CPU", "MEM")
| peval value = round(value)
| search type = "CPU" and value > 10
| table name, type, value

В результате выполнения запроса можно получить следующий результат:

nametypevalue
CPU utilizationCPU12
CPU utilizationCPU17
CPU utilizationCPU36
CPU utilizationCPU13