lvy-头像
关注

AdoAnalysis

I like :https://github.com/lvy010/echarts
在这里插入图片描述

在这里插入图片描述

AdoAnalysis:Azure DevOps PR 活动分析工具

是什么

AdoAnalysis 是一个本地数据采集和可视化工具,用来统计 DigitalEmployee、Agency 等自动化账号在 Azure DevOps 仓库中创建和完成的 PR。

Azure DevOps

fetch.js
采集 PR

data/*.json
本地数据

index.html
活动看板

de-share.html
DE 占比看板

以下面两个仓库:

  • Bing_UX/snrcode
  • ContentServices/msnews-experiences

它回答的问题包括:

  • DE 每周完成多少 PR?
  • Agency 每周完成多少 PR?
  • 两者的趋势如何?
  • DigitalEmployee PR 占仓库所有已完成 PR 的比例是多少?

为什么需要

Azure DevOps 原生页面适合查看单个 PR,但不方便回答跨仓库、跨时间的统计问题。

大量 ADO PR

想了解什么?

每周趋势

DE vs Agency

DE 占全部 PR 的比例

不同仓库对比

AdoAnalysis Dashboard

它的价值主要是:

  1. 量化产出:统计 AI Agent 实际完成的 PR 数量。
  2. 观察趋势:识别采用量增长、下降或异常。
  3. 比较系统:比较 DigitalEmployee 与 Agency 的贡献。
  4. 衡量占比:计算 DigitalEmployee 在全部已完成 PR 中的份额。
  5. 支持汇报:将原始 PR 数据变成直观图表。

整体架构

config.json

fetch.js

az login

AzureCliCredential

ADO Access Token

Identity API
解析 Bot 身份

Pull Request API

本地月度分片缓存

按周聚合

data/repos/repo/weekly.json

data/weekly.json

serve.js
静态 HTTP 服务

index.html

de-share.html

ECharts 趋势图与饼图

DE 占比图与明细表


配置如何工作

配置文件是 config.json。

config.json

repositories

snrcode

msnews-experiences

creators

DigitalEmployee

Agency

时间范围

since

until

totalsLookbackDays

获取策略

pageSize

requestsPerMinute

fetchTotals

仓库配置

{
  "key": "snrcode",
  "organization": "msasg",
  "project": "Bing_UX",
  "repository": "snrcode"
}

每个仓库会成为页面上的一个 Tab。

Creator 配置

{
  "key": "DigitalEmployee",
  "id": "...",
  "color": "#d62728"
}
  • id:ADO Identity GUID
  • key:最终 JSON 中的 series 名称
  • color:图表颜色

数据怎么抓取

运行:

cd AdoAnalysis
npm install
az login
npm run fetch
本地 data/ADO PR APIADO Identity APIAzure CLIfetch.js用户本地 data/ADO PR APIADO Identity APIAzure CLIfetch.js用户loop[每个仓库和 Creator]az loginnpm run fetch获取 ADO Token查询 Bot IdentityIdentity GUID分页查询 PRPR 列表保存月度分片按周聚合写入 weekly.json

为什么不用 PAT

它使用 AzureCliCredential

你的企业账号

az login

短期访问令牌

fetch.js

Azure DevOps API

优点:

  • 不在代码或配置中保存密码
  • 不保存 PAT
  • Token 自动刷新
  • 权限继承自当前登录账号

为什么按月缓存

如果每次都从头请求全部 PR,会很慢,也容易触发 ADO 限流。

因此 fetch.js 将原始 PR 按月份保存:

data/repos/snrcode/raw-prs/
├── creators/
│   ├── DigitalEmployee/
│   │   ├── 2026-05.json
│   │   └── 2026-06.json
│   └── Agency/
└── totals/
    ├── 2026-05.json
    └── 2026-06.json

再次运行 fetch

月份已有完整缓存?

复用历史分片

只获取缺失时间段

检查缓存中的未关闭 PR

按冷却时间刷新未关闭 PR

重新聚合

这种设计称为增量抓取

  • 已完整抓取的历史月份直接复用
  • 只补充新时间段
  • 定期刷新之前仍为 Open 的 PR
  • 根据 PR ID 去重

分页与限流

ADO API 一次不能返回无限数量的 PR,因此脚本使用分页请求。

第 1 页
200 条

Continuation Token

第 2 页
200 条

Continuation Token

直到没有下一页

配置中:

{
  "pageSize": 200,
  "requestsPerMinute": 120
}

RateLimiter 保证任意滚动 60 秒内不超过配置的请求数量,避免被 ADO 限流。


如何按周统计

fetch.js 将 PR 的 closedDate 转换到对应周,周一作为起始日,使用 UTC。

已完成 PR

读取 closedDate

计算所在周的周一 UTC

按 Creator 计数

仓库全部 PR 计数

Weekly Series

最终数据大致类似:

{
  "weeks": ["2026-05-18", "2026-05-25"],
  "series": {
    "DigitalEmployee": [12, 18],
    "Agency": [8, 9],
    "Total": [120, 135]
  }
}

两个网页分别看什么

Bot Activity Dashboard

入口:

http://localhost:5173/

data/weekly.json

仓库 Tabs

每周完成 PR 折线图

最近周期贡献饼图

DigitalEmployee

Agency

DE

Agency

其他贡献者

它主要回答:

DE 和 Agency 每周分别完成了多少 PR?

DE Share Dashboard

入口:

http://localhost:5173/web/de-share.html

选择起始周和结束周

统计区间数据

DE completed PRs

All completed PRs

DE / Total

折线/柱状组合图

每周明细表

计算公式:

DE Share=DE 完成的 PR 数仓库全部完成的 PR 数×100% \text{DE Share} = \frac{\text{DE 完成的 PR 数}}{\text{仓库全部完成的 PR 数}} \times 100\% DE Share=仓库全部完成的 PR DE 完成的 PR ×100%

例如:

  • DE 完成 25 个
  • 仓库总共完成 200 个

DE Share=25200×100%=12.5% \text{DE Share} = \frac{25}{200} \times 100\% = 12.5\% DE Share=20025×100%=12.5%


为什么需要本地 HTTP Server

网页通过 JavaScript 加载:

../data/weekly.json

浏览器直接打开 file://.../index.html 时,通常会阻止读取本地 JSON。

所以使用 serve.js:

npm run serve

浏览器

localhost:5173

web/index.html

data/weekly.json

fetch JSON

ECharts 图表

这个 Server 很简单,只负责读取静态文件并设置正确的 MIME 类型,不负责查询 ADO。


怎么使用

npm install

az login

npm run fetch

生成 data/weekly.json

npm run serve

打开 localhost:5173

命令:

cd AdoAnalysis
npm install
az login
npm run fetch
npm run serve

浏览:

http://localhost:5173/
http://localhost:5173/web/de-share.html

如果修改了:

  • 时间范围
  • 仓库
  • Creator
  • 统计状态

则重新执行:

npm run fetch

页面刷新后读取新数据。


数据边界

需要注意:

  • 它统计的是 ADO PR,不是 GitHub PR。
  • 每周数据以 UTC 周一为起点。
  • Creator PR 是通过 ADO Identity 过滤的。
  • Total 只在 fetchTotals=true 时生成。
  • DE Share 的分母是仓库所有已完成 PR。
  • 图表完全依赖最后一次 npm run fetch 生成的数据,不会自动实时查询 ADO。

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/2301_80171004/article/details/163637296

文章来源crawl

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--