使用 Analytics 聚合工作跟踪数据

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

可以通过以下两种方式之一获取工作跟踪数据之一:将 Analytics 与 OData 配合使用。 第一种方法基于 OData 查询返回简单的工作项计数。 第二种方法基于执行 OData 聚合扩展的 OData 查询返回 JSON 格式的结果。

本文构建了使用 OData Analytics 构造 OData 查询和定义基本查询中提供的信息。 此外,本文重点介绍如何检索工作项数据,但是,这些原则适用于查询其他实体集。

在本文中,你将了解:

  • 关于 OData 聚合扩展
  • 如何使用 OData 的聚合扩展
  • 如何对聚合结果进行分组和筛选
  • 如何聚合数据以生成累积流关系图

若要了解如何生成简单的计数,请参阅 返回项计数(无其他数据),返回项和数据计数。

注意

分析服务在所有 Azure DevOps Services 的生产中自动启用和支持。 对 Analytics Service 的 OData 源的 Power BI 集成和访问已正式发布。 我们鼓励你使用它并提供反馈。 可用数据依赖于版本。 支持的最新版本是 v2.0,最新的预览版本是 v4.0-preview。 有关详细信息,请参阅 OData API 版本控制

注意

Azure DevOps Server 2020 及更高版本的所有新项目集合都会自动安装并支持 Analytics 服务。 对 Analytics Service 的 OData 源的 Power BI 集成和访问已正式发布。 我们鼓励你使用它并提供反馈。 如果从 Azure DevOps Server 2019 升级,则可以在升级期间安装 Analytics 服务。

可用数据依赖于版本。 支持的最新版本是 v2.0,最新的预览版本是 v4.0-preview。 有关详细信息,请参阅 OData API 版本控制

注意

Analytics 服务为 Azure DevOps Server 2019 提供预览版。 可以为 项目集合启用或安装它Power BI 集成和分析服务的 OData 源的访问权限处于预览状态。 我们鼓励你使用它并提供反馈。

可用数据依赖于版本。 支持的最新版本是 v2.0,最新的预览版本是 v4.0-preview。 有关详细信息,请参阅 OData API 版本控制

OData 的聚合扩展是什么?

分析依赖于 OData 来创作对工作跟踪数据的查询。 OData 中的聚合是使用引入关键字的扩展实现的 $apply 。 下面提供了有关如何使用此关键字的一些示例。 在 OData 扩展中了解有关数据聚合的扩展的详细信息。

使用 OData 聚合扩展聚合数据

现在,你已了解如何执行简单的计数,让我们看看如何使用 URL 末尾的基本格式的令牌触发聚合 $apply ,如下所示:

/{entitySetName}?$apply=aggregate({columnToAggregate} with {aggregationType} as {newColumnName})

其中:

  • {entitySetName} 是需要查询的实体
  • {columnToAggregate} 是聚合列
  • {aggregationType} 将指定使用的聚合类型
  • {newColumnName} 指定聚合后具有值的列的名称。

使用应用扩展插件的聚合数据

$apply使用扩展,可以在查询工作跟踪数据时获取计数、总和和其他信息。

返回所有剩余工时的总和

https://analytics.dev.azure.com/{OrganizationName}/_odata/{version}/WorkItems?
  $apply=aggregate(RemainingWork with sum as SumOfRemainingWork)

返回最后一个工作项标识符

https://analytics.dev.azure.com/{OrganizationName}/_odata/{version}/WorkItems?
  $apply=aggregate(WorkItemId with max as MaxWorkItemId)

使用 groupby 子句对结果进行分组

OData 聚合扩展还支持与 groupby SQL GROUP BY 子句相同的子句。 可以使用此子句更详细地快速分解数字。

例如,以下子句返回工作项计数:

https://analytics.dev.azure.com/{OrganizationName}/_odata/{version}/WorkItems?
  $apply=aggregate($count as Count)

添加子 groupby 句以按类型返回工作项计数:

https://analytics.dev.azure.com/{OrganizationName}/_odata/{version}/WorkItems?
  $apply=groupby((WorkItemType), aggregate($count as Count))

它返回类似于此示例的结果:

{
  "@odata.context":"https://analytics.dev.azure.com/{OrganizationName}/_odata/{version}/$metadata#WorkItems(WorkItemType,Count)","value":[
    {
      "@odata.id":null,"WorkItemType":"Bug","Count":3
    },
    {
      "@odata.id":null,"WorkItemType":"Product Backlog Item","Count":13
    }
  ]
}

还可以按多个属性进行分组,如以下示例所示:

https://analytics.dev.azure.com/{OrganizationName}/_odata/{version}/WorkItems?
  $apply=groupby((WorkItemType, State), aggregate($count as Count))

它返回类似于此示例的结果:

{
  "@odata.context": "https://analytics.dev.azure.com/{OrganizationName}/_odata/{version}/$metadata#WorkItems(WorkItemType,State,Count)",
  "value": [
    {
      "@odata.id": null,
      "State": "Active",
      "WorkItemType": "Bug",
      "Count": 2
    },
    {
      "@odata.id": null,
      "State": "Committed",
      "WorkItemType": "Bug",
      "Count": 1
    },
    {
      "@odata.id": null,
      "State": "Active",
      "WorkItemType": "Product Backlog Item",
      "Count": 5
    },
    {
      "@odata.id": null,
      "State": "Committed",
      "WorkItemType": "Product Backlog Item",
      "Count": 8
    }
  ]
}

还可以跨实体分组,但 OData 分组与通常考虑的方式不同。

例如,假设你想要知道组织或集合中每个项目中有多少区域。 在 OData 中,“统计所有区域并按项目分组”等效于“给我所有项目和每个项目的区域计数”。 这会导致查询类似于:

https://analytics.dev.azure.com/{OrganizationName}/_odata/{version}/Areas?
  $apply=groupby((Project/ProjectName), aggregate($count as Count))

筛选聚合结果

还可以筛选聚合结果,但应用的结果与不使用聚合时应用的结果略有不同。 分析会沿管道评估筛选器,因此最好先执行最离散的筛选。

筛选器如以下示例所示:

https://analytics.dev.azure.com/{OrganizationName}/_odata/{version}/WorkItems?
  $apply=
    filter(Iteration/IterationName eq 'Sprint 89')/
    filter(WorkItemType eq 'User Story')/
    groupby((State), aggregate($count as Count))

注意

无需提供 groupby 子句。 只需使用 aggregate 子句返回单个值。

在单个调用中生成多个聚合

你可能想要提供多条信息。 例如已完成工时和剩余工时的总和。 在这种情况下,可以进行单独的调用或单个调用,如下所示:

/WorkItems?$apply=aggregate(CompletedWork with sum as SumOfCompletedWork, RemainingWork with sum as SumOfRemainingWork)

它将返回如下所示的结果:

{
  "@odata.context":"https://analytics.dev.azure.com/{OrganizationName}/_odata/{version}/$metadata#WorkItems(SumOfCompletedWork,SumOfRemainingWork)","value":[
    {
      "@odata.id":null,"SumOfCompletedWork":1525841.2900000005,"SumOfRemainingWork":73842.39
    }
  ]
}

生成用于单个调用的计算属性

可能需要使用数学表达式来计算在结果集中使用的属性。 例如,已完成工时的总和除以已完成工时和剩余工时的总和,以计算已完成工时百分比。 在这种情况下,可以使用以下示例:

/WorkItems?$apply=aggregate(CompletedWork with sum as SumOfCompletedWork, RemainingWork with sum as SumOfRemainingWork)/compute(SumOfCompletedWork div (SumOfCompletedWork add SumOfRemainingWork) as DonePercentage)

{
  "@odata.context":"https://analytics.dev.azure.com/{OrganizationName}/_odata/{version}/$metadata#WorkItems(SumOfCompletedWork,SumOfRemainingWork)","value":[
    {
      "@odata.id":null,"DonePercentage":0.96760221857946638,"SumOfRemainingWork":50715.95,"SumOfCompletedWork":1514698.3400000033
    }
  ]
}

从聚合数据生成累积流图

假设你想要在 Power BI 中创建 累积流图 。 可以使用类似于以下查询的查询:

https://analytics.dev.azure.com/{OrganizationName}/{ProjectName}/_odata/{version}//WorkItemBoardSnapshot?$apply=filter(DateValue gt 2015-07-16Z and DateValue le 2015-08-16Z)/filter(BoardName eq 'Stories' and Team/TeamName eq '{teamName}')/groupby((DateValue, ColumnName), aggregate(Count with sum as Count))&$orderby=DateValue

它返回类似于此示例的结果。 然后,可以直接在所选的数据可视化效果中使用它。

{
  "@odata.context": "https://analytics.dev.azure.com/{OrganizationName}/{ProjectName}/_odata/{version}//$metadata#WorkItemBoardSnapshot(DateValue,ColumnName,Count)",
  "value": [
    {
      "@odata.id": null,
      "DateValue": "2015-07-16T00:00:00-07:00",
      "Count": 324,
       "ColumnName": "Completed"
    },
    {
      "@odata.id": null,
      "DateValue": "2015-07-16T00:00:00-07:00",
      "Count": 5,
      "ColumnName": "In Progress"
    }
  ]
}

让我们看看此查询的实际用途:

  • 将数据筛选到特定团队
  • 将数据筛选到特定的积压工作
  • 返回工作项计数。

刷新 Power BI 或 Excel 时,所需行数越少,刷新就越快。

后续步骤