Начало работы с запросами журналов Azure Monitor

Примечание

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

Если вы уже знакомы с запросами на языке запросов Kusto, но вам нужно быстро создавать полезные запросы на основе типов ресурсов, см. панель с примерами запросов в статье Использование запросов в Azure Monitor Log Analytics.

В этом руководстве рассматривается написание запросов журналов в Azure Monitor. В этой статье описаны следующие операции:

  • понимать структуру запросов;
  • сортировать результаты запроса;
  • фильтровать результаты запроса;
  • указывать диапазон времени;
  • выбирать поля для включения в результаты;
  • определять и использовать настраиваемые поля;
  • вычислять и группировать результаты.

Руководство по использованию Log Analytics на портале Azure см. в разделе Начало работы со службой Log Analytics в Azure Monitor.

Дополнительные сведения о запросах журналов в Azure Monitor см. в разделе Общие сведения о запросах журналов в Azure Monitor.

Просмотрите видеоверсию этого учебника:

Написание запроса

Запросы могут начинаться с имени таблицы или команды search. Начните с имени таблицы, так как это определит четкую область запроса и повысит как производительность запроса, так и релевантность результатов.

Примечание

Azure Monitor использует язык запросов Kusto с учетом регистра. Ключевые слова языка обычно записываются в нижнем регистре. При использовании имен таблиц или столбцов в запросе обязательно используйте правильный регистр, как показано в области схемы.

Запросы на основе таблиц

Azure Monitor упорядочивает данные журнала в таблицы, каждая из которых состоит из нескольких столбцов. На портале Analytics в области схемы в Log Analytics отображаются все таблицы и столбцы. Определите интересующую вас таблицу, а затем взгляните на часть данных:

SecurityEvent
| take 10

Предыдущий запрос возвращает 10 результатов из таблицы SecurityEvent в произвольном порядке. Это распространенный способ взглянуть на таблицу и понять ее структуру и содержимое. Давайте рассмотрим структуру запроса:

  • Запрос начинается с имени таблицы SecurityEvent, которая определяет область запроса.
  • Символ вертикальной черты ("|") разделяет команды, поэтому выходные данные первой команды содержатся во входных данных следующей. Можно добавить любое число элементов, разделенных этой чертой.
  • За вертикальной чертой следует команда take, которая возвращает указанное количество произвольных записей из таблицы.

Мы можем выполнить запрос даже без добавления | take 10. Команда будет допустимой, но может вернуть до 10 000 результатов.

Поисковые запросы

Поисковые запросы менее структурированы и, как правило, лучше подходят для поиска записей, которые содержат указанное значение в любом из столбцов:

search in (SecurityEvent) "Cryptographic"
| take 10

Этот поисковый запрос выполняет в таблице SecurityEvent поиск записей, содержащих фразу "Cryptographic". Из этих записей будут возвращены и показаны 10. Если опустить часть in (SecurityEvent) и просто запустить search "Cryptographic", поиск пройдет по всем таблицам. Это будет дольше и менее эффективно.

Важно!

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

Операторы sort и top

Хотя команда take и полезна для получения нескольких записей, но результаты выбираются и отображаются в произвольном порядке. Чтобы получить упорядоченное представление, можно выполнить команду sort по предпочтительному столбцу:

SecurityEvent   
| sort by TimeGenerated desc

Предыдущий запрос может вернуть слишком много результатов и занять некоторое время. Приведенный выше запрос сортирует всю таблицу SecurityEvent по столбцу TimeGenerated. Портал аналитики ограничивает отображение для вывода только 10 000 записей. Такой подход, конечно же, не оптимален.

Лучшим способом получить только последние 10 записей является использование оператора top, который сортирует таблицу целиком на стороне сервера, а затем возвращает первые записи:

SecurityEvent
| top 10 by TimeGenerated

Порядок сортировки по убыванию используется по умолчанию, поэтому обычно можно опустить аргумент desc. Выходные данные выглядят следующим образом.

Снимок экрана: 10 верхних записей, отсортированных в убывающем порядке.

Оператор WHERE: фильтрация по условию

Фильтры, как очевидно из названия, фильтруют данные по указанному условию. Это самый распространенный способ ограничения результатов запроса для получения соответствующей информации.

Чтобы добавить фильтр к запросу, используйте оператор where, за которым следует одно или несколько условий. Например, следующий запрос возвращает только записи SecurityEvent, где Level равняется 8:

SecurityEvent
| where Level == 8

При написании условий фильтра вы можете использовать следующие выражения.

Выражение Описание Пример
== Проверка на равенство
(с учетом регистра)
Level == 8
=~ Проверка на равенство
(без учета регистра)
EventSourceName =~ "microsoft-windows-security-auditing"
!=, <> Проверка на неравенство
(оба выражения идентичны)
Level != 4
and, or Требуется между условиями Level == 16 or CommandLine != ""

Для фильтрации по нескольким условиям можно использовать любой из следующих подходов.

Используйте and, как показано здесь:

SecurityEvent
| where Level == 8 and EventID == 4672

Для этого также можно включить несколько элементов where, разделенных вертикальной чертой, как показано здесь:

SecurityEvent
| where Level == 8 
| where EventID == 4672

Примечание

Значения могут иметь разные типы, поэтому может потребоваться привести их в правильный тип для выполнения сравнения. Например, столбец Level таблицы SecurityEvent имеет строчный тип, поэтому необходимо привести его в числовой тип, например int или long, прежде чем вы сможете использовать его с числовыми операторами, как показано здесь: SecurityEvent | where toint(Level) >= 10

указывать диапазон времени;

Использование элемента выбора времени

Рядом с кнопкой Запуск находится элемент выбора времени, указывающий, что мы запрашиваем только записи за последние 24 часа. Этот диапазон времени по умолчанию применяется ко всем запросам. Чтобы получить записи только за последний час, выберите Последний час и повторно выполните запрос.

Снимок экрана: элемент выбора времени и его список команд временного диапазона.

Добавление фильтра времени в запрос

Вы также можете определить ваш собственный диапазон времени, добавив фильтр времени к запросу. Лучше всего поместить фильтр времени сразу после имени таблицы:

SecurityEvent
| where TimeGenerated > ago(30m) 
| where toint(Level) >= 10

В предыдущем фильтре времени ago(30m) означает "30 минут назад", то есть запрос возвращает записи только за последние 30 минут (это выражено, например, как 30m). Можно использовать и другие единицы времени, например дни (2d) и секунды (10s).

Использование операторов project и extend для выбора и вычисления столбцов

Используйте оператор project, чтобы выбрать конкретные столбцы, которые нужно включить в результаты:

SecurityEvent 
| top 10 by TimeGenerated 
| project TimeGenerated, Computer, Activity

Приведенный выше пример формирует следующие выходные данные:

Снимок экрана: список результатов для запроса project.

С помощью project также можно переименовать столбцы и определить новые. В примере ниже project используется для выполнения следующих действий.

  • Выбор только исходных столбцов Computer и TimeGenerated.
  • Отображает столбец Activity как EventDetails.
  • Создание столбца EventCode. Функция substring() используется для получения только первых четырех символов из поля Activity.
SecurityEvent
| top 10 by TimeGenerated 
| project Computer, TimeGenerated, EventDetails=Activity, EventCode=substring(Activity, 0, 4)

extend отслеживает все исходные столбцы в результирующем наборе, а также определяет дополнительные. Следующий запрос использует extend, чтобы добавить столбец EventCode. Эта колонка может не отображаться в конце таблицы, и в этом случае для ее просмотра вам понадобится раскрыть подробности записи.

SecurityEvent
| top 10 by TimeGenerated
| extend EventCode=substring(Activity, 0, 4)

Использование оператора summarize для агрегирования групп строк

С помощью оператора summarize можно определить группы записей в соответствии с одним или несколькими столбцами и применить к ним статистические вычисления. Поэтому с summarize чаще всего применяется функция count, которая возвращает число результатов в каждой группе.

Следующий запрос проверяет все записи в таблице Perf за последний час, группирует их по столбцу ObjectName и подсчитывает количество записей в каждой группе:

Perf
| where TimeGenerated > ago(1h)
| summarize count() by ObjectName

Иногда имеет смысл определить группы по нескольким измерениям. Каждое уникальное сочетание этих значений определяет отдельную группу:

Perf
| where TimeGenerated > ago(1h)
| summarize count() by ObjectName, CounterName

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

Perf
| where TimeGenerated > ago(1h)
| summarize avg(CounterValue) by Computer

К сожалению, результаты этого запроса бессмысленны, так как мы смешали разные счетчики производительности. Чтобы результаты имели смысл, следует рассчитывать среднее значение отдельно для каждого сочетания CounterName и Computer:

Perf
| where TimeGenerated > ago(1h)
| summarize avg(CounterValue) by Computer, CounterName

Суммирование по столбцу времени

Результаты также можно группировать по столбцу времени или другому непрерывному значению. В результате простого суммирования by TimeGenerated будут созданы группы для каждой миллисекунды за определенный период времени, так как речь идет об уникальных значениях.

Чтобы создать группы на основании непрерывных значений, рекомендуется разбить диапазон на управляемые единицы с помощью bin. Следующий запрос анализирует записи Perf с данными об измерении свободной памяти (доступная память в МБ) на указанном компьютере. Он рассчитывает среднее значение каждого периода в 1 час за последние 7 дней:

Perf 
| where TimeGenerated > ago(7d)
| where Computer == "ContosoAzADDS2" 
| where CounterName == "Available MBytes" 
| summarize avg(CounterValue) by bin(TimeGenerated, 1h)

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

Снимок экрана: значения памяти запроса с течением времени.

Дальнейшие действия