enhance: split PR created vs merged metrics for accuracy

- Add separate steps for PR created metrics and PR merged metrics
- Query PRs by merge date for more accurate merge timing data
- Parse both pr_created_metrics.md and pr_merged_metrics.md files
- Maintain backward compatibility with fallback to old pr_metrics.md
- Fixes timing discrepancy where merge time was faster than response time
This commit is contained in:
Ralph Khreish
2025-09-22 15:26:06 +02:00
parent 6c54a2821d
commit d38b470572
2 changed files with 44 additions and 18 deletions

View File

@@ -73,30 +73,49 @@ function main() {
console.log('⚠️ No issue_metrics.md found');
}
// Parse PR metrics
if (existsSync('pr_metrics.md')) {
console.log('📄 Found pr_metrics.md, parsing...');
const prContent = readFileSync('pr_metrics.md', 'utf8');
// Parse PR created metrics
if (existsSync('pr_created_metrics.md')) {
console.log('📄 Found pr_created_metrics.md, parsing...');
const prCreatedContent = readFileSync('pr_created_metrics.md', 'utf8');
metrics.prs_created = parseCountMetric(
prContent,
prCreatedContent,
'Total number of items created'
);
// Prefer merged; fall back to closed if the generator doesn't emit "merged"
metrics.pr_avg_first_response = parseMetricsTable(
prCreatedContent,
'Time to first response'
);
} else {
console.log('⚠️ No pr_created_metrics.md found');
}
// Parse PR merged metrics (for more accurate merge data)
if (existsSync('pr_merged_metrics.md')) {
console.log('📄 Found pr_merged_metrics.md, parsing...');
const prMergedContent = readFileSync('pr_merged_metrics.md', 'utf8');
metrics.prs_merged = parseCountMetric(
prMergedContent,
'Total number of items created'
);
// For merged PRs, "Time to close" is actually time to merge
metrics.pr_avg_merge_time = parseMetricsTable(prMergedContent, 'Time to close');
} else {
console.log('⚠️ No pr_merged_metrics.md found');
// Fallback: try old pr_metrics.md if it exists
if (existsSync('pr_metrics.md')) {
console.log('📄 Falling back to pr_metrics.md...');
const prContent = readFileSync('pr_metrics.md', 'utf8');
const mergedCount = parseCountMetric(prContent, 'Number of items merged');
metrics.prs_merged = mergedCount || parseCountMetric(prContent, 'Number of items closed');
metrics.pr_avg_first_response = parseMetricsTable(
prContent,
'Time to first response'
);
// Prefer "Average time to merge"; fall back to "Time to close"
const maybeMergeTime = parseMetricsTable(prContent, 'Average time to merge');
metrics.pr_avg_merge_time = maybeMergeTime !== 'N/A'
? maybeMergeTime
: parseMetricsTable(prContent, 'Time to close');
} else {
console.log('⚠️ No pr_metrics.md found');
}
}
// Output for GitHub Actions

View File

@@ -46,12 +46,19 @@ jobs:
HIDE_LABEL_METRICS: false
OUTPUT_FILE: issue_metrics.md
- name: Generate PR metrics
- name: Generate PR created metrics
uses: github/issue-metrics@v3
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SEARCH_QUERY: "repo:${{ github.repository }} is:pr created:${{ env.first_day }}..${{ env.last_day }}"
OUTPUT_FILE: pr_metrics.md
OUTPUT_FILE: pr_created_metrics.md
- name: Generate PR merged metrics
uses: github/issue-metrics@v3
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SEARCH_QUERY: "repo:${{ github.repository }} is:pr is:merged merged:${{ env.first_day }}..${{ env.last_day }}"
OUTPUT_FILE: pr_merged_metrics.md
- name: Parse metrics
id: metrics