Транслируемые команды
Поиск по хранилищу Clickhouse поддерживает трансляцию команд source, search, aggs, timeaggs и peval.
source
Особенности трансляции source см. в основы поиска Clickhouse
search
Выполняет поиск по данным. Основная документация по 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попадает под wildcardhost1* - поле
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"
| table host.name, host.ip, name
В результате выполнения запроса можно получить следующий результат:
| host.name | host.ip | name |
|---|---|---|
| host12 | 178.16.0.33 | CPU utilization |
| host133 | 178.26.0.89 | CPU utilization |
aggs
Выполняет статистические операции над данными с помощью внутренних механизмов хранилища. Основная документация по aggs.
- Не нужно использовать
.keywordдля обращения к текстовым полям - Нет параметра
composite - Доступны функции
last,first,range,stdevиlist
Список доступных функций для команды aggs в Clickhouse:
| Параметр | Синтаксис | Описание |
|---|---|---|
count | count | count(<field>) | Вычисляет количество событий, содержащих поле. Если поле не указано, рассчитывает общее количество событий. |
values | values(<field>) | Вычисляет массив уникальных значений по заданному полю. |
avg | avg(<field>) | Вычисляет среднее значение по заданному полю. |
dc | dc(<field>) | Вычисляет количество уникальных значений в заданном поле. |
earliest | earliest(<field>) | Вычисляет значение поля для самого раннего события. В качестве второго (опционального) параметра передается имя поля с временной меткой. По умолчанию @timestamp. |
first | first(<field>) | Вычисляет первое значение по заданному полю. |
last | last(<field>) | Вычисляет последнее значение по заданному полю. |
latest | latest(<field>) | Вычисляет значение поля для самого позднего события. В качестве второго (опционального) параметра передается имя поля с временной меткой. По умолчанию @timestamp. |
list | list(<field>) | Вычисляет массив всех значений по заданному полю. |
max | max(<field>) | Вычисляет максимальное значение по заданному полю. |
min | min(<field>) | Вычисляет минимальное значение по заданному полю. |
range | range(<field>) | Вычисляет разницу между максимальным и минимальным значением по заданному полю. |
stdev | stdev(<field>) | Вычисляет стандартное отклонение для генеральной совокупности по заданному полю. |
sum | sum(<field>) | Вычисляет сумму значений по заданному полю. |
Примеры
Пример №1
В примере будет рассчитано количество событий для каждого уникального значения event.code:
source clk:sysmon
| aggs count by event.code
В результате выполнения запроса можно получить следующий результат:
| event.code | count |
|---|---|
| 1 | 346 |
| 7 | 232 |
| 12 | 783 |
| 22 | 456 |
Пример №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.code | host.hostname | latest(process_id) | dc(process_id) |
|---|---|---|---|
| 1 | host1 | 991580 | 128 |
| 7 | host2 | 996541 | 226 |
| 7 | host3 | 871234 | 98 |
| 12 | host1 | 965323 | 765 |
timeaggs
Выполняет поиск и генерацию массива данных, распределенных по временной шкале с помощью внутренних механизмов хранилища. Основная документация по timeaggs.
- Не нужно использовать
.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.
- При обращении к несуществующему полю произойдет ошибка
- Значения
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
В результате выполнения запроса можно получить следующий результат:
| name | type |
|---|---|
| CPU utilization | CPU |
| CPU utilization | CPU |
| 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
В результате выполнения запроса можно получить следующий результат:
| name | type | value |
|---|---|---|
| CPU utilization | CPU | 12 |
| CPU utilization | CPU | 17 |
| CPU utilization | CPU | 36 |
| CPU utilization | CPU | 13 |