Skip to content

Commit 77f5709

Browse files
authored
feat: Added ability to register Supportability/Features/Instrumentation/OnRequire/<pkg> metrics for subscriber based instrumentation (#3309)
1 parent d81fe87 commit 77f5709

File tree

6 files changed

+60
-5
lines changed

6 files changed

+60
-5
lines changed

lib/instrumentations.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,19 @@ module.exports = function instrumentations() {
5858
'fancy-log': { type: InstrumentationDescriptor.TYPE_TRACKING },
5959
knex: { type: InstrumentationDescriptor.TYPE_TRACKING },
6060
loglevel: { type: InstrumentationDescriptor.TYPE_TRACKING },
61-
npmlog: { type: InstrumentationDescriptor.TYPE_TRACKING }
61+
npmlog: { type: InstrumentationDescriptor.TYPE_TRACKING },
62+
63+
/**
64+
* The modules below are listed here is a temporary solution to maintaining
65+
* the Supportability/Features/onRequire/<module> metrics for libraries
66+
* that have been migrated to use tracing chanel instrumentation.
67+
* Once orchestrion can emit the package version, these can be removed.
68+
* {@link https://github.com/newrelic/node-newrelic/issues/3308 Github Issue}
69+
*/
70+
'@elastic/elasticsearch': { type: InstrumentationDescriptor.TYPE_TRACKING },
71+
'@modelcontextprotocol/sdk/client/index.js': { type: InstrumentationDescriptor.TYPE_TRACKING },
72+
'@opensearch-project/opensearch': { type: InstrumentationDescriptor.TYPE_TRACKING },
73+
ioredis: { type: InstrumentationDescriptor.TYPE_TRACKING },
74+
pino: { type: InstrumentationDescriptor.TYPE_TRACKING }
6275
}
6376
}

test/versioned/elastic/elasticsearch.test.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,12 @@ test('Elasticsearch instrumentation', async (t) => {
418418
}
419419
expected['Datastore/instance/ElasticSearch/' + HOST_ID] = 5
420420
checkMetrics(unscoped, expected)
421+
const agentMetrics = agent.metrics._metrics.unscoped
422+
const expectedPkgMetrics = {
423+
'Supportability/Features/Instrumentation/OnRequire/@elastic/elasticsearch': 1,
424+
[`Supportability/Features/Instrumentation/OnRequire/@elastic/elasticsearch/Version/${semver.major(pkgVersion)}`]: 1,
425+
}
426+
checkMetrics(agentMetrics, expectedPkgMetrics)
421427
})
422428
})
423429

test/versioned/ioredis/ioredis.test.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,15 @@ const urltils = require('../../../lib/util/urltils')
1313
const { tspl } = require('@matteo.collina/tspl')
1414
const { assertMetrics } = require('../../lib/custom-assertions')
1515
const { removeModules } = require('../../lib/cache-buster')
16+
const semver = require('semver')
1617

1718
// Indicates unique database in Redis. 0-15 supported.
1819
const DB_INDEX = 3
1920

2021
test('ioredis instrumentation', async (t) => {
2122
t.beforeEach(async (ctx) => {
2223
const agent = helper.instrumentMockedAgent()
24+
const { version: pkgVersion } = require('ioredis/package.json')
2325
const Redis = require('ioredis')
2426
const redisClient = new Redis(params.redis_port, params.redis_host)
2527
await redisClient.flushall()
@@ -31,6 +33,7 @@ test('ioredis instrumentation', async (t) => {
3133
await redisClient.select(DB_INDEX)
3234
ctx.nr = {
3335
agent,
36+
pkgVersion,
3437
redisClient,
3538
HOST_ID,
3639
METRIC_HOST_NAME
@@ -45,7 +48,7 @@ test('ioredis instrumentation', async (t) => {
4548
})
4649

4750
await t.test('creates expected metrics', async (t) => {
48-
const { agent, redisClient, HOST_ID } = t.nr
51+
const { agent, pkgVersion, redisClient, HOST_ID } = t.nr
4952
const plan = tspl(t, { plan: 6 })
5053
agent.on('transactionFinished', function (tx) {
5154
const expected = [
@@ -56,6 +59,12 @@ test('ioredis instrumentation', async (t) => {
5659
expected['Datastore/instance/Redis/' + HOST_ID] = 2
5760

5861
assertMetrics(tx.metrics, expected, false, false, { assert: plan })
62+
const expectedPkgMetrics = [
63+
[{ name: 'Supportability/Features/Instrumentation/OnRequire/ioredis' }],
64+
[{ name: `Supportability/Features/Instrumentation/OnRequire/ioredis/Version/${semver.major(pkgVersion)}` }]
65+
]
66+
67+
assertMetrics(agent.metrics, expectedPkgMetrics, false, false)
5968
})
6069

6170
helper.runInTransaction(agent, async (transaction) => {

test/versioned/mcp-sdk/client.test.js

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@ const assert = require('node:assert')
1010

1111
const { removeModules } = require('../../lib/cache-buster')
1212
const helper = require('../../lib/agent_helper')
13-
const { assertSegments, assertSpanKind } = require('../../lib/custom-assertions')
13+
const { assertMetrics, assertSegments, assertSpanKind } = require('../../lib/custom-assertions')
14+
const semver = require('semver')
15+
const { readFile } = require('node:fs/promises')
16+
const path = require('node:path')
1417

1518
const {
1619
MCP
@@ -26,6 +29,9 @@ test.beforeEach(async (ctx) => {
2629

2730
const { Client } = require('@modelcontextprotocol/sdk/client/index.js')
2831
const { StdioClientTransport } = require('@modelcontextprotocol/sdk/client/stdio.js')
32+
const pkg = await readFile(path.join(__dirname, '/node_modules/@modelcontextprotocol/sdk/package.json'))
33+
const { version: pkgVersion } = JSON.parse(pkg.toString())
34+
ctx.nr.pkgVersion = pkgVersion
2935

3036
ctx.nr.transport = new StdioClientTransport({
3137
command: 'node',
@@ -72,7 +78,7 @@ test('should create span for callTool', async (t) => {
7278
})
7379

7480
test('should create span for readResource', async (t) => {
75-
const { agent, client } = t.nr
81+
const { agent, client, pkgVersion } = t.nr
7682
await helper.runInTransaction(agent, async (tx) => {
7783
const resource = await client.readResource({
7884
uri: 'echo://hello-world',
@@ -90,6 +96,12 @@ test('should create span for readResource', async (t) => {
9096
{ name, kind: 'internal' }
9197
]
9298
})
99+
const agentMetrics = agent.metrics
100+
const expectedPkgMetrics = [
101+
[{ name: 'Supportability/Features/Instrumentation/OnRequire/@modelcontextprotocol/sdk/client/index.js' }],
102+
[{ name: `Supportability/Features/Instrumentation/OnRequire/@modelcontextprotocol/sdk/client/index.js/Version/${semver.major(pkgVersion)}` }]
103+
]
104+
assertMetrics(agentMetrics, expectedPkgMetrics, false, false)
93105
})
94106
})
95107

test/versioned/opensearch/opensearch.test.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ const crypto = require('crypto')
1313
const DB_INDEX = `test-${randomString()}`
1414
const DB_INDEX_2 = `test2-${randomString()}`
1515
const SEARCHTERM_1 = randomString()
16+
const semver = require('semver')
1617

1718
function randomString() {
1819
return crypto.randomBytes(5).toString('hex')
@@ -47,10 +48,12 @@ test('opensearch instrumentation', async (t) => {
4748
const client = new Client({
4849
node: `http://${params.opensearch_host}:${params.opensearch_port}`
4950
})
51+
const { version: pkgVersion } = require('@opensearch-project/opensearch/package.json')
5052

5153
ctx.nr = {
5254
agent,
5355
client,
56+
pkgVersion,
5457
METRIC_HOST_NAME,
5558
HOST_ID
5659
}
@@ -314,7 +317,7 @@ test('opensearch instrumentation', async (t) => {
314317
})
315318

316319
await t.test('should create correct metrics', async function (t) {
317-
const { agent, client, HOST_ID } = t.nr
320+
const { agent, client, pkgVersion, HOST_ID } = t.nr
318321
const id = `key-${randomString()}`
319322
await helper.runInTransaction(agent, async function transactionInScope(transaction) {
320323
const documentProp = setRequestBody({
@@ -355,6 +358,12 @@ test('opensearch instrumentation', async (t) => {
355358
}
356359
expected['Datastore/instance/OpenSearch/' + HOST_ID] = 5
357360
checkMetrics(unscoped, expected)
361+
const agentMetrics = agent.metrics._metrics.unscoped
362+
const expectedPkgMetrics = {
363+
'Supportability/Features/Instrumentation/OnRequire/@opensearch-project/opensearch': 1,
364+
[`Supportability/Features/Instrumentation/OnRequire/@opensearch-project/opensearch/Version/${semver.major(pkgVersion)}`]: 1,
365+
}
366+
checkMetrics(agentMetrics, expectedPkgMetrics)
358367
})
359368
})
360369

test/versioned/pino/pino.test.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ const { removeMatchedModules } = require('../../lib/cache-buster')
1818
const { LOGGING } = require('../../../lib/metrics/names')
1919
const { originalMsgAssertion } = require('./helpers')
2020
const { validateLogLine, validateCommonAttrs } = require('../../lib/logging-helper')
21+
const { assertMetrics } = require('../../lib/custom-assertions')
2122

2223
const { version: pinoVersion } = require('pino/package')
2324

@@ -88,6 +89,11 @@ test('logging enabled', (t) => {
8889
logger.info(message)
8990
metric = agent.metrics.getMetric(LOGGING.LIBS.PINO)
9091
assert.equal(metric.callCount, 1, `should create ${LOGGING.LIBS.PINO} metric`)
92+
const expectedPkgMetrics = [
93+
[{ name: 'Supportability/Features/Instrumentation/OnRequire/pino' }],
94+
[{ name: `Supportability/Features/Instrumentation/OnRequire/pino/Version/${semver.major(pinoVersion)}` }]
95+
]
96+
assertMetrics(agent.metrics, expectedPkgMetrics, false, false)
9197
})
9298

9399
test('local_decorating', (t, end) => {

0 commit comments

Comments
 (0)