| title | Cloudflare | ||||
|---|---|---|---|---|---|
| description | Learn how to manually set up Sentry for Cloudflare Workers and Cloudflare Pages and capture your first errors. | ||||
| sdk | sentry.javascript.cloudflare | ||||
| categories |
|
Use this guide for general instructions on using the Sentry SDK with Cloudflare. If you're using any of the listed frameworks, follow their specific setup instructions:
The Cloudflare Workers runtime has some platform-specific limitations that affect tracing. See [Known Limitations](#known-limitations) for details.Choose the features you want to configure, and this guide will show you how:
<OnboardingOptionButtons options={["error-monitoring", "performance", "logs"]} />
Run the command for your preferred package manager to add the Sentry SDK to your application:
The main Sentry configuration should happen as early as possible in your app's lifecycle.
To use the Sentry SDK, add the sentryPagesPlugin as middleware to your Cloudflare Pages application.
import * as Sentry from "@sentry/cloudflare";
export const onRequest = [
// Make sure Sentry is the first middleware
Sentry.sentryPagesPlugin((context) => ({
dsn: "___PUBLIC_DSN___",
// Adds request headers and IP for users, for more info visit:
// https://docs.sentry.io/platforms/javascript/guides/cloudflare/configuration/options/#sendDefaultPii
sendDefaultPii: true,
// ___PRODUCT_OPTION_START___ logs
// Enable logs to be sent to Sentry
enableLogs: true,
// ___PRODUCT_OPTION_END___ logs
// ___PRODUCT_OPTION_START___ performance
// Set tracesSampleRate to 1.0 to capture 100% of spans for tracing.
// Learn more at
// https://docs.sentry.io/platforms/javascript/guides/cloudflare/configuration/options/#tracesSampleRate
tracesSampleRate: 1.0,
// ___PRODUCT_OPTION_END___ performance
})),
// Add more middlewares here
];// hooks.server.js
import * as Sentry from "@sentry/cloudflare";
export const handle = ({ event, resolve }) => {
const requestHandlerOptions = {
options: {
dsn: event.platform.env.SENTRY_DSN,
tracesSampleRate: 1.0,
},
request: event.request,
context: event.platform.ctx,
};
return Sentry.wrapRequestHandler(requestHandlerOptions, () => resolve(event));
};Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project.
First, let's make sure Sentry is correctly capturing errors and creating issues in your project.
Add the following code snippet to your main worker file to create a /debug-sentry route that triggers an error when called:
export default {
async fetch(request) {
const url = new URL(request.url);
if (url.pathname === "/debug-sentry") {
throw new Error("My first Sentry error!");
}
// Your existing routes and logic here...
return new Response("...");
},
};Create a new route that throws an error when called by adding the following code snippet to a file in your functions directory, such as functions/debug-sentry.js:
export async function onRequest(context) {
throw new Error("My first Sentry error!");
}export default {
async fetch(request) {
const url = new URL(request.url);
if (url.pathname === "/debug-sentry") {
await Sentry.startSpan(
{
op: "test",
name: "My First Test Transaction",
},
async () => {
await new Promise((resolve) => setTimeout(resolve, 100)); // Wait for 100ms
throw new Error("My first Sentry error!");
}
);
}
// Your existing routes and logic here...
return new Response("...");
},
};export async function onRequest(context) {
await Sentry.startSpan(
{
op: "test",
name: "My First Test Transaction",
},
async () => {
await new Promise((resolve) => setTimeout(resolve, 100)); // Wait for 100ms
throw new Error("My first Sentry error!");
}
);
}Now, head over to your project on Sentry.io to view the collected data (it takes a couple of moments for the data to appear).
Server-side spans will display 0ms for their durations. In the Cloudflare Workers runtime, performance.now() and Date.now() only advance after I/O occurs. CPU-bound operations will show zero duration. This is a security measure Cloudflare implements to mitigate against timing attacks.
This is expected behavior in the Cloudflare Workers environment and affects all frameworks deployed to Cloudflare Workers, including Next.js, Astro, Remix, and others.
At this point, you should have integrated Sentry and should already be sending data to your Sentry project.
Now's a good time to customize your setup and look into more advanced topics. Our next recommended steps for you are:
- Explore practical guides on what to monitor, log, track, and investigate after setup
- Learn how to manually capture errors
- Continue to customize your configuration
- Make use of Cloudflare-specific features
- Get familiar with Sentry's product features like tracing, insights, and alerts
- Check out setup instructions for popular frameworks on Cloudflare
- Find various support topics in troubleshooting
- Get support