diff --git a/examples/hello-world-web/README.md b/examples/hello-world-web/README.md index 924c68b2..67966952 100644 --- a/examples/hello-world-web/README.md +++ b/examples/hello-world-web/README.md @@ -4,13 +4,14 @@ You can run this example to see the SDK in action. ## Run this application -`npm install` +`npm install` Paste your API key into `index.js`, where is says "your api key goes here". -`npm run build` TODO: this step doesn't work. The module isn't published yet. +`npm run build` -`npm run serve` + +`npm run start` Visit [http://localhost:8080]() to see "hello world". diff --git a/package-lock.json b/package-lock.json index 70027587..8abafa9e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "@opentelemetry/api": "^1.7.0", "@opentelemetry/exporter-trace-otlp-http": "^0.46.0", "@opentelemetry/instrumentation": "^0.45.1", + "@opentelemetry/opentelemetry-browser-detector": "^0.47.0", "@opentelemetry/resources": "^1.19.0", "@opentelemetry/sdk-trace-base": "^1.18.1", "@opentelemetry/sdk-trace-web": "^1.18.1", @@ -1434,6 +1435,58 @@ "@opentelemetry/api": "^1.3.0" } }, + "node_modules/@opentelemetry/opentelemetry-browser-detector": { + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/opentelemetry-browser-detector/-/opentelemetry-browser-detector-0.47.0.tgz", + "integrity": "sha512-SRzvsmemGIzCooPB+osXqSMRLnECP9bNjmmkg1EbPxz0/SJ+9/wE6yxLjQwThw7ZS0Rd/CDoeNf45lNgY+uQdA==", + "dependencies": { + "@opentelemetry/resources": "1.20.0", + "@opentelemetry/semantic-conventions": "1.20.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/opentelemetry-browser-detector/node_modules/@opentelemetry/core": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.20.0.tgz", + "integrity": "sha512-lSRvk5AIdD6CtgYJcJXh0wGibQ3S/8bC2qbqKs9wK8e0K1tsWV6YkGFOqVc+jIRlCbZoIBeZzDe5UI+vb94uvg==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.20.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.8.0" + } + }, + "node_modules/@opentelemetry/opentelemetry-browser-detector/node_modules/@opentelemetry/resources": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.20.0.tgz", + "integrity": "sha512-nOpV0vGegSq+9ze2cEDvO3BMA5pGBhmhKZiAlj+xQZjiEjPmJtdHIuBLRvptu2ahcbFJw85gIB9BYHZOvZK1JQ==", + "dependencies": { + "@opentelemetry/core": "1.20.0", + "@opentelemetry/semantic-conventions": "1.20.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.8.0" + } + }, + "node_modules/@opentelemetry/opentelemetry-browser-detector/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.20.0.tgz", + "integrity": "sha512-3zLJJCgTKYpbqFX8drl8hOCHtdchELC+kGqlVcV4mHW1DiElTtv1Nt9EKBptTd1IfL56QkuYnWJ3DeHd2Gtu/A==", + "engines": { + "node": ">=14" + } + }, "node_modules/@opentelemetry/otlp-exporter-base": { "version": "0.46.0", "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.46.0.tgz", @@ -8648,6 +8701,39 @@ "shimmer": "^1.2.1" } }, + "@opentelemetry/opentelemetry-browser-detector": { + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/opentelemetry-browser-detector/-/opentelemetry-browser-detector-0.47.0.tgz", + "integrity": "sha512-SRzvsmemGIzCooPB+osXqSMRLnECP9bNjmmkg1EbPxz0/SJ+9/wE6yxLjQwThw7ZS0Rd/CDoeNf45lNgY+uQdA==", + "requires": { + "@opentelemetry/resources": "1.20.0", + "@opentelemetry/semantic-conventions": "1.20.0" + }, + "dependencies": { + "@opentelemetry/core": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.20.0.tgz", + "integrity": "sha512-lSRvk5AIdD6CtgYJcJXh0wGibQ3S/8bC2qbqKs9wK8e0K1tsWV6YkGFOqVc+jIRlCbZoIBeZzDe5UI+vb94uvg==", + "requires": { + "@opentelemetry/semantic-conventions": "1.20.0" + } + }, + "@opentelemetry/resources": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.20.0.tgz", + "integrity": "sha512-nOpV0vGegSq+9ze2cEDvO3BMA5pGBhmhKZiAlj+xQZjiEjPmJtdHIuBLRvptu2ahcbFJw85gIB9BYHZOvZK1JQ==", + "requires": { + "@opentelemetry/core": "1.20.0", + "@opentelemetry/semantic-conventions": "1.20.0" + } + }, + "@opentelemetry/semantic-conventions": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.20.0.tgz", + "integrity": "sha512-3zLJJCgTKYpbqFX8drl8hOCHtdchELC+kGqlVcV4mHW1DiElTtv1Nt9EKBptTd1IfL56QkuYnWJ3DeHd2Gtu/A==" + } + } + }, "@opentelemetry/otlp-exporter-base": { "version": "0.46.0", "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.46.0.tgz", diff --git a/package.json b/package.json index fd479a19..e54a4b2d 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "@opentelemetry/api": "^1.7.0", "@opentelemetry/exporter-trace-otlp-http": "^0.46.0", "@opentelemetry/instrumentation": "^0.45.1", + "@opentelemetry/opentelemetry-browser-detector": "^0.47.0", "@opentelemetry/resources": "^1.19.0", "@opentelemetry/sdk-trace-base": "^1.18.1", "@opentelemetry/sdk-trace-web": "^1.18.1", diff --git a/src/base-otel-sdk.ts b/src/base-otel-sdk.ts index abddda63..e9f04139 100644 --- a/src/base-otel-sdk.ts +++ b/src/base-otel-sdk.ts @@ -23,7 +23,6 @@ import { registerInstrumentations, } from '@opentelemetry/instrumentation'; import { - browserDetector, Detector, DetectorSync, detectResourcesSync, @@ -42,6 +41,7 @@ import { import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions'; import { WebSDKConfiguration } from './types'; import { SessionIdSpanProcessor } from './session-id-span-processor'; +import { browserDetector } from '@opentelemetry/opentelemetry-browser-detector'; /** This class represents everything needed to register a fully configured OpenTelemetry Web SDK */ diff --git a/src/honeycomb-otel-sdk.ts b/src/honeycomb-otel-sdk.ts index ef8c9c67..364a7633 100644 --- a/src/honeycomb-otel-sdk.ts +++ b/src/honeycomb-otel-sdk.ts @@ -1,11 +1,14 @@ import { WebSDK } from './base-otel-sdk'; import { HoneycombOptions } from './types'; import { configureHoneycombHttpJsonTraceExporter } from './http-json-trace-exporter'; +import { configureHoneycombResource } from './honeycomb-resource'; export class HoneycombWebSDK extends WebSDK { constructor(options?: HoneycombOptions) { super({ + resource: configureHoneycombResource(options), traceExporter: configureHoneycombHttpJsonTraceExporter(options), + ...options, }); } diff --git a/src/honeycomb-resource.ts b/src/honeycomb-resource.ts new file mode 100644 index 00000000..4f4426c4 --- /dev/null +++ b/src/honeycomb-resource.ts @@ -0,0 +1,12 @@ +import { Resource } from '@opentelemetry/resources'; +import { HoneycombOptions } from './types'; +import { VERSION } from './version'; + +export function configureHoneycombResource( + options?: HoneycombOptions, +): Resource { + return new Resource({ + 'honeycomb.distro.version': VERSION, + 'honeycomb.distro.runtime_version': 'browser', + }).merge(options?.resource ? options.resource : null); +} diff --git a/src/version.ts b/src/version.ts new file mode 100644 index 00000000..ecebcdd9 --- /dev/null +++ b/src/version.ts @@ -0,0 +1 @@ +export const VERSION = '0.0.1'; diff --git a/test/honeycomb-resource.test.ts b/test/honeycomb-resource.test.ts new file mode 100644 index 00000000..4bdc8dfa --- /dev/null +++ b/test/honeycomb-resource.test.ts @@ -0,0 +1,26 @@ +import { configureHoneycombResource } from '../src/honeycomb-resource'; +import { Resource } from '@opentelemetry/resources'; +import { VERSION } from '../src/version'; + +test('it should return a Resource', () => { + const resource = configureHoneycombResource(); + expect(resource).toBeInstanceOf(Resource); + expect(resource.attributes['honeycomb.distro.version']).toEqual(VERSION); + expect(resource.attributes['honeycomb.distro.runtime_version']).toEqual( + 'browser', + ); +}); + +test('it should merge resource attributes provided from another resource', () => { + const resource = configureHoneycombResource({ + resource: new Resource({ + myTestAttr: 'my-test-attr', + }), + }); + expect(resource).toBeInstanceOf(Resource); + expect(resource.attributes['honeycomb.distro.version']).toEqual(VERSION); + expect(resource.attributes['honeycomb.distro.runtime_version']).toEqual( + 'browser', + ); + expect(resource.attributes.myTestAttr).toEqual('my-test-attr'); +});