Skip to content
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

[DI] Adhere to maxCollectionSize limit in snapshots #4780

Merged
merged 1 commit into from
Oct 22, 2024

Conversation

watson
Copy link
Collaborator

@watson watson commented Oct 15, 2024

The maxCollectionSize limit affects the following types:

  • Array
  • Map / WeakMap
  • Set / WeakSet
  • All TypedArray types (UInt8Array etc)

This limit contols the maximum about of elements collected for those types. The default is 100.

If, for example, an array contains more than the allowed amount of elements, a notCapturedReason of collectionSize is added to the collected array and the original size of the array is also captured.

@watson watson requested review from a team as code owners October 15, 2024 11:12
@watson watson self-assigned this Oct 15, 2024
Copy link
Collaborator Author

watson commented Oct 15, 2024

This stack of pull requests is managed by Graphite. Learn more about stacking.

Join @watson and the rest of your teammates on Graphite Graphite

Copy link

github-actions bot commented Oct 15, 2024

Overall package size

Self size: 7.58 MB
Deduped: 62.37 MB
No deduping: 62.71 MB

Dependency sizes | name | version | self size | total size | |------|---------|-----------|------------| | @datadog/native-appsec | 8.1.1 | 18.67 MB | 18.68 MB | | @datadog/native-iast-taint-tracking | 3.1.0 | 12.27 MB | 12.28 MB | | @datadog/pprof | 5.3.0 | 9.85 MB | 10.22 MB | | protobufjs | 7.2.5 | 2.77 MB | 5.16 MB | | @datadog/native-iast-rewriter | 2.5.0 | 2.51 MB | 2.65 MB | | @opentelemetry/core | 1.14.0 | 872.87 kB | 1.47 MB | | @datadog/native-metrics | 2.0.0 | 898.77 kB | 1.3 MB | | @opentelemetry/api | 1.8.0 | 1.21 MB | 1.21 MB | | import-in-the-middle | 1.11.2 | 112.74 kB | 826.22 kB | | msgpack-lite | 0.1.26 | 201.16 kB | 281.59 kB | | opentracing | 0.14.7 | 194.81 kB | 194.81 kB | | lru-cache | 7.18.3 | 133.92 kB | 133.92 kB | | pprof-format | 2.1.0 | 111.69 kB | 111.69 kB | | @datadog/sketches-js | 2.1.0 | 109.9 kB | 109.9 kB | | semver | 7.6.3 | 95.82 kB | 95.82 kB | | lodash.sortby | 4.7.0 | 75.76 kB | 75.76 kB | | ignore | 5.3.1 | 51.46 kB | 51.46 kB | | int64-buffer | 0.1.10 | 49.18 kB | 49.18 kB | | shell-quote | 1.8.1 | 44.96 kB | 44.96 kB | | istanbul-lib-coverage | 3.2.0 | 29.34 kB | 29.34 kB | | rfdc | 1.3.1 | 25.21 kB | 25.21 kB | | tlhunter-sorted-set | 0.1.0 | 24.94 kB | 24.94 kB | | limiter | 1.1.5 | 23.17 kB | 23.17 kB | | dc-polyfill | 0.1.4 | 23.1 kB | 23.1 kB | | retry | 0.13.1 | 18.85 kB | 18.85 kB | | jest-docblock | 29.7.0 | 8.99 kB | 12.76 kB | | crypto-randomuuid | 1.0.0 | 11.18 kB | 11.18 kB | | koalas | 1.0.2 | 6.47 kB | 6.47 kB | | path-to-regexp | 0.1.10 | 6.38 kB | 6.38 kB | | module-details-from-path | 1.0.3 | 4.47 kB | 4.47 kB |

🤖 This report was automatically generated by heaviest-objects-in-the-universe

@pr-commenter
Copy link

pr-commenter bot commented Oct 15, 2024

Benchmarks

Benchmark execution time: 2024-10-22 13:15:56

Comparing candidate commit 879b353 in PR branch watson/DEBUG-2611/max-collection-size with baseline commit 31dc1ec in branch master.

Found 0 performance improvements and 0 performance regressions! Performance is the same for 260 metrics, 6 unstable metrics.

juan-fernandez
juan-fernandez previously approved these changes Oct 16, 2024
@watson watson force-pushed the watson/DEBUG-2611/max-collection-size branch from 8012b31 to 5c33caf Compare October 17, 2024 09:00
The maxCollectionSize limit affects the following types:
- Array
- Map / WeakMap
- Set / WeakSet
- All TypedArray types

This limit contols the maximum about of elements collected for those
types. The default is 100.
@watson watson force-pushed the watson/DEBUG-2611/max-collection-size branch from 5c33caf to 879b353 Compare October 22, 2024 12:08
Comment on lines +24 to +35
if (collection) {
// Trim the collection if it's too large.
// Collections doesn't contain private properties, so the code in this block doesn't have to deal with it.
removeNonEnumerableProperties(result) // remove the `length` property
const size = result.length
if (size > opts.maxCollectionSize) {
result.splice(opts.maxCollectionSize)
result[collectionSizeSym] = size
}
} else if (privateProperties) {
result.push(...privateProperties)
}
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Note: It's on purpose that I do not take into account the scenario where collection === true and privateProperties !== undefined. This is because, currently, the only time collection === true, is when we're either getting the properties of an Array or a TypedArray. For those two object types, we know in advance that there's no private properties, so we can make the code simpler by not having to deal with that edge case.

If we wanted to deal with this, the code would look like this:

Suggested change
if (collection) {
// Trim the collection if it's too large.
// Collections doesn't contain private properties, so the code in this block doesn't have to deal with it.
removeNonEnumerableProperties(result) // remove the `length` property
const size = result.length
if (size > opts.maxCollectionSize) {
result.splice(opts.maxCollectionSize)
result[collectionSizeSym] = size
}
} else if (privateProperties) {
result.push(...privateProperties)
}
if (collection) {
const privatePropertiesSize = privateProperties?.length ?? 0
const totalSize = countEnumerableProperties(result) + privatePropertiesSize
if (totalSize > opts.maxCollectionSize) {
// Prioritize private properties over regular properties
const spaceForNonPrivateProperties = Math.max(opts.maxCollectionSize - privatePropertiesSize, 0)
result = result.slice(0, spaceForNonPrivateProperties)
result[collectionSizeSym] = totalSize
if (privateProperties) {
const remainingSize = opts.maxCollectionSize - result.length
if (privatePropertiesSize > remainingSize) {
privateProperties = privateProperties.slice(0, remainingSize)
}
}
}
}
if (privateProperties) result.push(...privateProperties)

@watson watson requested a review from juan-fernandez October 22, 2024 12:11
@watson watson merged commit e7edfcf into master Oct 22, 2024
199 checks passed
@watson watson deleted the watson/DEBUG-2611/max-collection-size branch October 22, 2024 13:54
rochdev pushed a commit that referenced this pull request Oct 31, 2024
The maxCollectionSize limit affects the following types:
- Array
- Map / WeakMap
- Set / WeakSet
- All TypedArray types

This limit contols the maximum about of elements collected for those
types. The default is 100.
rochdev pushed a commit that referenced this pull request Oct 31, 2024
The maxCollectionSize limit affects the following types:
- Array
- Map / WeakMap
- Set / WeakSet
- All TypedArray types

This limit contols the maximum about of elements collected for those
types. The default is 100.
rochdev pushed a commit that referenced this pull request Oct 31, 2024
The maxCollectionSize limit affects the following types:
- Array
- Map / WeakMap
- Set / WeakSet
- All TypedArray types

This limit contols the maximum about of elements collected for those
types. The default is 100.
rochdev pushed a commit that referenced this pull request Nov 6, 2024
The maxCollectionSize limit affects the following types:
- Array
- Map / WeakMap
- Set / WeakSet
- All TypedArray types

This limit contols the maximum about of elements collected for those
types. The default is 100.
rochdev pushed a commit that referenced this pull request Nov 6, 2024
The maxCollectionSize limit affects the following types:
- Array
- Map / WeakMap
- Set / WeakSet
- All TypedArray types

This limit contols the maximum about of elements collected for those
types. The default is 100.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants