index.js (26 lines of code) (raw):

import { SitespeedioPlugin } from "@sitespeed.io/plugin"; export default class GitLabExporterPlugin extends SitespeedioPlugin { constructor(options, context, queue) { super({ name: "gitlab-exporter", options, context, queue }); this.results = []; } async processMessage(message) { const storageManager = super.getStorageManager(); const metrics = []; switch (message.type) { case "coach.pageSummary": metrics.push({ name: "Total Score", value: message.data.advice.performance.score, desiredSize: "larger", }); metrics.push({ name: "Requests", value: message.data.advice.info.pageRequests, desiredSize: "smaller", }); break; case "pagexray.pageSummary": metrics.push({ name: "Transfer Size (KB)", value: (message.data.transferSize / 1024).toFixed(1), desiredSize: "smaller", }); break; case "browsertime.pageSummary": metrics.push({ name: "Speed Index", value: message.data.statistics.visualMetrics.SpeedIndex.p90, desiredSize: "smaller", }); metrics.push({ name: "First Contentful Paint", value: message.data.statistics.timings.paintTiming[ "first-contentful-paint" ].p90, desiredSize: "smaller", }); metrics.push({ name: "Largest Contentful Paint", value: message.data.statistics.timings.largestContentfulPaint.renderTime .p90, desiredSize: "smaller", }); if ("cpu" in message.data.statistics) { metrics.push({ name: "Total Blocking Time", value: message.data.statistics.cpu.longTasks.totalBlockingTime.p90, desiredSize: "smaller", }); } break; case "sitespeedio.render": storageManager .writeData(JSON.stringify(this.results), "performance.json") .catch((err) => { super.log(`Error writing 'performance.json': ${err}`, "error"); }); break; default: return; } if (message.url) { const urlPath = new URL(message.url); this.pushMetrics(this.results, urlPath.pathname, metrics); } } pushMetrics(results, subject, metrics) { for (var i = 0; i < results.length; i++) { if (results[i].subject === subject) { results[i].metrics.push(...metrics); return; } } results.push({ subject: subject, metrics: metrics, }); } }