I have seen others having relatively minor performance problems with puppeteer running on Firebase Functions. In my case, Firebase times out before I can do anything with puppeteer, even with the memory and timeoutSeconds cranked all the way up.
Code:
import * as functions from "firebase-functions";
import puppeteer from "puppeteer";
const runScreenshot = async () => {
console.log("Launching puppeteer...");
console.time("launch");
const browser = await puppeteer.launch();
console.timeEnd("launch");
console.log("Awaiting browser.newPage()...");
console.time("newPage");
const page = await browser.newPage();
console.timeEnd("newPage");
console.log("Setting viewport...");
console.time("setViewport");
page.setViewport({ width: 2000, height: 4000, deviceScaleFactor: 4 });
console.timeEnd("setViewport");
console.log("Goto page...");
console.time("goto");
await page.goto(
"https://public.tableau.com/views/NCDHHS_COVID-19_Dashboard_Summary/NCDHHS_DASHBOARD_SUMMARY"
);
console.timeEnd("goto");
console.log("Waiting for selector...");
console.time("selector");
await page.waitForSelector("#tab-dashboard-region");
console.timeEnd("selector");
// Wait for the spinner to go away
await new Promise((r) => setTimeout(r, 100));
console.time("href");
const href = await page.$("#tab-dashboard-region");
console.timeEnd("href");
console.time("screenshot");
href && (await href.screenshot({ path: "tmp/test.png" }));
console.timeEnd("screenshot");
return browser.close();
};
export const screenshot = functions
.runWith({ memory: "2GB", timeoutSeconds: 540 })
.pubsub.schedule("44 21 * * *")
.timeZone("America/New_York")
.onRun(() => {
return runScreenshot();
});
Here’s the resulting Firebase Functions log. It takes a few seconds to run puppeteer.launch(), and then browser.newPage() won’t finish at all in the 8 minutes it has before the timeout.
9:44:04.012 PM screenshot Function execution started 9:44:04.555 PM screenshot Launching puppeteer... 9:44:09.427 PM screenshot launch: 4870.195ms 9:44:09.427 PM screenshot Awaiting browser.newPage()... 9:53:04.014 PM screenshot Function execution took 540004 ms, finished with status: 'timeout'
Complete reproducible example: https://github.com/danbockapps/firebase-puppeteer
Advertisement
Answer
I fixed this by adding {args: [ '--no-sandbox', '--disable-setuid-sandbox']} to puppeteer.launch, as recommended here: https://github.com/puppeteer/puppeteer/issues/6568