Skip to content

Commit

Permalink
Merge branch 'main' into feat/add-requestHook-to-fetch-instrumentation
Browse files Browse the repository at this point in the history
  • Loading branch information
patricklafrance committed Feb 11, 2025
2 parents 7aa908b + 4fb9c5a commit c194801
Show file tree
Hide file tree
Showing 56 changed files with 2,031 additions and 5,474 deletions.
9 changes: 6 additions & 3 deletions .github/workflows/docs.yaml
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
name: Deploy API Documentation

on:
release:
types: [published]
# Disable API doc updates from "main" while "main" is frozen for https://github.com/open-telemetry/opentelemetry-js/milestone/17
# TODO: renable this once ready for releases from "main" again.
# on:
# release:
# types: [published]
on: []

jobs:
build-and-deploy:
Expand Down
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,18 @@ For semantic convention package changes, see the [semconv CHANGELOG](packages/se
* chore!: Raise the minimum supported Node.js version to `^18.19.0 || >=20.6.0`. Support for Node.js 14, 16, and early minor versions of 18 and 20 have been dropped. This applies to all packages except the 'api' and 'semantic-conventions' packages. [#5395](https://github.com/open-telemetry/opentelemetry-js/issues/5395) @trentm
* feat(core)!: remove TracesSamplerValues from exports [#5406](https://github.com/open-telemetry/opentelemetry-js/pull/5406) @pichlermarc
* (user-facing): TracesSamplerValues was only consumed internally and has been removed from exports without replacement
* feat(core)!: remove unused and obsolete functions and types [#5444](https://github.com/open-telemetry/opentelemetry-js/pull/5444) @pichlermarc
* (user-facing): `VERSION` was an internal constant that was unintentionally exported. It has been removed without replacement.
* (user-facing): `isWrapped` has been removed in favor of `isWrapped` from `@opentelemetry/instrumentation`
* (user-facing): `ShimWrapped` has been removed in favor of `ShimWrapped` from `@opentelemetry/instrumentation`
* (user-facing): `hexToBase64` was a utility function that is not used by the SDK anymore. It has been removed without replacement.
* (user-facing): `hexToBinary` was a utility function that now internal to `@opentelemetry/otlp-tranformer`. It has been removed without replacement.
* (user-facing): `baggageUtils.getKeyParis` was an internal utility function that was unintentionally exported. It has been removed without replacement.
* (user-facing): `baggageUtils.serializeKeyPairs` was an internal utility function that was unintentionally exported. It has been removed without replacement.
* (user-facing): `baggageUtils.parseKeyPairsIntoRecord,` has been removed in favor of `parseKeyPairsIntoRecord`
* (user-facing): `baggageUtils.parsePairKeyValue` was an internal utility function that was unintentionally exported. It has been removed without replacement.
* (user-facing): `TimeOriginLegacy` has been removed without replacement.
* (user-facing): `isAttributeKey` was an internal utility function that was unintentionally exported. It has been removed without replacement.

### :rocket: (Enhancement)

Expand All @@ -104,6 +116,7 @@ For semantic convention package changes, see the [semconv CHANGELOG](packages/se
* chore(selenium-tests): remove internal selenium-tests/ package, it wasn't being used @trentm
* chore: update typescript `module` compiler option to `node16`. [#5347](https://github.com/open-telemetry/opentelemetry-js/pull/5347) @david-luna
* feat(opentelemetry-instrumentation): replace `semver` package with internal semantic versioning check implementation to get rid of `semver` package initialization overhead especially in the AWS Lambda environment during coldstart [#5305](https://github.com/open-telemetry/opentelemetry-js/pull/5305) @serkan-ozal
* chore: unpin `@opentelemetry/semantic-conventions` dep to allow better de-duplication in installs [#5439](https://github.com/open-telemetry/opentelemetry-js/pull/5439) @trentm

## 1.30.0

Expand Down
18 changes: 17 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -266,9 +266,25 @@ Members of this team have triager permissions for opentelemetry-js.git and opent
#### Contrib Triagers ([@open-telemetry/javascript-contrib-triagers](https://github.com/orgs/open-telemetry/teams/javascript-contrib-triagers))

Members of this team have triager permissions for opentelemetry-js-contrib.git.
Typically, members of this are [component owners](https://github.com/open-telemetry/opentelemetry-js-contrib/blob/main/.github/component_owners.yml) of one or more packages in the contrib repo.

- [Jonathan Munz](https://github.com/jpmunz), Embrace
- [Aaron Abbott](https://github.com/aabmass), Google
- [Abhinav Mathur](https://github.com/abhee11), AppDynamics
- [Bartlomiej Obecny](https://github.com/obecny)
- [Daniel Li](https://github.com/d4nyll)
- [Florencia Acosta](https://github.com/facostaembrace), Embrace
- [Jackson Weber](https://github.com/JacksonWeber), Microsoft
- [Jaryk](https://github.com/Ugzuzg), Volvo Cars
- [Jonathan Lee](https://github.com/jj22ee)
- [Jonathan Munz](https://github.com/jpmunz), Embrace
- [kirrg001](https://github.com/kirrg001), Instana
- [MartenH](https://github.com/mhennoch), Splunk
- [Mike Goldsmith](https://github.com/MikeGoldsmith), Honeycomb
- [Motti](https://github.com/mottibec)
- [Punya Biswal](https://github.com/punya), Google
- [Siim Kallas](https://github.com/seemk), Splunk
- [Trivikram Kamat](https://github.com/trivikr), AWS
- [t2t2](https://github.com/t2t2), Splunk

*Find more about the triager role in the [community repository](https://github.com/open-telemetry/community/blob/main/guides/contributor/membership.md#triager).*

Expand Down
3 changes: 0 additions & 3 deletions api/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,6 @@
"clean": "tsc --build --clean tsconfig.json tsconfig.esm.json tsconfig.esnext.json",
"precompile": "cross-var lerna run version --scope $npm_package_name --include-dependencies",
"compile": "tsc --build tsconfig.json tsconfig.esm.json tsconfig.esnext.json",
"docs": "typedoc",
"docs:deploy": "gh-pages --dist docs/out",
"docs:test": "linkinator docs/out --silent && linkinator docs/*.md *.md --markdown --silent",
"lint:fix": "eslint . --ext .ts --fix",
"lint": "eslint . --ext .ts",
"test:browser": "karma start --single-run",
Expand Down
6 changes: 6 additions & 0 deletions api/src/experimental/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/

/**
* Any exports here may change at any time and without warning
* @module @opentelemetry/api/experimental
*/

export { wrapTracer, SugaredTracer } from './trace/SugaredTracer';
export { SugaredSpanOptions } from './trace/SugaredOptions';
4 changes: 4 additions & 0 deletions api/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@
* limitations under the License.
*/

/**
* @module @opentelemetry/api
*/

export { BaggageEntry, BaggageEntryMetadata, Baggage } from './baggage/types';
export { baggageEntryMetadataFromString } from './baggage/utils';
export { Exception } from './common/Exception';
Expand Down
6 changes: 6 additions & 0 deletions api/typedoc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"entryPoints": [
"src/index.ts",
"src/experimental/index.ts"
]
}
2 changes: 1 addition & 1 deletion examples/esm-http-ts/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,6 @@
"@opentelemetry/resources": "1.30.0",
"@opentelemetry/sdk-trace-base": "1.30.0",
"@opentelemetry/sdk-trace-node": "1.30.0",
"@opentelemetry/semantic-conventions": "1.29.0"
"@opentelemetry/semantic-conventions": "^1.29.0"
}
}
2 changes: 1 addition & 1 deletion examples/http/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
"@opentelemetry/resources": "1.30.0",
"@opentelemetry/sdk-trace-base": "1.30.0",
"@opentelemetry/sdk-trace-node": "1.30.0",
"@opentelemetry/semantic-conventions": "1.29.0"
"@opentelemetry/semantic-conventions": "^1.29.0"
},
"homepage": "https://github.com/open-telemetry/opentelemetry-js/tree/main/examples/http",
"devDependencies": {
Expand Down
2 changes: 1 addition & 1 deletion examples/https/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
"@opentelemetry/resources": "1.30.0",
"@opentelemetry/sdk-trace-base": "1.30.0",
"@opentelemetry/sdk-trace-node": "1.30.0",
"@opentelemetry/semantic-conventions": "1.29.0"
"@opentelemetry/semantic-conventions": "^1.29.0"
},
"homepage": "https://github.com/open-telemetry/opentelemetry-js/tree/main/examples/https",
"devDependencies": {
Expand Down
2 changes: 1 addition & 1 deletion examples/opentelemetry-web/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@
"@opentelemetry/sdk-metrics": "1.30.0",
"@opentelemetry/sdk-trace-base": "1.30.0",
"@opentelemetry/sdk-trace-web": "1.30.0",
"@opentelemetry/semantic-conventions": "1.29.0"
"@opentelemetry/semantic-conventions": "^1.29.0"
},
"homepage": "https://github.com/open-telemetry/opentelemetry-js/tree/main/examples/tracer-web"
}
2 changes: 1 addition & 1 deletion examples/otlp-exporter-node/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
"@opentelemetry/resources": "1.30.0",
"@opentelemetry/sdk-metrics": "1.30.0",
"@opentelemetry/sdk-trace-base": "1.30.0",
"@opentelemetry/semantic-conventions": "1.29.0"
"@opentelemetry/semantic-conventions": "^1.29.0"
},
"homepage": "https://github.com/open-telemetry/opentelemetry-js/tree/main/examples/otlp-exporter-node"
}
1 change: 1 addition & 0 deletions experimental/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ All notable changes to experimental packages in this project will be documented
* refactor(otlp-exporter-base): remove unnecessary isNaN() checks [#5374](https://github.com/open-telemetry/opentelemetry-js/pull/5374) @cjihrig
* refactor(exporter-prometheus): remove unnecessary isNaN() check [#5377](https://github.com/open-telemetry/opentelemetry-js/pull/5377) @cjihrig
* refactor(sdk-node): move code to auto-instantiate propagators into utils [#5355](https://github.com/open-telemetry/opentelemetry-js/pull/5355) @pichlermarc
* chore: unpin `@opentelemetry/semantic-conventions` dep to allow better de-duplication in installs [#5439](https://github.com/open-telemetry/opentelemetry-js/pull/5439) @trentm

## 0.57.0

Expand Down
2 changes: 1 addition & 1 deletion experimental/examples/opencensus-shim/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
"@opentelemetry/resources": "1.30.0",
"@opentelemetry/sdk-metrics": "1.30.0",
"@opentelemetry/sdk-trace-node": "1.30.0",
"@opentelemetry/semantic-conventions": "1.29.0",
"@opentelemetry/semantic-conventions": "^1.29.0",
"@opentelemetry/shim-opencensus": "0.57.0"
},
"homepage": "https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/examples/opencensus-shim"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
},
"devDependencies": {
"@opentelemetry/api": "1.9.0",
"@opentelemetry/semantic-conventions": "1.29.0",
"@opentelemetry/semantic-conventions": "^1.29.0",
"@types/mocha": "10.0.10",
"@types/node": "18.6.5",
"@types/sinon": "17.0.3",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@
"@opentelemetry/core": "1.30.0",
"@opentelemetry/instrumentation": "0.57.0",
"@opentelemetry/sdk-trace-web": "1.30.0",
"@opentelemetry/semantic-conventions": "1.29.0"
"@opentelemetry/semantic-conventions": "^1.29.0"
},
"homepage": "https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-instrumentation-fetch",
"sideEffects": false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@
},
"dependencies": {
"@opentelemetry/instrumentation": "0.57.0",
"@opentelemetry/semantic-conventions": "1.29.0"
"@opentelemetry/semantic-conventions": "^1.29.0"
},
"homepage": "https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-instrumentation-grpc",
"sideEffects": false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@
"dependencies": {
"@opentelemetry/core": "1.30.0",
"@opentelemetry/instrumentation": "0.57.0",
"@opentelemetry/semantic-conventions": "1.29.0",
"@opentelemetry/semantic-conventions": "^1.29.0",
"forwarded-parse": "2.1.2"
},
"homepage": "https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-instrumentation-http",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@
"@opentelemetry/core": "1.30.0",
"@opentelemetry/instrumentation": "0.57.0",
"@opentelemetry/sdk-trace-web": "1.30.0",
"@opentelemetry/semantic-conventions": "1.29.0"
"@opentelemetry/semantic-conventions": "^1.29.0"
},
"homepage": "https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-instrumentation-xml-http-request",
"sideEffects": false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,11 @@
* limitations under the License.
*/
import * as api from '@opentelemetry/api';
import { otperformance as performance, isWrapped } from '@opentelemetry/core';
import { registerInstrumentations } from '@opentelemetry/instrumentation';
import { otperformance as performance } from '@opentelemetry/core';
import {
registerInstrumentations,
isWrapped,
} from '@opentelemetry/instrumentation';
import {
B3Propagator,
B3InjectEncoding,
Expand Down
2 changes: 1 addition & 1 deletion experimental/packages/opentelemetry-sdk-node/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@
"@opentelemetry/sdk-metrics": "1.30.0",
"@opentelemetry/sdk-trace-base": "1.30.0",
"@opentelemetry/sdk-trace-node": "1.30.0",
"@opentelemetry/semantic-conventions": "1.29.0"
"@opentelemetry/semantic-conventions": "^1.29.0"
},
"peerDependencies": {
"@opentelemetry/api": ">=1.3.0 <1.10.0"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { baggageUtils } from '@opentelemetry/core';
import { parseKeyPairsIntoRecord } from '@opentelemetry/core';
import { diag } from '@opentelemetry/api';
import { getSharedConfigurationFromEnvironment } from './shared-env-configuration';
import { OtlpHttpConfiguration } from './otlp-http-configuration';
Expand All @@ -27,10 +27,10 @@ function getStaticHeadersFromEnv(
const nonSignalSpecificRawHeaders =
process.env['OTEL_EXPORTER_OTLP_HEADERS']?.trim();

const signalSpecificHeaders = baggageUtils.parseKeyPairsIntoRecord(
const signalSpecificHeaders = parseKeyPairsIntoRecord(
signalSpecificRawHeaders
);
const nonSignalSpecificHeaders = baggageUtils.parseKeyPairsIntoRecord(
const nonSignalSpecificHeaders = parseKeyPairsIntoRecord(
nonSignalSpecificRawHeaders
);

Expand All @@ -45,8 +45,8 @@ function getStaticHeadersFromEnv(
// the non-specific ones.
return Object.assign(
{},
baggageUtils.parseKeyPairsIntoRecord(nonSignalSpecificRawHeaders),
baggageUtils.parseKeyPairsIntoRecord(signalSpecificRawHeaders)
parseKeyPairsIntoRecord(nonSignalSpecificRawHeaders),
parseKeyPairsIntoRecord(signalSpecificRawHeaders)
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
*/
import { UnresolvedOtlpGrpcConfiguration } from './otlp-grpc-configuration';
import type { ChannelCredentials, Metadata } from '@grpc/grpc-js';
import { baggageUtils } from '@opentelemetry/core';
import { parseKeyPairsIntoRecord } from '@opentelemetry/core';
import {
createEmptyMetadata,
createInsecureCredentials,
Expand Down Expand Up @@ -47,10 +47,10 @@ function getMetadataFromEnv(signalIdentifier: string): Metadata | undefined {
const nonSignalSpecificRawHeaders =
process.env['OTEL_EXPORTER_OTLP_HEADERS']?.trim();

const signalSpecificHeaders = baggageUtils.parseKeyPairsIntoRecord(
const signalSpecificHeaders = parseKeyPairsIntoRecord(
signalSpecificRawHeaders
);
const nonSignalSpecificHeaders = baggageUtils.parseKeyPairsIntoRecord(
const nonSignalSpecificHeaders = parseKeyPairsIntoRecord(
nonSignalSpecificRawHeaders
);

Expand Down
3 changes: 2 additions & 1 deletion experimental/packages/otlp-transformer/src/common/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@

import type { OtlpEncodingOptions, Fixed64, LongBits } from './internal-types';
import { HrTime } from '@opentelemetry/api';
import { hexToBinary, hrTimeToNanoseconds } from '@opentelemetry/core';
import { hrTimeToNanoseconds } from '@opentelemetry/core';
import { hexToBinary } from './hex-to-binary';

export function hrTimeToNanos(hrTime: HrTime): bigint {
const NANOSECONDS = BigInt(1_000_000_000);
Expand Down
2 changes: 1 addition & 1 deletion experimental/packages/otlp-transformer/test/common.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@
* limitations under the License.
*/

import { hexToBinary } from '@opentelemetry/core';
import { toAnyValue } from '../src/common/internal';
import * as assert from 'assert';
import { getOtlpEncoder } from '../src/common/utils';
import { hexToBinary } from '../src/common/hex-to-binary';

const traceId = 'abcdef01234567890000000000000000';
const spanId = '12341234abcdabcd';
Expand Down
3 changes: 2 additions & 1 deletion experimental/packages/otlp-transformer/test/logs.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* limitations under the License.
*/
import { HrTime, TraceFlags } from '@opentelemetry/api';
import { InstrumentationScope, hexToBinary } from '@opentelemetry/core';
import { InstrumentationScope } from '@opentelemetry/core';
import { Resource } from '@opentelemetry/resources';
import * as assert from 'assert';
import { ReadableLogRecord } from '@opentelemetry/sdk-logs';
Expand All @@ -29,6 +29,7 @@ import {
import { createExportLogsServiceRequest } from '../src/logs/internal';
import { ProtobufLogsSerializer } from '../src/logs/protobuf';
import { JsonLogsSerializer } from '../src/logs/json';
import { hexToBinary } from '../src/common/hex-to-binary';

function createExpectedLogJson(
options: OtlpEncodingOptions
Expand Down
3 changes: 2 additions & 1 deletion experimental/packages/otlp-transformer/test/trace.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
*/
import * as root from '../src/generated/root';
import { SpanKind, SpanStatusCode, TraceFlags } from '@opentelemetry/api';
import { TraceState, hexToBinary } from '@opentelemetry/core';
import { TraceState } from '@opentelemetry/core';
import { Resource } from '@opentelemetry/resources';
import { ReadableSpan } from '@opentelemetry/sdk-trace-base';
import * as assert from 'assert';
Expand All @@ -25,6 +25,7 @@ import { ESpanKind, EStatusCode } from '../src/trace/internal-types';
import { createExportTraceServiceRequest } from '../src/trace/internal';
import { ProtobufTraceSerializer } from '../src/trace/protobuf';
import { JsonTraceSerializer } from '../src/trace/json';
import { hexToBinary } from '../src/common/hex-to-binary';

function createExpectedSpanJson(options: OtlpEncodingOptions) {
const useHex = options.useHex ?? false;
Expand Down
2 changes: 1 addition & 1 deletion experimental/packages/otlp-transformer/test/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* limitations under the License.
*/

import { hexToBinary } from '@opentelemetry/core';
import { hexToBinary } from '../src/common/hex-to-binary';

/**
* utility function to convert a string representing a hex value to a base64 string
Expand Down
2 changes: 1 addition & 1 deletion experimental/packages/web-common/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@
"dependencies": {
"@opentelemetry/sdk-logs": "0.57.0",
"@opentelemetry/sdk-trace-base": "1.30.0",
"@opentelemetry/semantic-conventions": "1.29.0"
"@opentelemetry/semantic-conventions": "^1.29.0"
},
"devDependencies": {
"@babel/core": "7.26.7",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

import { Context } from '@opentelemetry/api';
import { LogRecord, LogRecordProcessor } from '@opentelemetry/sdk-logs';
import { ATTR_SESSION_ID } from '@opentelemetry/semantic-conventions/incubating';
import { ATTR_SESSION_ID } from './semconv';
import { SessionProvider } from './types/SessionProvider';

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import {
Span,
ReadableSpan,
} from '@opentelemetry/sdk-trace-base';
import { ATTR_SESSION_ID } from '@opentelemetry/semantic-conventions/incubating';
import { ATTR_SESSION_ID } from './semconv';
import { SessionProvider } from './types/SessionProvider';

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,9 @@
* limitations under the License.
*/

import { hexToBinary } from '../../common/hex-to-binary';

export function hexToBase64(hexStr: string): string {
return btoa(String.fromCharCode(...hexToBinary(hexStr)));
}
/**
* A unique id to identify a session.
*
* @example "00112233-4455-6677-8899-aabbccddeeff"
*/
export const ATTR_SESSION_ID = 'session.id' as const;
Loading

0 comments on commit c194801

Please sign in to comment.