Как получить доступ к значению шага диапазона в операторе `toscalar ()`, используемом в операторе `range ()` - PullRequest
0 голосов
/ 31 мая 2019

Я использую запрос Kusto для создания временной диаграммы в Azure AppInsights, чтобы визуализировать, когда наш веб-сервис находится в пределах своего SLO (а когда нет), используя один из Google-примеров измерения, если веб-сервис находится в пределах своей ошибкибюджет :

SLI = The proportion of sufficiently fast requests, as measured from the load balancer metrics. “Sufficiently fast” is defined as < 400 ms.
SLO = 90% of requests < 400 ms

Measured as:
count of http_requests with a duration less than or equal to "0.4" seconds
divided by count of all http_requests

Предполагая 10-минутные интервалы проверки в течение 7-дневного окна, вот мой код:

let fastResponseTimeMaxMs = 400.0;
let errorBudgetThresholdForFastResponseTime = 90.0;
//
let startTime = ago(7days);
let endTime = now();
let timeStep = 10m;
//
let timeRange = range InspectionTime from startTime to endTime step timeStep;
timeRange
    | extend RespTimeMax_ms = fastResponseTimeMaxMs
    | extend ActualCount = toscalar
    (
        requests
            | where timestamp > InspectionTime - timeStep
            | where timestamp <= InspectionTime
            | where success == "True"
            | where duration <= fastResponseTimeMaxMs
            | count 
    )
    | extend TotalCount = toscalar
    (
        requests 
            | where timestamp > InspectionTime - timeStep
            | where timestamp <= InspectionTime
            | where success == "True"
            | count
    )
    | extend Percentage = round(todecimal(ActualCount * 100) / todecimal(TotalCount), 2)
    | extend ErrorBudgetMinPercent = errorBudgetThresholdForFastResponseTime
    | extend InBudget = case(Percentage >= ErrorBudgetMinPercent, 1, 0)

Пример вывода запроса того, чего я хочу достичь:

InspectionTime [UTC]     RespTimeMax_ms  ActualCount  TotalCount  Percentage  ErrorBudgetMinPercent  InBudget
2019-05-23T21:53:17.894  400             8,098        8,138       99.51       90                     1  
2019-05-23T22:03:17.894  400             8,197        9,184       89.14       90                     0  
2019-05-23T22:13:17.894  400             8,002        8,555       93.54       90                     1  

Я получаю ошибку:

'where' operator: Failed to resolve scalar expression named 'InspectionTime'

Я пробовал todatetime(InspectionTime), происходит сбой с той же ошибкой.

Замена InspectionTimeс другими объектами типа datetime получает этот код для выполнения ОК, но не со значениями datetime, которые я хочу.Например, использование этого фрагмента выполняется нормально, когда используется в моем примере кода выше:

   | extend ActualCount = toscalar
    (
        requests
            | where timestamp > startTime   // instead of 'InspectionTime - timeStep'
            | where timestamp <= endTime    // instead of 'InspectionTime'
            | where duration <= fastResponseTimeMaxMs
            | count   
    )

Мне кажется, что использование InspectionTime в пределах toscalar(...) является суть этой проблемы, так как явозможность использовать InspectionTime в аналогичных запросах, используя range(...), которые не вкладывают его в toscalar(...).

Примечание : мне не нужен график временной диаграммы request.duration, поскольку это не говорит мне, превышает ли количество запросов выше моего порога (400 мс) наш бюджет ошибок в соответствии с формулой, определенной выше.

1 Ответ

0 голосов
/ 31 мая 2019

Ваш запрос недействителен, так как вы не можете ссылаться на столбец InspectionTime в подзапросе, в котором вы выполняете toscalar().

, если я правильно понимаю вашу логику, следующий запрос может работатьили укажите другое направление (если нет - вы можете поделиться демонстрационным набором входных данных с помощью оператора datatable и указать желаемый результат, который ему соответствует)

let fastResponseTimeMaxMs = 400.0;
let errorBudgetThresholdForFastResponseTime = 90.0;
//
let startTime = ago(7days);
let endTime = now();
let timeStep = 10m;
//
requests
| where timestamp > startTime and timestamp < endTime
| where success == 'True'
| summarize TotalCount = count(), ActualCount = countif(duration <= fastResponseTimeMaxMs) by bin(timestamp, timeStep)
| extend Percentage = round(todecimal(ActualCount * 100) / todecimal(TotalCount), 2)
| extend ErrorBudgetMinPercent = errorBudgetThresholdForFastResponseTime
| extend InBudget = case(Percentage >= ErrorBudgetMinPercent, 1, 0)
...