API de Consulta do Azure Time Series Insights Gen1

Cuidado

Esse é um artigo do Gen1.

Este artigo descreve várias APIs de Consulta REST. APIs REST são pontos de extremidade de serviço que dão suporte a conjuntos de operações HTTP (métodos), que permitem consultar ambientes Azure Time Series Insights Gen1.

Importante

Obter API de Ambientes

A API Obter Ambientes retorna a lista de ambientes que o chamador está autorizado a acessar.

  • Ponto de extremidade e operação:

    GET https://api.timeseries.azure.com/environments?api-version=2016-12-12
    
  • Corpo da solicitação de exemplo: não aplicável

  • Corpo da resposta de exemplo:

    {
      "environments": [
        {
          "displayName":"Sensors",
          "environmentFqdn": "00000000-0000-0000-0000-000000000000.env.timeseries.azure.com",
          "environmentId":"00000000-0000-0000-0000-000000000000",
          "resourceId": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/RdxProdAssetsEastUs/providers/Microsoft.TimeSeriesInsights/environments/Sensors",
          "roles": [
            "Reader",
            "Contributor"
          ]
        }
      ]
    }
    

    Observação

    O ambiente da propriedade de respostaFqdn é um nome de domínio exclusivo e totalmente qualificado para o ambiente usado em solicitações de API de Consulta por ambiente.

Obter a API de Disponibilidade de Ambiente

A API Obter Disponibilidade do Ambiente retorna a distribuição da contagem de eventos sobre o carimbo de data /hora do evento $ts. A disponibilidade do ambiente é armazenada em cache e o tempo de resposta não depende do número de eventos em um ambiente.

Dica

A API Obter Disponibilidade do Ambiente pode ser usada para inicializar uma experiência de interface do usuário de front-end.

  • Ponto de extremidade e operação:

    GET https://<environmentFqdn>/availability?api-version=2016-12-12
    
  • Corpo da solicitação de exemplo: não aplicável

  • Corpo da resposta de exemplo:

    {
      "range": {
        "from": "2016-08-01T01:02:03Z",
        "to": "2016-08-31T03:04:05Z"
      },
      "intervalSize": "1h",
      "distribution": {
        "2016-08-01T00:00:00Z": 123,
        "2016-08-31T03:00:00Z": 345
      }
    }
    

    Um objeto vazio é retornado para ambientes sem eventos.

Obter API de Metadados de Ambiente

A API Obter Metadados de Ambiente retorna metadados de ambiente para um determinado intervalo de pesquisa. Os metadados são retornados como um conjunto de referências de propriedade. Azure Time Series Insights Gen1 armazena em cache internamente e aproxima metadados e pode retornar mais propriedades presentes nos eventos exatos no intervalo de pesquisa.

  • Ponto de extremidade e operação:

    POST https://<environmentFqdn>/metadata?api-version=2016-12-12
    
  • Estrutura de conteúdo de entrada:

    • Cláusula de intervalo de pesquisa (obrigatória)
  • Exemplo de corpo de solicitação:

    {
       "searchSpan": {
         "from": {"dateTime":"2016-08-01T00:00:00.000Z"},
         "to": {"dateTime":"2016-08-31T00:00:00.000Z"}
       }
    }
    
  • Corpo da resposta de exemplo:

    {
       "properties": [
         {
           "name": "sensorId",
           "type": "String"
         },
         {
           "name": "sensorValue",
           "type": "Double"
         },
         {
           "name": "iothub-connection-device-id",
           "type": "String"
         }
       ]
    }
    

    Uma matriz vazia properties é retornada quando o ambiente está vazio ou não há eventos em um intervalo de pesquisa.

    As propriedades internas não são retornadas na lista de propriedades.

Obter API de Eventos de Ambiente

A API Obter Eventos de Ambiente retorna uma lista de eventos brutos que correspondem ao intervalo de pesquisa e predicado.

  • Ponto de extremidade e operação:

    POST https://<environmentFqdn>/events?api-version=<apiVersion>
    
  • Estrutura de conteúdo de entrada:

    • Cláusula de intervalo de pesquisa (obrigatória)
    • Cláusula Predicate (opcional)
    • Cláusula Limit (obrigatória)
  • Exemplo de corpo de solicitação:

    {
      "searchSpan": {
        "from": {
          "dateTime": "2019-12-30T00:00:00.000Z"
        },
        "to": {
          "dateTime": "2019-12-31T23:00:00.000Z"
        }
      },
      "predicateString": "PointValue.Double = 3.14",
      "top": {
        "sort": [
          {
            "input": {
              "builtInProperty": "$ts"
            },
              "order": "Asc"
            }
        ],
        "count": 1000
      }
    }
    

    Observação

    • Atualmente, não há suporte para classificação aninhada (ou seja, classificação por duas ou mais propriedades).
    • Os eventos podem ser classificados e limitados à parte superior.
    • Há suporte para classificação em todos os tipos de propriedade. A classificação depende de operadores de comparação definidos para expressões boolianas.
  • Corpo da resposta de exemplo:

    {
      "warnings": [],
      "events": [
        {
          "schema": {
            "rid": 0,
            "$esn" : "buildingsensors",
            "properties" : [{
              "name" : "sensorId",
              "type" : "String"
            }, {
              "name" : "sensorValue",
              "type" : "String"
            }]
          },
          "$ts" : "2016-08-30T23:20:00Z",
          "values" : ["IndoorTemperatureSensor", 72.123]
        }, {
          "schemaRid" : 0,
          "$ts" : "2016-08-30T23:21:00Z",
          "values" : ["IndoorTemperatureSensor", 72.345]
        }
      ]
    }
    

Obter API de Fluxo de Eventos de Ambiente

A API Get Environment Events Streamed retorna uma lista de eventos brutos que correspondem ao intervalo de pesquisa e predicado.

Essa API usa o Protocolo Seguro WebSocket para fazer streaming e retornar resultados parciais. Ele sempre retorna eventos adicionais. Ou seja, a nova mensagem é aditiva à anterior. A nova mensagem contém novos eventos que não estavam na mensagem anterior. A mensagem anterior deve ser mantida quando a nova mensagem é adicionada.

  • Ponto de extremidade e operação:

    GET wss://<environmentFqdn>/events?api-version=<apiVersion>
    
  • Estrutura de conteúdo de entrada:

    • Cláusula de intervalo de pesquisa (obrigatória)
    • Cláusula Predicate (opcional)
    • Cláusula Limit (obrigatória)
  • Exemplo de mensagem de solicitação:

    {
      "headers" : {
        "Authorization":"Bearer <YOUR_AAD_OAUTH_TOKEN>",
        "x-ms-client-request-id" : "132gae-w343-41a1-2342-w23ta4532"
      },
      "content": {
        "searchSpan": {
          "from": "2017-04-30T23:00:00.000Z",
          "to": "2017-05-01T00:00:00.000Z"
        },
        "top": {
          "sort": [
            {
              "input": {
                "builtInProperty": "$ts"
              },
              "order": "Asc"
            }
          ],
          "count": 1000
        }
      }
    }
    

    Observação

    • Atualmente, não há suporte para classificação aninhada (ou seja, classificação por duas ou mais propriedades).
    • Os eventos podem ser classificados e limitados à parte superior.
    • Há suporte para classificação em todos os tipos de propriedade. A classificação depende de operadores de comparação definidos para expressões boolianas.
  • Mensagem de resposta de exemplo:

    {
      "headers": {
        "x-ms-request-id": "a325-a345-sy43-w332-a4qat36a2262"
      },
      "content": {
        "events": [
          {
            "schema": {
              "rid": 0,
              "$esn": "devicedata",
              "properties": [
                {
                  "name": "Id",
                  "type": "String"
                },
                {
                  "name": "TemperatureControlLevel",
                  "type": "Double"
                },
                {
                  "name": "Type",
                  "type": "String"
                },
                {
                  "name": "UnitVersion",
                  "type": "String"
                },
                {
                  "name": "Station",
                  "type": "String"
                },
                {
                  "name": "ProductionLine",
                  "type": "String"
                },
                {
                  "name": "Factory",
                  "type": "String"
                },
                {
                  "name": "Timestamp",
                  "type": "DateTime"
                }
              ]
            },
            "$ts": "2017-04-30T23:00:00Z",
            "values": [
              "82faa3c1-f11d-44f5-a1ca-e448f6123eee",
              0.9835468282931982,
              "temp control rate",
              "1.1.7.0",
              "Station5",
              "Line1",
              "Factory2",
              "2017-04-30T23:00:00Z"
            ]
          },
          {
            "schemaRid": 0,
            "$ts": "2017-04-30T23:00:00Z",
            "values": [
              "acb2f926-62cc-4a88-9246-94a26ebcaee3",
              0.8542095381579537,
              "temp control rate",
              "1.1.7.0",
              "Station2",
              "Line1",
              "Factory3",
              "2017-04-30T23:00:00Z"
            ]
          }
        ]
      },
      "warnings": [],
      "percentCompleted": 100
    }
    

Obter API de Agregados de Ambiente

A API Obter Agregações de Ambiente agrupa eventos por uma propriedade especificada, pois, opcionalmente, mede os valores de outras propriedades.

Observação

Os limites de bucket dão suporte a valores 10ⁿ, 2×10ⁿ ou 5×10ⁿ para se alinhar e dar melhor suporte a histogramas numéricos.

  • Ponto de extremidade e operação:

    POST https://<environmentFqdn>/aggregates?api-version=<apiVersion>
    
  • Estrutura de conteúdo de entrada:

    • Cláusula de intervalo de pesquisa (obrigatória)
    • Cláusula Predicate (opcional)
    • Cláusula Aggregates (obrigatória)
  • Exemplo de corpo de solicitação:

    {
     "searchSpan": {
       "from": {
         "dateTime": "2019-12-30T00:00:00.000Z"
       },
       "to": {
         "dateTime": "2019-12-31T23:00:00.000Z"
       }
     },
     "predicateString": "PointValue.Double > 1000",
     "aggregates": [
       {
         "dimension": {
           "uniqueValues": {
             "input": {
               "property": "iothub-connection-device-id",
               "type": "String"
             },
             "take": 100
           }
         },
         "aggregate": {
           "dimension": {
             "dateHistogram": {
               "input": {
                 "builtInProperty": "$ts"
               },
               "breaks": {
                 "size": "1h"
               }
             }
           },
           "measures": [
             {
               "min": {
                 "input": {
                   "property": "series.flowRate",
                   "type": "Double"
                 }
               }
             },
             {
               "count": {}
             }
           ]
         }
       }
     ]
    }
    
  • Corpo da resposta de exemplo:

    {
      "aggregates": [
        {
          "dimension": [
            "Test-Device-A11342"
          ],
          "aggregate": {
            "dimension": [
              "2019-12-30T23:00:00Z",
              "2019-12-31T00:00:00Z"
            ],
            "measures": [
              [
                [
                  0.319668575730514,
                  2678
                ],
                [
                  0.08442680357734211,
                  1238
                ]
              ]
            ]
          }
        }
      ],
      "warnings": []
    }
    

    Se nenhuma expressão de medida for especificada e a lista de eventos estiver vazia, a resposta estará vazia.

    Se as medidas estiverem presentes, a resposta conterá um único registro com um null valor de dimensão, um 0 valor para contagem e um null valor para outros tipos de medidas.

Obter API Transmitida de Agregações de Ambiente

A API Get Environment Aggregates Streamed agrupa eventos por uma propriedade especificada, pois, opcionalmente, mede os valores de outras propriedades:

  • Essa API usa o Protocolo Seguro WebSocket para streaming e para retornar resultados parciais.
  • Ele sempre retorna uma substituição (instantâneo) de todos os valores.
  • Os pacotes anteriores podem ser descartados pelo cliente.

Observação

Os limites de bucket dão suporte a valores 10ⁿ, 2×10ⁿ ou 5×10ⁿ para se alinhar e dar melhor suporte a histogramas numéricos.

  • Ponto de extremidade e operação:

    GET wss://<environmentFqdn>/aggregates?api-version=<apiVersion>
    
  • Estrutura de conteúdo de entrada:

    • Cláusula de intervalo de pesquisa (obrigatória)
    • Cláusula Predicate (opcional)
    • Cláusula Aggregates (obrigatória)
  • Exemplo de mensagem de solicitação:

    {
      "headers":{  
        "Authorization":"Bearer <YOUR_AAD_OAUTH_TOKEN>"
      },
      "content":{  
        "predicate":{  
          "predicateString":""
        },
        "searchSpan":{  
          "from":"2017-04-30T23:00:00.000Z",
          "to":"2017-05-01T00:00:00.000Z"
        },
        "aggregates":[{  
          "dimension":{  
            "dateHistogram":{  
              "input":{  
                "builtInProperty":"$ts"
              },
              "breaks":{  
                "size":"1m"
              }
            }
          },
          "measures":[{  
            "count":{}
          }]
        }]
      }
    }
    
  • Mensagens de resposta de exemplo:

    {  
      "headers":{  
        "x-ms-request-id":"abc3243-23af-23ad-3224s-a32525age"
      },
      "content":[  
        {  
          "dimension":[  
            "2017-04-30T23:00:00Z",
            "2017-04-30T23:01:00Z",
            "2017-04-30T23:02:00Z",
            "2017-04-30T23:03:00Z",
            "2017-04-30T23:04:00Z"
          ],
          "measures":[  
            [ 722 ],
            [ 721 ],
            [ 722 ],
            [ 721 ],
            [ 722 ]
          ]
        }
      ],
      "warnings":[ ],
      "percentCompleted":100
    }
    

    Se nenhuma expressão de medida for especificada e a lista de eventos estiver vazia, a resposta estará vazia.

    Se as medidas estiverem presentes, a resposta conterá um único registro com um null valor de dimensão, um 0 valor para contagem e um null valor para outros tipos de medidas.

limites

Os seguintes limites são aplicados durante a execução da consulta para utilizar recursos de forma justa entre vários ambientes e usuários:

APIs aplicáveis Nome do limite Valor limite SKUs afetadas Observações
Tudo Tamanho máximo da solicitação 32 KB S1, S2
Obter disponibilidade de ambiente, obter metadados de ambiente, obter eventos de ambiente, obter agregações de ambiente transmitidas Número máximo de solicitações simultâneas por ambiente 10 S1, S2
Obter eventos de ambiente, obter agregações de ambiente transmitidas Tamanho máximo da resposta 16 MB S1, S2
Obter eventos de ambiente, obter agregações de ambiente transmitidas Número máximo de referências de propriedade exclusivas no predicado, incluindo expressões de cadeia de caracteres de predicado 50 S1, S2
Obter eventos de ambiente, obter agregações de ambiente transmitidas Máximo de termos de pesquisa de texto completo sem referência de propriedade na cadeia de caracteres de predicado 2 S1, S2 Exemplo: HAS 'abc', 'abc'
Obter eventos de ambiente Número máximo de eventos em resposta 10.000 S1, S2
Obter agregações de ambiente transmitidas Número máximo de dimensões 5 S1, S2
Obter agregações de ambiente transmitidas Cardinalidade total máxima em todas as dimensões 150.000 S1, S2
Obter agregações de ambiente transmitidas Número máximo de medidas 20 S1, S2

Tratamento e resolução de erros

Comportamento de Propriedade Não Encontrada

Para propriedades referenciadas na consulta, como parte de predicados ou parte de agregações (medidas), por padrão, a consulta tenta resolve a propriedade no intervalo de pesquisa global do ambiente. Se a propriedade for encontrada, a consulta terá êxito. Se a propriedade não for encontrada, a consulta falhará.

No entanto, você pode modificar esse comportamento para tratar as propriedades como existentes, mas com null valores se elas não estiverem presentes no ambiente. Faça isso definindo o cabeçalho x-ms-property-not-found-behavior de solicitação opcional com o valor UseNull.

Os valores possíveis para o cabeçalho de solicitação são UseNull ou ThrowError (padrão). Quando você definir UseNull como o valor, a consulta terá êxito mesmo que as propriedades não existam e a resposta conterá avisos que exibem as propriedades que não foram encontradas.

Relatar propriedades não resolvidas

Você pode especificar referências de propriedade para predicado, dimensão e expressões de medida. Se uma propriedade com um nome e um tipo específicos não existir para um intervalo de pesquisa especificado, será feita uma tentativa de resolve uma propriedade em um período de tempo global.

Dependendo do sucesso da resolução, o seguinte aviso ou erro pode ser emitido:

  • Se houver uma propriedade no ambiente em um período de tempo global, ela será resolvida adequadamente e um aviso será emitido para notificá-lo de que o valor dessa propriedade é null para um determinado intervalo de pesquisa.
  • Se uma propriedade não existir no ambiente, um erro será emitido e a execução da consulta falhará.

Respostas de erro

Se a execução da consulta falhar, o conteúdo da resposta JSON conterá uma resposta de erro com a seguinte estrutura:

{
  "error" : {
    "code" : "...",
    "message" : "...",
    "innerError" : {  
      "code" : "...",
      "message" : "...",
    }
  }
}

Aqui, innerError é opcional. Além de erros básicos, como uma solicitação malformada, os seguintes erros são retornados:

Código de status HTTP Código do erro Exemplo de mensagem de erro Possíveis códigos de erro interno
400 InvalidApiVersion "Não há suporte para a versão da API '2016'. As versões com suporte são '2016-12-12'."
400 InvalidInput "Não é possível analisar a cadeia de caracteres de predicado." PredicateStringParseError
400 InvalidInput "Não é possível traduzir a cadeia de caracteres de predicado." InvalidTypes, LimitExceeded, MissingOperand, InvalidPropertyType, InvalidLiteral, PropertyNotFound
400 InvalidInput "Não há suporte para várias agregações."
400 InvalidInput "Propriedade predicado não encontrada." PropertyNotFound
400 InvalidInput "Propriedade measure não encontrada." PropertyNotFound
400 InvalidInput "Propriedade dimension não encontrada." PropertyNotFound
400 InvalidInput "O número de medidas excedeu o limite." NumberOfMeasuresExceededLimit
400 InvalidInput "Profundidade de agregação excedeu o limite." AggregateDepthExceededLimit
400 InvalidInput "A cardinalidade total excedeu o limite." TotalCardinalityExceededLimit
400 InvalidInput "A propriedade 'from' está ausente." BreaksPropertyMissing
400 InvalidInput "A propriedade 'to' está ausente." BreaksPropertyMissing
400 InvalidInput "O tamanho da solicitação excedeu o limite." RequestSizeExceededLimit
400 InvalidInput "O tamanho da resposta excedeu o limite." ResponseSizeExceededLimit
400 InvalidInput "A contagem de eventos excedeu o limite." EventCountExceededLimit
400 InvalidInput "A contagem de referência de propriedade excedeu o limite." PropertyReferenceCountExceededLimit
400 InvalidMethod "Somente solicitações WebSocket são permitidas no caminho 'aggregates'."
400 InvalidUrl "A URL de solicitação '/a/b' não pôde ser analisada."
408 RequestTimeout "A solicitação atingiu o tempo limite após '30' segundo(s)."
503 TooManyRequests "Contagem de solicitações simultâneas de '10' excedida para o ambiente '95880732-01b9-44ea-8d2d-4d764dfe1904'." EnvRequestLimitExceeded

Warnings

Uma resposta da API de Consulta pode conter uma lista de avisos como "warnings" entrada na raiz da resposta HTTP ou da mensagem de resposta WebSocket. Atualmente, os avisos são gerados se a propriedade não for encontrada para um determinado período de pesquisa, mas for encontrada em um ambiente para intervalo de tempo global. Ele também é gerado quando o cabeçalho x-ms-property-not-found-behavior é definido UseNull como e uma propriedade referenciada não existe mesmo no intervalo de pesquisa global.

Cada objeto de aviso pode conter os seguintes campos:

Nome do campo Tipo de campo Observações
code Cadeia de caracteres Um dos códigos de aviso predefinidos
message Cadeia de caracteres Uma mensagem de aviso detalhada
destino Cadeia de caracteres Um caminho JSON separado por ponto para a entrada de conteúdo de entrada JSON causando o aviso
warningDetails Dicionário Opcional; detalhes de aviso adicionais (por exemplo, a posição na cadeia de caracteres de predicado)

O código a seguir apresenta exemplos de avisos para predicado, cadeia de caracteres de predicado dentro de predicado, dimensão e medida:

"warnings": [
  {
    "code": "PropertyNotFound",
    "message": "Predicate property 'X' of type 'String' is not found in local search span.",
    "target": "predicate.and[0].eq.left.property.name"
  },
  {
    "code": "PropertyNotFound",
    "message": "Predicate string property 'X' is not found in local search span.",
    "target": "predicate.and[1].predicateString",
    "warningDetails": {
      "startPos": 1,
      "endPos": 2,
      "line": 1,
      "col": 1
    }
  },
  {
    "code": "PropertyNotFound",
    "message": "Dimension property 'X' of type 'String' is not found in local search span.",
    "target": "aggregates.dimension.uniqueValues.input.property"
  },
  {
    "code": "PropertyNotFound",
    "message": "Measure property 'X' of type 'String' is not found in local search span.",
    "target": "aggregates.aggregates.measures[0].min.input.property"
  }
]

Confira também

Para obter mais informações sobre o registro de aplicativos e o modelo de programação do Azure Active Directory, consulte Azure Active Directory para desenvolvedores.

Para saber mais sobre os parâmetros de solicitação e autenticação, consulte Autenticação e autorização.

As ferramentas que ajudam a testar solicitações e respostas HTTP incluem:

  • Fiddler. Esse proxy de depuração da Web gratuito pode interceptar suas solicitações REST, para que você possa diagnosticar as mensagens de solicitação e resposta HTTP.
  • JWT.io. Você pode usar essa ferramenta para despejar rapidamente as declarações em seu token de portador e, em seguida, validar seu conteúdo.
  • O Postman. Essa é uma ferramenta gratuita de teste de resposta e solicitação HTTP para depuração de APIs REST.

Saiba mais sobre Azure Time Series Insights Gen1 examinando a documentação do Gen1.