Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,11 @@ experimental/packages/api-logs/ @open-telemetry/javascript-maintainers
# Any browser-specific code is co-owned by Browser SIG and JS SIG (list more packages here as needed):
bundler-tests/ @open-telemetry/browser-maintainers @open-telemetry/javascript-approvers
examples/opentelemetry-web/ @open-telemetry/browser-maintainers @open-telemetry/javascript-approvers
experimental/packages/**/*browser* @open-telemetry/browser-maintainers @open-telemetry/javascript-approvers
experimental/packages/opentelemetry-browser-detector/ @open-telemetry/browser-maintainers @open-telemetry/javascript-approvers
experimental/packages/opentelemetry-instrumentation-fetch/ @open-telemetry/browser-maintainers @open-telemetry/javascript-approvers
experimental/packages/opentelemetry-instrumentation-xml-http-request/ @open-telemetry/browser-maintainers @open-telemetry/javascript-approvers
experimental/packages/otlp-exporter-base/src/transport/fetch-transport.ts @open-telemetry/browser-maintainers @open-telemetry/javascript-approvers
experimental/packages/web-common/ @open-telemetry/browser-maintainers @open-telemetry/javascript-approvers
packages/opentelemetry-context-zone/ @open-telemetry/browser-maintainers @open-telemetry/javascript-approvers
packages/opentelemetry-context-zone-peer-dep/ @open-telemetry/browser-maintainers @open-telemetry/javascript-approvers
Expand Down
3 changes: 3 additions & 0 deletions experimental/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2

### :bug: Bug Fixes

* fix(otlp-exporter-base): remove sendBeacon in favor of fetch with keepalive [#6391](https://github.com/open-telemetry/opentelemetry-js/pull/6391) @overbalance
* (user-facing) createOtlpSendBeaconExportDelegate will be removed in a future version

### :books: Documentation

### :house: Internal
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,56 +35,26 @@ describe('OTLPLogExporter', function () {
});

describe('export', function () {
describe('when sendBeacon is available', function () {
it('should successfully send data using sendBeacon', async function () {
// arrange
const stubBeacon = sinon.stub(navigator, 'sendBeacon');
const loggerProvider = new LoggerProvider({
processors: [new SimpleLogRecordProcessor(new OTLPLogExporter())],
});

// act
loggerProvider.getLogger('test-logger').emit({ body: 'test-body' });
await loggerProvider.shutdown();

// assert
const args = stubBeacon.args[0];
const blob: Blob = args[1] as unknown as Blob;
const body = await blob.text();
assert.doesNotThrow(
() => JSON.parse(body),
'expected requestBody to be in JSON format, but parsing failed'
);
});
});

describe('when sendBeacon is not available', function () {
beforeEach(function () {
// fake sendBeacon not being available
(window.navigator as any).sendBeacon = false;
it('should successfully send data using fetch', async function () {
// arrange
const stubFetch = sinon
.stub(window, 'fetch')
.resolves(new Response('', { status: 200 }));
const loggerProvider = new LoggerProvider({
processors: [new SimpleLogRecordProcessor(new OTLPLogExporter())],
});

it('should successfully send data using fetch', async function () {
// arrange
const stubFetch = sinon
.stub(window, 'fetch')
.resolves(new Response('', { status: 200 }));
const loggerProvider = new LoggerProvider({
processors: [new SimpleLogRecordProcessor(new OTLPLogExporter())],
});

// act
loggerProvider.getLogger('test-logger').emit({ body: 'test-body' });
await loggerProvider.shutdown();

// assert
const request = new Request(...stubFetch.args[0]);
const body = await request.text();
assert.doesNotThrow(
() => JSON.parse(body),
'expected requestBody to be in JSON format, but parsing failed'
);
});
// act
loggerProvider.getLogger('test-logger').emit({ body: 'test-body' });
await loggerProvider.shutdown();

// assert
const request = new Request(...stubFetch.args[0]);
const body = await request.text();
assert.doesNotThrow(
() => JSON.parse(body),
'expected requestBody to be in JSON format, but parsing failed'
);
});
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -35,56 +35,26 @@ describe('OTLPLogExporter', function () {
});

describe('export', function () {
describe('when sendBeacon is available', function () {
it('should successfully send data using sendBeacon', async function () {
// arrange
const stubBeacon = sinon.stub(navigator, 'sendBeacon');
const loggerProvider = new LoggerProvider({
processors: [new SimpleLogRecordProcessor(new OTLPLogExporter())],
});

// act
loggerProvider.getLogger('test-logger').emit({ body: 'test-body' });
await loggerProvider.shutdown();

// assert
const args = stubBeacon.args[0];
const blob: Blob = args[1] as unknown as Blob;
const body = await blob.text();
assert.throws(
() => JSON.parse(body),
'expected requestBody to be in protobuf format, but parsing as JSON succeeded'
);
});
});

describe('when sendBeacon is not available', function () {
beforeEach(function () {
// fake sendBeacon not being available
(window.navigator as any).sendBeacon = false;
it('should successfully send data using fetch', async function () {
// arrange
const stubFetch = sinon
.stub(window, 'fetch')
.resolves(new Response('', { status: 200 }));
const loggerProvider = new LoggerProvider({
processors: [new SimpleLogRecordProcessor(new OTLPLogExporter())],
});

it('should successfully send data using fetch', async function () {
// arrange
const stubFetch = sinon
.stub(window, 'fetch')
.resolves(new Response('', { status: 200 }));
const loggerProvider = new LoggerProvider({
processors: [new SimpleLogRecordProcessor(new OTLPLogExporter())],
});

// act
loggerProvider.getLogger('test-logger').emit({ body: 'test-body' });
await loggerProvider.shutdown();

// assert
const request = new Request(...stubFetch.args[0]);
const body = await request.text();
assert.throws(
() => JSON.parse(body),
'expected requestBody to be in protobuf format, but parsing as JSON succeeded'
);
});
// act
loggerProvider.getLogger('test-logger').emit({ body: 'test-body' });
await loggerProvider.shutdown();

// assert
const request = new Request(...stubFetch.args[0]);
const body = await request.text();
assert.throws(
() => JSON.parse(body),
'expected requestBody to be in protobuf format, but parsing as JSON succeeded'
);
});
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -36,56 +36,26 @@ describe('OTLPTraceExporter', () => {
});

describe('export', function () {
describe('when sendBeacon is available', function () {
it('should successfully send data using sendBeacon', async function () {
// arrange
const stubBeacon = sinon.stub(navigator, 'sendBeacon');
const tracerProvider = new BasicTracerProvider({
spanProcessors: [new SimpleSpanProcessor(new OTLPTraceExporter())],
});

// act
tracerProvider.getTracer('test-tracer').startSpan('test-span').end();
await tracerProvider.shutdown();

// assert
const args = stubBeacon.args[0];
const blob: Blob = args[1] as unknown as Blob;
const body = await blob.text();
assert.doesNotThrow(
() => JSON.parse(body),
'expected requestBody to be in JSON format, but parsing failed'
);
});
});

describe('when sendBeacon is not available', function () {
beforeEach(function () {
// fake sendBeacon not being available
(window.navigator as any).sendBeacon = false;
it('should successfully send data using fetch', async function () {
// arrange
const stubFetch = sinon
.stub(window, 'fetch')
.resolves(new Response('', { status: 200 }));
const tracerProvider = new BasicTracerProvider({
spanProcessors: [new SimpleSpanProcessor(new OTLPTraceExporter())],
});

it('should successfully send data using fetch', async function () {
// arrange
const stubFetch = sinon
.stub(window, 'fetch')
.resolves(new Response('', { status: 200 }));
const tracerProvider = new BasicTracerProvider({
spanProcessors: [new SimpleSpanProcessor(new OTLPTraceExporter())],
});

// act
tracerProvider.getTracer('test-tracer').startSpan('test-span').end();
await tracerProvider.shutdown();

// assert
const request = new Request(...stubFetch.args[0]);
const body = await request.text();
assert.doesNotThrow(
() => JSON.parse(body),
'expected requestBody to be in JSON format, but parsing failed'
);
});
// act
tracerProvider.getTracer('test-tracer').startSpan('test-span').end();
await tracerProvider.shutdown();

// assert
const request = new Request(...stubFetch.args[0]);
const body = await request.text();
assert.doesNotThrow(
() => JSON.parse(body),
'expected requestBody to be in JSON format, but parsing failed'
);
});
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -36,56 +36,26 @@ describe('OTLPTraceExporter', () => {
});

describe('export', function () {
describe('when sendBeacon is available', function () {
it('should successfully send data using sendBeacon', async function () {
// arrange
const stubBeacon = sinon.stub(navigator, 'sendBeacon');
const tracerProvider = new BasicTracerProvider({
spanProcessors: [new SimpleSpanProcessor(new OTLPTraceExporter())],
});

// act
tracerProvider.getTracer('test-tracer').startSpan('test-span').end();
await tracerProvider.shutdown();

// assert
const args = stubBeacon.args[0];
const blob: Blob = args[1] as unknown as Blob;
const body = await blob.text();
assert.throws(
() => JSON.parse(body),
'expected requestBody to be in protobuf format, but parsing as JSON succeeded'
);
});
});

describe('when sendBeacon is not available', function () {
beforeEach(function () {
// fake sendBeacon not being available
(window.navigator as any).sendBeacon = false;
it('should successfully send data using fetch', async function () {
// arrange
const stubFetch = sinon
.stub(window, 'fetch')
.resolves(new Response('', { status: 200 }));
const tracerProvider = new BasicTracerProvider({
spanProcessors: [new SimpleSpanProcessor(new OTLPTraceExporter())],
});

it('should successfully send data using fetch', async function () {
// arrange
const stubFetch = sinon
.stub(window, 'fetch')
.resolves(new Response('', { status: 200 }));
const tracerProvider = new BasicTracerProvider({
spanProcessors: [new SimpleSpanProcessor(new OTLPTraceExporter())],
});

// act
tracerProvider.getTracer('test-tracer').startSpan('test-span').end();
await tracerProvider.shutdown();

// assert
const request = new Request(...stubFetch.args[0]);
const body = await request.text();
assert.throws(
() => JSON.parse(body),
'expected request body to be in protobuf format, but parsing as JSON succeeded'
);
});
// act
tracerProvider.getTracer('test-tracer').startSpan('test-span').end();
await tracerProvider.shutdown();

// assert
const request = new Request(...stubFetch.args[0]);
const body = await request.text();
assert.throws(
() => JSON.parse(body),
'expected request body to be in protobuf format, but parsing as JSON succeeded'
);
});
});
});
Loading