Partager via


API de requête Azure Time Series Insights Gen1

Attention

Il s’agit d’un article Gen1.

Cet article décrit différentes API de requête REST. Les API REST sont des points de terminaison de service qui prennent en charge des ensembles d’opérations HTTP (méthodes), qui vous permettent d’interroger Azure Time Series Insights environnements Gen1.

Important

API Obtenir des environnements

L’API Get Environments retourne la liste des environnements auxquels l’appelant est autorisé à accéder.

  • Point de terminaison et opération :

    GET https://api.timeseries.azure.com/environments?api-version=2016-12-12
    
  • Exemple de corps de demande : Non applicable

  • Exemple de corps de réponse :

    {
      "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"
          ]
        }
      ]
    }
    

    Notes

    L’environnement de propriété de réponseFqdn est un nom de domaine complet unique pour l’environnement utilisé dans les demandes d’API de requête par environnement.

API Get Environment Availability

L’API Get Environment Availability retourne la distribution du nombre d’événements sur l’horodatage d’événement $ts. La disponibilité de l’environnement est mise en cache et le temps de réponse ne dépend pas du nombre d’événements dans un environnement.

Conseil

L’API Get Environment Availability peut être utilisée pour initialiser une expérience d’interface utilisateur front-end.

  • Point de terminaison et opération :

    GET https://<environmentFqdn>/availability?api-version=2016-12-12
    
  • Exemple de corps de demande : Non applicable

  • Exemple de corps de réponse :

    {
      "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
      }
    }
    

    Un objet vide est retourné pour les environnements sans événement.

Obtenir l’API de métadonnées d’environnement

L’API Get Environment Metadata retourne les métadonnées d’environnement pour une étendue de recherche donnée. Les métadonnées sont retournées sous la forme d’un ensemble de références de propriété. Azure Time Series Insights Gen1 met en cache et approximativement les métadonnées en interne, et peut retourner d’autres propriétés présentes dans les événements exacts de l’étendue de recherche.

  • Point de terminaison et opération :

    POST https://<environmentFqdn>/metadata?api-version=2016-12-12
    
  • Structure de charge utile d’entrée :

    • Clause d’étendue de recherche (obligatoire)
  • Exemple de corps de requête :

    {
       "searchSpan": {
         "from": {"dateTime":"2016-08-01T00:00:00.000Z"},
         "to": {"dateTime":"2016-08-31T00:00:00.000Z"}
       }
    }
    
  • Exemple de corps de réponse :

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

    Un tableau vide properties est retourné lorsque l’environnement est vide ou qu’il n’y a aucun événement dans une étendue de recherche.

    Les propriétés intégrées ne sont pas retournées dans la liste des propriétés.

Get Environment Events API

L’API Get Environment Events retourne une liste d’événements bruts qui correspondent à l’étendue de recherche et au prédicat.

  • Point de terminaison et opération :

    POST https://<environmentFqdn>/events?api-version=<apiVersion>
    
  • Structure de charge utile d’entrée :

    • Clause d’étendue de recherche (obligatoire)
    • Clause de prédicat (facultatif)
    • Clause limit (obligatoire)
  • Exemple de corps de requête :

    {
      "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
      }
    }
    

    Notes

    • Le tri imbriqué (c’est-à-dire le tri par deux propriétés ou plus) n’est actuellement pas pris en charge.
    • Les événements peuvent être triés et limités au sommet.
    • Le tri est pris en charge sur tous les types de propriétés. Le tri s’appuie sur des opérateurs de comparaison définis pour les expressions booléennes.
  • Exemple de corps de réponse :

    {
      "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]
        }
      ]
    }
    

API Get Environment Events Streamed

L’API Get Environment Events Streamed retourne une liste d’événements bruts qui correspondent à l’étendue de recherche et au prédicat.

Cette API utilise le protocole sécurisé WebSocket pour effectuer la diffusion en continu et retourner des résultats partiels. Il retourne toujours des événements supplémentaires. Autrement dit, le nouveau message est additif au précédent. Le nouveau message contient de nouveaux événements qui ne se trouvaient pas dans le message précédent. Le message précédent doit être conservé lorsque le nouveau message est ajouté.

  • Point de terminaison et opération :

    GET wss://<environmentFqdn>/events?api-version=<apiVersion>
    
  • Structure de charge utile d’entrée :

    • Clause d’étendue de recherche (obligatoire)
    • Clause de prédicat (facultatif)
    • Clause limit (obligatoire)
  • Exemple de message de demande :

    {
      "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
        }
      }
    }
    

    Notes

    • Le tri imbriqué (c’est-à-dire le tri par deux propriétés ou plus) n’est actuellement pas pris en charge.
    • Les événements peuvent être triés et limités au sommet.
    • Le tri est pris en charge sur tous les types de propriétés. Le tri s’appuie sur des opérateurs de comparaison définis pour les expressions booléennes.
  • Exemple de message de réponse :

    {
      "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
    }
    

API Get Environment Aggregates

L’API Get Environment Aggregates regroupe les événements d’une propriété spécifiée, car elle mesure éventuellement les valeurs d’autres propriétés.

Notes

Les limites de compartiment prennent en charge les valeurs 10ⁿ, 2×10ⁿ ou 5×10ⁿ pour s’aligner sur et mieux prendre en charge les histogrammes numériques.

  • Point de terminaison et opération :

    POST https://<environmentFqdn>/aggregates?api-version=<apiVersion>
    
  • Structure de charge utile d’entrée :

    • Clause d’étendue de recherche (obligatoire)
    • Clause de prédicat (facultatif)
    • Clause Agrégats (obligatoire)
  • Exemple de corps de requête :

    {
     "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": {}
             }
           ]
         }
       }
     ]
    }
    
  • Exemple de corps de réponse :

    {
      "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": []
    }
    

    Si aucune expression de mesure n’est spécifiée et que la liste des événements est vide, la réponse est vide.

    Si des mesures sont présentes, la réponse contient un enregistrement unique avec une null valeur de dimension, une 0 valeur pour le nombre et une null valeur pour d’autres types de mesures.

API Get Environment Aggregates Streamed

L’API Get Environment Aggregates Streamed regroupe les événements par une propriété spécifiée, car elle mesure éventuellement les valeurs d’autres propriétés :

  • Cette API utilise le protocole sécurisé WebSocket pour la diffusion en continu et pour retourner des résultats partiels.
  • Il retourne toujours un remplacement (instantané) de toutes les valeurs.
  • Les paquets précédents peuvent être ignorés par le client.

Notes

Les limites de compartiment prennent en charge les valeurs 10ⁿ, 2×10ⁿ ou 5×10ⁿ pour s’aligner sur et mieux prendre en charge les histogrammes numériques.

  • Point de terminaison et opération :

    GET wss://<environmentFqdn>/aggregates?api-version=<apiVersion>
    
  • Structure de charge utile d’entrée :

    • Clause d’étendue de recherche (obligatoire)
    • Clause de prédicat (facultatif)
    • Clause Agrégats (obligatoire)
  • Exemple de message de demande :

    {
      "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":{}
          }]
        }]
      }
    }
    
  • Exemples de messages de réponse :

    {  
      "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
    }
    

    Si aucune expression de mesure n’est spécifiée et que la liste des événements est vide, la réponse est vide.

    Si des mesures sont présentes, la réponse contient un enregistrement unique avec une null valeur de dimension, une 0 valeur pour le nombre et une null valeur pour d’autres types de mesures.

limites

Les limites suivantes sont appliquées lors de l’exécution de la requête pour utiliser équitablement les ressources entre plusieurs environnements et utilisateurs :

API applicables Nom de la limite Valeur de limite Références SKU affectées Notes
Tous Taille maximale de la requête 32 Ko S1, S2
Obtenir la disponibilité de l’environnement, obtenir des métadonnées d’environnement, obtenir des événements d’environnement, obtenir des agrégats d’environnement en continu Nombre maximal de demandes simultanées par environnement 10 S1, S2
Obtenir des événements d’environnement, obtenir des agrégats d’environnement en streaming Taille maximale de la réponse 16 Mo S1, S2
Obtenir des événements d’environnement, obtenir des agrégats d’environnement en streaming Nombre maximal de références de propriétés uniques dans le prédicat, y compris les expressions de chaîne de prédicat 50 S1, S2
Obtenir des événements d’environnement, obtenir des agrégats d’environnement en streaming Nombre maximal de termes de recherche en texte intégral sans référence de propriété dans la chaîne de prédicat 2 S1, S2 Exemple : HAS 'abc', 'abc'
Obtenir les événements d’environnement Nombre maximal d’événements en réponse 10 000 S1, S2
Obtenir les agrégats d’environnement en continu Nombre maximal de dimensions 5 S1, S2
Obtenir les agrégats d’environnement en continu Cardinalité totale maximale sur toutes les dimensions 150 000 S1, S2
Obtenir les agrégats d’environnement en continu Nombre maximal de mesures 20 S1, S2

Gestion et résolution des erreurs

Comportement de propriété introuvable

Pour les propriétés référencées dans la requête, soit dans le cadre de prédicats, soit dans le cadre d’agrégats (mesures), par défaut, la requête tente de résoudre la propriété dans l’étendue recherche globale de l’environnement. Si la propriété est trouvée, la requête réussit. Si la propriété est introuvable, la requête échoue.

Toutefois, vous pouvez modifier ce comportement pour traiter les propriétés comme existantes, mais avec null des valeurs si elles ne sont pas présentes dans l’environnement. Pour ce faire, définissez l’en-tête x-ms-property-not-found-behavior de demande facultatif avec la valeur UseNull.

Les valeurs possibles pour l’en-tête de requête sont UseNull ou ThrowError (valeur par défaut). Lorsque vous définissez UseNull comme valeur, la requête réussit même si les propriétés n’existent pas, et la réponse contient des avertissements qui affichent les propriétés introuvables.

Signaler les propriétés non résolues

Vous pouvez spécifier des références de propriété pour les expressions de prédicat, de dimension et de mesure. Si une propriété avec un nom et un type spécifiques n’existe pas pour une étendue de recherche spécifiée, une tentative est effectuée pour résoudre une propriété sur un intervalle de temps global.

Selon la réussite de la résolution, l’avertissement ou l’erreur suivant peut être émis :

  • Si une propriété existe dans l’environnement sur un intervalle de temps global, elle est résolue de manière appropriée et un avertissement est émis pour vous avertir que la valeur de cette propriété est null pour une étendue de recherche donnée.
  • Si aucune propriété n’existe dans l’environnement, une erreur est émise et l’exécution de la requête échoue.

Réponses d’erreur

Si l’exécution de la requête échoue, la charge utile de réponse JSON contient une réponse d’erreur avec la structure suivante :

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

Ici, innerError est facultatif. En plus des erreurs de base, telles qu’une requête incorrecte, les erreurs suivantes sont retournées :

Code d'état HTTP Code d'erreur Exemple de message d’erreur Codes d’erreur internes possibles
400 InvalidApiVersion « La version de l’API « 2016 » n’est pas prise en charge. Les versions prises en charge sont « 2016-12-12 ».
400 InvalidInput « Impossible d’analyser la chaîne de prédicat. » PredicateStringParseError
400 InvalidInput « Impossible de traduire la chaîne de prédicat. » InvalidTypes, LimitExceeded, MissingOperand, InvalidPropertyType, InvalidLiteral, PropertyNotFound
400 InvalidInput « Plusieurs agrégats ne sont pas pris en charge. »
400 InvalidInput « Propriété de prédicat introuvable . » PropertyNotFound
400 InvalidInput « Propriété de mesure introuvable . » PropertyNotFound
400 InvalidInput « Propriété de dimension introuvable . » PropertyNotFound
400 InvalidInput « Le nombre de mesures a dépassé la limite . » NumberOfMeasuresExceededLimit
400 InvalidInput « La profondeur agrégée a dépassé la limite. » AggregateDepthExceededLimit
400 InvalidInput « La cardinalité totale a dépassé la limite. » TotalCardinalityExceededLimit
400 InvalidInput « La propriété 'from' est manquante. » BreaksPropertyMissing
400 InvalidInput « La propriété 'to' est manquante. » BreaksPropertyMissing
400 InvalidInput « La taille de la demande a dépassé la limite. » RequestSizeExceededLimit
400 InvalidInput « La taille de la réponse a dépassé la limite. » ResponseSizeExceededLimit
400 InvalidInput « Le nombre d’événements a dépassé la limite. » EventCountExceededLimit
400 InvalidInput « Le nombre de références de propriétés a dépassé la limite. » PropertyReferenceCountExceededLimit
400 InvalidMethod « Seules les requêtes WebSocket sont autorisées sur le chemin d’accès 'agrégats'. »
400 InvalidUrl « L’URL de requête '/a/b' n’a pas pu être analysée. »
408 RequestTimeout « La demande a expiré après '30' secondes. »
503 TooManyRequests « Nombre de demandes simultanées de '10' dépassées pour l’environnement '95880732-01b9-44ea-8d2d-4d764dfe1904'. » EnvRequestLimitExceeded

Avertissements

Une réponse d’API de requête peut contenir une liste d’avertissements sous "warnings" la racine de la réponse HTTP ou du message de réponse WebSocket. Actuellement, des avertissements sont générés si la propriété est introuvable pour une étendue de recherche donnée, mais qu’elle se trouve dans un environnement pour l’intervalle de temps global. Elle est également générée lorsque l’en-tête x-ms-property-not-found-behavior est défini UseNull sur et qu’une propriété référencée n’existe pas même dans l’étendue recherche globale.

Chaque objet d’avertissement peut contenir les champs suivants :

Nom du champ Type de champ Notes
code Chaîne Un des codes d’avertissement prédéfinis
message Chaîne Message d’avertissement détaillé
cible Chaîne Chemin JSON séparé par des points vers l’entrée de charge utile d’entrée JSON provoquant l’avertissement
warningDetails Dictionnaire Optionnel; détails d’avertissement supplémentaires (par exemple, la position dans la chaîne de prédicat)

Le code suivant présente des exemples d’avertissements pour le prédicat, la chaîne de prédicat dans le prédicat, la dimension et la mesure :

"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"
  }
]

Voir aussi

Pour plus d’informations sur l’inscription des applications et le modèle de programmation Azure Active Directory, consultez Azure Active Directory pour les développeurs.

Pour en savoir plus sur les paramètres de demande et d’authentification, consultez Authentification et autorisation.

Les outils qui vous aident à tester les requêtes et réponses HTTP sont les suivants :

  • Fiddler. Ce proxy de débogage web gratuit peut intercepter vos requêtes REST, ce qui vous permet de diagnostiquer les messages de requête et de réponse HTTP.
  • JWT.io. Vous pouvez utiliser cet outil pour vider rapidement les revendications dans votre jeton du porteur, puis valider leur contenu.
  • Postman. Il s’agit d’un outil de test de requête et de réponse HTTP gratuit pour le débogage des API REST.

Pour en savoir plus sur Azure Time Series Insights Gen1, consultez la documentation gen1.