diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml index 7fd2c691f50..bba8e5347f7 100644 --- a/.github/workflows/unit-test.yml +++ b/.github/workflows/unit-test.yml @@ -92,7 +92,7 @@ jobs: cache: 'npm' cache-dependency-path: | package-lock.json - node-version: 16 + node-version: 22 - name: Bootstrap run: npm ci @@ -120,7 +120,7 @@ jobs: cache: 'npm' cache-dependency-path: | package-lock.json - node-version: 16 + node-version: 22 - name: Bootstrap run: npm ci diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f378c59c12..ab75b14a059 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,19 +13,23 @@ For semantic convention package changes, see the [semconv CHANGELOG](packages/se ### :rocket: (Enhancement) +* feat(sdk-metrics): PeriodicExportingMetricReader now flushes pending tasks at shutdown [#5242](https://github.com/open-telemetry/opentelemetry-js/pull/5242) + ### :bug: (Bug Fix) * fix(sdk-trace-base): do not load OTEL_ env vars on module load, but when needed [#5224](https://github.com/open-telemetry/opentelemetry-js/pull/5224) +* fix(instrumentation-xhr, instrumentation-fetch): content length attributes no longer get removed with `ignoreNetworkEvents: true` being set [#5229](https://github.com/open-telemetry/opentelemetry-js/issues/5229) + ### :books: (Refine Doc) ### :house: (Internal) ## 1.29.0 -### :boom: Breaking Change +### :rocket: (Enhancement) -* feat(sdk-metrics): Add support for aggregation cardinality limit with a default limit of 2000. This limit can be customized via views [#5182](https://github.com/open-telemetry/opentelemetry-js/pull/5128) +* feat(sdk-metrics): Add support for aggregation cardinality limit with a default limit of 2000. This limit can be customized via views [#5128](https://github.com/open-telemetry/opentelemetry-js/pull/5128) ## 1.28.0 diff --git a/README.md b/README.md index 18741193da1..d20e12ccea2 100644 --- a/README.md +++ b/README.md @@ -147,18 +147,25 @@ All stable packages are released with the same version, and all experimental pac The below table describes which versions of each set of packages are expected to work together. | Stable Packages | Experimental Packages | -| --------------- | --------------------- | -| 1.21.x | 0.48.x | -| 1.20.x | 0.47.x | -| 1.19.x | 0.46.x | -| 1.18.x | 0.45.x | -| 1.17.x | 0.44.x | +|-----------------|-----------------------| +| 1.29.x | 0.56.x | +| 1.28.x | 0.55.x | +| 1.27.x | 0.54.x | +| 1.25.x | 0.52.x | +| 1.24.x | 0.51.x |
Older version compatibility matrix + + + + + + + diff --git a/api/test/tree-shaking/tree-shaking.test.ts b/api/test/tree-shaking/tree-shaking.test.ts index 352f6627f1d..7673eb87be3 100644 --- a/api/test/tree-shaking/tree-shaking.test.ts +++ b/api/test/tree-shaking/tree-shaking.test.ts @@ -28,7 +28,7 @@ import * as realFs from 'fs'; * Webpack doesn't run in node 8 because it requires BigInt. Since we are testing * build tooling here, we can safely skip tooling we know can't run anyway. */ -describe('tree-shaking', () => { +describe('tree-shaking', function () { const allowedAPIs = ['ContextAPI', 'DiagAPI']; const testAPIs = [ { @@ -50,7 +50,7 @@ describe('tree-shaking', () => { const outputPath = path.join(__dirname, 'output'); const outputFilename = path.join(outputPath, 'bundle.js'); - afterEach(() => { + afterEach(function () { try { mfs.unlinkSync(outputFilename); } catch { @@ -122,6 +122,6 @@ describe('tree-shaking', () => { allowedAPIs.forEach(it => matches.delete(it)); assert.deepStrictEqual(Array.from(matches), [testAPI.name]); - }); + }).timeout(5000); } }); diff --git a/experimental/CHANGELOG.md b/experimental/CHANGELOG.md index 83471e2416e..fb1383cb577 100644 --- a/experimental/CHANGELOG.md +++ b/experimental/CHANGELOG.md @@ -31,6 +31,60 @@ All notable changes to experimental packages in this project will be documented * feat(otlp-transformer)!: accept `ResourceMetrics` in serializers instead of `ResourceMetrics[]` * (user-facing): `ProtobufMetricsSerializer` now only accepts `ResourceMetrics` instead of `ResourceMetrics[]` to align with `PushMetricExporter` requirements * (user-facing): `JsonMetricsSerializer` now only accepts `ResourceMetrics` instead of `ResourceMetrics[]` to align with `PushMetricExporter` requirements +* feat(otlp-transformer)!: remove internal types and functions from public API @pichlermarc + * (user-facing): the following types and functions were intended for internal use and have been removed from exports + * `OtlpEncodingOptions` + * `IKeyValueList` + * `IKeyValue` + * `IInstrumentationScope` + * `IArrayValue` + * `LongBits` + * `IAnyValue` + * `Fixed64` + * `SpanContextEncodeFunction` + * `toLongBits` + * `OptionalSpanContextEncodeFunction` + * `getOtlpEncoder` + * `Encoder` + * `HrTimeEncodeFunction` + * `encodeAsLongBits` + * `encodeAsString` + * `hrTimeToNanos` + * `IValueAtQuantile` + * `ISummaryDataPoint` + * `ISummary` + * `ISum` + * `IScopeMetrics` + * `IResourceMetrics` + * `INumberDataPoint` + * `IHistogramDataPoint` + * `IHistogram` + * `IExponentialHistogramDataPoint` + * `IExponentialHistogram` + * `IMetric` + * `IGauge` + * `IExemplar` + * `EAggregationTemporality` + * `IExportMetricsServiceRequest` + * `IBuckets` + * `IResource` + * `IStatus` + * `EStatusCode` + * `ILink` + * `IEvent` + * `IScopeSpans` + * `ISpan` + * `IResourceSpans` + * `ESpanKind` + * `IExportTraceServiceRequest` + * `IScopeLogs` + * `IExportLogsServiceRequest` + * `IResourceLogs` + * `ILogRecord` + * `ESeverityNumber` + * `createExportTraceServiceRequest` + * `createExportMetricsServiceRequest` + * `createExportLogsServiceRequest` ### :rocket: (Enhancement) diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/node/OTLPMetricExporter.test.ts b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/node/OTLPMetricExporter.test.ts index 87569f327a3..04d3228dee5 100644 --- a/experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/node/OTLPMetricExporter.test.ts +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/node/OTLPMetricExporter.test.ts @@ -214,8 +214,9 @@ describe('OTLPMetricExporter', () => { meterProvider.getMeter('test-meter').createCounter('test-counter').add(1); // act - meterProvider.forceFlush(); - meterProvider.shutdown(); + meterProvider.forceFlush().then(() => { + return meterProvider.shutdown(); + }); }); }); }); diff --git a/experimental/packages/opentelemetry-instrumentation-fetch/src/fetch.ts b/experimental/packages/opentelemetry-instrumentation-fetch/src/fetch.ts index e5d9a84bdeb..ca19b316593 100644 --- a/experimental/packages/opentelemetry-instrumentation-fetch/src/fetch.ts +++ b/experimental/packages/opentelemetry-instrumentation-fetch/src/fetch.ts @@ -112,9 +112,11 @@ export class FetchInstrumentation extends InstrumentationBase { const events = span.events; assert.strictEqual(events.length, 0, 'number of events is wrong'); }); + + it('should still add the CONTENT_LENGTH attribute', () => { + const span: tracing.ReadableSpan = exportSpy.args[1][0][0]; + const attributes = span.attributes; + const responseContentLength = attributes[ + SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH + ] as number; + assert.strictEqual( + responseContentLength, + 30, + `attributes ${SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH} is <= 0` + ); + }); }); }); diff --git a/experimental/packages/opentelemetry-instrumentation-xml-http-request/src/xhr.ts b/experimental/packages/opentelemetry-instrumentation-xml-http-request/src/xhr.ts index 6d2eafa054c..dc0f3ea9485 100644 --- a/experimental/packages/opentelemetry-instrumentation-xml-http-request/src/xhr.ts +++ b/experimental/packages/opentelemetry-instrumentation-xml-http-request/src/xhr.ts @@ -149,9 +149,11 @@ export class XMLHttpRequestInstrumentation extends InstrumentationBase { const events = span.events; assert.strictEqual(events.length, 3, 'number of events is wrong'); }); + + it('should still add the CONTENT_LENGTH attribute', () => { + const span: tracing.ReadableSpan = exportSpy.args[1][0][0]; + const attributes = span.attributes; + const responseContentLength = attributes[ + SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH + ] as number; + assert.strictEqual( + responseContentLength, + 30, + `attributes ${SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH} is <= 0` + ); + }); }); }); diff --git a/experimental/packages/otlp-transformer/README.md b/experimental/packages/otlp-transformer/README.md index b91b6d06d71..9f592812baf 100644 --- a/experimental/packages/otlp-transformer/README.md +++ b/experimental/packages/otlp-transformer/README.md @@ -21,18 +21,41 @@ npm install @opentelemetry/api ### Serialize Traces/Metrics/Logs -This module exports functions to serialize traces, metrics and logs from the OpenTelemetry SDK into protocol buffers which can be sent over HTTP to the OpenTelemetry collector or a compatible receiver. +This module exports serializers to serialize traces, metrics and logs from the OpenTelemetry SDK into protocol buffers +or JSON which can be sent over HTTP or gRPC (protobuf-only) to the OpenTelemetry collector or a compatible receiver. ```typescript import { - createExportTraceServiceRequest, - createExportMetricsServiceRequest, - createExportLogsServiceRequest, + JsonLogsSerializer, + JsonMetricsSerializer, + JsonTraceSerializer, + ProtobufLogsSerializer, + ProtobufMetricsSerializer, + ProtobufTraceSerializer, + IExportLogsServiceResponse, + IExportMetricsServiceResponse, + IExportTraceServiceResponse, } from '@opentelemetry/otlp-transformer'; -const serializedSpans = createExportTraceServiceRequest(readableSpans); -const serializedMetrics = createExportMetricsServiceRequest(readableMetrics); -const serializedLogs = createExportLogsServiceRequest(readableLogRecords); +// serialize to JSON export requests +const serializedJsonLogs: Uint8Array = JsonLogsSerializer.serializeRequest(readableLogRecords); +const serializedJsonMetrics: Uint8Array = JsonMetricsSerializer.serializeRequest(resourceMetrics); +const serializedJsonTraces: Uint8Array = JsonTraceSerializer.serializeRequest(readableSpans); + +// serialize to Protobuf export requests +const serializedProtobufLogs: Uint8Array = ProtobufLogsSerializer.serializeRequest(readableLogRecords); +const serializedProtobufMetrics: Uint8Array = ProtobufMetricsSerializer.serializeRequest(resourceMetrics); +const serializedProtobufTraces: Uint8Array = ProtobufTraceSerializer.serializeRequest(readableSpans); + +// deserialize JSON export responses +const deserializedJsonLogResponse: IExportLogsServiceResponse = JsonLogsSerializer.deserializeResponse(jsonLogResponse); +const deserializedJsonMetricsResponse: IExportMetricsServiceResponse = JsonMetricsSerializer.deserializeResponse(jsonMetricsResponse); +const deserializedJsonTraceResponse: IExportTraceServiceResponse = JsonTraceSerializer.deserializeResponse(jsonTraceResponse); + +// deserialize Protobuf export responses +const deserializedProtobufLogResponse: IExportLogsServiceResponse = ProtobufLogsSerializer.deserializeResponse(protobufLogResponse); +const deserializedProtobufMetricsResponse: IExportMetricsServiceResponse = ProtobufMetricsSerializer.deserializeResponse(protobufMetricsResponse); +const deserializedProtobufTraceResponse: IExportTraceServiceResponse = ProtobufTraceSerializer.deserializeResponse(protobufTraceResponse); ``` ## Useful links diff --git a/experimental/packages/otlp-transformer/src/index.ts b/experimental/packages/otlp-transformer/src/index.ts index 12c1cadc870..18cc064bbcd 100644 --- a/experimental/packages/otlp-transformer/src/index.ts +++ b/experimental/packages/otlp-transformer/src/index.ts @@ -14,76 +14,19 @@ * limitations under the License. */ -export { - OtlpEncodingOptions, - IKeyValueList, - IKeyValue, - IInstrumentationScope, - IArrayValue, - LongBits, - IAnyValue, - Fixed64, -} from './common/types'; -export { - SpanContextEncodeFunction, - toLongBits, - OptionalSpanContextEncodeFunction, - getOtlpEncoder, - Encoder, - HrTimeEncodeFunction, - encodeAsLongBits, - encodeAsString, - hrTimeToNanos, -} from './common'; export { IExportMetricsPartialSuccess, - IValueAtQuantile, - ISummaryDataPoint, - ISummary, - ISum, - IScopeMetrics, - IResourceMetrics, - INumberDataPoint, - IHistogramDataPoint, - IHistogram, - IExponentialHistogramDataPoint, - IExponentialHistogram, - IMetric, - IGauge, - IExemplar, - EAggregationTemporality, - IExportMetricsServiceRequest, IExportMetricsServiceResponse, - IBuckets, } from './metrics/types'; -export { IResource } from './resource/types'; export { IExportTracePartialSuccess, - IStatus, - EStatusCode, - ILink, - IEvent, - IScopeSpans, - ISpan, - IResourceSpans, - ESpanKind, IExportTraceServiceResponse, - IExportTraceServiceRequest, } from './trace/types'; export { IExportLogsServiceResponse, - IScopeLogs, - IExportLogsServiceRequest, - IResourceLogs, - ILogRecord, IExportLogsPartialSuccess, - ESeverityNumber, } from './logs/types'; -export { createExportTraceServiceRequest } from './trace'; -export { createExportMetricsServiceRequest } from './metrics'; -export { createExportLogsServiceRequest } from './logs'; - export { ProtobufLogsSerializer, ProtobufMetricsSerializer, diff --git a/experimental/packages/otlp-transformer/src/json/serializers.ts b/experimental/packages/otlp-transformer/src/json/serializers.ts index d21070d98ce..c187d6309b9 100644 --- a/experimental/packages/otlp-transformer/src/json/serializers.ts +++ b/experimental/packages/otlp-transformer/src/json/serializers.ts @@ -59,6 +59,9 @@ export const JsonMetricsSerializer: ISerializer< }, }; +/* + * @experimental this serializer may receive breaking changes in minor versions, pin this package's version when using this constant + */ export const JsonLogsSerializer: ISerializer< ReadableLogRecord[], IExportLogsServiceResponse diff --git a/experimental/packages/otlp-transformer/src/protobuf/serializers.ts b/experimental/packages/otlp-transformer/src/protobuf/serializers.ts index ff73ab67f22..95b475695d9 100644 --- a/experimental/packages/otlp-transformer/src/protobuf/serializers.ts +++ b/experimental/packages/otlp-transformer/src/protobuf/serializers.ts @@ -54,6 +54,9 @@ const traceResponseType = root.opentelemetry.proto.collector.trace.v1 const traceRequestType = root.opentelemetry.proto.collector.trace.v1 .ExportTraceServiceRequest as ExportType; +/* + * @experimental this serializer may receive breaking changes in minor versions, pin this package's version when using this constant + */ export const ProtobufLogsSerializer: ISerializer< ReadableLogRecord[], IExportLogsServiceResponse diff --git a/experimental/packages/otlp-transformer/test/common.test.ts b/experimental/packages/otlp-transformer/test/common.test.ts index 1925ee1283f..9ab639c6029 100644 --- a/experimental/packages/otlp-transformer/test/common.test.ts +++ b/experimental/packages/otlp-transformer/test/common.test.ts @@ -15,9 +15,9 @@ */ import { hexToBinary } from '@opentelemetry/core'; -import { getOtlpEncoder } from '../src'; import { toAnyValue } from '../src/common/internal'; import * as assert from 'assert'; +import { getOtlpEncoder } from '../src/common'; const traceId = 'abcdef01234567890000000000000000'; const spanId = '12341234abcdabcd'; diff --git a/experimental/packages/otlp-transformer/test/logs.test.ts b/experimental/packages/otlp-transformer/test/logs.test.ts index b279ae75dae..b3c606d1b78 100644 --- a/experimental/packages/otlp-transformer/test/logs.test.ts +++ b/experimental/packages/otlp-transformer/test/logs.test.ts @@ -17,18 +17,14 @@ import { HrTime, TraceFlags } from '@opentelemetry/api'; import { InstrumentationScope, hexToBinary } from '@opentelemetry/core'; import { Resource } from '@opentelemetry/resources'; import * as assert from 'assert'; -import { - createExportLogsServiceRequest, - ESeverityNumber, - IExportLogsServiceRequest, - ProtobufLogsSerializer, - JsonLogsSerializer, - OtlpEncodingOptions, -} from '../src'; +import { ProtobufLogsSerializer, JsonLogsSerializer } from '../src'; import { ReadableLogRecord } from '@opentelemetry/sdk-logs'; import { SeverityNumber } from '@opentelemetry/api-logs'; import { toBase64 } from './utils'; import * as root from '../src/generated/root'; +import { OtlpEncodingOptions } from '../src/common/types'; +import { ESeverityNumber, IExportLogsServiceRequest } from '../src/logs/types'; +import { createExportLogsServiceRequest } from '../src/logs'; function createExpectedLogJson( options: OtlpEncodingOptions diff --git a/experimental/packages/otlp-transformer/test/metrics.test.ts b/experimental/packages/otlp-transformer/test/metrics.test.ts index 06d357102ef..6c8d332321e 100644 --- a/experimental/packages/otlp-transformer/test/metrics.test.ts +++ b/experimental/packages/otlp-transformer/test/metrics.test.ts @@ -26,13 +26,9 @@ import * as assert from 'assert'; import { createExportMetricsServiceRequest } from '../src/metrics'; import { EAggregationTemporality } from '../src/metrics/types'; import { hrTime, hrTimeToNanoseconds } from '@opentelemetry/core'; -import { - encodeAsString, - encodeAsLongBits, - ProtobufMetricsSerializer, - JsonMetricsSerializer, -} from '../src'; +import { ProtobufMetricsSerializer, JsonMetricsSerializer } from '../src'; import * as root from '../src/generated/root'; +import { encodeAsLongBits, encodeAsString } from '../src/common'; const START_TIME = hrTime(); const END_TIME = hrTime(); diff --git a/experimental/packages/otlp-transformer/test/trace.test.ts b/experimental/packages/otlp-transformer/test/trace.test.ts index b740430dc30..dd6354ea4d6 100644 --- a/experimental/packages/otlp-transformer/test/trace.test.ts +++ b/experimental/packages/otlp-transformer/test/trace.test.ts @@ -19,15 +19,11 @@ import { TraceState, hexToBinary } from '@opentelemetry/core'; import { Resource } from '@opentelemetry/resources'; import { ReadableSpan } from '@opentelemetry/sdk-trace-base'; import * as assert from 'assert'; -import { - OtlpEncodingOptions, - createExportTraceServiceRequest, - ESpanKind, - EStatusCode, - ProtobufTraceSerializer, - JsonTraceSerializer, -} from '../src'; +import { ProtobufTraceSerializer, JsonTraceSerializer } from '../src'; import { toBase64 } from './utils'; +import { OtlpEncodingOptions } from '../src/common/types'; +import { ESpanKind, EStatusCode } from '../src/trace/types'; +import { createExportTraceServiceRequest } from '../src/trace'; function createExpectedSpanJson(options: OtlpEncodingOptions) { const useHex = options.useHex ?? false; diff --git a/integration-tests/propagation-validation-server/package.json b/integration-tests/propagation-validation-server/package.json index 29356b81c8b..9e499debc52 100644 --- a/integration-tests/propagation-validation-server/package.json +++ b/integration-tests/propagation-validation-server/package.json @@ -17,7 +17,7 @@ "@opentelemetry/sdk-trace-base": "1.29.0", "axios": "1.7.9", "body-parser": "1.20.3", - "express": "4.20.0" + "express": "4.21.2" }, "devDependencies": { "typescript": "4.4.4" diff --git a/package-lock.json b/package-lock.json index 52b2c2a993d..4767db6ba62 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1533,7 +1533,7 @@ "@opentelemetry/sdk-trace-base": "1.29.0", "axios": "1.7.9", "body-parser": "1.20.3", - "express": "4.20.0" + "express": "4.21.2" }, "devDependencies": { "typescript": "4.4.4" @@ -1542,147 +1542,6 @@ "node": ">=14" } }, - "integration-tests/propagation-validation-server/node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "engines": { - "node": ">= 0.6" - } - }, - "integration-tests/propagation-validation-server/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "integration-tests/propagation-validation-server/node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "engines": { - "node": ">= 0.8" - } - }, - "integration-tests/propagation-validation-server/node_modules/express": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.20.0.tgz", - "integrity": "sha512-pLdae7I6QqShF5PnNTCVn4hI91Dx0Grkn2+IAsMTgMIKuQVte2dN9PeGSSAME2FR8anOhVA62QDIUaWVfEXVLw==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "integration-tests/propagation-validation-server/node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "integration-tests/propagation-validation-server/node_modules/finalhandler/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "integration-tests/propagation-validation-server/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "integration-tests/propagation-validation-server/node_modules/path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" - }, - "integration-tests/propagation-validation-server/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "integration-tests/propagation-validation-server/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "integration-tests/propagation-validation-server/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -10116,9 +9975,9 @@ } }, "node_modules/chromedriver": { - "version": "131.0.2", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-131.0.2.tgz", - "integrity": "sha512-Z3oZmleJP3UEBKCz7XLZoZSbYRnApFmUL4GGmLHxw/NJqcZpEnCNFlwdVKuRlntCPxgdfvYInQCPmZxXyrGE+w==", + "version": "131.0.3", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-131.0.3.tgz", + "integrity": "sha512-DKHFt0ilcA/RJzY1ApBiJAil6fh08f9mXM8XbdDE1u+S1V5YVUNTUi4bOtJFZoAwS9nlV0H5W6InWrpXqSs2xg==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -13070,10 +12929,9 @@ "dev": true }, "node_modules/express": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", - "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", - "dev": true, + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -13094,7 +12952,7 @@ "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", @@ -13109,13 +12967,16 @@ }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/express/node_modules/cookie": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -13124,7 +12985,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "dependencies": { "ms": "2.0.0" } @@ -13133,7 +12993,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "dev": true, "engines": { "node": ">= 0.8" } @@ -13142,7 +13001,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "dev": true, "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", @@ -13159,20 +13017,17 @@ "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", - "dev": true + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" }, "node_modules/express/node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -13188,26 +13043,10 @@ } ] }, - "node_modules/express/node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dev": true, - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/express/node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, "engines": { "node": ">= 0.8" } @@ -23863,70 +23702,23 @@ "dev": true }, "node_modules/serve-static": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.0.tgz", - "integrity": "sha512-pDLK8zwl2eKaYrs8mrPZBJua4hMplRWJ1tIFksVC3FtBEBnl8dxgeHtsaMS8DhS9i4fLObaon6ABoc4/hQGdPA==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/serve-static/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-static/node_modules/debug/node_modules/ms": { + "node_modules/serve-static/node_modules/encodeurl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/serve-static/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/serve-static/node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-static/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "engines": { "node": ">= 0.8" } @@ -28709,7 +28501,7 @@ "babel-loader": "8.4.1", "babel-polyfill": "6.26.0", "browserstack-local": "1.4.8", - "chromedriver": "131.0.2", + "chromedriver": "131.0.3", "dotenv": "16.0.0", "fast-safe-stringify": "2.1.1", "geckodriver": "3.0.1", @@ -32926,7 +32718,7 @@ "babel-loader": "8.4.1", "babel-polyfill": "6.26.0", "browserstack-local": "1.4.8", - "chromedriver": "131.0.2", + "chromedriver": "131.0.3", "dotenv": "16.0.0", "fast-safe-stringify": "2.1.1", "geckodriver": "3.0.1", @@ -36810,9 +36602,9 @@ "dev": true }, "chromedriver": { - "version": "131.0.2", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-131.0.2.tgz", - "integrity": "sha512-Z3oZmleJP3UEBKCz7XLZoZSbYRnApFmUL4GGmLHxw/NJqcZpEnCNFlwdVKuRlntCPxgdfvYInQCPmZxXyrGE+w==", + "version": "131.0.3", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-131.0.3.tgz", + "integrity": "sha512-DKHFt0ilcA/RJzY1ApBiJAil6fh08f9mXM8XbdDE1u+S1V5YVUNTUi4bOtJFZoAwS9nlV0H5W6InWrpXqSs2xg==", "dev": true, "requires": { "@testim/chrome-version": "^1.1.4", @@ -39071,10 +38863,9 @@ "dev": true }, "express": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", - "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", - "dev": true, + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -39095,7 +38886,7 @@ "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", @@ -39112,14 +38903,12 @@ "cookie": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "dev": true + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==" }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -39127,14 +38916,12 @@ "encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "dev": true + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==" }, "finalhandler": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "dev": true, "requires": { "debug": "2.6.9", "encodeurl": "~2.0.0", @@ -39148,38 +38935,22 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", - "dev": true + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dev": true, - "requires": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - } + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" } } }, @@ -46003,115 +45774,8 @@ "@opentelemetry/sdk-trace-base": "1.29.0", "axios": "1.7.9", "body-parser": "1.20.3", - "express": "4.20.0", + "express": "4.21.2", "typescript": "4.4.4" - }, - "dependencies": { - "cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==" - }, - "express": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.20.0.tgz", - "integrity": "sha512-pLdae7I6QqShF5PnNTCVn4hI91Dx0Grkn2+IAsMTgMIKuQVte2dN9PeGSSAME2FR8anOhVA62QDIUaWVfEXVLw==", - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - } - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "dependencies": { - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "requires": { - "side-channel": "^1.0.4" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" - } } }, "proto-list": { @@ -47534,60 +47198,20 @@ } }, "serve-static": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.0.tgz", - "integrity": "sha512-pDLK8zwl2eKaYrs8mrPZBJua4hMplRWJ1tIFksVC3FtBEBnl8dxgeHtsaMS8DhS9i4fLObaon6ABoc4/hQGdPA==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "requires": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + "encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==" } } }, diff --git a/packages/opentelemetry-sdk-trace-web/src/utils.ts b/packages/opentelemetry-sdk-trace-web/src/utils.ts index 5fcd9abf4ee..e8fe4ef1d69 100644 --- a/packages/opentelemetry-sdk-trace-web/src/utils.ts +++ b/packages/opentelemetry-sdk-trace-web/src/utils.ts @@ -89,28 +89,32 @@ export function addSpanNetworkEvent( } /** - * Helper function for adding network events + * Helper function for adding network events and content length attributes * @param span * @param resource + * @param ignoreNetworkEvents */ export function addSpanNetworkEvents( span: api.Span, - resource: PerformanceEntries + resource: PerformanceEntries, + ignoreNetworkEvents = false ): void { - addSpanNetworkEvent(span, PTN.FETCH_START, resource); - addSpanNetworkEvent(span, PTN.DOMAIN_LOOKUP_START, resource); - addSpanNetworkEvent(span, PTN.DOMAIN_LOOKUP_END, resource); - addSpanNetworkEvent(span, PTN.CONNECT_START, resource); - if ( - hasKey(resource as PerformanceResourceTiming, 'name') && - (resource as PerformanceResourceTiming)['name'].startsWith('https:') - ) { - addSpanNetworkEvent(span, PTN.SECURE_CONNECTION_START, resource); + if (!ignoreNetworkEvents) { + addSpanNetworkEvent(span, PTN.FETCH_START, resource); + addSpanNetworkEvent(span, PTN.DOMAIN_LOOKUP_START, resource); + addSpanNetworkEvent(span, PTN.DOMAIN_LOOKUP_END, resource); + addSpanNetworkEvent(span, PTN.CONNECT_START, resource); + if ( + hasKey(resource as PerformanceResourceTiming, 'name') && + (resource as PerformanceResourceTiming)['name'].startsWith('https:') + ) { + addSpanNetworkEvent(span, PTN.SECURE_CONNECTION_START, resource); + } + addSpanNetworkEvent(span, PTN.CONNECT_END, resource); + addSpanNetworkEvent(span, PTN.REQUEST_START, resource); + addSpanNetworkEvent(span, PTN.RESPONSE_START, resource); + addSpanNetworkEvent(span, PTN.RESPONSE_END, resource); } - addSpanNetworkEvent(span, PTN.CONNECT_END, resource); - addSpanNetworkEvent(span, PTN.REQUEST_START, resource); - addSpanNetworkEvent(span, PTN.RESPONSE_START, resource); - addSpanNetworkEvent(span, PTN.RESPONSE_END, resource); const encodedLength = resource[PTN.ENCODED_BODY_SIZE]; if (encodedLength !== undefined) { span.setAttribute(SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH, encodedLength); diff --git a/packages/opentelemetry-sdk-trace-web/test/utils.test.ts b/packages/opentelemetry-sdk-trace-web/test/utils.test.ts index b70061e489d..0011dde1485 100644 --- a/packages/opentelemetry-sdk-trace-web/test/utils.test.ts +++ b/packages/opentelemetry-sdk-trace-web/test/utils.test.ts @@ -127,6 +127,35 @@ describe('utils', () => { } as PerformanceResourceTiming); assert.strictEqual(addEventSpy.callCount, 9); }); + + it('should ignore network events when ignoreNetworkEvents is true', () => { + const addEventSpy = sinon.spy(); + const setAttributeSpy = sinon.spy(); + const span = { + addEvent: addEventSpy, + setAttribute: setAttributeSpy, + } as unknown as tracing.Span; + const entries = { + [PTN.FETCH_START]: 123, + [PTN.DOMAIN_LOOKUP_START]: 123, + [PTN.DOMAIN_LOOKUP_END]: 123, + [PTN.CONNECT_START]: 123, + [PTN.SECURE_CONNECTION_START]: 123, + [PTN.CONNECT_END]: 123, + [PTN.REQUEST_START]: 123, + [PTN.RESPONSE_START]: 123, + [PTN.RESPONSE_END]: 123, + [PTN.DECODED_BODY_SIZE]: 123, + [PTN.ENCODED_BODY_SIZE]: 61, + } as PerformanceEntries; + + assert.strictEqual(addEventSpy.callCount, 0); + + addSpanNetworkEvents(span, entries, true); + assert.strictEqual(setAttributeSpy.callCount, 2); + //secure connect start should not be added to non-https resource + assert.strictEqual(addEventSpy.callCount, 0); + }); it('should only include encoded size when content encoding is being used', () => { const addEventSpy = sinon.spy(); const setAttributeSpy = sinon.spy(); diff --git a/packages/sdk-metrics/src/MeterProvider.ts b/packages/sdk-metrics/src/MeterProvider.ts index 962d59b4290..6d5cd56fd03 100644 --- a/packages/sdk-metrics/src/MeterProvider.ts +++ b/packages/sdk-metrics/src/MeterProvider.ts @@ -122,7 +122,7 @@ export class MeterProvider implements IMeterProvider { } /** - * Flush all buffered data and shut down the MeterProvider and all registered + * Shut down the MeterProvider and all registered * MetricReaders. * * Returns a promise which is resolved when all flushes are complete. diff --git a/packages/sdk-metrics/src/export/PeriodicExportingMetricReader.ts b/packages/sdk-metrics/src/export/PeriodicExportingMetricReader.ts index 646c832aa41..6a9096652d7 100644 --- a/packages/sdk-metrics/src/export/PeriodicExportingMetricReader.ts +++ b/packages/sdk-metrics/src/export/PeriodicExportingMetricReader.ts @@ -161,7 +161,7 @@ export class PeriodicExportingMetricReader extends MetricReader { if (this._interval) { clearInterval(this._interval); } - + await this.onForceFlush(); await this._exporter.shutdown(); } } diff --git a/packages/sdk-metrics/test/MeterProvider.test.ts b/packages/sdk-metrics/test/MeterProvider.test.ts index cc534adcb1d..453945200d4 100644 --- a/packages/sdk-metrics/test/MeterProvider.test.ts +++ b/packages/sdk-metrics/test/MeterProvider.test.ts @@ -126,9 +126,9 @@ describe('MeterProvider', () => { assert.strictEqual(meter1, meter2); }); - it('get a noop meter on shutdown', () => { + it('get a noop meter on shutdown', async () => { const meterProvider = new MeterProvider(); - meterProvider.shutdown(); + await meterProvider.shutdown(); const meter = meterProvider.getMeter('meter1', '1.0.0'); // returned tracer should be no-op, not instance of Meter (from SDK) assert.ok(!(meter instanceof Meter)); diff --git a/packages/sdk-metrics/test/export/PeriodicExportingMetricReader.test.ts b/packages/sdk-metrics/test/export/PeriodicExportingMetricReader.test.ts index 9210f4622f3..1fe248cab84 100644 --- a/packages/sdk-metrics/test/export/PeriodicExportingMetricReader.test.ts +++ b/packages/sdk-metrics/test/export/PeriodicExportingMetricReader.test.ts @@ -77,9 +77,7 @@ class TestMetricExporter implements PushMetricExporter { async shutdown(): Promise { if (this._shutdown) return; - const flushPromise = this.forceFlush(); this._shutdown = true; - await flushPromise; } async forceFlush(): Promise { diff --git a/selenium-tests/package.json b/selenium-tests/package.json index 6449842fa9c..85c84c1d7bb 100644 --- a/selenium-tests/package.json +++ b/selenium-tests/package.json @@ -41,7 +41,7 @@ "babel-loader": "8.4.1", "babel-polyfill": "6.26.0", "browserstack-local": "1.4.8", - "chromedriver": "131.0.2", + "chromedriver": "131.0.3", "dotenv": "16.0.0", "fast-safe-stringify": "2.1.1", "geckodriver": "3.0.1", diff --git a/semantic-conventions/CHANGELOG.md b/semantic-conventions/CHANGELOG.md index 4bf95ff0471..92c46fb0cd1 100644 --- a/semantic-conventions/CHANGELOG.md +++ b/semantic-conventions/CHANGELOG.md @@ -13,6 +13,8 @@ All notable changes to the semantic-conventions package will be documented in th ### :books: (Refine Doc) +* docs: Document suggested usage of unstable semconv: copy relevant definitions into your code base. [#5182](https://github.com/open-telemetry/opentelemetry-js/pull/5182) @trentm + ### :house: (Internal) ## 1.28.0 diff --git a/semantic-conventions/README.md b/semantic-conventions/README.md index cf14621c06d..450bbd81275 100644 --- a/semantic-conventions/README.md +++ b/semantic-conventions/README.md @@ -18,7 +18,7 @@ This package has 2 separate entry-points: - The main entry-point, `@opentelemetry/semantic-conventions`, includes only stable semantic conventions. This entry-point follows semantic versioning 2.0: it will not include breaking changes except with a change in the major version number. - The "incubating" entry-point, `@opentelemetry/semantic-conventions/incubating`, contains unstable semantic conventions (sometimes called "experimental") and, for convenience, a re-export of the stable semantic conventions. - This entry-point is _NOT_ subject to the restrictions of semantic versioning and _MAY_ contain breaking changes in minor releases. + This entry-point is _NOT_ subject to the restrictions of semantic versioning and _MAY_ contain breaking changes in minor releases. See below for suggested usage of this entry-point. Exported constants follow this naming scheme: @@ -59,30 +59,50 @@ const span = tracer.startSpan(spanName, spanOptions) -```bash -npm install --save-exact @opentelemetry/semantic-conventions -``` +Because the "incubating" entry-point may include breaking changes in minor versions, it is recommended that instrumentation libraries **not** import `@opentelemetry/semantic-conventions/incubating` in runtime code, but instead **copy relevant definitions into their own code base**. (This is the same [recommendation](https://opentelemetry.io/docs/specs/semconv/non-normative/code-generation/#stability-and-versioning) as for other languages.) -**Note**: Because the "incubating" entry-point may include breaking changes in minor versions, it is recommended that users of unstable semconv values either: +For example, create a "src/semconv.ts" (or "lib/semconv.js" if implementing in JavaScript) file that copies from [experimental_attributes.ts](./src/experimental_attributes.ts) or [experimental_metrics.ts](./src/experimental_metrics.ts): -1. depend on a pinned (exact) version of the package (`npm install --save-exact ...`), or -2. [copy relevant definitions to their code base](https://opentelemetry.io/docs/specs/semconv/non-normative/code-generation/#stability-and-versioning). +```ts +// src/semconv.ts +export const ATTR_DB_NAMESPACE = 'db.namespace'; +export const ATTR_DB_OPERATION_NAME = 'db.operation.name'; +``` ```ts +// src/instrumentation.ts +import { + ATTR_SERVER_PORT, + ATTR_SERVER_ADDRESS, +} from '@opentelemetry/semantic-conventions'; import { - ATTR_PROCESS_COMMAND, - ATTR_PROCESS_COMMAND_ARGS, - ATTR_PROCESS_COMMAND_LINE, -} from '@opentelemetry/semantic-conventions/incubating'; + ATTR_DB_NAMESPACE, + ATTR_DB_OPERATION_NAME, +} from './semconv'; + +span.setAttributes({ + [ATTR_DB_NAMESPACE]: ..., + [ATTR_DB_OPERATION_NAME]: ..., + [ATTR_SERVER_PORT]: ..., + [ATTR_SERVER_ADDRESS]: ..., +}) +``` -const span = tracer.startSpan(spanName, spanOptions) - .setAttributes({ - [ATTR_PROCESS_COMMAND]: 'cat', - [ATTR_PROCESS_COMMAND_ARGS]: ['file1', 'file2'], - [ATTR_CONTAINER_COMMAND_LINE]: 'cat file1 file2', - }); +Occasionally, one should review changes to `@opentelemetry/semantic-conventions` to see if any used unstable conventions have changed or been stabilized. However, an update to a newer minor version of the package will never be breaking. + +#### Why not pin the version? + +A considered alternative for using unstable exports is to **pin** the version. I.e., depend on an exact version, rather than on a version range. + +```bash +npm install --save-exact @opentelemetry/semantic-conventions ``` +Then, import directly from `@opentelemetry/semantic-conventions/incubating`. +This is **not** recommended. + +In some languages having multiple versions of a package in a single application is not possible. This _is_ possible in JavaScript. The primary argument against pinning this package is that it can easily lead to many copies being installed in an application's `node_modules/...`, which can cause significant disk usage. In a disk-constrained environment, such as AWS Lambda Layers, that can be a blocker. + ## Deprecations There are two main types of deprecations in this package: @@ -153,16 +173,26 @@ See [Migrated usage](#migrated-usage) below. ### Migrated usage +If using any unstable conventions, copy the relevant definitions into your code base (e.g. to "src/semconv.ts", see [above](#unstable-semconv)): + +```ts +// src/semconv.ts +export const ATTR_DB_SYSTEM = 'db.system' as const; +export const DB_SYSTEM_VALUE_POSTGRESQL = "postgresql" as const; +``` + +then: + ```js import { ATTR_SERVICE_NAME, ATTR_HTTP_ROUTE, METRIC_HTTP_CLIENT_REQUEST_DURATION -} from '@opentelemetry/semantic-conventions'; +} from '@opentelemetry/semantic-conventions'; // stable semconv import { ATTR_DB_SYSTEM, DB_SYSTEM_VALUE_POSTGRESQL -} from '@opentelemetry/semantic-conventions/incubating'; +} from './semconv'; // unstable semconv console.log(ATTR_SERVICE_NAME); // 'service.name' console.log(ATTR_HTTP_ROUTE); // 'http.route' @@ -176,14 +206,6 @@ console.log(ATTR_DB_SYSTEM); // 'db.system' console.log(DB_SYSTEM_VALUE_POSTGRESQL); ``` -### What is "incubating"? - -The first three fields in the preceding code sample ('service.name', 'http.route', 'http.client.request.duration') are _stable_ in semantic conventions, the latter two are not. Version 1.26.0 of this package separated stable and unstable into separate module entry points: stable conventions are imported `from '@opentelemetry/semantic-conventions'` and unstable `from '@opentelemetry/semantic-conventions/incubating'`. The name "incubating" is [suggested by the Semantic Conventions](https://opentelemetry.io/docs/specs/semconv/non-normative/code-generation/#semantic-conventions-artifact-structure). - -It is recommended that if you are using exports from _incubating_, that you **pin the version** in your package.json dependencies (e.g. via `npm install --save-exact @opentelemetry/semantic-conventions`) _or_ that you copy the relevant definitions into your code base. This is because the removal of exports from the _incubating_ entry point is _not considered a breaking change_ and hence can happen in a minor version. - -Note: The _incubating_ entry point also exports all stable fields, so the above example could be changed to import all five constants `from '@opentelemetry/semantic-conventions/incubating'`. - ## Useful links - For more information on OpenTelemetry, visit:
Stable Packages Experimental Packages
1.23.x 0.50.x
1.22.x 0.49.x
1.21.x 0.48.x
1.20.x 0.47.x
1.19.x 0.46.x
1.18.x 0.45.x
1.17.x 0.43.x, 0.44.x
1.16.x 0.42.x
1.15.x 0.41.x
1.14.x 0.40.x