Транслируемые команды
Поиск по хранилищу 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"
| talbe 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 |