The open and composable observability and data visualization platform. Visualize metrics, logs, and traces from multiple sources like Prometheus, Loki, Elasticsearch, InfluxDB, Postgres and many more.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
grafana/scripts/cli/bettererResultsToJson.ts

53 lines
1.9 KiB

import { betterer } from '@betterer/betterer';
import { writeFile } from 'fs/promises';
interface FilesByIssues {
name: string;
files: [
{
path: string;
count: number;
},
];
}
type ResultMap = Record<string, FilesByIssues[]>;
/**
* Produces a JSON file for consumption directly in Grafana
*/
async function main() {
const results = await betterer.results();
const resultMap: ResultMap = {};
for (const suite of results.resultSummaries) {
resultMap[suite.name] = [];
const filesByIssues: FilesByIssues[] = [];
// Group by message in the suite, then by file counting the number of occurrences
for (const [file, details] of Object.entries(suite.details)) {
const relativePath = file.replace(process.cwd(), '');
details.forEach((element) => {
const messageExist = filesByIssues.some((issue) => issue.name === element.message);
// If the message does not exist, add it to the list of issues
// With the file and start the count at 1
if (!messageExist) {
const name: FilesByIssues['name'] = element.message;
filesByIssues.push({ name, files: [{ path: relativePath, count: 1 }] });
} else {
//If it exists, check if there is a file with the same path
//If so, increment the count, if not, add the file to the list starting the count at 1
const issue = filesByIssues.find((issue) => issue.name === element.message);
if (issue?.files.find((file) => file.path === relativePath)?.count !== undefined) {
issue.files.find((file) => file.path === relativePath)!.count++;
} else {
issue?.files.push({ path: relativePath, count: 1 });
}
}
});
resultMap[suite.name] = filesByIssues;
}
}
await writeFile('.betterer.results.json', JSON.stringify(resultMap, undefined, 2));
}
main().catch(console.error);