@opentelemetry/sdk-node 0.219.0 → 0.220.0

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.
package/README.md CHANGED
@@ -103,11 +103,6 @@ Deprecated, please use [logRecordProcessors](#logrecordprocessors) instead.
103
103
 
104
104
  An array of log record processors to register to the logger provider.
105
105
 
106
- ### mergeResourceWithDefaults
107
-
108
- Merge user-provided resources with the default resource. Default `true`.
109
- The default will change to `false` in a future iteration of this package.
110
-
111
106
  ### metricReader
112
107
 
113
108
  Add a [MetricReader](../../../packages/sdk-metrics/src/export/MetricReader.ts)
@@ -128,7 +123,34 @@ or configure each instrumentation individually.
128
123
 
129
124
  ### resource
130
125
 
131
- Configure a resource. Resources may also be detected by using the `autoDetectResources` method of the SDK.
126
+ A [Resource](https://opentelemetry.io/docs/specs/otel/resource/sdk/) to associate with generated telemetry.
127
+ This resource will be use as the basis for additional resource attributes determined by [resource detectors](#resourcedetectors).
128
+ See also the [`autoDetectResources` setting](#autodetectresources).
129
+
130
+ If not specified, the [default resource](https://opentelemetry.io/docs/specs/semconv/resource/#semantic-attributes-with-sdk-provided-default-value) will be used.
131
+
132
+ > [!WARNING]
133
+ > If specifying the `resource` option, it is recommended that the default resource be included.
134
+ > Otherwise the important `service.name` and `telemetry.sdk.*` resource attributes might not be included on telemetry,
135
+ > which can adversely impact downstream processing or visualization.
136
+ > The default resource can be include as follows:
137
+ >
138
+ > ```js
139
+ > import { NodeSDK } from '@opentelemetry/sdk-node';
140
+ > import { resourceFromAttributes, defaultResource } from '@opentelemetry/resources';
141
+ > const sdk = new NodeSDK({
142
+ > resource: defaultResource().merge(
143
+ > resourceFromAttributes({
144
+ > 'my.custom.attr': 'some value',
145
+ > })
146
+ > ),
147
+ > // ...
148
+ > });
149
+ > ```
150
+ >
151
+ > Alternatively, consider setting custom resource attributes via the
152
+ > [`OTEL_RESOURCE_ATTRIBUTES`](https://opentelemetry.io/docs/specs/otel/configuration/sdk-environment-variables/#general-sdk-configuration)
153
+ > environment variable.
132
154
 
133
155
  ### resourceDetectors
134
156
 
@@ -174,11 +196,11 @@ An array of span processors to register to the tracer provider.
174
196
 
175
197
  ### traceExporter
176
198
 
177
- Configure a trace exporter. If an exporter is configured, it will be used with a [BatchSpanProcessor](../../../packages/opentelemetry-sdk-trace-base/src/platform/node/export/BatchSpanProcessor.ts). If an exporter OR span processor is not configured programmatically, this package will auto setup the default `otlp` exporter with `http/protobuf` protocol with a `BatchSpanProcessor`.
199
+ Configure a trace exporter. If an exporter is configured, it will be used with a [BatchSpanProcessor](../../../packages/sdk-trace/src/platform/node/export/BatchSpanProcessor.ts). If an exporter OR span processor is not configured programmatically, this package will auto setup the default `otlp` exporter with `http/protobuf` protocol with a `BatchSpanProcessor`.
178
200
 
179
201
  ### spanLimits
180
202
 
181
- Configure tracing parameters. These are the same trace parameters used to [configure a tracer](../../../packages/opentelemetry-sdk-trace-base/src/types.ts#L71).
203
+ Configure tracing parameters. These are the same trace parameters used to [configure a tracer](../../../packages/sdk-trace/src/types.ts#L20).
182
204
 
183
205
  ### serviceName
184
206
 
@@ -245,7 +267,7 @@ linkes for details:
245
267
 
246
268
  - Metric reader metrics: [MetricReaderMetrics](../../../packages//sdk-metrics/src/export/MetricReaderMetrics.ts)
247
269
  - Logger metrics: [LoggerMetrics.ts](../sdk-logs/src/LoggerMetrics.ts)
248
- - Span metrics: [TracerMetrics.ts](../../../packages/opentelemetry-sdk-trace-base/src/TracerMetrics.ts)
270
+ - Span metrics: [TracerMetrics.ts](../../../packages/sdk-trace/src/TracerMetrics.ts)
249
271
 
250
272
  ## Useful links
251
273
 
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Create SDK components from parsed declarative config.
3
+ * https://opentelemetry.io/docs/specs/otel/configuration/sdk/#create
4
+ */
5
+ import type { AttributeLimitsConfigModel, SpanLimitsConfigModel } from '@opentelemetry/configuration';
6
+ import type { SpanLimits } from '@opentelemetry/sdk-trace';
7
+ export declare function createSpanLimitsFromConfig(limits?: SpanLimitsConfigModel, attribute_limits?: AttributeLimitsConfigModel): SpanLimits | undefined;
8
+ //# sourceMappingURL=create-from-config.d.ts.map
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright The OpenTelemetry Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.createSpanLimitsFromConfig = void 0;
8
+ function createSpanLimitsFromConfig(limits, attribute_limits) {
9
+ if (!limits && !attribute_limits) {
10
+ return undefined;
11
+ }
12
+ return {
13
+ attributeValueLengthLimit: limits?.attribute_value_length_limit ??
14
+ attribute_limits?.attribute_value_length_limit ??
15
+ undefined,
16
+ attributeCountLimit: limits?.attribute_count_limit ??
17
+ attribute_limits?.attribute_count_limit ??
18
+ undefined,
19
+ eventCountLimit: limits?.event_count_limit ?? undefined,
20
+ linkCountLimit: limits?.link_count_limit ?? undefined,
21
+ attributePerEventCountLimit: limits?.event_attribute_count_limit ?? undefined,
22
+ attributePerLinkCountLimit: limits?.link_attribute_count_limit ?? undefined,
23
+ };
24
+ }
25
+ exports.createSpanLimitsFromConfig = createSpanLimitsFromConfig;
26
+ //# sourceMappingURL=create-from-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-from-config.js","sourceRoot":"","sources":["../../src/create-from-config.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAaH,SAAgB,0BAA0B,CACxC,MAA8B,EAC9B,gBAA6C;IAE7C,IAAI,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE;QAChC,OAAO,SAAS,CAAC;KAClB;IACD,OAAO;QACL,yBAAyB,EACvB,MAAM,EAAE,4BAA4B;YACpC,gBAAgB,EAAE,4BAA4B;YAC9C,SAAS;QACX,mBAAmB,EACjB,MAAM,EAAE,qBAAqB;YAC7B,gBAAgB,EAAE,qBAAqB;YACvC,SAAS;QACX,eAAe,EAAE,MAAM,EAAE,iBAAiB,IAAI,SAAS;QACvD,cAAc,EAAE,MAAM,EAAE,gBAAgB,IAAI,SAAS;QACrD,2BAA2B,EACzB,MAAM,EAAE,2BAA2B,IAAI,SAAS;QAClD,0BAA0B,EAAE,MAAM,EAAE,0BAA0B,IAAI,SAAS;KAC5E,CAAC;AACJ,CAAC;AAtBD,gEAsBC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Create SDK components from parsed declarative config.\n * https://opentelemetry.io/docs/specs/otel/configuration/sdk/#create\n */\n\nimport type {\n AttributeLimitsConfigModel,\n SpanLimitsConfigModel,\n} from '@opentelemetry/configuration';\nimport type { SpanLimits } from '@opentelemetry/sdk-trace';\n\nexport function createSpanLimitsFromConfig(\n limits?: SpanLimitsConfigModel,\n attribute_limits?: AttributeLimitsConfigModel\n): SpanLimits | undefined {\n if (!limits && !attribute_limits) {\n return undefined;\n }\n return {\n attributeValueLengthLimit:\n limits?.attribute_value_length_limit ??\n attribute_limits?.attribute_value_length_limit ??\n undefined,\n attributeCountLimit:\n limits?.attribute_count_limit ??\n attribute_limits?.attribute_count_limit ??\n undefined,\n eventCountLimit: limits?.event_count_limit ?? undefined,\n linkCountLimit: limits?.link_count_limit ?? undefined,\n attributePerEventCountLimit:\n limits?.event_attribute_count_limit ?? undefined,\n attributePerLinkCountLimit: limits?.link_attribute_count_limit ?? undefined,\n };\n}\n"]}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Create SDK components from environment variable settings.
3
+ * https://opentelemetry.io/docs/specs/otel/configuration/sdk-environment-variables/
4
+ */
5
+ import type { MeterProvider } from '@opentelemetry/api';
6
+ import type { Sampler, SpanExporter, SpanLimits } from '@opentelemetry/sdk-trace';
7
+ import { BatchSpanProcessor } from '@opentelemetry/sdk-trace';
8
+ export declare function createSamplerFromEnv(): Sampler | undefined;
9
+ export declare function createSpanLimitsFromEnv(): SpanLimits | undefined;
10
+ export declare function createBatchSpanProcessorFromEnv(exporter: SpanExporter, selfObsMeterProvider?: MeterProvider): BatchSpanProcessor;
11
+ //# sourceMappingURL=create-from-env.d.ts.map
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright The OpenTelemetry Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.createBatchSpanProcessorFromEnv = exports.createSpanLimitsFromEnv = exports.createSamplerFromEnv = void 0;
8
+ const api_1 = require("@opentelemetry/api");
9
+ const core_1 = require("@opentelemetry/core");
10
+ const sdk_trace_1 = require("@opentelemetry/sdk-trace");
11
+ const sdk_trace_2 = require("@opentelemetry/sdk-trace");
12
+ const utils_1 = require("./utils");
13
+ const DEFAULT_RATIO = 1;
14
+ function createSamplerFromEnv() {
15
+ const samplerName = (0, core_1.getStringFromEnv)('OTEL_TRACES_SAMPLER');
16
+ if (samplerName === undefined) {
17
+ return undefined;
18
+ }
19
+ switch (samplerName) {
20
+ case 'always_on':
21
+ return new sdk_trace_2.AlwaysOnSampler();
22
+ case 'always_off':
23
+ return new sdk_trace_2.AlwaysOffSampler();
24
+ case 'parentbased_always_on':
25
+ return new sdk_trace_2.ParentBasedSampler({
26
+ root: new sdk_trace_2.AlwaysOnSampler(),
27
+ });
28
+ case 'parentbased_always_off':
29
+ return new sdk_trace_2.ParentBasedSampler({
30
+ root: new sdk_trace_2.AlwaysOffSampler(),
31
+ });
32
+ case 'traceidratio':
33
+ return new sdk_trace_2.TraceIdRatioBasedSampler(getSamplerRatioFromEnv());
34
+ case 'parentbased_traceidratio':
35
+ return new sdk_trace_2.ParentBasedSampler({
36
+ root: new sdk_trace_2.TraceIdRatioBasedSampler(getSamplerRatioFromEnv()),
37
+ });
38
+ default:
39
+ api_1.diag.error(`unknown OTEL_TRACES_SAMPLER value "${samplerName}", using default`);
40
+ return undefined;
41
+ }
42
+ }
43
+ exports.createSamplerFromEnv = createSamplerFromEnv;
44
+ function getSamplerRatioFromEnv() {
45
+ const ratio = (0, core_1.getNumberFromEnv)('OTEL_TRACES_SAMPLER_ARG');
46
+ if (ratio == null) {
47
+ api_1.diag.error(`OTEL_TRACES_SAMPLER_ARG is blank, defaulting to ${DEFAULT_RATIO}.`);
48
+ return DEFAULT_RATIO;
49
+ }
50
+ if (ratio < 0 || ratio > 1) {
51
+ api_1.diag.error(`OTEL_TRACES_SAMPLER_ARG=${ratio} was given, but it is out of range ([0..1]), defaulting to ${DEFAULT_RATIO}.`);
52
+ return DEFAULT_RATIO;
53
+ }
54
+ return ratio;
55
+ }
56
+ function createSpanLimitsFromEnv() {
57
+ return {
58
+ attributeCountLimit: (0, core_1.getNumberFromEnv)('OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT') ??
59
+ (0, core_1.getNumberFromEnv)('OTEL_ATTRIBUTE_COUNT_LIMIT'),
60
+ attributeValueLengthLimit: (0, core_1.getNumberFromEnv)('OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT') ??
61
+ (0, core_1.getNumberFromEnv)('OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT'),
62
+ eventCountLimit: (0, core_1.getNumberFromEnv)('OTEL_SPAN_EVENT_COUNT_LIMIT'),
63
+ linkCountLimit: (0, core_1.getNumberFromEnv)('OTEL_SPAN_LINK_COUNT_LIMIT'),
64
+ attributePerEventCountLimit: (0, core_1.getNumberFromEnv)('OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT'),
65
+ attributePerLinkCountLimit: (0, core_1.getNumberFromEnv)('OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT'),
66
+ };
67
+ }
68
+ exports.createSpanLimitsFromEnv = createSpanLimitsFromEnv;
69
+ function createBatchSpanProcessorFromEnv(exporter, selfObsMeterProvider) {
70
+ return new sdk_trace_1.BatchSpanProcessor({
71
+ exporter,
72
+ selfObsMeterProvider,
73
+ maxQueueSize: (0, utils_1.getNonNegativeNumberFromEnv)('OTEL_BSP_MAX_QUEUE_SIZE'),
74
+ scheduledDelayMillis: (0, utils_1.getNonNegativeNumberFromEnv)('OTEL_BSP_SCHEDULE_DELAY'),
75
+ exportTimeoutMillis: (0, utils_1.getNonNegativeNumberFromEnv)('OTEL_BSP_EXPORT_TIMEOUT'),
76
+ maxExportBatchSize: (0, utils_1.getNonNegativeNumberFromEnv)('OTEL_BSP_MAX_EXPORT_BATCH_SIZE'),
77
+ });
78
+ }
79
+ exports.createBatchSpanProcessorFromEnv = createBatchSpanProcessorFromEnv;
80
+ //# sourceMappingURL=create-from-env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-from-env.js","sourceRoot":"","sources":["../../src/create-from-env.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAQH,4CAA0C;AAC1C,8CAAyE;AAMzE,wDAA8D;AAC9D,wDAKkC;AAClC,mCAAsD;AAEtD,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB,SAAgB,oBAAoB;IAClC,MAAM,WAAW,GAAG,IAAA,uBAAgB,EAAC,qBAAqB,CAAC,CAAC;IAC5D,IAAI,WAAW,KAAK,SAAS,EAAE;QAC7B,OAAO,SAAS,CAAC;KAClB;IACD,QAAQ,WAAW,EAAE;QACnB,KAAK,WAAW;YACd,OAAO,IAAI,2BAAe,EAAE,CAAC;QAC/B,KAAK,YAAY;YACf,OAAO,IAAI,4BAAgB,EAAE,CAAC;QAChC,KAAK,uBAAuB;YAC1B,OAAO,IAAI,8BAAkB,CAAC;gBAC5B,IAAI,EAAE,IAAI,2BAAe,EAAE;aAC5B,CAAC,CAAC;QACL,KAAK,wBAAwB;YAC3B,OAAO,IAAI,8BAAkB,CAAC;gBAC5B,IAAI,EAAE,IAAI,4BAAgB,EAAE;aAC7B,CAAC,CAAC;QACL,KAAK,cAAc;YACjB,OAAO,IAAI,oCAAwB,CAAC,sBAAsB,EAAE,CAAC,CAAC;QAChE,KAAK,0BAA0B;YAC7B,OAAO,IAAI,8BAAkB,CAAC;gBAC5B,IAAI,EAAE,IAAI,oCAAwB,CAAC,sBAAsB,EAAE,CAAC;aAC7D,CAAC,CAAC;QACL;YACE,UAAI,CAAC,KAAK,CACR,sCAAsC,WAAW,kBAAkB,CACpE,CAAC;YACF,OAAO,SAAS,CAAC;KACpB;AACH,CAAC;AA9BD,oDA8BC;AAED,SAAS,sBAAsB;IAC7B,MAAM,KAAK,GAAG,IAAA,uBAAgB,EAAC,yBAAyB,CAAC,CAAC;IAC1D,IAAI,KAAK,IAAI,IAAI,EAAE;QACjB,UAAI,CAAC,KAAK,CACR,mDAAmD,aAAa,GAAG,CACpE,CAAC;QACF,OAAO,aAAa,CAAC;KACtB;IAED,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE;QAC1B,UAAI,CAAC,KAAK,CACR,2BAA2B,KAAK,8DAA8D,aAAa,GAAG,CAC/G,CAAC;QACF,OAAO,aAAa,CAAC;KACtB;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,uBAAuB;IACrC,OAAO;QACL,mBAAmB,EACjB,IAAA,uBAAgB,EAAC,iCAAiC,CAAC;YACnD,IAAA,uBAAgB,EAAC,4BAA4B,CAAC;QAChD,yBAAyB,EACvB,IAAA,uBAAgB,EAAC,wCAAwC,CAAC;YAC1D,IAAA,uBAAgB,EAAC,mCAAmC,CAAC;QACvD,eAAe,EAAE,IAAA,uBAAgB,EAAC,6BAA6B,CAAC;QAChE,cAAc,EAAE,IAAA,uBAAgB,EAAC,4BAA4B,CAAC;QAC9D,2BAA2B,EAAE,IAAA,uBAAgB,EAC3C,2CAA2C,CAC5C;QACD,0BAA0B,EAAE,IAAA,uBAAgB,EAC1C,0CAA0C,CAC3C;KACF,CAAC;AACJ,CAAC;AAjBD,0DAiBC;AAED,SAAgB,+BAA+B,CAC7C,QAAsB,EACtB,oBAAoC;IAEpC,OAAO,IAAI,8BAAkB,CAAC;QAC5B,QAAQ;QACR,oBAAoB;QACpB,YAAY,EAAE,IAAA,mCAA2B,EAAC,yBAAyB,CAAC;QACpE,oBAAoB,EAAE,IAAA,mCAA2B,EAC/C,yBAAyB,CAC1B;QACD,mBAAmB,EAAE,IAAA,mCAA2B,EAAC,yBAAyB,CAAC;QAC3E,kBAAkB,EAAE,IAAA,mCAA2B,EAC7C,gCAAgC,CACjC;KACF,CAAC,CAAC;AACL,CAAC;AAhBD,0EAgBC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Create SDK components from environment variable settings.\n * https://opentelemetry.io/docs/specs/otel/configuration/sdk-environment-variables/\n */\n\nimport type { MeterProvider } from '@opentelemetry/api';\nimport { diag } from '@opentelemetry/api';\nimport { getNumberFromEnv, getStringFromEnv } from '@opentelemetry/core';\nimport type {\n Sampler,\n SpanExporter,\n SpanLimits,\n} from '@opentelemetry/sdk-trace';\nimport { BatchSpanProcessor } from '@opentelemetry/sdk-trace';\nimport {\n AlwaysOffSampler,\n AlwaysOnSampler,\n ParentBasedSampler,\n TraceIdRatioBasedSampler,\n} from '@opentelemetry/sdk-trace';\nimport { getNonNegativeNumberFromEnv } from './utils';\n\nconst DEFAULT_RATIO = 1;\n\nexport function createSamplerFromEnv(): Sampler | undefined {\n const samplerName = getStringFromEnv('OTEL_TRACES_SAMPLER');\n if (samplerName === undefined) {\n return undefined;\n }\n switch (samplerName) {\n case 'always_on':\n return new AlwaysOnSampler();\n case 'always_off':\n return new AlwaysOffSampler();\n case 'parentbased_always_on':\n return new ParentBasedSampler({\n root: new AlwaysOnSampler(),\n });\n case 'parentbased_always_off':\n return new ParentBasedSampler({\n root: new AlwaysOffSampler(),\n });\n case 'traceidratio':\n return new TraceIdRatioBasedSampler(getSamplerRatioFromEnv());\n case 'parentbased_traceidratio':\n return new ParentBasedSampler({\n root: new TraceIdRatioBasedSampler(getSamplerRatioFromEnv()),\n });\n default:\n diag.error(\n `unknown OTEL_TRACES_SAMPLER value \"${samplerName}\", using default`\n );\n return undefined;\n }\n}\n\nfunction getSamplerRatioFromEnv(): number | undefined {\n const ratio = getNumberFromEnv('OTEL_TRACES_SAMPLER_ARG');\n if (ratio == null) {\n diag.error(\n `OTEL_TRACES_SAMPLER_ARG is blank, defaulting to ${DEFAULT_RATIO}.`\n );\n return DEFAULT_RATIO;\n }\n\n if (ratio < 0 || ratio > 1) {\n diag.error(\n `OTEL_TRACES_SAMPLER_ARG=${ratio} was given, but it is out of range ([0..1]), defaulting to ${DEFAULT_RATIO}.`\n );\n return DEFAULT_RATIO;\n }\n\n return ratio;\n}\n\nexport function createSpanLimitsFromEnv(): SpanLimits | undefined {\n return {\n attributeCountLimit:\n getNumberFromEnv('OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT') ??\n getNumberFromEnv('OTEL_ATTRIBUTE_COUNT_LIMIT'),\n attributeValueLengthLimit:\n getNumberFromEnv('OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT') ??\n getNumberFromEnv('OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT'),\n eventCountLimit: getNumberFromEnv('OTEL_SPAN_EVENT_COUNT_LIMIT'),\n linkCountLimit: getNumberFromEnv('OTEL_SPAN_LINK_COUNT_LIMIT'),\n attributePerEventCountLimit: getNumberFromEnv(\n 'OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT'\n ),\n attributePerLinkCountLimit: getNumberFromEnv(\n 'OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT'\n ),\n };\n}\n\nexport function createBatchSpanProcessorFromEnv(\n exporter: SpanExporter,\n selfObsMeterProvider?: MeterProvider\n): BatchSpanProcessor {\n return new BatchSpanProcessor({\n exporter,\n selfObsMeterProvider,\n maxQueueSize: getNonNegativeNumberFromEnv('OTEL_BSP_MAX_QUEUE_SIZE'),\n scheduledDelayMillis: getNonNegativeNumberFromEnv(\n 'OTEL_BSP_SCHEDULE_DELAY'\n ),\n exportTimeoutMillis: getNonNegativeNumberFromEnv('OTEL_BSP_EXPORT_TIMEOUT'),\n maxExportBatchSize: getNonNegativeNumberFromEnv(\n 'OTEL_BSP_MAX_EXPORT_BATCH_SIZE'\n ),\n });\n}\n"]}
@@ -3,8 +3,14 @@ export * as contextBase from '@opentelemetry/api';
3
3
  export * as core from '@opentelemetry/core';
4
4
  export * as logs from '@opentelemetry/sdk-logs';
5
5
  export * as metrics from '@opentelemetry/sdk-metrics';
6
- export * as node from '@opentelemetry/sdk-trace-node';
7
6
  export * as resources from '@opentelemetry/resources';
7
+ /**
8
+ * @deprecated Import directly from `@opentelemetry/sdk-trace` instead.
9
+ */
10
+ export * as node from '@opentelemetry/sdk-trace-node';
11
+ /**
12
+ * @deprecated Import directly from `@opentelemetry/sdk-trace` instead.
13
+ */
8
14
  export * as tracing from '@opentelemetry/sdk-trace-base';
9
15
  export { NodeSDK } from './sdk';
10
16
  export type { LoggerProviderConfig, MeterProviderConfig } from './sdk';
@@ -4,7 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.startNodeSDK = exports.NodeSDK = exports.tracing = exports.resources = exports.node = exports.metrics = exports.logs = exports.core = exports.contextBase = exports.api = void 0;
7
+ exports.startNodeSDK = exports.NodeSDK = exports.tracing = exports.node = exports.resources = exports.metrics = exports.logs = exports.core = exports.contextBase = exports.api = void 0;
8
8
  // This is a meta-package, and these exist in to re-export *all* items from
9
9
  // the individual packages as individual _namespaces_, so wildcard exports are
10
10
  // appropriate here. Otherwise, it'd be a pain to enumerate and keep things
@@ -15,8 +15,14 @@ exports.contextBase = require("@opentelemetry/api");
15
15
  exports.core = require("@opentelemetry/core");
16
16
  exports.logs = require("@opentelemetry/sdk-logs");
17
17
  exports.metrics = require("@opentelemetry/sdk-metrics");
18
- exports.node = require("@opentelemetry/sdk-trace-node");
19
18
  exports.resources = require("@opentelemetry/resources");
19
+ /**
20
+ * @deprecated Import directly from `@opentelemetry/sdk-trace` instead.
21
+ */
22
+ exports.node = require("@opentelemetry/sdk-trace-node");
23
+ /**
24
+ * @deprecated Import directly from `@opentelemetry/sdk-trace` instead.
25
+ */
20
26
  exports.tracing = require("@opentelemetry/sdk-trace-base");
21
27
  /* eslint-enable no-restricted-syntax */
22
28
  var sdk_1 = require("./sdk");
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,2EAA2E;AAC3E,8EAA8E;AAC9E,2EAA2E;AAC3E,0CAA0C;AAE1C,yCAAyC;AACzC,4CAA0C;AAC1C,oDAAkD;AAClD,8CAA4C;AAC5C,kDAAgD;AAChD,wDAAsD;AACtD,wDAAsD;AACtD,wDAAsD;AACtD,2DAAyD;AACzD,wCAAwC;AAExC,6BAAgC;AAAvB,8FAAA,OAAO,OAAA;AAGhB,iCAAuC;AAA9B,qGAAA,YAAY,OAAA","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// This is a meta-package, and these exist in to re-export *all* items from\n// the individual packages as individual _namespaces_, so wildcard exports are\n// appropriate here. Otherwise, it'd be a pain to enumerate and keep things\n// in-sync with all the upstream packages.\n\n/* eslint-disable no-restricted-syntax */\nexport * as api from '@opentelemetry/api';\nexport * as contextBase from '@opentelemetry/api';\nexport * as core from '@opentelemetry/core';\nexport * as logs from '@opentelemetry/sdk-logs';\nexport * as metrics from '@opentelemetry/sdk-metrics';\nexport * as node from '@opentelemetry/sdk-trace-node';\nexport * as resources from '@opentelemetry/resources';\nexport * as tracing from '@opentelemetry/sdk-trace-base';\n/* eslint-enable no-restricted-syntax */\n\nexport { NodeSDK } from './sdk';\nexport type { LoggerProviderConfig, MeterProviderConfig } from './sdk';\nexport type { NodeSDKConfiguration } from './types';\nexport { startNodeSDK } from './start';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,2EAA2E;AAC3E,8EAA8E;AAC9E,2EAA2E;AAC3E,0CAA0C;AAE1C,yCAAyC;AACzC,4CAA0C;AAC1C,oDAAkD;AAClD,8CAA4C;AAC5C,kDAAgD;AAChD,wDAAsD;AACtD,wDAAsD;AAEtD;;GAEG;AACH,wDAAsD;AACtD;;GAEG;AACH,2DAAyD;AACzD,wCAAwC;AAExC,6BAAgC;AAAvB,8FAAA,OAAO,OAAA;AAGhB,iCAAuC;AAA9B,qGAAA,YAAY,OAAA","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// This is a meta-package, and these exist in to re-export *all* items from\n// the individual packages as individual _namespaces_, so wildcard exports are\n// appropriate here. Otherwise, it'd be a pain to enumerate and keep things\n// in-sync with all the upstream packages.\n\n/* eslint-disable no-restricted-syntax */\nexport * as api from '@opentelemetry/api';\nexport * as contextBase from '@opentelemetry/api';\nexport * as core from '@opentelemetry/core';\nexport * as logs from '@opentelemetry/sdk-logs';\nexport * as metrics from '@opentelemetry/sdk-metrics';\nexport * as resources from '@opentelemetry/resources';\n\n/**\n * @deprecated Import directly from `@opentelemetry/sdk-trace` instead.\n */\nexport * as node from '@opentelemetry/sdk-trace-node';\n/**\n * @deprecated Import directly from `@opentelemetry/sdk-trace` instead.\n */\nexport * as tracing from '@opentelemetry/sdk-trace-base';\n/* eslint-enable no-restricted-syntax */\n\nexport { NodeSDK } from './sdk';\nexport type { LoggerProviderConfig, MeterProviderConfig } from './sdk';\nexport type { NodeSDKConfiguration } from './types';\nexport { startNodeSDK } from './start';\n"]}
@@ -36,7 +36,6 @@ export type LoggerProviderConfig = {
36
36
  * nodeSdk.start(); // registers all configured SDK components
37
37
  */
38
38
  export declare class NodeSDK {
39
- private _tracerProviderConfig?;
40
39
  private _loggerProviderConfig?;
41
40
  private _meterProviderConfig?;
42
41
  private _instrumentations;
package/build/src/sdk.js CHANGED
@@ -15,11 +15,11 @@ const exporter_logs_otlp_grpc_1 = require("@opentelemetry/exporter-logs-otlp-grp
15
15
  const exporter_logs_otlp_proto_1 = require("@opentelemetry/exporter-logs-otlp-proto");
16
16
  const exporter_prometheus_1 = require("@opentelemetry/exporter-prometheus");
17
17
  const sdk_metrics_1 = require("@opentelemetry/sdk-metrics");
18
- const sdk_trace_base_1 = require("@opentelemetry/sdk-trace-base");
19
- const sdk_trace_node_1 = require("@opentelemetry/sdk-trace-node");
18
+ const sdk_trace_1 = require("@opentelemetry/sdk-trace");
20
19
  const semantic_conventions_1 = require("@opentelemetry/semantic-conventions");
21
20
  const core_1 = require("@opentelemetry/core");
22
21
  const utils_1 = require("./utils");
22
+ const create_from_env_1 = require("./create-from-env");
23
23
  /**
24
24
  *
25
25
  * @returns MetricReader[] if appropriate environment variables are configured
@@ -72,7 +72,6 @@ function getMetricReadersFromEnv() {
72
72
  * nodeSdk.start(); // registers all configured SDK components
73
73
  */
74
74
  class NodeSDK {
75
- _tracerProviderConfig;
76
75
  _loggerProviderConfig;
77
76
  _meterProviderConfig;
78
77
  _instrumentations;
@@ -116,30 +115,8 @@ class NodeSDK {
116
115
  this._resourceDetectors = [resources_1.envDetector, resources_1.processDetector, resources_1.hostDetector];
117
116
  }
118
117
  this._serviceName = configuration.serviceName;
119
- // If a tracer provider can be created from manual configuration, create it
120
- if (configuration.traceExporter ||
121
- configuration.spanProcessor ||
122
- configuration.spanProcessors) {
123
- const tracerProviderConfig = {};
124
- if (configuration.sampler) {
125
- tracerProviderConfig.sampler = configuration.sampler;
126
- }
127
- if (configuration.spanLimits) {
128
- tracerProviderConfig.spanLimits = configuration.spanLimits;
129
- }
130
- if (configuration.idGenerator) {
131
- tracerProviderConfig.idGenerator = configuration.idGenerator;
132
- }
133
- if (configuration.spanProcessor) {
134
- api_1.diag.warn("The 'spanProcessor' option is deprecated. Please use 'spanProcessors' instead.");
135
- }
136
- const spanProcessor = configuration.spanProcessor ??
137
- new sdk_trace_base_1.BatchSpanProcessor(configuration.traceExporter);
138
- const spanProcessors = configuration.spanProcessors ?? [spanProcessor];
139
- this._tracerProviderConfig = {
140
- tracerConfig: tracerProviderConfig,
141
- spanProcessors,
142
- };
118
+ if (configuration.spanProcessor) {
119
+ api_1.diag.warn("The 'spanProcessor' option is deprecated. Please use 'spanProcessors' instead.");
143
120
  }
144
121
  if (configuration.logRecordProcessors) {
145
122
  this._loggerProviderConfig = {
@@ -223,15 +200,33 @@ class NodeSDK {
223
200
  instrumentation.setMeterProvider(api_1.metrics.getMeterProvider());
224
201
  }
225
202
  }
226
- const spanProcessors = this._tracerProviderConfig
227
- ? this._tracerProviderConfig.spanProcessors
228
- : (0, utils_1.getSpanProcessorsFromEnv)();
203
+ // Determine `spanProcessors` from multiple possible options.
204
+ let spanProcessors;
205
+ if (this._configuration?.spanProcessors) {
206
+ spanProcessors = this._configuration.spanProcessors;
207
+ }
208
+ else if (this._configuration?.spanProcessor) {
209
+ spanProcessors = [this._configuration.spanProcessor];
210
+ }
211
+ else if (this._configuration?.traceExporter) {
212
+ spanProcessors = [
213
+ (0, create_from_env_1.createBatchSpanProcessorFromEnv)(this._configuration.traceExporter, sdkMetricsEnabled ? this._meterProvider : undefined),
214
+ ];
215
+ }
216
+ else {
217
+ spanProcessors = (0, utils_1.getSpanProcessorsFromEnv)(sdkMetricsEnabled ? this._meterProvider : undefined);
218
+ }
229
219
  // Only register if there is a span processor
230
220
  if (spanProcessors.length > 0) {
231
- this._tracerProvider = new sdk_trace_node_1.NodeTracerProvider({
232
- ...this._configuration,
221
+ this._tracerProvider = new sdk_trace_1.TracerProvider({
222
+ sampler: this._configuration?.sampler ?? (0, create_from_env_1.createSamplerFromEnv)(),
223
+ spanLimits: {
224
+ ...(0, create_from_env_1.createSpanLimitsFromEnv)(),
225
+ ...this._configuration?.spanLimits,
226
+ },
233
227
  resource: this._resource,
234
228
  meterProvider: sdkMetricsEnabled ? this._meterProvider : undefined,
229
+ idGenerator: this._configuration?.idGenerator,
235
230
  spanProcessors,
236
231
  });
237
232
  api_1.trace.setGlobalTracerProvider(this._tracerProvider);
@@ -303,7 +298,7 @@ class NodeSDK {
303
298
  this._loggerProviderConfig = {
304
299
  logRecordProcessors: exporters.map(exporter => {
305
300
  if (exporter instanceof sdk_logs_1.ConsoleLogRecordExporter) {
306
- return new sdk_logs_1.SimpleLogRecordProcessor(exporter);
301
+ return new sdk_logs_1.SimpleLogRecordProcessor({ exporter });
307
302
  }
308
303
  else {
309
304
  return (0, utils_1.getBatchLogRecordProcessorFromEnv)(exporter);
@@ -1 +1 @@
1
- {"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../src/sdk.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { metrics, trace, diag, DiagConsoleLogger } from '@opentelemetry/api';\nimport { logs } from '@opentelemetry/api-logs';\nimport type { Instrumentation } from '@opentelemetry/instrumentation';\nimport { registerInstrumentations } from '@opentelemetry/instrumentation';\nimport type {\n Resource,\n ResourceDetectionConfig,\n ResourceDetector,\n} from '@opentelemetry/resources';\nimport {\n defaultResource,\n detectResources,\n envDetector,\n hostDetector,\n processDetector,\n resourceFromAttributes,\n} from '@opentelemetry/resources';\nimport type {\n LogRecordProcessor,\n LogRecordExporter,\n} from '@opentelemetry/sdk-logs';\nimport {\n LoggerProvider,\n ConsoleLogRecordExporter,\n SimpleLogRecordProcessor,\n} from '@opentelemetry/sdk-logs';\nimport { OTLPLogExporter as OTLPHttpLogExporter } from '@opentelemetry/exporter-logs-otlp-http';\nimport { OTLPLogExporter as OTLPGrpcLogExporter } from '@opentelemetry/exporter-logs-otlp-grpc';\nimport { OTLPLogExporter as OTLPProtoLogExporter } from '@opentelemetry/exporter-logs-otlp-proto';\nimport { PrometheusExporter as PrometheusMetricExporter } from '@opentelemetry/exporter-prometheus';\nimport type { IMetricReader, ViewOptions } from '@opentelemetry/sdk-metrics';\nimport {\n MeterProvider,\n ConsoleMetricExporter,\n PeriodicExportingMetricReader,\n} from '@opentelemetry/sdk-metrics';\nimport type { SpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport type { NodeTracerConfig } from '@opentelemetry/sdk-trace-node';\nimport { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';\nimport { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions';\nimport type { NodeSDKConfiguration } from './types';\nimport {\n getBooleanFromEnv,\n getStringFromEnv,\n getStringListFromEnv,\n diagLogLevelFromString,\n} from '@opentelemetry/core';\nimport {\n getResourceDetectorsFromEnv,\n getSpanProcessorsFromEnv,\n getPropagatorFromEnv,\n setupPropagator,\n setupContextManager,\n getPeriodicExportingMetricReaderFromEnv,\n getOtlpMetricExporterFromEnv,\n getBatchLogRecordProcessorFromEnv,\n getLoggerProviderConfigFromEnv,\n} from './utils';\n\ntype TracerProviderConfig = {\n tracerConfig: NodeTracerConfig;\n spanProcessors: SpanProcessor[];\n};\n\nexport type MeterProviderConfig = {\n /**\n * Reference to the MetricReader instances by the NodeSDK\n */\n readers?: IMetricReader[];\n /**\n * List of {@link ViewOptions}s that should be passed to the MeterProvider\n */\n views?: ViewOptions[];\n};\n\nexport type LoggerProviderConfig = {\n /**\n * Reference to the LoggerRecordProcessor instance by the NodeSDK\n */\n logRecordProcessors: LogRecordProcessor[];\n};\n\n/**\n *\n * @returns MetricReader[] if appropriate environment variables are configured\n */\nfunction getMetricReadersFromEnv(): IMetricReader[] {\n const metricReaders: IMetricReader[] = [];\n const enabledExporters = Array.from(\n new Set(getStringListFromEnv('OTEL_METRICS_EXPORTER') ?? [])\n );\n\n if (enabledExporters.length === 0) {\n diag.debug('OTEL_METRICS_EXPORTER is empty. Using default otlp exporter.');\n enabledExporters.push('otlp');\n }\n\n if (enabledExporters.includes('none')) {\n diag.info(\n 'OTEL_METRICS_EXPORTER contains \"none\". Metric provider will not be initialized.'\n );\n return metricReaders;\n }\n\n enabledExporters.forEach(exporter => {\n if (exporter === 'otlp') {\n metricReaders.push(\n getPeriodicExportingMetricReaderFromEnv(getOtlpMetricExporterFromEnv())\n );\n } else if (exporter === 'console') {\n metricReaders.push(\n new PeriodicExportingMetricReader({\n exporter: new ConsoleMetricExporter(),\n })\n );\n } else if (exporter === 'prometheus') {\n metricReaders.push(new PrometheusMetricExporter());\n } else {\n diag.warn(\n `Unsupported OTEL_METRICS_EXPORTER value: \"${exporter}\". Supported values are: otlp, console, prometheus, none.`\n );\n }\n });\n\n return metricReaders;\n}\n\n/**\n * A setup helper for the OpenTelemetry SDKs (logs, metrics, traces).\n * <p> After successful setup using {@link NodeSDK#start()}, use `@opentelemetry/api` to obtain the registered components.\n * <p> Use the shutdown handler {@link NodeSDK#shutdown()} to ensure your telemetry is exported before the process exits.\n *\n * @example <caption> Register SDK by using environment variables </caption>\n * const nodeSdk = new NodeSDK(); // providing no options uses OTEL_* environment variables for SDK setup.\n * nodeSdk.start(); // registers all configured SDK components\n * @example <caption> Override environment variable config with your own components </caption>\n * const nodeSdk = new NodeSDK({\n * // override the list of metric reader with your own options and ignore environment variable config\n * // explore the docs of other options to learn more!\n * metricReaders: [ new PeriodicExportingMetricReader({\n * exporter: new OTLPMetricsExporter()\n * })]\n * });\n * nodeSdk.start(); // registers all configured SDK components\n */\nexport class NodeSDK {\n private _tracerProviderConfig?: TracerProviderConfig;\n private _loggerProviderConfig?: LoggerProviderConfig;\n private _meterProviderConfig?: MeterProviderConfig;\n private _instrumentations: Instrumentation[];\n\n private _resource: Resource;\n private _resourceDetectors: Array<ResourceDetector>;\n\n private _autoDetectResources: boolean;\n\n private _tracerProvider?: NodeTracerProvider;\n private _loggerProvider?: LoggerProvider;\n private _meterProvider?: MeterProvider;\n private _serviceName?: string;\n private _configuration?: Partial<NodeSDKConfiguration>;\n\n private _disabled?: boolean;\n\n /**\n * Create a new NodeJS SDK instance\n */\n public constructor(configuration: Partial<NodeSDKConfiguration> = {}) {\n if (getBooleanFromEnv('OTEL_SDK_DISABLED')) {\n this._disabled = true;\n // Functions with possible side-effects are set\n // to no-op via the _disabled flag\n }\n\n const logLevel = getStringFromEnv('OTEL_LOG_LEVEL');\n if (logLevel != null) {\n diag.setLogger(new DiagConsoleLogger(), {\n logLevel: diagLogLevelFromString(logLevel),\n });\n }\n\n this._configuration = configuration;\n\n this._resource = configuration.resource ?? defaultResource();\n this._autoDetectResources = configuration.autoDetectResources ?? true;\n if (!this._autoDetectResources) {\n this._resourceDetectors = [];\n } else if (configuration.resourceDetectors != null) {\n this._resourceDetectors = configuration.resourceDetectors;\n } else if (getStringFromEnv('OTEL_NODE_RESOURCE_DETECTORS')) {\n this._resourceDetectors = getResourceDetectorsFromEnv();\n } else {\n this._resourceDetectors = [envDetector, processDetector, hostDetector];\n }\n\n this._serviceName = configuration.serviceName;\n\n // If a tracer provider can be created from manual configuration, create it\n if (\n configuration.traceExporter ||\n configuration.spanProcessor ||\n configuration.spanProcessors\n ) {\n const tracerProviderConfig: NodeTracerConfig = {};\n\n if (configuration.sampler) {\n tracerProviderConfig.sampler = configuration.sampler;\n }\n if (configuration.spanLimits) {\n tracerProviderConfig.spanLimits = configuration.spanLimits;\n }\n if (configuration.idGenerator) {\n tracerProviderConfig.idGenerator = configuration.idGenerator;\n }\n\n if (configuration.spanProcessor) {\n diag.warn(\n \"The 'spanProcessor' option is deprecated. Please use 'spanProcessors' instead.\"\n );\n }\n\n const spanProcessor =\n configuration.spanProcessor ??\n new BatchSpanProcessor(configuration.traceExporter!);\n\n const spanProcessors = configuration.spanProcessors ?? [spanProcessor];\n\n this._tracerProviderConfig = {\n tracerConfig: tracerProviderConfig,\n spanProcessors,\n };\n }\n\n if (configuration.logRecordProcessors) {\n this._loggerProviderConfig = {\n logRecordProcessors: configuration.logRecordProcessors,\n };\n } else if (configuration.logRecordProcessor) {\n this._loggerProviderConfig = {\n logRecordProcessors: [configuration.logRecordProcessor],\n };\n diag.warn(\n \"The 'logRecordProcessor' option is deprecated. Please use 'logRecordProcessors' instead.\"\n );\n } else {\n this.configureLoggerProviderFromEnv();\n }\n\n if (configuration.metricReaders) {\n this._meterProviderConfig = {\n readers: configuration.metricReaders,\n views: configuration.views,\n };\n } else if (configuration.metricReader) {\n this._meterProviderConfig = {\n readers: [configuration.metricReader],\n views: configuration.views,\n };\n diag.warn(\n \"The 'metricReader' option is deprecated. Please use 'metricReaders' instead.\"\n );\n } else {\n this._meterProviderConfig = {\n readers: getMetricReadersFromEnv(),\n views: configuration.views,\n };\n }\n\n this._instrumentations = configuration.instrumentations?.flat() ?? [];\n }\n\n /**\n * Call this method to construct SDK components and register them with the OpenTelemetry API.\n */\n public start(): void {\n if (this._disabled) {\n return;\n }\n\n registerInstrumentations({\n instrumentations: this._instrumentations,\n });\n\n setupContextManager(this._configuration?.contextManager);\n setupPropagator(\n this._configuration?.textMapPropagator === null\n ? null // null means don't set, so we cannot fall back to env config.\n : (this._configuration?.textMapPropagator ?? getPropagatorFromEnv())\n );\n\n if (this._autoDetectResources) {\n const internalConfig: ResourceDetectionConfig = {\n detectors: this._resourceDetectors,\n };\n\n this._resource = this._resource.merge(detectResources(internalConfig));\n }\n\n this._resource =\n this._serviceName === undefined\n ? this._resource\n : this._resource.merge(\n resourceFromAttributes({\n [ATTR_SERVICE_NAME]: this._serviceName,\n })\n );\n\n // While SDK metrics are unstable, we require an opt-in.\n // https://opentelemetry.io/docs/specs/semconv/otel/sdk-metrics/\n const sdkMetricsEnabled = getBooleanFromEnv(\n 'OTEL_NODE_EXPERIMENTAL_SDK_METRICS'\n );\n\n if (\n this._meterProviderConfig?.readers &&\n // only register if there is a reader, otherwise we waste compute/memory.\n this._meterProviderConfig.readers.length > 0\n ) {\n const meterProvider = new MeterProvider({\n resource: this._resource,\n views: this._meterProviderConfig?.views ?? [],\n readers: this._meterProviderConfig.readers,\n sdkMetricsEnabled,\n });\n\n this._meterProvider = meterProvider;\n metrics.setGlobalMeterProvider(meterProvider);\n\n // TODO: This is a workaround to fix https://github.com/open-telemetry/opentelemetry-js/issues/3609\n // If the MeterProvider is not yet registered when instrumentations are registered, all metrics are dropped.\n // This code is obsolete once https://github.com/open-telemetry/opentelemetry-js/issues/3622 is implemented.\n for (const instrumentation of this._instrumentations) {\n instrumentation.setMeterProvider(metrics.getMeterProvider());\n }\n }\n\n const spanProcessors = this._tracerProviderConfig\n ? this._tracerProviderConfig.spanProcessors\n : getSpanProcessorsFromEnv();\n\n // Only register if there is a span processor\n if (spanProcessors.length > 0) {\n this._tracerProvider = new NodeTracerProvider({\n ...this._configuration,\n resource: this._resource,\n meterProvider: sdkMetricsEnabled ? this._meterProvider : undefined,\n spanProcessors,\n });\n trace.setGlobalTracerProvider(this._tracerProvider);\n }\n\n if (this._loggerProviderConfig) {\n const loggerProvider = new LoggerProvider({\n ...getLoggerProviderConfigFromEnv(),\n resource: this._resource,\n processors: this._loggerProviderConfig.logRecordProcessors,\n meterProvider: sdkMetricsEnabled ? this._meterProvider : undefined,\n });\n\n this._loggerProvider = loggerProvider;\n\n logs.setGlobalLoggerProvider(loggerProvider);\n }\n }\n\n public shutdown(): Promise<void> {\n const promises: Promise<unknown>[] = [];\n if (this._tracerProvider) {\n promises.push(this._tracerProvider.shutdown());\n }\n if (this._loggerProvider) {\n promises.push(this._loggerProvider.shutdown());\n }\n if (this._meterProvider) {\n promises.push(this._meterProvider.shutdown());\n }\n\n return (\n Promise.all(promises)\n // return void instead of the array from Promise.all\n .then(() => {})\n );\n }\n\n private configureLoggerProviderFromEnv(): void {\n const enabledExporters = Array.from(\n new Set(getStringListFromEnv('OTEL_LOGS_EXPORTER') ?? [])\n );\n\n if (enabledExporters.length === 0) {\n diag.debug('OTEL_LOGS_EXPORTER is empty. Using default otlp exporter.');\n enabledExporters.push('otlp');\n }\n\n if (enabledExporters.includes('none')) {\n diag.info(\n 'OTEL_LOGS_EXPORTER contains \"none\". Logger provider will not be initialized.'\n );\n return;\n }\n\n const exporters: LogRecordExporter[] = [];\n\n enabledExporters.forEach(exporter => {\n if (exporter === 'otlp') {\n const protocol =\n (\n getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_PROTOCOL') ??\n getStringFromEnv('OTEL_EXPORTER_OTLP_PROTOCOL')\n )?.trim() || 'http/protobuf'; // Using || to also fall back on empty string\n\n switch (protocol) {\n case 'grpc':\n exporters.push(new OTLPGrpcLogExporter());\n break;\n case 'http/json':\n exporters.push(new OTLPHttpLogExporter());\n break;\n case 'http/protobuf':\n exporters.push(new OTLPProtoLogExporter());\n break;\n default:\n diag.warn(\n `Unsupported OTLP logs protocol: \"${protocol}\". Using http/protobuf.`\n );\n exporters.push(new OTLPProtoLogExporter());\n }\n } else if (exporter === 'console') {\n exporters.push(new ConsoleLogRecordExporter());\n } else {\n diag.warn(\n `Unsupported OTEL_LOGS_EXPORTER value: \"${exporter}\". Supported values are: otlp, console, none.`\n );\n }\n });\n\n if (exporters.length > 0) {\n this._loggerProviderConfig = {\n logRecordProcessors: exporters.map(exporter => {\n if (exporter instanceof ConsoleLogRecordExporter) {\n return new SimpleLogRecordProcessor(exporter);\n } else {\n return getBatchLogRecordProcessorFromEnv(exporter);\n }\n }),\n };\n }\n }\n}\n"]}
1
+ {"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../src/sdk.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { metrics, trace, diag, DiagConsoleLogger } from '@opentelemetry/api';\nimport { logs } from '@opentelemetry/api-logs';\nimport type { Instrumentation } from '@opentelemetry/instrumentation';\nimport { registerInstrumentations } from '@opentelemetry/instrumentation';\nimport type {\n Resource,\n ResourceDetectionConfig,\n ResourceDetector,\n} from '@opentelemetry/resources';\nimport {\n defaultResource,\n detectResources,\n envDetector,\n hostDetector,\n processDetector,\n resourceFromAttributes,\n} from '@opentelemetry/resources';\nimport type {\n LogRecordProcessor,\n LogRecordExporter,\n} from '@opentelemetry/sdk-logs';\nimport {\n LoggerProvider,\n ConsoleLogRecordExporter,\n SimpleLogRecordProcessor,\n} from '@opentelemetry/sdk-logs';\nimport { OTLPLogExporter as OTLPHttpLogExporter } from '@opentelemetry/exporter-logs-otlp-http';\nimport { OTLPLogExporter as OTLPGrpcLogExporter } from '@opentelemetry/exporter-logs-otlp-grpc';\nimport { OTLPLogExporter as OTLPProtoLogExporter } from '@opentelemetry/exporter-logs-otlp-proto';\nimport { PrometheusExporter as PrometheusMetricExporter } from '@opentelemetry/exporter-prometheus';\nimport type { IMetricReader, ViewOptions } from '@opentelemetry/sdk-metrics';\nimport {\n MeterProvider,\n ConsoleMetricExporter,\n PeriodicExportingMetricReader,\n} from '@opentelemetry/sdk-metrics';\nimport type { SpanProcessor } from '@opentelemetry/sdk-trace';\nimport { TracerProvider } from '@opentelemetry/sdk-trace';\nimport { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions';\nimport type { NodeSDKConfiguration } from './types';\nimport {\n getBooleanFromEnv,\n getStringFromEnv,\n getStringListFromEnv,\n diagLogLevelFromString,\n} from '@opentelemetry/core';\nimport {\n getResourceDetectorsFromEnv,\n getSpanProcessorsFromEnv,\n getPropagatorFromEnv,\n setupPropagator,\n setupContextManager,\n getPeriodicExportingMetricReaderFromEnv,\n getOtlpMetricExporterFromEnv,\n getBatchLogRecordProcessorFromEnv,\n getLoggerProviderConfigFromEnv,\n} from './utils';\nimport {\n createBatchSpanProcessorFromEnv,\n createSamplerFromEnv,\n createSpanLimitsFromEnv,\n} from './create-from-env';\n\nexport type MeterProviderConfig = {\n /**\n * Reference to the MetricReader instances by the NodeSDK\n */\n readers?: IMetricReader[];\n /**\n * List of {@link ViewOptions}s that should be passed to the MeterProvider\n */\n views?: ViewOptions[];\n};\n\nexport type LoggerProviderConfig = {\n /**\n * Reference to the LoggerRecordProcessor instance by the NodeSDK\n */\n logRecordProcessors: LogRecordProcessor[];\n};\n\n/**\n *\n * @returns MetricReader[] if appropriate environment variables are configured\n */\nfunction getMetricReadersFromEnv(): IMetricReader[] {\n const metricReaders: IMetricReader[] = [];\n const enabledExporters = Array.from(\n new Set(getStringListFromEnv('OTEL_METRICS_EXPORTER') ?? [])\n );\n\n if (enabledExporters.length === 0) {\n diag.debug('OTEL_METRICS_EXPORTER is empty. Using default otlp exporter.');\n enabledExporters.push('otlp');\n }\n\n if (enabledExporters.includes('none')) {\n diag.info(\n 'OTEL_METRICS_EXPORTER contains \"none\". Metric provider will not be initialized.'\n );\n return metricReaders;\n }\n\n enabledExporters.forEach(exporter => {\n if (exporter === 'otlp') {\n metricReaders.push(\n getPeriodicExportingMetricReaderFromEnv(getOtlpMetricExporterFromEnv())\n );\n } else if (exporter === 'console') {\n metricReaders.push(\n new PeriodicExportingMetricReader({\n exporter: new ConsoleMetricExporter(),\n })\n );\n } else if (exporter === 'prometheus') {\n metricReaders.push(new PrometheusMetricExporter());\n } else {\n diag.warn(\n `Unsupported OTEL_METRICS_EXPORTER value: \"${exporter}\". Supported values are: otlp, console, prometheus, none.`\n );\n }\n });\n\n return metricReaders;\n}\n\n/**\n * A setup helper for the OpenTelemetry SDKs (logs, metrics, traces).\n * <p> After successful setup using {@link NodeSDK#start()}, use `@opentelemetry/api` to obtain the registered components.\n * <p> Use the shutdown handler {@link NodeSDK#shutdown()} to ensure your telemetry is exported before the process exits.\n *\n * @example <caption> Register SDK by using environment variables </caption>\n * const nodeSdk = new NodeSDK(); // providing no options uses OTEL_* environment variables for SDK setup.\n * nodeSdk.start(); // registers all configured SDK components\n * @example <caption> Override environment variable config with your own components </caption>\n * const nodeSdk = new NodeSDK({\n * // override the list of metric reader with your own options and ignore environment variable config\n * // explore the docs of other options to learn more!\n * metricReaders: [ new PeriodicExportingMetricReader({\n * exporter: new OTLPMetricsExporter()\n * })]\n * });\n * nodeSdk.start(); // registers all configured SDK components\n */\nexport class NodeSDK {\n private _loggerProviderConfig?: LoggerProviderConfig;\n private _meterProviderConfig?: MeterProviderConfig;\n private _instrumentations: Instrumentation[];\n\n private _resource: Resource;\n private _resourceDetectors: Array<ResourceDetector>;\n\n private _autoDetectResources: boolean;\n\n private _tracerProvider?: TracerProvider;\n private _loggerProvider?: LoggerProvider;\n private _meterProvider?: MeterProvider;\n private _serviceName?: string;\n private _configuration?: Partial<NodeSDKConfiguration>;\n\n private _disabled?: boolean;\n\n /**\n * Create a new NodeJS SDK instance\n */\n public constructor(configuration: Partial<NodeSDKConfiguration> = {}) {\n if (getBooleanFromEnv('OTEL_SDK_DISABLED')) {\n this._disabled = true;\n // Functions with possible side-effects are set\n // to no-op via the _disabled flag\n }\n\n const logLevel = getStringFromEnv('OTEL_LOG_LEVEL');\n if (logLevel != null) {\n diag.setLogger(new DiagConsoleLogger(), {\n logLevel: diagLogLevelFromString(logLevel),\n });\n }\n\n this._configuration = configuration;\n\n this._resource = configuration.resource ?? defaultResource();\n this._autoDetectResources = configuration.autoDetectResources ?? true;\n if (!this._autoDetectResources) {\n this._resourceDetectors = [];\n } else if (configuration.resourceDetectors != null) {\n this._resourceDetectors = configuration.resourceDetectors;\n } else if (getStringFromEnv('OTEL_NODE_RESOURCE_DETECTORS')) {\n this._resourceDetectors = getResourceDetectorsFromEnv();\n } else {\n this._resourceDetectors = [envDetector, processDetector, hostDetector];\n }\n\n this._serviceName = configuration.serviceName;\n\n if (configuration.spanProcessor) {\n diag.warn(\n \"The 'spanProcessor' option is deprecated. Please use 'spanProcessors' instead.\"\n );\n }\n\n if (configuration.logRecordProcessors) {\n this._loggerProviderConfig = {\n logRecordProcessors: configuration.logRecordProcessors,\n };\n } else if (configuration.logRecordProcessor) {\n this._loggerProviderConfig = {\n logRecordProcessors: [configuration.logRecordProcessor],\n };\n diag.warn(\n \"The 'logRecordProcessor' option is deprecated. Please use 'logRecordProcessors' instead.\"\n );\n } else {\n this.configureLoggerProviderFromEnv();\n }\n\n if (configuration.metricReaders) {\n this._meterProviderConfig = {\n readers: configuration.metricReaders,\n views: configuration.views,\n };\n } else if (configuration.metricReader) {\n this._meterProviderConfig = {\n readers: [configuration.metricReader],\n views: configuration.views,\n };\n diag.warn(\n \"The 'metricReader' option is deprecated. Please use 'metricReaders' instead.\"\n );\n } else {\n this._meterProviderConfig = {\n readers: getMetricReadersFromEnv(),\n views: configuration.views,\n };\n }\n\n this._instrumentations = configuration.instrumentations?.flat() ?? [];\n }\n\n /**\n * Call this method to construct SDK components and register them with the OpenTelemetry API.\n */\n public start(): void {\n if (this._disabled) {\n return;\n }\n\n registerInstrumentations({\n instrumentations: this._instrumentations,\n });\n\n setupContextManager(this._configuration?.contextManager);\n setupPropagator(\n this._configuration?.textMapPropagator === null\n ? null // null means don't set, so we cannot fall back to env config.\n : (this._configuration?.textMapPropagator ?? getPropagatorFromEnv())\n );\n\n if (this._autoDetectResources) {\n const internalConfig: ResourceDetectionConfig = {\n detectors: this._resourceDetectors,\n };\n\n this._resource = this._resource.merge(detectResources(internalConfig));\n }\n\n this._resource =\n this._serviceName === undefined\n ? this._resource\n : this._resource.merge(\n resourceFromAttributes({\n [ATTR_SERVICE_NAME]: this._serviceName,\n })\n );\n\n // While SDK metrics are unstable, we require an opt-in.\n // https://opentelemetry.io/docs/specs/semconv/otel/sdk-metrics/\n const sdkMetricsEnabled = getBooleanFromEnv(\n 'OTEL_NODE_EXPERIMENTAL_SDK_METRICS'\n );\n\n if (\n this._meterProviderConfig?.readers &&\n // only register if there is a reader, otherwise we waste compute/memory.\n this._meterProviderConfig.readers.length > 0\n ) {\n const meterProvider = new MeterProvider({\n resource: this._resource,\n views: this._meterProviderConfig?.views ?? [],\n readers: this._meterProviderConfig.readers,\n sdkMetricsEnabled,\n });\n\n this._meterProvider = meterProvider;\n metrics.setGlobalMeterProvider(meterProvider);\n\n // TODO: This is a workaround to fix https://github.com/open-telemetry/opentelemetry-js/issues/3609\n // If the MeterProvider is not yet registered when instrumentations are registered, all metrics are dropped.\n // This code is obsolete once https://github.com/open-telemetry/opentelemetry-js/issues/3622 is implemented.\n for (const instrumentation of this._instrumentations) {\n instrumentation.setMeterProvider(metrics.getMeterProvider());\n }\n }\n\n // Determine `spanProcessors` from multiple possible options.\n let spanProcessors: SpanProcessor[];\n if (this._configuration?.spanProcessors) {\n spanProcessors = this._configuration.spanProcessors;\n } else if (this._configuration?.spanProcessor) {\n spanProcessors = [this._configuration.spanProcessor];\n } else if (this._configuration?.traceExporter) {\n spanProcessors = [\n createBatchSpanProcessorFromEnv(\n this._configuration.traceExporter!,\n sdkMetricsEnabled ? this._meterProvider : undefined\n ),\n ];\n } else {\n spanProcessors = getSpanProcessorsFromEnv(\n sdkMetricsEnabled ? this._meterProvider : undefined\n );\n }\n\n // Only register if there is a span processor\n if (spanProcessors.length > 0) {\n this._tracerProvider = new TracerProvider({\n sampler: this._configuration?.sampler ?? createSamplerFromEnv(),\n spanLimits: {\n ...createSpanLimitsFromEnv(),\n ...this._configuration?.spanLimits,\n },\n resource: this._resource,\n meterProvider: sdkMetricsEnabled ? this._meterProvider : undefined,\n idGenerator: this._configuration?.idGenerator,\n spanProcessors,\n });\n trace.setGlobalTracerProvider(this._tracerProvider);\n }\n\n if (this._loggerProviderConfig) {\n const loggerProvider = new LoggerProvider({\n ...getLoggerProviderConfigFromEnv(),\n resource: this._resource,\n processors: this._loggerProviderConfig.logRecordProcessors,\n meterProvider: sdkMetricsEnabled ? this._meterProvider : undefined,\n });\n\n this._loggerProvider = loggerProvider;\n\n logs.setGlobalLoggerProvider(loggerProvider);\n }\n }\n\n public shutdown(): Promise<void> {\n const promises: Promise<unknown>[] = [];\n if (this._tracerProvider) {\n promises.push(this._tracerProvider.shutdown());\n }\n if (this._loggerProvider) {\n promises.push(this._loggerProvider.shutdown());\n }\n if (this._meterProvider) {\n promises.push(this._meterProvider.shutdown());\n }\n\n return (\n Promise.all(promises)\n // return void instead of the array from Promise.all\n .then(() => {})\n );\n }\n\n private configureLoggerProviderFromEnv(): void {\n const enabledExporters = Array.from(\n new Set(getStringListFromEnv('OTEL_LOGS_EXPORTER') ?? [])\n );\n\n if (enabledExporters.length === 0) {\n diag.debug('OTEL_LOGS_EXPORTER is empty. Using default otlp exporter.');\n enabledExporters.push('otlp');\n }\n\n if (enabledExporters.includes('none')) {\n diag.info(\n 'OTEL_LOGS_EXPORTER contains \"none\". Logger provider will not be initialized.'\n );\n return;\n }\n\n const exporters: LogRecordExporter[] = [];\n\n enabledExporters.forEach(exporter => {\n if (exporter === 'otlp') {\n const protocol =\n (\n getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_PROTOCOL') ??\n getStringFromEnv('OTEL_EXPORTER_OTLP_PROTOCOL')\n )?.trim() || 'http/protobuf'; // Using || to also fall back on empty string\n\n switch (protocol) {\n case 'grpc':\n exporters.push(new OTLPGrpcLogExporter());\n break;\n case 'http/json':\n exporters.push(new OTLPHttpLogExporter());\n break;\n case 'http/protobuf':\n exporters.push(new OTLPProtoLogExporter());\n break;\n default:\n diag.warn(\n `Unsupported OTLP logs protocol: \"${protocol}\". Using http/protobuf.`\n );\n exporters.push(new OTLPProtoLogExporter());\n }\n } else if (exporter === 'console') {\n exporters.push(new ConsoleLogRecordExporter());\n } else {\n diag.warn(\n `Unsupported OTEL_LOGS_EXPORTER value: \"${exporter}\". Supported values are: otlp, console, none.`\n );\n }\n });\n\n if (exporters.length > 0) {\n this._loggerProviderConfig = {\n logRecordProcessors: exporters.map(exporter => {\n if (exporter instanceof ConsoleLogRecordExporter) {\n return new SimpleLogRecordProcessor({ exporter });\n } else {\n return getBatchLogRecordProcessorFromEnv(exporter);\n }\n }),\n };\n }\n }\n}\n"]}