Можно ли получить результаты запроса с помощью встроенной функции App Insights? - PullRequest
1 голос
/ 08 апреля 2019

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

Моей первой попыткой было использование встроенной функции. Упрощенная версия ниже.

let timeOpened = (timeClosed:datetime)
{
    let result = customEvents
    | where name == 'CircuitBreakerStatusChange'
    | where customDimensions['State'] == 'Open'
    | where timestamp < timeClosed
    | order by timestamp desc
    | take 1
    | project timestamp;
    let scalar = toscalar(result);  
    scalar
};
customEvents
| where timestamp > ago(4h)
| where name == 'CircuitBreakerStatusChange'
| where customDimensions['State'] == 'Closed'
| extend timeOpen = timestamp - timeOpened(timestamp)

Возможно, есть лучший способ сделать это. Если так, то ваши идеи приветствуются! Но в этой конкретной попытке единственная обратная связь, которую я получаю от Azure при запуске, это «Синтаксическая ошибка». Однако я не верю, что здесь есть синтаксическая ошибка, потому что, если я просто изменю возвращаемое значение функции с scalar на now(), она будет выполнена успешно. Также я могу успешно запустить тело функции в изоляции. Есть идеи, что здесь не так?

1 Ответ

1 голос
/ 09 апреля 2019

Я думаю, что вы получаете синтаксическую ошибку, потому что язык запросов не допускает рекурсивных конструкций.Now () работает, потому что он статически (не динамически) извлекается во время запроса.

Я думаю, что вы можете достичь желаемого результата с помощью serialize и prev () операторы:

Table | order by timestamp asc | serialize
| extend previousTime = prev(timestamp,1)
| extend Diff = iff(customDimensions['State'] == 'Closed', timestamp - previousTime, 0)
| where Diff > 0

Примечание. Я не проверял приведенный выше пример, и для его работы может потребоваться дополнительная мысль (например, перед тем, как выполнить previousTime, убедитесь, что предыдущая запись действительно «открыта»).расчет).

...