#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
не получается с «Шаблоном для выражения поиска должна быть постоянная строка».