-
Notifications
You must be signed in to change notification settings - Fork 310
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
[test visibility] Simple dynamic instrumentation - test visibility client #4826
Conversation
Overall package sizeSelf size: 7.91 MB Dependency sizes| name | version | self size | total size | |------|---------|-----------|------------| | @datadog/native-appsec | 8.2.1 | 19.18 MB | 19.19 MB | | @datadog/native-iast-taint-tracking | 3.2.0 | 13.9 MB | 13.91 MB | | @datadog/pprof | 5.4.1 | 9.76 MB | 10.13 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 | 3.0.1 | 1.06 MB | 1.46 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 |
BenchmarksBenchmark execution time: 2024-11-04 14:20:26 Comparing candidate commit 67b7647 in PR branch Found 0 performance improvements and 0 performance regressions! Performance is the same for 258 metrics, 8 unstable metrics. |
const breakpointIdToProbe = new Map() | ||
|
||
function findScriptFromPartialPath (path) { | ||
return scriptIds |
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.
ℹ️ this we could easily generalized for both DI and TV
const stack = callFrames.map((frame) => { | ||
let fileName = scriptUrls.get(frame.location.scriptId) | ||
if (fileName.startsWith('file://')) fileName = fileName.substr(7) // TODO: This might not be required | ||
return { | ||
fileName, | ||
function: frame.functionName, | ||
lineNumber: frame.location.lineNumber + 1, // Beware! lineNumber is zero-indexed | ||
columnNumber: frame.location.columnNumber + 1 // Beware! columnNumber is zero-indexed | ||
} | ||
}) |
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.
ℹ️ this can be extracted
packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js
Show resolved
Hide resolved
packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js
Show resolved
Hide resolved
e794cc6
to
c20ae05
Compare
@@ -32,8 +32,17 @@ module.exports = { | |||
.sort(([a], [b]) => a.length - b.length)[0] | |||
}, | |||
|
|||
getScriptUrlFromId (id) { |
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.
getScriptUrlFromId
was only used for formatting the stack, which is now done by getStackFromCallFrames
Codecov ReportAll modified and coverable lines are covered by tests ✅
Additional details and impacted files@@ Coverage Diff @@
## master #4826 +/- ##
==========================================
- Coverage 79.17% 72.87% -6.30%
==========================================
Files 273 66 -207
Lines 12427 3278 -9149
==========================================
- Hits 9839 2389 -7450
+ Misses 2588 889 -1699 ☔ View full report in Codecov by Sentry. |
// 2. Promise that's resolved when the breakpoint is set | ||
// 3. Promise that's resolved when the breakpoint is hit |
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 need to be able to sync on these two to be able to know when to start a test (a test can't start before the breakpoint is set) and when a dynamic instrumentation log can be created (if a breakpoint is hit). Maybe I could use callbacks for the same? Open to ideas here
} | ||
|
||
isReady () { | ||
return this._readyPromise |
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.
this is just to make sure we don't attempt to set probes before the worker is online
@@ -0,0 +1,29 @@ | |||
'use strict' |
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.
ℹ️ script we run in the test to grab local variable data
packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js
Outdated
Show resolved
Hide resolved
this.worker.on('message', (message) => { | ||
const { type } = message | ||
if (type === BREAKPOINT_SET) { | ||
const { probeId } = message | ||
const resolve = probeIdToResolveBreakpointSet.get(probeId) | ||
if (resolve) { | ||
resolve() | ||
probeIdToResolveBreakpointSet.delete(probeId) | ||
} | ||
} else if (type === BREAKPOINT_HIT) { | ||
const { snapshot } = message | ||
const { probe: { id: probeId } } = snapshot | ||
const resolve = probeIdToResolveBreakpointHit.get(probeId) | ||
if (resolve) { | ||
resolve({ snapshot }) | ||
probeIdToResolveBreakpointHit.delete(probeId) | ||
} | ||
} | ||
}).unref() // We also need to unref this message handler |
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 assume no calling .unref()
here gave you problems?
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.
yeah, the test framework I used to run my tests got stuck and I had to pkill node
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 does this PR do?
This creates a
TestVisDynamicInstrumentation
class which includes a simplified version of the logic inpackages/dd-trace/src/debugger/index.js
:worker_thread
is started inTestVisDynamicInstrumentation#start
that'll wait for messages from the parent process.Motivation
Continuing the work for the integration between test visibility and dynamic instrumentation started in #4821
Plugin Checklist