Я использую запрос 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
заставляет этот код выполняться нормально, но не с теми значениями даты и времени, которые мне нужны. Например, использование этого фрагмента кода выполняется нормально при использовании в моем примере кода выше:
| 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 мс) наш бюджет ошибок в соответствии с формулой, определенной выше.
ваш запрос недействителен, так как вы не можете ссылаться на столбец 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)
О да, вы попали - спасибо! Можете ли вы порекомендовать какие-либо источники, из которых я могу получить более глубокое представление о Kusto (более глубокое, чем текущий Справочные документы MS Kusto), чтобы узнать, почему я не могу получить доступ к
InspectionTime
в подзапросе внутриtoscalar()
?