Loading...
Loading...
Sets up TraceKit APM in Next.js applications with multi-runtime support, error boundaries, and distributed tracing. Covers both App Router and Pages Router architectures.
npx skill4agent add tracekit-dev/tracekit-for-ai tracekit-nextjs-sdktracekit-browser-sdktracekit-react-sdkNEXT_PUBLIC_TRACEKIT_API_KEYTRACEKIT_API_KEY.env.localhttps://app.tracekit.devenableCodeMonitoring: truepackage.jsonnextapp/pages/app/pages/.env.local# .env.local
NEXT_PUBLIC_TRACEKIT_API_KEY=ctxio_your_api_key_here
TRACEKIT_API_KEY=ctxio_your_server_api_key_here
APP_VERSION=1.0.0
NEXT_PUBLIC_APP_VERSION=1.0.0NEXT_PUBLIC_ctxio_npm install @tracekit/nextjsyarn add @tracekit/nextjsinstrumentation.tsregister()// instrumentation.ts
import { initServer, captureRequestError } from '@tracekit/nextjs';
export function register() {
initServer({
apiKey: process.env.TRACEKIT_API_KEY!,
release: process.env.APP_VERSION,
environment: process.env.NODE_ENV,
apiEndpoint: 'https://app.tracekit.dev',
enableCodeMonitoring: true,
});
}
// Capture server-side request errors (App Router + Pages Router)
export const onRequestError = captureRequestError;captureRequestErroronRequestErrorrouterKindroutePathrouteTypeinstrumentation-client.ts// instrumentation-client.ts
import { initClient, onRouterTransitionStart } from '@tracekit/nextjs';
initClient({
apiKey: process.env.NEXT_PUBLIC_TRACEKIT_API_KEY!,
release: process.env.NEXT_PUBLIC_APP_VERSION,
environment: process.env.NODE_ENV,
endpoint: 'https://app.tracekit.dev/v1/traces',
enableCodeMonitoring: true,
tracePropagationTargets: [
process.env.NEXT_PUBLIC_API_URL || 'https://api.example.com',
],
});
// Next.js 15.3+ navigation breadcrumbs
export { onRouterTransitionStart };initClient()@tracekit/browseronRouterTransitionStartapp/global-error.tsx// app/global-error.tsx
export { GlobalError as default } from '@tracekit/nextjs';// app/global-error.tsx
'use client';
import { useEffect } from 'react';
import { captureException } from '@tracekit/nextjs';
export default function GlobalError({
error,
reset,
}: {
error: Error & { digest?: string };
reset: () => void;
}) {
useEffect(() => {
captureException(error);
}, [error]);
return (
<html>
<body>
<h2>Something went wrong!</h2>
<button onClick={reset}>Try again</button>
</body>
</html>
);
}error.tsx// app/dashboard/error.tsx
'use client';
import { useEffect } from 'react';
import { captureException } from '@tracekit/nextjs';
export default function DashboardError({
error,
reset,
}: {
error: Error & { digest?: string };
reset: () => void;
}) {
useEffect(() => {
captureException(error);
}, [error]);
return (
<div>
<h2>Dashboard error</h2>
<button onClick={reset}>Retry</button>
</div>
);
}withTraceKitErrorPage// pages/_error.tsx
import { withTraceKitErrorPage } from '@tracekit/nextjs';
function CustomErrorPage({ statusCode }: { statusCode?: number }) {
return (
<div>
<h1>{statusCode ? statusCode + ' - Server Error' : 'Client Error'}</h1>
<p>An unexpected error occurred.</p>
</div>
);
}
CustomErrorPage.getInitialProps = ({ res, err }: any) => {
const statusCode = res ? res.statusCode : err ? err.statusCode : 404;
return { statusCode, err };
};
export default withTraceKitErrorPage(CustomErrorPage);import { captureException, setUser } from '@tracekit/nextjs';
// Capture errors manually
try {
await riskyOperation();
} catch (err) {
captureException(err as Error, { context: 'checkout' });
}
// Set user context after authentication
setUser({ id: user.id, email: user.email });captureRequestError// app/api/orders/route.ts
import { NextResponse } from 'next/server';
export async function POST(request: Request) {
try {
const body = await request.json();
const order = await processOrder(body);
return NextResponse.json(order);
} catch (err) {
// Server errors are automatically captured via captureRequestError
return NextResponse.json({ error: 'Failed' }, { status: 500 });
}
}@tracekit/nextjsimport {
captureException,
captureMessage,
setUser,
setTag,
setExtra,
addBreadcrumb,
getClient,
} from '@tracekit/nextjs';@tracekit/browsercaptureRequestErrortracePropagationTargetsinitClient()tracekit-trace-idbaggagefetch// instrumentation-client.ts
initClient({
apiKey: process.env.NEXT_PUBLIC_TRACEKIT_API_KEY!,
endpoint: 'https://app.tracekit.dev/v1/traces',
enableCodeMonitoring: true,
tracePropagationTargets: [
'https://api.example.com',
/^\/api\//, // Same-origin API routes
],
});captureRequestErrorrouterKindroutePathrouteType// instrumentation-client.ts
initClient({
apiKey: process.env.NEXT_PUBLIC_TRACEKIT_API_KEY!,
endpoint: 'https://app.tracekit.dev/v1/traces',
enableCodeMonitoring: true,
replay: {
enabled: true,
sampleRate: 0.1,
errorSampleRate: 1.0,
maskAllText: true,
blockAllMedia: false,
},
});next.config.js// next.config.js
const { withTraceKit } = require('@tracekit/nextjs/webpack-plugin');
/** @type {import('next').NextConfig} */
const nextConfig = {
// Your existing config
};
module.exports = withTraceKit(nextConfig, {
apiKey: process.env.TRACEKIT_API_KEY,
release: process.env.APP_VERSION || '1.0.0',
// Source maps are uploaded during build, not at runtime
});tracekit sourcemaps upload \
--api-key $TRACEKIT_API_KEY \
--release 1.0.0 \
--dist .next/static'use client';
export default function TestPage() {
return <button onClick={() => { throw new Error('TraceKit Next.js client test'); }}>Test Error</button>;
}// app/api/test-error/route.ts
export async function GET() {
throw new Error('TraceKit Next.js server test');
}https://app.tracekit.dev# .env.local
NEXT_PUBLIC_TRACEKIT_API_KEY=ctxio_your_api_key_here
TRACEKIT_API_KEY=ctxio_your_server_api_key_here
APP_VERSION=1.0.0
NEXT_PUBLIC_APP_VERSION=1.0.0// instrumentation-client.ts
import { initClient, onRouterTransitionStart } from '@tracekit/nextjs';
initClient({
apiKey: process.env.NEXT_PUBLIC_TRACEKIT_API_KEY!,
release: process.env.NEXT_PUBLIC_APP_VERSION,
environment: process.env.NODE_ENV,
endpoint: 'https://app.tracekit.dev/v1/traces',
enableCodeMonitoring: true,
tracePropagationTargets: [
process.env.NEXT_PUBLIC_API_URL || 'https://api.example.com',
],
replay: {
enabled: true,
sampleRate: 0.1,
errorSampleRate: 1.0,
},
});
export { onRouterTransitionStart };// instrumentation.ts
import { initServer, captureRequestError } from '@tracekit/nextjs';
export function register() {
initServer({
apiKey: process.env.TRACEKIT_API_KEY!,
release: process.env.APP_VERSION,
environment: process.env.NODE_ENV,
enableCodeMonitoring: true,
});
}
export const onRequestError = captureRequestError;// app/global-error.tsx
export { GlobalError as default } from '@tracekit/nextjs';// app/layout.tsx
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="en">
<body>{children}</body>
</html>
);
}instrumentation.tsregister()initServer()onRequestErrorTRACEKIT_API_KEY.env.localNEXT_PUBLIC_https://app.tracekit.devcurl -X POST https://app.tracekit.dev/v1/tracesinstrumentation-client.tsinitClient()NEXT_PUBLIC_TRACEKIT_API_KEYinstrumentation.tsinitServer()instrumentation-client.tsinitClient()captureRequestErrorfetch()initServer()onRecoverableErrorreact.onRecoverableErroronRouterTransitionStart@tracekit/browseronRouterTransitionStartinstrumentation-client.tstracekit-browser-sdktracekit-react-sdkhttps://app.tracekit.dev/docs/frontend/frameworks/nextjshttps://app.tracekit.dev/docs/frontend/browser-sdkhttps://app.tracekit.dev/docshttps://app.tracekit.dev