Я реализовал агрегатный API (GA) для анализа временных рядов, чтобы получить агрегатные значения датчика.
Это мой входной сигнал для созданного мной промежуточного API:
{
"PropertyName": "Prop1",
"PropertyValue": "ProVal",
"MeasuredValue": "Signal",
"FromDateTime": "2020-02-13T04:00:00.000Z",
"ToDateTime": "2020-02-13T04:01:00.000Z",
"EnvironmentFqdn": "fqdnvalue.env.timeseries.azure.com",
"BucketSize":"60s"
}
Ответ, как и ожидалось:
[
{
"productTimeSeries": [
{
"deviceId": "SensorId",
"deviceAggregateTimeSeries": [
{
"bucket": "2020-02-13T04:00:00Z",
"avg": 296.0,
"min": 296.0,
"max": 296.0
}
]
}
]
}
]
Однако, если я изменю время от и до даты, а затем обновлю размер корзины:
{
"PropertyName": "Prop1",
"PropertyValue": "ProVal",
"MeasuredValue": "Signal",
"FromDateTime": "2020-02-13T04:00:00.000Z",
"ToDateTime": "2020-02-13T04:01:02.000Z",
"EnvironmentFqdn": "fqdnvalue.env.timeseries.azure.com",
"BucketSize":"62s"
}
Вот мой ответ:
[
{
"productTimeSeries": [
{
"deviceId": "SensorId",
"deviceAggregateTimeSeries": [
{
"bucket": "2020-02-13T03:59:20Z",
"avg": 296.0,
"min": 296.0,
"max": 296.0
},
{
"bucket": "2020-02-13T04:00:22Z",
"avg": 296.0,
"min": 296.0,
"max": 296.0
}
]
}
]
}
]
Теперь, поскольку размер корзины равен разнице во времени между временем от и до даты, я ожидаю только один результат, как в первом случае, но я получаю два результата. Почему это происходит?
Внутренне это вызывает API статистических данных фактических временных рядов с запросом, сформированным следующим образом:
JObject contentInputPayloadAggregates = new JObject(
new JProperty("searchSpan", new JObject(
new JProperty("from", getTelemetry.FromDateTime),
new JProperty("to", getTelemetry.ToDateTime))),
getPredicateSingle(getTelemetry.PropertyName, getTelemetry.PropertyValue),
new JProperty("aggregates", new JArray(new JObject(
new JProperty("dimension", new JObject(
new JProperty("uniqueValues", new JObject(
new JProperty("input", new JObject(
new JProperty("property", getTelemetry.PropertyName),
new JProperty("type", "String")
)),
new JProperty("take", 100)
))
)),
new JProperty("aggregate", new JObject(
new JProperty("dimension", new JObject(
new JProperty("dateHistogram", new JObject(
new JProperty("input", new JObject(
new JProperty("builtInProperty", "$ts")
)),
new JProperty("breaks", new JObject(
new JProperty("size", getTelemetry.BucketSize)
))
))
)),
new JProperty("measures", new JArray(new JObject(
new JProperty("avg", new JObject(
new JProperty("input", new JObject(
new JProperty("property", getTelemetry.MeasuredValue),
new JProperty("type", "Double")
))
))
),
new JObject(
new JProperty("min", new JObject(
new JProperty("input", new JObject(
new JProperty("property", getTelemetry.MeasuredValue),
new JProperty("type", "Double")
))
))
),
new JObject(
new JProperty("max", new JObject(
new JProperty("input", new JObject(
new JProperty("property", getTelemetry.MeasuredValue),
new JProperty("type", "Double")
))
))
)
))
))
)))
);