Запрос Кусто — использование регистра() и диапазона() для группировки результатов

#syntax #azure-data-explorer #kql

Вопрос:

Мне нужно сгруппировать существующие коды ошибок по категориям (например: коды от 101 до 118 принадлежат одной службе, от 201 до 213-другой) и подсчитать количество кодов ошибок по категориям.

Я использовал функцию case, и внутри нее я использовал диапазон для кодов ошибок, и она работает хорошо, за исключением того, что по какой-то причине она показывает код ошибки 004 как часть «Другого» случая. Почему это происходит?

 | extend codeRange = case(Code in (range(001, 004, 1)), "GeneralMessages",
                      Code in (range(101, 118, 1)), "TransactionProcessing",
                      Code in (range(201, 213, 1)), "RulesExecution",
                      Code in (range(301, 335, 1)), "MerchantRefData",
                      Code in (range(401, 403, 1)), "BinProcessing",
                      Code in (range(501, 505, 1)), "ExchangeRateProcessing",
                      Code in (range(601, 603, 1)), "DecisionRouting",
                      Code in (range(701, 709, 1)), "TransactionRegistry",
                      Code in (range(801, 805, 1)), "ClientScore",
                      Code in (range(901, 903, 1)), "PayEngineConfig",
                      Code in (range(1001, 1003, 1)), "SecureService",
                      Code in (range(1101, 1108, 1)), "ProxyAPI", 
                      "Other")
| project ErrorFrom, Message, Code, operation_Id, codeRange
 

Скриншот результата

Ожидаемым результатом является то, что диапазон кода для кода 004 будет установлен как Общие значения, а не как другие.

Ответ №1:

Вы сравниваете его со строкой «004»? Функция диапазона создаст массив чисел со значениями от 1 до 4 (включая 4), поэтому, если вы сравните со строкой «004», она его не найдет.

Попробуйте привести код ошибки к int:

 print range(001, 004, 1)
| mv-expand print_0
| where print_0 == toint("004")
 

Комментарии:

1. Спасибо, я использовал нечто подобное и вырезал «00» из строки с помощью trim_start(), и это сработало.

2. приведение к int, вероятно, будет быстрее