Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[sitecore-jss][Next.js] Introduce performance metrics for debug logging #1555

Merged
merged 3 commits into from
Jul 13, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ Our versioning strategy is as follows:

### 🎉 New Features & Improvements

* `[sitecore-jss]` `[sitecore-jss-nextjs]` `[templates/nextjs]` Introduce performance metrics for debug logging ([#1555](https://github.com/Sitecore/jss/pull/1555))
* `[templates/nextjs]` `[templates/react]` `[templates/vue]` `[templates/angular]` Introduce layout service REST configuration name environment variable ([#1543](https://github.com/Sitecore/jss/pull/1543))
* `[templates/nextjs]` `[sitecore-jss-nextjs]` Support for out-of-process editing data caches was added. Vercel KV or a custom Redis cache can be used to improve editing in Pages and Experience Editor when using Vercel deployment as editing/rendering host ([#1530](https://github.com/Sitecore/jss/pull/1530))

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { NextResponse } from 'next/server';
import type { NextFetchEvent, NextRequest } from 'next/server';
import { debug } from '@sitecore-jss/sitecore-jss-nextjs/middleware';
import * as plugins from 'temp/middleware-plugins';

export interface MiddlewarePlugin {
Expand All @@ -19,7 +20,15 @@ export default async function middleware(
): Promise<NextResponse> {
const response = NextResponse.next();

return (Object.values(plugins) as MiddlewarePlugin[])
debug.common('next middleware start');
ambrauer marked this conversation as resolved.
Show resolved Hide resolved

const start = Date.now();

const finalRes = await (Object.values(plugins) as MiddlewarePlugin[])
.sort((p1, p2) => p1.order - p2.order)
.reduce((p, plugin) => p.then((res) => plugin.exec(req, res, ev)), Promise.resolve(response));

debug.common('next middleware end in %dms', Date.now() - start);

return finalRes;
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { GetServerSidePropsContext, GetStaticPropsContext } from 'next';
import { debug } from '@sitecore-jss/sitecore-jss-nextjs';
import { SitecorePageProps } from 'lib/page-props';
import * as plugins from 'temp/page-props-factory-plugins';

Expand Down Expand Up @@ -35,6 +36,9 @@ export class SitecorePagePropsFactory {
public async create(
context: GetServerSidePropsContext | GetStaticPropsContext
): Promise<SitecorePageProps> {
const startTimestamp = Date.now();
debug.common('page-props-factory start');

const extendedProps = await (Object.values(plugins) as Plugin[])
.sort((p1, p2) => p1.order - p2.order)
.reduce(async (result, plugin) => {
Expand All @@ -43,6 +47,8 @@ export class SitecorePagePropsFactory {
return newProps;
}, Promise.resolve({} as SitecorePageProps));

debug.common('page-props-factory end in %dms', Date.now() - startTimestamp);

return extendedProps;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,8 @@ export class EditingRenderMiddleware {
private handler = async (req: NextApiRequest, res: NextApiResponse): Promise<void> => {
const { method, query, body, headers } = req;

const startTimestamp = Date.now();

debug.editing('editing render middleware start: %o', {
method,
query,
Expand Down Expand Up @@ -172,7 +174,10 @@ export class EditingRenderMiddleware {
const body = { html };

// Return expected JSON result
debug.editing('editing render middleware end: %o', { status: 200, body });
debug.editing('editing render middleware end in %dms: %o', Date.now() - startTimestamp, {
status: 200,
body,
});
res.status(200).json(body);
} catch (err) {
const error = err as Record<string, unknown>;
Expand Down
1 change: 1 addition & 0 deletions packages/sitecore-jss-nextjs/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ export {
NativeDataFetcherConfig,
HTMLLink,
enableDebug,
debug,
} from '@sitecore-jss/sitecore-jss';

// we will remove the root exports for these later
Expand Down
1 change: 1 addition & 0 deletions packages/sitecore-jss-nextjs/src/middleware/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export { debug } from '@sitecore-jss/sitecore-jss';
export { RedirectsMiddleware, RedirectsMiddlewareConfig } from './redirects-middleware';
export { PersonalizeMiddleware, PersonalizeMiddlewareConfig } from './personalize-middleware';
export { MultisiteMiddleware, MultisiteMiddlewareConfig } from './multisite-middleware';
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@ describe('MultisiteMiddleware', () => {
const debugSpy = spy(debug, 'multisite');
const validateDebugLog = (message, ...params) =>
expect(debugSpy.args.find((log) => log[0] === message)).to.deep.equal([message, ...params]);
const validateEndMessageDebugLog = (message, params) => {
const logParams = debugSpy.args.find((log) => log[0] === message) as Array<unknown>;

expect(logParams[2]).to.deep.equal(params);
};

const siteName = 'foo';

Expand Down Expand Up @@ -235,7 +240,7 @@ describe('MultisiteMiddleware', () => {
hostname: 'bar.net',
});

validateDebugLog('multisite middleware end: %o', {
validateEndMessageDebugLog('multisite middleware end in %dms: %o', {
rewritePath: '/_site_foo/styleguide',
siteName: 'foo',
headers: {
Expand Down Expand Up @@ -276,7 +281,7 @@ describe('MultisiteMiddleware', () => {
hostname: 'localhost',
});

validateDebugLog('multisite middleware end: %o', {
validateEndMessageDebugLog('multisite middleware end in %dms: %o', {
rewritePath: '/_site_foo/styleguide',
siteName: 'foo',
headers: {
Expand Down Expand Up @@ -315,7 +320,7 @@ describe('MultisiteMiddleware', () => {
hostname: 'foo.net',
});

validateDebugLog('multisite middleware end: %o', {
validateEndMessageDebugLog('multisite middleware end in %dms: %o', {
rewritePath: '/_site_foo/styleguide',
siteName: 'foo',
headers: {
Expand Down Expand Up @@ -354,7 +359,7 @@ describe('MultisiteMiddleware', () => {
hostname: 'foo.net',
});

validateDebugLog('multisite middleware end: %o', {
validateEndMessageDebugLog('multisite middleware end in %dms: %o', {
rewritePath: '/_site_foo/styleguide',
siteName: 'foo',
headers: {
Expand Down Expand Up @@ -397,7 +402,7 @@ describe('MultisiteMiddleware', () => {
hostname: 'foo.net',
});

validateDebugLog('multisite middleware end: %o', {
validateEndMessageDebugLog('multisite middleware end in %dms: %o', {
rewritePath: '/_site_qsFoo/styleguide',
siteName: 'qsFoo',
headers: {
Expand Down Expand Up @@ -441,7 +446,7 @@ describe('MultisiteMiddleware', () => {
hostname: 'foo.net',
});

validateDebugLog('multisite middleware end: %o', {
validateEndMessageDebugLog('multisite middleware end in %dms: %o', {
rewritePath: '/_site_foobar/styleguide',
siteName: 'foobar',
headers: {
Expand Down Expand Up @@ -483,7 +488,7 @@ describe('MultisiteMiddleware', () => {
hostname: 'foo.net',
});

validateDebugLog('multisite middleware end: %o', {
validateEndMessageDebugLog('multisite middleware end in %dms: %o', {
rewritePath: '/_site_foo/styleguide',
siteName: 'foo',
headers: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ export class MultisiteMiddleware extends MiddlewareBase {
const pathname = req.nextUrl.pathname;
const language = this.getLanguage(req);
const hostname = this.getHostHeader(req) || this.defaultHostname;
const startTimestamp = Date.now();

debug.multisite('multisite middleware start: %o', {
pathname,
Expand Down Expand Up @@ -82,7 +83,7 @@ export class MultisiteMiddleware extends MiddlewareBase {
// Share rewrite path with following executed middlewares
response.headers.set('x-sc-rewrite', rewritePath);

debug.multisite('multisite middleware end: %o', {
debug.multisite('multisite middleware end in %dms: %o', Date.now() - startTimestamp, {
rewritePath,
siteName,
headers: this.extractDebugHeaders(response.headers),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@ describe('PersonalizeMiddleware', () => {
const debugSpy = spy(debug, 'personalize');
const validateDebugLog = (message, ...params) =>
expect(debugSpy.args.find((log) => log[0] === message)).to.deep.equal([message, ...params]);
const validateEndMessageDebugLog = (message, params) => {
const logParams = debugSpy.args.find((log) => log[0] === message) as Array<unknown>;

expect(logParams[2]).to.deep.equal(params);
};

const hostname = 'foo.net';
const siteName = 'bar';
Expand Down Expand Up @@ -608,7 +613,7 @@ describe('PersonalizeMiddleware', () => {
expect(executeExperience.calledWith(contentId, browserId, ua, pointOfSale, experienceParams))
.to.be.true;

validateDebugLog('personalize middleware end: %o', {
validateEndMessageDebugLog('personalize middleware end in %dms: %o', {
rewritePath: '/_variantId_variant-2/styleguide',
browserId: 'browser-id',
headers: {
Expand Down Expand Up @@ -670,7 +675,7 @@ describe('PersonalizeMiddleware', () => {
expect(executeExperience.calledWith(contentId, browserId, ua, pointOfSale, experienceParams))
.to.be.true;

validateDebugLog('personalize middleware end: %o', {
validateEndMessageDebugLog('personalize middleware end in %dms: %o', {
rewritePath: '/_variantId_variant-2/styleguide',
browserId: 'browser-id',
headers: {
Expand Down Expand Up @@ -731,7 +736,7 @@ describe('PersonalizeMiddleware', () => {
expect(executeExperience.calledWith(contentId, browserId, ua, pointOfSale, experienceParams))
.to.be.true;

validateDebugLog('personalize middleware end: %o', {
validateEndMessageDebugLog('personalize middleware end in %dms: %o', {
rewritePath: '/_variantId_variant-2/styleguide',
browserId: 'browser-id',
headers: {
Expand Down Expand Up @@ -785,7 +790,7 @@ describe('PersonalizeMiddleware', () => {
expect(executeExperience.calledWith(contentId, browserId, ua, pointOfSale, experienceParams))
.to.be.true;

validateDebugLog('personalize middleware end: %o', {
validateEndMessageDebugLog('personalize middleware end in %dms: %o', {
rewritePath: '/_variantId_variant-2/styleguide',
browserId: 'browser-id',
headers: {
Expand Down Expand Up @@ -834,7 +839,7 @@ describe('PersonalizeMiddleware', () => {
language: 'en',
});

validateDebugLog('personalize middleware end: %o', {
validateEndMessageDebugLog('personalize middleware end in %dms: %o', {
rewritePath: '/_variantId_variant-2/styleguide',
browserId: 'browser-id',
headers: {
Expand Down Expand Up @@ -894,7 +899,7 @@ describe('PersonalizeMiddleware', () => {
})
).to.be.true;

validateDebugLog('personalize middleware end: %o', {
validateEndMessageDebugLog('personalize middleware end in %dms: %o', {
rewritePath: '/_variantId_variant-2/styleguide',
browserId: 'browser-id',
headers: {
Expand Down Expand Up @@ -947,7 +952,7 @@ describe('PersonalizeMiddleware', () => {
expect(executeExperience.calledWith(contentId, browserId, ua, pointOfSale, experienceParams))
.to.be.true;

validateDebugLog('personalize middleware end: %o', {
validateEndMessageDebugLog('personalize middleware end in %dms: %o', {
rewritePath: '/_variantId_variant-2/styleguide',
browserId: 'browser-id',
headers: {
Expand Down Expand Up @@ -1000,7 +1005,7 @@ describe('PersonalizeMiddleware', () => {
expect(executeExperience.calledWith(contentId, browserId, ua, pointOfSale, experienceParams))
.to.be.true;

validateDebugLog('personalize middleware end: %o', {
validateEndMessageDebugLog('personalize middleware end in %dms: %o', {
rewritePath: '/_variantId_variant-2/_site_nextjs-app/styleguide',
browserId: 'browser-id',
headers: {
Expand Down Expand Up @@ -1052,7 +1057,7 @@ describe('PersonalizeMiddleware', () => {
expect(executeExperience.calledWith(contentId, browserId, ua, pointOfSale, experienceParams))
.to.be.true;

validateDebugLog('personalize middleware end: %o', {
validateEndMessageDebugLog('personalize middleware end in %dms: %o', {
rewritePath: '/_variantId_variant-2/styleguide',
browserId: 'browser-id',
headers: {
Expand Down Expand Up @@ -1105,7 +1110,7 @@ describe('PersonalizeMiddleware', () => {
expect(executeExperience.calledWith(contentId, browserId, ua, pointOfSale, experienceParams))
.to.be.true;

validateDebugLog('personalize middleware end: %o', {
validateEndMessageDebugLog('personalize middleware end in %dms: %o', {
rewritePath: '/_variantId_variant-2/styleguide',
browserId: 'browser-id',
headers: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ export class PersonalizeMiddleware extends MiddlewareBase {
const pathname = req.nextUrl.pathname;
const language = this.getLanguage(req);
const hostname = this.getHostHeader(req) || this.defaultHostname;
const startTimestamp = Date.now();

let browserId = this.getBrowserId(req);
debug.personalize('personalize middleware start: %o', {
Expand Down Expand Up @@ -222,7 +223,7 @@ export class PersonalizeMiddleware extends MiddlewareBase {
// Share site name with the following executed middlewares
response.cookies.set(this.SITE_SYMBOL, site.name);

debug.personalize('personalize middleware end: %o', {
debug.personalize('personalize middleware end in %dms: %o', Date.now() - startTimestamp, {
rewritePath,
browserId,
headers: this.extractDebugHeaders(response.headers),
Expand Down
Loading