Construire des requêtes OData pour Analytics dans Azure DevOps

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

Analytics expose les données de projet Azure DevOps via un point de terminaison OData que vous pouvez interroger à partir de n’importe quel navigateur web ou outil client pris en charge . Ce tutoriel vous guide tout au long de la structure d’URL de requête ( métadonnées, jeux d’entités et options de requête) pour commencer à générer vos propres requêtes. Pour obtenir une comparaison des outils de requête, consultez Outils de requête Analytics.

Dans ce tutoriel, vous allez apprendre à :

  • Interrogez les métadonnées Analytics.
  • Interrogez un jeu d’entités.
  • Appliquez les options de requête dans l’ordre recommandé.
  • Gérer la pagination côté serveur.

Conseil

Vous pouvez utiliser l’IA pour vous aider à effectuer cette tâche plus loin dans cet article, ou voir Activer l’aide à l’IA avec Azure DevOps MCP Server pour commencer.

Prérequis

Catégorie Spécifications
Niveaux d’accès - Membre du projet.
Au moins un accès de base.
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

Pour récupérer le modèle d’entité OData, ajoutez $metadata l’URL racine du service Analytics. Les métadonnées décrivent les éléments de données que vous pouvez utiliser dans les requêtes, notamment :

  • Types d’entités, jeux d’entités et conteneurs
  • Propriétés et propriétés de navigation
  • Clés de substitution et listes énumérées
  • Fonctions de filtre prises en charge (Org.OData.Capabilities.V1.FilterFunctions)
  • Agrégations prises en charge (Org.OData.Aggregation.V1.ApplySupported)
  • Type de support Batch (Org.OData.Capabilities.V1.BatchSupportType)

Entrez l’URL suivante dans un navigateur web. Remplacez <OrganizationName> et <ProjectName> par vos valeurs. Omettez le nom du projet pour retourner les métadonnées pour l’ensemble de l’organisation.

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

Par exemple, la requête suivante retourne des métadonnées pour l’organisation fabrikam :

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

Entrez l’URL suivante dans un navigateur web. Remplacez <ServerName>, <CollectionName> et <ProjectName> par vos valeurs. Omettez le nom du projet pour renvoyer les métadonnées de la collection entière.

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

Par exemple, la requête suivante retourne des métadonnées pour le fabrikam serveur et son DefaultCollection:

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

Remarque

La dernière version d’OData d’Analytics est v4.0-preview. Utilisez 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

Le point de terminaison de métadonnées retourne un document XML qui contient deux schémas principaux :

  • Microsoft.VisualStudio.Services.Analytics.Model — définit les types d’entités, les types énumérés et leurs membres.
  • Default : définit des conteneurs d’entités, des jeux d’entités et des fonctions de filtre, de transformation et d’agrégation OData prises en charge.

L’exemple suivant montre la structure de haut niveau :

<?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>

Conseil

Certains navigateurs ne mettent pas en forme XML pour la lisibilité. Recherchez en ligne un formateur XML gratuit ou utilisez la fonction de recherche de votre navigateur pour rechercher des noms d’entités spécifiques dans la sortie brute.

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

Propriétés générales et propriétés de navigation

Les métadonnées de chaque type d’entité répertorient deux types de membres que vous pouvez utiliser dans les requêtes :

  • Propriétés (Property) : correspond aux champs d’élément de travail et aux données spécifiques à Analytics, telles que LeadTimeDays et CycleTimeDays. Utilisez les propriétés dans $select, $filter et $orderby clauses.
  • Propriétés de navigation (NavigationProperty) : lien vers des jeux d’entités connexes tels que Revisions, , LinksChildren, Parent, et .Teams Utilisez les propriétés de navigation pour filtrer par des entités associées telles que des chemins d’itération, des chemins de zone ou des équipes, et dans les clauses $expand.

L’extrait de code suivant montre une vue partielle des métadonnées d’entité WorkItem :

<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="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>
...
<NavigationProperty Name="Teams" Type="Collection(Microsoft.VisualStudio.Services.Analytics.Model.Team)"/>
<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="Project" Type="Microsoft.VisualStudio.Services.Analytics.Model.Project" Nullable="false">
   <ReferentialConstraint Property="ProjectSK" ReferencedProperty="ProjectSK"/>
</NavigationProperty>
...

Pour obtenir des détails complets sur les propriétés et les relations pour chaque zone de service, consultez :

Jeux d'entités à interroger

Pour générer des rapports, interrogez un jeu d’entités tel que WorkItems, WorkItemSnapshotou PipelineRuns. Pour obtenir la liste complète des entités prises en charge, consultez les métadonnées OData Analytics.

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

Par exemple, la requête suivante compte les éléments de travail du projet Fabrikam Fiber :

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

La réponse retourne un nombre 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>

Par exemple, la requête suivante compte les éléments de travail dans le projet Fabrikam sur le serveur fabrikam.

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

La réponse retourne un nombre de 44:

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

Important

Incluez toujours une clause $select ou $apply pour éviter les limites d’utilisation. Sans un, Analytics retourne toutes les colonnes et lignes, ce qui peut être lent pour les jeux de données volumineux et déclenche la pagination côté serveur au-dessus de 10 000 enregistrements.

Exemple : répertorier des projets avec $select

L’exemple suivant utilise $select pour renvoyer uniquement la ProjectName propriété du jeu d’entités Projects . Pour obtenir la liste complète des jeux d’entités, consultez Le modèle de données pour Analytics.

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

La réponse répertorie les noms de projet dans l’organisation :

{
  "@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" }
  ]
}
https://fabrikam/DefaultCollection/_odata/v4.0-preview/Projects?$select=ProjectName

La réponse répertorie les noms de projet dans la collection :

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

Ajoutez des options de requête à l’URL pour mettre en forme la réponse. Spécifiez-les dans l’ordre indiqué ici.

Option de requête Descriptif Exemples
$apply Transforme les résultats avec filter, , groupbyaggregate, compute, expand, ou concat. Données agrégées
$compute Définit les propriétés calculées à utiliser dans $select, $filterou $orderby.
$filter Retourne uniquement les ressources pour lesquelles l’expression évalue à true. Les ressources qui évaluent à false, à null, ou ne sont pas disponibles en raison des autorisations sont omises. Interroger les données de suivi du travail
$orderby Définit l’ordre de tri des enregistrements retournés. Interroger les données de suivi du travail
$top / $skip Limite le nombre d’enregistrements retournés ou ignore un nombre spécifié. Requêtes ciblées sur l’organisation
$select Spécifie les colonnes à renvoyer.
$expand Inclut les entités associées en ligne. Passez les options de requête imbriquées ($filter, $select, $orderby, $skip, $top, $count, $search, $expand) entre parenthèses après le nom de la propriété de navigation. Recettes d’analytique
$skiptoken Passe à la page suivante des résultats (utilisée avec la pagination côté serveur).
$count=true Ajoute un nombre total d’enregistrements à la réponse. Utilisez $count seule pour renvoyer uniquement le nombre. Données agrégées

Conseil

Ne combinez $apply pas et $filter dans la même requête. Utilisez l’un ou l’autre. Pour filtrer à l’intérieur d’une $apply clause, utilisez $apply=filter(...). Le mélange des deux peut produire des résultats inattendus.

Comprendre la pagination côté serveur

Lorsqu’une requête retourne plus de 10 000 enregistrements, Analytics pages automatiquement les résultats. La réponse inclut une @odata.nextLink URL qui pointe vers la page suivante. Les outils clients tels que Power BI Desktop et Excel suivent automatiquement ces liens.

L’exemple suivant montre une réponse paginée :

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

Si vous interrogez depuis le code, suivez chaque @odata.nextLink jusqu'à ce que la réponse n'en contienne plus un.

Utiliser l’IA pour construire des requêtes Analytics

Si vous configurez le serveur MCP Azure DevOps, vous pouvez utiliser des assistants IA pour générer des requêtes OData pour Analytics.

Exemples d’invites pour la construction de requêtes

Tâche Exemple d’invite
Métadonnées de requête Show me the properties available for the WorkItems entity set in <Contoso> organization
Créer une requête de base Write an OData query to list all active user stories in <Contoso> project
Filtrer et trier Write an OData query to get bugs with priority 1, sorted by created date, in <Contoso> project
Sélectionner des colonnes spécifiques Write an OData query that returns only the Title, State, and AssignedTo for work items in <Contoso> project
Utiliser des agrégations Write an OData query that groups work items by state and counts them in <Contoso> project
Gérer la pagination Explain how to handle server-side paging when querying Analytics for large datasets
Requête inter-projets Write an OData query to get all bugs across all projects in <Contoso> organization
Requête d’instantané Write an OData query using WorkItemSnapshot to show a burndown of remaining work over the last sprint in <Contoso> project
Éléments de travail obsolètes Write an OData query to find work items that haven't been updated in the last 30 days in <Contoso> project
Charge de travail d’équipe Write an OData query that shows how many active work items are assigned to each team member in <Contoso> project
Échecs de pipeline Write an OData query to list the pipeline runs that failed in the last 7 days in <Contoso> project

Étape suivante