Skip to content

Commit

Permalink
Merge pull request newrelic#47 from mrickard/NEWRELIC-5806/add-source…
Browse files Browse the repository at this point in the history
…-map-example

Example of source map support
  • Loading branch information
mrickard authored Jan 27, 2023
2 parents bcf59aa + d7486ac commit 04c2b25
Show file tree
Hide file tree
Showing 15 changed files with 7,767 additions and 0 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
node_modules
newrelic_agent.log
.idea
dist
2 changes: 2 additions & 0 deletions source-maps/.eslintignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
dist
node_modules
15 changes: 15 additions & 0 deletions source-maps/.eslintrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
module.exports = {
env: {
es2021: true,
node: true
},
extends: 'standard-with-typescript',
overrides: [
],
parserOptions: {
ecmaVersion: 'latest',
project: './tsconfig.json'
},
rules: {
}
}
36 changes: 36 additions & 0 deletions source-maps/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
This is an example express web server written with TypeScript, demonstrating the advantages of enabling Node's source maps support for transpiled applications.

To enable source maps support in your own transpiled application, add `--enable-source-maps` to the `node` command that starts your application.

Why should you enable source maps support? When applications are developed with transpiled languages, any error stacktraces will typically point to files, lines, and functions within the built files, rather than the source files.

Enabling source map support in Node.js can provide developers with a more meaningful error trace which points to lines and functions within the source code.

This application demonstrates this clearly:

1. Edit `newrelic.js` to add your New Relic INGEST-LICENSE key.
2. Build the project with `npm run build`.
3. Start with `npm run start:nomaps`--this command starts the application without source map support.
4. In your web browser, visit http://localhost:3000/cats multiple times.

The file `src/models/cats.ts` will randomly throw an error for roughly 25% of all requests, showing you a stack trace like this one:
```shell
Error: Failed to get all cats in model
at /dist/models/cats.js:41:23
... (multiple functions in New Relic Node agent js files)
at /dist/models/cats.js:39:35
at Generator.next (<anonymous>)
```
Note that the trace refers to the built files in `/dist`.

5. Stop the application, and restart with `npm run start:withmaps`.
6. Visit http://localhost:3000/cats again multiple times, and you'll see a stack trace like
```shell
Error: Failed to get all cats in model
at <anonymous> (/src/models/cats.ts:28:13)
... (multiple functions in New Relic Node agent js files)
at <anonymous> (/src/models/cats.ts:26:19)
at Generator.next (<anonymous>)
```
This stack trace points to specific functions and line numbers within your source files, so you can find errors more easily.

53 changes: 53 additions & 0 deletions source-maps/newrelic.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
'use strict'
/**
* New Relic agent configuration.
*
* See lib/config/default.js in the agent distribution for a more complete
* description of configuration variables and their potential values.
*/
exports.config = {
/**
* Array of application names.
*/
app_name: ['Source Maps Example'],
/**
* Your New Relic license key.
*/
license_key: '',
logging: {
/**
* Level at which to log. 'trace' is most useful to New Relic when diagnosing
* issues with the agent, 'info' and higher will impose the least overhead on
* production applications.
*/
level: 'info'
},
/**
* When true, all request headers except for those listed in attributes.exclude
* will be captured for all traces, unless otherwise specified in a destination's
* attributes include/exclude lists.
*/
allow_all_headers: true,
attributes: {
/**
* Prefix of attributes to exclude from all destinations. Allows * as wildcard
* at end.
*
* NOTE: If excluding headers, they must be in camelCase form to be filtered.
*
* @name NEW_RELIC_ATTRIBUTES_EXCLUDE
*/
exclude: [
'request.headers.cookie',
'request.headers.authorization',
'request.headers.proxyAuthorization',
'request.headers.setCookie*',
'request.headers.x*',
'response.headers.cookie',
'response.headers.authorization',
'response.headers.proxyAuthorization',
'response.headers.setCookie*',
'response.headers.x*'
]
}
}
Loading

0 comments on commit 04c2b25

Please sign in to comment.