Разбор JSON-логов Azure AVD с помощью парсера Grok в Datadog
Узнайте правильный шаблон Grok в Datadog для разбора вложенного JSON из логов Azure AVD. Сохраняйте объекты проверки здоровья как отдельные сущности с помощью продвинутых методов разбора и этапов конфигурации.
Как разобрать вложенный JSON из журналов Azure AVD с помощью парсера Grok в Datadog для создания самодостаточных объектов проверки состояния?
Я пытаюсь разобрать данные журнала Azure AVD в Datadog, используя поле @properties.SessionHostHealthCheckResult, которое содержит массив вложенных объектов JSON, представляющих проверки состояния. Каждый объект имеет поля, такие как HealthCheckName, HealthCheckResult, AdditionalFailureDetails (содержащее Message, ErrorCode, LastHealthCheckInUTC), AdditionalDetails и IsProvisioningHealthCheck.
Когда я использую простой шаблон grok, например:
rule %{data::keyvalue(":", "", "")}
На выходе все значения сглаживаются в массивы, а не сохраняются каждая проверка состояния как отдельный объект. Например, вместо получения:
[
{
"HealthCheckName": 0,
"HealthCheckResult": 1,
"AdditionalFailureDetails": {
"Message": "SessionHost healthy: SessionHost healthy: SxS stack listener is ready",
"ErrorCode": 0,
"LastHealthCheckInUTC": "2025-11-07T01:24:35.1223414Z"
},
"IsProvisioningHealthCheck": false
},
...
]
Я получаю:
{
"HealthCheckName": [0, 1, 3, ...],
"HealthCheckResult": [1, 1, 1, ...],
"Message": ["SessionHost healthy: ...", ...],
...
}
Я пробовал более сложный шаблон grok:
HealthCheckName .+{"HealthCheckName":%{integer:health_check.name},"HealthCheckResult":%{integer:health_check.result},"AdditionalFailureDetails":{"Message":"","ErrorCode":%{integer:health_check.error_code},"LastHealthCheckInUTC":"%{date("yyyy-MM-dd'T'HH:mm:ss.SSSSSSS'Z'"):health_check.date}"},"AdditionalDetails":%{data:health_check.additional_data},"IsProvisioningHealthCheck":%{boolean:health_check.is_provisioning_health_check}},.+
Но это также не сработало как ожидалось.
Какой правильный шаблон Grok в Datadog использовать для разбора этой вложенной структуры JSON, чтобы каждая проверка состояния оставалась отдельным, самодостаточным объектом в выходных данных?
Правильный подход к парсингу вложенного JSON из журналов Azure AVD в Datadog требует использования шаблона %{data::json} в конфигурации парсера Grok, в сочетании с расширенными настройками для целевого атрибута, содержащего ваши вложенные объекты проверок работоспособности. Это правильно сохранит каждую проверку как отдельный объект, а не будет сглаживать значения в массивы.
Содержание
- Понимание структуры проверок работоспособности Azure AVD
- Почему текущие подходы не работают
- Правильная конфигурация шаблона Grok
- Расширенные техники парсинга
- Альтернатива: процессор Parse JSON
- Тестирование и валидация
- Лучшие практики для мониторинга Azure AVD
Понимание структуры проверок работоспособности Azure AVD
Журналы Azure Virtual Desktop содержат данные проверок работоспособности в поле @properties.SessionHostHealthCheckResult, которое обычно хранит массив объектов JSON. Каждый объект представляет собой конкретную проверку работоспособности со следующей структурой:
{
"HealthCheckName": 0,
"HealthCheckResult": 1,
"AdditionalFailureDetails": {
"Message": "SessionHost healthy: SessionHost healthy: SxS stack listener is ready",
"ErrorCode": 0,
"LastHealthCheckInUTC": "2025-11-07T01:24:35.1223414Z"
},
"AdditionalDetails": "Some additional details",
"IsProvisioningHealthCheck": false
}
Как показывают результаты исследования, Azure использует KQL-запросы, которые анализируют эти результаты путем преобразования поля в строку и использования parse_json() для извлечения отдельных объектов проверок работоспособности.
Почему текущие подходы не работают
Ваши текущие подходы не работают по следующим причинам:
-
Простой шаблон “Ключ-Значение”: Использование
%{data::keyvalue}рассматривает весь JSON как плоскую структуру “ключ-значение”, что приводит к сбору всех значений с одинаковым ключом в массивы. -
Сложное сопоставление шаблонов: Ваша вторая попытка с детальным сопоставлением полей не работает, потому что шаблоны Grok лучше всего работают с текстовыми шаблонами, а не со структурированным JSON-контентом.
-
Целевое назначение атрибутов: Без правильного указания конкретного поля, содержащего вложенный JSON, парсер пытается анализировать все сообщение журнала, а не конкретный вложенный атрибут.
Согласно документации Datadog, вам необходимо использовать раздел “Расширенные настройки” для анализа конкретных атрибутов вместо атрибута сообщения по умолчанию.
Правильная конфигурация шаблона Grok
Вот правильная конфигурация для анализа объектов проверок работоспособности Azure AVD:
Базовая конфигурация
- Шаблон Grok: Используйте
%{data::json}в качестве шаблона - Расширенные настройки: Настройте парсер для запуска в поле
@properties.SessionHostHealthCheckResultвместо поля сообщения по умолчанию
Пошаговая конфигурация
- Добавьте процессор парсера Grok в конвейер журналов Datadog
- Установите шаблон:
%{data::json} - Расширенные настройки:
- Установите “Исходное поле” в
@properties.SessionHostHealthCheckResult - Это указывает Datadog анализировать только это конкретное поле
- Установите “Исходное поле” в
# Базовый шаблон для парсинга JSON
rule %{data::json}
Эта конфигурация работает, как объясняется в документации BytePlus: “Используя простой шаблон, такой как rule %{data::json}, вы инструктируете Datadog взять содержимое этого поля, расшифровать его и проанализировать как JSON, объединив полученные поля в основное событие журнала.”
Расширенная конфигурация с вспомогательными правилами
Для более сложных сценариев вы можете определить вспомогательные правила:
# Вспомогательные правила для конкретных типов полей
# Определите их в разделе "Вспомогательные правила"
HEALTH_CHECK_NAME %{integer:health_check.name}
HEALTH_CHECK_RESULT %{integer:health_check.result}
ERROR_CODE %{integer:health_check.error_code}
TIMESTAMP %{date("yyyy-MM-dd'T'HH:mm:ss.SSSSSSS'Z'"):health_check.timestamp}
BOOLEAN %{boolean:health_check.is_provisioning}
# Основное правило парсинга
rule %{data::json}
Затем настройте расширенные параметры для целевого поля @properties.SessionHostHealthCheckResult.
Расширенные техники парсинга
Последовательная обработка с несколькими парсерами
Для максимальной гибкости используйте несколько парсеров Grok последовательно:
-
Первый парсер: Извлеките необработанное поле SessionHostHealthCheckResult
Шаблон: %{data::json} Исходное поле: @properties.SessionHostHealthCheckResult -
Второй парсер: Дополнительно обработайте проанализированное содержимое при необходимости
Шаблон: %{GREEDYDATA:parsed_health_checks} Исходное поле: health_check_results
Использование условных правил
Согласно документации Datadog, вы можете определить условные правила для обработки различных форматов журналов:
# Обработка различных структур объектов проверок работоспособности
rule (?m)^%{GREEDYDATA:raw_content}$
# Вспомогательное правило для парсинга JSON
HELPER %{data::json}
# Условная обработка
if "SessionHostHealthCheckResult" in @raw_message {
parse_field(@properties.SessionHostHealthCheckResult, %{data::json}) {
@properties.health_check_objects = parsed_objects
}
}
Альтернатива: процессор Parse JSON
Для этого конкретного случая использования вы можете обнаружить, что процессор Parse JSON более эффективен, чем парсинг Grok:
Из документации Datadog: “Используйте процессор Parse JSON для анализа поля сообщения, чтобы поле сообщения содержало все атрибуты внутри вложенного объекта.”
Конфигурация Parse JSON
- Добавьте процессор Parse JSON в ваш конвейер
- Исходное поле:
@properties.SessionHostHealthCheckResult - Целевое поле:
@properties.parsed_health_checks
Этот подход напрямую анализирует JSON без сопоставления шаблонов, что идеально подходит для структурированных данных, таких как ваши проверки работоспособности Azure AVD.
Комбинированный подход: Grok + Parse JSON
Вы можете объединить оба подхода для оптимальных результатов:
- Первый процессор: Парсер Grok для извлечения поля SessionHostHealthCheckResult
- Второй процессор: Процессор Parse JSON для анализа вложенных объектов проверок работоспособности
- Третий процессор: Опциональное преобразование для реструктуризации данных
Тестирование и валидация
Использование интерфейса тестирования Datadog
Согласно документации Datadog, вы можете протестировать правила парсинга:
“Протестируйте ваши правила: выберите образец, нажав на него, чтобы запустить его оценку по правилу парсинга и отобразить результат внизу экрана. Все образцы показывают статус (соответствие или отсутствие соответствия), что выделяет, если одно из правил парсинга парсера grok соответствует образцу.”
Образец тестового ввода
Используйте этот образец журнала Azure AVD для тестирования:
{
"@properties": {
"SessionHostHealthCheckResult": "[{\"HealthCheckName\":0,\"HealthCheckResult\":1,\"AdditionalFailureDetails\":{\"Message\":\"SessionHost healthy: SessionHost healthy: SxS stack listener is ready\",\"ErrorCode\":0,\"LastHealthCheckInUTC\":\"2025-11-07T01:24:35.1223414Z\"},\"AdditionalDetails\":\"\",\"IsProvisioningHealthCheck\":false},{\"HealthCheckName\":1,\"HealthCheckResult\":1,\"AdditionalFailureDetails\":{\"Message\":\"SessionHost healthy: SessionHost healthy: DomainJoined\",\"ErrorCode\":0,\"LastHealthCheckInUTC\":\"2025-11-07T01:24:35.1223414Z\"},\"AdditionalDetails\":\"\",\"IsProvisioningHealthCheck\":false}]"
}
}
Ожидаемый вывод
При правильной конфигурации вы должны получить:
{
"health_check_objects": [
{
"HealthCheckName": 0,
"HealthCheckResult": 1,
"AdditionalFailureDetails": {
"Message": "SessionHost healthy: SessionHost healthy: SxS stack listener is ready",
"ErrorCode": 0,
"LastHealthCheckInUTC": "2025-11-07T01:24:35.1223414Z"
},
"AdditionalDetails": "",
"IsProvisioningHealthCheck": false
},
{
"HealthCheckName": 1,
"HealthCheckResult": 1,
"AdditionalFailureDetails": {
"Message": "SessionHost healthy: SessionHost healthy: DomainJoined",
"ErrorCode": 0,
"LastHealthCheckInUTC": "2025-11-07T01:24:35.1223414Z"
},
"AdditionalDetails": "",
"IsProvisioningHealthCheck": false
}
]
}
Лучшие практики для мониторинга Azure AVD
-
Используйте Parse JSON для структурированных данных: Для JSON, вложенного в журналы, процессор Parse JSON часто более надежен, чем шаблоны Grok.
-
Воспользуйтесь нативной интеграцией Azure Datadog: Как упоминается в документации Datadog по Azure VM, рассмотрите возможность использования нативной интеграции Azure, которая уже обрабатывает многие специфические для AVD метрики.
-
Создайте выделенные конвейеры: Настройте отдельные конвейеры для различных типов журналов, чтобы обеспечить применение соответствующих правил парсинга.
-
Мониторьте производительность парсинга: Используйте мониторинг конвейера Datadog для отслеживания показателей успешности парсинга и корректировки правил при необходимости.
-
Документируйте ваши правила парсинга: Поддерживайте документацию по вашим шаблонам парсинга и их ожидаемым выводам для командной работы.
-
Используйте вспомогательные правила для повторяющихся шаблонов: Как показывают результаты исследования, вспомогательные правила помогают поддерживать согласованность между несколькими правилами парсинга.
Следуя этим подходам, вы сможете правильно анализировать вложенные JSON-объекты из журналов Azure AVD и создавать самодостаточные объекты проверок работоспособности в Datadog, обеспечивая эффективный мониторинг и оповещение вашей инфраструктуры виртуальных рабочих столов.
Источники
- Конфигурация журналов Datadog - Парсинг
- StackOverflow - Парсинг Grok в Datadog извлечение полей из вложенного JSON
- Процессор парсера Grok в Datadog
- BytePlus - Освоение парсера Grok для JSON-журналов в Datadog 2025
- Anoop C Nair - Проверки работоспособности AVD с использованием портала Azure
- Процессор Parse JSON в Datadog
- Интеграция Azure VM в Datadog
Заключение
- Используйте шаблон
%{data::json}с расширенными настройками, нацеленными на@properties.SessionHostHealthCheckResult - Рассмотрите возможность использования процессора Parse JSON вместо Grok для структурированных JSON-данных
- Тестируйте ваши правила парсинга с использованием образцов данных журналов Azure AVD
- Создавайте вспомогательные правила для последовательного определения типов полей
- Объединяйте несколько процессоров для сложных сценариев парсинга
- Мониторьте производительность парсинга и поддерживайте документацию для ваших правил
- Воспользуйтесь нативной интеграцией Azure в Datadog при ее наличии
Ключевым является указание конкретного поля, содержащего ваш вложенный JSON, и использование соответствующего метода парсинга для структурированных данных, обеспечивая, чтобы каждая проверка оставалась отдельным, самодостаточным объектом в вашем выводе.