From a1ea9a2b2f1b402c513c5a7daccc2ce755ca2f23 Mon Sep 17 00:00:00 2001 From: tlindhardt Date: Wed, 23 Jul 2025 16:03:23 -0500 Subject: [PATCH 1/4] feat(instrumentation-koa): Add support for koa 3 --- package-lock.json | 262 +++++++++++++++++- packages/instrumentation-koa/.tav.yml | 2 +- packages/instrumentation-koa/README.md | 2 +- packages/instrumentation-koa/package.json | 8 +- .../src/instrumentation.ts | 2 +- packages/instrumentation-koa/src/utils.ts | 6 +- packages/instrumentation-koa/test/koa.test.ts | 46 +-- 7 files changed, 272 insertions(+), 56 deletions(-) diff --git a/package-lock.json b/package-lock.json index 94c41b3560..9b8d98baac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33191,6 +33191,23 @@ "@opentelemetry/core": "^2.0.0" } }, + "packages/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-koa": { + "version": "0.51.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.51.0.tgz", + "integrity": "sha512-XNLWeMTMG1/EkQBbgPYzCeBD0cwOrfnn8ao4hWgLv0fNCFQu1kCsJYygz2cvKuCs340RlnG4i321hX7R8gj3Rg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.203.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, "packages/auto-instrumentations-node/node_modules/@types/node": { "version": "18.18.14", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.14.tgz", @@ -34503,11 +34520,11 @@ "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.205.0", - "@opentelemetry/semantic-conventions": "^1.27.0" + "@opentelemetry/semantic-conventions": "^1.36.0" }, "devDependencies": { "@koa/router": "14.0.0", - "@opentelemetry/api": "^1.3.0", + "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-async-hooks": "^2.0.0", "@opentelemetry/contrib-test-utils": "^0.51.0", "@opentelemetry/instrumentation-http": "^0.205.0", @@ -34518,7 +34535,7 @@ "@types/mocha": "10.0.10", "@types/node": "18.18.14", "@types/sinon": "17.0.4", - "koa": "2.16.2", + "koa": "3.0.0", "nyc": "17.1.0", "rimraf": "5.0.10", "semver": "7.7.2", @@ -34530,7 +34547,7 @@ "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "@opentelemetry/api": "^1.9.0" } }, "packages/instrumentation-koa/node_modules/@types/node": { @@ -34542,6 +34559,135 @@ "undici-types": "~5.26.4" } }, + "packages/instrumentation-koa/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "packages/instrumentation-koa/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "packages/instrumentation-koa/node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "packages/instrumentation-koa/node_modules/koa": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/koa/-/koa-3.0.0.tgz", + "integrity": "sha512-Usyqf1o+XN618R3Jzq4S4YWbKsRtPcGpgyHXD4APdGYQQyqQ59X+Oyc7fXHS2429stzLsBiDjj6zqqYe8kknfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "^1.3.5", + "cache-content-type": "^1.0.0", + "content-disposition": "~0.5.2", + "content-type": "^1.0.4", + "cookies": "~0.9.1", + "debug": "^4.3.2", + "delegates": "^1.0.0", + "destroy": "^1.0.4", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.3.0", + "http-errors": "^2.0.0", + "koa-compose": "^4.1.0", + "on-finished": "^2.3.0", + "parseurl": "^1.3.2", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "packages/instrumentation-koa/node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "packages/instrumentation-koa/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "packages/instrumentation-koa/node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "packages/instrumentation-koa/node_modules/type-is/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "packages/instrumentation-koa/node_modules/typescript": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } + }, "packages/instrumentation-koa/node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", @@ -44374,6 +44520,16 @@ "typescript": "5.0.4" }, "dependencies": { + "@opentelemetry/instrumentation-koa": { + "version": "0.51.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.51.0.tgz", + "integrity": "sha512-XNLWeMTMG1/EkQBbgPYzCeBD0cwOrfnn8ao4hWgLv0fNCFQu1kCsJYygz2cvKuCs340RlnG4i321hX7R8gj3Rg==", + "requires": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.203.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + } + }, "@types/node": { "version": "18.18.14", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.14.tgz", @@ -45659,7 +45815,7 @@ "version": "file:packages/instrumentation-koa", "requires": { "@koa/router": "14.0.0", - "@opentelemetry/api": "^1.3.0", + "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-async-hooks": "^2.0.0", "@opentelemetry/contrib-test-utils": "^0.51.0", "@opentelemetry/core": "^2.0.0", @@ -45667,13 +45823,13 @@ "@opentelemetry/instrumentation-http": "^0.205.0", "@opentelemetry/sdk-trace-base": "^2.0.0", "@opentelemetry/sdk-trace-node": "^2.0.0", - "@opentelemetry/semantic-conventions": "^1.27.0", + "@opentelemetry/semantic-conventions": "^1.36.0", "@types/koa": "2.15.0", "@types/koa__router": "12.0.4", "@types/mocha": "10.0.10", "@types/node": "18.18.14", "@types/sinon": "17.0.4", - "koa": "2.16.2", + "koa": "3.0.0", "nyc": "17.1.0", "rimraf": "5.0.10", "semver": "7.7.2", @@ -45691,6 +45847,98 @@ "undici-types": "~5.26.4" } }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "requires": { + "safe-buffer": "5.2.1" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true + }, + "koa": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/koa/-/koa-3.0.0.tgz", + "integrity": "sha512-Usyqf1o+XN618R3Jzq4S4YWbKsRtPcGpgyHXD4APdGYQQyqQ59X+Oyc7fXHS2429stzLsBiDjj6zqqYe8kknfw==", + "dev": true, + "requires": { + "accepts": "^1.3.5", + "cache-content-type": "^1.0.0", + "content-disposition": "~0.5.2", + "content-type": "^1.0.4", + "cookies": "~0.9.1", + "debug": "^4.3.2", + "delegates": "^1.0.0", + "destroy": "^1.0.4", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.3.0", + "http-errors": "^2.0.0", + "koa-compose": "^4.1.0", + "on-finished": "^2.3.0", + "parseurl": "^1.3.2", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + } + }, + "media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "dev": true + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true + }, + "type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "dev": true, + "requires": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "dependencies": { + "mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "requires": { + "mime-db": "^1.54.0" + } + } + } + }, + "typescript": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "dev": true + }, "undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", diff --git a/packages/instrumentation-koa/.tav.yml b/packages/instrumentation-koa/.tav.yml index d329351f69..48c991d41b 100644 --- a/packages/instrumentation-koa/.tav.yml +++ b/packages/instrumentation-koa/.tav.yml @@ -13,6 +13,6 @@ koa: # Testing ^2.7.0 covers at least 97% of the downloaded koa versions versions: - include: "^2.7.0" + include: "^3.0.0" mode: latest-minors commands: npm run test diff --git a/packages/instrumentation-koa/README.md b/packages/instrumentation-koa/README.md index 86e5a36484..1bcc42511b 100644 --- a/packages/instrumentation-koa/README.md +++ b/packages/instrumentation-koa/README.md @@ -23,7 +23,7 @@ npm install --save @opentelemetry/instrumentation-koa ### Supported Versions -- [`koa`](https://www.npmjs.com/package/koa) versions `>=2.0.0 <3` +- [`koa`](https://www.npmjs.com/package/koa) versions `>=2.0.0 <=3.0.0` - [`@koa/router`](https://www.npmjs.com/package/@koa/router) versions `>=8.0.0` ## Usage diff --git a/packages/instrumentation-koa/package.json b/packages/instrumentation-koa/package.json index 527378b68c..49ba9ca417 100644 --- a/packages/instrumentation-koa/package.json +++ b/packages/instrumentation-koa/package.json @@ -47,11 +47,11 @@ "access": "public" }, "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "@opentelemetry/api": "^1.9.0" }, "devDependencies": { "@koa/router": "14.0.0", - "@opentelemetry/api": "^1.3.0", + "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-async-hooks": "^2.0.0", "@opentelemetry/contrib-test-utils": "^0.51.0", "@opentelemetry/instrumentation-http": "^0.205.0", @@ -62,7 +62,7 @@ "@types/mocha": "10.0.10", "@types/node": "18.18.14", "@types/sinon": "17.0.4", - "koa": "2.16.2", + "koa": "3.0.0", "nyc": "17.1.0", "rimraf": "5.0.10", "semver": "7.7.2", @@ -73,7 +73,7 @@ "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.205.0", - "@opentelemetry/semantic-conventions": "^1.27.0" + "@opentelemetry/semantic-conventions": "^1.36.0" }, "homepage": "https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/packages/instrumentation-koa#readme" } diff --git a/packages/instrumentation-koa/src/instrumentation.ts b/packages/instrumentation-koa/src/instrumentation.ts index 3d7eb864a4..e0cf9f3e47 100644 --- a/packages/instrumentation-koa/src/instrumentation.ts +++ b/packages/instrumentation-koa/src/instrumentation.ts @@ -44,7 +44,7 @@ export class KoaInstrumentation extends InstrumentationBase=2.0.0 <3'], + ['>=2.0.0 <=3.0.0'], (module: any) => { const moduleExports: typeof koa = module[Symbol.toStringTag] === 'Module' diff --git a/packages/instrumentation-koa/src/utils.ts b/packages/instrumentation-koa/src/utils.ts index 2bbfd027ef..cbce88c61d 100644 --- a/packages/instrumentation-koa/src/utils.ts +++ b/packages/instrumentation-koa/src/utils.ts @@ -17,7 +17,9 @@ import { KoaLayerType, KoaInstrumentationConfig } from './types'; import { KoaContext, KoaMiddleware } from './internal-types'; import { AttributeNames } from './enums/AttributeNames'; import { Attributes } from '@opentelemetry/api'; -import { SEMATTRS_HTTP_ROUTE } from '@opentelemetry/semantic-conventions'; +import { + ATTR_HTTP_ROUTE, +} from '@opentelemetry/semantic-conventions'; export const getMiddlewareMetadata = ( context: KoaContext, @@ -33,7 +35,7 @@ export const getMiddlewareMetadata = ( attributes: { [AttributeNames.KOA_NAME]: layerPath?.toString(), [AttributeNames.KOA_TYPE]: KoaLayerType.ROUTER, - [SEMATTRS_HTTP_ROUTE]: layerPath?.toString(), + [ATTR_HTTP_ROUTE]: layerPath?.toString(), }, name: context._matchedRouteName || `router - ${layerPath}`, }; diff --git a/packages/instrumentation-koa/test/koa.test.ts b/packages/instrumentation-koa/test/koa.test.ts index cbb5917b7e..6889f105cd 100644 --- a/packages/instrumentation-koa/test/koa.test.ts +++ b/packages/instrumentation-koa/test/koa.test.ts @@ -26,9 +26,9 @@ import { SimpleSpanProcessor, } from '@opentelemetry/sdk-trace-base'; import { + ATTR_HTTP_ROUTE, SEMATTRS_EXCEPTION_MESSAGE, SEMATTRS_HTTP_METHOD, - SEMATTRS_HTTP_ROUTE, } from '@opentelemetry/semantic-conventions'; type KoaContext = ParameterizedContext; @@ -144,11 +144,6 @@ describe('Koa Instrumentation', function () { throw new Error('I failed!'); }; - const generatorMiddleware: () => koa.Middleware = () => - function* generatorMiddleware(next) { - yield next; - }; - describe('Instrumenting @koa/router calls', function () { before(function () { if (!isrouterCompat) { @@ -198,7 +193,7 @@ describe('Koa Instrumentation', function () { ); assert.strictEqual( - requestHandlerSpan?.attributes[SEMATTRS_HTTP_ROUTE], + requestHandlerSpan?.attributes[ATTR_HTTP_ROUTE], '/post/:id' ); @@ -249,7 +244,7 @@ describe('Koa Instrumentation', function () { ); assert.strictEqual( - requestHandlerSpan?.attributes[SEMATTRS_HTTP_ROUTE], + requestHandlerSpan?.attributes[ATTR_HTTP_ROUTE], '/^\\/post/' ); @@ -296,7 +291,7 @@ describe('Koa Instrumentation', function () { ); assert.strictEqual( - requestHandlerSpan?.attributes[SEMATTRS_HTTP_ROUTE], + requestHandlerSpan?.attributes[ATTR_HTTP_ROUTE], '/post/:id' ); @@ -345,7 +340,7 @@ describe('Koa Instrumentation', function () { ); assert.strictEqual( - requestHandlerSpan?.attributes[SEMATTRS_HTTP_ROUTE], + requestHandlerSpan?.attributes[ATTR_HTTP_ROUTE], '/:first/post/:id' ); @@ -392,7 +387,7 @@ describe('Koa Instrumentation', function () { ); assert.strictEqual( - requestHandlerSpan?.attributes[SEMATTRS_HTTP_ROUTE], + requestHandlerSpan?.attributes[ATTR_HTTP_ROUTE], '/:first/post/:id' ); @@ -502,35 +497,6 @@ describe('Koa Instrumentation', function () { ); }); - it('should not instrument generator middleware functions', async () => { - const rootSpan = tracer.startSpan('rootSpan'); - app.use((_ctx, next) => - context.with(trace.setSpan(context.active(), rootSpan), next) - ); - - app.use(generatorMiddleware()); - app.use(simpleResponse()); - - await context.with( - trace.setSpan(context.active(), rootSpan), - async () => { - await httpRequest.get(`http://localhost:${port}`); - rootSpan.end(); - assert.deepStrictEqual(memoryExporter.getFinishedSpans().length, 2); - - const simpleResponseSpan = memoryExporter - .getFinishedSpans() - .find(span => span.name.includes('simpleResponse')); - assert.notStrictEqual(simpleResponseSpan, undefined); - - const exportedRootSpan = memoryExporter - .getFinishedSpans() - .find(span => span.name === 'rootSpan'); - assert.notStrictEqual(exportedRootSpan, undefined); - } - ); - }); - it('should not instrument the same middleware more than once', async () => { const sameAsyncMiddleware = asyncMiddleware(); From 5d541433778fa5d0c3433faa9c04d0c69cf02f0c Mon Sep 17 00:00:00 2001 From: tlindhardt Date: Wed, 20 Aug 2025 10:37:59 -0500 Subject: [PATCH 2/4] Update to 3.0.1 for security fix, add recommendation to support <4 --- package-lock.json | 74 ++++++++++++------- packages/instrumentation-koa/.tav.yml | 2 +- packages/instrumentation-koa/README.md | 2 +- packages/instrumentation-koa/package.json | 2 +- .../src/instrumentation.ts | 2 +- 5 files changed, 52 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9b8d98baac..5fe41d1319 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34535,7 +34535,7 @@ "@types/mocha": "10.0.10", "@types/node": "18.18.14", "@types/sinon": "17.0.4", - "koa": "3.0.0", + "koa": "3.0.1", "nyc": "17.1.0", "rimraf": "5.0.10", "semver": "7.7.2", @@ -34597,28 +34597,27 @@ } }, "packages/instrumentation-koa/node_modules/koa": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/koa/-/koa-3.0.0.tgz", - "integrity": "sha512-Usyqf1o+XN618R3Jzq4S4YWbKsRtPcGpgyHXD4APdGYQQyqQ59X+Oyc7fXHS2429stzLsBiDjj6zqqYe8kknfw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/koa/-/koa-3.0.1.tgz", + "integrity": "sha512-oDxVkRwPOHhGlxKIDiDB2h+/l05QPtefD7nSqRgDfZt8P+QVYFWjfeK8jANf5O2YXjk8egd7KntvXKYx82wOag==", "dev": true, "license": "MIT", "dependencies": { - "accepts": "^1.3.5", - "cache-content-type": "^1.0.0", - "content-disposition": "~0.5.2", - "content-type": "^1.0.4", + "accepts": "^1.3.8", + "content-disposition": "~0.5.4", + "content-type": "^1.0.5", "cookies": "~0.9.1", - "debug": "^4.3.2", "delegates": "^1.0.0", - "destroy": "^1.0.4", + "destroy": "^1.2.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "fresh": "~0.5.2", - "http-assert": "^1.3.0", + "http-assert": "^1.5.0", "http-errors": "^2.0.0", "koa-compose": "^4.1.0", - "on-finished": "^2.3.0", - "parseurl": "^1.3.2", + "mime-types": "^3.0.1", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" @@ -34627,6 +34626,19 @@ "node": ">= 18" } }, + "packages/instrumentation-koa/node_modules/koa/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "packages/instrumentation-koa/node_modules/media-typer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", @@ -45829,7 +45841,7 @@ "@types/mocha": "10.0.10", "@types/node": "18.18.14", "@types/sinon": "17.0.4", - "koa": "3.0.0", + "koa": "3.0.1", "nyc": "17.1.0", "rimraf": "5.0.10", "semver": "7.7.2", @@ -45873,30 +45885,40 @@ "dev": true }, "koa": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/koa/-/koa-3.0.0.tgz", - "integrity": "sha512-Usyqf1o+XN618R3Jzq4S4YWbKsRtPcGpgyHXD4APdGYQQyqQ59X+Oyc7fXHS2429stzLsBiDjj6zqqYe8kknfw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/koa/-/koa-3.0.1.tgz", + "integrity": "sha512-oDxVkRwPOHhGlxKIDiDB2h+/l05QPtefD7nSqRgDfZt8P+QVYFWjfeK8jANf5O2YXjk8egd7KntvXKYx82wOag==", "dev": true, "requires": { - "accepts": "^1.3.5", - "cache-content-type": "^1.0.0", - "content-disposition": "~0.5.2", - "content-type": "^1.0.4", + "accepts": "^1.3.8", + "content-disposition": "~0.5.4", + "content-type": "^1.0.5", "cookies": "~0.9.1", - "debug": "^4.3.2", "delegates": "^1.0.0", - "destroy": "^1.0.4", + "destroy": "^1.2.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "fresh": "~0.5.2", - "http-assert": "^1.3.0", + "http-assert": "^1.5.0", "http-errors": "^2.0.0", "koa-compose": "^4.1.0", - "on-finished": "^2.3.0", - "parseurl": "^1.3.2", + "mime-types": "^3.0.1", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" + }, + "dependencies": { + "mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "requires": { + "mime-db": "^1.54.0" + } + } } }, "media-typer": { diff --git a/packages/instrumentation-koa/.tav.yml b/packages/instrumentation-koa/.tav.yml index 48c991d41b..fb4111e906 100644 --- a/packages/instrumentation-koa/.tav.yml +++ b/packages/instrumentation-koa/.tav.yml @@ -13,6 +13,6 @@ koa: # Testing ^2.7.0 covers at least 97% of the downloaded koa versions versions: - include: "^3.0.0" + include: "^3.0.1" mode: latest-minors commands: npm run test diff --git a/packages/instrumentation-koa/README.md b/packages/instrumentation-koa/README.md index 1bcc42511b..72a08fa87b 100644 --- a/packages/instrumentation-koa/README.md +++ b/packages/instrumentation-koa/README.md @@ -23,7 +23,7 @@ npm install --save @opentelemetry/instrumentation-koa ### Supported Versions -- [`koa`](https://www.npmjs.com/package/koa) versions `>=2.0.0 <=3.0.0` +- [`koa`](https://www.npmjs.com/package/koa) versions `>=2.0.0 <4` - [`@koa/router`](https://www.npmjs.com/package/@koa/router) versions `>=8.0.0` ## Usage diff --git a/packages/instrumentation-koa/package.json b/packages/instrumentation-koa/package.json index 49ba9ca417..97c5a30bb3 100644 --- a/packages/instrumentation-koa/package.json +++ b/packages/instrumentation-koa/package.json @@ -62,7 +62,7 @@ "@types/mocha": "10.0.10", "@types/node": "18.18.14", "@types/sinon": "17.0.4", - "koa": "3.0.0", + "koa": "3.0.1", "nyc": "17.1.0", "rimraf": "5.0.10", "semver": "7.7.2", diff --git a/packages/instrumentation-koa/src/instrumentation.ts b/packages/instrumentation-koa/src/instrumentation.ts index e0cf9f3e47..b23f26c82c 100644 --- a/packages/instrumentation-koa/src/instrumentation.ts +++ b/packages/instrumentation-koa/src/instrumentation.ts @@ -44,7 +44,7 @@ export class KoaInstrumentation extends InstrumentationBase=2.0.0 <=3.0.0'], + ['>=2.0.0 <4'], (module: any) => { const moduleExports: typeof koa = module[Symbol.toStringTag] === 'Module' From 795babd73869c777d7d7f88f0daf41fa9e8c32fc Mon Sep 17 00:00:00 2001 From: tlindhardt Date: Wed, 10 Sep 2025 13:34:24 -0500 Subject: [PATCH 3/4] Revert test changes to support 2.7.0+ --- package-lock.json | 27 ------------- packages/instrumentation-koa/.tav.yml | 2 +- packages/instrumentation-koa/test/koa.test.ts | 38 +++++++++++++++++++ 3 files changed, 39 insertions(+), 28 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5fe41d1319..0d2516b629 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33191,23 +33191,6 @@ "@opentelemetry/core": "^2.0.0" } }, - "packages/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-koa": { - "version": "0.51.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.51.0.tgz", - "integrity": "sha512-XNLWeMTMG1/EkQBbgPYzCeBD0cwOrfnn8ao4hWgLv0fNCFQu1kCsJYygz2cvKuCs340RlnG4i321hX7R8gj3Rg==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.203.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, "packages/auto-instrumentations-node/node_modules/@types/node": { "version": "18.18.14", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.14.tgz", @@ -44532,16 +44515,6 @@ "typescript": "5.0.4" }, "dependencies": { - "@opentelemetry/instrumentation-koa": { - "version": "0.51.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.51.0.tgz", - "integrity": "sha512-XNLWeMTMG1/EkQBbgPYzCeBD0cwOrfnn8ao4hWgLv0fNCFQu1kCsJYygz2cvKuCs340RlnG4i321hX7R8gj3Rg==", - "requires": { - "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.203.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - } - }, "@types/node": { "version": "18.18.14", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.14.tgz", diff --git a/packages/instrumentation-koa/.tav.yml b/packages/instrumentation-koa/.tav.yml index fb4111e906..5149d588ca 100644 --- a/packages/instrumentation-koa/.tav.yml +++ b/packages/instrumentation-koa/.tav.yml @@ -13,6 +13,6 @@ koa: # Testing ^2.7.0 covers at least 97% of the downloaded koa versions versions: - include: "^3.0.1" + include: ">=2.7.0 <4" mode: latest-minors commands: npm run test diff --git a/packages/instrumentation-koa/test/koa.test.ts b/packages/instrumentation-koa/test/koa.test.ts index 6889f105cd..5a525d879c 100644 --- a/packages/instrumentation-koa/test/koa.test.ts +++ b/packages/instrumentation-koa/test/koa.test.ts @@ -144,6 +144,11 @@ describe('Koa Instrumentation', function () { throw new Error('I failed!'); }; + const generatorMiddleware: () => koa.Middleware = () => + function* generatorMiddleware(next) { + yield next; + }; + describe('Instrumenting @koa/router calls', function () { before(function () { if (!isrouterCompat) { @@ -497,6 +502,39 @@ describe('Koa Instrumentation', function () { ); }); + it('should not instrument generator middleware functions', async function() { + if (typeof (app as any).createAsyncCtxStorageMiddleware !== 'function') { + this.skip() + } + + const rootSpan = tracer.startSpan('rootSpan'); + app.use((_ctx, next) => + context.with(trace.setSpan(context.active(), rootSpan), next) + ); + + app.use(generatorMiddleware()); + app.use(simpleResponse()); + + await context.with( + trace.setSpan(context.active(), rootSpan), + async () => { + await httpRequest.get(`http://localhost:${port}`); + rootSpan.end(); + assert.deepStrictEqual(memoryExporter.getFinishedSpans().length, 2); + + const simpleResponseSpan = memoryExporter + .getFinishedSpans() + .find(span => span.name.includes('simpleResponse')); + assert.notStrictEqual(simpleResponseSpan, undefined); + + const exportedRootSpan = memoryExporter + .getFinishedSpans() + .find(span => span.name === 'rootSpan'); + assert.notStrictEqual(exportedRootSpan, undefined); + } + ); + }); + it('should not instrument the same middleware more than once', async () => { const sameAsyncMiddleware = asyncMiddleware(); From 6acb82b450f04e0f259b7fd25fb20bcf8b2f0f0e Mon Sep 17 00:00:00 2001 From: tlindhardt Date: Wed, 10 Sep 2025 14:54:10 -0500 Subject: [PATCH 4/4] fix lint issues --- packages/instrumentation-koa/src/utils.ts | 4 +--- packages/instrumentation-koa/test/koa.test.ts | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/instrumentation-koa/src/utils.ts b/packages/instrumentation-koa/src/utils.ts index cbce88c61d..86718fad78 100644 --- a/packages/instrumentation-koa/src/utils.ts +++ b/packages/instrumentation-koa/src/utils.ts @@ -17,9 +17,7 @@ import { KoaLayerType, KoaInstrumentationConfig } from './types'; import { KoaContext, KoaMiddleware } from './internal-types'; import { AttributeNames } from './enums/AttributeNames'; import { Attributes } from '@opentelemetry/api'; -import { - ATTR_HTTP_ROUTE, -} from '@opentelemetry/semantic-conventions'; +import { ATTR_HTTP_ROUTE } from '@opentelemetry/semantic-conventions'; export const getMiddlewareMetadata = ( context: KoaContext, diff --git a/packages/instrumentation-koa/test/koa.test.ts b/packages/instrumentation-koa/test/koa.test.ts index 5a525d879c..94bccb0b85 100644 --- a/packages/instrumentation-koa/test/koa.test.ts +++ b/packages/instrumentation-koa/test/koa.test.ts @@ -502,9 +502,9 @@ describe('Koa Instrumentation', function () { ); }); - it('should not instrument generator middleware functions', async function() { + it('should not instrument generator middleware functions', async function () { if (typeof (app as any).createAsyncCtxStorageMiddleware !== 'function') { - this.skip() + this.skip(); } const rootSpan = tracer.startSpan('rootSpan');