Кусто (с Azure Application Insights): Как я могу запрашивать результаты на основе значений в результирующем наборе из начального поискового запроса?

#azure-application-insights #azure-data-explorer #kql #kusto-explorer

Вопрос:

У меня есть ситуация, когда с одной сущностью может быть связано несколько идентификаторов, например, ID1 и ID2, и я регистрируюсь в App insights, и иногда записи имеют пользовательские размеры.Значение ID1, иногда у них есть пользовательские размеры.Значение ID2, и иногда у них есть оба значения.

Поэтому, когда я хочу определить, что произошло с сущностью ID1=123, я запускаю начальный запрос, чтобы определить, какое значение другого идентификатора / ID2, а затем выполняю запрос для получения записей, содержащих либо ID1, либо ID2.

Учитывая ID1=»123″, я начинаю с чего-то вроде:

 
    traces 
    | where tostring(customDimensions.ID1) == "123"
    | project
      ID1 = tostring(customDimensions.ID1)
      , ID2 = tostring(customDimensions.ID2)
      , message

 

И результаты выглядят примерно так:

 |ID1|ID2|messsage|
|---|---|--------|
|123||this record doesn't have a second id value|
|123|456|this log record has the other id value that I want to use|
|123||another message|
 

В этих результатах я получаю значение ID2 «456» и использую его в другом запросе:

 
    traces 
    | where tostring(customDimensions.ID1) == "123" or tostring(customDimensions.ID2) == "456" or 
    | project
    ID1 = tostring(customDimensions.ID1)
    , ID2 = tostring(customDimensions.ID2)
    , message

 

И я получаю больше записей:

 |ID1|ID2|messsage|
|---|---|--------|
|123||this log record doesn't have the second id|
|123|456|this log record has other id value that I want to use|
|123||another message|
||456|this record doesn't have ID1, but it has ID2|
||456|again, only has second ID|
 

Я надеюсь, что есть разумный способ сделать это за один шаг / с помощью одного запроса.

Это также не обязательно должно быть идеальным, и я могу сделать некоторые предположения, например, ID1 будет связан только с одним другим значением ID2 (не считая нулевой / пустой строки).

Без соединений, используя мой воображаемый метод ПОЛУЧЕНИЯ ПЕРВОГО ЗНАЧЕНИЯ РЕЗУЛЬТАТА (), я думаю, что решение может выглядеть примерно так:

 
    let myID1 = "123";
    let myID2 = GET-FIRST-VALUE-OF-FIRST-COL-OF-RESULT-SET(
      traces 
      | where * has myID1 
      | where tostring(customDimensions.ID2) != ""
      | project tostring(customDimensions.ID2)
    );
    traces
    | where * has myID1 or * has myID2

 

С соединениями… Я не знаю. Я пытаюсь разобраться с этим,используя запрос, который получает различные значения ID1, ID2, где либо содержит мою строку поиска, а затем у меня есть два подзапроса, которые соединяют трассировки с первым набором результатов на ID1, а затем на ID2, где правая сторона не равна нулю, а затем я объединяю результаты.

Но это кажется очень неловким / плохо пахнет. Я полагаю, что есть более простой способ сделать это. Просто чтобы попытаться подвести итог — я хочу запросить записи, содержащие строку поиска, затем извлечь набор различных значений из набора customDimensions свойств, а затем использовать эти значения для запроса записей, содержащих любое из извлеченных значений из моего первоначального запроса / запросов.

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

Ответ №1:

Вы могли бы сделать что-то вроде этого:

 let myID1 = "123";
let myID2 = toscalar(
traces 
| where tostring(customDimensions.ID1) == myID1
| project ID2 = tostring(customDimensions.ID2)
| where ID2 != ""
| take 1);
traces
| project
    ID1 = tostring(customDimensions.ID1),
    ID2 = tostring(customDimensions.ID2),
    message
| where * has myID1 or ID2 in (myID2)
 

Отлично работает с использованием in: ID2 in (myID2) , но не работает с выражением поиска, потому что KQL ожидает постоянную строку. Поэтому * has myID2 не получается с «Шаблоном для выражения поиска должна быть постоянная строка».