Hono
Learn how to manually set up Sentry in your Hono app and capture your first errors.
Runtime-Specific Setup
This guide focuses on the Node.js runtime for Hono. For other runtimes, see the links below. If you are using the @sentry/cloudflare middleware, see the Hono on Cloudflare guide.
Hono works across multiple JavaScript runtimes. Choose the appropriate Sentry SDK for your environment:
- Node.js: Use
@sentry/node(this guide) - Cloudflare Workers: Use
@sentry/cloudflare- see our Hono on Cloudflare guide - Deno: Use
@sentry/deno- see our Deno guide (Beta) - Bun: Use
@sentry/bun- see our Bun guide
The community middleware @hono/sentry has been deprecated in favor of using Sentry's official packages, which provide better performance and more features. If you're currently using @hono/sentry middleware, you'll need to migrate to @sentry/cloudflare.
This guide focuses on Node.js. The setup uses @sentry/node and follows standard Node.js patterns.
You need:
- A Sentry account and project
- Your application up and running
- Node version
18.0.0or above (>=19.9.0or18.19.0recommended)
Choose the features you want to configure, and this guide will show you how:
Run the command for your preferred package manager to add the Sentry SDK to your application:
npm install @sentry/node
npm install @sentry/node @sentry/profiling-node --save
To import and initialize Sentry, create a file named instrument.(js|mjs) in the root directory of your project and add the following code:
instrument.jsconst Sentry = require("@sentry/node");
// profiling
const { nodeProfilingIntegration } = require("@sentry/profiling-node");
// profiling
// Ensure to call this before requiring any other modules!
Sentry.init({
dsn: "https://examplePublicKey@o0.ingest.sentry.io/0",
// Adds request headers and IP for users, for more info visit:
// https://docs.sentry.io/platforms/javascript/guides/hono/configuration/options/#sendDefaultPii
sendDefaultPii: true,
// profiling
// Add our Profiling integration
nodeProfilingIntegration(),
// profiling
// performance
// Set tracesSampleRate to 1.0 to capture 100%
// of transactions for tracing.
// We recommend adjusting this value in production
// Learn more at
// https://docs.sentry.io/platforms/javascript/guides/hono/configuration/options/#tracesSampleRate
tracesSampleRate: 1.0,
// performance
// profiling
// Set profilesSampleRate to 1.0 to profile 100%
// of sampled transactions.
// This is relative to tracesSampleRate
// Learn more at
// https://docs.sentry.io/platforms/javascript/guides/hono/configuration/options/#profilesSampleRate
profilesSampleRate: 1.0,
// profiling
// logs
// Enable logs to be sent to Sentry
enableLogs: true,
// logs
});
Import instrument.js before any other modules to ensure Sentry initializes early. If you initialize later, auto-instrumentation and modules like database monitoring, agent monitoring, tracing may not work.
Which module system are you using?
The method for applying instrumentation depends on whether your application uses CommonJS (CJS) or ECMAScript Modules (ESM). If you're unsure which system you're using or if you're looking for alternative installation methods, see here.
Require the instrument.js file before any other modules:
// Require this first!
require("./instrument");
// Now require other modules
const { serve } = require("@hono/node-server");
const { Hono } = require("hono");
// Your application code goes here
When running your application in ESM mode, use the --import command line option and point it to instrument.mjs to load the module before the application starts:
# Note: This is only available for Node v18.19.0 onwards.
node --import ./instrument.mjs app.mjs
By default, Sentry reports exceptions reported by the onError function from Hono. In case the error comes with a status code, it captures all errors except for the ones with a 3xx or 4xx status code.
To learn how to customize this behavior, see the honoIntegration documentation.
The stack traces in your Sentry errors probably won't look like your actual code. To fix this, upload your source maps to Sentry. The easiest way to do this is by using the Sentry Wizard:
npx @sentry/wizard@latest -i sourcemaps
Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project.
First, let's verify that Sentry captures errors and creates issues in your Sentry project. Add the following code snippet to your main application file, adding a route that triggers an error that Sentry will capture:
app.get("/debug-sentry", () => {
throw new Error("My first Sentry error!");
});
To test your tracing configuration, update the previous code snippet by starting a trace to measure the time it takes for the execution of your code:
app.get("/debug-sentry", async () => {
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!");
},
);
});
Finally, head over to your project on Sentry.io to view the collected data (it takes a couple of moments for the data to appear).
At this point, you should have integrated Sentry into your application, which 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:
- Extend Sentry to your frontend using one of our frontend SDKs
- Learn how to manually capture errors
- Continue to customize your configuration
- Get familiar with Sentry's product features like tracing, insights, and alerts
For other runtimes, use the appropriate Sentry SDK:
Our documentation is open source and available on GitHub. Your contributions are welcome, whether fixing a typo (drat!) or suggesting an update ("yeah, this would be better").