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

Советы по оптимизации SML

В статье рассматриваются примеры оптимизаций поиска на языке запросов Smart Monitor Language (далее - SML). Ознакомиться с полным списком команд и их назначением можно по ссылке.

Использование полнотекстового поиска

Полнотекстовый поиск упрощает функционал по обработке сырых событий, однако стоит помнить, что его использование влечет за собой определенные накладные расходы. Если Вы точно знаете по каким полям выполнять поиск, то лучше указывать именно их.

Пример запроса для полнотекстового поиска событий входа в систему:

source sm_cs_auth_indexes
| search "*4624*"

Искомые события хранятся в поле event.code, тогда измененный запрос примет вид:

source sm_cs_auth_indexes
| search event.code=4624

Использование wildcards

Для поиска по шаблону значений в Smart Monitor есть возможность использования wildcards. Поиск с применением wildcards более ресурсозатратный, поскольку увеличивает число событий для поиска. В особенности это заметно при использовании лидирующих wildcards:

source sm_cs_auth_indexes
| search file.path="*/example.json"

Для избежания подобных ситуаций поможет парсинг данных от источника по стандарту ECS. Пример запроса представлен ниже:

source sm_cs_auth_indexes
| search file.name="example.json"

В первом случае при парсинге не по стандарту ECS поле file.path содержит как путь до файла, так и его название. Во втором же случае после применения парсинга по ECS будет доступно два поля: file.path - путь до файла, file.name - имя файла. В такой ситуации поиск выполняется по конкретному значению для поля, в данном случае по file.name со значением example.json.

Оба примера выполняют одну и ту же задачу, но во втором примере поиск более оптимизирован и использует минимум ресурсов кластера.

Используйте фильтрацию до манипуляций с данными

Рекомендуется сокращать выборку перед использованием команд по обработке данных при использовании Smart Monitor. Если Вам необходимо отфильтровать уже обработанные данные, то можно обратиться к команде where в SML.

В примере ниже происходит обращение к индексу sm_cs_auth_indexes и дальнейшая фильтрация по полученным данным в поле user.name:

source sm_cs_auth_indexes
| search event.code=4624
| aggs count by user.name, host.name, source.ip
| where user.name=="maksimov.m"

Выполнение поиска с прямым условием

При выполнении поиска с условием отрицания затрачивается больше ресурсов, чем при указании конкретного условия. Если Вы заранее знаете по каким данным выполнять поиск, то лучшим решением будет использование прямого условия.

Пример запроса с условием отрицания:

source sm_cs_auth_indexes
| search user.name!="SMART-DC$" AND event.action!="logged-in"

Пример запроса с прямым условием:

source sm_cs_auth_indexes
| search user.name="maksimov.m" AND event.action="logged-out"

Команды уровня хранилища

При построении поисковых запросов в первую очередь старайтесь использовать команды выполняемые на уровне хранилища такие как peval, search, aggs и timeaggs так как они имеют большую скорость работы.

Команды подсчета статистики

В Smart Monitor доступны команды подсчета статистики: aggs и stats.

С использованием команды aggs выполнение статистических операций происходит на уровне SM Data Storage и позволяет обработать больший набор данных. Для команды stats важно учитывать параметр qsize, фильтрующий количество обрабатываемых событий. Изменение параметра qsize в большую сторону повышает нагрузку на систему, что требует дополнительного увеличения оперативной памяти.

Аналогичным образом работают команды подсчета статистики по временной шкале: timeaggs и timechart.

Эффективное использование команд

Правильно подобранные команды позволяют оптимизировать поиск и снизить нагрузку на систему. Понимание применимости команд позволит Вам ощутить максимальную пользу от использования Smart Monitor.

Поисковый движок работает таким образом, что на вход следующей команды поступают результаты выполнения предыдущей команды. Например, если Вам необходимо выполнить преобразования над данными до агрегации (команда aggs), то команда eval в таком случае не сработает и будет выведена соответствующая ошибка. Пример запроса представлен ниже:

source sm_cs_auth_indexes
| eval user.domain=lower(user.domain)
| aggs count by user.domain

В таком случае необходимо использовать команду peval, которая использует внутренний механизм SM Data Storage:

source sm_cs_auth_indexes
| peval user.domain=lower(user.domain)
| aggs count by user.domain
Выполнение поиска

Для просмотра имеющихся полей в событии после обработки можно воспользоваться командой | table *.

В Smart Monitor пользователь может обогащать данные поискового запроса с помощью вложенного подзапроса. Для этого можно воспользоваться командой join:

source sm_cs_auth_indexes
| search user.name!="*$" AND user.name!="unknown" AND event.code=4624
| peval source.address=coalesce(source.address, source.ip)
| aggs count, latest(@timestamp) as latest_time, earliest(@timestamp) as earliest_time, values(source.address) as source.address_values, values(winlog.computer_name) as winlog.computer_name_values by user.name
| eval duration=strptime(latest_time, "YYYY-MM-dd'T'HH:mm:ss.SSS'Z'") - strptime(earliest_time, "YYYY-MM-dd'T'HH:mm:ss.SSS'Z'")
| eval user.name=lower(user.name)
| join user.name
[ source sm_cs_auth_indexes
| search event.code=4634
| peval user.name=lower(user.name)
| aggs max(@timestamp) as time_password_last_change by user.name ]

Объединять данные можно по нескольким источникам, ограничений системой не накладывается.

Знание этих и других тонкостей позволят эффективно использовать возможности Smart Monitor для анализа Ваших данных.