Запрос Kusto на время между записями по группам в одном списке результатов

У меня есть экземпляр Debezium, читающий события CDC из базы данных для нескольких разных таблиц и публикующий эти сообщения в одной и той же теме Центров событий Kafka/Azure. Масштабируемая служба использует эти сообщения и записывает инструкции отладки с отметкой времени и таблицей исходных данных.

Каждый модуль обрабатывает только одно сообщение за раз — они однопоточные. Я хочу знать, сколько времени требуется модулю для обработки каждого типа сообщений в целях оценки производительности. То есть я хочу запросить разницу во времени между каждой записью журнала «Получено», сгруппированной по модулям, в развертывании AKS потребительской службы. С помощью этого ответа я разобрался с этим для отдельных модулей, но мне бы хотелось получить представление обо всех модулях с помощью одного запроса.

Вот пример запроса и результатов Kusto для интересующих меня необработанных журналов:

ContainerLogV2 
| where TimeGenerated > ago(2h)
| where PodName startswith "<common pod prefix>"
| where LogMessage contains "received:" 
| project TimeGenerated, LogMessage, PodName
ВремяСгенерировано ЖурналСообщение Имя пода 21.06.2024, 13:34:27 Получено: {"ID": <целое число>, "__dbz__physicalTableIdentifier": "<псевдоним базы данных>.dbo.TABLE_ONE"} <общий префикс модуля>-<уникальный суффикс модуля A> 21.06.2024, 13:33:27 Получено: {"ID": <целое число>, "__dbz__physicalTableIdentifier": "<псевдоним базы данных>.dbo.TABLE_TWO"} <общий префикс модуля>-<уникальный суффикс модуля B>

Основываясь на вопросе, указанном выше, я смог получить эти данные для одного модуля за раз с помощью следующего запроса:

ContainerLogV2
| where TimeGenerated > ago(2h)
| where PodName startswith "<common pod prefix>"
| where PodName endswith "<unique pod suffix A>"
| where LogMessage contains "received:"
| order by TimeGenerated desc
| extend prev_tg = prev(TimeGenerated)
| parse LogMessage with * "dbo." TABLE_NAME '"}' *
| project TimeGenerated, 
    // LogMessage,
    TABLE_NAME,
    // PodName,
    diff = case(true, abs(prev_tg - TimeGenerated)/1s, double(null))
| where isnotnull(diff)

Который производит такие данные, как:

ВремяСгенерировано ТАБЛИЦА_ИМЯ разница 21.06.2024, 13:34:27 ТАБЛИЦА_ONE 60 21.06.2024, 13:33:27 ТАБЛИЦА_ДВА 1 21.06.2024, 13:33:26 ТАБЛИЦА_ТРИ .2538925

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

Я застрял в том, что не знаю, как правильно вычислить эту разницу при удалении фильтра <unique-pod-suffix>. Я больше не могу просто вычислить разницу во времени с предыдущей записью журнала, это должна быть разница с предыдущей записью журнала того же модуля, поскольку все модули входят в один и тот же контейнер/таблицу «ContainerLogV2». Я не знаю, как правильно выполнить эту группировку, а затем снова объединить ее в одну таблицу результатов.

Любая помощь приветствуется, спасибо!

Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
2
0
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я предполагаю, что всегда есть пара подов, с которыми можно сравнивать. Поэтому всегда два элемента PodA, PodB и так далее.

Тогда ваш запрос мог бы выглядеть так (таблица данных предназначалась только для того, чтобы высмеять ваши реальные данные):

let ContainerLogV2 = datatable(TimeGenerated:datetime, LogMessage:string, PodName:string) [
    datetime('6/24/2024, 1:34:27 PM'), "Received: {\"ID\": <integer>, \"__dbz__physicalTableIdentifier\": \"<database alias>.dbo.TABLE_ONE\"}", "<common pod prefix>-<PodA>",
    datetime('6/24/2024, 1:33:27 PM'), "Received: {\"ID\": <integer>, \"__dbz__physicalTableIdentifier\": \"<database alias>.dbo.TABLE_TWO\"}", "<common pod prefix>-<PodB>",
    datetime('6/24/2024, 1:35:27 PM'), "Received: {\"ID\": <integer>, \"__dbz__physicalTableIdentifier\": \"<database alias>.dbo.TABLE_ONE\"}", "<common pod prefix>-<PodA>",
    datetime('6/24/2024, 1:31:27 PM'), "Received: {\"ID\": <integer>, \"__dbz__physicalTableIdentifier\": \"<database alias>.dbo.TABLE_THREE\"}", "<common pod prefix>-<PodC>",
    datetime('6/24/2024, 2:33:27 PM'), "Received: {\"ID\": <integer>, \"__dbz__physicalTableIdentifier\": \"<database alias>.dbo.TABLE_TWO\"}", "<common pod prefix>-<PodB>",
    datetime('6/24/2024, 3:31:27 PM'), "Received: {\"ID\": <integer>, \"__dbz__physicalTableIdentifier\": \"<database alias>.dbo.TABLE_THREE\"}", "<common pod prefix>-<PodC>",
];
ContainerLogV2
| where TimeGenerated > ago(1d)
| where PodName startswith "<common pod prefix>"
| where LogMessage contains "Received:"
| order by TimeGenerated desc
| extend TABLE_NAME = tostring(split(split(LogMessage, "dbo.")[1], "\"")[0])
| order by PodName desc, TimeGenerated asc
| extend prev_tg = prev(TimeGenerated)
| extend PodEqualsPrePod = PodName == prev(PodName)
| extend Diff = iff(PodEqualsPrePod, abs(prev_tg - TimeGenerated)/1s, double(null))
| where isnotnull(Diff)
| project TimeGenerated, TABLE_NAME, Diff

Вот Скрипка.

Я также улучшил анализ TABLE_NAME для повышения производительности.

Спасибо! Похоже, я слишком много думал - порядок по порядку отлично работает для сортировки данных, чтобы вычисление различий работало так, как ожидалось. Очень признателен!

lettucemode 24.06.2024 19:14

Пожалуйста.

decius 24.06.2024 19:16

Другие вопросы по теме