opentelemetry-esbuild-plugin-node 0.2.4 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -87,7 +87,6 @@ function openTelemetryPlugin(pluginConfig) {
87
87
  const config = main_1.otelPackageToInstrumentationConfig[pluginData.instrumentationName];
88
88
  if (!config)
89
89
  return;
90
- // console.log('config is', config);
91
90
  const packageConfig = (_a = pluginConfig === null || pluginConfig === void 0 ? void 0 : pluginConfig.instrumentationConfig) === null || _a === void 0 ? void 0 : _a[config.oTelInstrumentationPackage];
92
91
  const extractedModule = pluginData.extractedModule;
93
92
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n ExtractedModule,\n OnLoadArgs,\n OpenTelemetryPluginParams,\n PluginData,\n} from './types';\nimport { Plugin, PluginBuild } from 'esbuild';\nimport { dirname, join } from 'path';\nimport {\n instrumentationModuleDefinitions,\n otelPackageToInstrumentationConfig,\n} from './config/main';\n\nimport { InstrumentationModuleDefinition } from '@opentelemetry/instrumentation';\nimport { builtinModules } from 'module';\nimport { readFile } from 'fs/promises';\nimport { satisfies } from 'semver';\nimport { wrapModule } from './common';\n\nconst NODE_MODULES = 'node_modules/';\n\nconst BUILT_INS = new Set(builtinModules.flatMap(b => [b, `node:${b}`]));\n\nexport function openTelemetryPlugin(\n pluginConfig?: OpenTelemetryPluginParams\n): Plugin {\n return {\n name: 'open-telemetry',\n setup(build) {\n build.onResolve({ filter: /.*/ }, async args => {\n if (\n shouldIgnoreModule({\n namespace: args.namespace,\n path: args.path,\n importer: args.importer,\n externalModules: pluginConfig?.externalModules,\n pathPrefixesToIgnore: pluginConfig?.pathPrefixesToIgnore,\n })\n ) {\n return;\n }\n\n let path;\n let extractedModule;\n\n try {\n const result = extractPackageAndModulePath(\n args.path,\n args.resolveDir\n );\n path = result.path;\n extractedModule = result.extractedModule;\n } catch (e) {\n // Some libraries like `mongodb` require optional dependencies, which may not be present and their absence doesn't break the code\n // Currently esbuild doesn't provide any better way to handle this in plugins: https://github.com/evanw/esbuild/issues/1127\n }\n\n // If it's a local import, don't patch it\n if (!extractedModule) return;\n\n // We'll rely on the OTel auto-instrumentation at runtime to patch builtin modules\n if (isBuiltIn(args.path, extractedModule)) return;\n\n const moduleVersion = await getModuleVersion({\n extractedModule,\n resolveDir: args.resolveDir,\n build,\n });\n if (!moduleVersion) return;\n\n // See if we have an instrumentation registered for this package\n const matchingInstrumentation = getInstrumentation({\n extractedModule,\n moduleVersion,\n path: args.path,\n });\n if (!matchingInstrumentation) return;\n\n const pluginData: PluginData = {\n extractedModule,\n moduleVersion,\n shouldPatchPackage: true,\n instrumentationName: matchingInstrumentation.name,\n };\n\n return { path, pluginData };\n });\n\n build.onLoad(\n { filter: /.*/ },\n async ({ path, pluginData }: OnLoadArgs) => {\n // Ignore any packages that don't have an instrumentation registered for them\n if (!pluginData?.shouldPatchPackage) return;\n\n const contents = await readFile(path);\n\n const config =\n otelPackageToInstrumentationConfig[pluginData.instrumentationName];\n if (!config) return;\n\n // console.log('config is', config);\n const packageConfig =\n pluginConfig?.instrumentationConfig?.[\n config.oTelInstrumentationPackage\n ];\n const extractedModule = pluginData.extractedModule;\n\n return {\n contents: wrapModule(contents.toString(), {\n path: join(\n extractedModule.package || '',\n extractedModule.path || ''\n ),\n moduleVersion: pluginData.moduleVersion,\n instrumentationName: pluginData.instrumentationName,\n oTelInstrumentationClass: config.oTelInstrumentationClass,\n oTelInstrumentationPackage: config.oTelInstrumentationPackage,\n oTelInstrumentationConstructorArgs:\n config.configGenerator(packageConfig),\n }),\n resolveDir: dirname(path),\n };\n }\n );\n },\n };\n}\n\n/**\n * For a given full path to a module,\n * return the package name it belongs to and the local path to the module\n * input: '/foo/node_modules/@co/stuff/foo/bar/baz.js'\n * output: { package: '@co/stuff', path: 'foo/bar/baz.js' }\n */\nfunction extractPackageAndModulePath(\n originalPath: string,\n resolveDir: string\n): { path: string; extractedModule: ExtractedModule | null } {\n // @see https://github.com/nodejs/node/issues/47000\n const path = require.resolve(\n originalPath === '.' ? './' : originalPath === '..' ? '../' : originalPath,\n { paths: [resolveDir] }\n );\n\n const nodeModulesIndex = path.lastIndexOf(NODE_MODULES);\n if (nodeModulesIndex < 0) return { path, extractedModule: null };\n\n const subPath = path.substring(nodeModulesIndex + NODE_MODULES.length);\n const firstSlashIndex = subPath.indexOf('/');\n\n if (!subPath.startsWith('@')) {\n return {\n path,\n extractedModule: {\n package: subPath.substring(0, firstSlashIndex),\n path: subPath.substring(firstSlashIndex + 1),\n },\n };\n }\n\n const secondSlash = subPath.substring(firstSlashIndex + 1).indexOf('/');\n return {\n path,\n extractedModule: {\n package: subPath.substring(0, firstSlashIndex + secondSlash + 1),\n path: subPath.substring(firstSlashIndex + secondSlash + 2),\n },\n };\n}\n\nfunction shouldIgnoreModule({\n namespace,\n path,\n importer,\n externalModules,\n pathPrefixesToIgnore,\n}: {\n namespace: string;\n path: string;\n importer: string;\n externalModules?: string[];\n pathPrefixesToIgnore?: string[];\n}): boolean {\n // If onLoad is being triggered from another plugin, ignore it\n if (namespace !== 'file') return true;\n // If it's a local import from our code, ignore it\n if (!importer.includes(NODE_MODULES) && path.startsWith('.')) return true;\n // If it starts with a prefix to ignore, ignore it\n if (pathPrefixesToIgnore?.some(prefix => path.startsWith(prefix))) {\n return true;\n }\n // If it's marked as external, ignore it\n if (externalModules?.includes(path)) return true;\n\n return false;\n}\n\nfunction isBuiltIn(path: string, extractedModule: ExtractedModule): boolean {\n return (\n BUILT_INS.has(path) ||\n BUILT_INS.has(`${extractedModule.package}/${extractedModule.path}`)\n );\n}\n\nconst moduleVersionByPackageJsonPath = new Map<string, string>();\n\nasync function getModuleVersion({\n extractedModule,\n resolveDir,\n build,\n}: {\n extractedModule: ExtractedModule;\n resolveDir: string;\n build: PluginBuild;\n}) {\n const path = `${extractedModule.package}/package.json`;\n const contents = moduleVersionByPackageJsonPath.get(path);\n if (contents) return contents;\n\n const { path: packageJsonPath } = await build.resolve(path, {\n resolveDir,\n kind: 'require-resolve',\n });\n if (!packageJsonPath) return;\n\n const packageJsonContents = await readFile(packageJsonPath);\n const moduleVersion = JSON.parse(packageJsonContents.toString()).version;\n moduleVersionByPackageJsonPath.set(path, moduleVersion);\n return moduleVersion;\n}\n\nfunction getInstrumentation({\n extractedModule,\n path,\n moduleVersion,\n}: {\n extractedModule: ExtractedModule;\n path: string;\n moduleVersion: string;\n}): InstrumentationModuleDefinition | null {\n for (const instrumentationModuleDefinition of instrumentationModuleDefinitions) {\n const fullModulePath = `${extractedModule.package}/${extractedModule.path}`;\n const nameMatches =\n instrumentationModuleDefinition.name === path ||\n instrumentationModuleDefinition.name === fullModulePath;\n\n if (!nameMatches) {\n const fileMatch = instrumentationModuleDefinition.files.find(file => {\n return file.name === path || file.name === fullModulePath;\n });\n if (!fileMatch) continue;\n }\n\n if (\n instrumentationModuleDefinition.supportedVersions.some(supportedVersion =>\n satisfies(moduleVersion, supportedVersion)\n )\n ) {\n return instrumentationModuleDefinition;\n }\n\n if (\n instrumentationModuleDefinition.files.some(file => {\n if (file.name !== path && file.name !== fullModulePath) return false;\n return file.supportedVersions.some(supportedVersion =>\n satisfies(moduleVersion, supportedVersion)\n );\n })\n ) {\n return instrumentationModuleDefinition;\n }\n }\n return null;\n}\n"]}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n ExtractedModule,\n OnLoadArgs,\n OpenTelemetryPluginParams,\n PluginData,\n} from './types';\nimport { Plugin, PluginBuild } from 'esbuild';\nimport { dirname, join } from 'path';\nimport {\n instrumentationModuleDefinitions,\n otelPackageToInstrumentationConfig,\n} from './config/main';\n\nimport { InstrumentationModuleDefinition } from '@opentelemetry/instrumentation';\nimport { builtinModules } from 'module';\nimport { readFile } from 'fs/promises';\nimport { satisfies } from 'semver';\nimport { wrapModule } from './common';\n\nconst NODE_MODULES = 'node_modules/';\n\nconst BUILT_INS = new Set(builtinModules.flatMap(b => [b, `node:${b}`]));\n\nexport function openTelemetryPlugin(\n pluginConfig?: OpenTelemetryPluginParams\n): Plugin {\n return {\n name: 'open-telemetry',\n setup(build) {\n build.onResolve({ filter: /.*/ }, async args => {\n if (\n shouldIgnoreModule({\n namespace: args.namespace,\n path: args.path,\n importer: args.importer,\n externalModules: pluginConfig?.externalModules,\n pathPrefixesToIgnore: pluginConfig?.pathPrefixesToIgnore,\n })\n ) {\n return;\n }\n\n let path;\n let extractedModule;\n\n try {\n const result = extractPackageAndModulePath(\n args.path,\n args.resolveDir\n );\n path = result.path;\n extractedModule = result.extractedModule;\n } catch (e) {\n // Some libraries like `mongodb` require optional dependencies, which may not be present and their absence doesn't break the code\n // Currently esbuild doesn't provide any better way to handle this in plugins: https://github.com/evanw/esbuild/issues/1127\n }\n\n // If it's a local import, don't patch it\n if (!extractedModule) return;\n\n // We'll rely on the OTel auto-instrumentation at runtime to patch builtin modules\n if (isBuiltIn(args.path, extractedModule)) return;\n\n const moduleVersion = await getModuleVersion({\n extractedModule,\n resolveDir: args.resolveDir,\n build,\n });\n if (!moduleVersion) return;\n\n // See if we have an instrumentation registered for this package\n const matchingInstrumentation = getInstrumentation({\n extractedModule,\n moduleVersion,\n path: args.path,\n });\n if (!matchingInstrumentation) return;\n\n const pluginData: PluginData = {\n extractedModule,\n moduleVersion,\n shouldPatchPackage: true,\n instrumentationName: matchingInstrumentation.name,\n };\n\n return { path, pluginData };\n });\n\n build.onLoad(\n { filter: /.*/ },\n async ({ path, pluginData }: OnLoadArgs) => {\n // Ignore any packages that don't have an instrumentation registered for them\n if (!pluginData?.shouldPatchPackage) return;\n\n const contents = await readFile(path);\n\n const config =\n otelPackageToInstrumentationConfig[pluginData.instrumentationName];\n if (!config) return;\n\n const packageConfig =\n pluginConfig?.instrumentationConfig?.[\n config.oTelInstrumentationPackage\n ];\n const extractedModule = pluginData.extractedModule;\n\n return {\n contents: wrapModule(contents.toString(), {\n path: join(\n extractedModule.package || '',\n extractedModule.path || ''\n ),\n moduleVersion: pluginData.moduleVersion,\n instrumentationName: pluginData.instrumentationName,\n oTelInstrumentationClass: config.oTelInstrumentationClass,\n oTelInstrumentationPackage: config.oTelInstrumentationPackage,\n oTelInstrumentationConstructorArgs:\n config.configGenerator(packageConfig),\n }),\n resolveDir: dirname(path),\n };\n }\n );\n },\n };\n}\n\n/**\n * For a given full path to a module,\n * return the package name it belongs to and the local path to the module\n * input: '/foo/node_modules/@co/stuff/foo/bar/baz.js'\n * output: { package: '@co/stuff', path: 'foo/bar/baz.js' }\n */\nfunction extractPackageAndModulePath(\n originalPath: string,\n resolveDir: string\n): { path: string; extractedModule: ExtractedModule | null } {\n // @see https://github.com/nodejs/node/issues/47000\n const path = require.resolve(\n originalPath === '.' ? './' : originalPath === '..' ? '../' : originalPath,\n { paths: [resolveDir] }\n );\n\n const nodeModulesIndex = path.lastIndexOf(NODE_MODULES);\n if (nodeModulesIndex < 0) return { path, extractedModule: null };\n\n const subPath = path.substring(nodeModulesIndex + NODE_MODULES.length);\n const firstSlashIndex = subPath.indexOf('/');\n\n if (!subPath.startsWith('@')) {\n return {\n path,\n extractedModule: {\n package: subPath.substring(0, firstSlashIndex),\n path: subPath.substring(firstSlashIndex + 1),\n },\n };\n }\n\n const secondSlash = subPath.substring(firstSlashIndex + 1).indexOf('/');\n return {\n path,\n extractedModule: {\n package: subPath.substring(0, firstSlashIndex + secondSlash + 1),\n path: subPath.substring(firstSlashIndex + secondSlash + 2),\n },\n };\n}\n\nfunction shouldIgnoreModule({\n namespace,\n path,\n importer,\n externalModules,\n pathPrefixesToIgnore,\n}: {\n namespace: string;\n path: string;\n importer: string;\n externalModules?: string[];\n pathPrefixesToIgnore?: string[];\n}): boolean {\n // If onLoad is being triggered from another plugin, ignore it\n if (namespace !== 'file') return true;\n // If it's a local import from our code, ignore it\n if (!importer.includes(NODE_MODULES) && path.startsWith('.')) return true;\n // If it starts with a prefix to ignore, ignore it\n if (pathPrefixesToIgnore?.some(prefix => path.startsWith(prefix))) {\n return true;\n }\n // If it's marked as external, ignore it\n if (externalModules?.includes(path)) return true;\n\n return false;\n}\n\nfunction isBuiltIn(path: string, extractedModule: ExtractedModule): boolean {\n return (\n BUILT_INS.has(path) ||\n BUILT_INS.has(`${extractedModule.package}/${extractedModule.path}`)\n );\n}\n\nconst moduleVersionByPackageJsonPath = new Map<string, string>();\n\nasync function getModuleVersion({\n extractedModule,\n resolveDir,\n build,\n}: {\n extractedModule: ExtractedModule;\n resolveDir: string;\n build: PluginBuild;\n}) {\n const path = `${extractedModule.package}/package.json`;\n const contents = moduleVersionByPackageJsonPath.get(path);\n if (contents) return contents;\n\n const { path: packageJsonPath } = await build.resolve(path, {\n resolveDir,\n kind: 'require-resolve',\n });\n if (!packageJsonPath) return;\n\n const packageJsonContents = await readFile(packageJsonPath);\n const moduleVersion = JSON.parse(packageJsonContents.toString()).version;\n moduleVersionByPackageJsonPath.set(path, moduleVersion);\n return moduleVersion;\n}\n\nfunction getInstrumentation({\n extractedModule,\n path,\n moduleVersion,\n}: {\n extractedModule: ExtractedModule;\n path: string;\n moduleVersion: string;\n}): InstrumentationModuleDefinition | null {\n for (const instrumentationModuleDefinition of instrumentationModuleDefinitions) {\n const fullModulePath = `${extractedModule.package}/${extractedModule.path}`;\n const nameMatches =\n instrumentationModuleDefinition.name === path ||\n instrumentationModuleDefinition.name === fullModulePath;\n\n if (!nameMatches) {\n const fileMatch = instrumentationModuleDefinition.files.find(file => {\n return file.name === path || file.name === fullModulePath;\n });\n if (!fileMatch) continue;\n }\n\n if (\n instrumentationModuleDefinition.supportedVersions.some(supportedVersion =>\n satisfies(moduleVersion, supportedVersion)\n )\n ) {\n return instrumentationModuleDefinition;\n }\n\n if (\n instrumentationModuleDefinition.files.some(file => {\n if (file.name !== path && file.name !== fullModulePath) return false;\n return file.supportedVersions.some(supportedVersion =>\n satisfies(moduleVersion, supportedVersion)\n );\n })\n ) {\n return instrumentationModuleDefinition;\n }\n }\n return null;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opentelemetry-esbuild-plugin-node",
3
- "version": "0.2.4",
3
+ "version": "0.2.5",
4
4
  "description": "Metapackage which bundles opentelemetry node core and contrib instrumentations via an esbuild plugin",
5
5
  "author": "Drew Corlin",
6
6
  "homepage": "https://github.com/DrewCorlin/opentelemetry-esbuild-plugin-node",