Могу ли я создавать пользовательские запросы в операторах Where и Case из динамического массива c в запросе Kusto? - PullRequest
0 голосов
/ 18 марта 2020

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

Я хочу отфильтровать и запросить requests на основе определенных динамических c атрибутов объекта 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

Идеал было бы создать собственный запрос, как показано ниже (и, возможно, даже циклически просматривая динамические c атрибуты массива 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)

или

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. Может ли значение Dynami c использоваться как имя столбца с данными в операторе where (выпуск № 1)?
  2. Можно ли использовать значение Dynami c в качестве правой руки в операторе matches regex (выпуск № 2)?
  3. Может ли создать динамически настраиваемый оператор запроса where, проходящий по массиву динамического c (Q # 3)?
  4. Может ли вычисляемый расширенный столбец быть настраиваемым создан в операторе case (вопрос № 4)?

1 Ответ

1 голос
/ 21 марта 2020

1) Может ли значение Dynami c использоваться в качестве имени столбца с данными в операторе 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) Можно ли использовать значение Dynami c в качестве правой руки в выражении регулярного выражения матчей?

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

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

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

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

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

...