Skip to content

Commit

Permalink
chore: refactor module patch handling in Instrumentation class
Browse files Browse the repository at this point in the history
This refactors how module patch handlers are loaded and the
Instrumentation class file. There is now a PatcherRegistry that is
a little smarter than the `_patches` object before it.

The main change is that we now use RITM's internals:true option
so that our `onRequire` hook is called with module sub-paths. This will
allow #3657 to hook both "mongodb" and "mongodb/lib/cmap/connection_pool.js",
and avoid a RITM bug where "mongodb" &
"mongodb/lib/cmap/connection_pool" (no extension, indicating a
"sub-module") don't work together.

Benefits and other changes:
- With the smarter "PatcherRegistry" the module name can be used in
  `disableInstrumentations` to disable any patchers for that module.
  E.g. `disableInstrumentations=next` will disable all four
  `next`-related patchers.
- A custom "lambda" name is now usable to disable the Lambda instr,
  FWIW.
- (Note: we *could* also add custom disableInstrumentations keys for
  other modules, e.g. perhaps "aws-sdk" for all those.)
- Some edge cases with the (rare, and undocumented) `config.addPatch`
  config var have been cleaned up.
- Loading of the lambda-handler has been refactored a bit to no longer
  need to know internal details of the instrumentation module.

Refs: #3657
Closes: #2992
  • Loading branch information
trentm committed Oct 6, 2023
1 parent 1cfdb03 commit abdeee5
Show file tree
Hide file tree
Showing 15 changed files with 493 additions and 531 deletions.
4 changes: 4 additions & 0 deletions docs/agent-api.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -810,6 +810,10 @@ apm.addPatch('timers', (exports, agent, { version, enabled }) => {
apm.addPatch('timers', './timer-patch')
----

This and the other "Patch"-related API methods should be called *before*
starting the APM agent. Changes after the agent has started and relevant
modules have been `require`d can have surprising caching behavior.

[[apm-remove-patch]]
==== `apm.removePatch(modules, handler)`

Expand Down
6 changes: 3 additions & 3 deletions docs/configuration.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -962,7 +962,7 @@ The `sanitizeFieldNames` will redact any matched _field names_. If you wish to
* *Type:* Array of strings
* *Env:* `ELASTIC_APM_DISABLE_INSTRUMENTATIONS`

Array or comma-separated string of modules to disable instrumentation for.
Array or comma-separated string of module names for which to disable instrumentation.
When instrumentation is disabled for a module,
no spans will be collected for that module.

Expand All @@ -971,15 +971,15 @@ Example using options object:
[source,js]
----
require('elastic-apm-node').start({
disableInstrumentations: ['graphql', 'redis']
disableInstrumentations: ['graphql', '@redis/client']
})
----

Example using environment variable:

[source,bash]
----
ELASTIC_APM_DISABLE_INSTRUMENTATIONS=graphql,redis
ELASTIC_APM_DISABLE_INSTRUMENTATIONS=graphql,@redis/client
----

For an always up-to-date list of modules for which instrumentation can be disabled,
Expand Down
1 change: 1 addition & 0 deletions index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -381,6 +381,7 @@ declare namespace apm {
type PatchHandler = (exports: any, agent: Agent, options: PatchOptions) => any;

interface PatchOptions {
name: string;
version: string | undefined;
enabled: boolean;
}
Expand Down
Loading

0 comments on commit abdeee5

Please sign in to comment.