Cannot find module 'src/instrumentation.ts' when using --require with ts-node

Using this as my starting point: https://opentelemetry.io/docs/languages/js/instrumentation/

I'm trying to pre-load opentelemetry instrumentation into my Express app using --require.

I added this to package.json:

    "local": "nodemon --require src/instrumentation.ts src/server.ts",
    "start": "node --require dist/instrumentation.js dist/server.js",

and then I created src/instrumentation.ts:

import { NodeSDK } from '@opentelemetry/sdk-node';
import { ConsoleSpanExporter } from '@opentelemetry/sdk-trace-node';
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
import {
  PeriodicExportingMetricReader,
  ConsoleMetricExporter,
} from '@opentelemetry/sdk-metrics';

const instrumentation = new NodeSDK({
  traceExporter: new ConsoleSpanExporter(),
  metricReader: new PeriodicExportingMetricReader({
    exporter: new ConsoleMetricExporter()
  }),
  instrumentations: [
    getNodeAutoInstrumentations({
      '@opentelemetry/instrumentation-fs': { enabled: false }
    })
  ]
});

instrumentation.start();

but when I try to run npm run local, I get:

[nodemon] starting `ts-node --require src/instrumentation.ts src/server.ts`
Error: Cannot find module 'src/instrumentation.ts'
Require stack:
- internal/preload
    at Function.Module._resolveFilename (node:internal/modules/cjs/loader:1140:15)
    at Function.Module._resolveFilename.sharedData.moduleResolveFilenameHook.installedValue [as _resolveFilename] (/Users/jundai/gddy/templating/tmp/jundai-0328-tsapi-01/node_modules/@cspotcode/source-map-support/source-map-support.js:811:30)
    at Function.Module._load (node:internal/modules/cjs/loader:981:27)
    at internalRequire (node:internal/modules/cjs/loader:174:19)
    at Function.Module._preloadModules (node:internal/modules/cjs/loader:1569:5)
    at register (/Users/jundai/gddy/templating/tmp/jundai-0328-tsapi-01/node_modules/ts-node/src/index.ts:610:46)
    at phase4 (/Users/jundai/gddy/templating/tmp/jundai-0328-tsapi-01/node_modules/ts-node/src/bin.ts:554:11)
    at bootstrap (/Users/jundai/gddy/templating/tmp/jundai-0328-tsapi-01/node_modules/ts-node/src/bin.ts:95:10)
    at main (/Users/jundai/gddy/templating/tmp/jundai-0328-tsapi-01/node_modules/ts-node/src/bin.ts:55:10)
    at Object.<anonymous> (/Users/jundai/gddy/templating/tmp/jundai-0328-tsapi-01/node_modules/ts-node/src/bin.ts:800:3) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [ 'internal/preload' ]
}

and then if I run npm run start in docker after a build, I see:

> node --require dist/instrumentation.js dist/server.js

node:internal/modules/cjs/loader:1146
  throw err;
  ^

Error: Cannot find module 'dist/instrumentation.js'
Require stack:
- internal/preload
    at Module._resolveFilename (node:internal/modules/cjs/loader:1143:15)
    at Module._load (node:internal/modules/cjs/loader:984:27)
    at internalRequire (node:internal/modules/cjs/loader:174:19)
    at Module._preloadModules (node:internal/modules/cjs/loader:1574:5)
    at loadPreloadModules (node:internal/process/pre_execution:723:5)
    at setupUserModules (node:internal/process/pre_execution:203:5)
    at prepareExecution (node:internal/process/pre_execution:159:5)
    at prepareMainThreadExecution (node:internal/process/pre_execution:54:10)
    at node:internal/main/run_main_module:11:19 {
  code: 'MODULE_NOT_FOUND',
  requireStack: [ 'internal/preload' ]
}

Node.js v20.12.0

Where am I going wrong? Is this an issue with finding the files? or with typescript vs. js? or with modules (import/require)?

Upvotes: 0

Views: 920

Answers (1)

Ok, it turns out the problem was as simple as: I needed a ./ before ./src/instrumentation.ts.

Without that, it's probably trying to load a library or something?

Upvotes: 1

Related Questions