-
Notifications
You must be signed in to change notification settings - Fork 351
feat: add cause and props to stack output of errors #6776
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
This increases debug information for errors by inspecting the whole error and sending it as stack. That provides a) better output for errors by using util.inspect for the stack instead of the native one. That provides for example better error names. b) This improves the performance for one error in serverless by preventing to create stack frames that are not needed. c) it shows all additional properties that might exist on an error as stack output. That should be helpful for debugging issues. To limit the output of extra properties to a minimum, only one level is inspected. Fixes: #6366
Overall package sizeSelf size: 13.15 MB Dependency sizes| name | version | self size | total size | |------|---------|-----------|------------| | @datadog/libdatadog | 0.7.0 | 35.02 MB | 35.02 MB | | @datadog/native-appsec | 10.3.0 | 20.73 MB | 20.74 MB | | @datadog/native-iast-taint-tracking | 4.0.0 | 11.72 MB | 11.73 MB | | @datadog/pprof | 5.11.1 | 9.96 MB | 10.34 MB | | @opentelemetry/core | 1.30.1 | 908.66 kB | 7.16 MB | | protobufjs | 7.5.4 | 2.95 MB | 5.82 MB | | @datadog/wasm-js-rewriter | 4.0.1 | 2.85 MB | 3.58 MB | | @opentelemetry/resources | 1.9.1 | 306.54 kB | 1.74 MB | | @datadog/native-metrics | 3.1.1 | 1.02 MB | 1.43 MB | | @opentelemetry/api-logs | 0.207.0 | 201.39 kB | 1.42 MB | | @opentelemetry/api | 1.9.0 | 1.22 MB | 1.22 MB | | jsonpath-plus | 10.3.0 | 617.18 kB | 1.08 MB | | import-in-the-middle | 1.15.0 | 127.66 kB | 856.24 kB | | lru-cache | 10.4.3 | 804.3 kB | 804.3 kB | | @datadog/openfeature-node-server | 0.1.0-preview.12 | 95.11 kB | 401.68 kB | | opentracing | 0.14.7 | 194.81 kB | 194.81 kB | | source-map | 0.7.6 | 185.63 kB | 185.63 kB | | pprof-format | 2.2.1 | 163.06 kB | 163.06 kB | | @datadog/sketches-js | 2.1.1 | 109.9 kB | 109.9 kB | | lodash.sortby | 4.7.0 | 75.76 kB | 75.76 kB | | ignore | 7.0.5 | 63.38 kB | 63.38 kB | | istanbul-lib-coverage | 3.2.2 | 34.37 kB | 34.37 kB | | rfdc | 1.4.1 | 27.15 kB | 27.15 kB | | dc-polyfill | 0.1.10 | 26.73 kB | 26.73 kB | | @isaacs/ttlcache | 1.4.1 | 25.2 kB | 25.2 kB | | tlhunter-sorted-set | 0.1.0 | 24.94 kB | 24.94 kB | | shell-quote | 1.8.3 | 23.74 kB | 23.74 kB | | limiter | 1.1.5 | 23.17 kB | 23.17 kB | | retry | 0.13.1 | 18.85 kB | 18.85 kB | | semifies | 1.0.0 | 15.84 kB | 15.84 kB | | jest-docblock | 29.7.0 | 8.99 kB | 12.76 kB | | crypto-randomuuid | 1.0.0 | 11.18 kB | 11.18 kB | | ttl-set | 1.0.0 | 4.61 kB | 9.69 kB | | mutexify | 1.4.0 | 5.71 kB | 8.74 kB | | path-to-regexp | 0.1.12 | 6.6 kB | 6.6 kB | | module-details-from-path | 1.0.4 | 3.96 kB | 3.96 kB |🤖 This report was automatically generated by heaviest-objects-in-the-universe |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## master #6776 +/- ##
==========================================
- Coverage 84.06% 83.98% -0.08%
==========================================
Files 506 505 -1
Lines 21212 21246 +34
==========================================
+ Hits 17831 17843 +12
- Misses 3381 3403 +22 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
BenchmarksBenchmark execution time: 2025-10-28 23:04:41 Comparing candidate commit 68ef1d1 in PR branch Found 0 performance improvements and 0 performance regressions! Performance is the same for 1604 metrics, 66 unstable metrics. |
| expect(traces[0][0].meta).to.have.property(ERROR_TYPE, error.name) | ||
| expect(traces[0][0].meta).to.have.property(ERROR_MESSAGE, error.message || error.code) | ||
| expect(traces[0][0].meta).to.have.property(ERROR_STACK, error.stack) | ||
| expect(traces[0][0].meta).to.have.property(ERROR_STACK, util.inspect(error, { depth: 0 })) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What if error is not an actual error object?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We check for it having a message property or if it is an instance of error to determine if we add the tags.
The object will be serialized as a whole, if it contains a stack property. If it would be a object with a message and a stack property, that would be serialized instead of only showing the stack property. That in itself seems beneficial for users one way or the other. If it does not have a stack property, that is kept as is.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If it's not an error we should properly extract the existing stack as it was done before, and only use util.inspect for errors since it special cases them to get the stack with additional metadata.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I discussed it with error tracking and I am going to handle it as separate properties for now.
They said we could have a look how it would be on staging, while it will likely break a couple of existing pretty printing.
So I am marking it as draft for now.
This increases debug information for errors by inspecting the whole error and sending it as stack. That provides a) better output for errors by using util.inspect for the stack instead of the native one. That provides for example better error names. b) This improves the performance for one error in serverless by preventing to create stack frames that are not needed. c) it shows all additional properties that might exist on an error as stack output. That should be helpful for debugging issues.
To limit the output of extra properties to a minimum, only one level is inspected.
Fixes: #6366