diff --git a/demo/express/ecosystem.config.js b/demo/express/ecosystem.config.js index 923b1aa5..6923901a 100644 --- a/demo/express/ecosystem.config.js +++ b/demo/express/ecosystem.config.js @@ -1,24 +1,48 @@ module.exports = { - apps : [{ - name: 'agent', + apps: [{ + name: 'ServiceWithAgent', script: './bin/www', // Options reference: https://pm2.keymetrics.io/docs/usage/application-declaration/ autorestart: true, - watch: false, max_memory_restart: '1G', - instances: 0, + instances: 1, env: { NODE_ENV: 'development', - "PINPOINT_CONTAINER": "false", - // "PINPOINT_AGENT_ID": "express-node-js-id", "PINPOINT_APPLICATION_NAME": "express.node.js", "PINPOINT_COLLECTOR_IP": "localhost", - "PINPOINT_LOG_LEVEL": "DEBUG", - // "PINPOINT_SAMPLING_RATE": "1", + "PINPOINT_LOG_LEVEL": "WARN", + "PINPOINT_SAMPLING_RATE": "10", + }, + env_production: { + NODE_ENV: 'production', + "PINPOINT_APPLICATION_NAME": "express.node.js", + "PINPOINT_COLLECTOR_IP": "localhost", + "PINPOINT_LOG_LEVEL": "WARN", + "PINPOINT_SAMPLING_RATE": "10", + }, + "io": { + "conf": { + "metrics": { + "http": false + } + } + }, + }, { + name: 'Service', + script: './bin/www', + + // Options reference: https://pm2.keymetrics.io/docs/usage/application-declaration/ + autorestart: true, + max_memory_restart: '1G', + instances: 0, + env: { + NODE_ENV: 'development', + PINPOINT_ENABLE: 'false' }, env_production: { NODE_ENV: 'production', + PINPOINT_ENABLE: 'false' } }], -}; +} diff --git a/demo/express/package-lock.json b/demo/express/package-lock.json index 8cd71f31..0adb32d0 100644 --- a/demo/express/package-lock.json +++ b/demo/express/package-lock.json @@ -18,7 +18,7 @@ "morgan": "~1.9.1", "mysql": "^2.18.1", "mysql2": "^3.9.1", - "pinpoint-node-agent": "^0.8.6" + "pinpoint-node-agent": "^0.9.0" } }, "node_modules/@grpc/grpc-js": { @@ -64,6 +64,12 @@ "url": "https://opencollective.com/js-sdsl" } }, + "node_modules/@pinpoint-apm/shimmer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@pinpoint-apm/shimmer/-/shimmer-1.2.2.tgz", + "integrity": "sha512-hhQS4NPgieSoN/nNTkKDdenNYz9Hw4bDyOjtiRKYdWox+BOJ1zt/QWeF37mWvmxe5bhE6rQWTqUgx8BBYT45pA==", + "license": "BSD-2-Clause" + }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -678,6 +684,15 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, + "node_modules/encode-utf8": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-2.0.0.tgz", + "integrity": "sha512-3EyMFxZj1/7oMotElDQUEQcP7N4TIe1aJ0m1uBDoyQ8I2LBHhBsXx8P3KsPbqNlGzG+NYxFwEauUwMPHZg3YDQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -907,6 +922,15 @@ "node": ">= 0.8" } }, + "node_modules/fmix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fmix/-/fmix-1.0.0.tgz", + "integrity": "sha512-PIaqOGvVH5P+R92Ywy5PumsNEHvondVQh42SGOmkA9A0ZTFbfguzZpjZ/Gy3WVRUqT9Ia8k5tWlJeiZQzRHA7g==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, "node_modules/follow-redirects": { "version": "1.15.6", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", @@ -1100,15 +1124,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" }, - "node_modules/int64-buffer": { - "version": "0.99.1007", - "resolved": "https://registry.npmjs.org/int64-buffer/-/int64-buffer-0.99.1007.tgz", - "integrity": "sha512-XDBEu44oSTqlvCSiOZ/0FoUkpWu/vwjJLGSKDabNISPQNZ5wub1FodGHBljRsrR0IXRPq7SslshZYMuA55CgTQ==", - "license": "MIT", - "engines": { - "node": ">= 4.5.0" - } - }, "node_modules/internal-ip": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-3.0.1.tgz", @@ -1473,6 +1488,19 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/murmur-128": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/murmur-128/-/murmur-128-1.0.0.tgz", + "integrity": "sha512-lorvQVFjHTqi/exTgKNzqFy0ZJyM6v9oQoJUDGc+MOeVLBm+LfMXMjvQ5rflo5pVRVDPmnxqDMDT9wSkGWPtrA==", + "license": "MIT", + "dependencies": { + "encode-utf8": "^2.0.0", + "fmix": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, "node_modules/mysql": { "version": "2.18.1", "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", @@ -1654,23 +1682,23 @@ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "node_modules/pinpoint-node-agent": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/pinpoint-node-agent/-/pinpoint-node-agent-0.8.6.tgz", - "integrity": "sha512-VNe+dg5+tZJKLJK+Z3eVpog0w34MmUPZZ/O/+IOgwgVX8bVunkOFiMEGe198Y3gD1ZO448QwZljZsI3NlfuV4Q==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/pinpoint-node-agent/-/pinpoint-node-agent-0.9.0.tgz", + "integrity": "sha512-8jBuyJJ5ulTc5crz1LRFip2pJ7X9j73O9RtYBQVmavTS4eQgEQhlVt1drIKOTiGz+iB4UJ88qI+CQWJS7/MNEg==", + "license": "Apache-2.0", "dependencies": { - "@grpc/grpc-js": "^1.11.0", + "@grpc/grpc-js": "^1.2.3", + "@pinpoint-apm/shimmer": "^1.2.2", "end-of-stream": "^1.4.1", "google-protobuf": "^3.13.0", - "int64-buffer": "^0.99.1007", "internal-ip": "^3.0.1", "loglevel": "^1.6.1", - "methods": "^1.1.2", + "murmur-128": "^1.0.0", "require-in-the-middle": "^5.0.3", - "semver": "^7.5.3", - "shimmer": "^1.2.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=10.10.0" + "node": ">=14.0" } }, "node_modules/pinpoint-node-agent/node_modules/semver": { @@ -2082,12 +2110,6 @@ "node": ">=0.10.0" } }, - "node_modules/shimmer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", - "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==", - "license": "BSD-2-Clause" - }, "node_modules/side-channel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", diff --git a/demo/express/package.json b/demo/express/package.json index 222a9862..dfe5f0b0 100644 --- a/demo/express/package.json +++ b/demo/express/package.json @@ -16,6 +16,6 @@ "morgan": "~1.9.1", "mysql": "^2.18.1", "mysql2": "^3.9.1", - "pinpoint-node-agent": "^0.8.6" + "pinpoint-node-agent": "^0.9.0" } } diff --git a/lib/context/async-id.js b/lib/context/async-id.js index 517938a0..d922131c 100644 --- a/lib/context/async-id.js +++ b/lib/context/async-id.js @@ -57,7 +57,7 @@ class AsyncId { return pLocalAsyncId } - tosString() { + toString() { return `AsyncId(asyncId=${this.asyncId}, sequence=${this.sequence})` } } diff --git a/lib/context/span-builder.js b/lib/context/span-builder.js index 3e1d94b3..43dcded9 100644 --- a/lib/context/span-builder.js +++ b/lib/context/span-builder.js @@ -151,7 +151,7 @@ class SpanBuilder { build() { const span = new Span(this.traceRoot) span.serviceType = this.serviceType - span.startTime = this.startTime || Date.now() + span.startTime = this.startTime ?? Date.now() span.elapsedTime = this.elapsedTime span.apiId = this.apiId span.rpc = this.rpc diff --git a/lib/context/trace/span-event-builder.js b/lib/context/trace/span-event-builder.js index 74d230af..af14f99c 100644 --- a/lib/context/trace/span-event-builder.js +++ b/lib/context/trace/span-event-builder.js @@ -51,6 +51,10 @@ class SpanEvent { return pSpanEvent } + + toString() { + return `SpanEvent(sequence=${this.sequence}, depth=${this.depth}, startElapsedTime=${this.startElapsedTime}, elapsedTime=${this.elapsedTime}, startTime=${this.startTime}, serviceType=${this.serviceType}, apiId=${this.apiId}, asyncId=${this.asyncId}, nextSpanId=${this.nextSpanId}, destinationId=${this.destinationId}, endPoint=${this.endPoint}, exceptionInfo=${this.exceptionInfo}, annotations=${this.annotations})` + } } @@ -190,7 +194,7 @@ class SpanEventBuilder { return SpanEvent.nullObject } - if (!this.elapsedTime) { + if (typeof this.elapsedTime === 'undefined') { this.markAfterTime() } diff --git a/package-lock.json b/package-lock.json index c1a2c736..a7752cff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "internal-ip": "^3.0.1", "loglevel": "^1.6.1", "murmur-128": "^1.0.0", - "require-in-the-middle": "^5.0.3", + "require-in-the-middle": "^5.2.0", "semver": "^7.5.3" }, "devDependencies": { @@ -6378,6 +6378,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.2.0.tgz", "integrity": "sha512-efCx3b+0Z69/LGJmm9Yvi4cqEdxnoGnxYxGxBghkkTTFeXRtTCmmhO0AnAfHz59k957uTSuy8WaHqOs8wbYUWg==", + "license": "MIT", "dependencies": { "debug": "^4.1.1", "module-details-from-path": "^1.0.3", diff --git a/package.json b/package.json index e0061aeb..a264a7b9 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "internal-ip": "^3.0.1", "loglevel": "^1.6.1", "murmur-128": "^1.0.0", - "require-in-the-middle": "^5.0.3", + "require-in-the-middle": "^5.2.0", "semver": "^7.5.3" }, "devDependencies": { diff --git a/test/client/grpc-data-sender.test.js b/test/client/grpc-data-sender.test.js index 33d29b5f..d839fe12 100644 --- a/test/client/grpc-data-sender.test.js +++ b/test/client/grpc-data-sender.test.js @@ -210,7 +210,7 @@ test('sendSpanChunk redis.SET.end', function (t) { t.equal(pSpanEvent.getDepth(), 2, 'depth') const expectedSpanChunk = repository.dataSender.findSpanChunk(childTraceBuilder.localAsyncId) - const expectedSpanEvent = expectedSpanChunk.spanEventList[0] + const expectedSpanEvent = expectedSpanChunk.spanEventList[1] t.equal(pSpanEvent.getStartelapsed(), expectedSpanEvent.startElapsedTime, `pSpanEvent.getStartelapsed() : ${pSpanEvent.getStartelapsed()}, expectedSpanEvent.startElapsedTime : ${expectedSpanEvent.startElapsedTime}`) t.equal(pSpanEvent.getEndelapsed(), expectedSpanEvent.elapsedTime, `pSpanEvent.getEndelapsed() : ${pSpanEvent.getEndelapsed()}, expectedSpanEvent.elapsedTime : ${expectedSpanEvent.elapsedTime}`) t.equal(pSpanEvent.getServicetype(), 8200, 'serviceType') diff --git a/test/instrumentation/context/nested-async-trace.test.js b/test/instrumentation/context/nested-async-trace.test.js index ac720641..b04b7322 100644 --- a/test/instrumentation/context/nested-async-trace.test.js +++ b/test/instrumentation/context/nested-async-trace.test.js @@ -53,7 +53,7 @@ const resetSpanOrSpanChunks = () => { const getSpanOrSpanChunks = () => { return spanOrSpanChunks } -const getSpanChunk = (asyncId) =>{ +const getSpanChunk = (asyncId) => { return getSpanOrSpanChunks().find(spanOrSpanChunk => spanOrSpanChunk.getLocalasyncid().getAsyncid() === asyncId.getAsyncId() && spanOrSpanChunk.getLocalasyncid().getSequence() === asyncId.getSequence()) } @@ -68,7 +68,7 @@ const spanMessageStreamService = (call) => { spanMessageEndEventCallback?.() } }) - call.on('end', () => {}) + call.on('end', () => { }) } function sendAgentStat(call, callback) { @@ -283,6 +283,11 @@ test(`nested mysql async query with express`, async (t) => { trace.repository.dataSender.close() } + app.use(express.json()) + app.use(express.urlencoded({ + extended: false + })) + const server = app.listen(5006, async () => { const result = await axios.get('http://localhost:5006/test1') t.equal(result.status, 200, 'status is 200') @@ -376,7 +381,7 @@ test(`nested mysql2 async query with express`, async (t) => { t.true(trace.spanBuilder.remoteAddress === '127.0.0.1' || trace.spanBuilder.remoteAddress === '::1', `remoteAddress is ${trace.spanBuilder.remoteAddress}`) let actualBuilder = new MethodDescriptorBuilder(expected('get', 'app.get')) .setClassName(expected('app', 'Function')) - .setLineNumber(332) + .setLineNumber(337) .setFileName('nested-async-trace.test.js') let actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) let actualSpanEvent = trace.spanBuilder.spanEventList.find(spanEvent => spanEvent.sequence === 0) @@ -389,7 +394,7 @@ test(`nested mysql2 async query with express`, async (t) => { t.equal(actualSpanEvent.serviceType, expressServiceType.getCode(), 'serviceType is express') actualBuilder = new MethodDescriptorBuilder('createConnection') - .setLineNumber(333) + .setLineNumber(338) .setFileName('nested-async-trace.test.js') actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) actualSpanEvent = trace.spanBuilder.spanEventList.find(spanEvent => spanEvent.sequence === 1) @@ -402,7 +407,7 @@ test(`nested mysql2 async query with express`, async (t) => { actualBuilder = new MethodDescriptorBuilder('query') .setClassName('Connection') - .setLineNumber(343) + .setLineNumber(348) .setFileName('nested-async-trace.test.js') actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) actualSpanEvent = trace.spanBuilder.spanEventList.find(spanEvent => spanEvent.sequence === 2) @@ -424,7 +429,7 @@ test(`nested mysql2 async query with express`, async (t) => { actualBuilder = new MethodDescriptorBuilder('query') .setClassName('Connection') - .setLineNumber(349) + .setLineNumber(354) .setFileName('nested-async-trace.test.js') actualMethodDescriptor = apiMetaService.cacheApiWithBuilder(actualBuilder) actualSpanEvent = actualSpanChunk.spanEventList[1]