tests(e2e): Refactor nestjs e2e applications into multiple smaller test applications - #12948

Merged
nicohrubec merged 8 commits into
developfrom
nh/improve-nest-tests
Jul 18, 2024
Merged

tests(e2e): Refactor nestjs e2e applications into multiple smaller test applications#12948
nicohrubec merged 8 commits into
developfrom
nh/improve-nest-tests

Conversation

@nicohrubec

@nicohrubecnicohrubec commented Jul 17, 2024

Copy link
Copy Markdown
Member

Refactor of the existing nestjs test applications. Before we had one sample application testing everything nest-related. This PR splits them up into three applications to make it more readable and easier to understand what is being tested. It also allows for iterating a bit quicker in local development.

No new functionality was added. Will add more tests in a follow-up.

The three new services are:

  • nestjs-basic: Simple nestjs application with no submodules and tests for basic functionality of the SDK like error monitoring and span instrumentation.
  • nestjs-with-submodules: NestJS application that is bit more complex including a submodule (and potentially multiple in the future) to have a more realistic setup for more advanced testing.
  • nestjs-distributed-tracing: Includes tests for trace propagation with multiple services.

@nicohrubec
nicohrubec requested a review from lforstJuly 17, 2024 14:07
@nicohrubec
nicohrubec marked this pull request as ready for review July 17, 2024 14:21
@nicohrubec
nicohrubec requested review from Lms24 and chargomeJuly 17, 2024 15:52
import * as Sentry from '@sentry/nestjs';
import { AppModule } from './app.module';

const app1Port = 3030;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
constapp1Port=3030;
constPORT=3030;

const { httpAdapter } = app.get(HttpAdapterHost);
Sentry.setupNestErrorHandler(app, new BaseExceptionFilter(httpAdapter));

await app.listen(app1Port);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
awaitapp.listen(app1Port);
awaitapp.listen(PORT);

Comment on lines +49 to +64
@Injectable()
export class AppService2 {
externalAllowed(headers: Record<string, string>) {
return {
headers,
route: 'external-allowed',
};
}

externalDisallowed(headers: Record<string, string>) {
return {
headers,
route: 'external-disallowed',
};
}
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

m: would generally move each service into its own file and use more descriptive names instead of AppService1 AppService2 etc.

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

1st pass review: Would you mind adding the purpose of the three new apps to the PR description? Just a brief description of what they do or how they differ from each other would be great for future and external readers :)

import * as Sentry from '@sentry/nestjs';
import { AppModule } from './app.module';

const app1Port = 3030;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
constapp1Port=3030;
constPORT=3030;

const { httpAdapter } = app1.get(HttpAdapterHost);
Sentry.setupNestErrorHandler(app1, new BaseExceptionFilter(httpAdapter));

await app1.listen(app1Port);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
awaitapp1.listen(app1Port);
awaitapp1.listen(PORT);

@chargomechargome left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Looks good! I would just try to prevent naming services etc. with numerical suffixes.

@nicohrubec

Copy link
Copy Markdown
MemberAuthor

@Lms24 Sure good idea, updated the PR description :)

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks for adding the explanation! Looks good to me (once all feedback is addressed)

Comment on lines +2 to +3
"compilerOptions": {
"module": "commonjs",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

out of scope for this PR but idea for once #12920 is ready: In one of these apps we could set "moduleResolution": "Node16" to ensure our "workaround" from yesterday works in both, default and sub-path-export-compatible TS configs.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

sounds good, noted!

@nicohrubec

Copy link
Copy Markdown
MemberAuthor

@chargome I just copied what was there before, but definitely agree about the naming. I split up the two services into separate files and renamed them to TraceInitiator and TraceReceiver, should be more clear

@github-actions

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@sentry/browser22.3 KB (0%)
@sentry/browser (incl. Tracing)33.72 KB (+0.09% 🔺)
@sentry/browser (incl. Tracing, Replay)69.81 KB (+0.04% 🔺)
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags63.11 KB (+0.04% 🔺)
@sentry/browser (incl. Tracing, Replay with Canvas)74.2 KB (+0.04% 🔺)
@sentry/browser (incl. Tracing, Replay, Feedback)86.52 KB (+0.04% 🔺)
@sentry/browser (incl. Tracing, Replay, Feedback, metrics)88.39 KB (+0.04% 🔺)
@sentry/browser (incl. metrics)26.62 KB (+0.11% 🔺)
@sentry/browser (incl. Feedback)38.98 KB (0%)
@sentry/browser (incl. sendFeedback)26.93 KB (0%)
@sentry/browser (incl. FeedbackAsync)31.54 KB (0%)
@sentry/react25.06 KB (0%)
@sentry/react (incl. Tracing)36.79 KB (+0.09% 🔺)
@sentry/vue26.44 KB (+0.13% 🔺)
@sentry/vue (incl. Tracing)35.6 KB (+0.07% 🔺)
@sentry/svelte22.44 KB (0%)
CDN Bundle23.52 KB (0%)
CDN Bundle (incl. Tracing)35.5 KB (+0.09% 🔺)
CDN Bundle (incl. Tracing, Replay)69.91 KB (+0.05% 🔺)
CDN Bundle (incl. Tracing, Replay, Feedback)75.17 KB (+0.05% 🔺)
CDN Bundle - uncompressed69 KB (0%)
CDN Bundle (incl. Tracing) - uncompressed105.1 KB (+0.16% 🔺)
CDN Bundle (incl. Tracing, Replay) - uncompressed216.88 KB (+0.08% 🔺)
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed229.6 KB (+0.07% 🔺)
@sentry/nextjs (client)36.64 KB (+0.07% 🔺)
@sentry/sveltekit (client)34.37 KB (+0.08% 🔺)
@sentry/node111.28 KB (0%)
@sentry/node - without tracing88.73 KB (+0.01% 🔺)
@sentry/aws-serverless97.87 KB (0%)

@nicohrubecnicohrubec self-assigned this Jul 18, 2024
@nicohrubec
nicohrubec merged commit d629991 into developJul 18, 2024
@nicohrubec
nicohrubec deleted the nh/improve-nest-tests branch July 18, 2024 10:04
nicohrubec added a commit that referenced this pull request Jul 23, 2024
- Adds a new nest root module that can be used to setup the Nest SDK as
a replacement for the existing setup (with a function). Instead of
calling `setupNestErrorHandler` in the main.ts file, users can now add
`SentryModule.forRoot()` (feedback about the name is definitely welcome)
as an import in their main app module. This approach is much more native
to nest than what we used so far. This root module is introduced in the
setup.ts file.
- This root module is exported with a submodule export
`@sentry/nestjs/setup`, because the SDK now depends on nestjs directly
and without this the nest instrumentation does not work anymore, since
nest gets imported before Sentry.init gets called, which disables the
otel nest instrumentation.
- Judging from the e2e tests it seems that this new approach also
resolves some issues the previous implementation had, specifically [this
issue](#12351)
seems to be resolved. The e2e test that was in place, just documented
the current (wrong) behavior. So I updated the test to reflect the new
(correct) behavior.
- I updated all the test applications to use the new approach but kept a
copy of the nestjs-basic and nestjs-distributed-tracing with the old
setup (now named node-nestjs-basic and node-nestjs-distributed-tracing
respectively) so we can still verify that the old setup (which a lot of
people use) still keeps working going forward.
- Updated/New tests in this PR: - Sends unexpected exception to Sentry if thrown in Submodule
- Does not send expected exception to Sentry if thrown in Submodule and
caught by a global exception filter
- Does not send expected exception to Sentry if thrown in Submodule and
caught by a local exception filter
- Sends expected exception to Sentry if thrown from submodule registered
before Sentry
- To accomodate the new tests I added several submodules in the
nestjs-with-submodules test-application. These are overall similarly but
have important distinctions:
- example-module-local-filter: Submodule with a local filter registered
using `@UseFilters` on the controller.
- example-module-global-filter: Submodule with a global filter
registered using APP_FILTER in the submodule definition.
- example-module-global-filter-wrong-registration-order: Also has a
global filter set with APP_FILTER, but is registered in the root module
as first submodule, even before the SentryIntegration is initialized.
This case does not work properly in the new setup (Sentry should be set
first), so this module is used for tests documenting this behavior.
- Also set "moduleResolution": "Node16" in the nestjs-basic sample app
to ensure our submodule-export workaround works in both, default and
sub-path-export-compatible TS configs as was suggested
[here](#12948 (comment)).
Sign up for freeto 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.

3 participants

@nicohrubec@Lms24@chargome
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

tests(e2e): Refactor nestjs e2e applications into multiple smaller test applications - #12948

Merged
nicohrubec merged 8 commits into
developfrom
nh/improve-nest-tests
Jul 18, 2024
Merged

tests(e2e): Refactor nestjs e2e applications into multiple smaller test applications#12948
nicohrubec merged 8 commits into
developfrom
nh/improve-nest-tests

Conversation

@nicohrubec

@nicohrubecnicohrubec commented Jul 17, 2024

Copy link
Copy Markdown
Member

Refactor of the existing nestjs test applications. Before we had one sample application testing everything nest-related. This PR splits them up into three applications to make it more readable and easier to understand what is being tested. It also allows for iterating a bit quicker in local development.

No new functionality was added. Will add more tests in a follow-up.

The three new services are:

  • nestjs-basic: Simple nestjs application with no submodules and tests for basic functionality of the SDK like error monitoring and span instrumentation.
  • nestjs-with-submodules: NestJS application that is bit more complex including a submodule (and potentially multiple in the future) to have a more realistic setup for more advanced testing.
  • nestjs-distributed-tracing: Includes tests for trace propagation with multiple services.

@nicohrubec
nicohrubec requested a review from lforstJuly 17, 2024 14:07
@nicohrubec
nicohrubec marked this pull request as ready for review July 17, 2024 14:21
@nicohrubec
nicohrubec requested review from Lms24 and chargomeJuly 17, 2024 15:52
import * as Sentry from '@sentry/nestjs';
import { AppModule } from './app.module';

const app1Port = 3030;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
constapp1Port=3030;
constPORT=3030;

const { httpAdapter } = app.get(HttpAdapterHost);
Sentry.setupNestErrorHandler(app, new BaseExceptionFilter(httpAdapter));

await app.listen(app1Port);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
awaitapp.listen(app1Port);
awaitapp.listen(PORT);

Comment on lines +49 to +64
@Injectable()
export class AppService2 {
externalAllowed(headers: Record<string, string>) {
return {
headers,
route: 'external-allowed',
};
}

externalDisallowed(headers: Record<string, string>) {
return {
headers,
route: 'external-disallowed',
};
}
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

m: would generally move each service into its own file and use more descriptive names instead of AppService1 AppService2 etc.

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

1st pass review: Would you mind adding the purpose of the three new apps to the PR description? Just a brief description of what they do or how they differ from each other would be great for future and external readers :)

import * as Sentry from '@sentry/nestjs';
import { AppModule } from './app.module';

const app1Port = 3030;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
constapp1Port=3030;
constPORT=3030;

const { httpAdapter } = app1.get(HttpAdapterHost);
Sentry.setupNestErrorHandler(app1, new BaseExceptionFilter(httpAdapter));

await app1.listen(app1Port);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
awaitapp1.listen(app1Port);
awaitapp1.listen(PORT);

@chargomechargome left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Looks good! I would just try to prevent naming services etc. with numerical suffixes.

@nicohrubec

Copy link
Copy Markdown
MemberAuthor

@Lms24 Sure good idea, updated the PR description :)

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks for adding the explanation! Looks good to me (once all feedback is addressed)

Comment on lines +2 to +3
"compilerOptions": {
"module": "commonjs",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

out of scope for this PR but idea for once #12920 is ready: In one of these apps we could set "moduleResolution": "Node16" to ensure our "workaround" from yesterday works in both, default and sub-path-export-compatible TS configs.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

sounds good, noted!

@nicohrubec

Copy link
Copy Markdown
MemberAuthor

@chargome I just copied what was there before, but definitely agree about the naming. I split up the two services into separate files and renamed them to TraceInitiator and TraceReceiver, should be more clear

@github-actions

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@sentry/browser22.3 KB (0%)
@sentry/browser (incl. Tracing)33.72 KB (+0.09% 🔺)
@sentry/browser (incl. Tracing, Replay)69.81 KB (+0.04% 🔺)
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags63.11 KB (+0.04% 🔺)
@sentry/browser (incl. Tracing, Replay with Canvas)74.2 KB (+0.04% 🔺)
@sentry/browser (incl. Tracing, Replay, Feedback)86.52 KB (+0.04% 🔺)
@sentry/browser (incl. Tracing, Replay, Feedback, metrics)88.39 KB (+0.04% 🔺)
@sentry/browser (incl. metrics)26.62 KB (+0.11% 🔺)
@sentry/browser (incl. Feedback)38.98 KB (0%)
@sentry/browser (incl. sendFeedback)26.93 KB (0%)
@sentry/browser (incl. FeedbackAsync)31.54 KB (0%)
@sentry/react25.06 KB (0%)
@sentry/react (incl. Tracing)36.79 KB (+0.09% 🔺)
@sentry/vue26.44 KB (+0.13% 🔺)
@sentry/vue (incl. Tracing)35.6 KB (+0.07% 🔺)
@sentry/svelte22.44 KB (0%)
CDN Bundle23.52 KB (0%)
CDN Bundle (incl. Tracing)35.5 KB (+0.09% 🔺)
CDN Bundle (incl. Tracing, Replay)69.91 KB (+0.05% 🔺)
CDN Bundle (incl. Tracing, Replay, Feedback)75.17 KB (+0.05% 🔺)
CDN Bundle - uncompressed69 KB (0%)
CDN Bundle (incl. Tracing) - uncompressed105.1 KB (+0.16% 🔺)
CDN Bundle (incl. Tracing, Replay) - uncompressed216.88 KB (+0.08% 🔺)
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed229.6 KB (+0.07% 🔺)
@sentry/nextjs (client)36.64 KB (+0.07% 🔺)
@sentry/sveltekit (client)34.37 KB (+0.08% 🔺)
@sentry/node111.28 KB (0%)
@sentry/node - without tracing88.73 KB (+0.01% 🔺)
@sentry/aws-serverless97.87 KB (0%)

@nicohrubecnicohrubec self-assigned this Jul 18, 2024
@nicohrubec
nicohrubec merged commit d629991 into developJul 18, 2024
@nicohrubec
nicohrubec deleted the nh/improve-nest-tests branch July 18, 2024 10:04
nicohrubec added a commit that referenced this pull request Jul 23, 2024
- Adds a new nest root module that can be used to setup the Nest SDK as
a replacement for the existing setup (with a function). Instead of
calling `setupNestErrorHandler` in the main.ts file, users can now add
`SentryModule.forRoot()` (feedback about the name is definitely welcome)
as an import in their main app module. This approach is much more native
to nest than what we used so far. This root module is introduced in the
setup.ts file.
- This root module is exported with a submodule export
`@sentry/nestjs/setup`, because the SDK now depends on nestjs directly
and without this the nest instrumentation does not work anymore, since
nest gets imported before Sentry.init gets called, which disables the
otel nest instrumentation.
- Judging from the e2e tests it seems that this new approach also
resolves some issues the previous implementation had, specifically [this
issue](#12351)
seems to be resolved. The e2e test that was in place, just documented
the current (wrong) behavior. So I updated the test to reflect the new
(correct) behavior.
- I updated all the test applications to use the new approach but kept a
copy of the nestjs-basic and nestjs-distributed-tracing with the old
setup (now named node-nestjs-basic and node-nestjs-distributed-tracing
respectively) so we can still verify that the old setup (which a lot of
people use) still keeps working going forward.
- Updated/New tests in this PR: - Sends unexpected exception to Sentry if thrown in Submodule
- Does not send expected exception to Sentry if thrown in Submodule and
caught by a global exception filter
- Does not send expected exception to Sentry if thrown in Submodule and
caught by a local exception filter
- Sends expected exception to Sentry if thrown from submodule registered
before Sentry
- To accomodate the new tests I added several submodules in the
nestjs-with-submodules test-application. These are overall similarly but
have important distinctions:
- example-module-local-filter: Submodule with a local filter registered
using `@UseFilters` on the controller.
- example-module-global-filter: Submodule with a global filter
registered using APP_FILTER in the submodule definition.
- example-module-global-filter-wrong-registration-order: Also has a
global filter set with APP_FILTER, but is registered in the root module
as first submodule, even before the SentryIntegration is initialized.
This case does not work properly in the new setup (Sentry should be set
first), so this module is used for tests documenting this behavior.
- Also set "moduleResolution": "Node16" in the nestjs-basic sample app
to ensure our submodule-export workaround works in both, default and
sub-path-export-compatible TS configs as was suggested
[here](#12948 (comment)).
Sign up for freeto 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.

3 participants

@nicohrubec@Lms24@chargome
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

tests(e2e): Refactor nestjs e2e applications into multiple smaller test applications - #12948

Merged
nicohrubec merged 8 commits into
developfrom
nh/improve-nest-tests
Jul 18, 2024
Merged

tests(e2e): Refactor nestjs e2e applications into multiple smaller test applications#12948
nicohrubec merged 8 commits into
developfrom
nh/improve-nest-tests

Conversation

@nicohrubec

@nicohrubecnicohrubec commented Jul 17, 2024

Copy link
Copy Markdown
Member

Refactor of the existing nestjs test applications. Before we had one sample application testing everything nest-related. This PR splits them up into three applications to make it more readable and easier to understand what is being tested. It also allows for iterating a bit quicker in local development.

No new functionality was added. Will add more tests in a follow-up.

The three new services are:

  • nestjs-basic: Simple nestjs application with no submodules and tests for basic functionality of the SDK like error monitoring and span instrumentation.
  • nestjs-with-submodules: NestJS application that is bit more complex including a submodule (and potentially multiple in the future) to have a more realistic setup for more advanced testing.
  • nestjs-distributed-tracing: Includes tests for trace propagation with multiple services.

@nicohrubec
nicohrubec requested a review from lforstJuly 17, 2024 14:07
@nicohrubec
nicohrubec marked this pull request as ready for review July 17, 2024 14:21
@nicohrubec
nicohrubec requested review from Lms24 and chargomeJuly 17, 2024 15:52
import * as Sentry from '@sentry/nestjs';
import { AppModule } from './app.module';

const app1Port = 3030;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
constapp1Port=3030;
constPORT=3030;

const { httpAdapter } = app.get(HttpAdapterHost);
Sentry.setupNestErrorHandler(app, new BaseExceptionFilter(httpAdapter));

await app.listen(app1Port);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
awaitapp.listen(app1Port);
awaitapp.listen(PORT);

Comment on lines +49 to +64
@Injectable()
export class AppService2 {
externalAllowed(headers: Record<string, string>) {
return {
headers,
route: 'external-allowed',
};
}

externalDisallowed(headers: Record<string, string>) {
return {
headers,
route: 'external-disallowed',
};
}
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

m: would generally move each service into its own file and use more descriptive names instead of AppService1 AppService2 etc.

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

1st pass review: Would you mind adding the purpose of the three new apps to the PR description? Just a brief description of what they do or how they differ from each other would be great for future and external readers :)

import * as Sentry from '@sentry/nestjs';
import { AppModule } from './app.module';

const app1Port = 3030;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
constapp1Port=3030;
constPORT=3030;

const { httpAdapter } = app1.get(HttpAdapterHost);
Sentry.setupNestErrorHandler(app1, new BaseExceptionFilter(httpAdapter));

await app1.listen(app1Port);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
awaitapp1.listen(app1Port);
awaitapp1.listen(PORT);

@chargomechargome left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Looks good! I would just try to prevent naming services etc. with numerical suffixes.

@nicohrubec

Copy link
Copy Markdown
MemberAuthor

@Lms24 Sure good idea, updated the PR description :)

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks for adding the explanation! Looks good to me (once all feedback is addressed)

Comment on lines +2 to +3
"compilerOptions": {
"module": "commonjs",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

out of scope for this PR but idea for once #12920 is ready: In one of these apps we could set "moduleResolution": "Node16" to ensure our "workaround" from yesterday works in both, default and sub-path-export-compatible TS configs.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

sounds good, noted!

@nicohrubec

Copy link
Copy Markdown
MemberAuthor

@chargome I just copied what was there before, but definitely agree about the naming. I split up the two services into separate files and renamed them to TraceInitiator and TraceReceiver, should be more clear

@github-actions

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@sentry/browser22.3 KB (0%)
@sentry/browser (incl. Tracing)33.72 KB (+0.09% 🔺)
@sentry/browser (incl. Tracing, Replay)69.81 KB (+0.04% 🔺)
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags63.11 KB (+0.04% 🔺)
@sentry/browser (incl. Tracing, Replay with Canvas)74.2 KB (+0.04% 🔺)
@sentry/browser (incl. Tracing, Replay, Feedback)86.52 KB (+0.04% 🔺)
@sentry/browser (incl. Tracing, Replay, Feedback, metrics)88.39 KB (+0.04% 🔺)
@sentry/browser (incl. metrics)26.62 KB (+0.11% 🔺)
@sentry/browser (incl. Feedback)38.98 KB (0%)
@sentry/browser (incl. sendFeedback)26.93 KB (0%)
@sentry/browser (incl. FeedbackAsync)31.54 KB (0%)
@sentry/react25.06 KB (0%)
@sentry/react (incl. Tracing)36.79 KB (+0.09% 🔺)
@sentry/vue26.44 KB (+0.13% 🔺)
@sentry/vue (incl. Tracing)35.6 KB (+0.07% 🔺)
@sentry/svelte22.44 KB (0%)
CDN Bundle23.52 KB (0%)
CDN Bundle (incl. Tracing)35.5 KB (+0.09% 🔺)
CDN Bundle (incl. Tracing, Replay)69.91 KB (+0.05% 🔺)
CDN Bundle (incl. Tracing, Replay, Feedback)75.17 KB (+0.05% 🔺)
CDN Bundle - uncompressed69 KB (0%)
CDN Bundle (incl. Tracing) - uncompressed105.1 KB (+0.16% 🔺)
CDN Bundle (incl. Tracing, Replay) - uncompressed216.88 KB (+0.08% 🔺)
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed229.6 KB (+0.07% 🔺)
@sentry/nextjs (client)36.64 KB (+0.07% 🔺)
@sentry/sveltekit (client)34.37 KB (+0.08% 🔺)
@sentry/node111.28 KB (0%)
@sentry/node - without tracing88.73 KB (+0.01% 🔺)
@sentry/aws-serverless97.87 KB (0%)

@nicohrubecnicohrubec self-assigned this Jul 18, 2024
@nicohrubec
nicohrubec merged commit d629991 into developJul 18, 2024
@nicohrubec
nicohrubec deleted the nh/improve-nest-tests branch July 18, 2024 10:04
nicohrubec added a commit that referenced this pull request Jul 23, 2024
- Adds a new nest root module that can be used to setup the Nest SDK as
a replacement for the existing setup (with a function). Instead of
calling `setupNestErrorHandler` in the main.ts file, users can now add
`SentryModule.forRoot()` (feedback about the name is definitely welcome)
as an import in their main app module. This approach is much more native
to nest than what we used so far. This root module is introduced in the
setup.ts file.
- This root module is exported with a submodule export
`@sentry/nestjs/setup`, because the SDK now depends on nestjs directly
and without this the nest instrumentation does not work anymore, since
nest gets imported before Sentry.init gets called, which disables the
otel nest instrumentation.
- Judging from the e2e tests it seems that this new approach also
resolves some issues the previous implementation had, specifically [this
issue](#12351)
seems to be resolved. The e2e test that was in place, just documented
the current (wrong) behavior. So I updated the test to reflect the new
(correct) behavior.
- I updated all the test applications to use the new approach but kept a
copy of the nestjs-basic and nestjs-distributed-tracing with the old
setup (now named node-nestjs-basic and node-nestjs-distributed-tracing
respectively) so we can still verify that the old setup (which a lot of
people use) still keeps working going forward.
- Updated/New tests in this PR: - Sends unexpected exception to Sentry if thrown in Submodule
- Does not send expected exception to Sentry if thrown in Submodule and
caught by a global exception filter
- Does not send expected exception to Sentry if thrown in Submodule and
caught by a local exception filter
- Sends expected exception to Sentry if thrown from submodule registered
before Sentry
- To accomodate the new tests I added several submodules in the
nestjs-with-submodules test-application. These are overall similarly but
have important distinctions:
- example-module-local-filter: Submodule with a local filter registered
using `@UseFilters` on the controller.
- example-module-global-filter: Submodule with a global filter
registered using APP_FILTER in the submodule definition.
- example-module-global-filter-wrong-registration-order: Also has a
global filter set with APP_FILTER, but is registered in the root module
as first submodule, even before the SentryIntegration is initialized.
This case does not work properly in the new setup (Sentry should be set
first), so this module is used for tests documenting this behavior.
- Also set "moduleResolution": "Node16" in the nestjs-basic sample app
to ensure our submodule-export workaround works in both, default and
sub-path-export-compatible TS configs as was suggested
[here](#12948 (comment)).
Sign up for freeto 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.

3 participants

@nicohrubec@Lms24@chargome
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

tests(e2e): Refactor nestjs e2e applications into multiple smaller test applications - #12948

Merged
nicohrubec merged 8 commits into
developfrom
nh/improve-nest-tests
Jul 18, 2024
Merged

tests(e2e): Refactor nestjs e2e applications into multiple smaller test applications#12948
nicohrubec merged 8 commits into
developfrom
nh/improve-nest-tests

Conversation

@nicohrubec

@nicohrubecnicohrubec commented Jul 17, 2024

Copy link
Copy Markdown
Member

Refactor of the existing nestjs test applications. Before we had one sample application testing everything nest-related. This PR splits them up into three applications to make it more readable and easier to understand what is being tested. It also allows for iterating a bit quicker in local development.

No new functionality was added. Will add more tests in a follow-up.

The three new services are:

  • nestjs-basic: Simple nestjs application with no submodules and tests for basic functionality of the SDK like error monitoring and span instrumentation.
  • nestjs-with-submodules: NestJS application that is bit more complex including a submodule (and potentially multiple in the future) to have a more realistic setup for more advanced testing.
  • nestjs-distributed-tracing: Includes tests for trace propagation with multiple services.

@nicohrubec
nicohrubec requested a review from lforstJuly 17, 2024 14:07
@nicohrubec
nicohrubec marked this pull request as ready for review July 17, 2024 14:21
@nicohrubec
nicohrubec requested review from Lms24 and chargomeJuly 17, 2024 15:52
import * as Sentry from '@sentry/nestjs';
import { AppModule } from './app.module';

const app1Port = 3030;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
constapp1Port=3030;
constPORT=3030;

const { httpAdapter } = app.get(HttpAdapterHost);
Sentry.setupNestErrorHandler(app, new BaseExceptionFilter(httpAdapter));

await app.listen(app1Port);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
awaitapp.listen(app1Port);
awaitapp.listen(PORT);

Comment on lines +49 to +64
@Injectable()
export class AppService2 {
externalAllowed(headers: Record<string, string>) {
return {
headers,
route: 'external-allowed',
};
}

externalDisallowed(headers: Record<string, string>) {
return {
headers,
route: 'external-disallowed',
};
}
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

m: would generally move each service into its own file and use more descriptive names instead of AppService1 AppService2 etc.

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

1st pass review: Would you mind adding the purpose of the three new apps to the PR description? Just a brief description of what they do or how they differ from each other would be great for future and external readers :)

import * as Sentry from '@sentry/nestjs';
import { AppModule } from './app.module';

const app1Port = 3030;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
constapp1Port=3030;
constPORT=3030;

const { httpAdapter } = app1.get(HttpAdapterHost);
Sentry.setupNestErrorHandler(app1, new BaseExceptionFilter(httpAdapter));

await app1.listen(app1Port);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
awaitapp1.listen(app1Port);
awaitapp1.listen(PORT);

@chargomechargome left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Looks good! I would just try to prevent naming services etc. with numerical suffixes.

@nicohrubec

Copy link
Copy Markdown
MemberAuthor

@Lms24 Sure good idea, updated the PR description :)

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks for adding the explanation! Looks good to me (once all feedback is addressed)

Comment on lines +2 to +3
"compilerOptions": {
"module": "commonjs",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

out of scope for this PR but idea for once #12920 is ready: In one of these apps we could set "moduleResolution": "Node16" to ensure our "workaround" from yesterday works in both, default and sub-path-export-compatible TS configs.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

sounds good, noted!

@nicohrubec

Copy link
Copy Markdown
MemberAuthor

@chargome I just copied what was there before, but definitely agree about the naming. I split up the two services into separate files and renamed them to TraceInitiator and TraceReceiver, should be more clear

@github-actions

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@sentry/browser22.3 KB (0%)
@sentry/browser (incl. Tracing)33.72 KB (+0.09% 🔺)
@sentry/browser (incl. Tracing, Replay)69.81 KB (+0.04% 🔺)
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags63.11 KB (+0.04% 🔺)
@sentry/browser (incl. Tracing, Replay with Canvas)74.2 KB (+0.04% 🔺)
@sentry/browser (incl. Tracing, Replay, Feedback)86.52 KB (+0.04% 🔺)
@sentry/browser (incl. Tracing, Replay, Feedback, metrics)88.39 KB (+0.04% 🔺)
@sentry/browser (incl. metrics)26.62 KB (+0.11% 🔺)
@sentry/browser (incl. Feedback)38.98 KB (0%)
@sentry/browser (incl. sendFeedback)26.93 KB (0%)
@sentry/browser (incl. FeedbackAsync)31.54 KB (0%)
@sentry/react25.06 KB (0%)
@sentry/react (incl. Tracing)36.79 KB (+0.09% 🔺)
@sentry/vue26.44 KB (+0.13% 🔺)
@sentry/vue (incl. Tracing)35.6 KB (+0.07% 🔺)
@sentry/svelte22.44 KB (0%)
CDN Bundle23.52 KB (0%)
CDN Bundle (incl. Tracing)35.5 KB (+0.09% 🔺)
CDN Bundle (incl. Tracing, Replay)69.91 KB (+0.05% 🔺)
CDN Bundle (incl. Tracing, Replay, Feedback)75.17 KB (+0.05% 🔺)
CDN Bundle - uncompressed69 KB (0%)
CDN Bundle (incl. Tracing) - uncompressed105.1 KB (+0.16% 🔺)
CDN Bundle (incl. Tracing, Replay) - uncompressed216.88 KB (+0.08% 🔺)
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed229.6 KB (+0.07% 🔺)
@sentry/nextjs (client)36.64 KB (+0.07% 🔺)
@sentry/sveltekit (client)34.37 KB (+0.08% 🔺)
@sentry/node111.28 KB (0%)
@sentry/node - without tracing88.73 KB (+0.01% 🔺)
@sentry/aws-serverless97.87 KB (0%)

@nicohrubecnicohrubec self-assigned this Jul 18, 2024
@nicohrubec
nicohrubec merged commit d629991 into developJul 18, 2024
@nicohrubec
nicohrubec deleted the nh/improve-nest-tests branch July 18, 2024 10:04
nicohrubec added a commit that referenced this pull request Jul 23, 2024
- Adds a new nest root module that can be used to setup the Nest SDK as
a replacement for the existing setup (with a function). Instead of
calling `setupNestErrorHandler` in the main.ts file, users can now add
`SentryModule.forRoot()` (feedback about the name is definitely welcome)
as an import in their main app module. This approach is much more native
to nest than what we used so far. This root module is introduced in the
setup.ts file.
- This root module is exported with a submodule export
`@sentry/nestjs/setup`, because the SDK now depends on nestjs directly
and without this the nest instrumentation does not work anymore, since
nest gets imported before Sentry.init gets called, which disables the
otel nest instrumentation.
- Judging from the e2e tests it seems that this new approach also
resolves some issues the previous implementation had, specifically [this
issue](#12351)
seems to be resolved. The e2e test that was in place, just documented
the current (wrong) behavior. So I updated the test to reflect the new
(correct) behavior.
- I updated all the test applications to use the new approach but kept a
copy of the nestjs-basic and nestjs-distributed-tracing with the old
setup (now named node-nestjs-basic and node-nestjs-distributed-tracing
respectively) so we can still verify that the old setup (which a lot of
people use) still keeps working going forward.
- Updated/New tests in this PR: - Sends unexpected exception to Sentry if thrown in Submodule
- Does not send expected exception to Sentry if thrown in Submodule and
caught by a global exception filter
- Does not send expected exception to Sentry if thrown in Submodule and
caught by a local exception filter
- Sends expected exception to Sentry if thrown from submodule registered
before Sentry
- To accomodate the new tests I added several submodules in the
nestjs-with-submodules test-application. These are overall similarly but
have important distinctions:
- example-module-local-filter: Submodule with a local filter registered
using `@UseFilters` on the controller.
- example-module-global-filter: Submodule with a global filter
registered using APP_FILTER in the submodule definition.
- example-module-global-filter-wrong-registration-order: Also has a
global filter set with APP_FILTER, but is registered in the root module
as first submodule, even before the SentryIntegration is initialized.
This case does not work properly in the new setup (Sentry should be set
first), so this module is used for tests documenting this behavior.
- Also set "moduleResolution": "Node16" in the nestjs-basic sample app
to ensure our submodule-export workaround works in both, default and
sub-path-export-compatible TS configs as was suggested
[here](#12948 (comment)).
Sign up for freeto 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.

3 participants

@nicohrubec@Lms24@chargome
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

tests(e2e): Refactor nestjs e2e applications into multiple smaller test applications - #12948

Merged
nicohrubec merged 8 commits into
developfrom
nh/improve-nest-tests
Jul 18, 2024
Merged

tests(e2e): Refactor nestjs e2e applications into multiple smaller test applications#12948
nicohrubec merged 8 commits into
developfrom
nh/improve-nest-tests

Conversation

@nicohrubec

@nicohrubecnicohrubec commented Jul 17, 2024

Copy link
Copy Markdown
Member

Refactor of the existing nestjs test applications. Before we had one sample application testing everything nest-related. This PR splits them up into three applications to make it more readable and easier to understand what is being tested. It also allows for iterating a bit quicker in local development.

No new functionality was added. Will add more tests in a follow-up.

The three new services are:

  • nestjs-basic: Simple nestjs application with no submodules and tests for basic functionality of the SDK like error monitoring and span instrumentation.
  • nestjs-with-submodules: NestJS application that is bit more complex including a submodule (and potentially multiple in the future) to have a more realistic setup for more advanced testing.
  • nestjs-distributed-tracing: Includes tests for trace propagation with multiple services.

@nicohrubec
nicohrubec requested a review from lforstJuly 17, 2024 14:07
@nicohrubec
nicohrubec marked this pull request as ready for review July 17, 2024 14:21
@nicohrubec
nicohrubec requested review from Lms24 and chargomeJuly 17, 2024 15:52
import * as Sentry from '@sentry/nestjs';
import { AppModule } from './app.module';

const app1Port = 3030;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
constapp1Port=3030;
constPORT=3030;

const { httpAdapter } = app.get(HttpAdapterHost);
Sentry.setupNestErrorHandler(app, new BaseExceptionFilter(httpAdapter));

await app.listen(app1Port);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
awaitapp.listen(app1Port);
awaitapp.listen(PORT);

Comment on lines +49 to +64
@Injectable()
export class AppService2 {
externalAllowed(headers: Record<string, string>) {
return {
headers,
route: 'external-allowed',
};
}

externalDisallowed(headers: Record<string, string>) {
return {
headers,
route: 'external-disallowed',
};
}
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

m: would generally move each service into its own file and use more descriptive names instead of AppService1 AppService2 etc.

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

1st pass review: Would you mind adding the purpose of the three new apps to the PR description? Just a brief description of what they do or how they differ from each other would be great for future and external readers :)

import * as Sentry from '@sentry/nestjs';
import { AppModule } from './app.module';

const app1Port = 3030;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
constapp1Port=3030;
constPORT=3030;

const { httpAdapter } = app1.get(HttpAdapterHost);
Sentry.setupNestErrorHandler(app1, new BaseExceptionFilter(httpAdapter));

await app1.listen(app1Port);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
awaitapp1.listen(app1Port);
awaitapp1.listen(PORT);

@chargomechargome left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Looks good! I would just try to prevent naming services etc. with numerical suffixes.

@nicohrubec

Copy link
Copy Markdown
MemberAuthor

@Lms24 Sure good idea, updated the PR description :)

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks for adding the explanation! Looks good to me (once all feedback is addressed)

Comment on lines +2 to +3
"compilerOptions": {
"module": "commonjs",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

out of scope for this PR but idea for once #12920 is ready: In one of these apps we could set "moduleResolution": "Node16" to ensure our "workaround" from yesterday works in both, default and sub-path-export-compatible TS configs.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

sounds good, noted!

@nicohrubec

Copy link
Copy Markdown
MemberAuthor

@chargome I just copied what was there before, but definitely agree about the naming. I split up the two services into separate files and renamed them to TraceInitiator and TraceReceiver, should be more clear

@github-actions

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@sentry/browser22.3 KB (0%)
@sentry/browser (incl. Tracing)33.72 KB (+0.09% 🔺)
@sentry/browser (incl. Tracing, Replay)69.81 KB (+0.04% 🔺)
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags63.11 KB (+0.04% 🔺)
@sentry/browser (incl. Tracing, Replay with Canvas)74.2 KB (+0.04% 🔺)
@sentry/browser (incl. Tracing, Replay, Feedback)86.52 KB (+0.04% 🔺)
@sentry/browser (incl. Tracing, Replay, Feedback, metrics)88.39 KB (+0.04% 🔺)
@sentry/browser (incl. metrics)26.62 KB (+0.11% 🔺)
@sentry/browser (incl. Feedback)38.98 KB (0%)
@sentry/browser (incl. sendFeedback)26.93 KB (0%)
@sentry/browser (incl. FeedbackAsync)31.54 KB (0%)
@sentry/react25.06 KB (0%)
@sentry/react (incl. Tracing)36.79 KB (+0.09% 🔺)
@sentry/vue26.44 KB (+0.13% 🔺)
@sentry/vue (incl. Tracing)35.6 KB (+0.07% 🔺)
@sentry/svelte22.44 KB (0%)
CDN Bundle23.52 KB (0%)
CDN Bundle (incl. Tracing)35.5 KB (+0.09% 🔺)
CDN Bundle (incl. Tracing, Replay)69.91 KB (+0.05% 🔺)
CDN Bundle (incl. Tracing, Replay, Feedback)75.17 KB (+0.05% 🔺)
CDN Bundle - uncompressed69 KB (0%)
CDN Bundle (incl. Tracing) - uncompressed105.1 KB (+0.16% 🔺)
CDN Bundle (incl. Tracing, Replay) - uncompressed216.88 KB (+0.08% 🔺)
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed229.6 KB (+0.07% 🔺)
@sentry/nextjs (client)36.64 KB (+0.07% 🔺)
@sentry/sveltekit (client)34.37 KB (+0.08% 🔺)
@sentry/node111.28 KB (0%)
@sentry/node - without tracing88.73 KB (+0.01% 🔺)
@sentry/aws-serverless97.87 KB (0%)

@nicohrubecnicohrubec self-assigned this Jul 18, 2024
@nicohrubec
nicohrubec merged commit d629991 into developJul 18, 2024
@nicohrubec
nicohrubec deleted the nh/improve-nest-tests branch July 18, 2024 10:04
nicohrubec added a commit that referenced this pull request Jul 23, 2024
- Adds a new nest root module that can be used to setup the Nest SDK as
a replacement for the existing setup (with a function). Instead of
calling `setupNestErrorHandler` in the main.ts file, users can now add
`SentryModule.forRoot()` (feedback about the name is definitely welcome)
as an import in their main app module. This approach is much more native
to nest than what we used so far. This root module is introduced in the
setup.ts file.
- This root module is exported with a submodule export
`@sentry/nestjs/setup`, because the SDK now depends on nestjs directly
and without this the nest instrumentation does not work anymore, since
nest gets imported before Sentry.init gets called, which disables the
otel nest instrumentation.
- Judging from the e2e tests it seems that this new approach also
resolves some issues the previous implementation had, specifically [this
issue](#12351)
seems to be resolved. The e2e test that was in place, just documented
the current (wrong) behavior. So I updated the test to reflect the new
(correct) behavior.
- I updated all the test applications to use the new approach but kept a
copy of the nestjs-basic and nestjs-distributed-tracing with the old
setup (now named node-nestjs-basic and node-nestjs-distributed-tracing
respectively) so we can still verify that the old setup (which a lot of
people use) still keeps working going forward.
- Updated/New tests in this PR: - Sends unexpected exception to Sentry if thrown in Submodule
- Does not send expected exception to Sentry if thrown in Submodule and
caught by a global exception filter
- Does not send expected exception to Sentry if thrown in Submodule and
caught by a local exception filter
- Sends expected exception to Sentry if thrown from submodule registered
before Sentry
- To accomodate the new tests I added several submodules in the
nestjs-with-submodules test-application. These are overall similarly but
have important distinctions:
- example-module-local-filter: Submodule with a local filter registered
using `@UseFilters` on the controller.
- example-module-global-filter: Submodule with a global filter
registered using APP_FILTER in the submodule definition.
- example-module-global-filter-wrong-registration-order: Also has a
global filter set with APP_FILTER, but is registered in the root module
as first submodule, even before the SentryIntegration is initialized.
This case does not work properly in the new setup (Sentry should be set
first), so this module is used for tests documenting this behavior.
- Also set "moduleResolution": "Node16" in the nestjs-basic sample app
to ensure our submodule-export workaround works in both, default and
sub-path-export-compatible TS configs as was suggested
[here](#12948 (comment)).
Sign up for freeto 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.

3 participants

@nicohrubec@Lms24@chargome
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

tests(e2e): Refactor nestjs e2e applications into multiple smaller test applications - #12948

Merged
nicohrubec merged 8 commits into
developfrom
nh/improve-nest-tests
Jul 18, 2024
Merged

tests(e2e): Refactor nestjs e2e applications into multiple smaller test applications#12948
nicohrubec merged 8 commits into
developfrom
nh/improve-nest-tests

Conversation

@nicohrubec

@nicohrubecnicohrubec commented Jul 17, 2024

Copy link
Copy Markdown
Member

Refactor of the existing nestjs test applications. Before we had one sample application testing everything nest-related. This PR splits them up into three applications to make it more readable and easier to understand what is being tested. It also allows for iterating a bit quicker in local development.

No new functionality was added. Will add more tests in a follow-up.

The three new services are:

  • nestjs-basic: Simple nestjs application with no submodules and tests for basic functionality of the SDK like error monitoring and span instrumentation.
  • nestjs-with-submodules: NestJS application that is bit more complex including a submodule (and potentially multiple in the future) to have a more realistic setup for more advanced testing.
  • nestjs-distributed-tracing: Includes tests for trace propagation with multiple services.

@nicohrubec
nicohrubec requested a review from lforstJuly 17, 2024 14:07
@nicohrubec
nicohrubec marked this pull request as ready for review July 17, 2024 14:21
@nicohrubec
nicohrubec requested review from Lms24 and chargomeJuly 17, 2024 15:52
import * as Sentry from '@sentry/nestjs';
import { AppModule } from './app.module';

const app1Port = 3030;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
constapp1Port=3030;
constPORT=3030;

const { httpAdapter } = app.get(HttpAdapterHost);
Sentry.setupNestErrorHandler(app, new BaseExceptionFilter(httpAdapter));

await app.listen(app1Port);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
awaitapp.listen(app1Port);
awaitapp.listen(PORT);

Comment on lines +49 to +64
@Injectable()
export class AppService2 {
externalAllowed(headers: Record<string, string>) {
return {
headers,
route: 'external-allowed',
};
}

externalDisallowed(headers: Record<string, string>) {
return {
headers,
route: 'external-disallowed',
};
}
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

m: would generally move each service into its own file and use more descriptive names instead of AppService1 AppService2 etc.

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

1st pass review: Would you mind adding the purpose of the three new apps to the PR description? Just a brief description of what they do or how they differ from each other would be great for future and external readers :)

import * as Sentry from '@sentry/nestjs';
import { AppModule } from './app.module';

const app1Port = 3030;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
constapp1Port=3030;
constPORT=3030;

const { httpAdapter } = app1.get(HttpAdapterHost);
Sentry.setupNestErrorHandler(app1, new BaseExceptionFilter(httpAdapter));

await app1.listen(app1Port);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
awaitapp1.listen(app1Port);
awaitapp1.listen(PORT);

@chargomechargome left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Looks good! I would just try to prevent naming services etc. with numerical suffixes.

@nicohrubec

Copy link
Copy Markdown
MemberAuthor

@Lms24 Sure good idea, updated the PR description :)

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks for adding the explanation! Looks good to me (once all feedback is addressed)

Comment on lines +2 to +3
"compilerOptions": {
"module": "commonjs",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

out of scope for this PR but idea for once #12920 is ready: In one of these apps we could set "moduleResolution": "Node16" to ensure our "workaround" from yesterday works in both, default and sub-path-export-compatible TS configs.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

sounds good, noted!

@nicohrubec

Copy link
Copy Markdown
MemberAuthor

@chargome I just copied what was there before, but definitely agree about the naming. I split up the two services into separate files and renamed them to TraceInitiator and TraceReceiver, should be more clear

@github-actions

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@sentry/browser22.3 KB (0%)
@sentry/browser (incl. Tracing)33.72 KB (+0.09% 🔺)
@sentry/browser (incl. Tracing, Replay)69.81 KB (+0.04% 🔺)
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags63.11 KB (+0.04% 🔺)
@sentry/browser (incl. Tracing, Replay with Canvas)74.2 KB (+0.04% 🔺)
@sentry/browser (incl. Tracing, Replay, Feedback)86.52 KB (+0.04% 🔺)
@sentry/browser (incl. Tracing, Replay, Feedback, metrics)88.39 KB (+0.04% 🔺)
@sentry/browser (incl. metrics)26.62 KB (+0.11% 🔺)
@sentry/browser (incl. Feedback)38.98 KB (0%)
@sentry/browser (incl. sendFeedback)26.93 KB (0%)
@sentry/browser (incl. FeedbackAsync)31.54 KB (0%)
@sentry/react25.06 KB (0%)
@sentry/react (incl. Tracing)36.79 KB (+0.09% 🔺)
@sentry/vue26.44 KB (+0.13% 🔺)
@sentry/vue (incl. Tracing)35.6 KB (+0.07% 🔺)
@sentry/svelte22.44 KB (0%)
CDN Bundle23.52 KB (0%)
CDN Bundle (incl. Tracing)35.5 KB (+0.09% 🔺)
CDN Bundle (incl. Tracing, Replay)69.91 KB (+0.05% 🔺)
CDN Bundle (incl. Tracing, Replay, Feedback)75.17 KB (+0.05% 🔺)
CDN Bundle - uncompressed69 KB (0%)
CDN Bundle (incl. Tracing) - uncompressed105.1 KB (+0.16% 🔺)
CDN Bundle (incl. Tracing, Replay) - uncompressed216.88 KB (+0.08% 🔺)
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed229.6 KB (+0.07% 🔺)
@sentry/nextjs (client)36.64 KB (+0.07% 🔺)
@sentry/sveltekit (client)34.37 KB (+0.08% 🔺)
@sentry/node111.28 KB (0%)
@sentry/node - without tracing88.73 KB (+0.01% 🔺)
@sentry/aws-serverless97.87 KB (0%)

@nicohrubecnicohrubec self-assigned this Jul 18, 2024
@nicohrubec
nicohrubec merged commit d629991 into developJul 18, 2024
@nicohrubec
nicohrubec deleted the nh/improve-nest-tests branch July 18, 2024 10:04
nicohrubec added a commit that referenced this pull request Jul 23, 2024
- Adds a new nest root module that can be used to setup the Nest SDK as
a replacement for the existing setup (with a function). Instead of
calling `setupNestErrorHandler` in the main.ts file, users can now add
`SentryModule.forRoot()` (feedback about the name is definitely welcome)
as an import in their main app module. This approach is much more native
to nest than what we used so far. This root module is introduced in the
setup.ts file.
- This root module is exported with a submodule export
`@sentry/nestjs/setup`, because the SDK now depends on nestjs directly
and without this the nest instrumentation does not work anymore, since
nest gets imported before Sentry.init gets called, which disables the
otel nest instrumentation.
- Judging from the e2e tests it seems that this new approach also
resolves some issues the previous implementation had, specifically [this
issue](#12351)
seems to be resolved. The e2e test that was in place, just documented
the current (wrong) behavior. So I updated the test to reflect the new
(correct) behavior.
- I updated all the test applications to use the new approach but kept a
copy of the nestjs-basic and nestjs-distributed-tracing with the old
setup (now named node-nestjs-basic and node-nestjs-distributed-tracing
respectively) so we can still verify that the old setup (which a lot of
people use) still keeps working going forward.
- Updated/New tests in this PR: - Sends unexpected exception to Sentry if thrown in Submodule
- Does not send expected exception to Sentry if thrown in Submodule and
caught by a global exception filter
- Does not send expected exception to Sentry if thrown in Submodule and
caught by a local exception filter
- Sends expected exception to Sentry if thrown from submodule registered
before Sentry
- To accomodate the new tests I added several submodules in the
nestjs-with-submodules test-application. These are overall similarly but
have important distinctions:
- example-module-local-filter: Submodule with a local filter registered
using `@UseFilters` on the controller.
- example-module-global-filter: Submodule with a global filter
registered using APP_FILTER in the submodule definition.
- example-module-global-filter-wrong-registration-order: Also has a
global filter set with APP_FILTER, but is registered in the root module
as first submodule, even before the SentryIntegration is initialized.
This case does not work properly in the new setup (Sentry should be set
first), so this module is used for tests documenting this behavior.
- Also set "moduleResolution": "Node16" in the nestjs-basic sample app
to ensure our submodule-export workaround works in both, default and
sub-path-export-compatible TS configs as was suggested
[here](#12948 (comment)).
Sign up for freeto 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.

3 participants

@nicohrubec@Lms24@chargome
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

tests(e2e): Refactor nestjs e2e applications into multiple smaller test applications - #12948

Merged
nicohrubec merged 8 commits into
developfrom
nh/improve-nest-tests
Jul 18, 2024
Merged

tests(e2e): Refactor nestjs e2e applications into multiple smaller test applications#12948
nicohrubec merged 8 commits into
developfrom
nh/improve-nest-tests

Conversation

@nicohrubec

@nicohrubecnicohrubec commented Jul 17, 2024

Copy link
Copy Markdown
Member

Refactor of the existing nestjs test applications. Before we had one sample application testing everything nest-related. This PR splits them up into three applications to make it more readable and easier to understand what is being tested. It also allows for iterating a bit quicker in local development.

No new functionality was added. Will add more tests in a follow-up.

The three new services are:

  • nestjs-basic: Simple nestjs application with no submodules and tests for basic functionality of the SDK like error monitoring and span instrumentation.
  • nestjs-with-submodules: NestJS application that is bit more complex including a submodule (and potentially multiple in the future) to have a more realistic setup for more advanced testing.
  • nestjs-distributed-tracing: Includes tests for trace propagation with multiple services.

@nicohrubec
nicohrubec requested a review from lforstJuly 17, 2024 14:07
@nicohrubec
nicohrubec marked this pull request as ready for review July 17, 2024 14:21
@nicohrubec
nicohrubec requested review from Lms24 and chargomeJuly 17, 2024 15:52
import * as Sentry from '@sentry/nestjs';
import { AppModule } from './app.module';

const app1Port = 3030;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
constapp1Port=3030;
constPORT=3030;

const { httpAdapter } = app.get(HttpAdapterHost);
Sentry.setupNestErrorHandler(app, new BaseExceptionFilter(httpAdapter));

await app.listen(app1Port);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
awaitapp.listen(app1Port);
awaitapp.listen(PORT);

Comment on lines +49 to +64
@Injectable()
export class AppService2 {
externalAllowed(headers: Record<string, string>) {
return {
headers,
route: 'external-allowed',
};
}

externalDisallowed(headers: Record<string, string>) {
return {
headers,
route: 'external-disallowed',
};
}
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

m: would generally move each service into its own file and use more descriptive names instead of AppService1 AppService2 etc.

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

1st pass review: Would you mind adding the purpose of the three new apps to the PR description? Just a brief description of what they do or how they differ from each other would be great for future and external readers :)

import * as Sentry from '@sentry/nestjs';
import { AppModule } from './app.module';

const app1Port = 3030;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
constapp1Port=3030;
constPORT=3030;

const { httpAdapter } = app1.get(HttpAdapterHost);
Sentry.setupNestErrorHandler(app1, new BaseExceptionFilter(httpAdapter));

await app1.listen(app1Port);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
awaitapp1.listen(app1Port);
awaitapp1.listen(PORT);

@chargomechargome left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Looks good! I would just try to prevent naming services etc. with numerical suffixes.

@nicohrubec

Copy link
Copy Markdown
MemberAuthor

@Lms24 Sure good idea, updated the PR description :)

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks for adding the explanation! Looks good to me (once all feedback is addressed)

Comment on lines +2 to +3
"compilerOptions": {
"module": "commonjs",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

out of scope for this PR but idea for once #12920 is ready: In one of these apps we could set "moduleResolution": "Node16" to ensure our "workaround" from yesterday works in both, default and sub-path-export-compatible TS configs.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

sounds good, noted!

@nicohrubec

Copy link
Copy Markdown
MemberAuthor

@chargome I just copied what was there before, but definitely agree about the naming. I split up the two services into separate files and renamed them to TraceInitiator and TraceReceiver, should be more clear

@github-actions

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@sentry/browser22.3 KB (0%)
@sentry/browser (incl. Tracing)33.72 KB (+0.09% 🔺)
@sentry/browser (incl. Tracing, Replay)69.81 KB (+0.04% 🔺)
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags63.11 KB (+0.04% 🔺)
@sentry/browser (incl. Tracing, Replay with Canvas)74.2 KB (+0.04% 🔺)
@sentry/browser (incl. Tracing, Replay, Feedback)86.52 KB (+0.04% 🔺)
@sentry/browser (incl. Tracing, Replay, Feedback, metrics)88.39 KB (+0.04% 🔺)
@sentry/browser (incl. metrics)26.62 KB (+0.11% 🔺)
@sentry/browser (incl. Feedback)38.98 KB (0%)
@sentry/browser (incl. sendFeedback)26.93 KB (0%)
@sentry/browser (incl. FeedbackAsync)31.54 KB (0%)
@sentry/react25.06 KB (0%)
@sentry/react (incl. Tracing)36.79 KB (+0.09% 🔺)
@sentry/vue26.44 KB (+0.13% 🔺)
@sentry/vue (incl. Tracing)35.6 KB (+0.07% 🔺)
@sentry/svelte22.44 KB (0%)
CDN Bundle23.52 KB (0%)
CDN Bundle (incl. Tracing)35.5 KB (+0.09% 🔺)
CDN Bundle (incl. Tracing, Replay)69.91 KB (+0.05% 🔺)
CDN Bundle (incl. Tracing, Replay, Feedback)75.17 KB (+0.05% 🔺)
CDN Bundle - uncompressed69 KB (0%)
CDN Bundle (incl. Tracing) - uncompressed105.1 KB (+0.16% 🔺)
CDN Bundle (incl. Tracing, Replay) - uncompressed216.88 KB (+0.08% 🔺)
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed229.6 KB (+0.07% 🔺)
@sentry/nextjs (client)36.64 KB (+0.07% 🔺)
@sentry/sveltekit (client)34.37 KB (+0.08% 🔺)
@sentry/node111.28 KB (0%)
@sentry/node - without tracing88.73 KB (+0.01% 🔺)
@sentry/aws-serverless97.87 KB (0%)

@nicohrubecnicohrubec self-assigned this Jul 18, 2024
@nicohrubec
nicohrubec merged commit d629991 into developJul 18, 2024
@nicohrubec
nicohrubec deleted the nh/improve-nest-tests branch July 18, 2024 10:04
nicohrubec added a commit that referenced this pull request Jul 23, 2024
- Adds a new nest root module that can be used to setup the Nest SDK as
a replacement for the existing setup (with a function). Instead of
calling `setupNestErrorHandler` in the main.ts file, users can now add
`SentryModule.forRoot()` (feedback about the name is definitely welcome)
as an import in their main app module. This approach is much more native
to nest than what we used so far. This root module is introduced in the
setup.ts file.
- This root module is exported with a submodule export
`@sentry/nestjs/setup`, because the SDK now depends on nestjs directly
and without this the nest instrumentation does not work anymore, since
nest gets imported before Sentry.init gets called, which disables the
otel nest instrumentation.
- Judging from the e2e tests it seems that this new approach also
resolves some issues the previous implementation had, specifically [this
issue](#12351)
seems to be resolved. The e2e test that was in place, just documented
the current (wrong) behavior. So I updated the test to reflect the new
(correct) behavior.
- I updated all the test applications to use the new approach but kept a
copy of the nestjs-basic and nestjs-distributed-tracing with the old
setup (now named node-nestjs-basic and node-nestjs-distributed-tracing
respectively) so we can still verify that the old setup (which a lot of
people use) still keeps working going forward.
- Updated/New tests in this PR: - Sends unexpected exception to Sentry if thrown in Submodule
- Does not send expected exception to Sentry if thrown in Submodule and
caught by a global exception filter
- Does not send expected exception to Sentry if thrown in Submodule and
caught by a local exception filter
- Sends expected exception to Sentry if thrown from submodule registered
before Sentry
- To accomodate the new tests I added several submodules in the
nestjs-with-submodules test-application. These are overall similarly but
have important distinctions:
- example-module-local-filter: Submodule with a local filter registered
using `@UseFilters` on the controller.
- example-module-global-filter: Submodule with a global filter
registered using APP_FILTER in the submodule definition.
- example-module-global-filter-wrong-registration-order: Also has a
global filter set with APP_FILTER, but is registered in the root module
as first submodule, even before the SentryIntegration is initialized.
This case does not work properly in the new setup (Sentry should be set
first), so this module is used for tests documenting this behavior.
- Also set "moduleResolution": "Node16" in the nestjs-basic sample app
to ensure our submodule-export workaround works in both, default and
sub-path-export-compatible TS configs as was suggested
[here](#12948 (comment)).
Sign up for freeto 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.

3 participants

@nicohrubec@Lms24@chargome
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

tests(e2e): Refactor nestjs e2e applications into multiple smaller test applications - #12948

Merged
nicohrubec merged 8 commits into
developfrom
nh/improve-nest-tests
Jul 18, 2024
Merged

tests(e2e): Refactor nestjs e2e applications into multiple smaller test applications#12948
nicohrubec merged 8 commits into
developfrom
nh/improve-nest-tests

Conversation

@nicohrubec

@nicohrubecnicohrubec commented Jul 17, 2024

Copy link
Copy Markdown
Member

Refactor of the existing nestjs test applications. Before we had one sample application testing everything nest-related. This PR splits them up into three applications to make it more readable and easier to understand what is being tested. It also allows for iterating a bit quicker in local development.

No new functionality was added. Will add more tests in a follow-up.

The three new services are:

  • nestjs-basic: Simple nestjs application with no submodules and tests for basic functionality of the SDK like error monitoring and span instrumentation.
  • nestjs-with-submodules: NestJS application that is bit more complex including a submodule (and potentially multiple in the future) to have a more realistic setup for more advanced testing.
  • nestjs-distributed-tracing: Includes tests for trace propagation with multiple services.

@nicohrubec
nicohrubec requested a review from lforstJuly 17, 2024 14:07
@nicohrubec
nicohrubec marked this pull request as ready for review July 17, 2024 14:21
@nicohrubec
nicohrubec requested review from Lms24 and chargomeJuly 17, 2024 15:52
import * as Sentry from '@sentry/nestjs';
import { AppModule } from './app.module';

const app1Port = 3030;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
constapp1Port=3030;
constPORT=3030;

const { httpAdapter } = app.get(HttpAdapterHost);
Sentry.setupNestErrorHandler(app, new BaseExceptionFilter(httpAdapter));

await app.listen(app1Port);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
awaitapp.listen(app1Port);
awaitapp.listen(PORT);

Comment on lines +49 to +64
@Injectable()
export class AppService2 {
externalAllowed(headers: Record<string, string>) {
return {
headers,
route: 'external-allowed',
};
}

externalDisallowed(headers: Record<string, string>) {
return {
headers,
route: 'external-disallowed',
};
}
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

m: would generally move each service into its own file and use more descriptive names instead of AppService1 AppService2 etc.

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

1st pass review: Would you mind adding the purpose of the three new apps to the PR description? Just a brief description of what they do or how they differ from each other would be great for future and external readers :)

import * as Sentry from '@sentry/nestjs';
import { AppModule } from './app.module';

const app1Port = 3030;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
constapp1Port=3030;
constPORT=3030;

const { httpAdapter } = app1.get(HttpAdapterHost);
Sentry.setupNestErrorHandler(app1, new BaseExceptionFilter(httpAdapter));

await app1.listen(app1Port);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
awaitapp1.listen(app1Port);
awaitapp1.listen(PORT);

@chargomechargome left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Looks good! I would just try to prevent naming services etc. with numerical suffixes.

@nicohrubec

Copy link
Copy Markdown
MemberAuthor

@Lms24 Sure good idea, updated the PR description :)

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks for adding the explanation! Looks good to me (once all feedback is addressed)

Comment on lines +2 to +3
"compilerOptions": {
"module": "commonjs",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

out of scope for this PR but idea for once #12920 is ready: In one of these apps we could set "moduleResolution": "Node16" to ensure our "workaround" from yesterday works in both, default and sub-path-export-compatible TS configs.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

sounds good, noted!

@nicohrubec

Copy link
Copy Markdown
MemberAuthor

@chargome I just copied what was there before, but definitely agree about the naming. I split up the two services into separate files and renamed them to TraceInitiator and TraceReceiver, should be more clear

@github-actions

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@sentry/browser22.3 KB (0%)
@sentry/browser (incl. Tracing)33.72 KB (+0.09% 🔺)
@sentry/browser (incl. Tracing, Replay)69.81 KB (+0.04% 🔺)
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags63.11 KB (+0.04% 🔺)
@sentry/browser (incl. Tracing, Replay with Canvas)74.2 KB (+0.04% 🔺)
@sentry/browser (incl. Tracing, Replay, Feedback)86.52 KB (+0.04% 🔺)
@sentry/browser (incl. Tracing, Replay, Feedback, metrics)88.39 KB (+0.04% 🔺)
@sentry/browser (incl. metrics)26.62 KB (+0.11% 🔺)
@sentry/browser (incl. Feedback)38.98 KB (0%)
@sentry/browser (incl. sendFeedback)26.93 KB (0%)
@sentry/browser (incl. FeedbackAsync)31.54 KB (0%)
@sentry/react25.06 KB (0%)
@sentry/react (incl. Tracing)36.79 KB (+0.09% 🔺)
@sentry/vue26.44 KB (+0.13% 🔺)
@sentry/vue (incl. Tracing)35.6 KB (+0.07% 🔺)
@sentry/svelte22.44 KB (0%)
CDN Bundle23.52 KB (0%)
CDN Bundle (incl. Tracing)35.5 KB (+0.09% 🔺)
CDN Bundle (incl. Tracing, Replay)69.91 KB (+0.05% 🔺)
CDN Bundle (incl. Tracing, Replay, Feedback)75.17 KB (+0.05% 🔺)
CDN Bundle - uncompressed69 KB (0%)
CDN Bundle (incl. Tracing) - uncompressed105.1 KB (+0.16% 🔺)
CDN Bundle (incl. Tracing, Replay) - uncompressed216.88 KB (+0.08% 🔺)
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed229.6 KB (+0.07% 🔺)
@sentry/nextjs (client)36.64 KB (+0.07% 🔺)
@sentry/sveltekit (client)34.37 KB (+0.08% 🔺)
@sentry/node111.28 KB (0%)
@sentry/node - without tracing88.73 KB (+0.01% 🔺)
@sentry/aws-serverless97.87 KB (0%)

@nicohrubecnicohrubec self-assigned this Jul 18, 2024
@nicohrubec
nicohrubec merged commit d629991 into developJul 18, 2024
@nicohrubec
nicohrubec deleted the nh/improve-nest-tests branch July 18, 2024 10:04
nicohrubec added a commit that referenced this pull request Jul 23, 2024
- Adds a new nest root module that can be used to setup the Nest SDK as
a replacement for the existing setup (with a function). Instead of
calling `setupNestErrorHandler` in the main.ts file, users can now add
`SentryModule.forRoot()` (feedback about the name is definitely welcome)
as an import in their main app module. This approach is much more native
to nest than what we used so far. This root module is introduced in the
setup.ts file.
- This root module is exported with a submodule export
`@sentry/nestjs/setup`, because the SDK now depends on nestjs directly
and without this the nest instrumentation does not work anymore, since
nest gets imported before Sentry.init gets called, which disables the
otel nest instrumentation.
- Judging from the e2e tests it seems that this new approach also
resolves some issues the previous implementation had, specifically [this
issue](#12351)
seems to be resolved. The e2e test that was in place, just documented
the current (wrong) behavior. So I updated the test to reflect the new
(correct) behavior.
- I updated all the test applications to use the new approach but kept a
copy of the nestjs-basic and nestjs-distributed-tracing with the old
setup (now named node-nestjs-basic and node-nestjs-distributed-tracing
respectively) so we can still verify that the old setup (which a lot of
people use) still keeps working going forward.
- Updated/New tests in this PR: - Sends unexpected exception to Sentry if thrown in Submodule
- Does not send expected exception to Sentry if thrown in Submodule and
caught by a global exception filter
- Does not send expected exception to Sentry if thrown in Submodule and
caught by a local exception filter
- Sends expected exception to Sentry if thrown from submodule registered
before Sentry
- To accomodate the new tests I added several submodules in the
nestjs-with-submodules test-application. These are overall similarly but
have important distinctions:
- example-module-local-filter: Submodule with a local filter registered
using `@UseFilters` on the controller.
- example-module-global-filter: Submodule with a global filter
registered using APP_FILTER in the submodule definition.
- example-module-global-filter-wrong-registration-order: Also has a
global filter set with APP_FILTER, but is registered in the root module
as first submodule, even before the SentryIntegration is initialized.
This case does not work properly in the new setup (Sentry should be set
first), so this module is used for tests documenting this behavior.
- Also set "moduleResolution": "Node16" in the nestjs-basic sample app
to ensure our submodule-export workaround works in both, default and
sub-path-export-compatible TS configs as was suggested
[here](#12948 (comment)).
Sign up for freeto 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.

3 participants

@nicohrubec@Lms24@chargome