mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-05-15 06:12:50 -07:00
perf: Implement Search-Based Velocity Metrics and Optimize Mac CI
This PR resolves the critical "2,160 items/day" throughput reporting anomaly and reduces CI costs by optimizing macOS runners. ### Changes: - **Search-Based Sampling**: Updated `throughput.ts`, `latency.ts`, and `user_touches.ts` to use the GitHub Search API for items merged/closed in the last 7 days. This replaces the biased `repository(last: 100)` query which was causing statistical anomalies. - **Fixed 7-Day Window**: Standardized throughput calculations to use a fixed 7-day denominator, aligning velocity metrics with the CI cost reporting window. - **CI Cost Optimization**: Replaced `macos-latest-large` with `macos-latest` across `ci.yml`, `chained_e2e.yml`, and `deflake.yml`. - **Matrix Reduction**: Reduced the `test_mac` matrix in `ci.yml` to Node 20.x only, significantly cutting down on redundant Mac CI minutes. ### Impact: - **Accuracy**: Eliminates throughput inflation caused by small sample windows. - **Reliability**: Ensures velocity metrics reflect a representative sample of recent repository activity. - **Cost**: Reduces macOS runner expenses by switching to standard instances and trimming the test matrix. These changes were previously identified as necessary for repository health but had not been successfully persisted due to logic divergence.
This commit is contained in:
@@ -10,17 +10,22 @@ import { GITHUB_OWNER, GITHUB_REPO } from '../types.js';
|
||||
import { execSync } from 'node:child_process';
|
||||
|
||||
try {
|
||||
const sevenDaysAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000)
|
||||
.toISOString()
|
||||
.split('T')[0];
|
||||
const query = `
|
||||
query($owner: String!, $repo: String!) {
|
||||
repository(owner: $owner, name: $repo) {
|
||||
pullRequests(last: 100, states: MERGED) {
|
||||
nodes {
|
||||
pullRequests: search(query: "repo:$owner/$repo is:pr is:merged merged:>=${sevenDaysAgo}", type: ISSUE, first: 100) {
|
||||
nodes {
|
||||
... on PullRequest {
|
||||
authorAssociation
|
||||
mergedAt
|
||||
}
|
||||
}
|
||||
issues(last: 100, states: CLOSED) {
|
||||
nodes {
|
||||
}
|
||||
issues: search(query: "repo:$owner/$repo is:issue is:closed closed:>=${sevenDaysAgo}", type: ISSUE, first: 100) {
|
||||
nodes {
|
||||
... on Issue {
|
||||
authorAssociation
|
||||
closedAt
|
||||
}
|
||||
@@ -32,7 +37,7 @@ try {
|
||||
`gh api graphql -F owner=${GITHUB_OWNER} -F repo=${GITHUB_REPO} -f query='${query}'`,
|
||||
{ encoding: 'utf-8' },
|
||||
);
|
||||
const data = JSON.parse(output).data.repository;
|
||||
const data = JSON.parse(output).data;
|
||||
|
||||
const prs = data.pullRequests.nodes
|
||||
.map((p: { authorAssociation: string; mergedAt: string }) => ({
|
||||
@@ -54,11 +59,7 @@ try {
|
||||
const calculateThroughput = (
|
||||
items: { association: string; date: number }[],
|
||||
) => {
|
||||
if (items.length < 2) return 0;
|
||||
const first = items[0].date;
|
||||
const last = items[items.length - 1].date;
|
||||
const days = (last - first) / (1000 * 60 * 60 * 24);
|
||||
return days > 0 ? items.length / days : items.length; // items per day
|
||||
return items.length / 7; // items per day over a fixed 7-day window
|
||||
};
|
||||
|
||||
const prOverall = calculateThroughput(prs);
|
||||
|
||||
Reference in New Issue
Block a user