-
Notifications
You must be signed in to change notification settings - Fork 28.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
trace_events: adds a new trace_events api
Removes the requirement to use `--trace-events-enabled` to enable trace events. Tracing is enabled automatically if there are any enabled categories. Adds a new `trace_events` module with an API for enabling/disabling trace events at runtime without a command line flag. ```js const trace_events = require('trace_events'); const categories = [ 'node.perf', 'node.async_hooks' ]; const tracing = trace_events.createTracing({ categories }); tracing.enable(); // do stuff tracing.disable(); ``` Multiple `Tracing` objects may exist and be enabled at any point in time. The enabled trace event categories is the union of all enabled `Tracing` objects and the `--trace-event-categories` flag. PR-URL: #19803 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Ali Ijaz Sheikh <ofrobots@google.com> Reviewed-By: Franziska Hinkelmann <franziska.hinkelmann@gmail.com>
- Loading branch information
Showing
25 changed files
with
677 additions
and
87 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
'use strict'; | ||
|
||
const { hasTracing } = process.binding('config'); | ||
const kHandle = Symbol('handle'); | ||
const kEnabled = Symbol('enabled'); | ||
const kCategories = Symbol('categories'); | ||
|
||
const kMaxTracingCount = 10; | ||
|
||
const { | ||
ERR_TRACE_EVENTS_CATEGORY_REQUIRED, | ||
ERR_TRACE_EVENTS_UNAVAILABLE, | ||
ERR_INVALID_ARG_TYPE | ||
} = require('internal/errors').codes; | ||
|
||
if (!hasTracing) | ||
throw new ERR_TRACE_EVENTS_UNAVAILABLE(); | ||
|
||
const { CategorySet, getEnabledCategories } = process.binding('trace_events'); | ||
const { customInspectSymbol } = require('internal/util'); | ||
const { format } = require('util'); | ||
|
||
const enabledTracingObjects = new Set(); | ||
|
||
class Tracing { | ||
constructor(categories) { | ||
this[kHandle] = new CategorySet(categories); | ||
this[kCategories] = categories; | ||
this[kEnabled] = false; | ||
} | ||
|
||
enable() { | ||
if (!this[kEnabled]) { | ||
this[kEnabled] = true; | ||
this[kHandle].enable(); | ||
enabledTracingObjects.add(this); | ||
if (enabledTracingObjects.size > kMaxTracingCount) { | ||
process.emitWarning( | ||
'Possible trace_events memory leak detected. There are more than ' + | ||
`${kMaxTracingCount} enabled Tracing objects.` | ||
); | ||
} | ||
} | ||
} | ||
|
||
disable() { | ||
if (this[kEnabled]) { | ||
this[kEnabled] = false; | ||
this[kHandle].disable(); | ||
enabledTracingObjects.delete(this); | ||
} | ||
} | ||
|
||
get enabled() { | ||
return this[kEnabled]; | ||
} | ||
|
||
get categories() { | ||
return this[kCategories].join(','); | ||
} | ||
|
||
[customInspectSymbol](depth, opts) { | ||
const obj = { | ||
enabled: this.enabled, | ||
categories: this.categories | ||
}; | ||
return `Tracing ${format(obj)}`; | ||
} | ||
} | ||
|
||
function createTracing(options) { | ||
if (typeof options !== 'object' || options == null) | ||
throw new ERR_INVALID_ARG_TYPE('options', 'object', options); | ||
|
||
if (!Array.isArray(options.categories)) { | ||
throw new ERR_INVALID_ARG_TYPE('options.categories', 'string[]', | ||
options.categories); | ||
} | ||
|
||
if (options.categories.length <= 0) | ||
throw new ERR_TRACE_EVENTS_CATEGORY_REQUIRED(); | ||
|
||
return new Tracing(options.categories); | ||
} | ||
|
||
module.exports = { | ||
createTracing, | ||
getEnabledCategories | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.