Поделиться через


Структура преобразования в Azure Monitor

Преобразования в Azure Monitor позволяют фильтровать или изменять входящие данные перед сохранением в рабочей области Log Analytics. Они реализованы как оператор язык запросов Kusto (KQL) в правиле сбора данных (DCR). В этой статье подробно рассказывается о структуре этого запроса и допустимых ограничениях языка KQL.

Структура преобразования

Оператор KQL применяется по отдельности к каждой записи в источнике данных. Инструкция должна определить формат входящих данных и создать выходные данные в структуре целевой таблицы. Виртуальная таблица с именем source представляет входной поток. source Столбцы таблиц соответствуют определению входного потока данных. Ниже приведен типичный пример преобразования. В этом примере выполняются следующие действия:

  • Фильтрует входящие данные с помощью инструкции where .
  • Добавляет новый столбец с помощью extend оператора.
  • Форматирует выходные данные для сопоставления столбцов целевой таблицы с помощью project оператора.
source  
| where severity == "Critical" 
| extend Properties = parse_json(properties)
| project
    TimeGenerated = todatetime(["time"]),
    Category = category,
    StatusDescription = StatusDescription,
    EventName = name,
    EventId = tostring(Properties.EventId)

Ограничения KQL

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

Преобразования в правиле сбора данных (DCR) позволяют фильтровать или изменять входящие данные перед сохранением в рабочей области Log Analytics. В этой статье описывается, как создавать преобразования в правиле сбора данных, включая сведения и ограничения языка запросов Kusto (KQL), используемого для инструкции преобразования.

Команда синтаксического анализа

Команда синтаксического анализа в преобразовании ограничена 10 столбцами для каждой инструкции по соображениям производительности. Если для преобразования требуется синтаксический анализ более 10 столбцов, разделите его на несколько операторов, как описано в разделе "Разбиение больших команд синтаксического анализа".

Обязательные столбцы

Выходные данные каждого преобразования должны содержать допустимую метку времени в столбце, называемом TimeGenerated типом datetime. Обязательно включите его в окончательный extend или project блок! Создание или обновление DCR без TimeGenerated выходных данных преобразования приводит к ошибке.

Обработка динамических данных

Рассмотрим следующие входные данные с использованием динамических данных:

{
    "TimeGenerated" : "2021-11-07T09:13:06.570354Z",
    "Message": "Houston, we have a problem",
    "AdditionalContext": {
        "Level": 2,
        "DeviceID": "apollo13"
    }
}

Чтобы получить доступ к свойствам в AdditionalContext, определите его как столбец динамического типа в входном потоке:

"columns": [
    {
        "name": "TimeGenerated",
        "type": "datetime"
    },
    {
        "name": "Message",
        "type": "string"
    }, 
    {
        "name": "AdditionalContext",
        "type": "dynamic"
    }
]

Теперь содержимое столбца AdditionalContext можно проанализировать и использовать в преобразовании KQL:

source
| extend parsedAdditionalContext = parse_json(AdditionalContext)
| extend Level = toint (parsedAdditionalContext.Level)
| extend DeviceId = tostring(parsedAdditionalContext.DeviceID)

Динамические литералы

Используйте функцию parse_json для обработки динамических литералы.

Например, следующие запросы имеют одинаковую функциональность.

print d=dynamic({"a":123, "b":"hello", "c":[1,2,3], "d":{}})
print d=parse_json('{"a":123, "b":"hello", "c":[1,2,3], "d":{}}')

Поддерживаемые функции KQL

Поддерживаемые инструкции

Инструкция let

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

Инструкции табличных выражений

Единственными поддерживаемыми источниками данных для инструкции KQL являются следующие:

  • source, представляющий исходные данные. Например:

    source
    | where ActivityId == "383112e4-a7a8-4b94-a701-4266dfc18e41"
    | project PreciseTimeStamp, Message
    
  • print оператор, который всегда создает одну строку. Например:

    print x = 2 + 2, y = 5 | extend z = exp2(x) + exp2(y)
    

Табличные операторы

Скалярные операторы

Числовые операторы

Поддерживаются все числовые операторы.

Арифметические операторы DateTime и TimeSpan

Поддерживаются все арифметические операторы DateTime и TimeSpan.

Строковые операторы

Поддерживаются перечисленные ниже строковые операторы.

  • ==
  • !=
  • =~
  • !~
  • contains
  • !contains
  • contains_cs
  • !contains_cs
  • has
  • !has
  • has_cs
  • !has_cs
  • startswith
  • !startswith
  • startswith_cs
  • !startswith_cs
  • endswith
  • !endswith
  • endswith_cs
  • !endswith_cs
  • matches regex
  • in
  • !in

битовые операторы;

Поддерживаются перечисленные ниже битовые операторы.

  • binary_and()
  • binary_or()
  • binary_xor()
  • binary_not()
  • binary_shift_left()
  • binary_shift_right()

Скалярные функции

Битовые функции

Функции преобразования

Функции DateTime и TimeSpan

Динамические функции и массивы

Математические функции

Условные функции

Строковые функции

Функции типа

Специальные функции

parse_cef_dictionary

Если строка, содержащая сообщение CEF, parse_cef_dictionary анализирует свойство Extension сообщения в динамический объект key/value. Точка с запятой — это зарезервированный символ, который необходимо заменить перед передачей необработанного сообщения в метод, как показано в примере.

| extend cefMessage=iff(cefMessage contains_cs ";", replace(";", " ", cefMessage), cefMessage) 
| extend parsedCefDictionaryMessage =parse_cef_dictionary(cefMessage) 
| extend parsecefDictionaryExtension = parsedCefDictionaryMessage["Extension"]
| project TimeGenerated, cefMessage, parsecefDictionaryExtension

Пример выходных данных функции parse_cef_dictionary.

geo_location

Учитывая, что поддерживается строка, содержащая IP-адрес (IPv4 и IPv6), geo_location функция возвращает приблизительное географическое расположение, включая следующие атрибуты:

  • Страна/регион
  • Область/регион
  • Штат
  • Город
  • Широта
  • Долгота
| extend GeoLocation = geo_location("1.0.0.5")

Снимок экрана: пример выходных данных функции geo_location.

Внимание

Из-за характера службы геолокации IP, используемой этой функцией, она может привести к задержке приема данных при чрезмерном использовании. Соблюдайте осторожность при использовании этой функции более нескольких раз на преобразование.

Заключение идентификаторов в кавычки

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

Следующие шаги