diff --git a/auto-merge/contrib/detectors/node/opentelemetry-resource-detector-gcp/package.json b/auto-merge/contrib/detectors/node/opentelemetry-resource-detector-gcp/package.json index 023396831..4ef37c194 100644 --- a/auto-merge/contrib/detectors/node/opentelemetry-resource-detector-gcp/package.json +++ b/auto-merge/contrib/detectors/node/opentelemetry-resource-detector-gcp/package.json @@ -45,7 +45,7 @@ "@opentelemetry/contrib-test-utils": "^0.34.1", "@types/mocha": "8.2.3", "@types/node": "18.6.5", - "@types/semver": "7.5.1", + "@types/semver": "7.5.2", "mocha": "7.2.0", "nock": "13.3.3", "nyc": "15.1.0", diff --git a/auto-merge/contrib/detectors/node/opentelemetry-resource-detector-instana/package.json b/auto-merge/contrib/detectors/node/opentelemetry-resource-detector-instana/package.json index 3bc9201ea..d7f106af3 100644 --- a/auto-merge/contrib/detectors/node/opentelemetry-resource-detector-instana/package.json +++ b/auto-merge/contrib/detectors/node/opentelemetry-resource-detector-instana/package.json @@ -44,7 +44,7 @@ "@opentelemetry/sdk-node": "^0.43.0", "@types/mocha": "8.2.3", "@types/node": "18.6.5", - "@types/semver": "7.5.1", + "@types/semver": "7.5.2", "mocha": "7.2.0", "nock": "13.3.3", "nyc": "15.1.0", diff --git a/auto-merge/contrib/packages/opentelemetry-test-utils/src/test-utils.ts b/auto-merge/contrib/packages/opentelemetry-test-utils/src/test-utils.ts index d9d7f3e2e..cfa4b66ad 100644 --- a/auto-merge/contrib/packages/opentelemetry-test-utils/src/test-utils.ts +++ b/auto-merge/contrib/packages/opentelemetry-test-utils/src/test-utils.ts @@ -60,7 +60,6 @@ export function startDocker(db: keyof typeof dockerRunCmds) { export function cleanUpDocker(db: keyof typeof dockerRunCmds) { run(`docker stop otel-${db}`); - run(`docker rm otel-${db}`); } function run(cmd: string) { @@ -68,15 +67,16 @@ function run(cmd: string) { const proc = childProcess.spawnSync(cmd, { shell: true, }); + const output = Buffer.concat( + proc.output.filter(c => c) as Buffer[] + ).toString('utf8'); if (proc.status !== 0) { console.error('Failed run command:', cmd); - console.error(proc.output); + console.error(output); } return { code: proc.status, - output: proc.output - .map(v => String.fromCharCode.apply(null, v as any)) - .join(''), + output, }; } catch (e) { console.log(e); diff --git a/auto-merge/contrib/plugins/node/instrumentation-amqplib/package.json b/auto-merge/contrib/plugins/node/instrumentation-amqplib/package.json index db0531662..15e6d1ccf 100644 --- a/auto-merge/contrib/plugins/node/instrumentation-amqplib/package.json +++ b/auto-merge/contrib/plugins/node/instrumentation-amqplib/package.json @@ -54,7 +54,7 @@ "@opentelemetry/api": "^1.3.0", "@opentelemetry/contrib-test-utils": "^0.34.1", "@types/amqplib": "^0.5.17", - "@types/lodash": "4.14.198", + "@types/lodash": "4.14.199", "@types/mocha": "8.2.3", "@types/sinon": "10.0.16", "@types/node": "18.6.5", diff --git a/auto-merge/contrib/plugins/node/instrumentation-cucumber/package.json b/auto-merge/contrib/plugins/node/instrumentation-cucumber/package.json index 1ec753a8e..2b953cd35 100644 --- a/auto-merge/contrib/plugins/node/instrumentation-cucumber/package.json +++ b/auto-merge/contrib/plugins/node/instrumentation-cucumber/package.json @@ -52,7 +52,7 @@ "@opentelemetry/sdk-trace-base": "^1.3.1", "@opentelemetry/sdk-trace-node": "^1.3.1", "@types/mocha": "7.0.2", - "@types/semver": "7.5.1", + "@types/semver": "7.5.2", "@types/shimmer": "1.0.2", "@types/sinon": "10.0.16", "mocha": "7.2.0", diff --git a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-aws-lambda/package.json b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-aws-lambda/package.json index 0f48f0df8..538ecb70c 100644 --- a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-aws-lambda/package.json +++ b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-aws-lambda/package.json @@ -63,7 +63,7 @@ "@opentelemetry/propagator-aws-xray": "^1.3.1", "@opentelemetry/resources": "^1.8.0", "@opentelemetry/semantic-conventions": "^1.0.0", - "@types/aws-lambda": "8.10.119" + "@types/aws-lambda": "8.10.122" }, "homepage": "https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-aws-lambda#readme" } diff --git a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-bunyan/package.json b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-bunyan/package.json index 7570bc63b..9286eccdf 100644 --- a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-bunyan/package.json +++ b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-bunyan/package.json @@ -65,7 +65,7 @@ }, "dependencies": { "@opentelemetry/instrumentation": "^0.43.0", - "@types/bunyan": "1.8.8" + "@types/bunyan": "1.8.9" }, "homepage": "https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-bunyan#readme" } diff --git a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-cassandra/package.json b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-cassandra/package.json index 204f2824a..f790f80c7 100644 --- a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-cassandra/package.json +++ b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-cassandra/package.json @@ -53,7 +53,7 @@ "@opentelemetry/sdk-trace-node": "^1.8.0", "@types/mocha": "7.0.2", "@types/node": "18.6.5", - "@types/semver": "7.5.1", + "@types/semver": "7.5.2", "@types/sinon": "10.0.16", "cassandra-driver": "4.6.4", "mocha": "7.2.0", diff --git a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-dns/package.json b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-dns/package.json index 994b4ae34..f1cbbe6e3 100644 --- a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-dns/package.json +++ b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-dns/package.json @@ -51,7 +51,7 @@ "@opentelemetry/sdk-trace-node": "^1.8.0", "@types/mocha": "7.0.2", "@types/node": "18.6.5", - "@types/semver": "7.5.1", + "@types/semver": "7.5.2", "@types/shimmer": "1.0.2", "@types/sinon": "10.0.16", "mocha": "7.2.0", diff --git a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-express/package.json b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-express/package.json index 8488690b4..f6510d467 100644 --- a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-express/package.json +++ b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-express/package.json @@ -68,7 +68,7 @@ "@opentelemetry/core": "^1.8.0", "@opentelemetry/instrumentation": "^0.43.0", "@opentelemetry/semantic-conventions": "^1.0.0", - "@types/express": "4.17.17" + "@types/express": "4.17.18" }, "homepage": "https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-express#readme" } diff --git a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-fastify/package.json b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-fastify/package.json index 5cd4604cf..7d2163dd0 100644 --- a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-fastify/package.json +++ b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-fastify/package.json @@ -51,7 +51,7 @@ "@opentelemetry/instrumentation-http": "0.43.0", "@opentelemetry/sdk-trace-base": "^1.8.0", "@opentelemetry/sdk-trace-node": "^1.8.0", - "@types/express": "4.17.17", + "@types/express": "4.17.18", "@types/mocha": "7.0.2", "@types/node": "18.6.5", "fastify": "4.18.0", diff --git a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-fastify/src/instrumentation.ts b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-fastify/src/instrumentation.ts index fd6aaa89c..ff7cc504a 100644 --- a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-fastify/src/instrumentation.ts +++ b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-fastify/src/instrumentation.ts @@ -116,9 +116,8 @@ export class FastifyInstrumentation extends InstrumentationBase { return original.apply(this, args); } - const spanName = `${FastifyNames.MIDDLEWARE} - ${ - original.name || ANONYMOUS_NAME - }`; + const name = original.name || pluginName || ANONYMOUS_NAME; + const spanName = `${FastifyNames.MIDDLEWARE} - ${name}`; const reply = args[1] as PluginFastifyReply; @@ -263,7 +262,7 @@ export class FastifyInstrumentation extends InstrumentationBase { const requestContext = (request as any).context || {}; const handlerName = (requestContext.handler?.name || '').substr(6); const spanName = `${FastifyNames.REQUEST_HANDLER} - ${ - handlerName || ANONYMOUS_NAME + handlerName || this.pluginName || ANONYMOUS_NAME }`; const spanAttributes: SpanAttributes = { diff --git a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-fastify/test/instrumentation.test.ts b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-fastify/test/instrumentation.test.ts index 8180eeb04..b5869f434 100644 --- a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-fastify/test/instrumentation.test.ts +++ b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-fastify/test/instrumentation.test.ts @@ -27,7 +27,6 @@ import { import { Span } from '@opentelemetry/api'; import * as http from 'http'; import { HttpInstrumentation } from '@opentelemetry/instrumentation-http'; -import { ANONYMOUS_NAME } from '../src/instrumentation'; import { AttributeNames, FastifyInstrumentation } from '../src'; import { FastifyRequestInfo } from '../src/types'; @@ -152,7 +151,10 @@ describe('fastify', () => { 'plugin.name': 'fastify -> @fastify/express', [SemanticAttributes.HTTP_ROUTE]: '/test', }); - assert.strictEqual(span.name, `request handler - ${ANONYMOUS_NAME}`); + assert.strictEqual( + span.name, + 'request handler - fastify -> @fastify/express' + ); const baseSpan = spans[1]; assert.strictEqual(span.parentSpanId, baseSpan.spanContext().spanId); }); @@ -290,7 +292,7 @@ describe('fastify', () => { assert.strictEqual(spans.length, 6); const baseSpan = spans[1]; const span = spans[2]; - assert.strictEqual(span.name, `middleware - ${ANONYMOUS_NAME}`); + assert.strictEqual(span.name, 'middleware - subsystem'); assert.deepStrictEqual(span.attributes, { 'fastify.type': 'middleware', 'plugin.name': 'subsystem', @@ -307,7 +309,7 @@ describe('fastify', () => { assert.strictEqual(spans.length, 6); const span = spans[3]; - assert.strictEqual(span.name, 'request handler - anonymous'); + assert.strictEqual(span.name, 'request handler - subsystem'); assert.deepStrictEqual(span.status, { code: SpanStatusCode.ERROR, message: 'foo', diff --git a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-generic-pool/package.json b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-generic-pool/package.json index 15fc0c6f8..852916990 100644 --- a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-generic-pool/package.json +++ b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-generic-pool/package.json @@ -52,7 +52,7 @@ "@types/generic-pool": "^3.1.9", "@types/mocha": "7.0.2", "@types/node": "18.6.5", - "@types/semver": "7.5.1", + "@types/semver": "7.5.2", "generic-pool": "3.8.2", "mocha": "7.2.0", "nyc": "15.1.0", diff --git a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-koa/package.json b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-koa/package.json index 641986de7..78be7fb99 100644 --- a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-koa/package.json +++ b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-koa/package.json @@ -70,8 +70,8 @@ "@opentelemetry/core": "^1.8.0", "@opentelemetry/instrumentation": "^0.43.0", "@opentelemetry/semantic-conventions": "^1.0.0", - "@types/koa": "2.13.8", - "@types/koa__router": "8.0.11" + "@types/koa": "2.13.9", + "@types/koa__router": "12.0.1" }, "homepage": "https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-koa#readme" } diff --git a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-koa/src/instrumentation.ts b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-koa/src/instrumentation.ts index df359e9c3..9e38ea261 100644 --- a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-koa/src/instrumentation.ts +++ b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-koa/src/instrumentation.ts @@ -23,16 +23,15 @@ import { } from '@opentelemetry/instrumentation'; import type * as koa from 'koa'; -import { - KoaMiddleware, - KoaContext, - KoaLayerType, - KoaInstrumentationConfig, -} from './types'; +import { KoaContext, KoaLayerType, KoaInstrumentationConfig } from './types'; import { VERSION } from './version'; import { getMiddlewareMetadata, isLayerIgnored } from './utils'; import { getRPCMetadata, RPCType } from '@opentelemetry/core'; -import { kLayerPatched, KoaPatchedMiddleware } from './internal-types'; +import { + kLayerPatched, + KoaMiddleware, + KoaPatchedMiddleware, +} from './internal-types'; /** Koa instrumentation for OpenTelemetry */ export class KoaInstrumentation extends InstrumentationBase { diff --git a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-koa/src/internal-types.ts b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-koa/src/internal-types.ts index 05557e938..58c7bcf5a 100644 --- a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-koa/src/internal-types.ts +++ b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-koa/src/internal-types.ts @@ -13,7 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { KoaMiddleware } from './types'; +import type { Middleware, DefaultState } from 'koa'; +import { KoaContext } from './types'; +import type * as Router from '@koa/router'; + +export type KoaMiddleware = Middleware & { + router?: Router; +}; /** * This symbol is used to mark a Koa layer as being already instrumented diff --git a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-koa/src/types.ts b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-koa/src/types.ts index 83e59389c..3c249e3a6 100644 --- a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-koa/src/types.ts +++ b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-koa/src/types.ts @@ -15,7 +15,6 @@ */ import type { Middleware, ParameterizedContext, DefaultState } from 'koa'; import type { RouterParamContext } from '@koa/router'; -import type * as Router from '@koa/router'; import { Span } from '@opentelemetry/api'; import { InstrumentationConfig } from '@opentelemetry/instrumentation'; @@ -26,10 +25,6 @@ export enum KoaLayerType { export type KoaContext = ParameterizedContext; -export type KoaMiddleware = Middleware & { - router?: Router; -}; - export type KoaRequestInfo = { context: KoaContext; middlewareLayer: Middleware; diff --git a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-koa/src/utils.ts b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-koa/src/utils.ts index e1d92d8ab..6de3e1f3e 100644 --- a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-koa/src/utils.ts +++ b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-koa/src/utils.ts @@ -13,12 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { - KoaContext, - KoaMiddleware, - KoaLayerType, - KoaInstrumentationConfig, -} from './types'; +import { KoaContext, KoaLayerType, KoaInstrumentationConfig } from './types'; +import { KoaMiddleware } from './internal-types'; import { AttributeNames } from './enums/AttributeNames'; import { SpanAttributes } from '@opentelemetry/api'; import { SemanticAttributes } from '@opentelemetry/semantic-conventions'; diff --git a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-mysql2/package.json b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-mysql2/package.json index 5c5507e31..40c3ce773 100644 --- a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-mysql2/package.json +++ b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-mysql2/package.json @@ -54,7 +54,7 @@ "@types/mocha": "7.0.2", "@types/mysql2": "github:types/mysql2", "@types/node": "18.6.5", - "@types/semver": "7.5.1", + "@types/semver": "7.5.2", "mocha": "7.2.0", "mysql2": "2.3.3", "nyc": "15.1.0", diff --git a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-nestjs-core/package.json b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-nestjs-core/package.json index 8556f86cb..219d5d72b 100644 --- a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-nestjs-core/package.json +++ b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-nestjs-core/package.json @@ -59,7 +59,7 @@ "@opentelemetry/sdk-trace-node": "^1.8.0", "@types/mocha": "7.0.2", "@types/node": "18.6.5", - "@types/semver": "7.5.1", + "@types/semver": "7.5.2", "cross-env": "7.0.3", "mocha": "7.2.0", "nyc": "15.1.0", diff --git a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-nestjs-core/src/instrumentation.ts b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-nestjs-core/src/instrumentation.ts index 30d2dc4f7..98922126f 100644 --- a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-nestjs-core/src/instrumentation.ts +++ b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-nestjs-core/src/instrumentation.ts @@ -188,7 +188,8 @@ function createWrapCreateHandler(tracer: api.Tracer, moduleVersion?: string) { [AttributeNames.TYPE]: NestType.REQUEST_CONTEXT, [SemanticAttributes.HTTP_METHOD]: req.method, [SemanticAttributes.HTTP_URL]: req.originalUrl || req.url, - [SemanticAttributes.HTTP_ROUTE]: req.route?.path || req.routerPath, + [SemanticAttributes.HTTP_ROUTE]: + req.route?.path || req.routeOptions?.url || req.routerPath, [AttributeNames.CONTROLLER]: instanceName, [AttributeNames.CALLBACK]: callbackName, }, diff --git a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-pg/package.json b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-pg/package.json index 869444856..7a1b3efb2 100644 --- a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-pg/package.json +++ b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-pg/package.json @@ -79,7 +79,7 @@ "@opentelemetry/semantic-conventions": "^1.0.0", "@opentelemetry/sql-common": "^0.40.0", "@types/pg": "8.6.1", - "@types/pg-pool": "2.0.3" + "@types/pg-pool": "2.0.4" }, "homepage": "https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-pg#readme" } diff --git a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-pino/package.json b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-pino/package.json index a4df54841..b1dc8c25e 100644 --- a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-pino/package.json +++ b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-pino/package.json @@ -53,7 +53,7 @@ "@opentelemetry/sdk-trace-node": "^1.8.0", "@types/mocha": "7.0.2", "@types/node": "18.6.5", - "@types/semver": "7.5.1", + "@types/semver": "7.5.2", "@types/sinon": "10.0.16", "mocha": "7.2.0", "nyc": "15.1.0", diff --git a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-restify/package.json b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-restify/package.json index c9736e913..0ae9310eb 100644 --- a/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-restify/package.json +++ b/auto-merge/contrib/plugins/node/opentelemetry-instrumentation-restify/package.json @@ -53,7 +53,7 @@ "@types/mocha": "7.0.2", "@types/node": "18.6.5", "@types/restify": "4.3.9", - "@types/semver": "7.5.1", + "@types/semver": "7.5.2", "mocha": "7.2.0", "nyc": "15.1.0", "restify": "11.1.0", diff --git a/auto-merge/js/CHANGELOG.md b/auto-merge/js/CHANGELOG.md index 53987c416..d65dae2bd 100644 --- a/auto-merge/js/CHANGELOG.md +++ b/auto-merge/js/CHANGELOG.md @@ -13,6 +13,12 @@ For experimental package changes, see the [experimental CHANGELOG](experimental/ ### :bug: (Bug Fix) +* fix(sdk-metrics): allow instrument names to contain '/' [#4155](https://github.com/open-telemetry/opentelemetry-js/pull/4155) +* fix(sdk-metrics): do not report empty scopes and metrics [#4135](https://github.com/open-telemetry/opentelemetry-js/pull/4135) @pichlermarc + * Instruments that were created, but did not have measurements will not be exported anymore + * Meters (Scopes) that were created, but did not have any instruments with measurements under them will not be exported anymore. +* fix(exporter-zipkin): round duration to the nearest int in annotations to be compliant with zipkin protocol [#4167](https://github.com/open-telemetry/opentelemetry-js/pull/4167) @FelipeEmerim + ### :books: (Refine Doc) ### :house: (Internal) diff --git a/auto-merge/js/experimental/CHANGELOG.md b/auto-merge/js/experimental/CHANGELOG.md index 24f36df11..72f028957 100644 --- a/auto-merge/js/experimental/CHANGELOG.md +++ b/auto-merge/js/experimental/CHANGELOG.md @@ -12,6 +12,7 @@ All notable changes to experimental packages in this project will be documented * fix(sdk-node): remove explicit dependency on @opentelemetry/exporter-jaeger * '@opentelemetry/exporter-jaeger' is no longer be a dependency of this package. To continue using '@opentelemetry/exporter-jaeger', please install it manually. * NOTE: `@opentelemetry/exporter-jaeger` is deprecated, consider switching to one of the alternatives described [here](https://www.npmjs.com/package/@opentelemetry/exporter-jaeger) +* fix(sdk-logs): hide internal methods with internal shared state [#3865](https://github.com/open-telemetry/opentelemetry-js/pull/3865) @legendecas ### :rocket: (Enhancement) @@ -20,6 +21,8 @@ All notable changes to experimental packages in this project will be documented ### :bug: (Bug Fix) +* fix(otlp-exporter-base): replaced usage of window with _globalThis [#4157](https://github.com/open-telemetry/opentelemetry-js/pull/4157) @cristianmadularu + ### :books: (Refine Doc) ### :house: (Internal) @@ -53,6 +56,7 @@ All notable changes to experimental packages in this project will be documented ### :bug: (Bug Fix) +* fix(otlp-transformer): Avoid precision loss when converting from HrTime to unix nanoseconds. [#4062](https://github.com/open-telemetry/opentelemetry-js/pull/4062) * fix(exporter-logs-otlp-http): add @opentelemetry/api-logs as dependency ## 0.41.2 diff --git a/auto-merge/js/experimental/packages/exporter-logs-otlp-grpc/package.json b/auto-merge/js/experimental/packages/exporter-logs-otlp-grpc/package.json index 82146ce43..eb79af287 100644 --- a/auto-merge/js/experimental/packages/exporter-logs-otlp-grpc/package.json +++ b/auto-merge/js/experimental/packages/exporter-logs-otlp-grpc/package.json @@ -54,9 +54,9 @@ "@opentelemetry/api-logs": "0.43.0", "@opentelemetry/otlp-exporter-base": "0.43.0", "@opentelemetry/resources": "1.17.0", - "@types/mocha": "10.0.1", + "@types/mocha": "10.0.2", "@types/node": "18.6.5", - "@types/sinon": "10.0.16", + "@types/sinon": "10.0.17", "codecov": "3.8.3", "cpx": "1.5.0", "cross-var": "1.1.0", diff --git a/auto-merge/js/experimental/packages/exporter-logs-otlp-grpc/test/logsHelper.ts b/auto-merge/js/experimental/packages/exporter-logs-otlp-grpc/test/logsHelper.ts index 1dfd82675..633d1a783 100644 --- a/auto-merge/js/experimental/packages/exporter-logs-otlp-grpc/test/logsHelper.ts +++ b/auto-merge/js/experimental/packages/exporter-logs-otlp-grpc/test/logsHelper.ts @@ -88,7 +88,7 @@ export function ensureExportedLogRecordIsCorrect(logRecord: ILogRecord) { ensureExportedAttributesAreCorrect(logRecord.attributes); assert.strictEqual( logRecord.timeUnixNano, - '1680253513123241728', + '1680253513123241635', 'timeUnixNano is wrong' ); assert.strictEqual( diff --git a/auto-merge/js/experimental/packages/exporter-trace-otlp-grpc/package.json b/auto-merge/js/experimental/packages/exporter-trace-otlp-grpc/package.json index 80c2ea3a0..4fb4e0ae1 100644 --- a/auto-merge/js/experimental/packages/exporter-trace-otlp-grpc/package.json +++ b/auto-merge/js/experimental/packages/exporter-trace-otlp-grpc/package.json @@ -51,9 +51,9 @@ "@grpc/proto-loader": "^0.7.3", "@opentelemetry/api": "1.6.0", "@opentelemetry/otlp-exporter-base": "0.43.0", - "@types/mocha": "10.0.1", + "@types/mocha": "10.0.2", "@types/node": "18.6.5", - "@types/sinon": "10.0.16", + "@types/sinon": "10.0.17", "codecov": "3.8.3", "cpx": "1.5.0", "cross-var": "1.1.0", diff --git a/auto-merge/js/experimental/packages/exporter-trace-otlp-grpc/test/traceHelper.ts b/auto-merge/js/experimental/packages/exporter-trace-otlp-grpc/test/traceHelper.ts index 6ce80bf2c..62157741a 100644 --- a/auto-merge/js/experimental/packages/exporter-trace-otlp-grpc/test/traceHelper.ts +++ b/auto-merge/js/experimental/packages/exporter-trace-otlp-grpc/test/traceHelper.ts @@ -114,49 +114,49 @@ export function ensureExportedEventsAreCorrect(events: IEvent[]) { [ { attributes: [], - timeUnixNano: '1574120165429803008', + timeUnixNano: '1574120165429803070', name: 'fetchStart', droppedAttributesCount: 0, }, { attributes: [], - timeUnixNano: '1574120165429803008', + timeUnixNano: '1574120165429803070', name: 'domainLookupStart', droppedAttributesCount: 0, }, { attributes: [], - timeUnixNano: '1574120165429803008', + timeUnixNano: '1574120165429803070', name: 'domainLookupEnd', droppedAttributesCount: 0, }, { attributes: [], - timeUnixNano: '1574120165429803008', + timeUnixNano: '1574120165429803070', name: 'connectStart', droppedAttributesCount: 0, }, { attributes: [], - timeUnixNano: '1574120165429803008', + timeUnixNano: '1574120165429803070', name: 'connectEnd', droppedAttributesCount: 0, }, { attributes: [], - timeUnixNano: '1574120165435513088', + timeUnixNano: '1574120165435513070', name: 'requestStart', droppedAttributesCount: 0, }, { attributes: [], - timeUnixNano: '1574120165436923136', + timeUnixNano: '1574120165436923070', name: 'responseStart', droppedAttributesCount: 0, }, { attributes: [], - timeUnixNano: '1574120165438688000', + timeUnixNano: '1574120165438688070', name: 'responseEnd', droppedAttributesCount: 0, }, @@ -235,12 +235,12 @@ export function ensureExportedSpanIsCorrect(span: ISpan) { assert.strictEqual(span.kind, 'SPAN_KIND_INTERNAL', 'kind is wrong'); assert.strictEqual( span.startTimeUnixNano, - '1574120165429803008', + '1574120165429803070', 'startTimeUnixNano is wrong' ); assert.strictEqual( span.endTimeUnixNano, - '1574120165438688000', + '1574120165438688070', 'endTimeUnixNano is wrong' ); assert.strictEqual( diff --git a/auto-merge/js/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/package.json b/auto-merge/js/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/package.json index 3c316d301..1a6550dc6 100644 --- a/auto-merge/js/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/package.json +++ b/auto-merge/js/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/package.json @@ -50,9 +50,9 @@ "@babel/core": "7.22.20", "@grpc/proto-loader": "^0.7.3", "@opentelemetry/api": "1.6.0", - "@types/mocha": "10.0.1", + "@types/mocha": "10.0.2", "@types/node": "18.6.5", - "@types/sinon": "10.0.16", + "@types/sinon": "10.0.17", "codecov": "3.8.3", "cpx": "1.5.0", "cross-var": "1.1.0", diff --git a/auto-merge/js/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/OTLPMetricExporter.test.ts b/auto-merge/js/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/OTLPMetricExporter.test.ts index a85d2f342..1df8e0cc1 100644 --- a/auto-merge/js/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/OTLPMetricExporter.test.ts +++ b/auto-merge/js/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/OTLPMetricExporter.test.ts @@ -253,18 +253,23 @@ const testOTLPMetricExporter = (params: TestParams) => { exportedData[0].scopeMetrics[0].metrics[histogramIndex]; ensureExportedCounterIsCorrect( counter, - counter.sum?.dataPoints[0].timeUnixNano, - counter.sum?.dataPoints[0].startTimeUnixNano + metrics.scopeMetrics[0].metrics[counterIndex].dataPoints[0].endTime, + metrics.scopeMetrics[0].metrics[counterIndex].dataPoints[0] + .startTime ); ensureExportedObservableGaugeIsCorrect( observableGauge, - observableGauge.gauge?.dataPoints[0].timeUnixNano, - observableGauge.gauge?.dataPoints[0].startTimeUnixNano + metrics.scopeMetrics[0].metrics[observableIndex].dataPoints[0] + .endTime, + metrics.scopeMetrics[0].metrics[observableIndex].dataPoints[0] + .startTime ); ensureExportedHistogramIsCorrect( histogram, - histogram.histogram?.dataPoints[0].timeUnixNano, - histogram.histogram?.dataPoints[0].startTimeUnixNano, + metrics.scopeMetrics[0].metrics[histogramIndex].dataPoints[0] + .endTime, + metrics.scopeMetrics[0].metrics[histogramIndex].dataPoints[0] + .startTime, [0, 100], ['0', '2', '0'] ); diff --git a/auto-merge/js/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/metricsHelper.ts b/auto-merge/js/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/metricsHelper.ts index 4713e7aa3..e6332ff36 100644 --- a/auto-merge/js/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/metricsHelper.ts +++ b/auto-merge/js/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/metricsHelper.ts @@ -17,6 +17,7 @@ import { Counter, Histogram, + HrTime, ObservableGauge, ObservableResult, ValueType, @@ -31,7 +32,13 @@ import { MetricReader, View, } from '@opentelemetry/sdk-metrics'; -import { IKeyValue, IMetric, IResource } from '@opentelemetry/otlp-transformer'; +import { + hrTimeToFixed64Nanos, + IKeyValue, + IMetric, + IResource, + UnsignedLong, +} from '@opentelemetry/otlp-transformer'; class TestMetricReader extends MetricReader { protected onForceFlush(): Promise { @@ -125,92 +132,99 @@ export function ensureExportedAttributesAreCorrect(attributes: IKeyValue[]) { export function ensureExportedCounterIsCorrect( metric: IMetric, - time?: number, - startTime?: number + time: HrTime, + startTime: HrTime ) { - assert.deepStrictEqual(metric, { - name: 'int-counter', - description: 'sample counter description', - unit: '', - data: 'sum', - sum: { - dataPoints: [ - { - attributes: [], - exemplars: [], - value: 'asInt', - asInt: '1', - flags: 0, - startTimeUnixNano: String(startTime), - timeUnixNano: String(time), - }, - ], - isMonotonic: true, - aggregationTemporality: 'AGGREGATION_TEMPORALITY_CUMULATIVE', - }, - }); + assert.strictEqual(metric.name, 'int-counter'); + assert.strictEqual(metric.description, 'sample counter description'); + assert.strictEqual(metric.unit, ''); + assert.strictEqual(metric.sum?.dataPoints.length, 1); + assert.strictEqual( + metric.sum?.aggregationTemporality, + 'AGGREGATION_TEMPORALITY_CUMULATIVE' + ); + assert.strictEqual(metric.sum?.isMonotonic, true); + + const [dp] = metric.sum.dataPoints; + + assert.deepStrictEqual(dp.attributes, []); + assert.deepStrictEqual(dp.exemplars, []); + assert.strictEqual(dp.asInt, '1'); + assert.strictEqual(dp.flags, 0); + + assert.deepStrictEqual( + UnsignedLong.fromString(dp.startTimeUnixNano as string), + hrTimeToFixed64Nanos(startTime) + ); + assert.deepStrictEqual( + UnsignedLong.fromString(dp.timeUnixNano as string), + hrTimeToFixed64Nanos(time) + ); } export function ensureExportedObservableGaugeIsCorrect( metric: IMetric, - time?: number, - startTime?: number + time: HrTime, + startTime: HrTime ) { - assert.deepStrictEqual(metric, { - name: 'double-observable-gauge', - description: 'sample observable gauge description', - unit: '', - data: 'gauge', - gauge: { - dataPoints: [ - { - attributes: [], - exemplars: [], - value: 'asDouble', - asDouble: 6, - flags: 0, - startTimeUnixNano: String(startTime), - timeUnixNano: String(time), - }, - ], - }, - }); + assert.strictEqual(metric.name, 'double-observable-gauge'); + assert.strictEqual(metric.description, 'sample observable gauge description'); + assert.strictEqual(metric.unit, ''); + assert.strictEqual(metric.gauge?.dataPoints.length, 1); + + const [dp] = metric.gauge.dataPoints; + + assert.deepStrictEqual(dp.attributes, []); + assert.deepStrictEqual(dp.exemplars, []); + assert.strictEqual(dp.asDouble, 6); + assert.strictEqual(dp.flags, 0); + + assert.deepStrictEqual( + UnsignedLong.fromString(dp.startTimeUnixNano as string), + hrTimeToFixed64Nanos(startTime) + ); + assert.deepStrictEqual( + UnsignedLong.fromString(dp.timeUnixNano as string), + hrTimeToFixed64Nanos(time) + ); } export function ensureExportedHistogramIsCorrect( metric: IMetric, - time?: number, - startTime?: number, + time: HrTime, + startTime: HrTime, explicitBounds: number[] = [Infinity], bucketCounts: string[] = ['2', '0'] ) { - assert.deepStrictEqual(metric, { - name: 'int-histogram', - description: 'sample histogram description', - unit: '', - data: 'histogram', - histogram: { - dataPoints: [ - { - attributes: [], - exemplars: [], - flags: 0, - _sum: 'sum', - _min: 'min', - _max: 'max', - sum: 21, - count: '2', - min: 7, - max: 14, - startTimeUnixNano: String(startTime), - timeUnixNano: String(time), - bucketCounts, - explicitBounds, - }, - ], - aggregationTemporality: 'AGGREGATION_TEMPORALITY_CUMULATIVE', - }, - }); + assert.strictEqual(metric.name, 'int-histogram'); + assert.strictEqual(metric.description, 'sample histogram description'); + assert.strictEqual(metric.unit, ''); + assert.strictEqual(metric.histogram?.dataPoints.length, 1); + assert.strictEqual( + metric.histogram?.aggregationTemporality, + 'AGGREGATION_TEMPORALITY_CUMULATIVE' + ); + + const [dp] = metric.histogram.dataPoints; + + assert.deepStrictEqual(dp.attributes, []); + assert.deepStrictEqual(dp.exemplars, []); + assert.strictEqual(dp.flags, 0); + assert.strictEqual(dp.sum, 21); + assert.strictEqual(dp.count, '2'); + assert.strictEqual(dp.min, 7); + assert.strictEqual(dp.max, 14); + + assert.deepStrictEqual( + UnsignedLong.fromString(dp.startTimeUnixNano as string), + hrTimeToFixed64Nanos(startTime) + ); + assert.deepStrictEqual( + UnsignedLong.fromString(dp.timeUnixNano as string), + hrTimeToFixed64Nanos(time) + ); + assert.deepStrictEqual(dp.bucketCounts, bucketCounts); + assert.deepStrictEqual(dp.explicitBounds, explicitBounds); } export function ensureResourceIsCorrect(resource: IResource) { diff --git a/auto-merge/js/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/package.json b/auto-merge/js/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/package.json index 52ce8df0a..12defa7e8 100644 --- a/auto-merge/js/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/package.json +++ b/auto-merge/js/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/package.json @@ -57,9 +57,9 @@ "devDependencies": { "@babel/core": "7.22.20", "@opentelemetry/api": "1.6.0", - "@types/mocha": "10.0.1", + "@types/mocha": "10.0.2", "@types/node": "18.6.5", - "@types/sinon": "10.0.16", + "@types/sinon": "10.0.17", "codecov": "3.8.3", "cpx": "1.5.0", "cross-var": "1.1.0", diff --git a/auto-merge/js/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/test/OTLPMetricExporter.test.ts b/auto-merge/js/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/test/OTLPMetricExporter.test.ts index 4d4856481..80902daea 100644 --- a/auto-merge/js/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/test/OTLPMetricExporter.test.ts +++ b/auto-merge/js/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/test/OTLPMetricExporter.test.ts @@ -45,7 +45,6 @@ import { } from '@opentelemetry/exporter-metrics-otlp-http'; import { Stream, PassThrough } from 'stream'; import { OTLPExporterNodeConfigBase } from '@opentelemetry/otlp-exporter-base'; -import { IExportMetricsServiceRequest } from '@opentelemetry/otlp-transformer'; import { VERSION } from '../src/version'; let fakeRequest: PassThrough; @@ -260,7 +259,7 @@ describe('OTLPMetricExporter - node with proto over http', () => { ServiceClientType.METRICS ); const data = ExportTraceServiceRequestProto.decode(buff); - const json = data?.toJSON() as IExportMetricsServiceRequest; + const json = data?.toJSON() as any; // The order of the metrics is not guaranteed. const counterIndex = metrics.scopeMetrics[0].metrics.findIndex( @@ -283,8 +282,8 @@ describe('OTLPMetricExporter - node with proto over http', () => { assert.ok(typeof metric1 !== 'undefined', "counter doesn't exist"); ensureExportedCounterIsCorrect( metric1, - metric1.sum?.dataPoints[0].timeUnixNano, - metric1.sum?.dataPoints[0].startTimeUnixNano + metrics.scopeMetrics[0].metrics[counterIndex].dataPoints[0].endTime, + metrics.scopeMetrics[0].metrics[counterIndex].dataPoints[0].startTime ); assert.ok( typeof metric2 !== 'undefined', @@ -292,8 +291,10 @@ describe('OTLPMetricExporter - node with proto over http', () => { ); ensureExportedObservableGaugeIsCorrect( metric2, - metric2.gauge?.dataPoints[0].timeUnixNano, - metric2.gauge?.dataPoints[0].startTimeUnixNano + metrics.scopeMetrics[0].metrics[observableIndex].dataPoints[0] + .endTime, + metrics.scopeMetrics[0].metrics[observableIndex].dataPoints[0] + .startTime ); assert.ok( typeof metric3 !== 'undefined', @@ -301,8 +302,9 @@ describe('OTLPMetricExporter - node with proto over http', () => { ); ensureExportedHistogramIsCorrect( metric3, - metric3.histogram?.dataPoints[0].timeUnixNano, - metric3.histogram?.dataPoints[0].startTimeUnixNano, + metrics.scopeMetrics[0].metrics[histogramIndex].dataPoints[0].endTime, + metrics.scopeMetrics[0].metrics[histogramIndex].dataPoints[0] + .startTime, [0, 100], ['0', '2', '0'] ); diff --git a/auto-merge/js/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/test/metricsHelper.ts b/auto-merge/js/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/test/metricsHelper.ts index 27b816fe1..6a47a9a8f 100644 --- a/auto-merge/js/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/test/metricsHelper.ts +++ b/auto-merge/js/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/test/metricsHelper.ts @@ -20,6 +20,7 @@ import { Histogram, ValueType, ObservableGauge, + HrTime, } from '@opentelemetry/api'; import { Resource } from '@opentelemetry/resources'; import * as assert from 'assert'; @@ -30,9 +31,11 @@ import { View, } from '@opentelemetry/sdk-metrics'; import { + hrTimeToFixed64Nanos, IExportMetricsServiceRequest, IKeyValue, IMetric, + UnsignedLong, } from '@opentelemetry/otlp-transformer'; import { Stream } from 'stream'; @@ -129,75 +132,86 @@ export function ensureProtoAttributesAreCorrect(attributes: IKeyValue[]) { export function ensureExportedCounterIsCorrect( metric: IMetric, - time?: number, - startTime?: number + time: HrTime, + startTime: HrTime ) { - assert.deepStrictEqual(metric, { - name: 'int-counter', - description: 'sample counter description', - unit: '', - sum: { - dataPoints: [ - { - asInt: '1', - startTimeUnixNano: String(startTime), - timeUnixNano: String(time), - }, - ], - isMonotonic: true, - aggregationTemporality: 'AGGREGATION_TEMPORALITY_CUMULATIVE', - }, - }); + assert.strictEqual(metric.name, 'int-counter'); + assert.strictEqual(metric.description, 'sample counter description'); + assert.strictEqual(metric.unit, ''); + assert.strictEqual(metric.sum?.dataPoints.length, 1); + assert.strictEqual(metric.sum?.isMonotonic, true); + assert.strictEqual( + metric.sum?.aggregationTemporality, + 'AGGREGATION_TEMPORALITY_CUMULATIVE' + ); + + const [dp] = metric.sum.dataPoints; + assert.strictEqual(dp.asInt, '1'); + assert.deepStrictEqual( + UnsignedLong.fromString(dp.startTimeUnixNano as string), + hrTimeToFixed64Nanos(startTime) + ); + assert.deepStrictEqual( + UnsignedLong.fromString(dp.timeUnixNano as string), + hrTimeToFixed64Nanos(time) + ); } export function ensureExportedObservableGaugeIsCorrect( metric: IMetric, - time?: number, - startTime?: number + time: HrTime, + startTime: HrTime ) { - assert.deepStrictEqual(metric, { - name: 'double-observable-gauge', - description: 'sample observable gauge description', - unit: '', - gauge: { - dataPoints: [ - { - asDouble: 6, - startTimeUnixNano: String(startTime), - timeUnixNano: String(time), - }, - ], - }, - }); + assert.strictEqual(metric.name, 'double-observable-gauge'); + assert.strictEqual(metric.description, 'sample observable gauge description'); + assert.strictEqual(metric.unit, ''); + assert.strictEqual(metric.gauge?.dataPoints.length, 1); + + const [dp] = metric.gauge.dataPoints; + assert.strictEqual(dp.asDouble, 6); + assert.deepStrictEqual( + UnsignedLong.fromString(dp.startTimeUnixNano as string), + hrTimeToFixed64Nanos(startTime) + ); + assert.deepStrictEqual( + UnsignedLong.fromString(dp.timeUnixNano as string), + hrTimeToFixed64Nanos(time) + ); } export function ensureExportedHistogramIsCorrect( metric: IMetric, - time?: number, - startTime?: number, + time: HrTime, + startTime: HrTime, explicitBounds: number[] = [Infinity], bucketCounts: string[] = ['2', '0'] ) { - assert.deepStrictEqual(metric, { - name: 'int-histogram', - description: 'sample histogram description', - unit: '', - histogram: { - dataPoints: [ - { - sum: 21, - count: '2', - min: 7, - max: 14, - startTimeUnixNano: String(startTime), - timeUnixNano: String(time), - bucketCounts, - explicitBounds, - }, - ], - aggregationTemporality: 'AGGREGATION_TEMPORALITY_CUMULATIVE', - }, - }); + assert.strictEqual(metric.name, 'int-histogram'); + assert.strictEqual(metric.description, 'sample histogram description'); + assert.strictEqual(metric.unit, ''); + + assert.strictEqual(metric.histogram?.dataPoints.length, 1); + assert.strictEqual( + metric.histogram.aggregationTemporality, + 'AGGREGATION_TEMPORALITY_CUMULATIVE' + ); + + const [dp] = metric.histogram.dataPoints; + + assert.strictEqual(dp.sum, 21); + assert.strictEqual(dp.count, '2'); + assert.strictEqual(dp.min, 7); + assert.strictEqual(dp.max, 14); + assert.deepStrictEqual(dp.explicitBounds, explicitBounds); + assert.deepStrictEqual(dp.bucketCounts, bucketCounts); + assert.deepStrictEqual( + UnsignedLong.fromString(dp.startTimeUnixNano as string), + hrTimeToFixed64Nanos(startTime) + ); + assert.deepStrictEqual( + UnsignedLong.fromString(dp.timeUnixNano as string), + hrTimeToFixed64Nanos(time) + ); } export function ensureExportMetricsServiceRequestIsSet( diff --git a/auto-merge/js/experimental/packages/opentelemetry-exporter-prometheus/package.json b/auto-merge/js/experimental/packages/opentelemetry-exporter-prometheus/package.json index 5b55ececd..f445d8bd1 100644 --- a/auto-merge/js/experimental/packages/opentelemetry-exporter-prometheus/package.json +++ b/auto-merge/js/experimental/packages/opentelemetry-exporter-prometheus/package.json @@ -45,9 +45,9 @@ "devDependencies": { "@opentelemetry/api": "1.6.0", "@opentelemetry/semantic-conventions": "1.17.0", - "@types/mocha": "10.0.1", + "@types/mocha": "10.0.2", "@types/node": "18.6.5", - "@types/sinon": "10.0.16", + "@types/sinon": "10.0.17", "codecov": "3.8.3", "cross-var": "1.1.0", "lerna": "7.1.5", diff --git a/auto-merge/js/experimental/packages/opentelemetry-instrumentation-grpc/package.json b/auto-merge/js/experimental/packages/opentelemetry-instrumentation-grpc/package.json index fbf07ae71..1b3e5c47d 100644 --- a/auto-merge/js/experimental/packages/opentelemetry-instrumentation-grpc/package.json +++ b/auto-merge/js/experimental/packages/opentelemetry-instrumentation-grpc/package.json @@ -57,10 +57,10 @@ "@protobuf-ts/grpc-transport": "2.9.1", "@protobuf-ts/runtime": "2.9.1", "@protobuf-ts/runtime-rpc": "2.9.1", - "@types/mocha": "10.0.1", + "@types/mocha": "10.0.2", "@types/node": "18.6.5", - "@types/semver": "7.5.2", - "@types/sinon": "10.0.16", + "@types/semver": "7.5.3", + "@types/sinon": "10.0.17", "codecov": "3.8.3", "cross-var": "1.1.0", "lerna": "7.1.5", diff --git a/auto-merge/js/experimental/packages/opentelemetry-instrumentation-http/package.json b/auto-merge/js/experimental/packages/opentelemetry-instrumentation-http/package.json index aebe37781..c18ac517d 100644 --- a/auto-merge/js/experimental/packages/opentelemetry-instrumentation-http/package.json +++ b/auto-merge/js/experimental/packages/opentelemetry-instrumentation-http/package.json @@ -50,13 +50,13 @@ "@opentelemetry/sdk-metrics": "1.17.0", "@opentelemetry/sdk-trace-base": "1.17.0", "@opentelemetry/sdk-trace-node": "1.17.0", - "@types/mocha": "10.0.1", + "@types/mocha": "10.0.2", "@types/node": "18.6.5", - "@types/request-promise-native": "1.0.18", - "@types/semver": "7.5.2", - "@types/sinon": "10.0.16", - "@types/superagent": "4.1.18", - "axios": "1.5.0", + "@types/request-promise-native": "1.0.19", + "@types/semver": "7.5.3", + "@types/sinon": "10.0.17", + "@types/superagent": "4.1.19", + "axios": "1.5.1", "codecov": "3.8.3", "cross-var": "1.1.0", "lerna": "7.1.5", diff --git a/auto-merge/js/experimental/packages/opentelemetry-sdk-node/package.json b/auto-merge/js/experimental/packages/opentelemetry-sdk-node/package.json index 8517a0761..0f94bc438 100644 --- a/auto-merge/js/experimental/packages/opentelemetry-sdk-node/package.json +++ b/auto-merge/js/experimental/packages/opentelemetry-sdk-node/package.json @@ -67,10 +67,10 @@ "@opentelemetry/api": "1.6.0", "@opentelemetry/context-async-hooks": "1.17.0", "@opentelemetry/exporter-jaeger": "1.17.0", - "@types/mocha": "10.0.1", + "@types/mocha": "10.0.2", "@types/node": "18.6.5", - "@types/semver": "7.5.2", - "@types/sinon": "10.0.16", + "@types/semver": "7.5.3", + "@types/sinon": "10.0.17", "codecov": "3.8.3", "cross-var": "1.1.0", "lerna": "7.1.5", diff --git a/auto-merge/js/experimental/packages/otlp-grpc-exporter-base/package.json b/auto-merge/js/experimental/packages/otlp-grpc-exporter-base/package.json index cfa48c56e..dbf84414c 100644 --- a/auto-merge/js/experimental/packages/otlp-grpc-exporter-base/package.json +++ b/auto-merge/js/experimental/packages/otlp-grpc-exporter-base/package.json @@ -53,9 +53,9 @@ "@opentelemetry/otlp-transformer": "0.43.0", "@opentelemetry/resources": "1.17.0", "@opentelemetry/sdk-trace-base": "1.17.0", - "@types/mocha": "10.0.1", + "@types/mocha": "10.0.2", "@types/node": "18.6.5", - "@types/sinon": "10.0.16", + "@types/sinon": "10.0.17", "codecov": "3.8.3", "cpx": "1.5.0", "cross-var": "1.1.0", diff --git a/auto-merge/js/experimental/packages/shim-opencensus/package.json b/auto-merge/js/experimental/packages/shim-opencensus/package.json index 2e24690be..3ec28d7ae 100644 --- a/auto-merge/js/experimental/packages/shim-opencensus/package.json +++ b/auto-merge/js/experimental/packages/shim-opencensus/package.json @@ -52,9 +52,9 @@ "@opentelemetry/api": "1.6.0", "@opentelemetry/context-async-hooks": "1.17.0", "@opentelemetry/sdk-trace-base": "1.17.0", - "@types/mocha": "10.0.1", + "@types/mocha": "10.0.2", "@types/node": "18.6.5", - "@types/sinon": "10.0.16", + "@types/sinon": "10.0.17", "codecov": "3.8.3", "cross-var": "1.1.0", "lerna": "7.1.5", diff --git a/auto-merge/js/integration-tests/propagation-validation-server/package.json b/auto-merge/js/integration-tests/propagation-validation-server/package.json index e54a18825..2b5fcd340 100644 --- a/auto-merge/js/integration-tests/propagation-validation-server/package.json +++ b/auto-merge/js/integration-tests/propagation-validation-server/package.json @@ -15,7 +15,7 @@ "@opentelemetry/context-async-hooks": "1.17.0", "@opentelemetry/core": "1.17.0", "@opentelemetry/sdk-trace-base": "1.17.0", - "axios": "1.5.0", + "axios": "1.5.1", "body-parser": "1.19.0", "express": "4.17.3" }, diff --git a/auto-merge/js/packages/opentelemetry-context-async-hooks/package.json b/auto-merge/js/packages/opentelemetry-context-async-hooks/package.json index 181fc92dc..ea0da0acb 100644 --- a/auto-merge/js/packages/opentelemetry-context-async-hooks/package.json +++ b/auto-merge/js/packages/opentelemetry-context-async-hooks/package.json @@ -45,7 +45,7 @@ }, "devDependencies": { "@opentelemetry/api": ">=1.0.0 <1.7.0", - "@types/mocha": "10.0.1", + "@types/mocha": "10.0.2", "@types/node": "18.6.5", "codecov": "3.8.3", "cross-var": "1.1.0", diff --git a/auto-merge/js/packages/opentelemetry-exporter-jaeger/package.json b/auto-merge/js/packages/opentelemetry-exporter-jaeger/package.json index 9e94b5f26..3fba91d4f 100644 --- a/auto-merge/js/packages/opentelemetry-exporter-jaeger/package.json +++ b/auto-merge/js/packages/opentelemetry-exporter-jaeger/package.json @@ -46,9 +46,9 @@ "devDependencies": { "@opentelemetry/api": "^1.0.0", "@opentelemetry/resources": "1.17.0", - "@types/mocha": "10.0.1", + "@types/mocha": "10.0.2", "@types/node": "18.6.5", - "@types/sinon": "10.0.16", + "@types/sinon": "10.0.17", "codecov": "3.8.3", "cross-var": "1.1.0", "lerna": "7.1.5", diff --git a/auto-merge/js/packages/opentelemetry-propagator-jaeger/package.json b/auto-merge/js/packages/opentelemetry-propagator-jaeger/package.json index 8d7a70c84..7735971bf 100644 --- a/auto-merge/js/packages/opentelemetry-propagator-jaeger/package.json +++ b/auto-merge/js/packages/opentelemetry-propagator-jaeger/package.json @@ -55,9 +55,9 @@ }, "devDependencies": { "@opentelemetry/api": ">=1.0.0 <1.7.0", - "@types/mocha": "10.0.1", + "@types/mocha": "10.0.2", "@types/node": "18.6.5", - "@types/sinon": "10.0.16", + "@types/sinon": "10.0.17", "@types/webpack-env": "1.16.3", "babel-plugin-istanbul": "6.1.1", "codecov": "3.8.3", diff --git a/auto-merge/js/packages/opentelemetry-sdk-trace-node/package.json b/auto-merge/js/packages/opentelemetry-sdk-trace-node/package.json index 0bdcc4a09..d18133ec7 100644 --- a/auto-merge/js/packages/opentelemetry-sdk-trace-node/package.json +++ b/auto-merge/js/packages/opentelemetry-sdk-trace-node/package.json @@ -48,10 +48,10 @@ "@opentelemetry/api": ">=1.0.0 <1.7.0", "@opentelemetry/resources": "1.17.0", "@opentelemetry/semantic-conventions": "1.17.0", - "@types/mocha": "10.0.1", + "@types/mocha": "10.0.2", "@types/node": "18.6.5", - "@types/semver": "7.5.2", - "@types/sinon": "10.0.16", + "@types/semver": "7.5.3", + "@types/sinon": "10.0.17", "codecov": "3.8.3", "cross-var": "1.1.0", "lerna": "7.1.5", diff --git a/auto-merge/js/packages/opentelemetry-shim-opentracing/package.json b/auto-merge/js/packages/opentelemetry-shim-opentracing/package.json index f328e7fce..78381872e 100644 --- a/auto-merge/js/packages/opentelemetry-shim-opentracing/package.json +++ b/auto-merge/js/packages/opentelemetry-shim-opentracing/package.json @@ -46,7 +46,7 @@ "@opentelemetry/propagator-b3": "1.17.0", "@opentelemetry/propagator-jaeger": "1.17.0", "@opentelemetry/sdk-trace-base": "1.17.0", - "@types/mocha": "10.0.1", + "@types/mocha": "10.0.2", "@types/node": "18.6.5", "codecov": "3.8.3", "cross-var": "1.1.0", diff --git a/common/config/rush/npm-shrinkwrap.json b/common/config/rush/npm-shrinkwrap.json index 7ba3f0d68..e24ade3c6 100644 --- a/common/config/rush/npm-shrinkwrap.json +++ b/common/config/rush/npm-shrinkwrap.json @@ -45,10 +45,10 @@ "@types/lodash.merge": "4.6.7", "@types/mocha": "^10.0.0", "@types/node": "^18.14.2", - "@types/semver": "7.5.2", + "@types/semver": "7.5.3", "@types/shimmer": "^1.0.2", "@types/sinon": "^10.0.13", - "@types/webpack": "4.41.33", + "@types/webpack": "4.41.34", "@types/webpack-env": "1.16.3", "@types/zone.js": "0.5.12", "@typescript-eslint/eslint-plugin": "5.59.11", @@ -144,21 +144,21 @@ } }, "node_modules/@babel/core": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", - "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.0.tgz", + "integrity": "sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", + "@babel/generator": "^7.23.0", "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.20", - "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.16", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.0", + "@babel/parser": "^7.23.0", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.20", - "@babel/types": "^7.22.19", - "convert-source-map": "^1.7.0", + "@babel/traverse": "^7.23.0", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", @@ -172,6 +172,11 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -181,11 +186,11 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", - "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dependencies": { - "@babel/types": "^7.22.15", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -226,12 +231,12 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" @@ -260,9 +265,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz", - "integrity": "sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-module-imports": "^7.22.15", @@ -332,13 +337,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", - "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", + "version": "7.23.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.1.tgz", + "integrity": "sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==", "dependencies": { "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.23.0", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" @@ -358,9 +363,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", - "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "bin": { "parser": "bin/babel-parser.js" }, @@ -382,18 +387,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.20.tgz", - "integrity": "sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.0.tgz", + "integrity": "sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==", "dependencies": { "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", + "@babel/generator": "^7.23.0", "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.22.5", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.16", - "@babel/types": "^7.22.19", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -402,12 +407,12 @@ } }, "node_modules/@babel/types": { - "version": "7.22.19", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz", - "integrity": "sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dependencies": { "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.19", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -437,9 +442,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", - "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.0.tgz", + "integrity": "sha512-zJmuCWj2VLBt4c25CfBIbMZLGLyhkvs7LznyVX5HfpzeocThgIj5XQK4L+g3U36mMcx8bPMhGyPpwCATamC4jQ==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -472,9 +477,9 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "version": "13.22.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", + "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", "dependencies": { "type-fest": "^0.20.2" }, @@ -508,9 +513,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", - "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", + "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -774,13 +779,13 @@ "node_modules/@rush-temp/sandbox-api": { "version": "0.0.0", "resolved": "file:projects/sandbox-api.tgz", - "integrity": "sha512-qiZn+dOm6rmR6stFd4GAOKgy65zu5rpypNqHBvqHt+GdFNjc8G0SYTkdMYX7hgJn1oHRQoQgjnagMlhfopN5Pw==", + "integrity": "sha512-p/6w13wD4n0DcSjNaSXMpNjqMGmV4L+C1oCtRhr/8rxM0nusWIecpC252DqVwfuLAI4jRUyVMBSuHs53agT+Vg==", "dependencies": { "@types/jquery": "^3.5.14", "@types/mocha": "^10.0.0", "@types/node": "^18.14.2", "@types/sinon": "^10.0.13", - "@types/webpack": "4.41.33", + "@types/webpack": "4.41.34", "@types/webpack-env": "1.16.3", "@typescript-eslint/eslint-plugin": "5.59.11", "@typescript-eslint/parser": "5.59.11", @@ -1150,6 +1155,35 @@ "zone.js": "^0.11.4" } }, + "node_modules/@rush-temp/sandbox-context-zone-peer-dep/node_modules/@babel/core": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", + "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.20", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.20", + "@babel/types": "^7.22.19", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, "node_modules/@rush-temp/sandbox-context-zone-peer-dep/node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", @@ -1176,6 +1210,14 @@ "node": ">= 8" } }, + "node_modules/@rush-temp/sandbox-context-zone-peer-dep/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@rush-temp/sandbox-context-zone-peer-dep/node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -1255,6 +1297,35 @@ "node": ">= 8" } }, + "node_modules/@rush-temp/sandbox-context-zone/node_modules/@babel/core": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", + "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.20", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.20", + "@babel/types": "^7.22.19", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, "node_modules/@rush-temp/sandbox-context-zone/node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", @@ -1281,6 +1352,14 @@ "node": ">= 8" } }, + "node_modules/@rush-temp/sandbox-context-zone/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@rush-temp/sandbox-context-zone/node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -1472,6 +1551,35 @@ "webpack-merge": "5.9.0" } }, + "node_modules/@rush-temp/sandbox-exporter-logs-otlp-http/node_modules/@babel/core": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", + "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.20", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.20", + "@babel/types": "^7.22.19", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, "node_modules/@rush-temp/sandbox-exporter-logs-otlp-http/node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", @@ -1498,6 +1606,14 @@ "node": ">= 8" } }, + "node_modules/@rush-temp/sandbox-exporter-logs-otlp-http/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@rush-temp/sandbox-exporter-logs-otlp-http/node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -1641,6 +1757,35 @@ "webpack-merge": "5.9.0" } }, + "node_modules/@rush-temp/sandbox-exporter-logs-otlp-proto/node_modules/@babel/core": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", + "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.20", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.20", + "@babel/types": "^7.22.19", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, "node_modules/@rush-temp/sandbox-exporter-logs-otlp-proto/node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", @@ -1667,6 +1812,14 @@ "node": ">= 8" } }, + "node_modules/@rush-temp/sandbox-exporter-logs-otlp-proto/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@rush-temp/sandbox-exporter-logs-otlp-proto/node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -1810,6 +1963,35 @@ "webpack-merge": "5.9.0" } }, + "node_modules/@rush-temp/sandbox-exporter-metrics-otlp-http/node_modules/@babel/core": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", + "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.20", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.20", + "@babel/types": "^7.22.19", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, "node_modules/@rush-temp/sandbox-exporter-metrics-otlp-http/node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", @@ -1836,6 +2018,14 @@ "node": ">= 8" } }, + "node_modules/@rush-temp/sandbox-exporter-metrics-otlp-http/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@rush-temp/sandbox-exporter-metrics-otlp-http/node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -1979,6 +2169,35 @@ "webpack-merge": "5.9.0" } }, + "node_modules/@rush-temp/sandbox-exporter-trace-otlp-http/node_modules/@babel/core": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", + "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.20", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.20", + "@babel/types": "^7.22.19", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, "node_modules/@rush-temp/sandbox-exporter-trace-otlp-http/node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", @@ -2005,6 +2224,14 @@ "node": ">= 8" } }, + "node_modules/@rush-temp/sandbox-exporter-trace-otlp-http/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@rush-temp/sandbox-exporter-trace-otlp-http/node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -2148,6 +2375,35 @@ "webpack-merge": "5.9.0" } }, + "node_modules/@rush-temp/sandbox-exporter-trace-otlp-proto/node_modules/@babel/core": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", + "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.20", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.20", + "@babel/types": "^7.22.19", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, "node_modules/@rush-temp/sandbox-exporter-trace-otlp-proto/node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", @@ -2174,6 +2430,14 @@ "node": ">= 8" } }, + "node_modules/@rush-temp/sandbox-exporter-trace-otlp-proto/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@rush-temp/sandbox-exporter-trace-otlp-proto/node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -2317,6 +2581,35 @@ "webpack-merge": "5.9.0" } }, + "node_modules/@rush-temp/sandbox-exporter-zipkin/node_modules/@babel/core": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", + "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.20", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.20", + "@babel/types": "^7.22.19", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, "node_modules/@rush-temp/sandbox-exporter-zipkin/node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", @@ -2343,6 +2636,14 @@ "node": ">= 8" } }, + "node_modules/@rush-temp/sandbox-exporter-zipkin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@rush-temp/sandbox-exporter-zipkin/node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -2437,13 +2738,13 @@ "node_modules/@rush-temp/sandbox-instrumentation": { "version": "0.0.0", "resolved": "file:projects/sandbox-instrumentation.tgz", - "integrity": "sha512-YLtEWNaYwdcjpK75vzRvfOmNJFIK0PAbcNYkiJKB0ftYXp0YEDd9HLY49SwU19ReFOdDPdTKmW7pwuclPYO99g==", + "integrity": "sha512-AWiWZ9j66XuOXpWB9/Zf7WwIYY28yWjhG/Y2Cc91MP6J+PQDMe7ZuBI1mQ0kVai/Ft1UmGQz2VGODem81pbo0g==", "dependencies": { "@babel/core": "7.22.20", "@types/jquery": "^3.5.14", "@types/mocha": "^10.0.0", "@types/node": "^18.14.2", - "@types/semver": "7.5.2", + "@types/semver": "7.5.3", "@types/shimmer": "^1.0.2", "@types/sinon": "^10.0.13", "@types/webpack-env": "1.16.3", @@ -2671,6 +2972,35 @@ "webpack-merge": "5.9.0" } }, + "node_modules/@rush-temp/sandbox-instrumentation-fetch/node_modules/@babel/core": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", + "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.20", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.20", + "@babel/types": "^7.22.19", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, "node_modules/@rush-temp/sandbox-instrumentation-fetch/node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", @@ -2697,6 +3027,14 @@ "node": ">= 8" } }, + "node_modules/@rush-temp/sandbox-instrumentation-fetch/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@rush-temp/sandbox-instrumentation-fetch/node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -3099,6 +3437,35 @@ "webpack-merge": "5.9.0" } }, + "node_modules/@rush-temp/sandbox-instrumentation-xml-http-request/node_modules/@babel/core": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", + "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.20", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.20", + "@babel/types": "^7.22.19", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, "node_modules/@rush-temp/sandbox-instrumentation-xml-http-request/node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", @@ -3125,6 +3492,14 @@ "node": ">= 8" } }, + "node_modules/@rush-temp/sandbox-instrumentation-xml-http-request/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@rush-temp/sandbox-instrumentation-xml-http-request/node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -3199,21 +3574,58 @@ "wildcard": "^2.0.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=10.0.0" + } + }, + "node_modules/@rush-temp/sandbox-instrumentation-xml-http-request/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rush-temp/sandbox-instrumentation/node_modules/@babel/core": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", + "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.20", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.20", + "@babel/types": "^7.22.19", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@rush-temp/sandbox-instrumentation-xml-http-request/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, + "node_modules/@rush-temp/sandbox-instrumentation/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" + "semver": "bin/semver.js" } }, "node_modules/@rush-temp/sandbox-instrumentation/node_modules/colorette": { @@ -3384,6 +3796,35 @@ "webpack-merge": "5.9.0" } }, + "node_modules/@rush-temp/sandbox-opentelemetry-browser-detector/node_modules/@babel/core": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", + "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.20", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.20", + "@babel/types": "^7.22.19", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, "node_modules/@rush-temp/sandbox-opentelemetry-browser-detector/node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", @@ -3410,6 +3851,14 @@ "node": ">= 8" } }, + "node_modules/@rush-temp/sandbox-opentelemetry-browser-detector/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@rush-temp/sandbox-opentelemetry-browser-detector/node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -3552,6 +4001,35 @@ "webpack-merge": "5.9.0" } }, + "node_modules/@rush-temp/sandbox-otlp-exporter-base/node_modules/@babel/core": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", + "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.20", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.20", + "@babel/types": "^7.22.19", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, "node_modules/@rush-temp/sandbox-otlp-exporter-base/node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", @@ -3578,6 +4056,14 @@ "node": ">= 8" } }, + "node_modules/@rush-temp/sandbox-otlp-exporter-base/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@rush-temp/sandbox-otlp-exporter-base/node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -3719,6 +4205,43 @@ "webpack": "^4.46.0" } }, + "node_modules/@rush-temp/sandbox-otlp-proto-exporter-base/node_modules/@babel/core": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", + "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.20", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.20", + "@babel/types": "^7.22.19", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@rush-temp/sandbox-otlp-proto-exporter-base/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@rush-temp/sandbox-otlp-transformer": { "version": "0.0.0", "resolved": "file:projects/sandbox-otlp-transformer.tgz", @@ -4034,6 +4557,35 @@ "webpack-merge": "5.9.0" } }, + "node_modules/@rush-temp/sandbox-sdk-logs/node_modules/@babel/core": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", + "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.20", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.20", + "@babel/types": "^7.22.19", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, "node_modules/@rush-temp/sandbox-sdk-logs/node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", @@ -4060,6 +4612,14 @@ "node": ">= 8" } }, + "node_modules/@rush-temp/sandbox-sdk-logs/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@rush-temp/sandbox-sdk-logs/node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -4204,6 +4764,35 @@ "webpack-merge": "5.9.0" } }, + "node_modules/@rush-temp/sandbox-sdk-metrics/node_modules/@babel/core": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", + "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.20", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.20", + "@babel/types": "^7.22.19", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, "node_modules/@rush-temp/sandbox-sdk-metrics/node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", @@ -4230,6 +4819,14 @@ "node": ">= 8" } }, + "node_modules/@rush-temp/sandbox-sdk-metrics/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@rush-temp/sandbox-sdk-metrics/node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -4422,6 +5019,35 @@ "webpack-merge": "5.9.0" } }, + "node_modules/@rush-temp/sandbox-sdk-trace-web/node_modules/@babel/core": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", + "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.20", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.20", + "@babel/types": "^7.22.19", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, "node_modules/@rush-temp/sandbox-sdk-trace-web/node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", @@ -4448,6 +5074,14 @@ "node": ">= 8" } }, + "node_modules/@rush-temp/sandbox-sdk-trace-web/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@rush-temp/sandbox-sdk-trace-web/node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -4874,9 +5508,9 @@ } }, "node_modules/@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "version": "4.17.18", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.18.tgz", + "integrity": "sha512-Sxv8BSLLgsBYmcnGdGjjEjqET2U+AKAdCRODmMiq02FgjwuV75Ut85DRpvFjyw/Mk0vgUOliGRU0UUmuuZHByQ==", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -4885,9 +5519,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.36", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.36.tgz", - "integrity": "sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q==", + "version": "4.17.37", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.37.tgz", + "integrity": "sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg==", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -4914,9 +5548,9 @@ } }, "node_modules/@types/jquery": { - "version": "3.5.19", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.19.tgz", - "integrity": "sha512-KFbmk+dXfphHGuVCmlopgcNRCegN/21mkeoD4BzuJhVH0SJW3Uo2mLuAwb6oqTNV79EsRp6J7yC1BbKymjpx/g==", + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.20.tgz", + "integrity": "sha512-UI+EGhgYD4LdSZ8gaiziFqXYIIB38VQSDsnAs8jL/div7FGrzrShx4HKCykVzk3tPfiIlusdNP9Wi3G60LCF2Q==", "dependencies": { "@types/sizzle": "*" } @@ -4945,9 +5579,9 @@ "integrity": "sha512-pTjcqY9E4nOI55Wgpz7eiI8+LzdYnw3qxXCfHyBDdPbYvbyLgWLJGh8EdPvqawwMK1Uo1794AUkkR38Fr0g+2g==" }, "node_modules/@types/lodash": { - "version": "4.14.198", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.198.tgz", - "integrity": "sha512-trNJ/vtMZYMLhfN45uLq4ShQSw0/S7xCTLLVM+WM1rmFpba/VS42jVUgaO3w/NOLiWR/09lnYk0yMaA/atdIsg==" + "version": "4.14.199", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.199.tgz", + "integrity": "sha512-Vrjz5N5Ia4SEzWWgIVwnHNEnb1UE1XMkvY5DGXrAeOGE9imk0hgTHh5GyDjLDJi9OTCn9oo9dXH1uToK1VRfrg==" }, "node_modules/@types/lodash.merge": { "version": "4.6.7", @@ -4967,24 +5601,24 @@ } }, "node_modules/@types/mdurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz", - "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.3.tgz", + "integrity": "sha512-T5k6kTXak79gwmIOaDF2UUQXFbnBE0zBUzF20pz7wDYu0RQMzWg+Ml/Pz50214NsFHBITkoi5VtdjFZnJ2ijjA==" }, "node_modules/@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.3.tgz", + "integrity": "sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg==" }, "node_modules/@types/mocha": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", - "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==" + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.2.tgz", + "integrity": "sha512-NaHL0+0lLNhX6d9rs+NSt97WH/gIlRHmszXbQ/8/MV/eVcFNdeJ/GYhrFuUc8K7WuPhRhTSdMkCp8VMzhUq85w==" }, "node_modules/@types/node": { - "version": "18.17.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.18.tgz", - "integrity": "sha512-/4QOuy3ZpV7Ya1GTRz5CYSz3DgkKpyUptXuQ5PPce7uuyJAOR7r9FhkmxJfvcNUXyklbC63a+YvB3jxy7s9ngw==" + "version": "18.18.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.1.tgz", + "integrity": "sha512-3G42sxmm0fF2+Vtb9TJQpnjmP+uKlWvFa8KoEGquh4gqRmoUG/N0ufuhikw6HEsdG2G2oIKhog1GCTfz9v5NdQ==" }, "node_modules/@types/qs": { "version": "6.9.8", @@ -4992,14 +5626,14 @@ "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" }, "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.5.tgz", + "integrity": "sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA==" }, "node_modules/@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.1.tgz", + "integrity": "sha512-TiGnitEDxj2X0j+98Eqk5lv/Cij8oHd32bU4D/Yw6AOq7vvTk0gSD2GPj0G/HkvhMoVsdlhYF4yqqlyPBTM6Sg==", "dependencies": { "@types/node": "*" } @@ -5010,31 +5644,31 @@ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" }, "node_modules/@types/semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==" + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==" }, "node_modules/@types/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", - "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.2.tgz", + "integrity": "sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw==", "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "node_modules/@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.2.tgz", + "integrity": "sha512-asaEIoc6J+DbBKXtO7p2shWUpKacZOoMBEGBgPG91P8xhO53ohzHWGCs4ScZo5pQMf5ukQzVT9fhX1WzpHihig==", "dependencies": { "@types/express": "*" } }, "node_modules/@types/serve-static": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", - "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.3.tgz", + "integrity": "sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg==", "dependencies": { "@types/http-errors": "*", "@types/mime": "*", @@ -5042,40 +5676,40 @@ } }, "node_modules/@types/shimmer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.0.2.tgz", - "integrity": "sha512-dKkr1bTxbEsFlh2ARpKzcaAmsYixqt9UyCdoEZk8rHyE4iQYcDCyvSjDSf7JUWJHlJiTtbIoQjxKh6ViywqDAg==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.0.3.tgz", + "integrity": "sha512-F/IjUGnV6pIN7R4ZV4npHJVoNtaLZWvb+2/9gctxjb99wkpI7Ozg8VPogwDiTRyjLwZXAYxjvdg1KS8LTHKdDA==" }, "node_modules/@types/sinon": { - "version": "10.0.16", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.16.tgz", - "integrity": "sha512-j2Du5SYpXZjJVJtXBokASpPRj+e2z+VUhCPHmM6WMfe3dpHu6iVKJMU6AiBcMp/XTAYnEj6Wc1trJUWwZ0QaAQ==", + "version": "10.0.17", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.17.tgz", + "integrity": "sha512-+6ILpcixQ0Ma3dHMTLv4rSycbDXkDljgKL+E0nI2RUxxhYTFyPSjt6RVMxh7jUshvyVcBvicb0Ktj+lAJcjgeA==", "dependencies": { "@types/sinonjs__fake-timers": "*" } }, "node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz", - "integrity": "sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==" + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.3.tgz", + "integrity": "sha512-4g+2YyWe0Ve+LBh+WUm1697PD0Kdi6coG1eU0YjQbwx61AZ8XbEpL1zIT6WjuUKrCMCROpEaYQPDjBnDouBVAQ==" }, "node_modules/@types/sizzle": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", - "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==" + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.4.tgz", + "integrity": "sha512-jA2llq2zNkg8HrALI7DtWzhALcVH0l7i89yhY3iBdOz6cBPeACoFq+fkQrjHA39t1hnSFOboZ7A/AY5MMZSlag==" }, "node_modules/@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "version": "0.3.34", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.34.tgz", + "integrity": "sha512-R+n7qBFnm/6jinlteC9DBL5dGiDGjWAvjo4viUanpnc/dG1y7uDoacXPIQ/PQEg1fI912SMHIa014ZjRpvDw4g==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/source-list-map": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", - "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==" + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.3.tgz", + "integrity": "sha512-I9R/7fUjzUOyDy6AFkehCK711wWoAXEaBi80AfjZt1lIkbe6AcXKd3ckQc3liMvQExWvfOeh/8CtKzrfUFN5gA==" }, "node_modules/@types/tapable": { "version": "1.0.9", @@ -5091,9 +5725,9 @@ } }, "node_modules/@types/webpack": { - "version": "4.41.33", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.33.tgz", - "integrity": "sha512-PPajH64Ft2vWevkerISMtnZ8rTs4YmRbs+23c402J0INmxDKCrhZNvwZYtzx96gY2wAtXdrK1BS2fiC8MlLr3g==", + "version": "4.41.34", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.34.tgz", + "integrity": "sha512-CN2aOGrR3zbMc2v+cKqzaClYP1ldkpPOgtdNvgX+RmlWCSWxHxpzz6WSCVQZRkF8D60ROlkRzAoEpgjWQ+bd2g==", "dependencies": { "@types/node": "*", "@types/tapable": "^1", @@ -5109,9 +5743,9 @@ "integrity": "sha512-9gtOPPkfyNoEqCQgx4qJKkuNm/x0R2hKR7fdl7zvTJyHnIisuE/LfvXOsYWL0o3qq6uiBnKZNNNzi3l0y/X+xw==" }, "node_modules/@types/webpack-sources": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz", - "integrity": "sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.1.tgz", + "integrity": "sha512-iLC3Fsx62ejm3ST3PQ8vBMC54Rb3EoCprZjeJGI5q+9QjfDLGt9jeg/k245qz1G9AQnORGk0vqPicJFPT1QODQ==", "dependencies": { "@types/node": "*", "@types/source-list-map": "*", @@ -5127,17 +5761,17 @@ } }, "node_modules/@types/ws": { - "version": "8.5.5", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", - "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.6.tgz", + "integrity": "sha512-8B5EO9jLVCy+B58PLHvLDuOD8DRVMgQzq8d55SjLCOn9kqGyqOvy27exVaTio1q1nX5zLu8/6N0n2ThSxOM6tg==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.1.tgz", + "integrity": "sha512-CHzgNU3qYBnp/O4S3yv2tXPlvMTq0YWSTVg2/JYLqWZGHwwgJGAwd00poay/11asPq8wLFwHzubyInqHIFmmiw==", "optional": true, "dependencies": { "@types/node": "*" @@ -7189,9 +7823,9 @@ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, "node_modules/browserslist": { - "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "funding": [ { "type": "opencollective", @@ -7207,10 +7841,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -7390,9 +8024,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001538", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz", - "integrity": "sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==", + "version": "1.0.30001541", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001541.tgz", + "integrity": "sha512-bLOsqxDgTqUBkzxbNlSBt8annkDpQB9NdzdTbO2ooJ+eC/IQcvDspDc058g84ejCelF7vHUx57KIOjEecOHXaw==", "funding": [ { "type": "opencollective", @@ -8645,9 +9279,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.525", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.525.tgz", - "integrity": "sha512-GIZ620hDK4YmIqAWkscG4W6RwY6gOx1y5J6f4JUQwctiJrqH2oxZYU4mXHi35oV32tr630UcepBzSBGJ/WYcZA==" + "version": "1.4.537", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.537.tgz", + "integrity": "sha512-W1+g9qs9hviII0HAwOdehGYkr+zt7KKdmCcJcjH0mYg6oL8+ioT3Skjmt7BLoAQqXhjf40AXd+HlR4oAWMlXjA==" }, "node_modules/elliptic": { "version": "6.5.4", @@ -9374,9 +10008,9 @@ } }, "node_modules/eslint/node_modules/globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "version": "13.22.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", + "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", "dependencies": { "type-fest": "^0.20.2" }, @@ -10416,9 +11050,9 @@ } }, "node_modules/fs-monkey": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", - "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==" }, "node_modules/fs-write-stream-atomic": { "version": "1.0.10", @@ -14754,9 +15388,9 @@ } }, "node_modules/path-scurry/node_modules/minipass": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "engines": { "node": ">=16 || 14 >=14.17" } @@ -18249,9 +18883,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "funding": [ { "type": "opencollective", diff --git a/pkgs/api/package.json b/pkgs/api/package.json index db1b7df0d..df0a28f30 100644 --- a/pkgs/api/package.json +++ b/pkgs/api/package.json @@ -69,7 +69,7 @@ "@types/mocha": "^10.0.0", "@types/node": "^18.14.2", "@types/sinon": "^10.0.13", - "@types/webpack": "4.41.33", + "@types/webpack": "4.41.34", "@types/webpack-env": "1.16.3", "@typescript-eslint/eslint-plugin": "5.59.11", "@typescript-eslint/parser": "5.59.11", diff --git a/pkgs/exporters/otlp/base/src/platform/browser/OTLPExporterBrowserBase.ts b/pkgs/exporters/otlp/base/src/platform/browser/OTLPExporterBrowserBase.ts index 35712e256..c545ed838 100644 --- a/pkgs/exporters/otlp/base/src/platform/browser/OTLPExporterBrowserBase.ts +++ b/pkgs/exporters/otlp/base/src/platform/browser/OTLPExporterBrowserBase.ts @@ -20,7 +20,7 @@ import * as otlpTypes from '../../types'; import { parseHeaders } from '../../util'; import { sendWithBeacon, sendWithXhr } from './util'; import { diag } from '@opentelemetry/sandbox-api'; -import { getEnv, baggageUtils } from '@opentelemetry/sandbox-core'; +import { getEnv, baggageUtils, _globalThis } from '@opentelemetry/sandbox-core'; /** * Collector Metric Exporter abstract base class @@ -53,11 +53,11 @@ export abstract class OTLPExporterBrowserBase< } onInit(): void { - window.addEventListener('unload', this.shutdown); + _globalThis.addEventListener('unload', this.shutdown); } onShutdown(): void { - window.removeEventListener('unload', this.shutdown); + _globalThis.removeEventListener('unload', this.shutdown); } send( diff --git a/pkgs/exporters/otlp/logs/http/test/logHelper.ts b/pkgs/exporters/otlp/logs/http/test/logHelper.ts index 05f8e35b3..11ed4452b 100644 --- a/pkgs/exporters/otlp/logs/http/test/logHelper.ts +++ b/pkgs/exporters/otlp/logs/http/test/logHelper.ts @@ -20,6 +20,7 @@ import { Resource } from '@opentelemetry/sandbox-resources'; import * as assert from 'assert'; import { VERSION } from '@opentelemetry/sandbox-core'; import { + hrTimeToFixed64Nanos, IAnyValue, IExportLogsServiceRequest, IKeyValue, @@ -76,17 +77,22 @@ export function ensureExportedBodyIsCorrect(body?: IAnyValue) { ); } +function hrTimeToFixed64(hrTime: HrTime) { + const { low, high } = hrTimeToFixed64Nanos(hrTime); + return { low, high }; +} + export function ensureExportedLogRecordIsCorrect(logRecord: ILogRecord) { ensureExportedBodyIsCorrect(logRecord.body); ensureExportedAttributesAreCorrect(logRecord.attributes); - assert.strictEqual( + assert.deepStrictEqual( logRecord.timeUnixNano, - 1680253513123241700, + hrTimeToFixed64(mockedReadableLogRecord.hrTime), 'timeUnixNano is wrong' ); - assert.strictEqual( + assert.deepStrictEqual( logRecord.observedTimeUnixNano, - 1680253513123241700, + hrTimeToFixed64(mockedReadableLogRecord.hrTimeObserved), 'observedTimeUnixNano is wrong' ); assert.strictEqual( diff --git a/pkgs/exporters/otlp/logs/proto/test/logHelper.ts b/pkgs/exporters/otlp/logs/proto/test/logHelper.ts index d214a5ebd..e3cb687a9 100644 --- a/pkgs/exporters/otlp/logs/proto/test/logHelper.ts +++ b/pkgs/exporters/otlp/logs/proto/test/logHelper.ts @@ -82,12 +82,12 @@ export function ensureExportedLogRecordIsCorrect(logRecord: ILogRecord) { ensureExportedAttributesAreCorrect(logRecord.attributes); assert.strictEqual( logRecord.timeUnixNano, - '1680253513123241728', + '1680253513123241635', 'timeUnixNano is wrong' ); assert.strictEqual( logRecord.observedTimeUnixNano, - '1680253513123241728', + '1680253513123241635', 'observedTimeUnixNano is wrong' ); assert.strictEqual( diff --git a/pkgs/exporters/otlp/metrics/http/test/browser/CollectorMetricExporter.test.ts b/pkgs/exporters/otlp/metrics/http/test/browser/CollectorMetricExporter.test.ts index 4876e19a4..53b2fe08e 100644 --- a/pkgs/exporters/otlp/metrics/http/test/browser/CollectorMetricExporter.test.ts +++ b/pkgs/exporters/otlp/metrics/http/test/browser/CollectorMetricExporter.test.ts @@ -21,7 +21,7 @@ import { Counter, Histogram, } from '@opentelemetry/sandbox-api'; -import { ExportResultCode, hrTimeToNanoseconds } from '@opentelemetry/sandbox-core'; +import { ExportResultCode } from '@opentelemetry/sandbox-core'; import { ResourceMetrics } from '@opentelemetry/sandbox-sdk-metrics'; import * as assert from 'assert'; import * as sinon from 'sinon'; @@ -138,14 +138,9 @@ describe('OTLPMetricExporter - web', () => { ensureCounterIsCorrect( metric1, - hrTimeToNanoseconds( - metrics.scopeMetrics[0].metrics[counterIndex].dataPoints[0] - .endTime - ), - hrTimeToNanoseconds( - metrics.scopeMetrics[0].metrics[counterIndex].dataPoints[0] - .startTime - ) + metrics.scopeMetrics[0].metrics[counterIndex].dataPoints[0].endTime, + metrics.scopeMetrics[0].metrics[counterIndex].dataPoints[0] + .startTime ); assert.ok( @@ -154,14 +149,10 @@ describe('OTLPMetricExporter - web', () => { ); ensureObservableGaugeIsCorrect( metric2, - hrTimeToNanoseconds( - metrics.scopeMetrics[0].metrics[observableIndex].dataPoints[0] - .endTime - ), - hrTimeToNanoseconds( - metrics.scopeMetrics[0].metrics[observableIndex].dataPoints[0] - .startTime - ), + metrics.scopeMetrics[0].metrics[observableIndex].dataPoints[0] + .endTime, + metrics.scopeMetrics[0].metrics[observableIndex].dataPoints[0] + .startTime, 6, 'double-observable-gauge2' ); @@ -172,14 +163,10 @@ describe('OTLPMetricExporter - web', () => { ); ensureHistogramIsCorrect( metric3, - hrTimeToNanoseconds( - metrics.scopeMetrics[0].metrics[histogramIndex].dataPoints[0] - .endTime - ), - hrTimeToNanoseconds( - metrics.scopeMetrics[0].metrics[histogramIndex].dataPoints[0] - .startTime - ), + metrics.scopeMetrics[0].metrics[histogramIndex].dataPoints[0] + .endTime, + metrics.scopeMetrics[0].metrics[histogramIndex].dataPoints[0] + .startTime, [0, 100], [0, 2, 0] ); @@ -273,14 +260,9 @@ describe('OTLPMetricExporter - web', () => { assert.ok(typeof metric1 !== 'undefined', "metric doesn't exist"); ensureCounterIsCorrect( metric1, - hrTimeToNanoseconds( - metrics.scopeMetrics[0].metrics[counterIndex].dataPoints[0] - .endTime - ), - hrTimeToNanoseconds( - metrics.scopeMetrics[0].metrics[counterIndex].dataPoints[0] - .startTime - ) + metrics.scopeMetrics[0].metrics[counterIndex].dataPoints[0].endTime, + metrics.scopeMetrics[0].metrics[counterIndex].dataPoints[0] + .startTime ); assert.ok( @@ -289,14 +271,10 @@ describe('OTLPMetricExporter - web', () => { ); ensureObservableGaugeIsCorrect( metric2, - hrTimeToNanoseconds( - metrics.scopeMetrics[0].metrics[observableIndex].dataPoints[0] - .endTime - ), - hrTimeToNanoseconds( - metrics.scopeMetrics[0].metrics[observableIndex].dataPoints[0] - .startTime - ), + metrics.scopeMetrics[0].metrics[observableIndex].dataPoints[0] + .endTime, + metrics.scopeMetrics[0].metrics[observableIndex].dataPoints[0] + .startTime, 6, 'double-observable-gauge2' ); @@ -307,14 +285,10 @@ describe('OTLPMetricExporter - web', () => { ); ensureHistogramIsCorrect( metric3, - hrTimeToNanoseconds( - metrics.scopeMetrics[0].metrics[histogramIndex].dataPoints[0] - .endTime - ), - hrTimeToNanoseconds( - metrics.scopeMetrics[0].metrics[histogramIndex].dataPoints[0] - .startTime - ), + metrics.scopeMetrics[0].metrics[histogramIndex].dataPoints[0] + .endTime, + metrics.scopeMetrics[0].metrics[histogramIndex].dataPoints[0] + .startTime, [0, 100], [0, 2, 0] ); diff --git a/pkgs/exporters/otlp/metrics/http/test/metricsHelper.ts b/pkgs/exporters/otlp/metrics/http/test/metricsHelper.ts index 9b46e8023..5128bbb69 100644 --- a/pkgs/exporters/otlp/metrics/http/test/metricsHelper.ts +++ b/pkgs/exporters/otlp/metrics/http/test/metricsHelper.ts @@ -22,6 +22,7 @@ import { ObservableCounter, ObservableGauge, ObservableUpDownCounter, + HrTime, } from '@opentelemetry/sandbox-api'; import { Resource } from '@opentelemetry/sandbox-resources'; import * as assert from 'assert'; @@ -33,6 +34,7 @@ import { View, } from '@opentelemetry/sandbox-sdk-metrics'; import { + hrTimeToFixed64Nanos, IExportMetricsServiceRequest, IKeyValue, IMetric, @@ -205,28 +207,29 @@ export function ensureWebResourceIsCorrect(resource: IResource) { assert.strictEqual(resource.droppedAttributesCount, 0); } +function hrTimeToFixed64(hrTime: HrTime) { + const { low, high } = hrTimeToFixed64Nanos(hrTime); + return { low, high }; +} + export function ensureCounterIsCorrect( metric: IMetric, - time?: number, - startTime?: number + time: HrTime, + startTime: HrTime ) { - assert.deepStrictEqual(metric, { - name: 'int-counter', - description: 'sample counter description', - unit: '', - sum: { - dataPoints: [ - { - attributes: [], - asInt: 1, - startTimeUnixNano: startTime, - timeUnixNano: time, - }, - ], - isMonotonic: true, - aggregationTemporality: 2, - }, - }); + assert.strictEqual(metric.name, 'int-counter'); + assert.strictEqual(metric.description, 'sample counter description'); + assert.strictEqual(metric.unit, ''); + assert.strictEqual(metric.sum?.dataPoints.length, 1); + assert.strictEqual(metric.sum?.isMonotonic, true); + assert.strictEqual(metric.sum?.aggregationTemporality, 2); + + const [dp] = metric.sum.dataPoints; + + assert.deepStrictEqual(dp.attributes, []); + assert.strictEqual(dp.asInt, 1); + assert.deepStrictEqual(dp.startTimeUnixNano, hrTimeToFixed64(startTime)); + assert.deepStrictEqual(dp.timeUnixNano, hrTimeToFixed64(time)); } export function ensureDoubleCounterIsCorrect( @@ -255,108 +258,50 @@ export function ensureDoubleCounterIsCorrect( export function ensureObservableGaugeIsCorrect( metric: IMetric, - time: number, - startTime: number, + time: HrTime, + startTime: HrTime, value: number, name = 'double-observable-gauge' ) { - assert.deepStrictEqual(metric, { - name, - description: 'sample observable gauge description', - unit: '', - gauge: { - dataPoints: [ - { - attributes: [], - asDouble: value, - startTimeUnixNano: startTime, - timeUnixNano: time, - }, - ], - }, - }); -} + assert.strictEqual(metric.name, name); + assert.strictEqual(metric.description, 'sample observable gauge description'); + assert.strictEqual(metric.unit, ''); + assert.strictEqual(metric.gauge?.dataPoints.length, 1); -export function ensureObservableCounterIsCorrect( - metric: IMetric, - time: number, - startTime: number, - value: number, - name = 'double-observable-counter' -) { - assert.deepStrictEqual(metric, { - name, - description: 'sample observable counter description', - unit: '', - doubleSum: { - isMonotonic: true, - dataPoints: [ - { - attributes: [], - value, - startTimeUnixNano: startTime, - timeUnixNano: time, - }, - ], - aggregationTemporality: 2, - }, - }); -} + const [dp] = metric.gauge.dataPoints; -export function ensureObservableUpDownCounterIsCorrect( - metric: IMetric, - time: number, - startTime: number, - value: number, - name = 'double-up-down-observable-counter' -) { - assert.deepStrictEqual(metric, { - name, - description: 'sample observable up down counter description', - unit: '', - doubleSum: { - isMonotonic: false, - dataPoints: [ - { - labels: [], - value, - startTimeUnixNano: startTime, - timeUnixNano: time, - }, - ], - aggregationTemporality: 2, - }, - }); + assert.deepStrictEqual(dp.attributes, []); + assert.strictEqual(dp.asDouble, value); + + assert.deepStrictEqual(dp.startTimeUnixNano, hrTimeToFixed64(startTime)); + assert.deepStrictEqual(dp.timeUnixNano, hrTimeToFixed64(time)); } export function ensureHistogramIsCorrect( metric: IMetric, - time: number, - startTime: number, + time: HrTime, + startTime: HrTime, explicitBounds: (number | null)[] = [Infinity], bucketCounts: number[] = [2, 0] ) { - assert.deepStrictEqual(metric, { - name: 'int-histogram', - description: 'sample histogram description', - unit: '', - histogram: { - dataPoints: [ - { - attributes: [], - sum: 21, - count: 2, - min: 7, - max: 14, - startTimeUnixNano: startTime, - timeUnixNano: time, - bucketCounts, - explicitBounds, - }, - ], - aggregationTemporality: 2, - }, - }); + assert.strictEqual(metric.name, 'int-histogram'); + assert.strictEqual(metric.description, 'sample histogram description'); + assert.strictEqual(metric.unit, ''); + assert.strictEqual(metric.histogram?.dataPoints.length, 1); + assert.strictEqual(metric.histogram?.aggregationTemporality, 2); + + const [dp] = metric.histogram.dataPoints; + + assert.deepStrictEqual(dp.attributes, []); + assert.strictEqual(dp.sum, 21); + assert.strictEqual(dp.count, 2); + assert.strictEqual(dp.min, 7); + assert.strictEqual(dp.max, 14); + assert.deepStrictEqual(dp.bucketCounts, bucketCounts); + assert.deepStrictEqual(dp.explicitBounds, explicitBounds); + + assert.deepStrictEqual(dp.startTimeUnixNano, hrTimeToFixed64(startTime)); + assert.deepStrictEqual(dp.timeUnixNano, hrTimeToFixed64(time)); } export function ensureExportMetricsServiceRequestIsSet( diff --git a/pkgs/exporters/otlp/metrics/http/test/node/CollectorMetricExporter.test.ts b/pkgs/exporters/otlp/metrics/http/test/node/CollectorMetricExporter.test.ts index 83703937f..aad733295 100644 --- a/pkgs/exporters/otlp/metrics/http/test/node/CollectorMetricExporter.test.ts +++ b/pkgs/exporters/otlp/metrics/http/test/node/CollectorMetricExporter.test.ts @@ -491,13 +491,8 @@ describe('OTLPMetricExporter - node with json over http', () => { assert.ok(typeof metric1 !== 'undefined', "counter doesn't exist"); ensureCounterIsCorrect( metric1, - core.hrTimeToNanoseconds( - metrics.scopeMetrics[0].metrics[counterIndex].dataPoints[0].endTime - ), - core.hrTimeToNanoseconds( - metrics.scopeMetrics[0].metrics[counterIndex].dataPoints[0] - .startTime - ) + metrics.scopeMetrics[0].metrics[counterIndex].dataPoints[0].endTime, + metrics.scopeMetrics[0].metrics[counterIndex].dataPoints[0].startTime ); assert.ok( typeof metric2 !== 'undefined', @@ -505,28 +500,19 @@ describe('OTLPMetricExporter - node with json over http', () => { ); ensureObservableGaugeIsCorrect( metric2, - core.hrTimeToNanoseconds( - metrics.scopeMetrics[0].metrics[observableIndex].dataPoints[0] - .endTime - ), - core.hrTimeToNanoseconds( - metrics.scopeMetrics[0].metrics[observableIndex].dataPoints[0] - .startTime - ), + metrics.scopeMetrics[0].metrics[observableIndex].dataPoints[0] + .endTime, + metrics.scopeMetrics[0].metrics[observableIndex].dataPoints[0] + .startTime, 6, 'double-observable-gauge2' ); assert.ok(typeof metric3 !== 'undefined', "histogram doesn't exist"); ensureHistogramIsCorrect( metric3, - core.hrTimeToNanoseconds( - metrics.scopeMetrics[0].metrics[histogramIndex].dataPoints[0] - .endTime - ), - core.hrTimeToNanoseconds( - metrics.scopeMetrics[0].metrics[histogramIndex].dataPoints[0] - .startTime - ), + metrics.scopeMetrics[0].metrics[histogramIndex].dataPoints[0].endTime, + metrics.scopeMetrics[0].metrics[histogramIndex].dataPoints[0] + .startTime, [0, 100], [0, 2, 0] ); diff --git a/pkgs/exporters/otlp/trace/http/test/node/CollectorTraceExporter.test.ts b/pkgs/exporters/otlp/trace/http/test/node/CollectorTraceExporter.test.ts index 24f540cf3..58e97ed54 100644 --- a/pkgs/exporters/otlp/trace/http/test/node/CollectorTraceExporter.test.ts +++ b/pkgs/exporters/otlp/trace/http/test/node/CollectorTraceExporter.test.ts @@ -316,7 +316,6 @@ describe('OTLPTraceExporter - node with json over http', () => { fakeRequest.on('end', () => { const responseBody = buff.toString(); - const json = JSON.parse(responseBody) as IExportTraceServiceRequest; const span1 = json.resourceSpans?.[0].scopeSpans?.[0].spans?.[0]; assert.ok(typeof span1 !== 'undefined', "span doesn't exist"); diff --git a/pkgs/exporters/otlp/trace/http/test/traceHelper.ts b/pkgs/exporters/otlp/trace/http/test/traceHelper.ts index 9920b41c0..4a2b8a11a 100644 --- a/pkgs/exporters/otlp/trace/http/test/traceHelper.ts +++ b/pkgs/exporters/otlp/trace/http/test/traceHelper.ts @@ -31,6 +31,7 @@ import { ILink, IResource, ISpan, + UnsignedLong, } from '@opentelemetry/sandbox-otlp-transformer'; if (typeof Buffer === 'undefined') { @@ -243,54 +244,59 @@ export const multiInstrumentationLibraryTrace: ReadableSpan[] = [ }, ]; +function fixed64FromString(str: string) { + const { low, high } = UnsignedLong.fromString(str); + return { low, high }; +} + export function ensureEventsAreCorrect(events: IEvent[]) { assert.deepStrictEqual( events, [ { - timeUnixNano: 1574120165429803000, + timeUnixNano: fixed64FromString('1574120165429803070'), name: 'fetchStart', attributes: [], droppedAttributesCount: 0, }, { - timeUnixNano: 1574120165429803000, + timeUnixNano: fixed64FromString('1574120165429803070'), name: 'domainLookupStart', attributes: [], droppedAttributesCount: 0, }, { - timeUnixNano: 1574120165429803000, + timeUnixNano: fixed64FromString('1574120165429803070'), name: 'domainLookupEnd', attributes: [], droppedAttributesCount: 0, }, { - timeUnixNano: 1574120165429803000, + timeUnixNano: fixed64FromString('1574120165429803070'), name: 'connectStart', attributes: [], droppedAttributesCount: 0, }, { - timeUnixNano: 1574120165429803000, + timeUnixNano: fixed64FromString('1574120165429803070'), name: 'connectEnd', attributes: [], droppedAttributesCount: 0, }, { - timeUnixNano: 1574120165435513000, + timeUnixNano: fixed64FromString('1574120165435513070'), name: 'requestStart', attributes: [], droppedAttributesCount: 0, }, { - timeUnixNano: 1574120165436923100, + timeUnixNano: fixed64FromString('1574120165436923070'), name: 'responseStart', attributes: [], droppedAttributesCount: 0, }, { - timeUnixNano: 1574120165438688000, + timeUnixNano: fixed64FromString('1574120165438688070'), name: 'responseEnd', attributes: [], droppedAttributesCount: 0, @@ -364,14 +370,14 @@ export function ensureSpanIsCorrect(span: ISpan, useHex = true) { ); assert.strictEqual(span.name, 'documentFetch', 'name is wrong'); assert.strictEqual(span.kind, ESpanKind.SPAN_KIND_INTERNAL, 'kind is wrong'); - assert.strictEqual( + assert.deepStrictEqual( span.startTimeUnixNano, - 1574120165429803008, + fixed64FromString('1574120165429803070'), 'startTimeUnixNano is wrong' ); - assert.strictEqual( + assert.deepStrictEqual( span.endTimeUnixNano, - 1574120165438688000, + fixed64FromString('1574120165438688070'), 'endTimeUnixNano is wrong' ); assert.strictEqual( diff --git a/pkgs/exporters/otlp/trace/proto/test/traceHelper.ts b/pkgs/exporters/otlp/trace/proto/test/traceHelper.ts index 199a6a647..f096250ea 100644 --- a/pkgs/exporters/otlp/trace/proto/test/traceHelper.ts +++ b/pkgs/exporters/otlp/trace/proto/test/traceHelper.ts @@ -109,42 +109,42 @@ export function ensureProtoEventsAreCorrect(events: IEvent[]) { events, [ { - timeUnixNano: '1574120165429803008', + timeUnixNano: '1574120165429803070', name: 'fetchStart', droppedAttributesCount: 0, }, { - timeUnixNano: '1574120165429803008', + timeUnixNano: '1574120165429803070', name: 'domainLookupStart', droppedAttributesCount: 0, }, { - timeUnixNano: '1574120165429803008', + timeUnixNano: '1574120165429803070', name: 'domainLookupEnd', droppedAttributesCount: 0, }, { - timeUnixNano: '1574120165429803008', + timeUnixNano: '1574120165429803070', name: 'connectStart', droppedAttributesCount: 0, }, { - timeUnixNano: '1574120165429803008', + timeUnixNano: '1574120165429803070', name: 'connectEnd', droppedAttributesCount: 0, }, { - timeUnixNano: '1574120165435513088', + timeUnixNano: '1574120165435513070', name: 'requestStart', droppedAttributesCount: 0, }, { - timeUnixNano: '1574120165436923136', + timeUnixNano: '1574120165436923070', name: 'responseStart', droppedAttributesCount: 0, }, { - timeUnixNano: '1574120165438688000', + timeUnixNano: '1574120165438688070', name: 'responseEnd', droppedAttributesCount: 0, }, @@ -219,12 +219,12 @@ export function ensureProtoSpanIsCorrect(span: ISpan) { assert.strictEqual(span.kind, 'SPAN_KIND_INTERNAL', 'kind is wrong'); assert.strictEqual( span.startTimeUnixNano, - '1574120165429803008', + '1574120165429803070', 'startTimeUnixNano is wrong' ); assert.strictEqual( span.endTimeUnixNano, - '1574120165438688000', + '1574120165438688070', 'endTimeUnixNano is wrong' ); assert.strictEqual( diff --git a/pkgs/exporters/otlp/transformer/src/common/index.ts b/pkgs/exporters/otlp/transformer/src/common/index.ts new file mode 100644 index 000000000..ca2f86e8f --- /dev/null +++ b/pkgs/exporters/otlp/transformer/src/common/index.ts @@ -0,0 +1,29 @@ +/* + * Copyright The OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { IFixed64 } from './types'; +import { HrTime } from '@opentelemetry/sandbox-api'; +import { UnsignedLong } from './unsigned_long'; + +export * from './unsigned_long'; + +const NANOSECONDS = UnsignedLong.fromU32(1_000_000_000); + +export function hrTimeToFixed64Nanos(hrTime: HrTime): IFixed64 { + return UnsignedLong.fromU32(hrTime[0]) + .multiply(NANOSECONDS) + .add(UnsignedLong.fromU32(hrTime[1])); +} diff --git a/pkgs/exporters/otlp/transformer/src/common/types.ts b/pkgs/exporters/otlp/transformer/src/common/types.ts index 159a595ba..6236da4ce 100644 --- a/pkgs/exporters/otlp/transformer/src/common/types.ts +++ b/pkgs/exporters/otlp/transformer/src/common/types.ts @@ -73,3 +73,8 @@ export interface IKeyValueList { /** KeyValueList values */ values: IKeyValue[]; } + +export interface IFixed64 { + low: number; + high: number; +} diff --git a/pkgs/exporters/otlp/transformer/src/common/unsigned_long.ts b/pkgs/exporters/otlp/transformer/src/common/unsigned_long.ts new file mode 100644 index 000000000..d2802e3ba --- /dev/null +++ b/pkgs/exporters/otlp/transformer/src/common/unsigned_long.ts @@ -0,0 +1,122 @@ +/* + * Copyright 2009 The Closure Library Authors + * Copyright 2020 Daniel Wirtz / The long.js Authors. + * Copyright The OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Original version by long.js: https://github.com/dcodeIO/long.js/ + +const TWO_PWR_32 = (1 << 16) * (1 << 16); + +export class UnsignedLong { + low: number; + high: number; + + constructor(low: number, high: number) { + this.low = low; + this.high = high; + } + + static fromU32(value: number): UnsignedLong { + return new UnsignedLong(value % TWO_PWR_32 | 0, 0); + } + + multiply(value: UnsignedLong): UnsignedLong { + const a48 = this.high >>> 16; + const a32 = this.high & 0xffff; + const a16 = this.low >>> 16; + const a00 = this.low & 0xffff; + + const b48 = value.high >>> 16; + const b32 = value.high & 0xffff; + const b16 = value.low >>> 16; + const b00 = value.low & 0xffff; + + let c48 = 0; + let c32 = 0; + let c16 = 0; + let c00 = 0; + c00 += a00 * b00; + c16 += c00 >>> 16; + c00 &= 0xffff; + c16 += a16 * b00; + c32 += c16 >>> 16; + c16 &= 0xffff; + c16 += a00 * b16; + c32 += c16 >>> 16; + c16 &= 0xffff; + c32 += a32 * b00; + c48 += c32 >>> 16; + c32 &= 0xffff; + c32 += a16 * b16; + c48 += c32 >>> 16; + c32 &= 0xffff; + c32 += a00 * b32; + c48 += c32 >>> 16; + c32 &= 0xffff; + c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48; + c48 &= 0xffff; + + return new UnsignedLong((c16 << 16) | c00, (c48 << 16) | c32); + } + + add(value: UnsignedLong): UnsignedLong { + const a48 = this.high >>> 16; + const a32 = this.high & 0xffff; + const a16 = this.low >>> 16; + const a00 = this.low & 0xffff; + + const b48 = value.high >>> 16; + const b32 = value.high & 0xffff; + const b16 = value.low >>> 16; + const b00 = value.low & 0xffff; + + let c48 = 0; + let c32 = 0; + let c16 = 0; + let c00 = 0; + c00 += a00 + b00; + c16 += c00 >>> 16; + c00 &= 0xffff; + c16 += a16 + b16; + c32 += c16 >>> 16; + c16 &= 0xffff; + c32 += a32 + b32; + c48 += c32 >>> 16; + c32 &= 0xffff; + c48 += a48 + b48; + c48 &= 0xffff; + + return new UnsignedLong((c16 << 16) | c00, (c48 << 16) | c32); + } + + static fromString(str: string): UnsignedLong { + let result = UnsignedLong.fromU32(0); + + for (let i = 0; i < str.length; i += 8) { + const size = Math.min(8, str.length - i); + const value = parseInt(str.substring(i, i + size)); + if (size < 8) { + const power = UnsignedLong.fromU32(Math.pow(10, size)); + result = result.multiply(power).add(UnsignedLong.fromU32(value)); + } else { + result = result.multiply(UnsignedLong.fromU32(100_000_000)); + result = result.add(UnsignedLong.fromU32(value)); + } + } + + return result; + } +} diff --git a/pkgs/exporters/otlp/transformer/src/index.ts b/pkgs/exporters/otlp/transformer/src/index.ts index a8e388e33..9c325644d 100644 --- a/pkgs/exporters/otlp/transformer/src/index.ts +++ b/pkgs/exporters/otlp/transformer/src/index.ts @@ -15,6 +15,7 @@ */ export * from './common/types'; +export * from './common'; export * from './metrics/types'; export * from './resource/types'; export * from './trace/types'; diff --git a/pkgs/exporters/otlp/transformer/src/logs/index.ts b/pkgs/exporters/otlp/transformer/src/logs/index.ts index 9a0b13a74..edfc27b9c 100644 --- a/pkgs/exporters/otlp/transformer/src/logs/index.ts +++ b/pkgs/exporters/otlp/transformer/src/logs/index.ts @@ -22,8 +22,9 @@ import { IResourceLogs, } from './types'; import { IResource } from '@opentelemetry/sandbox-resources'; +import { hrTimeToFixed64Nanos } from '../common'; import { toAnyValue, toAttributes, toKeyValue } from '../common/internal'; -import { hexToBase64, hrTimeToNanoseconds } from '@opentelemetry/sandbox-core'; +import { hexToBase64 } from '@opentelemetry/sandbox-core'; import { SeverityNumber } from '@opentelemetry/sandbox-api-logs'; import { IKeyValue } from '../common/types'; import { LogAttributes } from '@opentelemetry/sandbox-api-logs'; @@ -94,8 +95,8 @@ function logRecordsToResourceLogs( function toLogRecord(log: ReadableLogRecord, useHex?: boolean): ILogRecord { return { - timeUnixNano: hrTimeToNanoseconds(log.hrTime), - observedTimeUnixNano: hrTimeToNanoseconds(log.hrTimeObserved), + timeUnixNano: hrTimeToFixed64Nanos(log.hrTime), + observedTimeUnixNano: hrTimeToFixed64Nanos(log.hrTimeObserved), severityNumber: toSeverityNumber(log.severityNumber), severityText: log.severityText, body: toAnyValue(log.body), diff --git a/pkgs/exporters/otlp/transformer/src/logs/types.ts b/pkgs/exporters/otlp/transformer/src/logs/types.ts index 05709af6f..7704c3708 100644 --- a/pkgs/exporters/otlp/transformer/src/logs/types.ts +++ b/pkgs/exporters/otlp/transformer/src/logs/types.ts @@ -16,6 +16,7 @@ import type { IAnyValue, + IFixed64, IInstrumentationScope, IKeyValue, } from '../common/types'; @@ -67,10 +68,10 @@ export interface IScopeLogs { /** Properties of a LogRecord. */ export interface ILogRecord { /** LogRecord timeUnixNano */ - timeUnixNano: number; + timeUnixNano: IFixed64; /** LogRecord observedTimeUnixNano */ - observedTimeUnixNano: number; + observedTimeUnixNano: IFixed64; /** LogRecord severityNumber */ severityNumber?: ESeverityNumber; diff --git a/pkgs/exporters/otlp/transformer/src/metrics/internal.ts b/pkgs/exporters/otlp/transformer/src/metrics/internal.ts index eb9b3eb86..0228cef75 100644 --- a/pkgs/exporters/otlp/transformer/src/metrics/internal.ts +++ b/pkgs/exporters/otlp/transformer/src/metrics/internal.ts @@ -14,7 +14,6 @@ * limitations under the License. */ import { ValueType } from '@opentelemetry/sandbox-api'; -import { hrTimeToNanoseconds } from '@opentelemetry/sandbox-core'; import { AggregationTemporality, DataPoint, @@ -25,6 +24,7 @@ import { ResourceMetrics, ScopeMetrics, } from '@opentelemetry/sandbox-sdk-metrics'; +import { hrTimeToFixed64Nanos } from '../common'; import { toAttributes } from '../common/internal'; import { EAggregationTemporality, @@ -112,8 +112,8 @@ function toSingularDataPoint( ) { const out: INumberDataPoint = { attributes: toAttributes(dataPoint.attributes), - startTimeUnixNano: hrTimeToNanoseconds(dataPoint.startTime), - timeUnixNano: hrTimeToNanoseconds(dataPoint.endTime), + startTimeUnixNano: hrTimeToFixed64Nanos(dataPoint.startTime), + timeUnixNano: hrTimeToFixed64Nanos(dataPoint.endTime), }; switch (valueType) { @@ -145,8 +145,8 @@ function toHistogramDataPoints(metricData: MetricData): IHistogramDataPoint[] { sum: histogram.sum, min: histogram.min, max: histogram.max, - startTimeUnixNano: hrTimeToNanoseconds(dataPoint.startTime), - timeUnixNano: hrTimeToNanoseconds(dataPoint.endTime), + startTimeUnixNano: hrTimeToFixed64Nanos(dataPoint.startTime), + timeUnixNano: hrTimeToFixed64Nanos(dataPoint.endTime), }; }); } @@ -172,8 +172,8 @@ function toExponentialHistogramDataPoints( }, scale: histogram.scale, zeroCount: histogram.zeroCount, - startTimeUnixNano: hrTimeToNanoseconds(dataPoint.startTime), - timeUnixNano: hrTimeToNanoseconds(dataPoint.endTime), + startTimeUnixNano: hrTimeToFixed64Nanos(dataPoint.startTime), + timeUnixNano: hrTimeToFixed64Nanos(dataPoint.endTime), }; }); } diff --git a/pkgs/exporters/otlp/transformer/src/metrics/types.ts b/pkgs/exporters/otlp/transformer/src/metrics/types.ts index 2728ab1ab..65a234851 100644 --- a/pkgs/exporters/otlp/transformer/src/metrics/types.ts +++ b/pkgs/exporters/otlp/transformer/src/metrics/types.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { IInstrumentationScope, IKeyValue } from '../common/types'; +import { IFixed64, IInstrumentationScope, IKeyValue } from '../common/types'; import { IResource } from '../resource/types'; /** Properties of an ExportMetricsServiceRequest. */ @@ -134,10 +134,10 @@ export interface INumberDataPoint { attributes: IKeyValue[]; /** NumberDataPoint startTimeUnixNano */ - startTimeUnixNano?: number; + startTimeUnixNano?: IFixed64 | string; /** NumberDataPoint timeUnixNano */ - timeUnixNano?: number; + timeUnixNano?: IFixed64 | string; /** NumberDataPoint asDouble */ asDouble?: number | null; @@ -158,10 +158,10 @@ export interface IHistogramDataPoint { attributes?: IKeyValue[]; /** HistogramDataPoint startTimeUnixNano */ - startTimeUnixNano?: number; + startTimeUnixNano?: IFixed64 | string; /** HistogramDataPoint timeUnixNano */ - timeUnixNano?: number; + timeUnixNano?: IFixed64 | string; /** HistogramDataPoint count */ count?: number; @@ -194,10 +194,10 @@ export interface IExponentialHistogramDataPoint { attributes?: IKeyValue[]; /** ExponentialHistogramDataPoint startTimeUnixNano */ - startTimeUnixNano?: number; + startTimeUnixNano?: IFixed64 | string; /** ExponentialHistogramDataPoint timeUnixNano */ - timeUnixNano?: number; + timeUnixNano?: IFixed64 | string; /** ExponentialHistogramDataPoint count */ count?: number; diff --git a/pkgs/exporters/otlp/transformer/src/trace/internal.ts b/pkgs/exporters/otlp/transformer/src/trace/internal.ts index f1e45bb5e..773d1ba3d 100644 --- a/pkgs/exporters/otlp/transformer/src/trace/internal.ts +++ b/pkgs/exporters/otlp/transformer/src/trace/internal.ts @@ -14,8 +14,8 @@ * limitations under the License. */ import type { Link } from '@opentelemetry/sandbox-api'; -import { hrTimeToNanoseconds } from '@opentelemetry/sandbox-core'; import type { ReadableSpan, TimedEvent } from '@opentelemetry/sandbox-sdk-trace-base'; +import { hrTimeToFixed64Nanos } from '../common'; import { toAttributes } from '../common/internal'; import { EStatusCode, IEvent, ILink, ISpan } from './types'; import * as core from '@opentelemetry/sandbox-core'; @@ -36,8 +36,8 @@ export function sdkSpanToOtlpSpan(span: ReadableSpan, useHex?: boolean): ISpan { name: span.name, // Span kind is offset by 1 because the API does not define a value for unset kind: span.kind == null ? 0 : span.kind + 1, - startTimeUnixNano: hrTimeToNanoseconds(span.startTime), - endTimeUnixNano: hrTimeToNanoseconds(span.endTime), + startTimeUnixNano: hrTimeToFixed64Nanos(span.startTime), + endTimeUnixNano: hrTimeToFixed64Nanos(span.endTime), attributes: toAttributes(span.attributes), droppedAttributesCount: span.droppedAttributesCount, events: span.events.map(toOtlpSpanEvent), @@ -72,7 +72,7 @@ export function toOtlpSpanEvent(timedEvent: TimedEvent): IEvent { ? toAttributes(timedEvent.attributes) : [], name: timedEvent.name, - timeUnixNano: hrTimeToNanoseconds(timedEvent.time), + timeUnixNano: hrTimeToFixed64Nanos(timedEvent.time), droppedAttributesCount: timedEvent.droppedAttributesCount || 0, }; } diff --git a/pkgs/exporters/otlp/transformer/src/trace/types.ts b/pkgs/exporters/otlp/transformer/src/trace/types.ts index a6cfb82ad..294f45652 100644 --- a/pkgs/exporters/otlp/transformer/src/trace/types.ts +++ b/pkgs/exporters/otlp/transformer/src/trace/types.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { IInstrumentationScope, IKeyValue } from '../common/types'; +import { IFixed64, IInstrumentationScope, IKeyValue } from '../common/types'; import { IResource } from '../resource/types'; /** Properties of an ExportTraceServiceRequest. */ @@ -81,10 +81,10 @@ export interface ISpan { kind: ESpanKind; /** Span startTimeUnixNano */ - startTimeUnixNano: number; + startTimeUnixNano: IFixed64; /** Span endTimeUnixNano */ - endTimeUnixNano: number; + endTimeUnixNano: IFixed64; /** Span attributes */ attributes: IKeyValue[]; @@ -166,7 +166,7 @@ export const enum EStatusCode { /** Properties of an Event. */ export interface IEvent { /** Event timeUnixNano */ - timeUnixNano: number; + timeUnixNano: IFixed64; /** Event name */ name: string; diff --git a/pkgs/exporters/otlp/transformer/test/logs.test.ts b/pkgs/exporters/otlp/transformer/test/logs.test.ts index e7dcde14a..19ad64e4e 100644 --- a/pkgs/exporters/otlp/transformer/test/logs.test.ts +++ b/pkgs/exporters/otlp/transformer/test/logs.test.ts @@ -21,6 +21,7 @@ import { createExportLogsServiceRequest, ESeverityNumber, IExportLogsServiceRequest, + UnsignedLong, } from '../src'; import { ReadableLogRecord } from '@opentelemetry/sandbox-sdk-logs'; import { SeverityNumber } from '@opentelemetry/sandbox-api-logs'; @@ -49,10 +50,8 @@ function createExpectedLogJson(useHex: boolean): IExportLogsServiceRequest { scope: { name: 'scope_name_1', version: '0.1.0' }, logRecords: [ { - // eslint-disable-next-line @typescript-eslint/no-loss-of-precision - timeUnixNano: 1680253513123241635, - // eslint-disable-next-line @typescript-eslint/no-loss-of-precision - observedTimeUnixNano: 1683526948965142784, + timeUnixNano: new UnsignedLong(-162521437, 391214506), + observedTimeUnixNano: new UnsignedLong(584929536, 391976663), severityNumber: ESeverityNumber.SEVERITY_NUMBER_ERROR, severityText: 'error', body: { stringValue: 'some_log_body' }, diff --git a/pkgs/exporters/otlp/transformer/test/metrics.test.ts b/pkgs/exporters/otlp/transformer/test/metrics.test.ts index 34ef32dd2..aa5c8fb47 100644 --- a/pkgs/exporters/otlp/transformer/test/metrics.test.ts +++ b/pkgs/exporters/otlp/transformer/test/metrics.test.ts @@ -25,7 +25,8 @@ import { import * as assert from 'assert'; import { createExportMetricsServiceRequest } from '../src/metrics'; import { EAggregationTemporality } from '../src/metrics/types'; -import { hrTime, hrTimeToNanoseconds } from '@opentelemetry/sandbox-core'; +import { hrTime } from '@opentelemetry/sandbox-core'; +import { hrTimeToFixed64Nanos } from '../src/common'; const START_TIME = hrTime(); const END_TIME = hrTime(); @@ -350,8 +351,8 @@ describe('Metrics', () => { dataPoints: [ { attributes: expectedAttributes, - startTimeUnixNano: hrTimeToNanoseconds(START_TIME), - timeUnixNano: hrTimeToNanoseconds(END_TIME), + startTimeUnixNano: hrTimeToFixed64Nanos(START_TIME), + timeUnixNano: hrTimeToFixed64Nanos(END_TIME), asInt: 10, }, ], @@ -393,8 +394,8 @@ describe('Metrics', () => { dataPoints: [ { attributes: expectedAttributes, - startTimeUnixNano: hrTimeToNanoseconds(START_TIME), - timeUnixNano: hrTimeToNanoseconds(END_TIME), + startTimeUnixNano: hrTimeToFixed64Nanos(START_TIME), + timeUnixNano: hrTimeToFixed64Nanos(END_TIME), asInt: 10, }, ], @@ -437,8 +438,8 @@ describe('Metrics', () => { dataPoints: [ { attributes: expectedAttributes, - startTimeUnixNano: hrTimeToNanoseconds(START_TIME), - timeUnixNano: hrTimeToNanoseconds(END_TIME), + startTimeUnixNano: hrTimeToFixed64Nanos(START_TIME), + timeUnixNano: hrTimeToFixed64Nanos(END_TIME), asInt: 10, }, ], @@ -481,8 +482,8 @@ describe('Metrics', () => { dataPoints: [ { attributes: expectedAttributes, - startTimeUnixNano: hrTimeToNanoseconds(START_TIME), - timeUnixNano: hrTimeToNanoseconds(END_TIME), + startTimeUnixNano: hrTimeToFixed64Nanos(START_TIME), + timeUnixNano: hrTimeToFixed64Nanos(END_TIME), asInt: 10, }, ], @@ -523,8 +524,8 @@ describe('Metrics', () => { dataPoints: [ { attributes: expectedAttributes, - startTimeUnixNano: hrTimeToNanoseconds(START_TIME), - timeUnixNano: hrTimeToNanoseconds(END_TIME), + startTimeUnixNano: hrTimeToFixed64Nanos(START_TIME), + timeUnixNano: hrTimeToFixed64Nanos(END_TIME), asDouble: 10.5, }, ], @@ -581,8 +582,8 @@ describe('Metrics', () => { sum: 9, min: 1, max: 8, - startTimeUnixNano: hrTimeToNanoseconds(START_TIME), - timeUnixNano: hrTimeToNanoseconds(END_TIME), + startTimeUnixNano: hrTimeToFixed64Nanos(START_TIME), + timeUnixNano: hrTimeToFixed64Nanos(END_TIME), }, ], }, @@ -635,8 +636,8 @@ describe('Metrics', () => { sum: 9, min: undefined, max: undefined, - startTimeUnixNano: hrTimeToNanoseconds(START_TIME), - timeUnixNano: hrTimeToNanoseconds(END_TIME), + startTimeUnixNano: hrTimeToFixed64Nanos(START_TIME), + timeUnixNano: hrTimeToFixed64Nanos(END_TIME), }, ], }, @@ -701,8 +702,8 @@ describe('Metrics', () => { bucketCounts: [1, 0, 0, 0, 1, 0, 1, 0], }, negative: { offset: 0, bucketCounts: [0] }, - startTimeUnixNano: hrTimeToNanoseconds(START_TIME), - timeUnixNano: hrTimeToNanoseconds(END_TIME), + startTimeUnixNano: hrTimeToFixed64Nanos(START_TIME), + timeUnixNano: hrTimeToFixed64Nanos(END_TIME), }, ], }, @@ -763,8 +764,8 @@ describe('Metrics', () => { bucketCounts: [1, 0, 0, 0, 1, 0, 1, 0], }, negative: { offset: 0, bucketCounts: [0] }, - startTimeUnixNano: hrTimeToNanoseconds(START_TIME), - timeUnixNano: hrTimeToNanoseconds(END_TIME), + startTimeUnixNano: hrTimeToFixed64Nanos(START_TIME), + timeUnixNano: hrTimeToFixed64Nanos(END_TIME), }, ], }, diff --git a/pkgs/exporters/otlp/transformer/test/trace.test.ts b/pkgs/exporters/otlp/transformer/test/trace.test.ts index 371c554ff..9a702fb94 100644 --- a/pkgs/exporters/otlp/transformer/test/trace.test.ts +++ b/pkgs/exporters/otlp/transformer/test/trace.test.ts @@ -22,6 +22,7 @@ import { createExportTraceServiceRequest, ESpanKind, EStatusCode, + UnsignedLong, } from '../src'; function createExpectedSpanJson(useHex: boolean) { @@ -79,10 +80,8 @@ function createExpectedSpanJson(useHex: boolean) { ], }, ], - // eslint-disable-next-line @typescript-eslint/no-loss-of-precision - startTimeUnixNano: 1640715557342725388, - // eslint-disable-next-line @typescript-eslint/no-loss-of-precision - endTimeUnixNano: 1640715558642725388, + startTimeUnixNano: new UnsignedLong(1155450124, 382008859), + endTimeUnixNano: new UnsignedLong(-1839517172, 382008859), events: [ { droppedAttributesCount: 0, @@ -95,7 +94,7 @@ function createExpectedSpanJson(useHex: boolean) { }, ], name: 'some event', - timeUnixNano: 1640715558542725400, + timeUnixNano: new UnsignedLong(-1939517172, 382008859), }, ], attributes: [ diff --git a/pkgs/exporters/zipkin/src/transform.ts b/pkgs/exporters/zipkin/src/transform.ts index 6b9a5b392..2fe6fd255 100644 --- a/pkgs/exporters/zipkin/src/transform.ts +++ b/pkgs/exporters/zipkin/src/transform.ts @@ -111,7 +111,7 @@ export function _toZipkinAnnotations( events: TimedEvent[] ): zipkinTypes.Annotation[] { return events.map(event => ({ - timestamp: hrTimeToMicroseconds(event.time), + timestamp: Math.round(hrTimeToMicroseconds(event.time)), value: event.name, })); } diff --git a/pkgs/exporters/zipkin/test/common/transform.test.ts b/pkgs/exporters/zipkin/test/common/transform.test.ts index 2495a8dce..ebcdeac05 100644 --- a/pkgs/exporters/zipkin/test/common/transform.test.ts +++ b/pkgs/exporters/zipkin/test/common/transform.test.ts @@ -82,7 +82,7 @@ describe('transform', () => { annotations: [ { value: 'my-event', - timestamp: hrTimeToMicroseconds(span.events[0].time), + timestamp: Math.round(hrTimeToMicroseconds(span.events[0].time)), }, ], duration: Math.round( @@ -329,11 +329,11 @@ describe('transform', () => { assert.deepStrictEqual(annotations, [ { value: 'my-event1', - timestamp: hrTimeToMicroseconds(span.events[0].time), + timestamp: Math.round(hrTimeToMicroseconds(span.events[0].time)), }, { value: 'my-event2', - timestamp: hrTimeToMicroseconds(span.events[1].time), + timestamp: Math.round(hrTimeToMicroseconds(span.events[1].time)), }, ]); }); diff --git a/pkgs/instrumentations/instrumentation/package.json b/pkgs/instrumentations/instrumentation/package.json index f45edf591..abaaa85dd 100644 --- a/pkgs/instrumentations/instrumentation/package.json +++ b/pkgs/instrumentations/instrumentation/package.json @@ -92,7 +92,7 @@ "@types/jquery": "^3.5.14", "@types/mocha": "^10.0.0", "@types/node": "^18.14.2", - "@types/semver": "7.5.2", + "@types/semver": "7.5.3", "@types/sinon": "^10.0.13", "@types/webpack-env": "1.16.3", "@typescript-eslint/eslint-plugin": "5.59.11", diff --git a/pkgs/sdk/logs/src/LogRecord.ts b/pkgs/sdk/logs/src/LogRecord.ts index 2b7e31a95..93ec7348a 100644 --- a/pkgs/sdk/logs/src/LogRecord.ts +++ b/pkgs/sdk/logs/src/LogRecord.ts @@ -26,8 +26,8 @@ import type { IResource } from '@opentelemetry/sandbox-resources'; import type { ReadableLogRecord } from './export/ReadableLogRecord'; import type { LogRecordLimits } from './types'; -import { Logger } from './Logger'; import { LogAttributes } from '@opentelemetry/sandbox-api-logs'; +import { LoggerProviderSharedState } from './internal/LoggerProviderSharedState'; export class LogRecord implements ReadableLogRecord { readonly hrTime: api.HrTime; @@ -41,7 +41,7 @@ export class LogRecord implements ReadableLogRecord { private _body?: string; private _isReadonly: boolean = false; - private readonly _logRecordLimits: LogRecordLimits; + private readonly _logRecordLimits: Required; set severityText(severityText: string | undefined) { if (this._isLogRecordReadonly()) { @@ -73,7 +73,11 @@ export class LogRecord implements ReadableLogRecord { return this._body; } - constructor(logger: Logger, logRecord: logsAPI.LogRecord) { + constructor( + _sharedState: LoggerProviderSharedState, + instrumentationScope: InstrumentationScope, + logRecord: logsAPI.LogRecord + ) { const { timestamp, observedTimestamp, @@ -97,9 +101,9 @@ export class LogRecord implements ReadableLogRecord { this.severityNumber = severityNumber; this.severityText = severityText; this.body = body; - this.resource = logger.resource; - this.instrumentationScope = logger.instrumentationScope; - this._logRecordLimits = logger.getLogRecordLimits(); + this.resource = _sharedState.resource; + this.instrumentationScope = instrumentationScope; + this._logRecordLimits = _sharedState.logRecordLimits; this.setAttributes(attributes); } @@ -127,7 +131,7 @@ export class LogRecord implements ReadableLogRecord { } if ( Object.keys(this.attributes).length >= - this._logRecordLimits.attributeCountLimit! && + this._logRecordLimits.attributeCountLimit && !Object.prototype.hasOwnProperty.call(this.attributes, key) ) { return this; @@ -159,15 +163,16 @@ export class LogRecord implements ReadableLogRecord { } /** + * @internal * A LogRecordProcessor may freely modify logRecord for the duration of the OnEmit call. * If logRecord is needed after OnEmit returns (i.e. for asynchronous processing) only reads are permitted. */ - public makeReadonly() { + _makeReadonly() { this._isReadonly = true; } private _truncateToSize(value: AttributeValue): AttributeValue { - const limit = this._logRecordLimits.attributeValueLengthLimit || 0; + const limit = this._logRecordLimits.attributeValueLengthLimit; // Check limit if (limit <= 0) { // Negative values are invalid, so do not truncate diff --git a/pkgs/sdk/logs/src/Logger.ts b/pkgs/sdk/logs/src/Logger.ts index c612cde2c..2f64618ad 100644 --- a/pkgs/sdk/logs/src/Logger.ts +++ b/pkgs/sdk/logs/src/Logger.ts @@ -15,28 +15,17 @@ */ import type * as logsAPI from '@opentelemetry/sandbox-api-logs'; -import type { IResource } from '@opentelemetry/sandbox-resources'; import type { InstrumentationScope } from '@opentelemetry/sandbox-core'; import { context } from '@opentelemetry/sandbox-api'; -import type { LoggerConfig, LogRecordLimits } from './types'; import { LogRecord } from './LogRecord'; -import { LoggerProvider } from './LoggerProvider'; -import { mergeConfig } from './config'; -import { LogRecordProcessor } from './LogRecordProcessor'; +import { LoggerProviderSharedState } from './internal/LoggerProviderSharedState'; export class Logger implements logsAPI.Logger { - public readonly resource: IResource; - private readonly _loggerConfig: Required; - constructor( public readonly instrumentationScope: InstrumentationScope, - config: LoggerConfig, - private _loggerProvider: LoggerProvider - ) { - this._loggerConfig = mergeConfig(config); - this.resource = _loggerProvider.resource; - } + private _sharedState: LoggerProviderSharedState + ) {} public emit(logRecord: logsAPI.LogRecord): void { const currentContext = logRecord.context || context.active(); @@ -45,30 +34,23 @@ export class Logger implements logsAPI.Logger { * the LogRecords it emits MUST automatically include the Trace Context from the active Context, * if Context has not been explicitly set. */ - const logRecordInstance = new LogRecord(this, { - context: currentContext, - ...logRecord, - }); + const logRecordInstance = new LogRecord( + this._sharedState, + this.instrumentationScope, + { + context: currentContext, + ...logRecord, + } + ); /** * the explicitly passed Context, * the current Context, or an empty Context if the Logger was obtained with include_trace_context=false */ - this.getActiveLogRecordProcessor().onEmit( - logRecordInstance, - currentContext - ); + this._sharedState.activeProcessor.onEmit(logRecordInstance, currentContext); /** * A LogRecordProcessor may freely modify logRecord for the duration of the OnEmit call. * If logRecord is needed after OnEmit returns (i.e. for asynchronous processing) only reads are permitted. */ - logRecordInstance.makeReadonly(); - } - - public getLogRecordLimits(): LogRecordLimits { - return this._loggerConfig.logRecordLimits; - } - - public getActiveLogRecordProcessor(): LogRecordProcessor { - return this._loggerProvider.getActiveLogRecordProcessor(); + logRecordInstance._makeReadonly(); } } diff --git a/pkgs/sdk/logs/src/LoggerProvider.ts b/pkgs/sdk/logs/src/LoggerProvider.ts index da83039c4..f167e8cbf 100644 --- a/pkgs/sdk/logs/src/LoggerProvider.ts +++ b/pkgs/sdk/logs/src/LoggerProvider.ts @@ -16,7 +16,7 @@ import { diag } from '@opentelemetry/sandbox-api'; import type * as logsAPI from '@opentelemetry/sandbox-api-logs'; import { NOOP_LOGGER } from '@opentelemetry/sandbox-api-logs'; -import { IResource, Resource } from '@opentelemetry/sandbox-resources'; +import { Resource } from '@opentelemetry/sandbox-resources'; import { BindOnceFuture, merge } from '@opentelemetry/sandbox-core'; import type { LoggerProviderConfig } from './types'; @@ -24,39 +24,26 @@ import type { LogRecordProcessor } from './LogRecordProcessor'; import { Logger } from './Logger'; import { loadDefaultConfig, reconfigureLimits } from './config'; import { MultiLogRecordProcessor } from './MultiLogRecordProcessor'; -import { NoopLogRecordProcessor } from './export/NoopLogRecordProcessor'; +import { LoggerProviderSharedState } from './internal/LoggerProviderSharedState'; export const DEFAULT_LOGGER_NAME = 'unknown'; export class LoggerProvider implements logsAPI.LoggerProvider { - public readonly resource: IResource; - - private readonly _loggers: Map = new Map(); - private _activeProcessor: MultiLogRecordProcessor; - private readonly _registeredLogRecordProcessors: LogRecordProcessor[] = []; - private readonly _config: LoggerProviderConfig; private _shutdownOnce: BindOnceFuture; + private readonly _sharedState: LoggerProviderSharedState; constructor(config: LoggerProviderConfig = {}) { const { - resource = Resource.empty(), + resource = Resource.default(), logRecordLimits, forceFlushTimeoutMillis, - } = merge({}, loadDefaultConfig(), reconfigureLimits(config)); - this.resource = Resource.default().merge(resource); - this._config = { - logRecordLimits, - resource: this.resource, + } = merge({}, loadDefaultConfig(), config); + this._sharedState = new LoggerProviderSharedState( + resource, forceFlushTimeoutMillis, - }; - - this._shutdownOnce = new BindOnceFuture(this._shutdown, this); - - // add a default processor: NoopLogRecordProcessor - this._activeProcessor = new MultiLogRecordProcessor( - [new NoopLogRecordProcessor()], - forceFlushTimeoutMillis + reconfigureLimits(logRecordLimits) ); + this._shutdownOnce = new BindOnceFuture(this._shutdown, this); } /** @@ -77,19 +64,17 @@ export class LoggerProvider implements logsAPI.LoggerProvider { } const loggerName = name || DEFAULT_LOGGER_NAME; const key = `${loggerName}@${version || ''}:${options?.schemaUrl || ''}`; - if (!this._loggers.has(key)) { - this._loggers.set( + if (!this._sharedState.loggers.has(key)) { + this._sharedState.loggers.set( key, new Logger( { name: loggerName, version, schemaUrl: options?.schemaUrl }, - { - logRecordLimits: this._config.logRecordLimits, - }, - this + this._sharedState ) ); } - return this._loggers.get(key)!; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + return this._sharedState.loggers.get(key)!; } /** @@ -97,10 +82,10 @@ export class LoggerProvider implements logsAPI.LoggerProvider { * @param processor the new LogRecordProcessor to be added. */ public addLogRecordProcessor(processor: LogRecordProcessor) { - if (this._registeredLogRecordProcessors.length === 0) { + if (this._sharedState.registeredLogRecordProcessors.length === 0) { // since we might have enabled by default a batchProcessor, we disable it // before adding the new one - this._activeProcessor + this._sharedState.activeProcessor .shutdown() .catch(err => diag.error( @@ -109,10 +94,10 @@ export class LoggerProvider implements logsAPI.LoggerProvider { ) ); } - this._registeredLogRecordProcessors.push(processor); - this._activeProcessor = new MultiLogRecordProcessor( - this._registeredLogRecordProcessors, - this._config.forceFlushTimeoutMillis! + this._sharedState.registeredLogRecordProcessors.push(processor); + this._sharedState.activeProcessor = new MultiLogRecordProcessor( + this._sharedState.registeredLogRecordProcessors, + this._sharedState.forceFlushTimeoutMillis ); } @@ -127,7 +112,7 @@ export class LoggerProvider implements logsAPI.LoggerProvider { diag.warn('invalid attempt to force flush after LoggerProvider shutdown'); return this._shutdownOnce.promise; } - return this._activeProcessor.forceFlush(); + return this._sharedState.activeProcessor.forceFlush(); } /** @@ -144,15 +129,7 @@ export class LoggerProvider implements logsAPI.LoggerProvider { return this._shutdownOnce.call(); } - public getActiveLogRecordProcessor(): MultiLogRecordProcessor { - return this._activeProcessor; - } - - public getActiveLoggers(): Map { - return this._loggers; - } - private _shutdown(): Promise { - return this._activeProcessor.shutdown(); + return this._sharedState.activeProcessor.shutdown(); } } diff --git a/pkgs/sdk/logs/src/MultiLogRecordProcessor.ts b/pkgs/sdk/logs/src/MultiLogRecordProcessor.ts index d0a664365..5c2081a47 100644 --- a/pkgs/sdk/logs/src/MultiLogRecordProcessor.ts +++ b/pkgs/sdk/logs/src/MultiLogRecordProcessor.ts @@ -15,7 +15,7 @@ */ import { callWithTimeout } from '@opentelemetry/sandbox-core'; - +import type { Context } from '@opentelemetry/sandbox-api'; import type { LogRecordProcessor } from './LogRecordProcessor'; import type { LogRecord } from './LogRecord'; @@ -38,8 +38,10 @@ export class MultiLogRecordProcessor implements LogRecordProcessor { ); } - public onEmit(logRecord: LogRecord): void { - this.processors.forEach(processors => processors.onEmit(logRecord)); + public onEmit(logRecord: LogRecord, context?: Context): void { + this.processors.forEach(processors => + processors.onEmit(logRecord, context) + ); } public async shutdown(): Promise { diff --git a/pkgs/sdk/logs/src/config.ts b/pkgs/sdk/logs/src/config.ts index 00c734c6a..77f74c615 100644 --- a/pkgs/sdk/logs/src/config.ts +++ b/pkgs/sdk/logs/src/config.ts @@ -20,7 +20,7 @@ import { getEnv, getEnvWithoutDefaults, } from '@opentelemetry/sandbox-core'; -import { LoggerConfig } from './types'; +import { LogRecordLimits } from './types'; export function loadDefaultConfig() { return { @@ -37,50 +37,29 @@ export function loadDefaultConfig() { /** * When general limits are provided and model specific limits are not, * configures the model specific limits by using the values from the general ones. - * @param userConfig User provided tracer configuration + * @param logRecordLimits User provided limits configuration */ -export function reconfigureLimits(userConfig: LoggerConfig): LoggerConfig { - const logRecordLimits = Object.assign({}, userConfig.logRecordLimits); - +export function reconfigureLimits( + logRecordLimits: LogRecordLimits +): Required { const parsedEnvConfig = getEnvWithoutDefaults(); - /** - * Reassign log record attribute count limit to use first non null value defined by user or use default value - */ - logRecordLimits.attributeCountLimit = - userConfig.logRecordLimits?.attributeCountLimit ?? - parsedEnvConfig.OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT ?? - parsedEnvConfig.OTEL_ATTRIBUTE_COUNT_LIMIT ?? - DEFAULT_ATTRIBUTE_COUNT_LIMIT; - - /** - * Reassign log record attribute value length limit to use first non null value defined by user or use default value - */ - logRecordLimits.attributeValueLengthLimit = - userConfig.logRecordLimits?.attributeValueLengthLimit ?? - parsedEnvConfig.OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT ?? - parsedEnvConfig.OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT ?? - DEFAULT_ATTRIBUTE_VALUE_LENGTH_LIMIT; - - return Object.assign({}, userConfig, { logRecordLimits }); -} - -/** - * Function to merge Default configuration (as specified in './config') with - * user provided configurations. - */ -export function mergeConfig(userConfig: LoggerConfig): Required { - const DEFAULT_CONFIG = loadDefaultConfig(); - - const target = Object.assign({}, DEFAULT_CONFIG, userConfig); - - target.logRecordLimits = Object.assign( - {}, - DEFAULT_CONFIG.logRecordLimits, - userConfig.logRecordLimits || {} - ); - - return target; + return { + /** + * Reassign log record attribute count limit to use first non null value defined by user or use default value + */ + attributeCountLimit: + logRecordLimits.attributeCountLimit ?? + parsedEnvConfig.OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT ?? + parsedEnvConfig.OTEL_ATTRIBUTE_COUNT_LIMIT ?? + DEFAULT_ATTRIBUTE_COUNT_LIMIT, + /** + * Reassign log record attribute value length limit to use first non null value defined by user or use default value + */ + attributeValueLengthLimit: + logRecordLimits.attributeValueLengthLimit ?? + parsedEnvConfig.OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT ?? + parsedEnvConfig.OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT ?? + DEFAULT_ATTRIBUTE_VALUE_LENGTH_LIMIT, + }; } - -export const DEFAULT_EVENT_DOMAIN = 'default'; diff --git a/pkgs/sdk/logs/src/export/NoopLogRecordProcessor.ts b/pkgs/sdk/logs/src/export/NoopLogRecordProcessor.ts index 91f277e8a..fa475743a 100644 --- a/pkgs/sdk/logs/src/export/NoopLogRecordProcessor.ts +++ b/pkgs/sdk/logs/src/export/NoopLogRecordProcessor.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +import { Context } from '@opentelemetry/sandbox-api'; import { LogRecordProcessor } from '../LogRecordProcessor'; import { ReadableLogRecord } from './ReadableLogRecord'; @@ -22,7 +23,7 @@ export class NoopLogRecordProcessor implements LogRecordProcessor { return Promise.resolve(); } - onEmit(_logRecord: ReadableLogRecord): void {} + onEmit(_logRecord: ReadableLogRecord, _context: Context): void {} shutdown(): Promise { return Promise.resolve(); diff --git a/pkgs/sdk/logs/src/index.ts b/pkgs/sdk/logs/src/index.ts index e718ae069..b7347a284 100644 --- a/pkgs/sdk/logs/src/index.ts +++ b/pkgs/sdk/logs/src/index.ts @@ -15,14 +15,12 @@ */ export { - LoggerConfig, LoggerProviderConfig, LogRecordLimits, BufferConfig, BatchLogRecordProcessorBrowserConfig, } from './types'; export { LoggerProvider } from './LoggerProvider'; -export { Logger } from './Logger'; export { LogRecord } from './LogRecord'; export { LogRecordProcessor } from './LogRecordProcessor'; export { ReadableLogRecord } from './export/ReadableLogRecord'; diff --git a/pkgs/sdk/logs/src/internal/LoggerProviderSharedState.ts b/pkgs/sdk/logs/src/internal/LoggerProviderSharedState.ts new file mode 100644 index 000000000..685cd6722 --- /dev/null +++ b/pkgs/sdk/logs/src/internal/LoggerProviderSharedState.ts @@ -0,0 +1,35 @@ +/* + * Copyright The OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Logger } from '@opentelemetry/sandbox-api-logs'; +import { IResource } from '@opentelemetry/sandbox-resources'; +import { LogRecordProcessor } from '../LogRecordProcessor'; +import { LogRecordLimits } from '../types'; +import { NoopLogRecordProcessor } from '../export/NoopLogRecordProcessor'; + +export class LoggerProviderSharedState { + readonly loggers: Map = new Map(); + activeProcessor: LogRecordProcessor; + readonly registeredLogRecordProcessors: LogRecordProcessor[] = []; + + constructor( + readonly resource: IResource, + readonly forceFlushTimeoutMillis: number, + readonly logRecordLimits: Required + ) { + this.activeProcessor = new NoopLogRecordProcessor(); + } +} diff --git a/pkgs/sdk/logs/src/types.ts b/pkgs/sdk/logs/src/types.ts index 81a41a104..acbe70682 100644 --- a/pkgs/sdk/logs/src/types.ts +++ b/pkgs/sdk/logs/src/types.ts @@ -30,11 +30,6 @@ export interface LoggerProviderConfig { logRecordLimits?: LogRecordLimits; } -export interface LoggerConfig { - /** Log Record Limits*/ - logRecordLimits?: LogRecordLimits; -} - export interface LogRecordLimits { /** attributeValueLengthLimit is maximum allowed attribute value size */ attributeValueLengthLimit?: number; diff --git a/pkgs/sdk/logs/test/common/LogRecord.test.ts b/pkgs/sdk/logs/test/common/LogRecord.test.ts index b45c3c33d..f0ac06fa3 100644 --- a/pkgs/sdk/logs/test/common/LogRecord.test.ts +++ b/pkgs/sdk/logs/test/common/LogRecord.test.ts @@ -33,30 +33,32 @@ import { LogRecordLimits, LogRecordProcessor, LogRecord, - Logger, LoggerProvider, } from './../../src'; import { invalidAttributes, validAttributes } from './utils'; +import { LoggerProviderSharedState } from '../../src/internal/LoggerProviderSharedState'; +import { reconfigureLimits } from '../../src/config'; const performanceTimeOrigin: HrTime = [1, 1]; -const setup = (limits?: LogRecordLimits, data?: logsAPI.LogRecord) => { +const setup = (logRecordLimits?: LogRecordLimits, data?: logsAPI.LogRecord) => { const instrumentationScope = { name: 'test name', version: 'test version', schemaUrl: 'test schema url', }; const resource = Resource.default(); - const loggerProvider = new LoggerProvider({ resource }); - const logger = new Logger( + const sharedState = new LoggerProviderSharedState( + resource, + Infinity, + reconfigureLimits(logRecordLimits ?? {}) + ); + const logRecord = new LogRecord( + sharedState, instrumentationScope, - { - logRecordLimits: limits, - }, - loggerProvider + data ?? {} ); - const logRecord = new LogRecord(logger, data || {}); - return { logger, logRecord, instrumentationScope, resource }; + return { logRecord, instrumentationScope, resource }; }; describe('LogRecord', () => { @@ -320,7 +322,7 @@ describe('LogRecord', () => { it('should not rewrite directly through the property method', () => { const warnStub = sinon.spy(diag, 'warn'); const { logRecord } = setup(undefined, logRecordData); - logRecord.makeReadonly(); + logRecord._makeReadonly(); logRecord.body = newBody; logRecord.severityNumber = newSeverityNumber; @@ -346,7 +348,7 @@ describe('LogRecord', () => { it('should not rewrite using the set method', () => { const warnStub = sinon.spy(diag, 'warn'); const { logRecord } = setup(undefined, logRecordData); - logRecord.makeReadonly(); + logRecord._makeReadonly(); logRecord.setBody(newBody); logRecord.setSeverityNumber(newSeverityNumber); diff --git a/pkgs/sdk/logs/test/common/Logger.test.ts b/pkgs/sdk/logs/test/common/Logger.test.ts index 286fa7c43..0a1c8cca4 100644 --- a/pkgs/sdk/logs/test/common/Logger.test.ts +++ b/pkgs/sdk/logs/test/common/Logger.test.ts @@ -17,21 +17,19 @@ import * as assert from 'assert'; import * as sinon from 'sinon'; -import { LogRecord, Logger, LoggerConfig, LoggerProvider } from '../../src'; +import { LogRecord, LoggerProvider, NoopLogRecordProcessor } from '../../src'; import { ROOT_CONTEXT, TraceFlags, context, trace } from '@opentelemetry/sandbox-api'; import { LogRecord as ApiLogRecord } from '@opentelemetry/sandbox-api-logs'; +import { Logger } from '../../src/Logger'; -const setup = (loggerConfig: LoggerConfig = {}) => { - const logger = new Logger( - { - name: 'test name', - version: 'test version', - schemaUrl: 'test schema url', - }, - loggerConfig, - new LoggerProvider() - ); - return { logger }; +const setup = () => { + const loggerProvider = new LoggerProvider(); + const logProcessor = new NoopLogRecordProcessor(); + loggerProvider.addLogRecordProcessor(logProcessor); + const logger = loggerProvider.getLogger('test name', 'test version', { + schemaUrl: 'test schema url', + }) as Logger; + return { logger, logProcessor }; }; describe('Logger', () => { @@ -44,8 +42,8 @@ describe('Logger', () => { describe('emit', () => { it('should emit a logRecord instance', () => { - const { logger } = setup(); - const callSpy = sinon.spy(logger.getActiveLogRecordProcessor(), 'onEmit'); + const { logger, logProcessor } = setup(); + const callSpy = sinon.spy(logProcessor, 'onEmit'); logger.emit({ body: 'test log body', }); @@ -54,7 +52,7 @@ describe('Logger', () => { it('should make log record instance readonly after emit it', () => { const { logger } = setup(); - const makeOnlySpy = sinon.spy(LogRecord.prototype, 'makeReadonly'); + const makeOnlySpy = sinon.spy(LogRecord.prototype, '_makeReadonly'); logger.emit({ body: 'test log body', }); @@ -62,8 +60,8 @@ describe('Logger', () => { }); it('should emit with current Context', () => { - const { logger } = setup({}); - const callSpy = sinon.spy(logger.getActiveLogRecordProcessor(), 'onEmit'); + const { logger, logProcessor } = setup(); + const callSpy = sinon.spy(logProcessor, 'onEmit'); logger.emit({ body: 'test log body', }); @@ -71,7 +69,7 @@ describe('Logger', () => { }); it('should emit with Context specified in LogRecord', () => { - const { logger } = setup({}); + const { logger, logProcessor } = setup(); const spanContext = { traceId: 'd4cda95b652f4a1592b449d5929fda1b', spanId: '6e0c63257de34c92', @@ -82,7 +80,7 @@ describe('Logger', () => { context: activeContext, }; - const callSpy = sinon.spy(logger.getActiveLogRecordProcessor(), 'onEmit'); + const callSpy = sinon.spy(logProcessor, 'onEmit'); logger.emit(logRecordData); assert.ok(callSpy.calledWith(sinon.match.any, activeContext)); }); diff --git a/pkgs/sdk/logs/test/common/LoggerProvider.test.ts b/pkgs/sdk/logs/test/common/LoggerProvider.test.ts index c266c846e..9c6dc4d9c 100644 --- a/pkgs/sdk/logs/test/common/LoggerProvider.test.ts +++ b/pkgs/sdk/logs/test/common/LoggerProvider.test.ts @@ -19,9 +19,11 @@ import { Resource } from '@opentelemetry/sandbox-resources'; import * as assert from 'assert'; import * as sinon from 'sinon'; -import { Logger, LoggerProvider, NoopLogRecordProcessor } from '../../src'; +import { LoggerProvider, NoopLogRecordProcessor } from '../../src'; import { loadDefaultConfig } from '../../src/config'; import { DEFAULT_LOGGER_NAME } from './../../src/LoggerProvider'; +import { MultiLogRecordProcessor } from '../../src/MultiLogRecordProcessor'; +import { Logger } from '../../src/Logger'; describe('LoggerProvider', () => { let envSource: Record; @@ -48,45 +50,35 @@ describe('LoggerProvider', () => { assert.ok(provider instanceof LoggerProvider); }); - it('should use noop log record processor by default and no diag error', () => { - const errorStub = sinon.spy(diag, 'error'); + it('should use noop log record processor by default', () => { const provider = new LoggerProvider(); - const processors = provider.getActiveLogRecordProcessor().processors; - assert.ok(processors.length === 1); - assert.ok(processors[0] instanceof NoopLogRecordProcessor); - sinon.assert.notCalled(errorStub); + const sharedState = provider['_sharedState']; + const processor = sharedState.activeProcessor; + assert.ok(processor instanceof NoopLogRecordProcessor); }); it('should have default resource if not pass', () => { const provider = new LoggerProvider(); - const { resource } = provider; + const { resource } = provider['_sharedState']; assert.deepStrictEqual(resource, Resource.default()); }); it('should have default forceFlushTimeoutMillis if not pass', () => { const provider = new LoggerProvider(); - const activeProcessor = provider.getActiveLogRecordProcessor(); + const sharedState = provider['_sharedState']; assert.ok( - activeProcessor.forceFlushTimeoutMillis === + sharedState.forceFlushTimeoutMillis === loadDefaultConfig().forceFlushTimeoutMillis ); }); }); - describe('when user sets unavailable exporter', () => { - it('should use noop log record processor by default', () => { - const provider = new LoggerProvider(); - const processors = provider.getActiveLogRecordProcessor().processors; - assert.ok(processors.length === 1); - assert.ok(processors[0] instanceof NoopLogRecordProcessor); - }); - }); - describe('logRecordLimits', () => { describe('when not defined default values', () => { it('should have logger with default values', () => { - const logger = new LoggerProvider({}).getLogger('default') as Logger; - assert.deepStrictEqual(logger.getLogRecordLimits(), { + const loggerProvider = new LoggerProvider(); + const sharedState = loggerProvider['_sharedState']; + assert.deepStrictEqual(sharedState.logRecordLimits, { attributeValueLengthLimit: Infinity, attributeCountLimit: 128, }); @@ -95,34 +87,37 @@ describe('LoggerProvider', () => { describe('when "attributeCountLimit" is defined', () => { it('should have logger with defined value', () => { - const logger = new LoggerProvider({ + const loggerProvider = new LoggerProvider({ logRecordLimits: { attributeCountLimit: 100, }, - }).getLogger('default') as Logger; - const logRecordLimits = logger.getLogRecordLimits(); + }); + const logRecordLimits = + loggerProvider['_sharedState'].logRecordLimits; assert.strictEqual(logRecordLimits.attributeCountLimit, 100); }); }); describe('when "attributeValueLengthLimit" is defined', () => { it('should have logger with defined value', () => { - const logger = new LoggerProvider({ + const loggerProvider = new LoggerProvider({ logRecordLimits: { attributeValueLengthLimit: 10, }, - }).getLogger('default') as Logger; - const logRecordLimits = logger.getLogRecordLimits(); + }); + const logRecordLimits = + loggerProvider['_sharedState'].logRecordLimits; assert.strictEqual(logRecordLimits.attributeValueLengthLimit, 10); }); it('should have logger with negative "attributeValueLengthLimit" value', () => { - const logger = new LoggerProvider({ + const loggerProvider = new LoggerProvider({ logRecordLimits: { attributeValueLengthLimit: -10, }, - }).getLogger('default') as Logger; - const logRecordLimits = logger.getLogRecordLimits(); + }); + const logRecordLimits = + loggerProvider['_sharedState'].logRecordLimits; assert.strictEqual(logRecordLimits.attributeValueLengthLimit, -10); }); }); @@ -130,8 +125,9 @@ describe('LoggerProvider', () => { describe('when attribute value length limit is defined via env', () => { it('should have attribute value length limit as default of Infinity', () => { envSource.OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT = 'Infinity'; - const logger = new LoggerProvider().getLogger('default') as Logger; - const logRecordLimits = logger.getLogRecordLimits(); + const loggerProvider = new LoggerProvider(); + const logRecordLimits = + loggerProvider['_sharedState'].logRecordLimits; assert.strictEqual( logRecordLimits.attributeValueLengthLimit, Infinity @@ -142,8 +138,9 @@ describe('LoggerProvider', () => { describe('when attribute value length limit is not defined via env', () => { it('should use default value of Infinity', () => { - const logger = new LoggerProvider().getLogger('default') as Logger; - const logRecordLimits = logger.getLogRecordLimits(); + const loggerProvider = new LoggerProvider(); + const logRecordLimits = + loggerProvider['_sharedState'].logRecordLimits; assert.strictEqual( logRecordLimits.attributeValueLengthLimit, Infinity @@ -154,15 +151,17 @@ describe('LoggerProvider', () => { describe('when attribute count limit is defined via env', () => { it('should have attribute count limits as defined in env', () => { envSource.OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT = '35'; - const logger = new LoggerProvider().getLogger('default') as Logger; - const logRecordLimits = logger.getLogRecordLimits(); + const loggerProvider = new LoggerProvider(); + const logRecordLimits = + loggerProvider['_sharedState'].logRecordLimits; assert.strictEqual(logRecordLimits.attributeCountLimit, 35); delete envSource.OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT; }); it('should have attribute count limit as default of 128', () => { envSource.OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT = '128'; - const logger = new LoggerProvider().getLogger('default') as Logger; - const logRecordLimits = logger.getLogRecordLimits(); + const loggerProvider = new LoggerProvider(); + const logRecordLimits = + loggerProvider['_sharedState'].logRecordLimits; assert.strictEqual(logRecordLimits.attributeCountLimit, 128); delete envSource.OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT; }); @@ -170,8 +169,9 @@ describe('LoggerProvider', () => { describe('when attribute count limit is not defined via env', () => { it('should use default value of 128', () => { - const logger = new LoggerProvider().getLogger('default') as Logger; - const logRecordLimits = logger.getLogRecordLimits(); + const loggerProvider = new LoggerProvider(); + const logRecordLimits = + loggerProvider['_sharedState'].logRecordLimits; assert.strictEqual(logRecordLimits.attributeCountLimit, 128); }); }); @@ -186,55 +186,61 @@ describe('LoggerProvider', () => { it('should create a logger instance with default name if the name is invalid ', () => { const provider = new LoggerProvider(); const logger = provider.getLogger('') as Logger; - assert.ok(logger.instrumentationScope.name === DEFAULT_LOGGER_NAME); + assert.strictEqual(logger.instrumentationScope.name, DEFAULT_LOGGER_NAME); }); it("should create a logger instance if the name doesn't exist", () => { const provider = new LoggerProvider(); - assert.ok(provider.getActiveLoggers().size === 0); + const sharedState = provider['_sharedState']; + assert.strictEqual(sharedState.loggers.size, 0); provider.getLogger(testName); - assert.ok(provider.getActiveLoggers().size === 1); + assert.strictEqual(sharedState.loggers.size, 1); }); it('should create A new object if the name & version & schemaUrl are not unique', () => { const provider = new LoggerProvider(); - assert.ok(provider.getActiveLoggers().size === 0); + const sharedState = provider['_sharedState']; + assert.strictEqual(sharedState.loggers.size, 0); provider.getLogger(testName); - assert.ok(provider.getActiveLoggers().size === 1); + assert.strictEqual(sharedState.loggers.size, 1); provider.getLogger(testName, testVersion); - assert.ok(provider.getActiveLoggers().size === 2); + assert.strictEqual(sharedState.loggers.size, 2); provider.getLogger(testName, testVersion, { schemaUrl: testSchemaURL }); - assert.ok(provider.getActiveLoggers().size === 3); + assert.strictEqual(sharedState.loggers.size, 3); }); it('should not create A new object if the name & version & schemaUrl are unique', () => { const provider = new LoggerProvider(); + const sharedState = provider['_sharedState']; - assert.ok(provider.getActiveLoggers().size === 0); + assert.strictEqual(sharedState.loggers.size, 0); provider.getLogger(testName); - assert.ok(provider.getActiveLoggers().size === 1); + assert.strictEqual(sharedState.loggers.size, 1); const logger1 = provider.getLogger(testName, testVersion, { schemaUrl: testSchemaURL, }); - assert.ok(provider.getActiveLoggers().size === 2); + assert.strictEqual(sharedState.loggers.size, 2); const logger2 = provider.getLogger(testName, testVersion, { schemaUrl: testSchemaURL, }); - assert.ok(provider.getActiveLoggers().size === 2); + assert.strictEqual(sharedState.loggers.size, 2); assert.ok(logger2 instanceof Logger); - assert.ok(logger1 === logger2); + assert.strictEqual(logger1, logger2); }); }); describe('addLogRecordProcessor', () => { it('should add logRecord processor', () => { - const logRecordProcessor = new NoopLogRecordProcessor(); const provider = new LoggerProvider(); + const sharedState = provider['_sharedState']; + const logRecordProcessor = new NoopLogRecordProcessor(); provider.addLogRecordProcessor(logRecordProcessor); + assert.ok(sharedState.activeProcessor instanceof MultiLogRecordProcessor); + assert.strictEqual(sharedState.activeProcessor.processors.length, 1); assert.strictEqual( - provider.getActiveLogRecordProcessor().processors.length, - 1 + sharedState.activeProcessor.processors[0], + logRecordProcessor ); }); }); @@ -301,10 +307,9 @@ describe('LoggerProvider', () => { describe('.shutdown()', () => { it('should trigger shutdown when manually invoked', () => { const provider = new LoggerProvider(); - const shutdownStub = sinon.stub( - provider.getActiveLogRecordProcessor(), - 'shutdown' - ); + const processor = new NoopLogRecordProcessor(); + provider.addLogRecordProcessor(processor); + const shutdownStub = sinon.stub(processor, 'shutdown'); provider.shutdown(); sinon.assert.calledOnce(shutdownStub); }); @@ -321,10 +326,7 @@ describe('LoggerProvider', () => { const provider = new LoggerProvider(); const logRecordProcessor = new NoopLogRecordProcessor(); provider.addLogRecordProcessor(logRecordProcessor); - const forceFlushStub = sinon.stub( - provider.getActiveLogRecordProcessor(), - 'forceFlush' - ); + const forceFlushStub = sinon.stub(logRecordProcessor, 'forceFlush'); const warnStub = sinon.spy(diag, 'warn'); provider.shutdown(); provider.forceFlush(); @@ -336,10 +338,7 @@ describe('LoggerProvider', () => { const provider = new LoggerProvider(); const logRecordProcessor = new NoopLogRecordProcessor(); provider.addLogRecordProcessor(logRecordProcessor); - const shutdownStub = sinon.stub( - provider.getActiveLogRecordProcessor(), - 'shutdown' - ); + const shutdownStub = sinon.stub(logRecordProcessor, 'shutdown'); const warnStub = sinon.spy(diag, 'warn'); provider.shutdown(); provider.shutdown(); diff --git a/pkgs/sdk/logs/test/common/export/BatchLogRecordProcessor.test.ts b/pkgs/sdk/logs/test/common/export/BatchLogRecordProcessor.test.ts index c54dc3770..c11128d27 100644 --- a/pkgs/sdk/logs/test/common/export/BatchLogRecordProcessor.test.ts +++ b/pkgs/sdk/logs/test/common/export/BatchLogRecordProcessor.test.ts @@ -28,10 +28,11 @@ import { LogRecordLimits, LogRecord, InMemoryLogRecordExporter, - LoggerProvider, - Logger, } from '../../../src'; import { BatchLogRecordProcessorBase } from '../../../src/export/BatchLogRecordProcessorBase'; +import { reconfigureLimits } from '../../../src/config'; +import { LoggerProviderSharedState } from '../../../src/internal/LoggerProviderSharedState'; +import { Resource } from '@opentelemetry/sandbox-resources'; class BatchLogRecordProcessor extends BatchLogRecordProcessorBase { onInit() {} @@ -39,18 +40,22 @@ class BatchLogRecordProcessor extends BatchLogRecordProcessorBase } const createLogRecord = (limits?: LogRecordLimits): LogRecord => { - const logger = new Logger( + const sharedState = new LoggerProviderSharedState( + Resource.default(), + Infinity, + reconfigureLimits(limits ?? {}) + ); + const logRecord = new LogRecord( + sharedState, { name: 'test name', version: 'test version', schemaUrl: 'test schema url', }, { - logRecordLimits: limits, - }, - new LoggerProvider() + body: 'body', + } ); - const logRecord = new LogRecord(logger, { body: 'body' }); return logRecord; }; diff --git a/pkgs/sdk/logs/test/common/export/SimpleLogRecordProcessor.test.ts b/pkgs/sdk/logs/test/common/export/SimpleLogRecordProcessor.test.ts index 8e9d12899..9fc4ee8df 100644 --- a/pkgs/sdk/logs/test/common/export/SimpleLogRecordProcessor.test.ts +++ b/pkgs/sdk/logs/test/common/export/SimpleLogRecordProcessor.test.ts @@ -27,13 +27,30 @@ import { LogRecordExporter, SimpleLogRecordProcessor, LogRecord, - LoggerProvider, - Logger, } from './../../../src'; +import { LoggerProviderSharedState } from '../../../src/internal/LoggerProviderSharedState'; +import { Resource } from '@opentelemetry/sandbox-resources'; +import { reconfigureLimits } from '../../../src/config'; const setup = (exporter: LogRecordExporter) => { + const sharedState = new LoggerProviderSharedState( + Resource.default(), + Infinity, + reconfigureLimits({}) + ); + const logRecord = new LogRecord( + sharedState, + { + name: 'test name', + version: 'test version', + schemaUrl: 'test schema url', + }, + { + body: 'body', + } + ); const processor = new SimpleLogRecordProcessor(exporter); - return { exporter, processor }; + return { exporter, processor, logRecord }; }; describe('SimpleLogRecordProcessor', () => { @@ -49,21 +66,9 @@ describe('SimpleLogRecordProcessor', () => { describe('onEmit', () => { it('should handle onEmit', async () => { const exporter = new InMemoryLogRecordExporter(); - const { processor } = setup(exporter); + const { processor, logRecord } = setup(exporter); assert.strictEqual(exporter.getFinishedLogRecords().length, 0); - const logger = new Logger( - { - name: 'test name', - version: 'test version', - schemaUrl: 'test schema url', - }, - {}, - new LoggerProvider() - ); - const logRecord = new LogRecord(logger, { - body: 'body', - }); processor.onEmit(logRecord); assert.strictEqual(exporter.getFinishedLogRecords().length, 1); @@ -82,20 +87,8 @@ describe('SimpleLogRecordProcessor', () => { ), shutdown: () => Promise.resolve(), }; - const { processor } = setup(exporter); + const { processor, logRecord } = setup(exporter); - const logger = new Logger( - { - name: 'test name', - version: 'test version', - schemaUrl: 'test schema url', - }, - {}, - new LoggerProvider() - ); - const logRecord = new LogRecord(logger, { - body: 'body', - }); const errorHandlerSpy = sinon.spy(); setGlobalErrorHandler(errorHandlerSpy); processor.onEmit(logRecord); diff --git a/pkgs/sdk/metrics/src/InstrumentDescriptor.ts b/pkgs/sdk/metrics/src/InstrumentDescriptor.ts index e89c03557..792a07a6e 100644 --- a/pkgs/sdk/metrics/src/InstrumentDescriptor.ts +++ b/pkgs/sdk/metrics/src/InstrumentDescriptor.ts @@ -88,7 +88,7 @@ export function isDescriptorCompatibleWith( // ASCII string with a length no greater than 255 characters. // NB: the first character counted separately from the rest. -const NAME_REGEXP = /^[a-z][a-z0-9_.-]{0,254}$/i; +const NAME_REGEXP = /^[a-z][a-z0-9_.\-/]{0,254}$/i; export function isValidName(name: string): boolean { return name.match(NAME_REGEXP) != null; } diff --git a/pkgs/sdk/metrics/src/state/MeterSharedState.ts b/pkgs/sdk/metrics/src/state/MeterSharedState.ts index 8e4d38c81..194e7b7bc 100644 --- a/pkgs/sdk/metrics/src/state/MeterSharedState.ts +++ b/pkgs/sdk/metrics/src/state/MeterSharedState.ts @@ -78,7 +78,7 @@ export class MeterSharedState { collector: MetricCollectorHandle, collectionTime: HrTime, options?: MetricCollectOptions - ): Promise { + ): Promise { /** * 1. Call all observable callbacks first. * 2. Collect metric result for the collector. @@ -87,9 +87,14 @@ export class MeterSharedState { collectionTime, options?.timeoutMillis ); - const metricDataList = Array.from( - this.metricStorageRegistry.getStorages(collector) - ) + const storages = this.metricStorageRegistry.getStorages(collector); + + // prevent more allocations if there are no storages. + if (storages.length === 0) { + return null; + } + + const metricDataList = storages .map(metricStorage => { return metricStorage.collect( collector, @@ -99,10 +104,15 @@ export class MeterSharedState { }) .filter(isNotNullish); + // skip this scope if no data was collected (storage created, but no data observed) + if (metricDataList.length === 0) { + return { errors }; + } + return { scopeMetrics: { scope: this._instrumentationScope, - metrics: metricDataList.filter(isNotNullish), + metrics: metricDataList, }, errors, }; @@ -173,7 +183,7 @@ export class MeterSharedState { } interface ScopeMetricsResult { - scopeMetrics: ScopeMetrics; + scopeMetrics?: ScopeMetrics; errors: unknown[]; } diff --git a/pkgs/sdk/metrics/src/state/MetricCollector.ts b/pkgs/sdk/metrics/src/state/MetricCollector.ts index 123b43af0..58b5a7ffc 100644 --- a/pkgs/sdk/metrics/src/state/MetricCollector.ts +++ b/pkgs/sdk/metrics/src/state/MetricCollector.ts @@ -16,12 +16,11 @@ import { millisToHrTime } from '@opentelemetry/sandbox-core'; import { AggregationTemporalitySelector } from '../export/AggregationSelector'; -import { CollectionResult } from '../export/MetricData'; +import { CollectionResult, ScopeMetrics } from '../export/MetricData'; import { MetricProducer, MetricCollectOptions } from '../export/MetricProducer'; import { MetricReader } from '../export/MetricReader'; import { InstrumentType } from '../InstrumentDescriptor'; import { ForceFlushOptions, ShutdownOptions } from '../types'; -import { FlatMap } from '../utils'; import { MeterProviderSharedState } from './MeterProviderSharedState'; /** @@ -37,19 +36,36 @@ export class MetricCollector implements MetricProducer { async collect(options?: MetricCollectOptions): Promise { const collectionTime = millisToHrTime(Date.now()); + const scopeMetrics: ScopeMetrics[] = []; + const errors: unknown[] = []; + const meterCollectionPromises = Array.from( this._sharedState.meterSharedStates.values() - ).map(meterSharedState => - meterSharedState.collect(this, collectionTime, options) - ); - const result = await Promise.all(meterCollectionPromises); + ).map(async meterSharedState => { + const current = await meterSharedState.collect( + this, + collectionTime, + options + ); + + // only add scope metrics if available + if (current?.scopeMetrics != null) { + scopeMetrics.push(current.scopeMetrics); + } + + // only add errors if available + if (current?.errors != null) { + errors.push(...current.errors); + } + }); + await Promise.all(meterCollectionPromises); return { resourceMetrics: { resource: this._sharedState.resource, - scopeMetrics: result.map(it => it.scopeMetrics), + scopeMetrics: scopeMetrics, }, - errors: FlatMap(result, it => it.errors), + errors: errors, }; } diff --git a/pkgs/sdk/metrics/src/state/TemporalMetricProcessor.ts b/pkgs/sdk/metrics/src/state/TemporalMetricProcessor.ts index 57b935218..6f24862fa 100644 --- a/pkgs/sdk/metrics/src/state/TemporalMetricProcessor.ts +++ b/pkgs/sdk/metrics/src/state/TemporalMetricProcessor.ts @@ -133,10 +133,17 @@ export class TemporalMetricProcessor> { aggregationTemporality, }); + const accumulationRecords = AttributesMapToAccumulationRecords(result); + + // do not convert to metric data if there is nothing to convert. + if (accumulationRecords.length === 0) { + return undefined; + } + return this._aggregator.toMetricData( instrumentDescriptor, aggregationTemporality, - AttributesMapToAccumulationRecords(result), + accumulationRecords, /* endTime */ collectionTime ); } diff --git a/pkgs/sdk/metrics/test/Instruments.test.ts b/pkgs/sdk/metrics/test/Instruments.test.ts index 5be049d6d..82bc2de6a 100644 --- a/pkgs/sdk/metrics/test/Instruments.test.ts +++ b/pkgs/sdk/metrics/test/Instruments.test.ts @@ -434,10 +434,10 @@ describe('Instruments', () => { }); histogram.record(-1, { foo: 'bar' }); - await validateExport(deltaReader, { - dataPointType: DataPointType.HISTOGRAM, - dataPoints: [], - }); + const result = await deltaReader.collect(); + + // nothing observed + assert.equal(result.resourceMetrics.scopeMetrics.length, 0); }); it('should record DOUBLE values', async () => { @@ -499,10 +499,10 @@ describe('Instruments', () => { }); histogram.record(-0.5, { foo: 'bar' }); - await validateExport(deltaReader, { - dataPointType: DataPointType.HISTOGRAM, - dataPoints: [], - }); + const result = await deltaReader.collect(); + + // nothing observed + assert.equal(result.resourceMetrics.scopeMetrics.length, 0); }); }); diff --git a/pkgs/sdk/metrics/test/MeterProvider.test.ts b/pkgs/sdk/metrics/test/MeterProvider.test.ts index a9f8361b8..be075f0fa 100644 --- a/pkgs/sdk/metrics/test/MeterProvider.test.ts +++ b/pkgs/sdk/metrics/test/MeterProvider.test.ts @@ -77,23 +77,29 @@ describe('MeterProvider', () => { const reader = new TestMetricReader(); meterProvider.addMetricReader(reader); - // Create meter and instrument. + // Create meter and instrument, needs observation on instrument, otherwise the scope will not be reported. // name+version pair 1 - meterProvider.getMeter('meter1', 'v1.0.0'); - meterProvider.getMeter('meter1', 'v1.0.0'); + meterProvider.getMeter('meter1', 'v1.0.0').createCounter('test').add(1); + meterProvider.getMeter('meter1', 'v1.0.0').createCounter('test').add(1); // name+version pair 2 - meterProvider.getMeter('meter2', 'v1.0.0'); - meterProvider.getMeter('meter2', 'v1.0.0'); + meterProvider.getMeter('meter2', 'v1.0.0').createCounter('test').add(1); + meterProvider.getMeter('meter2', 'v1.0.0').createCounter('test').add(1); // name+version pair 3 - meterProvider.getMeter('meter1', 'v1.0.1'); - meterProvider.getMeter('meter1', 'v1.0.1'); + meterProvider.getMeter('meter1', 'v1.0.1').createCounter('test').add(1); + meterProvider.getMeter('meter1', 'v1.0.1').createCounter('test').add(1); // name+version+schemaUrl pair 4 - meterProvider.getMeter('meter1', 'v1.0.1', { - schemaUrl: 'https://opentelemetry.io/schemas/1.4.0', - }); - meterProvider.getMeter('meter1', 'v1.0.1', { - schemaUrl: 'https://opentelemetry.io/schemas/1.4.0', - }); + meterProvider + .getMeter('meter1', 'v1.0.1', { + schemaUrl: 'https://opentelemetry.io/schemas/1.4.0', + }) + .createCounter('test') + .add(1); + meterProvider + .getMeter('meter1', 'v1.0.1', { + schemaUrl: 'https://opentelemetry.io/schemas/1.4.0', + }) + .createCounter('test') + .add(1); // Perform collection. const { resourceMetrics, errors } = await reader.collect(); diff --git a/pkgs/sdk/metrics/test/state/AsyncMetricStorage.test.ts b/pkgs/sdk/metrics/test/state/AsyncMetricStorage.test.ts index 72c46be5d..2a8cf867d 100644 --- a/pkgs/sdk/metrics/test/state/AsyncMetricStorage.test.ts +++ b/pkgs/sdk/metrics/test/state/AsyncMetricStorage.test.ts @@ -110,8 +110,7 @@ describe('AsyncMetricStorage', () => { collectionTime ); - assertMetricData(metric, DataPointType.SUM); - assert.strictEqual(metric.dataPoints.length, 0); + assert.equal(metric, undefined); } delegate.setDelegate(observableResult => { diff --git a/pkgs/sdk/metrics/test/state/MetricCollector.test.ts b/pkgs/sdk/metrics/test/state/MetricCollector.test.ts index 3c70b3575..8466a5a95 100644 --- a/pkgs/sdk/metrics/test/state/MetricCollector.test.ts +++ b/pkgs/sdk/metrics/test/state/MetricCollector.test.ts @@ -141,7 +141,8 @@ describe('MetricCollector', () => { assert.strictEqual(errors.length, 0); const { scopeMetrics } = resourceMetrics; const { metrics } = scopeMetrics[0]; - assert.strictEqual(metrics.length, 3); + // Should not export observableCounter3, as it was never observed + assert.strictEqual(metrics.length, 2); /** checking batch[0] */ const metricData1 = metrics[0]; @@ -160,13 +161,6 @@ describe('MetricCollector', () => { assert.strictEqual(metricData2.dataPoints.length, 2); assertDataPoint(metricData2.dataPoints[0], {}, 3); assertDataPoint(metricData2.dataPoints[1], { foo: 'bar' }, 4); - - /** checking batch[2] */ - const metricData3 = metrics[2]; - assertMetricData(metricData3, DataPointType.SUM, { - name: 'observable3', - }); - assert.strictEqual(metricData3.dataPoints.length, 0); }); it('should collect observer metrics with timeout', async () => { @@ -205,19 +199,15 @@ describe('MetricCollector', () => { assert(errors[0] instanceof TimeoutError); const { scopeMetrics } = resourceMetrics; const { metrics } = scopeMetrics[0]; - assert.strictEqual(metrics.length, 2); - /** observer1 */ - assertMetricData(metrics[0], DataPointType.SUM, { - name: 'observer1', - }); - assert.strictEqual(metrics[0].dataPoints.length, 0); + // Only observer2 is exported, observer1 never reported a measurement + assert.strictEqual(metrics.length, 1); /** observer2 */ - assertMetricData(metrics[1], DataPointType.SUM, { + assertMetricData(metrics[0], DataPointType.SUM, { name: 'observer2', }); - assert.strictEqual(metrics[1].dataPoints.length, 1); + assert.strictEqual(metrics[0].dataPoints.length, 1); } /** now the observer1 is back to normal */ @@ -272,19 +262,13 @@ describe('MetricCollector', () => { assert.strictEqual(`${errors[0]}`, 'Error: foobar'); const { scopeMetrics } = resourceMetrics; const { metrics } = scopeMetrics[0]; - assert.strictEqual(metrics.length, 2); - /** counter1 data points are collected */ + /** only counter1 data points are collected */ + assert.strictEqual(metrics.length, 1); assertMetricData(metrics[0], DataPointType.SUM, { name: 'counter1', }); assert.strictEqual(metrics[0].dataPoints.length, 1); - - /** observer1 data points are not collected */ - assertMetricData(metrics[1], DataPointType.SUM, { - name: 'observer1', - }); - assert.strictEqual(metrics[1].dataPoints.length, 0); }); it('should collect batch observer metrics with timeout', async () => { @@ -327,19 +311,13 @@ describe('MetricCollector', () => { assert(errors[0] instanceof TimeoutError); const { scopeMetrics } = resourceMetrics; const { metrics } = scopeMetrics[0]; - assert.strictEqual(metrics.length, 2); - /** observer1 */ + /** only observer2 is present; observer1's promise never settled*/ + assert.strictEqual(metrics.length, 1); assertMetricData(metrics[0], DataPointType.SUM, { - name: 'observer1', - }); - assert.strictEqual(metrics[0].dataPoints.length, 0); - - /** observer2 */ - assertMetricData(metrics[1], DataPointType.SUM, { name: 'observer2', }); - assert.strictEqual(metrics[1].dataPoints.length, 1); + assert.strictEqual(metrics[0].dataPoints.length, 1); } /** now the observer1 is back to normal */ @@ -398,19 +376,13 @@ describe('MetricCollector', () => { assert.strictEqual(`${errors[0]}`, 'Error: foobar'); const { scopeMetrics } = resourceMetrics; const { metrics } = scopeMetrics[0]; - assert.strictEqual(metrics.length, 2); - /** counter1 data points are collected */ + /** counter1 data points are collected; observer1's callback did throw, so data points are not collected */ + assert.strictEqual(metrics.length, 1); assertMetricData(metrics[0], DataPointType.SUM, { name: 'counter1', }); assert.strictEqual(metrics[0].dataPoints.length, 1); - - /** observer1 data points are not collected */ - assertMetricData(metrics[1], DataPointType.SUM, { - name: 'observer1', - }); - assert.strictEqual(metrics[1].dataPoints.length, 0); }); }); }); diff --git a/pkgs/sdk/metrics/test/state/SyncMetricStorage.test.ts b/pkgs/sdk/metrics/test/state/SyncMetricStorage.test.ts index 4b26ec540..009eccd04 100644 --- a/pkgs/sdk/metrics/test/state/SyncMetricStorage.test.ts +++ b/pkgs/sdk/metrics/test/state/SyncMetricStorage.test.ts @@ -88,8 +88,7 @@ describe('SyncMetricStorage', () => { [4, 4] ); - assertMetricData(metric, DataPointType.SUM); - assert.strictEqual(metric.dataPoints.length, 0); + assert.strictEqual(metric, undefined); } metricStorage.record(1, {}, api.context.active(), [5, 5]); diff --git a/pkgs/sdk/metrics/test/state/TemporalMetricProcessor.test.ts b/pkgs/sdk/metrics/test/state/TemporalMetricProcessor.test.ts index e4fd1018b..769e52674 100644 --- a/pkgs/sdk/metrics/test/state/TemporalMetricProcessor.test.ts +++ b/pkgs/sdk/metrics/test/state/TemporalMetricProcessor.test.ts @@ -107,13 +107,8 @@ describe('TemporalMetricProcessor', () => { [5, 5] ); - assertMetricData( - metric, - DataPointType.SUM, - defaultInstrumentDescriptor, - AggregationTemporality.DELTA - ); - assert.strictEqual(metric.dataPoints.length, 0); + // nothing recorded -> nothing collected + assert.equal(metric, undefined); } // selectAggregationTemporality should be called only once. diff --git a/pkgs/sdk/metrics/test/util.ts b/pkgs/sdk/metrics/test/util.ts index a59d94a86..cb4bb9167 100644 --- a/pkgs/sdk/metrics/test/util.ts +++ b/pkgs/sdk/metrics/test/util.ts @@ -67,7 +67,15 @@ export const defaultInstrumentationScope: InstrumentationScope = { }; export const invalidNames = ['', 'a'.repeat(256), '1a', '-a', '.a', '_a']; -export const validNames = ['a', 'a'.repeat(255), 'a1', 'a-1', 'a.1', 'a_1']; +export const validNames = [ + 'a', + 'a'.repeat(255), + 'a1', + 'a-1', + 'a.1', + 'a_1', + 'a/1', +]; export const commonValues: number[] = [1, -1, 1.0, Infinity, -Infinity, NaN]; export const commonAttributes: MetricAttributes[] = [