{
  "name": "@opentelemetry/sdk-trace",
  "versions": {
    "2.9.0": {
      "name": "@opentelemetry/sdk-trace",
      "version": "2.9.0",
      "description": "OpenTelemetry Tracing",
      "main": "build/src/index.js",
      "module": "build/esm/index.js",
      "esnext": "build/esnext/index.js",
      "browser": {
        "./src/platform/index.ts": "./src/platform/browser/index.ts",
        "./build/esm/platform/index.js": "./build/esm/platform/browser/index.js",
        "./build/esnext/platform/index.js": "./build/esnext/platform/browser/index.js",
        "./build/src/platform/index.js": "./build/src/platform/browser/index.js"
      },
      "types": "build/src/index.d.ts",
      "repository": {
        "type": "git",
        "url": "git+https://github.com/open-telemetry/opentelemetry-js.git"
      },
      "scripts": {
        "prepublishOnly": "npm run compile",
        "compile": "tsc --build tsconfig.json tsconfig.esm.json tsconfig.esnext.json",
        "clean": "tsc --build --clean tsconfig.json tsconfig.esm.json tsconfig.esnext.json",
        "test": "nyc mocha 'test/**/*.test.ts' --exclude 'test/browser/**/*.ts'",
        "test:browser": "karma start --single-run",
        "test:webworker": "karma start karma.worker.js --single-run",
        "test:bench": "node test/performance/benchmark/internal-benchmarks.js && node test/performance/benchmark/public-benchmarks.js | tee .benchmark-results.txt",
        "test:bench:browser": "karma start karma.bench.js --single-run",
        "tdd": "npm run tdd:node",
        "tdd:node": "npm run test -- --watch-extensions ts --watch",
        "tdd:browser": "karma start",
        "lint": "eslint .",
        "lint:fix": "eslint . --fix",
        "version": "node ../../scripts/version-update.js",
        "watch": "tsc --build --watch tsconfig.json tsconfig.esm.json tsconfig.esnext.json",
        "prewatch": "npm run precompile",
        "peer-api-check": "node ../../scripts/peer-api-check.js",
        "align-api-deps": "node ../../scripts/align-api-deps.js"
      },
      "keywords": [
        "opentelemetry",
        "nodejs",
        "tracing",
        "profiling",
        "metrics",
        "stats"
      ],
      "author": {
        "name": "OpenTelemetry Authors"
      },
      "license": "Apache-2.0",
      "engines": {
        "node": "^18.19.0 || >=20.6.0"
      },
      "publishConfig": {
        "access": "public"
      },
      "devDependencies": {
        "@opentelemetry/api": ">=1.3.0 <1.10.0",
        "@opentelemetry/sdk-metrics": "2.9.0",
        "@types/benchmark": "2.1.5",
        "@types/mocha": "10.0.10",
        "@types/node": "18.19.130",
        "@types/sinon": "17.0.4",
        "@types/webpack-env": "1.16.3",
        "babel-plugin-istanbul": "8.0.0",
        "karma": "6.4.4",
        "karma-chrome-launcher": "3.1.0",
        "karma-coverage": "2.2.1",
        "karma-mocha": "2.0.1",
        "karma-mocha-webworker": "1.3.0",
        "karma-spec-reporter": "0.0.36",
        "karma-webpack": "5.0.1",
        "mocha": "11.7.6",
        "nyc": "17.1.0",
        "sinon": "18.0.1",
        "ts-loader": "9.5.7",
        "typescript": "5.0.4",
        "webpack": "5.104.1"
      },
      "peerDependencies": {
        "@opentelemetry/api": ">=1.3.0 <1.10.0"
      },
      "dependencies": {
        "@opentelemetry/core": "2.9.0",
        "@opentelemetry/resources": "2.9.0",
        "@opentelemetry/semantic-conventions": "^1.29.0"
      },
      "homepage": "https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/sdk-trace",
      "sideEffects": false,
      "gitHead": "40d67b7690a61bd9af0a4e5b5b9f4a14b11fc50e",
      "_id": "@opentelemetry/sdk-trace@2.9.0",
      "bugs": {
        "url": "https://github.com/open-telemetry/opentelemetry-js/issues"
      },
      "_nodeVersion": "24.16.0",
      "_npmVersion": "11.16.0",
      "dist": {
        "integrity": "sha512-sGA19HvtrrSKYsseHphluH6j3p6Xa3fqc7c7y8f/7mYWejc1lyDFcpSdD1kYa50HCLUeEo4zA5bW0pniaPszuw==",
        "shasum": "c82103a11a712b31ac9281b706fc5dc76d126ae6",
        "tarball": "http://mirrors.tencentyun.com/npm/@opentelemetry/sdk-trace/-/sdk-trace-2.9.0.tgz",
        "fileCount": 318,
        "unpackedSize": 791704,
        "signatures": [
          {
            "keyid": "SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U",
            "sig": "MEUCIQDM0qCU/1aJcXxWiklvM1AR774Oe3YMP/O29G8xBM0JfgIgDRazzsjY5zCxXJAkrYtwpe4nyLpytEdGVAYLOdy2wmE="
          }
        ]
      },
      "_npmUser": {
        "name": "trentm",
        "email": "trentm@gmail.com"
      },
      "directories": {},
      "maintainers": [
        {
          "name": "dyladan",
          "email": "dyladan@gmail.com"
        },
        {
          "name": "pichlermarc",
          "email": "marc.pichler@dynatrace.com"
        },
        {
          "name": "overbalance",
          "email": "overbalancedev@proton.me"
        },
        {
          "name": "npmjs-account",
          "email": "npmjs-account@opentelemetry.io"
        },
        {
          "name": "trentm",
          "email": "trentm@gmail.com"
        },
        {
          "name": "martinkuba",
          "email": "martin@martinkuba.com"
        }
      ],
      "_npmOperationalInternal": {
        "host": "s3://npm-registry-packages-npm-production",
        "tmp": "tmp/sdk-trace_2.9.0_1783026934526_0.4865827445898523"
      },
      "_hasShrinkwrap": false,
      "contributors": []
    }
  },
  "time": {
    "created": "2026-07-02T21:15:34.374Z",
    "2.9.0": "2026-07-02T21:15:34.704Z",
    "modified": "2026-07-02T21:15:34.963Z"
  },
  "users": {},
  "dist-tags": {
    "latest": "2.9.0"
  },
  "_rev": "649-35c30a32f247c971",
  "_id": "@opentelemetry/sdk-trace",
  "readme": "# OpenTelemetry Tracing SDK\n\n[![NPM Published Version][npm-img]][npm-url]\n[![Apache License][license-image]][license-image]\n\nThis module contains the [Trace SDK](https://opentelemetry.io/docs/specs/otel/trace/sdk/) for [opentelemetry-js](https://github.com/open-telemetry/opentelemetry-js).\n\nUsed standalone, this module provides methods for manual instrumentation of code, offering full control over span creation for client-side JavaScript (browser) and Node.js.\n\nIt does **not** provide automated instrumentation of known libraries, context propagation or distributed-context out-of-the-box.\n\n## Installation\n\n```bash\nnpm install --save @opentelemetry/api\nnpm install --save @opentelemetry/sdk-trace\n```\n\n## Usage\n\n```js\nconst { trace } = require('@opentelemetry/api');\nconst { TracerProvider } = require('@opentelemetry/sdk-trace');\n\n// A trace is a collection of *spans*. Spans are created with a *Tracer*.\n// Tracers are retrieved from a *TracerProvider*. Typically a global\n// TracerProvider is registered with the OpenTelemetry API, so that subsequent\n// api.trace.getTracer() calls can use it.\ntrace.setGlobalTracerProvider(new TracerProvider(/* ... */));\n\n// Important: for tracing to track parent/child relationships between spans\n// within a process and across services (distributed tracing), requires that\n// a *context manager* and a *propagator* be registered. These are handled\n// by separate packages. See section below.\n\n// Now retrieve a tracer, and create a span with it.\nconst tracer = trace.getTracer('default');\nconst span = tracer.startSpan('a-span-name');\n\n// Set a span attribute\nspan.setAttribute('key', 'value');\n\n// We must end the spans so they become available for exporting.\nspan.end();\n```\n\n### More complete tracing setup\n\nAs mentioned above, a full tracing setup typically requires a *context manager*\nfor tracing parent/child relationships within a process and *propagators* for\npropagating tracing data across processes (distributed tracing).\nContext managers and propagators are provided by packages *other* than\n`@opentelemetry/sdk-trace`.\n\nMost users should use one of the higher-level packages that provide a more\nconvenient and complete setup of an OpenTelemetry SDK:\n\n- [`@opentelemetry/sdk-node`](https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-sdk-node/#readme) for OpenTelemetry SDK setup for Node.js\n- [`@opentelemetry/auto-instrumentation-node`](https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/packages/auto-instrumentations-node/#readme) for automatic SDK setup\n  for Node.js, including instrumentations, etc.\n- See [the OpenTelemetry Browser repository](https://github.com/open-telemetry/opentelemetry-browser#readme) for using OpenTelemetry in the browser.\n\nHowever, as a quick overview, the following shows roughly how tracing is setup\nfor Node.js. (Which context manager, and sometimes which propagators, to use\ndepends on the JavaScript runtime.)\n\n```js\nconst os = require('os');\nconst { context, propagation, trace } = require('@opentelemetry/api');\nconst { TracerProvider } = require('@opentelemetry/sdk-trace');\nconst { AsyncLocalStorageContextManager } = require('@opentelemetry/context-async-hooks');\nconst {\n  CompositePropagator,\n  W3CBaggagePropagator,\n  W3CTraceContextPropagator,\n} = require('@opentelemetry/core');\n\nconst contextManager = new AsyncLocalStorageContextManager();\ncontext.setGlobalContextManager(contextManager);\n\nconst propagator = new CompositePropagator({\n  propagators: [ new W3CTraceContextPropagator(), new W3CBaggagePropagator() ],\n});\npropagation.setGlobalPropagator(propagator);\n\nconst tracerProvider = new TracerProvider(/* ... */);\ntrace.setGlobalTracerProvider(tracerProvider);\n\nprocess.on('SIGTERM', async () => {\n  await tracerProvider.shutdown().catch(console.error);\n  process.exit(128 + os.constants.signals.SIGTERM);\n});\nprocess.once('beforeExit', async () => {\n  await tracerProvider.shutdown().catch(console.error);\n});\n```\n\n## Built-in Samplers\n\nSampler is used to make decisions on `Span` sampling.\n\n### AlwaysOn Sampler\n\nSamples every trace regardless of upstream sampling decisions.\n\n> This is used as a default Sampler\n\n```js\nconst { AlwaysOnSampler, TracerProvider } = require(\"@opentelemetry/sdk-trace\");\n\nconst tracerProvider = new TracerProvider({\n  sampler: new AlwaysOnSampler()\n});\n```\n\n### AlwaysOff Sampler\n\nDoesn't sample any trace, regardless of upstream sampling decisions.\n\n```js\nconst { AlwaysOffSampler, TracerProvider } = require(\"@opentelemetry/sdk-trace\");\n\nconst tracerProvider = new TracerProvider({\n  sampler: new AlwaysOffSampler()\n});\n```\n\n### TraceIdRatioBased Sampler\n\nSamples some percentage of traces, calculated deterministically using the trace ID.\nAny trace that would be sampled at a given percentage will also be sampled at any higher percentage.\n\nThe `TraceIDRatioSampler` may be used with the `ParentBasedSampler` to respect the sampled flag of an incoming trace.\n\n```js\nconst {\n  TracerProvider,\n  TraceIdRatioBasedSampler,\n} = require(\"@opentelemetry/sdk-trace\");\n\nconst tracerProvider = new TracerProvider({\n  // See details of ParentBasedSampler below\n  sampler: new ParentBasedSampler({\n    // Trace ID Ratio Sampler accepts a positional argument\n    // which represents the percentage of traces which should\n    // be sampled.\n    root: new TraceIdRatioBasedSampler(0.5)\n  });\n});\n```\n\n### ParentBased Sampler\n\n- This is a composite sampler. `ParentBased` helps distinguished between the\nfollowing cases:\n  - No parent (root span).\n  - Remote parent with `sampled` flag `true`\n  - Remote parent with `sampled` flag `false`\n  - Local parent with `sampled` flag `true`\n  - Local parent with `sampled` flag `false`\n\nRequired parameters:\n\n- `root(Sampler)` - Sampler called for spans with no parent (root spans)\n\nOptional parameters:\n\n- `remoteParentSampled(Sampler)` (default: `AlwaysOn`)\n- `remoteParentNotSampled(Sampler)` (default: `AlwaysOff`)\n- `localParentSampled(Sampler)` (default: `AlwaysOn`)\n- `localParentNotSampled(Sampler)` (default: `AlwaysOff`)\n\n|Parent|parent.isRemote()|parent.isSampled()|Invoke sampler|\n|---|---|---|---|\n|absent|n/a|n/a|`root()`|\n|present|true|true|`remoteParentSampled()`|\n|present|true|false|`remoteParentNotSampled()`|\n|present|false|true|`localParentSampled()`|\n|present|false|false|`localParentNotSampled()`|\n\n```js\nconst {\n  AlwaysOffSampler,\n  TracerProvider,\n  ParentBasedSampler,\n  TraceIdRatioBasedSampler,\n} = require(\"@opentelemetry/sdk-trace\");\n\nconst tracerProvider = new TracerProvider({\n  sampler: new ParentBasedSampler({\n    // By default, the ParentBasedSampler will respect the parent span's sampling\n    // decision. This is configurable by providing a different sampler to use\n    // based on the situation. See configuration details above.\n    //\n    // This will delegate the sampling decision of all root traces (no parent)\n    // to the TraceIdRatioBasedSampler.\n    // See details of TraceIdRatioBasedSampler above.\n    root: new TraceIdRatioBasedSampler(0.5)\n  })\n});\n```\n\n### AlwaysRecord Sampler\n\nWraps a delegate sampler and upgrades any `NOT_RECORD` (drop) decision to `RECORD`, ensuring all spans are recorded\nwithout changing the sampling rate. This is useful when you want to count or measure all spans (e.g. via a processor)\nwhile still controlling export costs through the delegate sampler.\n\n```js\nconst {\n  TracerProvider,\n  ParentBasedSampler,\n  TraceIdRatioBasedSampler,\n  createAlwaysRecordSampler,\n} = require(\"@opentelemetry/sdk-trace\");\n\nconst tracerProvider = new TracerProvider({\n  // Wraps a 50% TraceIdRatioBased sampler so that dropped spans are still\n  // recorded (but not exported by a sampling exporter).\n  sampler: createAlwaysRecordSampler(new TraceIdRatioBasedSampler(0.5))\n});\n```\n\n## Example\n\nSee [examples/basic-tracer-node](https://github.com/open-telemetry/opentelemetry-js/tree/main/examples/basic-tracer-node) for an end-to-end example, including exporting created spans.\n\n## Migrating from `sdk-trace-*` packages\n\nThis `sdk-trace` package is intended as the replacement for the `@opentelemetry/sdk-trace-base`, `@opentelemetry/sdk-trace-node`, and `@opentelemetry/sdk-trace-web`.\nIt *removes* some functionality from those packages that better live elsewhere.\n\n### Migrating from sdk-trace-web\n\n**`WebTracerProvider` -> `TracerProvider`.**\nThe WebTracerProvider added a single `.register(...)` method to register a context manager and propagators.\nIt is recommended that user code do this manually now.\n\n```ts\n// -- Before\nimport { WebTracerProvider } from '@opentelemetry/sdk-trace-web';\nconst tracerProvider = new WebTracerProvider(/* ... */);\ntracerProvider.register(/* ... */);\n\n// -- After\nimport { context, propagation, trace } from '@opentelemetry/api';\nimport { TracerProvider } from '@opentelemetry/sdk-trace';\nimport { CompositePropagator, W3CBaggagePropagator, W3CTraceContextPropagator } from '@opentelemetry/core';\n\nconst tracerProvider = new TracerProvider(/* ... */);\ntrace.setGlobalTracerProvider(tracerProvider);\n\n// Whether and which context manager to use in the browser is out of scope\n// for this doc.\nconst contextManager = ...;\ncontext.setGlobalContextManager(contextManager);\n\nconst propagator = new CompositePropagator({\n    propagators: [\n      new W3CTraceContextPropagator(),\n      new W3CBaggagePropagator(),\n    ],\n  })\n);\npropagation.setGlobalPropagator(propagator);\n```\n\nSee \"Migrating from sdk-trace-base\" below for some changes to the `TracerProvider` constructor options.\n\n**Additional utilities in sdk-trace-web -> ???.**\nThere are a number of additional [utilities in sdk-trace-web](https://github.com/open-telemetry/opentelemetry-js/blob/v2.7.1/packages/opentelemetry-sdk-trace-web/src/index.ts#L8-L27).\nIt has generally been agreed that these better belong elsewhere,\nperhaps in [`@opentelemetry/browser-instrumentation`](https://github.com/open-telemetry/opentelemetry-browser/tree/main/packages/instrumentation/src/utils).\nHowever, [many utilities have not yet been migrated](https://github.com/open-telemetry/opentelemetry-js/issues/6591).\n\n### Migrating from sdk-trace-node\n\n**`NodeTracerProvider` -> `BasicTracerProvider` -> `TracerProvider`.**\nNodeTracerProvider added a single `.register(...)` method to register a context manager and propagators.\nIt is recommended that user code do this manually now.\nBasicTracerProvider (in sdk-trace-base) reads environment variables for some tracer provider defaults.\nIt is recommended that user code use the [sdk-node](https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-sdk-node/) or [configuration](https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/configuration/) packages for environment variable-based or file-based SDK configuration.\n\n```ts\n// -- Before\nimport { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';\nconst tracerProvider = new NodeTracerProvider(/* ... */);\ntracerProvider.register(/* ... */);\n\n// -- After (using low-level primitives)\nimport { context, propagation, trace } from '@opentelemetry/api';\nimport { TracerProvider } from '@opentelemetry/sdk-trace';\nimport { CompositePropagator, W3CBaggagePropagator, W3CTraceContextPropagator } from '@opentelemetry/core';\n\n// Manually handle `OTEL_` envvars as necessary, or see \"sdk-node\" package docs.\nconst tracerProvider = new TracerProvider(/* ... */);\ntrace.setGlobalTracerProvider(tracerProvider);\n\nimport { AsyncLocalStorageContextManager } from '@opentelemetry/context-async-hooks';\ncontext.setGlobalContextManager(new AsyncLocalStorageContextManager());\n\nconst propagator = new CompositePropagator({\n  propagators: [new W3CTraceContextPropagator(), new W3CBaggagePropagator()],\n});\npropagation.setGlobalPropagator(propagator);\n```\n\nSee \"Migrating from sdk-trace-base\" below for some changes to the `TracerProvider` constructor options.\n\n### Migrating from sdk-trace-base\n\nRoughly speaking `sdk-trace` is `sdk-trace-base` with any reading of environment variables *removed*.\n\nThe specific API changes are as follows:\n\n- **BasicTracerProvider -> TracerProvider** class name change\n  - The `generalLimits` constructor option is no longer supported.\n    The caller must merge those limits into the `spanLimits` argument.\n  - The following environment variables are no longer read for fallback values:\n    - OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT\n    - OTEL_ATTRIBUTE_COUNT_LIMIT\n    - OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT\n    - OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT\n    - OTEL_SPAN_LINK_COUNT_LIMIT\n    - OTEL_SPAN_EVENT_COUNT_LIMIT\n    - OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT\n    - OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT\n    - OTEL_TRACES_SAMPLER\n    - OTEL_TRACES_SAMPLER_ARG\n- **BatchSpanProcessor** no longer reads the following environment variables for fallback values:\n  - OTEL_BSP_MAX_EXPORT_BATCH_SIZE\n  - OTEL_BSP_MAX_QUEUE_SIZE\n  - OTEL_BSP_SCHEDULE_DELAY\n  - OTEL_BSP_EXPORT_TIMEOUT\n\nFor [SDK environment variable support](https://opentelemetry.io/docs/specs/otel/configuration/sdk-environment-variables/) it is recommended that users use the [sdk-node package](https://github.com/open-telemetry/opentelemetry-js/blob/main/experimental/packages/opentelemetry-sdk-node/).\n\n## Useful links\n\n- For more information on OpenTelemetry, visit: <https://opentelemetry.io/>\n- For more about OpenTelemetry JavaScript: <https://github.com/open-telemetry/opentelemetry-js>\n- For help or feedback on this project, join us in [GitHub Discussions][discussions-url]\n\n## License\n\nApache 2.0 - See [LICENSE][license-url] for more information.\n\n[discussions-url]: https://github.com/open-telemetry/opentelemetry-js/discussions\n[license-url]: https://github.com/open-telemetry/opentelemetry-js/blob/main/LICENSE\n[license-image]: https://img.shields.io/badge/license-Apache_2.0-green.svg?style=flat\n[npm-url]: https://www.npmjs.com/package/@opentelemetry/sdk-trace\n[npm-img]: https://badge.fury.io/js/%40opentelemetry%2Fsdk-trace.svg",
  "_attachments": {}
}
