Skip to content

fix(node): Ensure correct URL is passed to ignoreIncomingRequests callback #12929

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

Merged
merged 5 commits into from
Jul 16, 2024

Conversation

Lms24
Copy link
Member

@Lms24 Lms24 commented Jul 16, 2024

This PR fixes an oversight in our Node httpIntegration. It looks like we assumed that the request object being passed to ignoreIncomingRequestHook and ignoreOutgoingRequestHook was of the same type. However, it's not:

  • request is of type IncomingMessage in ignoreIncomingRequestHook
  • request is of type RequestOptions in ignoreOutgoingRequestHook

In both cases though, we tried to obtain the url to pass into the ignoreIncoming|outgoingRequests callback via our getUrl helper function. Since IncomingMessage doesn't have any of the properties required by getUrl, we always passed /// to the ignoreIncomingRequests callback.

This PR fixes the bug by simply taking the request.url property instead and adds integration tests to properly test the two options.

We could do more here, for example make ignoreIncomingRequestHook fully/partially overwriteable like we did with requestHook or via _experimentalConfig pass the request object as an additional param to the user-facing function but this should be done in a follow-up PR.

fixes #12913

@Lms24 Lms24 self-assigned this Jul 16, 2024
*/
export function startExpressServerAndSendPortToRunner(app: Express): void {
const server = app.listen(0, () => {
export function startExpressServerAndSendPortToRunner(app: Express, port: number | undefined = undefined): void {
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

small adjustment to our node integration tests framework: In the express apps, we can not optionally pass a fixed port which makes running the app locally a lot less painful 😅

@@ -103,7 +103,7 @@ export const instrumentHttp = Object.assign(
},

ignoreIncomingRequestHook: request => {
const url = getRequestUrl(request);
const url = request.url;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

just checking to be sure, is the url here the full URL, including protocol? so e.g. http://...? As we want these to be full URLs I guess always, if possible.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@mydea url is NOT the full url, it is instead just the path (and maybe the query params? EDIT: definitely has query params too.).

the node:IncomingMessage type doesn't have a protocol, hostname, or port attr.

  • For protocol you'd have to do something like access req.socket.encrypted and infer true === https
  • For hostname you'd have to parse the request headers for a Host header, falling back to req.socket.address() if it doesn't exist.
  • For port you'd have to access req.socket.address().port, I think.

So all that to say, sadly it's difficult to reconstruct the full url. Thoughts?

Screenshot:
Screen Shot 2024-07-16 at 5 42 36 AM

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here's all the available attrs:
Screen Shot 2024-07-16 at 5 40 06 AM

Copy link

@Bruno-DaSilva Bruno-DaSilva Jul 16, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@mydea sorry i saw you moved your comment, so I just moved mine before I saw you replied 😅
I'll let you move your reply here so the comments aren't fragmented.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, I feared that. IMHO this is OK, but we should maybe reflect this in the jsdoc/variables used for ignoreIncomingRequests, e.g. make it ignoreIncomingRequests(urlPath: string) or something like this?

Sounds reasonable to me but sadly this is a breaking change, no?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just changing the name of the variable is fine. Will make the change and update JSDoc and docs to reflect it. "Luckily" this never worked in v8 in the first place (afaict) so we're likely not behaviourally breaking folks.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Regarding docs update: I'll do this in combination with the changes from #12930

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sounds good to me 🚀

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done: 9348717

Copy link
Contributor

github-actions bot commented Jul 16, 2024

size-limit report 📦

Path Size
@sentry/browser 22.3 KB (0%)
@sentry/browser (incl. Tracing) 33.69 KB (0%)
@sentry/browser (incl. Tracing, Replay) 69.77 KB (0%)
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags 63.08 KB (0%)
@sentry/browser (incl. Tracing, Replay with Canvas) 74.17 KB (0%)
@sentry/browser (incl. Tracing, Replay, Feedback) 86.49 KB (0%)
@sentry/browser (incl. Tracing, Replay, Feedback, metrics) 88.36 KB (0%)
@sentry/browser (incl. metrics) 26.59 KB (0%)
@sentry/browser (incl. Feedback) 38.98 KB (0%)
@sentry/browser (incl. sendFeedback) 26.92 KB (0%)
@sentry/browser (incl. FeedbackAsync) 31.54 KB (0%)
@sentry/react 25.07 KB (0%)
@sentry/react (incl. Tracing) 36.75 KB (0%)
@sentry/vue 26.41 KB (0%)
@sentry/vue (incl. Tracing) 35.57 KB (0%)
@sentry/svelte 22.44 KB (0%)
CDN Bundle 23.52 KB (0%)
CDN Bundle (incl. Tracing) 35.47 KB (0%)
CDN Bundle (incl. Tracing, Replay) 69.87 KB (0%)
CDN Bundle (incl. Tracing, Replay, Feedback) 75.13 KB (0%)
CDN Bundle - uncompressed 69 KB (0%)
CDN Bundle (incl. Tracing) - uncompressed 104.91 KB (0%)
CDN Bundle (incl. Tracing, Replay) - uncompressed 216.69 KB (0%)
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed 229.41 KB (0%)
@sentry/nextjs (client) 36.62 KB (0%)
@sentry/sveltekit (client) 34.34 KB (0%)
@sentry/node 130.82 KB (+0.01% 🔺)
@sentry/node - without tracing 91.91 KB (+0.01% 🔺)
@sentry/aws-serverless 117.08 KB (-0.01% 🔽)

@Lms24 Lms24 enabled auto-merge (squash) July 16, 2024 11:37
@Lms24 Lms24 merged commit 6f4c045 into develop Jul 16, 2024
105 checks passed
@Lms24 Lms24 deleted the lms/fix-node-http-ignoreIncomingRequests-url branch July 16, 2024 11:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

node http integration: ignoreIncomingRequests() option does not work
3 participants