У меня есть экземпляр 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
Основываясь на вопросе, указанном выше, я смог получить эти данные для одного модуля за раз с помощью следующего запроса:
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)
Который производит такие данные, как:
Благодаря этому я могу собрать сообщения из TABLE_ONE, обработка которых займет минуту, так что это будет хорошей целью, например, для исследования производительности.
Я застрял в том, что не знаю, как правильно вычислить эту разницу при удалении фильтра <unique-pod-suffix>. Я больше не могу просто вычислить разницу во времени с предыдущей записью журнала, это должна быть разница с предыдущей записью журнала того же модуля, поскольку все модули входят в один и тот же контейнер/таблицу «ContainerLogV2». Я не знаю, как правильно выполнить эту группировку, а затем снова объединить ее в одну таблицу результатов.
Любая помощь приветствуется, спасибо!
Я предполагаю, что всегда есть пара подов, с которыми можно сравнивать. Поэтому всегда два элемента 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 для повышения производительности.
Пожалуйста.
Спасибо! Похоже, я слишком много думал - порядок по порядку отлично работает для сортировки данных, чтобы вычисление различий работало так, как ожидалось. Очень признателен!