Определение базовых запросов с помощью OData Analytics

Сервисы Azure DevOps | Azure DevOps Server | Azure DevOps Server 2022

Используйте аналитические OData-запросы для получения данных отслеживания работы из Azure DevOps в браузере или таких клиентских приложениях, как Excel и Power BI. В этой статье рассматриваются подсчет элементов, выбор определенных полей с $select, фильтрация с $filter, расширение свойств навигации с $expand, запрос диапазонов дат и сортировка с $orderby.

Подсказка

Вы можете использовать ИИ, чтобы помочь с этой задачей далее в этой статье или см. включение ИИ-помощи с помощью Azure DevOps MCP Server, чтобы приступить к работе.

В примерах рассматриваются наборы сущностей отслеживания работы в Azure Boards, но те же принципы применяются к другим наборам сущностей. Дополнительные сведения см. в статьях Конструирование запросов OData для аналитики и Справочник по метаданным для аналитики Azure Boards.

Примечание.

Служба Аналитики автоматически включается и поддерживается в рабочей среде для всех служб в Azure DevOps Services. Интеграция Power BI и доступ к веб-каналу OData службы Аналитики общедоступны. Рекомендуется использовать веб-канал OData аналитики и предоставить отзыв.

Доступные данные зависят от версий. Последняя поддерживаемая версия API OData - v2.0, а последняя предварительная версия - v4.0-preview. Дополнительные сведения см. в разделе "Управление версиями API OData".

Примечание.

Служба Аналитики автоматически устанавливается и поддерживается в рабочей среде для всех новых коллекций проектов для Azure DevOps Server 2020 и более поздних версий. Интеграция Power BI и доступ к веб-каналу OData службы Аналитики общедоступны. Рекомендуется использовать веб-канал OData аналитики и предоставить отзыв. При обновлении с Azure DevOps Server 2019 можно установить службу Аналитики во время обновления.

Доступные данные зависят от версий. Последняя поддерживаемая версия API OData - v2.0, а последняя предварительная версия - v4.0-preview. Дополнительные сведения см. в разделе "Управление версиями API OData".

Предварительные условия

Категория Требования
Уровни доступа - член проекта.
— Как минимум базовый доступ .
Права доступа По умолчанию члены проекта имеют разрешение выполнять запросы к аналитике и создавать представления. Дополнительные сведения о других предварительных требованиях для включения служб и функций и общих действий отслеживания данных см. в разделе "Разрешения и предварительные требования для доступа к аналитике".

Примечание.

  • Запросы между проектами завершаются сбоем, если пользователь, выполняющий запрос, не имеет доступа ко всем проектам. Дополнительные сведения см. в разделе "Запросы в области проекта и организации".
  • Примеры, приведенные в этой статье, используют формат URL-адреса Azure DevOps Services: https://analytics.dev.azure.com/{OrganizationName}/ Вместо этого используйте https://{servername}/{CollectionName}/ для Azure DevOps Server. Дополнительные сведения см. в разделе "Создание запросов OData для аналитики".

Узнать количество элементов

Чтобы вернуть только количество без других данных, добавьте $apply=aggregate($count as Count) к URL-адресу набора сущностей. Например, следующие запросы подсчитывают проекты, рабочие элементы, пути к областям и пользователей в организации.

https://analytics.dev.azure.com/<OrganizationName>/_odata/v4.0-preview/Projects?$apply=aggregate($count as Count)
https://analytics.dev.azure.com/<OrganizationName>/_odata/v4.0-preview/WorkItems?$apply=aggregate($count as Count)
https://analytics.dev.azure.com/<OrganizationName>/_odata/v4.0-preview/Areas?$apply=aggregate($count as Count)
https://analytics.dev.azure.com/<OrganizationName>/_odata/v4.0-preview/Users?$apply=aggregate($count as Count)

Запрос Projects для fabrikam организации возвращает:

{
  "value": [
    {
      "Count": 16
    }
  ]
}

Получение количества элементов и их данных

Чтобы вернуть количество вместе с данными, добавьте $count=true в запрос с ключевым словом $select. Следующие запросы возвращают количество и выбранные свойства для рабочих элементов, путей к областям и пользователей в проекте:

https://analytics.dev.azure.com/<OrganizationName>/<ProjectName>/_odata/v4.0-preview/WorkItems?$count=true&$select=WorkItemId,Title,WorkItemType 
https://analytics.dev.azure.com/<OrganizationName>/<ProjectName>/_odata/v4.0-preview/Areas?$count=true&$select=AreaName,AreaPath 
https://analytics.dev.azure.com/<OrganizationName>/<ProjectName>/_odata/v4.0-preview/Users?$count=true&$select=UserName,UserEmail

Примечание.

Всегда включайте $select и $apply в ваш запрос. Пропуск обоих параметров вызывает предупреждение и может привести к превышению лимитов использования.

Допустимые имена свойств см. в справочнике по метаданным Azure Boards Analytics и справочнике по метаданным даты календаря, проекта и пользователя.

Например, следующий запрос возвращает количество и имена пользователей в проекте Fabrikam Fiber:

https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/Users?$count=true&$select=UserName

Ответ включает общее количество записей @odata.count и соответствующие записи в value:

{
  "@odata.count": 5,
  "value": [
    { "UserName": "Microsoft.VisualStudio.Services.TFS" },
    { "UserName": "fabrikamfiber1@hotmail.com" },
    { "UserName": "Jamal Hartnett" },
    { "UserName": "fabrikamfiber5@hotmail.com" },
    { "UserName": "fabrikamfiber2@hotmail.com" }
  ]
}

Выбор определенных свойств или полей

Добавьте оператор $select, чтобы вернуть только необходимые свойства. Имена свойств чувствительны к регистру, не могут содержать пробелы и должны соответствовать именам полей рабочих элементов. Например, $select=WorkItemId,WorkItemType,Title,State возвращает эти четыре поля.

Дополнительные сведения о поиске имен свойств, включая настраиваемые поля, см. в справочнике по метаданным для Azure Boards.

Следующий запрос возвращает идентификатор, тип, название и состояние для трех основных рабочих элементов в проекте Fabrikam Fibre:

https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/WorkItems?$select=WorkItemId,WorkItemType,Title,State&$top=3
{
  "value": [
    { "WorkItemId": 31, "Title": "About screen", "WorkItemType": "Task", "State": "New" },
    { "WorkItemId": 30, "Title": "Change background color", "WorkItemType": "Task", "State": "Active" },
    { "WorkItemId": 32, "Title": "Standardize on form factors", "WorkItemType": "Task", "State": "Active" }
  ]
}

Фильтрация данных

$filter Добавьте предложение, чтобы возвращать только элементы, соответствующие определенным критериям. Используйте операторы сравнения, такие как eq, ne, gt, ge, lt, и le, и сочетайте условия с and и or. Например, следующий запрос возвращает функции, которые выполняются:

https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/WorkItems?$select=WorkItemId,Title,AssignedTo,State&$filter=WorkItemType eq 'Feature' and State eq 'In Progress'

Объединение нескольких условий фильтра

Используйте круглые скобки для группирования or условий в более широком and фильтре. Следующий запрос возвращает пользовательские истории, ошибки и пользовательский тип в определенных состояниях:

https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/WorkItems?$select=WorkItemId,Title,AssignedTo,State&$filter=(WorkItemType eq 'User Story' or WorkItemType eq 'Bug' or WorkItemType eq 'Backlog Work') and (State eq 'New' or State eq 'Committed' or State eq 'Active')
{
  "value": [
    { "WorkItemId": 210, "Title": "Slow response on form", "State": "Active" },
    ...
    { "WorkItemId": 160, "Title": "Game store testing", "State": "New" }
  ]
}

Можно также использовать такие строковые функции, как contains, startswithи endswith в выражениях фильтра. Дополнительные сведения см. в разделе "Поддерживаемые функции".

Свойства пути области запроса или пути итерации

Для некоторых запросов требуется суррогатный ключ (AreaSK или IterationSK) вместо строки пути. Используйте наборы сущностей "Области " или " Итерации" , чтобы найти ключ для определенного пути.

Вернуть AreaSK для определенного пути к области

Следующий запрос возвращает AreaSK для пути области Fabrikam Fiber\Production Planning\Web. Сведения о других доступных свойствах см. в разделе "Области".

https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/Areas?$filter=AreaPath eq 'Fabrikam Fiber\Production Planning\Web'&$select=AreaSK
{
  "value": [
    { "AreaSK": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb" }
  ]
}

Получите IterationSK для конкретного пути итерации

Следующий запрос возвращает IterationSK для Fabrikam Fiber\Release 1\Sprint 3 итерационного пути. Сведения о других доступных свойствах см. в разделе "Итерации".

https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/Iterations?$filter=IterationPath eq 'Fabrikam Fiber\Release 1\Sprint 3'&$select=IterationSK

Фильтрация по свойствам навигации

Свойства навигации, такие как Iteration, Areaи AssignedTo представляют связи с другими сущностями. Чтобы отфильтровать поле из связанной сущности, используйте полный путь в формате NavigationProperty/Field. Например, Iteration/IterationPath ссылается на IterationPath поле с помощью свойства навигации Iteration :

/WorkItems?$filter=Iteration/IterationPath eq 'Project Name\Iteration 1'

Следующий запрос возвращает первые пять рабочих элементов в определенной итерации, используя полный путь навигации:

https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/WorkItems?$top=5&$filter=Iteration/IterationPath eq 'Fabrikam Fiber\3Week Sprints\Sprint 3'&$select=WorkItemId,WorkItemType,Title,State&$orderby=WorkItemId asc

Фильтрация по навигационному свойству означает, что его данные не будут включены в ответ. Чтобы вернуть поля из связанной сущности, используйте $expand. Без $expand невозможен доступ к полям свойств навигации через $select.

Следующий запрос возвращает рабочий элемент 480 со всеми полями из развернутой Iteration сущности:

https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/WorkItems?$filter=WorkItemId eq 480&$select=WorkItemId,WorkItemType,Title,State&$expand=Iteration

Так как $select не применяется к расширению Iteration, ответ включает каждое Iteration поле:

{
  "value": [
    {
      "WorkItemId": 480,
      "Title": "Add animated emoticons",
      "WorkItemType": "User Story",
      "State": "New",
      "Iteration": {
        "ProjectSK": "bbbbbbbb-1111-2222-3333-cccccccccccc",
        "IterationSK": "cccccccc-2222-3333-4444-dddddddddddd",
        "IterationName": "Sprint 3",
        "IterationPath": "Fabrikam Fiber\\3Week Sprints\\Sprint 3",
        "StartDate": "2025-12-04T00:00:00-12:00",
        "EndDate": "2025-12-25T23:59:59.999-12:00",
        "IterationLevel1": "Fabrikam Fiber",
        "IterationLevel2": "3Week Sprints",
        "IterationLevel3": "Sprint 3",
        ...
        "Depth": 2,
        "IsEnded": false
      }
    }
  ]
}

Используйте select в операторах расширения

Чтобы ограничить поля, возвращаемые из развернутой сущности, добавьте $select условие внутри $expand с использованием синтаксиса $expand=Entity($select=Field1,Field2). Следующий запрос расширяет Iteration, возвращает только IterationName и IterationPath:

https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/WorkItems?$filter=WorkItemId eq 480&$select=WorkItemId,WorkItemType,Title,State&$expand=Iteration($select=IterationName,IterationPath)
{
  "value": [
    {
      "WorkItemId": 480,
      "Title": "Add animated emoticons",
      "WorkItemType": "User Story",
      "State": "New",
      "Iteration": {
        "IterationName": "Sprint 3",
        "IterationPath": "Fabrikam Fiber\\3Week Sprints\\Sprint 3"
      }
    }
  ]
}

В следующей таблице показаны $expand$select примеры распространенных типов свойств навигации:

Тип навигации Основное свойство Примеры положений
Дата/время DateSK $expand=CreatedDate($select=Date) или
$expand=CreatedDate($select=WeekStartingDate)
Идентификация UserSK $expand=AssignedTo($select=UserName) или
$expand=AssignedTo($select=UserEmail)
Площадь AreaSK $expand=Area($select=AreaName) или
$expand=Area($select=AreaPath)
Итерация IterationSK $expand=Iteration($select=IterationName) или
$expand=Iteration($select=IterationPath) или
$expand=Iteration($select=StartDate)
Проект ProjectSK $expand=Project($select=ProjectName)
Группа TeamSK $expand=Teams($select=TeamName)

Чтобы развернуть несколько свойств навигации в одном запросе, используйте список с разделителями-запятыми:

$expand=AssignedTo($select=UserName),Iteration($select=IterationPath),Area($select=AreaPath)

Использование вложенных инструкций развертывания

Чтобы развернуть свойство навигации в уже развернутой сущности, вложите один $expand в другой. Следующий запрос разворачивает Iteration, а затем расширяет Project внутри Iteration, чтобы показать, к какому проекту принадлежит итерация.

https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/WorkItems?$filter=WorkItemId eq 480&$select=WorkItemId,WorkItemType,Title,State&$expand=Iteration($expand=Project)

Для комбинирования вложенного расширения с $select, используйте точку с запятой (;) для разделения $select от $expand внутри круглых скобок. Без запятой запрос возвращает ошибку. Следующий запрос возвращает только IterationName и IterationPath из Iteration, а также вложенный Project:

https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/WorkItems?$filter=WorkItemId eq 480&$select=WorkItemId,WorkItemType,Title,State&$expand=Iteration($select=IterationName,IterationPath;$expand=Project)
{
  "value": [
    {
      "WorkItemId": 480,
      "Title": "Add animated emoticons",
      "WorkItemType": "User Story",
      "State": "New",
      "Iteration": {
        "IterationName": "Sprint 3",
        "IterationPath": "Fabrikam Fiber\\3Week Sprints\\Sprint 3",
        "Project": {
          "ProjectSK": "bbbbbbbb-1111-2222-3333-cccccccccccc",
          "ProjectName": "Fabrikam Fiber"
        }
      }
    }
  ]
}

Запрос диапазона дат

В следующем примере запроса возвращаются рабочие элементы, последняя дата изменения которых больше или равно 1 января 2025 года.

https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/WorkItems?$select=WorkItemId,WorkItemType,Title,State&$filter=ChangedDate ge 2025-01-01Z

В следующем примере запроса возвращаются рабочие элементы, последние дата изменения которых произошла в течение недели с 31 октября по 7 ноября 2025 года.

https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/WorkItems?$select=WorkItemId,WorkItemType,Title,State&$filter=ChangedDate ge 2025-10-31Z and ChangedDate le 2025-11-07Z

Сортировка результатов

Добавьте $orderby для сортировки результатов по одному или нескольким свойствам. Результаты сортируются по возрастанию по умолчанию; для убывания добавьте desc. Разделите несколько полей сортировки запятыми.

Сортировать по Статья
Идентификатор рабочего элемента /WorkItems?$orderby=WorkItemId
Идентификатор рабочего элемента (самый новый) /WorkItems?$orderby=WorkItemId desc
Тип рабочего элемента, а затем состояние /WorkItems?$orderby=WorkItemType,State

Использование ИИ для создания запросов OData

Если вы настроите сервер MCP Azure DevOps, вы можете использовать помощники по искусственному интеллекту для создания и устранения неполадок запросов OData.

Примеры подсказок

задачи Пример запроса
Создание запроса Write an OData query that returns all active bugs with their area path and assigned-to fields in <Contoso> project
Фильтрация по дате Create an OData query that returns work items created in the last 30 days in <Contoso> project
Разверните свойства навигации Write an OData query that expands the iteration path and area path for user stories in <Contoso> project
Отладка запроса My OData query returns no results — help me troubleshoot the filter clause and URL format for <Contoso> project
Вложенное расширение Write an OData query with nested expand to return work items with their parent details in <Contoso> project
Сортировка и ограничение результатов Create an OData query that returns the 20 most recently changed bugs ordered by changed date in <Contoso> project
Подсчет по типу рабочего элемента Write an OData query that counts work items grouped by work item type for <Contoso> project
Фильтрация с помощью строковых функций Create an OData query that returns work items whose title contains "login" in <Contoso> project
Совместите выбор, фильтрацию и расширение Write an OData query that returns the title, state, assigned-to name, and iteration path for all user stories in the current sprint in <Contoso> project

Следующий шаг