Каков оптимальный способ запроса последнего значения события экземпляра при предварительном просмотре Azure TSI? - PullRequest
0 голосов
/ 27 мая 2020

В настоящее время у меня есть рабочий метод, основанный на выпущенном в настоящее время примере кода https://github.com/Azure-Samples/Azure-Time-Series-Insights/tree/master/csharp-tsi-preview-sample

Используемые типы в следующем методе создаются с помощью AutoRest, как указано в Пример GitHub: https://github.com/Azure/azure-rest-api-specs/tree/master/specification/timeseriesinsights/data-plane

Моя первая попытка следующая:

 public async Task<T> GetLatestEventValue<T>(object[] timeSeriesId, string tsiPropertyName,
     DateTimeRange searchSpan)
 {
     var client = await _tsiClientFactory.GetTimeSeriesInsightsClient();
     var propertyType = GetPropertyType(typeof(T));
     if (propertyType == null) throw new InvalidOperationException($"Unsupported property type (${typeof(T)})");

     string continuationToken = null;
     do
     {
         QueryResultPage queryResponse = await client.Query.ExecuteAsync(
             new QueryRequest(
                 getEvents: new GetEvents(
                     timeSeriesId: timeSeriesId,
                     searchSpan: searchSpan,
                     filter: null,
                     projectedProperties: new List<EventProperty>()
                         {new EventProperty(tsiPropertyName, propertyType)})),
             continuationToken: continuationToken);

         var latestEventIndex = GetLatestEventPropertyIndex(queryResponse.Timestamps);
         var lastValue = queryResponse.Properties
             .FirstOrDefault()
             ?.Values[latestEventIndex];

         if (lastValue != null)
         {
             return (T)lastValue;
         }

         continuationToken = queryResponse.ContinuationToken;
     } while (continuationToken != null);

     return default;
 }

И использование метода (timeSeriesId такое же, как в Microsoft publi c example ):

 var repository = new TsiRepository(_factory);
 object[] timeSeriesId = new object[] { "2da181d7-8346-4cf2-bd94-a17742237429" };
 var today = DateTime.Now;
 var earlierDateTime = today.AddDays(-1);
 var searchSpan = new DateTimeRange(earlierDateTime.ToUniversalTime(), today.ToUniversalTime());
 var result = await repository.GetLatestEventValue<double>(timeSeriesId, "data", searchSpan);

Представленный выше подход вроде бы работает, но не кажется оптимальным. Есть ли более простой способ запросить последнее событие и его значение для данного экземпляра временного ряда? Может быть, чтобы воспользоваться возможностями Time Series Expression (Tsx)?

1 Ответ

1 голос
/ 04 июня 2020

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

public async Task<T> RunAggregateSeriesLastValueAsync<T>(object[] timeSeriesId, DateTimeRange searchSpan)
{
    var interval = searchSpan.To - searchSpan.FromProperty;
    string continuationToken = null;
    object lastValue;
    do
    {
        QueryResultPage queryResponse = await _tsiClient.Query.ExecuteAsync(
          new QueryRequest(
              aggregateSeries: new AggregateSeries(
              timeSeriesId: timeSeriesId,
              searchSpan: searchSpan,
              filter: null,
              interval: interval,
              projectedVariables: new[] { "Last_Numeric" },
              inlineVariables: new Dictionary<string, Variable>()
              {
                  ["Last_Numeric"] = new NumericVariable(
                  value: new Tsx("$event.value"),
                  aggregation: new Tsx("last($value)"))
              })),
          storeType: "WarmStore", // Speeds things up since only warm storage is used
          continuationToken: continuationToken)
        lastValue = queryResponse.Properties
          .FirstOrDefault()
          ?.Values.LastOrDefault(v => v != null)
        continuationToken = queryResponse.ContinuationToken;
    } while (continuationToken != null)
    return (T)lastValue;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...