Partager via


Construire des requêtes OData pour Analytics dans Azure DevOps

Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022

L’analytique, la plateforme de création de rapports Azure DevOps, peut répondre à des questions quantitatives sur l’état passé ou actuel de vos projets. Analytics prend en charge les requêtes OData de ses métadonnées et de ses données de jeu d’entités. Vous pouvez en savoir plus sur le modèle de données et le processus de requête en exécutant des requêtes simples à partir de votre navigateur web.

Remarque

OData, un protocole au niveau de l’application pour interagir avec les données via des interfaces REST (Representational State Transfer), prend en charge la description, la modification et l’interrogation des modèles de données. Le modèle de données d’entité (EDM) ou les métadonnées décrit les informations disponibles à partir d’Analytics, notamment les entités, les types d’entités, les propriétés, les relations et les énumérations que vous utilisez pour interroger les données pour générer des rapports. Pour obtenir une vue d’ensemble d’OData, consultez Bienvenue dans OData.

Cet article explique comment :

  • Formulez une requête Analytics OData.
  • Métadonnées d'Analyse des Requêtes.
  • Analyse de requêtes OData pour un ensemble d’entités.
  • Utilisez les options de requête dans la séquence recommandée.
  • Comprendre la pagination côté serveur.

Vous pouvez interroger Analytics à partir de n’importe quel navigateur web pris en charge. Pour d’autres outils que vous pouvez utiliser pour interroger Analytics, consultez outils de requête Analytics.

Prérequis

Catégorie Spécifications
Niveaux d’accès - Membre du projet.
- Accès de base au moins.
Permissions Par défaut, les membres du projet ont l’autorisation d’interroger Analytics et de créer des vues. Pour plus d’informations sur les autres prérequis concernant l’activation du service et des fonctionnalités et les activités de suivi des données générales, consultez Autorisations et conditions préalables pour accéder à Analytics.

Interroger les métadonnées

Analytics expose le modèle d’entité OData à l’URL de métadonnées formée en ajoutant $metadata à l’URL racine du service. Analytics fournit des racines de service pour des projets Azure DevOps ou des collections entières.

Vous pouvez interroger les métadonnées pour rechercher l’un des éléments de données suivants :

  • Types d’entités et jeux d’entités
  • Propriétés et propriétés de navigation
  • Clés de substitution
  • Listes énumérées
  • Ensembles d’entités
  • conteneurs
  • Fonctions de filtre, avec Org.OData.Capabilities.V1.FilterFunctions
  • Agrégations prises en charge, avec Org.OData.Aggregation.V1.ApplySupported
  • Type de prise en charge par lots, avec Org.OData.Capabilities.V1.BatchSupportType

Pour interroger les métadonnées d’une organisation ou d’un projet hébergé dans le cloud, entrez la syntaxe d’URL suivante dans un navigateur web. Remplacez <OrganizationName> et <ProjectName> par les noms de l'organisation et du projet que vous souhaitez interroger. Pour retourner toutes les métadonnées d’une organisation, ne spécifiez pas de nom de projet.

https://analytics.dev.azure.com/<OrganizationName>/<ProjectName>/_odata/version/$metadata 

L’exemple suivant interroge les métadonnées de l’organisation fabrikam .

https://analytics.dev.azure.com/fabrikam/_odata/v4.0-preview/$metadata  

Dans la chaîne de requête, analytics.dev.azure.com correspond à l’URL racine du service Analytics, suivie du nom de l’organisation, du nom du projet, de la version OData et $metadata de la désignation.

Pour interroger les métadonnées d’un serveur, entrez la syntaxe d’URL suivante dans un navigateur web. Remplacez , <ServerName> et <CollectionName> par <ProjectName>les noms du serveur, de la collection et du projet que vous souhaitez interroger. Pour retourner toutes les métadonnées d’une collection, ne spécifiez pas de nom de projet.

https://<ServerName>/<CollectionName>/<ProjectName>/_odata/version/$metadata 

L’exemple suivant interroge les métadonnées d’un serveur nommé fabrikam-devops et de son DefaultCollection.

https://fabrikam-devops/DefaultCollection/_odata/v4.0-preview/$metadata  

Remarque

La dernière version d’OData d’Analytics est v4.0-preview. Vous pouvez utiliser cette version pour toutes les requêtes sur Azure DevOps. Pour plus d’informations sur les versions d’Analytics et les données disponibles, consultez Le modèle de données pour Analytics.

Interpréter la réponse aux métadonnées

Analytics retourne un fichier XML du modèle de données. Utilisez votre fonction de recherche de navigateur pour rechercher des informations pour votre entité d’intérêt.

Conseil

Selon votre navigateur, ce fichier peut ne pas être mis en forme de manière lisible par l’homme. Vous trouverez un formateur XML en ligne gratuit par le biais d’une recherche web.

Les métadonnées d’analyse définissent les schémas principaux suivants.

  • Microsoft.VisualStudio.Services.Analytics.Model définit les types d’entités et les types énumérés et leurs membres.
  • Le Default schéma définit les conteneurs d’entités, les jeux d’entités, ainsi que les fonctions OData prises en charge, la transformation et les fonctions d’agrégation personnalisées.
<?xml version="1.0" encoding="UTF-8"?>
<edmx:Edmx xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" Version="4.0">
    <edmx:DataServices>
        <Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" Namespace="Microsoft.VisualStudio.Services.Analytics.Model">
           <EntityType Name="Entity Name"/>
        </Schema>
        <Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" Namespace="Default">
           <EntityContainer Name="Container"/>
        </Schema>
    </edmx:DataServices>
</edmx:Edmx>

Pour plus d’informations, consultez métadonnées OData Analytics.

Tous les types d’entités ont des propriétés et des propriétés de navigation que vous pouvez utiliser pour filtrer vos requêtes. Ces propriétés sont répertoriées dans les métadonnées sous Property ou NavigationProperty sous chacune d’elles EntityType. Vous pouvez utiliser des entités associées pour spécifier d’autres filtres, tels que des chemins d’itération, des chemins d’accès de zone ou des équipes.

L’extrait de code suivant montre une vue partielle des métadonnées de l’entité WorkItem . Les propriétés correspondent aux champs d’élément de travail et aux données spécifiques capturées par Analytics, telles que LeadTimeDays et CycleTimeDays. Les propriétés de navigation correspondent à d’autres jeux d’entités et aux données Analytics spécifiques capturées pour le type d’entité, telles que Revisions, Links, Children et Parent.

<Key>
   <PropertyRef Name="WorkItemId"/>
</Key>
<Property Name="WorkItemId" Type="Edm.Int32" Nullable="false">
   <Annotation Term="Ref.ReferenceName" String="System.Id"/>
   <Annotation Term="Display.DisplayName" String="Work Item Id"/>
</Property>
<Property Name="InProgressDate" Type="Edm.DateTimeOffset">
   <Annotation Term="Display.DisplayName" String="InProgress Date"/>
   </Property>
<Property Name="CompletedDate" Type="Edm.DateTimeOffset">
   <Annotation Term="Display.DisplayName" String="Completed Date"/>
   </Property>
<Property Name="LeadTimeDays" Type="Edm.Double">
   <Annotation Term="Display.DisplayName" String="Lead Time Days"/>
</Property>
<Property Name="CycleTimeDays" Type="Edm.Double">
   <Annotation Term="Display.DisplayName" String="Cycle Time Days"/>
</Property>
<Property Name="InProgressDateSK" Type="Edm.Int32"/>
<Property Name="CompletedDateSK" Type="Edm.Int32"/>
<Property Name="AnalyticsUpdatedDate" Type="Edm.DateTimeOffset"/>
<Property Name="ProjectSK" Type="Edm.Guid" Nullable="false"/>
<Property Name="WorkItemRevisionSK" Type="Edm.Int32" Nullable="false"/>
...
<NavigationProperty Name="BoardLocations" Type="Collection(Microsoft.VisualStudio.Services.Analytics.Model.BoardLocation)"/>
<NavigationProperty Name="Teams" Type="Collection(Microsoft.VisualStudio.Services.Analytics.Model.Team)"/>
<NavigationProperty Name="InProgressOn" Type="Microsoft.VisualStudio.Services.Analytics.Model.CalendarDate">
<ReferentialConstraint Property="InProgressDateSK" ReferencedProperty="DateSK"/>
</NavigationProperty>
<NavigationProperty Name="CompletedOn" Type="Microsoft.VisualStudio.Services.Analytics.Model.CalendarDate">
<ReferentialConstraint Property="CompletedDateSK" ReferencedProperty="DateSK"/>
</NavigationProperty>
<NavigationProperty Name="Revisions" Type="Collection(Microsoft.VisualStudio.Services.Analytics.Model.WorkItemRevision)"/>
<NavigationProperty Name="Links" Type="Collection(Microsoft.VisualStudio.Services.Analytics.Model.WorkItemLink)"/>
<NavigationProperty Name="Children" Type="Collection(Microsoft.VisualStudio.Services.Analytics.Model.WorkItem)"/>
<NavigationProperty Name="Parent" Type="Microsoft.VisualStudio.Services.Analytics.Model.WorkItem">
<ReferentialConstraint Property="ParentWorkItemId" ReferencedProperty="WorkItemId"/>
</NavigationProperty>
<NavigationProperty Name="Processes" Type="Collection(Microsoft.VisualStudio.Services.Analytics.Model.Process)"/>
<NavigationProperty Name="Descendants" Type="Collection(Microsoft.VisualStudio.Services.Analytics.Model.WorkItem)"/>
<NavigationProperty Name="Project" Type="Microsoft.VisualStudio.Services.Analytics.Model.Project" Nullable="false">
<ReferentialConstraint Property="ProjectSK" ReferencedProperty="ProjectSK"/>
<Annotation Term="Display.DisplayName" String="Project"/>
...

Pour obtenir des informations sur la propriété et les relations des métadonnées d’entité, consultez les articles suivants :

Jeux d'entités à interroger

Pour interroger des données Analytics et générer des rapports, vous interrogez généralement un jeu d’entités. Pour obtenir une vue d’ensemble des entités prises en charge, consultez les métadonnées OData Analytics.

Utilisez la syntaxe d’URL suivante pour interroger un élément spécifique EntitySet, tel que WorkItems, WorkItemSnapshotou PipelineRuns. Remplacez <EntitySet> par l’entité que vous souhaitez rechercher et <QueryOptions> par les options de requête, comme décrit dans Utiliser les options de requête.

https://analytics.dev.azure.com/<OrganizationName>/<ProjectName>/_odata/version/<EntitySet>?<QueryOptions>

L’exemple suivant interroge le nombre d’éléments de travail dans le Fabrikam Fiber projet de l’organisation fabrikam .

https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/WorkItems?%20$apply=aggregate($count%20as%20Count)

L’exemple de requête retourne des résultats montrant le nombre d'éléments de travail de 1399.

{
"@odata.context": "https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/$metadata#WorkItems(Count)",
"value": [
   {
   "@odata.id": null,
   "Count": 1399
   }
 ]
}
https://<ServerName>/<CollectionName>/<ProjectName>/_odata/version/<EntitySet>?<QueryOptions>

L’exemple suivant interroge le nombre d’éléments de travail dans le Fabrikam projet dans le DefaultCollectionfabrikam serveur.

https://fabrikam/DefaultCollection/Fabrikam/_odata/v4.0-preview/WorkItems?%20$apply=aggregate($count%20as%20Count)

L’exemple de requête retourne les résultats suivants des éléments de 1399 travail.

{
"@odata.context": "http://fabrikam/DefaultCollection/Fabrikam/_odata/v4.0-preview/$metadata#WorkItems(Count)",
"value": [
   {
      "@odata.id": null,
      "Count": 44
   }
 ]
}

Remarque

Pour éviter d'atteindre les limites d’utilisation, incluez toujours une clause $select ou $apply dans votre requête. Si vous n’incluez pas une clause $select ou $apply, vous recevez un avertissement tel que VS403507: The specified query does not include a $select or $apply clause which is recommended for all queries. Details on recommended query patterns are available here: https://go.microsoft.com/fwlink/?linkid=861060.

L’omission d’une clause $select ou $apply équivaut à effectuer une instruction select sur l’ensemble d’entités qui retourne toutes les colonnes et toutes les lignes. Si vous avez un grand nombre d’enregistrements, la requête peut prendre plusieurs secondes. Si vous avez plus de 10 000 éléments, la pagination côté serveur est appliquée.

Exemple : Interroger un jeu d’entités spécifique

Pour interroger un jeu d’entités spécifique, tel que WorkItems, Areasou Projects, ajoutez le nom de l’entité définie à la requête. Pour obtenir la liste complète des jeux d’entités, consultez Le modèle de données pour Analytics.

Par exemple, vous pouvez obtenir la liste des projets définis pour votre organisation en interrogeant Projects et en sélectionnant pour renvoyer la ProjectName propriété. L’exemple suivant montre l’URL de requête de l’organisation fabrikam .

https://analytics.dev.azure.com/fabrikam/_odata/v4.0-preview/Projects?$select=ProjectName

Analytics retourne les noms des projets dans l’organisation fabrikam .

{
@odata.context": "https://analytics.dev.azure.com/fabrikam/_odata/v4.0-preview/$metadata#Projects(ProjectName)",

"value": [
   {
      "ProjectName": "Basic Fabrikam"
   },
   {
      "ProjectName": "Fabrikam Fiber"
   },
   {
      "ProjectName": "MyFirstProject"
   },
   {
      "ProjectName": "Fabrikam Test"
   },
   {
      "ProjectName": "MyPublicProject"
   }
 ]
}

Par exemple, vous pouvez obtenir la liste des projets définis pour votre serveur et votre collection en interrogeant et en sélectionnant Projects pour renvoyer la ProjectName propriété. L’exemple suivant montre l’URL de requête pour le DefaultCollection sur le serveur fabrikam.

https://fabrikam/DefaultCollection/_odata/v4.0-preview/Projects?$select=ProjectName

L’exemple retourne les trois noms de projet suivants.

{
"@odata.context": "http://fabrikam/DefaultCollection/_odata/v4.0-preview/$metadata#Projects(ProjectName)",
"value": [
   {
      "ProjectName": "Fabrikam Fiber"
   },
   {
      "ProjectName": "Fabrikam"
   },
   {
      "ProjectName": "Fabrikam Florida"
   }
 ]
}

Utiliser les options de requête

Les options de requête sont des paramètres de chaîne de requête qui permettent de contrôler la quantité de données retournées pour une ressource. Spécifiez les options de requête dans l’ordre indiqué dans le tableau suivant.

Option de requête Descriptif
$apply Applique une transformation à une requête, telle que filter, , groupbyaggregate, compute, , expand, ou concat. Pour obtenir des exemples, consultez agréger des données de suivi de travail à l’aide d’Analytics.
$compute Définit les propriétés calculées dans une expression $select, $filter, ou $orderby.
$filter Filtre la liste des ressources retournées. La requête évalue l’expression spécifiée par $filter pour chaque ressource dans l’étendue de la requête et inclut uniquement les éléments où l’expression évalue à true dans la réponse.

Les ressources pour lesquelles l'expression s'évalue à false ou null, ou lorsque les propriétés de référence sont indisponibles en raison des autorisations, sont omises de la réponse. Pour obtenir des exemples, consultez Interroger des données de suivi du travail à l’aide d’Analytics.
$orderby Spécifie la séquence dans laquelle retourner des enregistrements. Pour obtenir des exemples, consultez Interroger des données de suivi du travail à l’aide d’Analytics.
$top/$skip Limite le nombre d’enregistrements retournés. Pour obtenir des exemples, consultez les requêtes Project et l’étendue de l’organisation.
$select Spécifie les colonnes dont vous avez besoin.
$expand Imbrication d’autres options de requête. Chacun expandItem d’eux est évalué par rapport à l’entité contenant la propriété de navigation ou de flux en cours d’expansion.

Donnez au nom de la propriété de navigation une liste d’options de requête, séparées par des virgules et placées entre parenthèses. Les options de requête système autorisées sont $filter, , $select$orderby, $skip$top$count, , , $searchet .$expand Pour obtenir des exemples, consultez Interroger des données de suivi du travail à l’aide d’Analytics.
$skiptoken Ignore un nombre spécifié d’enregistrements.
$count ou $count=true Retourne uniquement le nombre d’enregistrements. Entrez $count=truepour retourner le nombre d’enregistrements et les données interrogées. Pour obtenir des exemples, consultez agréger des données de suivi de travail à l’aide d’Analytics.

Conseil

Évitez de mélanger $apply et $filter de clauses dans une seule requête. Pour filtrer votre requête, vous pouvez utiliser une $filter clause ou utiliser une $apply=filter() clause de combinaison. Les deux options fonctionnent, mais leur combinaison dans une requête unique peut entraîner des résultats inattendus.

Comprendre la pagination côté serveur

L’analytique force la pagination lorsque les résultats de la requête dépassent 10 000 enregistrements. Dans ce cas, vous obtenez la première page de données et un lien à suivre pour obtenir la page suivante. Les outils clients tels que Power BI Desktop ou Excel suivent automatiquement @odata.nextLink et chargent tous les enregistrements requis quand on extrait des données.

Vous trouverez le @odata.nextLink lien à la fin de la sortie JSON. Le lien ressemble à la requête d’origine suivie par $skip ou $skiptoken. Par exemple :

{
  "@odata.context":"https://analytics.dev.azure.com/fabrikam/_odata/v4.0-preview/$metadata#WorkItems",
  "value":[
   // 10000 values here
  ],
  "@odata.nextLink":"https://https://analytics.dev.azure.com/fabrikam/_odata/v4.0-preview/WorkItems?$skiptoken=10000"
}

Étape suivante