-
-
Notifications
You must be signed in to change notification settings - Fork 1.5k
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
Express is not instrumented #12105
Comments
Hey @adriaanmeuris the error message tells you to call |
I've made this change as follows: import * as Sentry from '@sentry/node';
Sentry.init({
dsn: __DSN_HERE__
});
import express from 'express'; But the error message still occurs, I'm not sure why. Am I missing something? |
Hello, are you running your application in CJS or ESM? Meaning, what is it you do like If you are running it as ESM app, you need to follow the docs here: https://docs.sentry.io/platforms/javascript/guides/express/install/esm/ |
hey, i'm having absolutely same issue, and it's annoying AF. And i'm using CJS, not ESM. Double checked it. I spent 5 hours in total trying to modify my application initialization. Even tried using some workaround with setTimeout. None of that helped. Still having this annoyind AG red text saying [Sentry] Express is not instrumented. This is likely because you required/imported express before calling `Sentry.init(). I don't even have any other express related import other than Sentry.expressIntegration(), can you guys please bring back possiblity to initialise the Sentry init not at the top, it's really frustrating not being able to init how you want. I have a microservice app, and there i have one common function that initializes microservice. I used to Sentry inside that microservice initializing function, but now, after migrating to 8 i had to take sentry init out of that function and init manually inside every of microservice to make sure it's the fitst import, but even after that I'm having this error. It's such a drawback in developer experience, it's hard to believe that you had to do that. I would assuke that you had technical reasons to do so, but it was working perfectly fine in v7. Why did you guys had to remove that flexibility? Sorry that i'm being emotional, but spent way too much hours trying to fix error, by following exactly what you wrote to do, and still this error is there. You could write some better error message, other than "most likely" |
update: I noticed that this error is happening when i add // initSentry.ts
import * as Sentry from "@sentry/node";
import { nodeProfilingIntegration } from "@sentry/profiling-node";
export function initSentry({
name,
dsn,
env,
debug = false,
integrations,
enabled = true,
includeLocalVariables = false,
callback,
}: {
name: string;
enabled?: boolean;
dsn: string;
env: { node_env: string };
debug: boolean;
integrations: any[];
includeLocalVariables?: boolean;
callback?: () => void;
}) {
const defaultIntegrations = [
Sentry.httpIntegration(),
Sentry.expressIntegration(),
nodeProfilingIntegration(),
Sentry.localVariablesIntegration(),
];
Sentry.init({
serverName: name,
dsn: dsn,
environment: env.node_env,
enabled: enabled,
debug: debug,
integrations: [...(includeLocalVariables ? [Sentry.localVariablesIntegration()] : []), ...defaultIntegrations, ...integrations],
// Set tracesSampleRate to 1.0 to capture 100%
// of transactions for performance monitoring.
// We recommend adjusting this value in production
beforeSend(event, hint) {
const error = hint.originalException as Error;
if (error?.message?.match(/database unavailable/i)) {
event.fingerprint = ["database-unavailable"];
}
// Modify or drop the event here
if (event.user) {
// Don't send user's email address
event.user.email = undefined;
}
return event;
},
// Called for transaction events
beforeSendTransaction(event) {
// Modify or drop the event here
if (event.transaction === "/unimportant/route") {
// Don't send the event to Sentry
return null;
}
return event;
},
beforeBreadcrumb(breadcrumb, hint) {
// Check if the breadcrumb has sensitive data like user email
if (breadcrumb.data?.["user"]?.email) {
// Remove the user email from the breadcrumb
breadcrumb.data["user"].email = undefined;
}
return breadcrumb;
},
includeLocalVariables: includeLocalVariables,
attachStacktrace: true,
tracesSampleRate: 1.0,
profilesSampleRate: 1.0,
});
callback?.();
}
// main.ts
mport * as Sentry from "@sentry/node";
import { initSentry } from "@myorg/sentry-init";
initSentry({
name: "auth-service",
dsn: process.env.SENTRY_DSN,
env: { node_env: process.env.NODE_ENV },
debug: false,
integrations: [],
});
import { MicroserviceName, TRPC_ENDPOINTS_MAP } from "@myorg/constants";
const MICROSERVICE_NAME = MicroserviceName.AuthService;
import { authRouter, prisma, authjsPlugin, envServer, logger } from "@myorg/auth-service";
import { natsWrapper } from "@myorg/auth-service/lib/nats-wrapper";
import { initRestRouter } from "@myorg/auth-service";
import { createMicroserviceApp } from "@myorg/utils";
createMicroserviceApp({
name: MICROSERVICE_NAME,
env: {
port: envServer.TRPC_PORT,
host: envServer.HOST,
node_env: envServer.NODE_ENV,
},
trpcRouter: {
path: TRPC_ENDPOINTS_MAP[MicroserviceName.AuthService],
router: authRouter,
},
logger,
nats: {
natsWrapper: natsWrapper,
listeners: [],
},
initRestRouter,
plugins: [authjsPlugin],
}); createMicroservice.ts
// skipped some imports
type MicroserviceConfig = {
name: NeiraOwnMicroservicesNames;
trpcRouter?: {
path: string;
router: any;
};
logger: LoggerInstance;
env: {
port: number;
host: string;
node_env: string;
};
nats?: {
natsWrapper: AbstractNatsWrapper;
listeners: (typeof NatsListener)[];
};
initRestRouter?: (app: express.Express) => void;
plugins?: ((app: express.Express) => void)[] | ((app: express.Express) => Promise<void>)[];
testConnectionWithMicroservices?: boolean;
};
export async function createMicroserviceApp<T>(
{
name,
env,
// sentry: { debug = false, dsn, integrations = [] },
trpcRouter,
logger,
nats,
initRestRouter,
plugins = [],
testConnectionWithMicroservices = false,
}: MicroserviceConfig,
callback?: () => void,
) {
if (env.node_env === "production") {
logger.info(`Starting [${name}] Microservice`);
}
const app = express();
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cors());
app.use(bodyParser.json());
app.use(makeWinstonLogger(name));
app.use(createTransactionIdExpressMiddleware);
listenForConnectionCheck(app, name);
if (initRestRouter) {
initRestRouter(app);
}
if (plugins) {
for (const plugin of plugins) {
await plugin(app);
}
}
// important! trpcRouter must be after plugins!
if (trpcRouter) {
app.use(
trpcRouter.path,
trpcExpress.createExpressMiddleware({
router: trpcRouter.router,
createContext: createExpressTrpcContext,
}),
);
}
app.use(expressCustomErrorHandler);
Sentry.setupExpressErrorHandler(app);
app.listen(env.port, env.host, () => {
logger.info(`[${name}] tRPC server is listening on http://${env.host}:${env.port}`);
if (callback) {
callback();
}
});
// rest of the app |
For context, i'm also using Sentry 8.2.1. Node v20.13.1. |
any updates? :) I can provide more info if needed |
Same here. Error happens when i add Sentry.setupExpressErrorHandler(app);. My setup is ESM, so i guess i have to use the --import step. However i cant, cause then i get the import-in-the-middle bug and the app crashes. |
Just to note these here too (this was figured out in #12056), the warning will be incorrectly logged today if tracing is not enabled. We will fix this in an upcoming release. For now, you can ignore the warning if tracing is not enabled! So some notes @amiranvarov:
@rnenjoy: |
This is the issue I'm experiencing as well. It appears that if your app and Sentry's SDK share a dependency, that dependency will try to be imported twice, causing this error. |
Could you share your |
|
Could you share the gist of |
I have modified the code as follows and it still crashes the app in the same way.
Run command: Crash:
Our prod run command is slightly different, but it also crashes like this on prod. |
I removed one of our dependencies in package.json, and it works now. The dependency in question is |
our application also relies on date-fns. unfortunately we're in a monorepo so removing it may not be that simple, but that's good to know! |
Ah, I see, we've seen this before, there seems to be a problem with date-fns: date-fns/date-fns#3770 This is related/a "duplicate" of #12154 then, which runs into the same problem. We'll try to come up with a fix! |
Is there an existing issue for this?
How do you use Sentry?
Sentry Saas (sentry.io)
Which SDK are you using?
@sentry/node
SDK Version
8.2.1
Framework Version
No response
Link to Sentry event
No response
SDK Setup
Steps to Reproduce
Expected Result
No error about Express not being instrumented.
Actual Result
Error:
Initializing Sentry before importing Express doesn't work.
The text was updated successfully, but these errors were encountered: