使用 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 时,所需行数越少,刷新就越快。