How to Monitor App Router Next.js Applications with New Relic
Next.js is a powerful JavaScript framework that offers optimized speed and performance for both development and runtime. With the release of Next.js 13, the App Router has become the recommended way to handle routing in Next.js applications. This new router leverages React’s latest features, such as Server Components and Streaming, to offer a more modern and efficient approach to building web applications.
In this blog post, you’ll learn how to set up application performance monitoring for the server side and browser monitoring for the frontend using the new App Router, giving you full-stack observability in your Next.js application. To start, you’ll need a New Relic account and license key, both available for free.
Installing the agent and middleware
Run the following command in your Next.js project to install the New Relic Node.js APM agent and New Relic middleware for Next.js.
npm install newrelic @newrelic/next
After the command completes successfully, you’ll see the dependencies included in your package.json file.
"dependencies": { "@newrelic/next": "^0.10.0", "newrelic": "^11.23.0", "next": "14.2.5", "react": "^18", "react-dom": "^18" },
The @newrelic/next package provides official instrumentation for New Relic monitoring of Next.js applications. It focuses on server-side rendering, middleware, and transaction naming for both page and server requests, ensuring comprehensive observability of server-side activities.
This package is installed separately but integrates seamlessly with the New Relic Node.js agent, offering all the agent's capabilities for enhanced performance monitoring and error tracking in Next.js applications.
While it doesn't cover client-side actions, you can inject the New Relic browser agent for client-side telemetry (more on that later in this blog post).
Configuration
To effectively instrument a Next.js application with New Relic, you need to modify the next.config.js file. This configuration ensures that the modules supported by New Relic are not mangled by webpack, and it externalizes those modules.
Create or update the next.config.js file in your project root with the following content:
'use strict' const nrExternals = require('@newrelic/next/load-externals') module.exports = { experimental: { serverComponentsExternalPackages: ['newrelic'] }, webpack: (config) => { nrExternals(config) return config } }
Next, modify your dev and start npm scripts by amending the scripts section of package.json file. Allow your application to run with Node’s -r option, which will preload @newrelic/next middleware.
"scripts": { "dev": "NODE_OPTIONS='-r @newrelic/next' next", "build": "next build", "start": "NODE_OPTIONS='-r @newrelic/next' next start", "lint": "next lint" }
Before you run your application, add the newrelic.js AMP agent configuration file to the root directory of your project. For more information, see an example config file for your Next.js app.
Additionally, use NEW_RELIC_APP_NAME and NEW_RELIC_LICENSE_KEY in your .env file as shown in an example .env file for your application.
Viewing performance data in New Relic
Run your application and go to the APM page in New Relic. You’ll see your application’s server-side data flowing into New Relic.
Frontend observability
To inject the browser agent when using the App Router, we’ll be editing the app/layout.js(.ts) file.
import Script from 'next/script' import Link from 'next/link' import newrelic from 'newrelic' import './style.css' export default async function RootLayout({ children }) { if (newrelic.agent.collector.isConnected() === false) { await new Promise((resolve) => { newrelic.agent.on("connected", resolve) }) } const browserTimingHeader = newrelic.getBrowserTimingHeader({ hasToRemoveScriptWrapper: true, allowTransactionlessInjection: true, }) return ( <html> <Script id="nr-browser-agent" dangerouslySetInnerHTML={{ __html: browserTimingHeader }} /> <body> <ul className="navbar"> <li><a href="/">Home</a></li> <li><Link href="/users" key={"users"}>Users</Link></li> <li><Link href="/about" key={"about"}>About</Link></li> </ul> {children} </body> </html> ) }
Here are the steps for this process:
- Install the newrelic npm package if you haven’t already with the npm install newrelic @newrelic/next command.
-
Add the newrelic.getBrowserTimingHeader method.
- Pass hasToRemoveScriptWrapper: true as an argument to newrelic.getBrowserTimingHeader so that the browser script is returned without the
Hot AI Tools
Undresser.AI Undress
AI-powered app for creating realistic nude photos
AI Clothes Remover
Online AI tool for removing clothes from photos.
Undress AI Tool
Undress images for free
Clothoff.io
AI clothes remover
Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!
Hot Article
How to fix KB5055523 fails to install in Windows 11?4 weeks ago By DDDHow to fix KB5055518 fails to install in Windows 10?4 weeks ago By DDDRoblox: Grow A Garden - Complete Mutation Guide3 weeks ago By DDDRoblox: Bubble Gum Simulator Infinity - How To Get And Use Royal Keys3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌How to fix KB5055612 fails to install in Windows 10?3 weeks ago By DDDHot Tools
Notepad++7.3.1
Easy-to-use and free code editor
SublimeText3 Chinese version
Chinese version, very easy to use
Zend Studio 13.0.1
Powerful PHP integrated development environment
Dreamweaver CS6
Visual web development tools
SublimeText3 Mac version
God-level code editing software (SublimeText3)
Hot Topics
Java Tutorial1664
14
CakePHP Tutorial1422
52
Laravel Tutorial1316
25
PHP Tutorial1267
29
C# Tutorial1239
24
- Pass hasToRemoveScriptWrapper: true as an argument to newrelic.getBrowserTimingHeader so that the browser script is returned without the

JavaScript is the cornerstone of modern web development, and its main functions include event-driven programming, dynamic content generation and asynchronous programming. 1) Event-driven programming allows web pages to change dynamically according to user operations. 2) Dynamic content generation allows page content to be adjusted according to conditions. 3) Asynchronous programming ensures that the user interface is not blocked. JavaScript is widely used in web interaction, single-page application and server-side development, greatly improving the flexibility of user experience and cross-platform development.

The latest trends in JavaScript include the rise of TypeScript, the popularity of modern frameworks and libraries, and the application of WebAssembly. Future prospects cover more powerful type systems, the development of server-side JavaScript, the expansion of artificial intelligence and machine learning, and the potential of IoT and edge computing.

Different JavaScript engines have different effects when parsing and executing JavaScript code, because the implementation principles and optimization strategies of each engine differ. 1. Lexical analysis: convert source code into lexical unit. 2. Grammar analysis: Generate an abstract syntax tree. 3. Optimization and compilation: Generate machine code through the JIT compiler. 4. Execute: Run the machine code. V8 engine optimizes through instant compilation and hidden class, SpiderMonkey uses a type inference system, resulting in different performance performance on the same code.

Python is more suitable for beginners, with a smooth learning curve and concise syntax; JavaScript is suitable for front-end development, with a steep learning curve and flexible syntax. 1. Python syntax is intuitive and suitable for data science and back-end development. 2. JavaScript is flexible and widely used in front-end and server-side programming.

JavaScript is the core language of modern web development and is widely used for its diversity and flexibility. 1) Front-end development: build dynamic web pages and single-page applications through DOM operations and modern frameworks (such as React, Vue.js, Angular). 2) Server-side development: Node.js uses a non-blocking I/O model to handle high concurrency and real-time applications. 3) Mobile and desktop application development: cross-platform development is realized through ReactNative and Electron to improve development efficiency.

This article demonstrates frontend integration with a backend secured by Permit, building a functional EdTech SaaS application using Next.js. The frontend fetches user permissions to control UI visibility and ensures API requests adhere to role-base

I built a functional multi-tenant SaaS application (an EdTech app) with your everyday tech tool and you can do the same. First, what’s a multi-tenant SaaS application? Multi-tenant SaaS applications let you serve multiple customers from a sing

The shift from C/C to JavaScript requires adapting to dynamic typing, garbage collection and asynchronous programming. 1) C/C is a statically typed language that requires manual memory management, while JavaScript is dynamically typed and garbage collection is automatically processed. 2) C/C needs to be compiled into machine code, while JavaScript is an interpreted language. 3) JavaScript introduces concepts such as closures, prototype chains and Promise, which enhances flexibility and asynchronous programming capabilities.
