Add cluster/tab to unfurler logs
This commit is contained in:
parent
7f2a459575
commit
ed9d31686e
@ -17,6 +17,7 @@ export interface RepairablePage extends puppeteer.Page {
|
|||||||
createdAt?: number;
|
createdAt?: number;
|
||||||
free?: boolean;
|
free?: boolean;
|
||||||
index?: number;
|
index?: number;
|
||||||
|
clusterGroup?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ResourceData {
|
interface ResourceData {
|
||||||
@ -76,7 +77,7 @@ export default class ReusablePage extends ConcurrencyImplementation {
|
|||||||
for (let i = 0; i < maxConcurrency; i++) {
|
for (let i = 0; i < maxConcurrency; i++) {
|
||||||
const newPage = await this.initPage();
|
const newPage = await this.initPage();
|
||||||
newPage.index = this.pages.length;
|
newPage.index = this.pages.length;
|
||||||
logger.info(`initialized page ${newPage.index}`);
|
logger.info(`initialized page ${newPage.clusterGroup}:${newPage.index}`);
|
||||||
this.pages.push(newPage);
|
this.pages.push(newPage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -87,6 +88,7 @@ export default class ReusablePage extends ConcurrencyImplementation {
|
|||||||
|
|
||||||
protected async initPage(): Promise<RepairablePage> {
|
protected async initPage(): Promise<RepairablePage> {
|
||||||
const page = await (this.browser as puppeteer.Browser).newPage() as RepairablePage;
|
const page = await (this.browser as puppeteer.Browser).newPage() as RepairablePage;
|
||||||
|
page.clusterGroup = 'unfurler';
|
||||||
page.language = null;
|
page.language = null;
|
||||||
page.createdAt = Date.now();
|
page.createdAt = Date.now();
|
||||||
let defaultUrl
|
let defaultUrl
|
||||||
@ -129,6 +131,7 @@ export default class ReusablePage extends ConcurrencyImplementation {
|
|||||||
|
|
||||||
protected async repairPage(page) {
|
protected async repairPage(page) {
|
||||||
// create a new page
|
// create a new page
|
||||||
|
logger.debug(`Repairing page ${page.clusterGroup}:${page.index}`);
|
||||||
const newPage = await this.initPage();
|
const newPage = await this.initPage();
|
||||||
newPage.free = true;
|
newPage.free = true;
|
||||||
// replace the old page
|
// replace the old page
|
||||||
@ -138,7 +141,7 @@ export default class ReusablePage extends ConcurrencyImplementation {
|
|||||||
try {
|
try {
|
||||||
await page.goto('about:blank', {timeout: 200}); // prevents memory leak (maybe?)
|
await page.goto('about:blank', {timeout: 200}); // prevents memory leak (maybe?)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
logger.err('unexpected page repair error');
|
logger.err(`unexpected page repair error ${page.clusterGroup}:${page.index}`);
|
||||||
}
|
}
|
||||||
await page.close();
|
await page.close();
|
||||||
return newPage;
|
return newPage;
|
||||||
|
@ -19,6 +19,7 @@ export default class ReusableSSRPage extends ReusablePage {
|
|||||||
|
|
||||||
protected async initPage(): Promise<RepairablePage> {
|
protected async initPage(): Promise<RepairablePage> {
|
||||||
const page = await (this.browser as puppeteer.Browser).newPage() as RepairablePage;
|
const page = await (this.browser as puppeteer.Browser).newPage() as RepairablePage;
|
||||||
|
page.clusterGroup = 'slurper';
|
||||||
page.language = null;
|
page.language = null;
|
||||||
page.createdAt = Date.now();
|
page.createdAt = Date.now();
|
||||||
const defaultUrl = mempoolHost + '/about';
|
const defaultUrl = mempoolHost + '/about';
|
||||||
|
@ -120,8 +120,9 @@ class Server {
|
|||||||
this.app.get('*', (req, res) => { return this.renderHTML(req, res, false) })
|
this.app.get('*', (req, res) => { return this.renderHTML(req, res, false) })
|
||||||
}
|
}
|
||||||
|
|
||||||
async clusterTask({ page, data: { url, path, action } }) {
|
async clusterTask({ page, data: { url, path, action, reqUrl } }) {
|
||||||
try {
|
try {
|
||||||
|
logger.info(`rendering "${reqUrl}" on tab ${page.clusterGroup}:${page.index}`);
|
||||||
const urlParts = parseLanguageUrl(path);
|
const urlParts = parseLanguageUrl(path);
|
||||||
if (page.language !== urlParts.lang) {
|
if (page.language !== urlParts.lang) {
|
||||||
// switch language
|
// switch language
|
||||||
@ -156,20 +157,21 @@ class Server {
|
|||||||
});
|
});
|
||||||
return screenshot;
|
return screenshot;
|
||||||
} else if (success === false) {
|
} else if (success === false) {
|
||||||
logger.warn(`failed to render ${path} for ${action} due to client-side error, e.g. requested an invalid txid`);
|
logger.warn(`failed to render ${reqUrl} for ${action} due to client-side error, e.g. requested an invalid txid`);
|
||||||
page.repairRequested = true;
|
page.repairRequested = true;
|
||||||
} else {
|
} else {
|
||||||
logger.warn(`failed to render ${path} for ${action} due to puppeteer timeout`);
|
logger.warn(`failed to render ${reqUrl} for ${action} due to puppeteer timeout`);
|
||||||
page.repairRequested = true;
|
page.repairRequested = true;
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
logger.err(`failed to render ${path} for ${action}: ` + (e instanceof Error ? e.message : `${e}`));
|
logger.err(`failed to render ${reqUrl} for ${action}: ` + (e instanceof Error ? e.message : `${e}`));
|
||||||
page.repairRequested = true;
|
page.repairRequested = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async ssrClusterTask({ page, data: { url, path, action } }) {
|
async ssrClusterTask({ page, data: { url, path, action, reqUrl } }) {
|
||||||
try {
|
try {
|
||||||
|
logger.info(`slurping "${reqUrl}" on tab ${page.clusterGroup}:${page.index}`);
|
||||||
const urlParts = parseLanguageUrl(path);
|
const urlParts = parseLanguageUrl(path);
|
||||||
if (page.language !== urlParts.lang) {
|
if (page.language !== urlParts.lang) {
|
||||||
// switch language
|
// switch language
|
||||||
@ -207,7 +209,7 @@ class Server {
|
|||||||
let html = await page.content();
|
let html = await page.content();
|
||||||
return html;
|
return html;
|
||||||
} else {
|
} else {
|
||||||
logger.err(`failed to render ${path} for ${action}: ` + (e instanceof Error ? e.message : `${e}`));
|
logger.err(`failed to render ${reqUrl} for ${action}: ` + (e instanceof Error ? e.message : `${e}`));
|
||||||
page.repairRequested = true;
|
page.repairRequested = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -228,8 +230,7 @@ class Server {
|
|||||||
|
|
||||||
// don't bother unless the route is definitely renderable
|
// don't bother unless the route is definitely renderable
|
||||||
if (rawPath.includes('/preview/') && matchedRoute.render) {
|
if (rawPath.includes('/preview/') && matchedRoute.render) {
|
||||||
logger.info('rendering "' + req.url + '"');
|
img = await this.cluster?.execute({ url: this.mempoolHost + rawPath, path: rawPath, action: 'screenshot', reqUrl: req.url });
|
||||||
img = await this.cluster?.execute({ url: this.mempoolHost + rawPath, path: rawPath, action: 'screenshot' });
|
|
||||||
} else {
|
} else {
|
||||||
logger.info('rendering not enabled for page "' + req.url + '"');
|
logger.info('rendering not enabled for page "' + req.url + '"');
|
||||||
}
|
}
|
||||||
@ -277,14 +278,13 @@ class Server {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.info((unfurl ? 'unfurling ' : 'slurping "') + req.url + '"');
|
|
||||||
|
|
||||||
let result = '';
|
let result = '';
|
||||||
try {
|
try {
|
||||||
if (unfurl) {
|
if (unfurl) {
|
||||||
|
logger.info('unfurling "' + req.url + '"');
|
||||||
result = await this.renderUnfurlMeta(rawPath);
|
result = await this.renderUnfurlMeta(rawPath);
|
||||||
} else {
|
} else {
|
||||||
result = await this.renderSEOPage(rawPath);
|
result = await this.renderSEOPage(rawPath, req.url);
|
||||||
}
|
}
|
||||||
if (result && result.length) {
|
if (result && result.length) {
|
||||||
if (result === '404') {
|
if (result === '404') {
|
||||||
@ -338,8 +338,8 @@ class Server {
|
|||||||
</html>`;
|
</html>`;
|
||||||
}
|
}
|
||||||
|
|
||||||
async renderSEOPage(rawPath: string): Promise<string> {
|
async renderSEOPage(rawPath: string, reqUrl: string): Promise<string> {
|
||||||
let html = await this.ssrCluster?.execute({ url: this.mempoolHost + rawPath, path: rawPath, action: 'ssr' });
|
let html = await this.ssrCluster?.execute({ url: this.mempoolHost + rawPath, path: rawPath, action: 'ssr', reqUrl });
|
||||||
// remove javascript to prevent double hydration
|
// remove javascript to prevent double hydration
|
||||||
if (html && html.length) {
|
if (html && html.length) {
|
||||||
html = html.replaceAll(/<script.*<\/script>/g, "");
|
html = html.replaceAll(/<script.*<\/script>/g, "");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user