Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: browser support for exporter-trace-otlp-proto #3208

Merged
merged 51 commits into from
Jan 20, 2023
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
915ce52
add node & browser platform for exporter-trace-otlp-proto
pkanal Aug 24, 2022
87327f0
add browser support for proto base exporter
pkanal Aug 25, 2022
b7c8c19
add base browser class with xhr support
pkanal Aug 25, 2022
1fec3b3
add browser class for proto trace exporter
pkanal Aug 25, 2022
4214129
slight tweaks to make it work
pkanal Aug 25, 2022
d33f9bb
send data as blob to avoid making sync xhr requests
pkanal Aug 26, 2022
3dd4e17
fix lint
pkanal Oct 3, 2022
35c193f
remove console.logs and add browser proto example
pkanal Oct 3, 2022
5ed212d
cleanup and start adding tests
pkanal Oct 12, 2022
933d37e
Merge branch 'main' of github.com:pkanal/opentelemetry-js into proto-…
scheler Nov 7, 2022
9953561
Undo formatting changes
scheler Nov 7, 2022
5e87c85
exporter-trace-otlp-proto: fix compile errors
scheler Nov 8, 2022
1616d2b
Misc updates from review comments
scheler Nov 9, 2022
e3043b0
Merge branch 'main' of github.com:pkanal/opentelemetry-js into proto-…
scheler Nov 10, 2022
0020c98
Adding changelog entry
scheler Nov 10, 2022
6125ec2
Merge branch 'open-telemetry:main' into proto-exporter-browser
scheler Nov 10, 2022
c420fd0
Reverting format changes not needed
scheler Nov 12, 2022
f260db8
Merge branch 'main' into proto-exporter-browser
legendecas Nov 15, 2022
fb6cfd2
Merge branch 'open-telemetry:main' into proto-exporter-browser
scheler Nov 16, 2022
3d9ae04
Moving the send function into the class for browser case.
scheler Nov 29, 2022
46b665a
Merge branch 'main' into proto-exporter-browser
scheler Nov 30, 2022
2000c41
Adjust indentation to fix lint errors
scheler Nov 30, 2022
6366e4b
Remove template parameter that's not needed
scheler Nov 30, 2022
50e1af0
Apply review changes
scheler Dec 4, 2022
302e09c
Merge branch 'main' into proto-exporter-browser
scheler Dec 4, 2022
a16fcf5
fix the import path
scheler Dec 5, 2022
266d293
Addressing lint errors
scheler Dec 5, 2022
4cd39c0
Merge branch 'main' into proto-exporter-browser
scheler Dec 6, 2022
ed1835e
Merge branch 'open-telemetry:main' into proto-exporter-browser
scheler Dec 10, 2022
84be752
Explicit imports for browser case
scheler Dec 12, 2022
d92f5fe
More explicit exports
scheler Dec 13, 2022
61c7be7
Add missing exports
scheler Dec 13, 2022
3eed4bb
Address lint issues with export statements
scheler Dec 14, 2022
c618265
Adding missing exports
scheler Dec 14, 2022
cbabbf1
Adding missing export
scheler Dec 14, 2022
519fa7c
Using import from top level folder
scheler Dec 14, 2022
5f67e56
Merge branch 'open-telemetry:main' into proto-exporter-browser
scheler Dec 28, 2022
ad2aa0e
Trigger Build
scheler Dec 28, 2022
e57f0f2
Merge branch 'proto-exporter-browser' of github.com:pkanal/openteleme…
scheler Dec 28, 2022
b26fd7f
Merge branch 'main' into proto-exporter-browser
pichlermarc Jan 2, 2023
f421989
Update experimental/packages/exporter-trace-otlp-proto/test/browser/C…
scheler Jan 2, 2023
8064d5b
Remove trailing comma
scheler Jan 2, 2023
2678ff3
Remove blank line to fix lint error
scheler Jan 2, 2023
c898ea2
Fixes based on testing opentelemetry-web/fetch-proto
scheler Jan 6, 2023
d48503a
Add additional missing export
scheler Jan 12, 2023
a800550
Skip hex conversion of traceId for the protobuf
scheler Jan 12, 2023
598bc56
Add esm/esnext builds for the proto packages
scheler Jan 12, 2023
5596d13
Merge branch 'main' into proto-exporter-browser
scheler Jan 13, 2023
1788269
Merge branch 'main' into proto-exporter-browser
legendecas Jan 17, 2023
2e0c4ec
Merge branch 'main' into proto-exporter-browser
scheler Jan 19, 2023
9429864
Trigger Build
scheler Jan 19, 2023
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
63 changes: 38 additions & 25 deletions examples/opentelemetry-web/examples/fetch/index.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@
const { context, trace } = require( '@opentelemetry/api');
const { ConsoleSpanExporter, SimpleSpanProcessor } = require( '@opentelemetry/sdk-trace-base');
const { OTLPTraceExporter } = require( '@opentelemetry/exporter-trace-otlp-http');
const { WebTracerProvider } = require( '@opentelemetry/sdk-trace-web');
const { FetchInstrumentation } = require( '@opentelemetry/instrumentation-fetch');
const { ZoneContextManager } = require( '@opentelemetry/context-zone');
const { B3Propagator } = require( '@opentelemetry/propagator-b3');
const { registerInstrumentations } = require( '@opentelemetry/instrumentation');
const { context, trace } = require("@opentelemetry/api");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like this file has only formatting changes. If so, can you submit them in a separate PR and revert them here?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We also prefer single quotes over double quotes in the repo, but there is just no eslint rule for *.js files at the moment. For this reason, and for making this PR easier to review, undoning the formatting changes would be greatly appreciated 🙂

const {
ConsoleSpanExporter,
SimpleSpanProcessor,
} = require("@opentelemetry/sdk-trace-base");
const {
OTLPTraceExporter,
} = require("@opentelemetry/exporter-trace-otlp-http");
const { WebTracerProvider } = require("@opentelemetry/sdk-trace-web");
const {
FetchInstrumentation,
} = require("@opentelemetry/instrumentation-fetch");
const { ZoneContextManager } = require("@opentelemetry/context-zone");
const { B3Propagator } = require("@opentelemetry/propagator-b3");
const { registerInstrumentations } = require("@opentelemetry/instrumentation");

const provider = new WebTracerProvider();

Expand All @@ -14,6 +21,7 @@ const provider = new WebTracerProvider();
// exporter without delay
provider.addSpanProcessor(new SimpleSpanProcessor(new ConsoleSpanExporter()));
provider.addSpanProcessor(new SimpleSpanProcessor(new OTLPTraceExporter()));

provider.register({
contextManager: new ZoneContextManager(),
propagator: new B3Propagator(),
Expand All @@ -24,49 +32,54 @@ registerInstrumentations({
new FetchInstrumentation({
ignoreUrls: [/localhost:8090\/sockjs-node/],
propagateTraceHeaderCorsUrls: [
'https://cors-test.appspot.com/test',
'https://httpbin.org/get',
"https://cors-test.appspot.com/test",
"https://httpbin.org/get",
],
clearTimingResources: true,
}),
],
});

const webTracerWithZone = provider.getTracer('example-tracer-web');
const webTracerWithZone = provider.getTracer("example-tracer-web");

const getData = (url) => fetch(url, {
method: 'GET',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
});
const getData = (url) =>
fetch(url, {
method: "GET",
headers: {
Accept: "application/json",
"Content-Type": "application/json",
},
});

// example of keeping track of context between async operations
const prepareClickEvent = () => {
const url = 'https://httpbin.org/get';
const url = "https://httpbin.org/get";

const element = document.getElementById('button1');
const element = document.getElementById("button1");

const onClick = () => {
const singleSpan = webTracerWithZone.startSpan('files-series-info');
const singleSpan = webTracerWithZone.startSpan("files-series-info");
context.with(trace.setSpan(context.active(), singleSpan), () => {
getData(url).then((_data) => {
trace.getSpan(context.active()).addEvent('fetching-single-span-completed');
trace
.getSpan(context.active())
.addEvent("fetching-single-span-completed");
singleSpan.end();
});
});
for (let i = 0, j = 5; i < j; i += 1) {
const span = webTracerWithZone.startSpan(`files-series-info-${i}`);
context.with(trace.setSpan(context.active(), span), () => {
getData(url).then((_data) => {
trace.getSpan(context.active()).addEvent(`fetching-span-${i}-completed`);
trace
.getSpan(context.active())
.addEvent(`fetching-span-${i}-completed`);
span.end();
});
});
}
};
element.addEventListener('click', onClick);
element.addEventListener("click", onClick);
};

window.addEventListener('load', prepareClickEvent);
window.addEventListener("load", prepareClickEvent);
20 changes: 20 additions & 0 deletions examples/opentelemetry-web/examples/fetchProtoExporter/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<!DOCTYPE html>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You might want to call this folder fetch-proto to keep it simple

<html lang="en">

<head>
<meta charset="utf-8">
<title>Fetch Plugin Example</title>
<base href="/">

<meta name="viewport" content="width=device-width, initial-scale=1">
</head>

<body>
Example of using Web Tracer with Fetch plugin with console exporter and proto exporter
<script type="text/javascript" src="fetchProtoExporter.js"></script>
<br/>
<button id="button1">Test</button>

</body>

</html>
97 changes: 97 additions & 0 deletions examples/opentelemetry-web/examples/fetchProtoExporter/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
const { context, trace } = require("@opentelemetry/api");
const {
ConsoleSpanExporter,
SimpleSpanProcessor,
} = require("@opentelemetry/sdk-trace-base");
const { WebTracerProvider } = require("@opentelemetry/sdk-trace-web");
const {
FetchInstrumentation,
} = require("@opentelemetry/instrumentation-fetch");
const { ZoneContextManager } = require("@opentelemetry/context-zone");
const { B3Propagator } = require("@opentelemetry/propagator-b3");
const { registerInstrumentations } = require("@opentelemetry/instrumentation");
const {
OTLPTraceExporter: OTLPTraceExporterProto,
} = require("@opentelemetry/exporter-trace-otlp-proto/build/src/platform");
pichlermarc marked this conversation as resolved.
Show resolved Hide resolved

const provider = new WebTracerProvider();

// Note: For production consider using the "BatchSpanProcessor" to reduce the number of requests
// to your exporter. Using the SimpleSpanProcessor here as it sends the spans immediately to the
// exporter without delay
provider.addSpanProcessor(new SimpleSpanProcessor(new ConsoleSpanExporter()));
provider.addSpanProcessor(
new SimpleSpanProcessor(new OTLPTraceExporterProto())
);

// provider.addSpanProcessor(
pichlermarc marked this conversation as resolved.
Show resolved Hide resolved
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This commented out code can be removed, I think 🙂

// new SimpleSpanProcessor(
// new OTLPTraceExporterProto({
// url: "https://api.honeycomb.io/v1/traces",
// headers: {
// },
// })
// )
// );

provider.register({
contextManager: new ZoneContextManager(),
propagator: new B3Propagator(),
});

registerInstrumentations({
instrumentations: [
new FetchInstrumentation({
ignoreUrls: [/localhost:8090\/sockjs-node/],
propagateTraceHeaderCorsUrls: [
"https://cors-test.appspot.com/test",
"https://httpbin.org/get",
],
clearTimingResources: true,
}),
],
});

const webTracerWithZone = provider.getTracer("example-tracer-web");

const getData = (url) =>
fetch(url, {
method: "GET",
headers: {
Accept: "application/json",
"Content-Type": "application/json",
},
});

// example of keeping track of context between async operations
const prepareClickEvent = () => {
const url = "https://httpbin.org/get";

const element = document.getElementById("button1");

const onClick = () => {
const singleSpan = webTracerWithZone.startSpan("files-series-info");
context.with(trace.setSpan(context.active(), singleSpan), () => {
getData(url).then((_data) => {
trace
.getSpan(context.active())
.addEvent("fetching-single-span-completed");
singleSpan.end();
});
});
for (let i = 0, j = 5; i < j; i += 1) {
const span = webTracerWithZone.startSpan(`files-series-info-${i}`);
context.with(trace.setSpan(context.active(), span), () => {
getData(url).then((_data) => {
trace
.getSpan(context.active())
.addEvent(`fetching-span-${i}-completed`);
span.end();
});
});
}
};
element.addEventListener("click", onClick);
};

window.addEventListener("load", prepareClickEvent);
3 changes: 2 additions & 1 deletion examples/opentelemetry-web/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,13 @@
"webpack-merge": "^5.8.0"
},
"dependencies": {
"@opentelemetry/api": "^1.0.2",
"@opentelemetry/api": "^1.2.0",
pichlermarc marked this conversation as resolved.
Show resolved Hide resolved
"@opentelemetry/api-metrics": "0.33.0",
"@opentelemetry/context-zone": "1.7.0",
"@opentelemetry/core": "1.7.0",
"@opentelemetry/exporter-metrics-otlp-http": "0.33.0",
"@opentelemetry/exporter-trace-otlp-http": "0.33.0",
"@opentelemetry/exporter-trace-otlp-proto": "^0.33.0",
pichlermarc marked this conversation as resolved.
Show resolved Hide resolved
"@opentelemetry/exporter-zipkin": "1.7.0",
"@opentelemetry/instrumentation": "0.33.0",
"@opentelemetry/instrumentation-fetch": "0.33.0",
Expand Down
46 changes: 22 additions & 24 deletions examples/opentelemetry-web/webpack.dev.config.js
Original file line number Diff line number Diff line change
@@ -1,66 +1,64 @@
const webpack = require('webpack');
const webpackMerge = require('webpack-merge');
const path = require('path');
const webpack = require("webpack");
const webpackMerge = require("webpack-merge");
const path = require("path");

const directory = path.resolve(__dirname);

const common = {
mode: 'development',
mode: "development",
entry: {
metrics: 'examples/metrics/index.js',
fetch: 'examples/fetch/index.js',
'xml-http-request': 'examples/xml-http-request/index.js',
fetchXhr: 'examples/fetchXhr/index.js',
fetchXhrB3: 'examples/fetchXhrB3/index.js',
zipkin: 'examples/zipkin/index.js',
metrics: "examples/metrics/index.js",
fetch: "examples/fetch/index.js",
"xml-http-request": "examples/xml-http-request/index.js",
fetchXhr: "examples/fetchXhr/index.js",
fetchXhrB3: "examples/fetchXhrB3/index.js",
fetchProtoExporter: "examples/fetchProtoExporter/index.js",
zipkin: "examples/zipkin/index.js",
},
output: {
path: path.resolve(__dirname, 'dist'),
filename: '[name].js',
sourceMapFilename: '[file].map',
path: path.resolve(__dirname, "dist"),
filename: "[name].js",
sourceMapFilename: "[file].map",
},
target: 'web',
target: "web",
module: {
rules: [
{
test: /\.js[x]?$/,
exclude: /(node_modules)/,
use: {
loader: 'babel-loader',
loader: "babel-loader",
},
},
{
test: /\.ts$/,
exclude: /(node_modules)/,
use: {
loader: 'ts-loader',
loader: "ts-loader",
},
},
],
},
resolve: {
modules: [
path.resolve(directory),
'node_modules',
],
extensions: ['.ts', '.js', '.jsx', '.json'],
modules: [path.resolve(directory), "node_modules"],
extensions: [".ts", ".js", ".jsx", ".json"],
},
optimization: {
minimize: false,
},
};

module.exports = webpackMerge.merge(common, {
devtool: 'eval-source-map',
devtool: "eval-source-map",
devServer: {
static: {
directory: path.resolve(__dirname, 'examples'),
directory: path.resolve(__dirname, "examples"),
},
compress: true,
},
plugins: [
new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify('development'),
"process.env.NODE_ENV": JSON.stringify("development"),
}),
],
});
Original file line number Diff line number Diff line change
Expand Up @@ -583,17 +583,14 @@ describe('when configuring via environment', () => {
it('should use headers defined via env', () => {
envSource.OTEL_EXPORTER_OTLP_HEADERS = 'foo=bar';
const collectorExporter = new OTLPTraceExporter({ headers: {} });
// @ts-expect-error access internal property for testing
assert.strictEqual(collectorExporter._headers.foo, 'bar');
envSource.OTEL_EXPORTER_OTLP_HEADERS = '';
});
it('should override global headers config with signal headers defined via env', () => {
envSource.OTEL_EXPORTER_OTLP_HEADERS = 'foo=bar,bar=foo';
envSource.OTEL_EXPORTER_OTLP_TRACES_HEADERS = 'foo=boo';
const collectorExporter = new OTLPTraceExporter({ headers: {} });
// @ts-expect-error access internal property for testing
assert.strictEqual(collectorExporter._headers.foo, 'boo');
// @ts-expect-error access internal property for testing
assert.strictEqual(collectorExporter._headers.bar, 'foo');
envSource.OTEL_EXPORTER_OTLP_TRACES_HEADERS = '';
envSource.OTEL_EXPORTER_OTLP_HEADERS = '';
Expand Down
26 changes: 26 additions & 0 deletions experimental/packages/exporter-trace-otlp-proto/karma.conf.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/*!
* 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
*
* http://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.
*/

const karmaWebpackConfig = require('../../../karma.webpack');
const karmaBaseConfig = require('../../../karma.base');

module.exports = (config) => {
config.set(Object.assign({}, karmaBaseConfig, {
webpack: karmaWebpackConfig,
files: ['test/browser/index-webpack.ts'],
preprocessors: { 'test/browser/index-webpack.ts': ['webpack'] }
}))
};
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,21 @@
"main": "build/src/index.js",
pichlermarc marked this conversation as resolved.
Show resolved Hide resolved
"types": "build/src/index.d.ts",
"repository": "open-telemetry/opentelemetry-js",
"browser": {
"./src/platform/index.ts": "./src/platform/browser/index.ts",
"./build/esm/platform/index.js": "./build/esm/platform/browser/index.js",
"./build/esnext/platform/index.js": "./build/esnext/platform/browser/index.js",
"./build/src/platform/index.js": "./build/src/platform/browser/index.js"
},
"scripts": {
"prepublishOnly": "npm run compile",
"compile": "tsc --build",
"clean": "tsc --build --clean",
"lint": "eslint . --ext .ts",
"lint:fix": "eslint . --ext .ts --fix",
"tdd": "npm run test -- --watch-extensions ts --watch",
"test": "nyc ts-mocha -p tsconfig.json 'test/**/*.test.ts'",
"test": "nyc ts-mocha -p tsconfig.json 'test/**/*.test.ts' --exclude 'test/browser/**/*.ts'",
"test:browser": "nyc karma start --single-run",
"version": "node ../../../scripts/version-update.js",
"watch": "tsc -w",
"precompile": "lerna run version --scope $(npm pkg get name) --include-dependencies",
Expand Down
Loading