Skip to content

Commit d6e5c1f

Browse files
committed
Export a CSV summary of SLO status in addition to the JSON summary.
Also include the time the repository was crawled in the summaries.
1 parent 06fdba0 commit d6e5c1f

File tree

6 files changed

+47
-9
lines changed

6 files changed

+47
-9
lines changed

frontend/src/pages/[org]/[repo].json.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { RepoSummary } from "@lib/repo-summaries";
12
import { groupBySlo } from "@lib/slo";
23
import type {
34
APIRoute,
@@ -10,7 +11,7 @@ export const getStaticPaths = (async () => {
1011
const repos = await getCollection("github")
1112
return repos.map((repo) => ({
1213
params: { org: repo.data.org, repo: repo.data.repo },
13-
props: { details: repo.data },
14+
props: { details: RepoSummary.parse(repo.data) },
1415
}));
1516
}) satisfies GetStaticPaths;
1617

@@ -21,6 +22,7 @@ export const GET: APIRoute = ({ props }) => {
2122
const groups = groupBySlo(details.issues);
2223
return new Response(
2324
JSON.stringify({
25+
retrieved: details.cachedAt,
2426
triageViolations: groups.triageViolations.length,
2527
urgentViolations: groups.urgentViolations.length,
2628
importantViolations: groups.importantViolations.length,

frontend/src/pages/slo.csv.ts

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { RepoSummary } from '@lib/repo-summaries';
2+
import { groupBySlo } from '@lib/slo';
3+
import type { APIRoute } from 'astro';
4+
import { getCollection } from 'astro:content';
5+
import { stringify } from 'csv-stringify/sync';
6+
7+
export const GET: APIRoute = async () => {
8+
const repos = await getCollection("github");
9+
10+
const repoSummaries = repos.map((repo) => {
11+
const repoData = RepoSummary.parse(repo.data);
12+
const groups = groupBySlo(repoData.issues);
13+
14+
return {
15+
Repository: repo.id,
16+
Retrieved: repoData.cachedAt.round("second").toString(),
17+
'Need Triage': groups.untriaged.length,
18+
'Triage Violations': groups.triageViolations.length,
19+
Urgent: groups.urgent.length,
20+
'Urgent Violations': groups.urgentViolations.length,
21+
Important: groups.important.length,
22+
'Important Violations': groups.importantViolations.length,
23+
Other: groups.other.length,
24+
};
25+
});
26+
27+
return new Response(stringify(repoSummaries, { header: true }));
28+
};

frontend/src/pages/slo.json.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { RepoSummary } from '@lib/repo-summaries';
12
import { groupBySlo } from '@lib/slo';
23
import type { APIRoute } from 'astro';
34
import { getCollection } from 'astro:content';
@@ -6,7 +7,7 @@ export const GET: APIRoute = async () => {
67
const repos = await getCollection("github");
78

89
const repoSummaries = Object.fromEntries(repos.map((repo) => {
9-
const groups = groupBySlo(repo.data.issues);
10+
const groups = groupBySlo(RepoSummary.parse(repo.data).issues);
1011

1112
return [repo.id, {
1213
triageViolations: groups.triageViolations.length,

package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,10 @@
2121
"@octokit/plugin-throttling": "^8.1.2",
2222
"@octokit/request-error": "^5.0.1",
2323
"astro": "^3.2.4",
24-
"browser-specs": "^3.68.0",
24+
"browser-specs": "^3.70.0",
2525
"colorjs.io": "^0.4.5",
2626
"commander": "^11.1.0",
27+
"csv-stringify": "^6.4.4",
2728
"node-fetch": "^3.3.2",
2829
"simple-statistics": "^7.8.3",
2930
"zod": "^3.22.4"

pnpm-lock.yaml

+11-4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

scanner/main.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -346,8 +346,6 @@ async function logRateLimit() {
346346
}`)));
347347
}
348348

349-
const now = Temporal.Now.instant().round('second');
350-
351349
interface GlobalStatsInput {
352350
totalRepos: number,
353351
reposFinished: number;
@@ -443,6 +441,7 @@ function countSloTime(issue, now: Temporal.Instant): Temporal.Duration {
443441
}
444442

445443
async function analyzeRepo(org: string, repoName: string, globalStats: GlobalStatsInput): Promise<RepoSummary> {
444+
const now = Temporal.Now.instant().round("second");
446445
let result: RepoSummary | null = null;
447446
try {
448447
result = JSON.parse(await fs.readFile(`${config.outDir}/${org}/${repoName}.json`, { encoding: 'utf8' }),

0 commit comments

Comments
 (0)