Могу ли я создавать собственные запросы в операторах Where и Case из динамического массива в Kusto Query?

У меня есть requests datatable с url, name, timestamp столбцами, к которым я добавляю еще один вычисляемый столбец operationType.

Я хочу фильтровать и запрашивать requests на основе определенных атрибутов динамического объекта data, чтобы получить операции и их количество использования, например:

operationType    | Counts
-------------------------
1.1 Operation A  | 2400
-------------------------
1.2 Operation B  | 1500

Что у меня есть:

let daysAgo = 100d;
let data = dynamic([
{
    'searchKey': 'url',
    'searchOperator': 'contains',
    'searchValue': 'AjaxContent?option=something',
    'operationName': '1.1 Operation A'
},
{
    'searchKey': 'name',
    'searchOperator': 'matches regex',
    'searchValue': 'POST /api/repo/\\d+/filters',
    'operationName': '1.2 Operation B'
}]);

let req = requests
| where (timestamp >= ago(daysAgo))
| where 

//Issue #1: I want data[0].searchKey to be used as the requests column name
data[0].searchKey contains data[0].searchValue 
//url contains data[0].searchValue //works

//Issue #2: 'doesn't work, error 'matches regex' operator requires string arguments
or name matches data[1].searchValue
//or name matches regex 'POST /api/repo/\\d+/filters' //works

| extend operationType= 
            case(name == data[2].searchValue, data[2].operationName,
                    url contains data[0].searchValue, data[0].operationName
                    'Other - please check'  ) 
| order by timestamp desc;

req | summarize Counts = count() by operationType

Идеальным было бы создать собственный запрос, как показано ниже (и, возможно, даже перебирать атрибуты динамического массива data) (Q # 3):

requests | where data[0].searchKey data[0].searchOperator data[0].searchValue

В том же контексте идеальным было бы расширить вычисляемый столбец operationType, чтобы он был каким-то образом создан специально (Q # 4):

requests
| where
...
| extend operationType= case(url contains data[0].searchValue, data[0].operationName,
                             name matches regex data[0].searchValue, data[0].operationName)

or

requests
| where
...
| extend operationType= case(data[0].searchKey data[0].searchOperator data[0].searchValue, data[0].operationName,
                             data[1].searchKey data[1].searchOperator data[0].searchValue, data[0].operationName)
  1. Можно ли использовать динамическое значение в качестве имени столбца данных в операторе where (проблема №1)?
  2. Можно ли использовать динамическое значение в качестве правой стороны в операторе matches regex (проблема №2)?
  3. Можно ли создать динамически настраиваемый запрос where, проходящий через динамический массив (Q # 3)?
  4. Можно ли создать вычисляемый расширенный столбец с помощью оператора case (Q # 4)?

person Florin Vîrdol    schedule 18.03.2020    source источник


Ответы (1)


1) Можно ли использовать динамическое значение в качестве имени столбца данных в операторе where?

да. Пожалуйста, проверьте: https://docs.microsoft.com/en-us/azure/kusto/query/columnifexists
Пример, показывающий column_ifexists () и "соответствует регулярному выражению"

datatable (a:string, b:string)
['1', '2']
| where column_ifexists('a', '') matches regex '1'

2) Может ли динамическое значение использоваться как правая рука в выражении регулярного выражения совпадений?

В некоторой степени. Как правило, поддерживаются только постоянные значения, поэтому вы не можете использовать контекст строки (где регулярное выражение будет отличаться для каждой строки). Однако вы можете использовать toscalar () для вычисления постоянных регулярных выражений в качестве подзапроса и использовать их в качестве аргумента для «соответствует регулярному выражению». https://docs.microsoft.com/en-us/azure/kusto/query/toscalarfunction

3) Можно ли создать динамически настраиваемый запрос where, выполняя цикл через динамический массив?

Нет. Динамические запросы KQL в данный момент не поддерживаются.

4) Можно ли создать вычисляемый расширенный столбец в операторе case?

Да, если вы используете методы, описанные в ответах №1 и №2, и не сталкиваетесь с ограничениями №3.

person Alexander Sloutsky    schedule 20.03.2020
comment
Спасибо, @ Александр Слуцкий! Как я могу интегрировать ваши идеи и фильтровать requests на основе datatable определенных значений строк? Что-то вроде: requests | where dataTableVar[0].searchKey dataTableVar[0].searchOperator dataTableVar[0].searchValue - person Florin Vîrdol; 11.04.2020
comment
Думаю, самое близкое, что вы можете сделать, это: let dataTableVar = dynamic ([{searchOperator: contains, searchValue: value1_1}]); let predicate = (T: (*), col: string, op: string, value: string) {let regex = case (op == 'contains', value, op == 'has', strcat (@ '\ b', значение, @ '\ b'), op == 'равно', strcat (@ '^', значение, '$'), '_todo'); Т | где column_ifexists (col, '') соответствует регулярному выражению toscalar (_regex)}; datatable (Col1: строка, Col2: строка) ['значение1_1', 'значение_2_1'] | вызвать предикат (col = 'Col1', tostring (dataTableVar [0] .searchOperator), tostring (dataTableVar [0] .searchValue)) - person Alexander Sloutsky; 11.04.2020