diff --git a/.gitmodules b/.gitmodules index 817382141b..33a9a7d9b2 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,12 +1,6 @@ -[submodule "experimental/packages/exporter-trace-otlp-proto/protos"] - path = experimental/packages/exporter-trace-otlp-proto/protos +[submodule "experimental/packages/otlp-grpc-exporter-base/protos"] + path = experimental/packages/otlp-grpc-exporter-base/protos url = https://github.com/open-telemetry/opentelemetry-proto.git -[submodule "experimental/packages/exporter-trace-otlp-grpc/protos"] - path = experimental/packages/exporter-trace-otlp-grpc/protos - url = https://github.com/open-telemetry/opentelemetry-proto.git -[submodule "experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/protos"] - path = experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/protos - url = https://github.com/open-telemetry/opentelemetry-proto.git -[submodule "experimental/packages/opentelemetry-exporter-metrics-otlp-proto/protos"] - path = experimental/packages/opentelemetry-exporter-metrics-otlp-proto/protos +[submodule "experimental/packages/otlp-proto-exporter-base/protos"] + path = experimental/packages/otlp-proto-exporter-base/protos url = https://github.com/open-telemetry/opentelemetry-proto.git diff --git a/experimental/CHANGELOG.md b/experimental/CHANGELOG.md index 58681558d4..343e435b2d 100644 --- a/experimental/CHANGELOG.md +++ b/experimental/CHANGELOG.md @@ -16,6 +16,10 @@ All notable changes to experimental packages in this project will be documented * updated `opentelemetry-sdk-node` to the latest Metrics SDK. * updated `otlp-transformer` to the latest Metrics SDK. * updated all `instrumentation-*` packages to use local implementations of `parseUrl()` due to #2884 +* refactor(otlp-exporters) move base classes and associated types into their own packages #2893 @pichlermarc + * `otlp-exporter-base` => `OTLPExporterBase`, `OTLPExporterBrowserBase`, `OTLPExporterNodeBase` + * `otlp-grpc-exporter-base` => `OTLPGRPCExporterNodeBase` + * `otlp-proto-exporter-base` => `OTLPProtoExporterNodeBase` ### :rocket: (Enhancement) diff --git a/experimental/packages/exporter-trace-otlp-grpc/package.json b/experimental/packages/exporter-trace-otlp-grpc/package.json index 3c1e0f47ca..c8349a7038 100644 --- a/experimental/packages/exporter-trace-otlp-grpc/package.json +++ b/experimental/packages/exporter-trace-otlp-grpc/package.json @@ -11,13 +11,10 @@ "clean": "tsc --build --clean", "lint": "eslint . --ext .ts", "lint:fix": "eslint . --ext .ts --fix", - "postcompile": "npm run submodule && npm run protos:copy", - "protos:copy": "cpx protos/opentelemetry/**/*.* build/protos/opentelemetry", - "submodule": "git submodule sync --recursive && git submodule update --init --recursive", "tdd": "npm run test -- --watch-extensions ts --watch", "test": "nyc ts-mocha -p tsconfig.json 'test/**/*.test.ts'", "version": "node ../../../scripts/version-update.js", - "watch": "npm run protos:copy && tsc -w", + "watch": "tsc -w", "precompile": "lerna run version --scope $(npm pkg get name) --include-dependencies", "prewatch": "npm run precompile", "peer-api-check": "node ../../../scripts/peer-api-check.js", @@ -52,6 +49,7 @@ "devDependencies": { "@babel/core": "7.16.0", "@opentelemetry/api": "^1.0.0", + "@opentelemetry/otlp-exporter-base": "0.27.0", "@types/mocha": "8.2.3", "@types/node": "14.17.33", "@types/sinon": "10.0.6", @@ -73,6 +71,7 @@ "@grpc/grpc-js": "^1.5.9", "@grpc/proto-loader": "^0.6.9", "@opentelemetry/exporter-trace-otlp-http": "0.27.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.27.0", "@opentelemetry/resources": "1.1.1", "@opentelemetry/sdk-trace-base": "1.1.1" } diff --git a/experimental/packages/exporter-trace-otlp-grpc/src/OTLPTraceExporter.ts b/experimental/packages/exporter-trace-otlp-grpc/src/OTLPTraceExporter.ts index 871d3f31db..d08e679e99 100644 --- a/experimental/packages/exporter-trace-otlp-grpc/src/OTLPTraceExporter.ts +++ b/experimental/packages/exporter-trace-otlp-grpc/src/OTLPTraceExporter.ts @@ -15,15 +15,18 @@ */ import { ReadableSpan, SpanExporter } from '@opentelemetry/sdk-trace-base'; -import { OTLPExporterNodeBase } from './OTLPExporterNodeBase'; import { otlpTypes, toOTLPExportTraceServiceRequest, } from '@opentelemetry/exporter-trace-otlp-http'; -import { OTLPExporterConfigNode, ServiceClientType } from './types'; import { baggageUtils, getEnv } from '@opentelemetry/core'; -import { validateAndNormalizeUrl } from './util'; import { Metadata } from '@grpc/grpc-js'; +import { + OTLPGRPCExporterConfigNode, + OTLPGRPCExporterNodeBase, + ServiceClientType, + validateAndNormalizeUrl +} from '@opentelemetry/otlp-grpc-exporter-base'; const DEFAULT_COLLECTOR_URL = 'localhost:4317'; @@ -31,13 +34,11 @@ const DEFAULT_COLLECTOR_URL = 'localhost:4317'; * OTLP Trace Exporter for Node */ export class OTLPTraceExporter - extends OTLPExporterNodeBase< - ReadableSpan, - otlpTypes.opentelemetryProto.collector.trace.v1.ExportTraceServiceRequest - > + extends OTLPGRPCExporterNodeBase implements SpanExporter { - constructor(config: OTLPExporterConfigNode = {}) { + constructor(config: OTLPGRPCExporterConfigNode = {}) { super(config); const headers = baggageUtils.parseKeyPairsIntoRecord(getEnv().OTEL_EXPORTER_OTLP_TRACES_HEADERS); this.metadata ||= new Metadata(); @@ -52,14 +53,14 @@ export class OTLPTraceExporter return toOTLPExportTraceServiceRequest(spans, this); } - getDefaultUrl(config: OTLPExporterConfigNode) { + getDefaultUrl(config: OTLPGRPCExporterConfigNode) { return typeof config.url === 'string' ? validateAndNormalizeUrl(config.url) : getEnv().OTEL_EXPORTER_OTLP_TRACES_ENDPOINT.length > 0 - ? validateAndNormalizeUrl(getEnv().OTEL_EXPORTER_OTLP_TRACES_ENDPOINT) - : getEnv().OTEL_EXPORTER_OTLP_ENDPOINT.length > 0 - ? validateAndNormalizeUrl(getEnv().OTEL_EXPORTER_OTLP_ENDPOINT) - : DEFAULT_COLLECTOR_URL; + ? validateAndNormalizeUrl(getEnv().OTEL_EXPORTER_OTLP_TRACES_ENDPOINT) + : getEnv().OTEL_EXPORTER_OTLP_ENDPOINT.length > 0 + ? validateAndNormalizeUrl(getEnv().OTEL_EXPORTER_OTLP_ENDPOINT) + : DEFAULT_COLLECTOR_URL; } getServiceClientType() { diff --git a/experimental/packages/exporter-trace-otlp-grpc/src/index.ts b/experimental/packages/exporter-trace-otlp-grpc/src/index.ts index 34975b3ed5..761e8a9262 100644 --- a/experimental/packages/exporter-trace-otlp-grpc/src/index.ts +++ b/experimental/packages/exporter-trace-otlp-grpc/src/index.ts @@ -14,7 +14,4 @@ * limitations under the License. */ -export * from './OTLPExporterNodeBase'; export * from './OTLPTraceExporter'; -export { ServiceClientType, OTLPExporterConfigNode } from './types'; -export { validateAndNormalizeUrl } from './util'; diff --git a/experimental/packages/exporter-trace-otlp-grpc/submodule.md b/experimental/packages/exporter-trace-otlp-grpc/submodule.md deleted file mode 100644 index c091e09692..0000000000 --- a/experimental/packages/exporter-trace-otlp-grpc/submodule.md +++ /dev/null @@ -1,46 +0,0 @@ -# Important - -**Submodule is always pointing to certain revision number. So updating the submodule repo will not have impact on your code. -Knowing this if you want to change the submodule to point to a different version (when for example proto has changed) here is how to do it:** - -## Updating submodule to point to certain revision number - -1. Make sure you are in the same folder as this instruction - -2. Update your submodules by running this command - - ```shell script - git submodule sync --recursive - git submodule update --init --recursive - ``` - -3. Find the SHA which you want to update to and copy it (the long one) -the latest sha when this guide was written is `b54688569186e0b862bf7462a983ccf2c50c0547` - -4. Enter a submodule directory from this directory - - ```shell script - cd protos - ``` - -5. Updates files in the submodule tree to given commit: - - ```shell script - git checkout -q - ``` - -6. Return to the main directory: - - ```shell script - cd ../ - ``` - -7. Please run `git status` you should see something like `Head detached at`. This is correct, go to next step - -8. Now thing which is very important. You have to commit this to apply these changes - - ```shell script - git commit -am "chore: updating submodule for opentelemetry-proto" - ``` - -9. If you look now at git log you will notice that the folder `protos` has been changed and it will show what was the previous sha and what is current one. diff --git a/experimental/packages/exporter-trace-otlp-grpc/test/OTLPTraceExporter.test.ts b/experimental/packages/exporter-trace-otlp-grpc/test/OTLPTraceExporter.test.ts index 412dfd822d..7d44d4938e 100644 --- a/experimental/packages/exporter-trace-otlp-grpc/test/OTLPTraceExporter.test.ts +++ b/experimental/packages/exporter-trace-otlp-grpc/test/OTLPTraceExporter.test.ts @@ -35,12 +35,12 @@ import { ensureResourceIsCorrect, mockedReadableSpan, } from './traceHelper'; - -import { CompressionAlgorithm } from '../src/types'; +import { CompressionAlgorithm } from '@opentelemetry/otlp-exporter-base'; +import { GrpcCompressionAlgorithm } from '@opentelemetry/otlp-grpc-exporter-base'; const traceServiceProtoPath = 'opentelemetry/proto/collector/trace/v1/trace_service.proto'; -const includeDirs = [path.resolve(__dirname, '../protos')]; +const includeDirs = [path.resolve(__dirname, '../../otlp-grpc-exporter-base/protos')]; const address = 'localhost:1501'; @@ -267,7 +267,7 @@ const testCollectorExporter = (params: TestParams) => credentials, metadata: params.metadata, }); - assert.strictEqual(collectorExporter.compression, CompressionAlgorithm.GZIP); + assert.strictEqual(collectorExporter.compression, GrpcCompressionAlgorithm.GZIP); delete envSource.OTEL_EXPORTER_OTLP_COMPRESSION; }); }); @@ -337,3 +337,5 @@ describe('when configuring via environment', () => { testCollectorExporter({ useTLS: true }); testCollectorExporter({ useTLS: false }); testCollectorExporter({ metadata }); + + diff --git a/experimental/packages/exporter-trace-otlp-grpc/tsconfig.json b/experimental/packages/exporter-trace-otlp-grpc/tsconfig.json index 3b28c06f67..4a71bbfef6 100644 --- a/experimental/packages/exporter-trace-otlp-grpc/tsconfig.json +++ b/experimental/packages/exporter-trace-otlp-grpc/tsconfig.json @@ -20,6 +20,12 @@ }, { "path": "../exporter-trace-otlp-http" + }, + { + "path": "../otlp-exporter-base" + }, + { + "path": "../otlp-grpc-exporter-base" } ] } diff --git a/experimental/packages/exporter-trace-otlp-http/package.json b/experimental/packages/exporter-trace-otlp-http/package.json index bab3b1c633..8f301a6505 100644 --- a/experimental/packages/exporter-trace-otlp-http/package.json +++ b/experimental/packages/exporter-trace-otlp-http/package.json @@ -96,6 +96,7 @@ "dependencies": { "@opentelemetry/core": "1.1.1", "@opentelemetry/resources": "1.1.1", - "@opentelemetry/sdk-trace-base": "1.1.1" + "@opentelemetry/sdk-trace-base": "1.1.1", + "@opentelemetry/otlp-exporter-base": "0.27.0" } } diff --git a/experimental/packages/exporter-trace-otlp-http/src/index.ts b/experimental/packages/exporter-trace-otlp-http/src/index.ts index bd025cd4d6..d22bb9029d 100644 --- a/experimental/packages/exporter-trace-otlp-http/src/index.ts +++ b/experimental/packages/exporter-trace-otlp-http/src/index.ts @@ -14,8 +14,6 @@ * limitations under the License. */ -export * from './OTLPExporterBase'; export * from './platform'; export * as otlpTypes from './types'; export { toCollectorResource, toOTLPExportTraceServiceRequest } from './transform'; -export { appendResourcePathToUrlIfNotPresent } from './util'; diff --git a/experimental/packages/exporter-trace-otlp-http/src/platform/browser/OTLPTraceExporter.ts b/experimental/packages/exporter-trace-otlp-http/src/platform/browser/OTLPTraceExporter.ts index 91ee101423..28411089f6 100644 --- a/experimental/packages/exporter-trace-otlp-http/src/platform/browser/OTLPTraceExporter.ts +++ b/experimental/packages/exporter-trace-otlp-http/src/platform/browser/OTLPTraceExporter.ts @@ -14,13 +14,12 @@ * limitations under the License. */ -import { OTLPExporterConfigBase } from '../../types'; -import { OTLPExporterBrowserBase } from './OTLPExporterBrowserBase'; +import { appendResourcePathToUrlIfNotPresent, OTLPExporterBrowserBase } from '@opentelemetry/otlp-exporter-base'; import { ReadableSpan, SpanExporter } from '@opentelemetry/sdk-trace-base'; import { toOTLPExportTraceServiceRequest } from '../../transform'; import * as otlpTypes from '../../types'; import { getEnv, baggageUtils } from '@opentelemetry/core'; -import { appendResourcePathToUrlIfNotPresent } from '../../util'; +import { OTLPExporterConfigBase } from '@opentelemetry/otlp-exporter-base'; const DEFAULT_COLLECTOR_RESOURCE_PATH = '/v1/traces'; const DEFAULT_COLLECTOR_URL=`http://localhost:4318${DEFAULT_COLLECTOR_RESOURCE_PATH}`; diff --git a/experimental/packages/exporter-trace-otlp-http/src/platform/browser/index.ts b/experimental/packages/exporter-trace-otlp-http/src/platform/browser/index.ts index 6a322e976a..761e8a9262 100644 --- a/experimental/packages/exporter-trace-otlp-http/src/platform/browser/index.ts +++ b/experimental/packages/exporter-trace-otlp-http/src/platform/browser/index.ts @@ -15,4 +15,3 @@ */ export * from './OTLPTraceExporter'; -export * from './OTLPExporterBrowserBase'; diff --git a/experimental/packages/exporter-trace-otlp-http/src/platform/index.ts b/experimental/packages/exporter-trace-otlp-http/src/platform/index.ts index a33b81cffb..cdaf8858ce 100644 --- a/experimental/packages/exporter-trace-otlp-http/src/platform/index.ts +++ b/experimental/packages/exporter-trace-otlp-http/src/platform/index.ts @@ -15,4 +15,3 @@ */ export * from './node'; -export { OTLPExporterBrowserBase } from './browser'; diff --git a/experimental/packages/exporter-trace-otlp-http/src/platform/node/OTLPTraceExporter.ts b/experimental/packages/exporter-trace-otlp-http/src/platform/node/OTLPTraceExporter.ts index 82bdff3aef..d4a6e21a93 100644 --- a/experimental/packages/exporter-trace-otlp-http/src/platform/node/OTLPTraceExporter.ts +++ b/experimental/packages/exporter-trace-otlp-http/src/platform/node/OTLPTraceExporter.ts @@ -15,24 +15,24 @@ */ import { ReadableSpan, SpanExporter } from '@opentelemetry/sdk-trace-base'; -import { OTLPExporterNodeBase } from './OTLPExporterNodeBase'; -import { OTLPExporterNodeConfigBase } from './types'; import * as otlpTypes from '../../types'; import { toOTLPExportTraceServiceRequest } from '../../transform'; import { getEnv, baggageUtils } from '@opentelemetry/core'; -import { appendResourcePathToUrlIfNotPresent } from '../../util'; +import { OTLPExporterNodeBase } from '@opentelemetry/otlp-exporter-base'; +import { + OTLPExporterNodeConfigBase, + appendResourcePathToUrlIfNotPresent +} from '@opentelemetry/otlp-exporter-base'; const DEFAULT_COLLECTOR_RESOURCE_PATH = '/v1/traces'; -const DEFAULT_COLLECTOR_URL=`http://localhost:4318${DEFAULT_COLLECTOR_RESOURCE_PATH}`; +const DEFAULT_COLLECTOR_URL = `http://localhost:4318${DEFAULT_COLLECTOR_RESOURCE_PATH}`; /** * Collector Trace Exporter for Node */ export class OTLPTraceExporter - extends OTLPExporterNodeBase< - ReadableSpan, - otlpTypes.opentelemetryProto.collector.trace.v1.ExportTraceServiceRequest - > + extends OTLPExporterNodeBase implements SpanExporter { constructor(config: OTLPExporterNodeConfigBase = {}) { super(config); @@ -50,13 +50,13 @@ export class OTLPTraceExporter return toOTLPExportTraceServiceRequest(spans, this, true); } - getDefaultUrl(config: OTLPExporterNodeConfigBase) : string { + getDefaultUrl(config: OTLPExporterNodeConfigBase): string { return typeof config.url === 'string' ? config.url : getEnv().OTEL_EXPORTER_OTLP_TRACES_ENDPOINT.length > 0 - ? getEnv().OTEL_EXPORTER_OTLP_TRACES_ENDPOINT - : getEnv().OTEL_EXPORTER_OTLP_ENDPOINT.length > 0 - ? appendResourcePathToUrlIfNotPresent(getEnv().OTEL_EXPORTER_OTLP_ENDPOINT, DEFAULT_COLLECTOR_RESOURCE_PATH) - : DEFAULT_COLLECTOR_URL; + ? getEnv().OTEL_EXPORTER_OTLP_TRACES_ENDPOINT + : getEnv().OTEL_EXPORTER_OTLP_ENDPOINT.length > 0 + ? appendResourcePathToUrlIfNotPresent(getEnv().OTEL_EXPORTER_OTLP_ENDPOINT, DEFAULT_COLLECTOR_RESOURCE_PATH) + : DEFAULT_COLLECTOR_URL; } } diff --git a/experimental/packages/exporter-trace-otlp-http/src/platform/node/index.ts b/experimental/packages/exporter-trace-otlp-http/src/platform/node/index.ts index ab18e724e0..761e8a9262 100644 --- a/experimental/packages/exporter-trace-otlp-http/src/platform/node/index.ts +++ b/experimental/packages/exporter-trace-otlp-http/src/platform/node/index.ts @@ -15,6 +15,3 @@ */ export * from './OTLPTraceExporter'; -export * from './OTLPExporterNodeBase'; -export * from './util'; -export * from './types'; diff --git a/experimental/packages/exporter-trace-otlp-http/src/transform.ts b/experimental/packages/exporter-trace-otlp-http/src/transform.ts index c6ddffea19..5224c527fa 100644 --- a/experimental/packages/exporter-trace-otlp-http/src/transform.ts +++ b/experimental/packages/exporter-trace-otlp-http/src/transform.ts @@ -24,12 +24,11 @@ import { import * as core from '@opentelemetry/core'; import { Resource } from '@opentelemetry/resources'; import { ReadableSpan, TimedEvent } from '@opentelemetry/sdk-trace-base'; -import { OTLPExporterBase } from './OTLPExporterBase'; import { OTLP_SPAN_KIND_MAPPING, opentelemetryProto, - OTLPExporterConfigBase, } from './types'; +import { OTLPExporterBase, OTLPExporterConfigBase } from '@opentelemetry/otlp-exporter-base'; const MAX_INTEGER_VALUE = 2147483647; const MIN_INTEGER_VALUE = -2147483648; diff --git a/experimental/packages/exporter-trace-otlp-http/src/types.ts b/experimental/packages/exporter-trace-otlp-http/src/types.ts index 3f2bd27a01..02be0ed2e4 100644 --- a/experimental/packages/exporter-trace-otlp-http/src/types.ts +++ b/experimental/packages/exporter-trace-otlp-http/src/types.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { SpanAttributes, SpanKind, SpanStatusCode } from '@opentelemetry/api'; +import { SpanKind, SpanStatusCode } from '@opentelemetry/api'; /* eslint-disable @typescript-eslint/no-namespace */ /* eslint-disable @typescript-eslint/no-unused-vars */ @@ -311,44 +311,6 @@ export namespace opentelemetryProto { } } -/** - * Interface for handling error - */ -export class OTLPExporterError extends Error { - readonly code?: number; - override readonly name: string = 'OTLPExporterError'; - readonly data?: string; - - constructor(message?: string, code?: number, data?: string) { - super(message); - this.data = data; - this.code = code; - } -} - -/** - * Interface for handling export service errors - */ -export interface ExportServiceError { - name: string; - code: number; - details: string; - metadata: { [key: string]: unknown }; - message: string; - stack: string; -} - -/** - * Collector Exporter base config - */ -export interface OTLPExporterConfigBase { - headers?: Partial>; - hostname?: string; - attributes?: SpanAttributes; - url?: string; - concurrencyLimit?: number; -} - /** * Mapping between api SpanKind and proto SpanKind */ diff --git a/experimental/packages/exporter-trace-otlp-http/test/browser/CollectorTraceExporter.test.ts b/experimental/packages/exporter-trace-otlp-http/test/browser/CollectorTraceExporter.test.ts index a66a7c59d0..1f57a5e959 100644 --- a/experimental/packages/exporter-trace-otlp-http/test/browser/CollectorTraceExporter.test.ts +++ b/experimental/packages/exporter-trace-otlp-http/test/browser/CollectorTraceExporter.test.ts @@ -14,13 +14,12 @@ * limitations under the License. */ -import { diag } from '@opentelemetry/api'; +import { diag, DiagLogger, DiagLogLevel } from '@opentelemetry/api'; import { ExportResultCode } from '@opentelemetry/core'; import { ReadableSpan } from '@opentelemetry/sdk-trace-base'; import * as assert from 'assert'; import * as sinon from 'sinon'; import { OTLPTraceExporter } from '../../src/platform/browser/index'; -import { OTLPExporterConfigBase } from '../../src/types'; import * as otlpTypes from '../../src/types'; import { @@ -30,6 +29,7 @@ import { ensureHeadersContain, mockedReadableSpan, } from '../traceHelper'; +import { OTLPExporterConfigBase } from '@opentelemetry/otlp-exporter-base'; describe('OTLPTraceExporter - web', () => { let collectorTraceExporter: OTLPTraceExporter; @@ -50,6 +50,38 @@ describe('OTLPTraceExporter - web', () => { sinon.restore(); }); + describe('constructor', () => { + let onInitSpy: any; + + beforeEach(() => { + onInitSpy = sinon.stub(OTLPTraceExporter.prototype, 'onInit'); + collectorExporterConfig = { + hostname: 'foo', + attributes: {}, + url: 'http://foo.bar.com', + }; + collectorTraceExporter = new OTLPTraceExporter(collectorExporterConfig); + }); + + it('should create an instance', () => { + assert.ok(typeof collectorTraceExporter !== 'undefined'); + }); + + it('should call onInit', () => { + assert.strictEqual(onInitSpy.callCount, 1); + }); + + describe('when config contains certain params', () => { + it('should set hostname', () => { + assert.strictEqual(collectorTraceExporter.hostname, 'foo'); + }); + + it('should set url', () => { + assert.strictEqual(collectorTraceExporter.url, 'http://foo.bar.com'); + }); + }); + }); + describe('export', () => { beforeEach(() => { collectorExporterConfig = { @@ -67,7 +99,8 @@ describe('OTLPTraceExporter - web', () => { }); it('should successfully send the spans using sendBeacon', done => { - collectorTraceExporter.export(spans, () => { }); + collectorTraceExporter.export(spans, () => { + }); setTimeout(async () => { const args = stubBeacon.args[0]; @@ -103,15 +136,27 @@ describe('OTLPTraceExporter - web', () => { }); it('should log the successful message', done => { - // Need to stub/spy on the underlying logger as the "diag" instance is global - const spyLoggerDebug = sinon.stub(diag, 'debug'); - const spyLoggerError = sinon.stub(diag, 'error'); + const spyLoggerDebug = sinon.stub(); + const spyLoggerError = sinon.stub(); + const nop = () => { + }; + const diagLogger: DiagLogger = { + debug: spyLoggerDebug, + error: spyLoggerError, + info: nop, + verbose: nop, + warn: nop + }; + + diag.setLogger(diagLogger, DiagLogLevel.ALL); + stubBeacon.returns(true); - collectorTraceExporter.export(spans, () => { }); + collectorTraceExporter.export(spans, () => { + }); setTimeout(() => { - const response: any = spyLoggerDebug.args[1][0]; + const response: any = spyLoggerDebug.args[2][0]; assert.strictEqual(response, 'sendBeacon - can send'); assert.strictEqual(spyLoggerError.args.length, 0); @@ -144,7 +189,8 @@ describe('OTLPTraceExporter - web', () => { }); it('should successfully send the spans using XMLHttpRequest', done => { - collectorTraceExporter.export(spans, () => { }); + collectorTraceExporter.export(spans, () => { + }); setTimeout(() => { const request = server.requests[0]; @@ -178,17 +224,28 @@ describe('OTLPTraceExporter - web', () => { }); it('should log the successful message', done => { - // Need to stub/spy on the underlying logger as the "diag" instance is global - const spyLoggerDebug = sinon.stub(diag, 'debug'); - const spyLoggerError = sinon.stub(diag, 'error'); - - collectorTraceExporter.export(spans, () => { }); + const spyLoggerDebug = sinon.stub(); + const spyLoggerError = sinon.stub(); + const nop = () => { + }; + const diagLogger: DiagLogger = { + debug: spyLoggerDebug, + error: spyLoggerError, + info: nop, + verbose: nop, + warn: nop + }; + + diag.setLogger(diagLogger, DiagLogLevel.ALL); + + collectorTraceExporter.export(spans, () => { + }); setTimeout(() => { const request = server.requests[0]; request.respond(200); - const response: any = spyLoggerDebug.args[1][0]; + const response: any = spyLoggerDebug.args[2][0]; assert.strictEqual(response, 'xhr success'); assert.strictEqual(spyLoggerError.args.length, 0); @@ -211,7 +268,8 @@ describe('OTLPTraceExporter - web', () => { }); it('should send custom headers', done => { - collectorTraceExporter.export(spans, () => { }); + collectorTraceExporter.export(spans, () => { + }); setTimeout(() => { const request = server.requests[0]; @@ -224,6 +282,83 @@ describe('OTLPTraceExporter - web', () => { }); }); + + describe('export - common', () => { + let spySend: any; + beforeEach(() => { + spySend = sinon.stub(OTLPTraceExporter.prototype, 'send'); + collectorTraceExporter = new OTLPTraceExporter(collectorExporterConfig); + }); + + it('should export spans as otlpTypes.Spans', done => { + const spans: ReadableSpan[] = []; + spans.push(Object.assign({}, mockedReadableSpan)); + + collectorTraceExporter.export(spans, () => { + }); + setTimeout(() => { + const span1 = spySend.args[0][0][0] as ReadableSpan; + assert.deepStrictEqual(spans[0], span1); + done(); + }); + assert.strictEqual(spySend.callCount, 1); + }); + + describe('when exporter is shutdown', () => { + it( + 'should not export anything but return callback with code' + + ' "FailedNotRetryable"', + async () => { + const spans: ReadableSpan[] = []; + spans.push(Object.assign({}, mockedReadableSpan)); + await collectorTraceExporter.shutdown(); + spySend.resetHistory(); + + const callbackSpy = sinon.spy(); + collectorTraceExporter.export(spans, callbackSpy); + const returnCode = callbackSpy.args[0][0]; + + assert.strictEqual( + returnCode.code, + ExportResultCode.FAILED, + 'return value is wrong' + ); + assert.strictEqual(spySend.callCount, 0, 'should not call send'); + } + ); + }); + describe('when an error occurs', () => { + it('should return failed export result', done => { + const spans: ReadableSpan[] = []; + spans.push(Object.assign({}, mockedReadableSpan)); + spySend.throws({ + code: 100, + details: 'Test error', + metadata: {}, + message: 'Non-retryable', + stack: 'Stack', + }); + const callbackSpy = sinon.spy(); + collectorTraceExporter.export(spans, callbackSpy); + setTimeout(() => { + const returnCode = callbackSpy.args[0][0]; + assert.strictEqual( + returnCode.code, + ExportResultCode.FAILED, + 'return value is wrong' + ); + assert.strictEqual( + returnCode.error.message, + 'Non-retryable', + 'return error message is wrong' + ); + assert.strictEqual(spySend.callCount, 1, 'should call send'); + done(); + }); + }); + }); + }); + describe('export with custom headers', () => { let server: any; const customHeaders = { @@ -249,7 +384,8 @@ describe('OTLPTraceExporter - web', () => { ); }); it('should successfully send custom headers using XMLHTTPRequest', done => { - collectorTraceExporter.export(spans, () => { }); + collectorTraceExporter.export(spans, () => { + }); setTimeout(() => { const [{ requestHeaders }] = server.requests; @@ -272,7 +408,8 @@ describe('OTLPTraceExporter - web', () => { }); it('should successfully send spans using XMLHttpRequest', done => { - collectorTraceExporter.export(spans, () => { }); + collectorTraceExporter.export(spans, () => { + }); setTimeout(() => { const [{ requestHeaders }] = server.requests; @@ -286,6 +423,35 @@ describe('OTLPTraceExporter - web', () => { }); }); }); + + describe('export - concurrency limit', () => { + it('should error if too many concurrent exports are queued', done => { + const collectorExporterWithConcurrencyLimit = new OTLPTraceExporter({ + ...collectorExporterConfig, + concurrencyLimit: 3, + }); + const spans: ReadableSpan[] = [{ ...mockedReadableSpan }]; + const callbackSpy = sinon.spy(); + for (let i = 0; i < 7; i++) { + collectorExporterWithConcurrencyLimit.export(spans, callbackSpy); + } + + const failures = callbackSpy.args.filter(([result]) => result.code === ExportResultCode.FAILED); + + setTimeout(() => { + // Expect 4 failures + assert.strictEqual(failures.length, 4); + failures.forEach(([result]) => { + assert.strictEqual(result.code, ExportResultCode.FAILED); + assert.strictEqual( + result.error!.message, + 'Concurrent export limit reached' + ); + }); + done(); + }); + }); + }); }); describe('OTLPTraceExporter - browser (getDefaultUrl)', () => { diff --git a/experimental/packages/exporter-trace-otlp-http/test/common/transform.test.ts b/experimental/packages/exporter-trace-otlp-http/test/common/transform.test.ts index b2dfdf2145..94932201b7 100644 --- a/experimental/packages/exporter-trace-otlp-http/test/common/transform.test.ts +++ b/experimental/packages/exporter-trace-otlp-http/test/common/transform.test.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { SpanAttributes } from '@opentelemetry/api'; +import { SpanAttributes, SpanStatusCode } from '@opentelemetry/api'; import { TimedEvent } from '@opentelemetry/sdk-trace-base'; import * as assert from 'assert'; import * as transform from '../../src/transform'; @@ -27,6 +27,7 @@ import { multiInstrumentationLibraryTrace, } from '../traceHelper'; import { Resource } from '@opentelemetry/resources'; + describe('transform', () => { describe('toCollectorAttributes', () => { it('should convert attribute string', () => { @@ -102,6 +103,44 @@ describe('transform', () => { }); }); + describe('toCollectorAnyValue', () => { + it('should use correct type on array', () => { + assert.deepStrictEqual(transform.toCollectorAnyValue(['string', true, 1]), { + arrayValue: { + values: + [ + { stringValue: 'string' }, + { boolValue: true }, + { intValue: 1 } + ] + } + }); + }); + + it('should use correct type on kvlist', () => { + assert.deepStrictEqual(transform.toCollectorAnyValue({ string: 'string', boolean: true, integer: 1 }), { + kvlistValue: { + values: + [ + { key: 'string', value: { stringValue: 'string' } }, + { key: 'boolean', value: { boolValue: true } }, + { key: 'integer', value: { intValue: 1 } } + ] + } + }); + }); + }); + + describe('toCollectorStatus', () => { + it('should set message if status is not undefined', () => { + const result = transform.toCollectorStatus({ + code: SpanStatusCode.OK, + message: 'message' + }); + assert.deepStrictEqual(result.message, 'message'); + }); + }); + describe('toCollectorSpan', () => { it('should convert span using hex', () => { ensureSpanIsCorrect(transform.toCollectorSpan(mockedReadableSpan, true)); diff --git a/experimental/packages/exporter-trace-otlp-http/test/node/CollectorTraceExporter.test.ts b/experimental/packages/exporter-trace-otlp-http/test/node/CollectorTraceExporter.test.ts index e01ff2980c..6ddd63a0fc 100644 --- a/experimental/packages/exporter-trace-otlp-http/test/node/CollectorTraceExporter.test.ts +++ b/experimental/packages/exporter-trace-otlp-http/test/node/CollectorTraceExporter.test.ts @@ -14,27 +14,29 @@ * limitations under the License. */ -import { diag } from '@opentelemetry/api'; +import { diag, DiagLogger } from '@opentelemetry/api'; import * as core from '@opentelemetry/core'; +import { + CompressionAlgorithm, + OTLPExporterError, + OTLPExporterNodeConfigBase +} from '@opentelemetry/otlp-exporter-base'; import { ReadableSpan } from '@opentelemetry/sdk-trace-base'; -import * as http from 'http'; import * as assert from 'assert'; +import * as http from 'http'; import * as sinon from 'sinon'; import { PassThrough, Stream } from 'stream'; import * as zlib from 'zlib'; import { - OTLPTraceExporter, - OTLPExporterNodeConfigBase, - CompressionAlgorithm, + OTLPTraceExporter } from '../../src/platform/node'; import * as otlpTypes from '../../src/types'; -import { MockedResponse } from './nodeHelpers'; - import { ensureExportTraceServiceRequestIsSet, ensureSpanIsCorrect, - mockedReadableSpan, + mockedReadableSpan } from '../traceHelper'; +import { MockedResponse } from './nodeHelpers'; let fakeRequest: PassThrough; @@ -56,12 +58,23 @@ describe('OTLPTraceExporter - node with json over http', () => { it('should warn about metadata when using json', () => { const metadata = 'foo'; // Need to stub/spy on the underlying logger as the "diag" instance is global - const spyLoggerWarn = sinon.stub(diag, 'warn'); + const warnStub = sinon.stub(); + const nop = () => { + }; + const diagLogger: DiagLogger = { + debug: nop, + error: nop, + info: nop, + verbose: nop, + warn: warnStub + }; + diag.setLogger(diagLogger); + collectorExporter = new OTLPTraceExporter({ metadata, url: address, } as any); - const args = spyLoggerWarn.args[0]; + const args = warnStub.args[0]; assert.strictEqual(args[0], 'Metadata cannot be set when using http'); }); }); @@ -272,7 +285,7 @@ describe('OTLPTraceExporter - node with json over http', () => { setTimeout(() => { const result = responseSpy.args[0][0] as core.ExportResult; assert.strictEqual(result.code, core.ExportResultCode.FAILED); - const error = result.error as otlpTypes.OTLPExporterError; + const error = result.error as OTLPExporterError; assert.ok(error !== undefined); assert.strictEqual(error.code, 400); assert.strictEqual(error.data, 'failed'); diff --git a/experimental/packages/exporter-trace-otlp-http/tsconfig.json b/experimental/packages/exporter-trace-otlp-http/tsconfig.json index 8892d54c12..82df98e67b 100644 --- a/experimental/packages/exporter-trace-otlp-http/tsconfig.json +++ b/experimental/packages/exporter-trace-otlp-http/tsconfig.json @@ -17,6 +17,9 @@ }, { "path": "../../../packages/opentelemetry-sdk-trace-base" + }, + { + "path": "../otlp-exporter-base" } ] } diff --git a/experimental/packages/exporter-trace-otlp-proto/package.json b/experimental/packages/exporter-trace-otlp-proto/package.json index c54476524f..6aae783138 100644 --- a/experimental/packages/exporter-trace-otlp-proto/package.json +++ b/experimental/packages/exporter-trace-otlp-proto/package.json @@ -11,13 +11,10 @@ "clean": "tsc --build --clean", "lint": "eslint . --ext .ts", "lint:fix": "eslint . --ext .ts --fix", - "postcompile": "npm run submodule && npm run protos:copy", - "protos:copy": "cpx protos/opentelemetry/**/*.* build/protos/opentelemetry", - "submodule": "git submodule sync --recursive && git submodule update --init --recursive", "tdd": "npm run test -- --watch-extensions ts --watch", "test": "nyc ts-mocha -p tsconfig.json 'test/**/*.test.ts'", "version": "node ../../../scripts/version-update.js", - "watch": "npm run protos:copy && tsc -w", + "watch": "tsc -w", "precompile": "lerna run version --scope $(npm pkg get name) --include-dependencies", "prewatch": "npm run precompile", "peer-api-check": "node ../../../scripts/peer-api-check.js", @@ -74,6 +71,8 @@ "@opentelemetry/exporter-trace-otlp-http": "0.27.0", "@opentelemetry/resources": "1.1.1", "@opentelemetry/sdk-trace-base": "1.1.1", + "@opentelemetry/otlp-exporter-base": "0.27.0", + "@opentelemetry/otlp-proto-exporter-base": "0.27.0", "protobufjs": "^6.9.0" } } diff --git a/experimental/packages/exporter-trace-otlp-proto/src/OTLPTraceExporter.ts b/experimental/packages/exporter-trace-otlp-proto/src/OTLPTraceExporter.ts index 9b3c5a6eff..bb26b949bc 100644 --- a/experimental/packages/exporter-trace-otlp-proto/src/OTLPTraceExporter.ts +++ b/experimental/packages/exporter-trace-otlp-proto/src/OTLPTraceExporter.ts @@ -15,15 +15,13 @@ */ import { ReadableSpan, SpanExporter } from '@opentelemetry/sdk-trace-base'; -import { OTLPExporterNodeBase } from './OTLPExporterNodeBase'; import { otlpTypes, - toOTLPExportTraceServiceRequest, - OTLPExporterNodeConfigBase, - appendResourcePathToUrlIfNotPresent, + toOTLPExportTraceServiceRequest } from '@opentelemetry/exporter-trace-otlp-http'; -import { ServiceClientType } from './types'; import { getEnv, baggageUtils } from '@opentelemetry/core'; +import { appendResourcePathToUrlIfNotPresent, OTLPExporterNodeConfigBase } from '@opentelemetry/otlp-exporter-base'; +import { OTLPProtoExporterNodeBase, ServiceClientType } from '@opentelemetry/otlp-proto-exporter-base'; const DEFAULT_COLLECTOR_RESOURCE_PATH = '/v1/traces'; const DEFAULT_COLLECTOR_URL=`http://localhost:4318${DEFAULT_COLLECTOR_RESOURCE_PATH}`; @@ -32,7 +30,7 @@ const DEFAULT_COLLECTOR_URL=`http://localhost:4318${DEFAULT_COLLECTOR_RESOURCE_P * Collector Trace Exporter for Node with protobuf */ export class OTLPTraceExporter - extends OTLPExporterNodeBase< + extends OTLPProtoExporterNodeBase< ReadableSpan, otlpTypes.opentelemetryProto.collector.trace.v1.ExportTraceServiceRequest > diff --git a/experimental/packages/exporter-trace-otlp-proto/src/index.ts b/experimental/packages/exporter-trace-otlp-proto/src/index.ts index bf4ab432ce..761e8a9262 100644 --- a/experimental/packages/exporter-trace-otlp-proto/src/index.ts +++ b/experimental/packages/exporter-trace-otlp-proto/src/index.ts @@ -15,6 +15,3 @@ */ export * from './OTLPTraceExporter'; -export * from './OTLPExporterNodeBase'; -export * from './types'; -export * from './util'; diff --git a/experimental/packages/exporter-trace-otlp-proto/test/OTLPTraceExporter.test.ts b/experimental/packages/exporter-trace-otlp-proto/test/OTLPTraceExporter.test.ts index 67b8c17868..9554fea1d8 100644 --- a/experimental/packages/exporter-trace-otlp-proto/test/OTLPTraceExporter.test.ts +++ b/experimental/packages/exporter-trace-otlp-proto/test/OTLPTraceExporter.test.ts @@ -17,9 +17,7 @@ import { diag } from '@opentelemetry/api'; import { ExportResultCode } from '@opentelemetry/core'; import { - OTLPExporterNodeConfigBase, - otlpTypes, - CompressionAlgorithm, + otlpTypes } from '@opentelemetry/exporter-trace-otlp-http'; import { ReadableSpan } from '@opentelemetry/sdk-trace-base'; import * as assert from 'assert'; @@ -28,13 +26,14 @@ import * as sinon from 'sinon'; import { Stream } from 'stream'; import * as zlib from 'zlib'; import { OTLPTraceExporter } from '../src'; -import { getExportRequestProto } from '../src/util'; import { ensureExportTraceServiceRequestIsSet, ensureProtoSpanIsCorrect, mockedReadableSpan, MockedResponse, } from './traceHelper'; +import { CompressionAlgorithm, OTLPExporterNodeConfigBase } from '@opentelemetry/otlp-exporter-base'; +import { getExportRequestProto } from '@opentelemetry/otlp-proto-exporter-base'; const fakeRequest = { end: function () { }, diff --git a/experimental/packages/exporter-trace-otlp-proto/tsconfig.json b/experimental/packages/exporter-trace-otlp-proto/tsconfig.json index 3b28c06f67..69212c4878 100644 --- a/experimental/packages/exporter-trace-otlp-proto/tsconfig.json +++ b/experimental/packages/exporter-trace-otlp-proto/tsconfig.json @@ -20,6 +20,12 @@ }, { "path": "../exporter-trace-otlp-http" + }, + { + "path": "../otlp-exporter-base" + }, + { + "path": "../otlp-proto-exporter-base" } ] } diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/package.json b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/package.json index bb7d7e4ba4..72b18aa960 100644 --- a/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/package.json +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/package.json @@ -11,13 +11,10 @@ "clean": "tsc --build --clean", "lint": "eslint . --ext .ts", "lint:fix": "eslint . --ext .ts --fix", - "postcompile": "npm run submodule && npm run protos:copy", - "protos:copy": "cpx protos/opentelemetry/**/*.* build/protos/opentelemetry", - "submodule": "git submodule sync --recursive && git submodule update --init --recursive", "tdd": "npm run test -- --watch-extensions ts --watch", "test": "nyc ts-mocha -p tsconfig.json 'test/**/*.test.ts'", "version": "node ../../../scripts/version-update.js", - "watch": "npm run protos:copy && tsc -w", + "watch": "tsc -w", "precompile": "lerna run version --scope $(npm pkg get name) --include-dependencies", "prewatch": "npm run precompile", "peer-api-check": "node ../../../scripts/peer-api-check.js", @@ -74,7 +71,7 @@ "@grpc/proto-loader": "^0.6.9", "@opentelemetry/core": "1.1.1", "@opentelemetry/exporter-metrics-otlp-http": "0.27.0", - "@opentelemetry/exporter-trace-otlp-grpc": "0.27.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.27.0", "@opentelemetry/exporter-trace-otlp-http": "0.27.0", "@opentelemetry/resources": "1.1.1", "@opentelemetry/sdk-metrics-base": "0.27.0" diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/protos b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/protos deleted file mode 160000 index 59c488bfb8..0000000000 --- a/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/protos +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 59c488bfb8fb6d0458ad6425758b70259ff4a2bd diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/src/OTLPMetricExporter.ts b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/src/OTLPMetricExporter.ts index 5ec71ef7ed..af5960eace 100644 --- a/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/src/OTLPMetricExporter.ts +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/src/OTLPMetricExporter.ts @@ -23,22 +23,22 @@ import { } from '@opentelemetry/exporter-metrics-otlp-http'; import { AggregationTemporality, ResourceMetrics } from '@opentelemetry/sdk-metrics-base'; import { - OTLPExporterConfigNode, - OTLPExporterNodeBase, + OTLPGRPCExporterConfigNode, + OTLPGRPCExporterNodeBase, ServiceClientType, validateAndNormalizeUrl -} from '@opentelemetry/exporter-trace-otlp-grpc'; +} from '@opentelemetry/otlp-grpc-exporter-base'; import { baggageUtils, getEnv } from '@opentelemetry/core'; import { Metadata } from '@grpc/grpc-js'; const DEFAULT_COLLECTOR_URL = 'localhost:4317'; -class OTLPMetricExporterProxy extends OTLPExporterNodeBase { protected readonly _aggregationTemporality: AggregationTemporality; - constructor(config: OTLPExporterConfigNode & OTLPMetricExporterOptions= defaultOptions) { + constructor(config: OTLPGRPCExporterConfigNode & OTLPMetricExporterOptions= defaultOptions) { super(config); this.metadata ||= new Metadata(); const headers = baggageUtils.parseKeyPairsIntoRecord(getEnv().OTEL_EXPORTER_OTLP_METRICS_HEADERS); @@ -56,7 +56,7 @@ class OTLPMetricExporterProxy extends OTLPExporterNodeBase 0 @@ -79,7 +79,7 @@ class OTLPMetricExporterProxy extends OTLPExporterNodeBase{ - constructor(config: OTLPExporterConfigNode & OTLPMetricExporterOptions = defaultOptions) { + constructor(config: OTLPGRPCExporterConfigNode & OTLPMetricExporterOptions = defaultOptions) { super(new OTLPMetricExporterProxy(config), config); } } diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/submodule.md b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/submodule.md deleted file mode 100644 index 4985e69dad..0000000000 --- a/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/submodule.md +++ /dev/null @@ -1,45 +0,0 @@ -# Important - -**Submodule is always pointing to certain revision number. So updating the submodule repo will not have impact on your code. -Knowing this if you want to change the submodule to point to a different version (when for example proto has changed) here is how to do it:** - -## Updating submodule to point to certain revision number - -1. Make sure you are in the same folder as this instruction - -2. Update your submodules by running this command - - ```shell script - git submodule sync --recursive - git submodule update --init --recursive - ``` - -3. Find the commit SHA which you want to update to and copy it (the long one) - -4. Enter a submodule directory from this directory - - ```shell script - cd protos - ``` - -5. Updates files in the submodule tree to given commit: - - ```shell script - git checkout -q - ``` - -6. Return to the main directory: - - ```shell script - cd ../ - ``` - -7. Please run `git status` you should see something like `Head detached at`. This is correct, go to next step - -8. Now thing which is very important. You have to commit this to apply these changes - - ```shell script - git commit -am "chore: updating submodule for opentelemetry-proto" - ``` - -9. If you look now at git log you will notice that the folder `protos` has been changed and it will show what was the previous sha and what is current one. diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/OTLPMetricExporter.test.ts b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/OTLPMetricExporter.test.ts index fff613ec84..b6d7e62b23 100644 --- a/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/OTLPMetricExporter.test.ts +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/OTLPMetricExporter.test.ts @@ -38,9 +38,9 @@ import { AggregationTemporality, ResourceMetrics } from '@opentelemetry/sdk-metr const metricsServiceProtoPath = 'opentelemetry/proto/collector/metrics/v1/metrics_service.proto'; -const includeDirs = [path.resolve(__dirname, '../protos')]; +const includeDirs = [path.resolve(__dirname, '../../otlp-grpc-exporter-base/protos')]; -const address = 'localhost:1501'; +const address = 'localhost:1502'; type TestParams = { useTLS?: boolean; @@ -325,3 +325,5 @@ describe('', () => { testOTLPMetricExporter({ metadata }); }); + + diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/tsconfig.json b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/tsconfig.json index fb3bcd8afa..6380e3f172 100644 --- a/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/tsconfig.json +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/tsconfig.json @@ -15,9 +15,6 @@ { "path": "../../../packages/opentelemetry-resources" }, - { - "path": "../exporter-trace-otlp-grpc" - }, { "path": "../exporter-trace-otlp-http" }, @@ -29,6 +26,9 @@ }, { "path": "../opentelemetry-sdk-metrics-base" + }, + { + "path": "../otlp-grpc-exporter-base" } ] } diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-http/package.json b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/package.json index 339a705158..c9d71652a8 100644 --- a/experimental/packages/opentelemetry-exporter-metrics-otlp-http/package.json +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/package.json @@ -97,6 +97,7 @@ "@opentelemetry/api-metrics": "0.27.0", "@opentelemetry/core": "1.1.1", "@opentelemetry/exporter-trace-otlp-http": "0.27.0", + "@opentelemetry/otlp-exporter-base": "0.27.0", "@opentelemetry/resources": "1.1.1", "@opentelemetry/sdk-metrics-base": "0.27.0" } diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/OTLPMetricExporterBase.ts b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/OTLPMetricExporterBase.ts index 39b238c39b..7e99662ada 100644 --- a/experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/OTLPMetricExporterBase.ts +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/OTLPMetricExporterBase.ts @@ -16,8 +16,9 @@ import { ExportResult } from '@opentelemetry/core'; import { AggregationTemporality, PushMetricExporter, ResourceMetrics } from '@opentelemetry/sdk-metrics-base'; -import { OTLPExporterBase, otlpTypes } from '@opentelemetry/exporter-trace-otlp-http'; +import { otlpTypes } from '@opentelemetry/exporter-trace-otlp-http'; import { defaultOptions, OTLPMetricExporterOptions } from './OTLPMetricExporterOptions'; +import { OTLPExporterBase } from '@opentelemetry/otlp-exporter-base'; export class OTLPMetricExporterBase { protected readonly _aggregationTemporality: AggregationTemporality; - constructor(config: OTLPMetricExporterOptions & otlpTypes.OTLPExporterConfigBase = defaultOptions) { + constructor(config: OTLPMetricExporterOptions & OTLPExporterConfigBase = defaultOptions) { super(config); this._headers = Object.assign( this._headers, @@ -43,7 +46,7 @@ class OTLPExporterBrowserProxy extends OTLPExporterBrowserBase 0 @@ -68,7 +71,7 @@ class OTLPExporterBrowserProxy extends OTLPExporterBrowserBase { - constructor(config: otlpTypes.OTLPExporterConfigBase & OTLPMetricExporterOptions = defaultOptions) { + constructor(config: OTLPExporterConfigBase & OTLPMetricExporterOptions = defaultOptions) { super(new OTLPExporterBrowserProxy(config), config); } } diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/platform/node/OTLPMetricExporter.ts b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/platform/node/OTLPMetricExporter.ts index 59d3e339cd..bdf858113d 100644 --- a/experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/platform/node/OTLPMetricExporter.ts +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/platform/node/OTLPMetricExporter.ts @@ -16,15 +16,17 @@ import { ResourceMetrics, AggregationTemporality } from '@opentelemetry/sdk-metrics-base'; import { - OTLPExporterNodeBase, - OTLPExporterNodeConfigBase, otlpTypes, - appendResourcePathToUrlIfNotPresent } from '@opentelemetry/exporter-trace-otlp-http'; import { toOTLPExportMetricServiceRequest } from '../../transformMetrics'; import { getEnv, baggageUtils} from '@opentelemetry/core'; import { defaultExporterTemporality, defaultOptions, OTLPMetricExporterOptions } from '../../OTLPMetricExporterOptions'; import { OTLPMetricExporterBase } from '../../OTLPMetricExporterBase'; +import { + appendResourcePathToUrlIfNotPresent, + OTLPExporterNodeBase, + OTLPExporterNodeConfigBase +} from '@opentelemetry/otlp-exporter-base'; const DEFAULT_COLLECTOR_RESOURCE_PATH = '/v1/metrics'; const DEFAULT_COLLECTOR_URL = `http://localhost:4318${DEFAULT_COLLECTOR_RESOURCE_PATH}`; diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/transformMetrics.ts b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/transformMetrics.ts index 955e8e6a8a..819c02d0ad 100644 --- a/experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/transformMetrics.ts +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/transformMetrics.ts @@ -15,8 +15,10 @@ */ import { SpanAttributes } from '@opentelemetry/api'; +import { ValueType } from '@opentelemetry/api-metrics'; import * as core from '@opentelemetry/core'; -import { OTLPExporterBase, otlpTypes, toCollectorResource } from '@opentelemetry/exporter-trace-otlp-http'; +import { otlpTypes, toCollectorResource } from '@opentelemetry/exporter-trace-otlp-http'; +import { OTLPExporterBase, OTLPExporterConfigBase } from '@opentelemetry/otlp-exporter-base'; import { AggregationTemporality, DataPointType, @@ -25,7 +27,6 @@ import { MetricData, ResourceMetrics } from '@opentelemetry/sdk-metrics-base'; -import { ValueType } from '@opentelemetry/api-metrics'; /** * Converts {@link SpanAttributes} to a collector-compatible format. @@ -171,7 +172,7 @@ export function toCollectorMetric( * @param aggregationTemporality * @param collectorExporterBase */ -export function toOTLPExportMetricServiceRequest( +export function toOTLPExportMetricServiceRequest( metrics: ResourceMetrics, aggregationTemporality: AggregationTemporality, collectorExporterBase: OTLPExporterBase { let collectorExporter: OTLPMetricExporter; @@ -332,7 +333,7 @@ describe('OTLPMetricExporter - web', () => { foo: 'bar', bar: 'baz', }; - let collectorExporterConfig: (otlpTypes.OTLPExporterConfigBase & OTLPMetricExporterOptions) | undefined; + let collectorExporterConfig: (OTLPExporterConfigBase & OTLPMetricExporterOptions) | undefined; beforeEach(() => { collectorExporterConfig = { diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/common/CollectorMetricExporter.test.ts b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/common/CollectorMetricExporter.test.ts index 0e941ed7e2..9c2b4e4c89 100644 --- a/experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/common/CollectorMetricExporter.test.ts +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/common/CollectorMetricExporter.test.ts @@ -20,10 +20,11 @@ import { } from '@opentelemetry/sdk-metrics-base'; import * as assert from 'assert'; import * as sinon from 'sinon'; -import { OTLPExporterBase, otlpTypes } from '@opentelemetry/exporter-trace-otlp-http'; +import { otlpTypes } from '@opentelemetry/exporter-trace-otlp-http'; import { collect, mockCounter, mockObservableGauge, setUp, shutdown } from '../metricsHelper'; +import { OTLPExporterBase, OTLPExporterConfigBase } from '@opentelemetry/otlp-exporter-base'; -type CollectorExporterConfig = otlpTypes.OTLPExporterConfigBase; +type CollectorExporterConfig = OTLPExporterConfigBase; class OTLPMetricExporter extends OTLPExporterBase< CollectorExporterConfig, ResourceMetrics, diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/node/CollectorMetricExporter.test.ts b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/node/CollectorMetricExporter.test.ts index 1e11f733d4..d5eb13986d 100644 --- a/experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/node/CollectorMetricExporter.test.ts +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/node/CollectorMetricExporter.test.ts @@ -27,7 +27,7 @@ import { import { OTLPMetricExporter } from '../../src/platform/node'; -import { OTLPExporterNodeConfigBase, otlpTypes } from '@opentelemetry/exporter-trace-otlp-http'; +import { otlpTypes } from '@opentelemetry/exporter-trace-otlp-http'; import { ensureCounterIsCorrect, ensureExportMetricsServiceRequestIsSet, @@ -40,6 +40,7 @@ import { } from '../metricsHelper'; import { MockedResponse } from './nodeHelpers'; import { AggregationTemporality, ResourceMetrics } from '@opentelemetry/sdk-metrics-base'; +import { OTLPExporterError, OTLPExporterNodeConfigBase } from '@opentelemetry/otlp-exporter-base'; const fakeRequest = { end: function () { @@ -308,7 +309,7 @@ describe('OTLPMetricExporter - node with json over http', () => { setTimeout(() => { const result = responseSpy.args[0][0] as core.ExportResult; assert.strictEqual(result.code, core.ExportResultCode.FAILED); - const error = result.error as otlpTypes.OTLPExporterError; + const error = result.error as OTLPExporterError; assert.ok(error !== undefined); assert.strictEqual(error.code, 400); assert.strictEqual(error.data, 'failed'); diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-http/tsconfig.json b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/tsconfig.json index 7bf7d7dfbd..db701b3310 100644 --- a/experimental/packages/opentelemetry-exporter-metrics-otlp-http/tsconfig.json +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/tsconfig.json @@ -23,6 +23,9 @@ }, { "path": "../opentelemetry-sdk-metrics-base" + }, + { + "path": "../otlp-exporter-base" } ] } diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/package.json b/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/package.json index 4e31d16d55..c0a77777a4 100644 --- a/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/package.json +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/package.json @@ -11,13 +11,10 @@ "clean": "tsc --build --clean", "lint": "eslint . --ext .ts", "lint:fix": "eslint . --ext .ts --fix", - "postcompile": "npm run submodule && npm run protos:copy", - "protos:copy": "cpx protos/opentelemetry/**/*.* build/protos/opentelemetry", - "submodule": "git submodule sync --recursive && git submodule update --init --recursive", "tdd": "npm run test -- --watch-extensions ts --watch", "test": "nyc ts-mocha -p tsconfig.json 'test/**/*.test.ts'", "version": "node ../../../scripts/version-update.js", - "watch": "npm run protos:copy && tsc -w", + "watch": "tsc -w", "precompile": "lerna run version --scope $(npm pkg get name) --include-dependencies", "prewatch": "npm run precompile", "peer-api-check": "node ../../../scripts/peer-api-check.js", @@ -73,8 +70,9 @@ "@grpc/proto-loader": "0.6.9", "@opentelemetry/core": "1.1.1", "@opentelemetry/exporter-metrics-otlp-http": "0.27.0", + "@opentelemetry/otlp-proto-exporter-base": "0.27.0", + "@opentelemetry/otlp-exporter-base": "0.27.0", "@opentelemetry/exporter-trace-otlp-http": "0.27.0", - "@opentelemetry/exporter-trace-otlp-proto": "0.27.0", "@opentelemetry/resources": "1.1.1", "@opentelemetry/sdk-metrics-base": "0.27.0", "protobufjs": "^6.9.0" diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/protos b/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/protos deleted file mode 160000 index 59c488bfb8..0000000000 --- a/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/protos +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 59c488bfb8fb6d0458ad6425758b70259ff4a2bd diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/src/OTLPMetricExporter.ts b/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/src/OTLPMetricExporter.ts index 95648bb35e..105f0c2cf3 100644 --- a/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/src/OTLPMetricExporter.ts +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/src/OTLPMetricExporter.ts @@ -15,9 +15,7 @@ */ import { - otlpTypes, - OTLPExporterNodeConfigBase, - appendResourcePathToUrlIfNotPresent, + otlpTypes } from '@opentelemetry/exporter-trace-otlp-http'; import { defaultExporterTemporality, @@ -25,16 +23,17 @@ import { OTLPMetricExporterOptions, toOTLPExportMetricServiceRequest } from '@opentelemetry/exporter-metrics-otlp-http'; -import { ServiceClientType, OTLPExporterNodeBase } from '@opentelemetry/exporter-trace-otlp-proto'; +import { ServiceClientType, OTLPProtoExporterNodeBase } from '@opentelemetry/otlp-proto-exporter-base'; import { getEnv, baggageUtils} from '@opentelemetry/core'; import { AggregationTemporality, ResourceMetrics} from '@opentelemetry/sdk-metrics-base'; import { OTLPMetricExporterBase } from '@opentelemetry/exporter-metrics-otlp-http'; +import { appendResourcePathToUrlIfNotPresent, OTLPExporterNodeConfigBase } from '@opentelemetry/otlp-exporter-base'; const DEFAULT_COLLECTOR_RESOURCE_PATH = '/v1/metrics'; const DEFAULT_COLLECTOR_URL = `http://localhost:4318${DEFAULT_COLLECTOR_RESOURCE_PATH}`; -class OTLPMetricExporterNodeProxy extends OTLPExporterNodeBase { protected readonly _aggregationTemporality: AggregationTemporality; diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/test/OTLPMetricExporter.test.ts b/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/test/OTLPMetricExporter.test.ts index 429096aff0..910e02739f 100644 --- a/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/test/OTLPMetricExporter.test.ts +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/test/OTLPMetricExporter.test.ts @@ -17,10 +17,9 @@ import { diag } from '@opentelemetry/api'; import { ExportResultCode } from '@opentelemetry/core'; import { - OTLPExporterNodeConfigBase, - otlpTypes, + otlpTypes } from '@opentelemetry/exporter-trace-otlp-http'; -import { getExportRequestProto } from '@opentelemetry/exporter-trace-otlp-proto'; +import { getExportRequestProto } from '@opentelemetry/otlp-proto-exporter-base'; import * as assert from 'assert'; import * as http from 'http'; import * as sinon from 'sinon'; @@ -38,6 +37,7 @@ import { } from './metricsHelper'; import { AggregationTemporality, ResourceMetrics } from '@opentelemetry/sdk-metrics-base'; import { OTLPMetricExporterOptions } from '@opentelemetry/exporter-metrics-otlp-http'; +import { OTLPExporterNodeConfigBase } from '@opentelemetry/otlp-exporter-base'; const fakeRequest = { end: function () { diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/tsconfig.json b/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/tsconfig.json index 0a77729134..d81d9c0a67 100644 --- a/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/tsconfig.json +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/tsconfig.json @@ -18,9 +18,6 @@ { "path": "../exporter-trace-otlp-http" }, - { - "path": "../exporter-trace-otlp-proto" - }, { "path": "../opentelemetry-api-metrics" }, @@ -29,6 +26,12 @@ }, { "path": "../opentelemetry-sdk-metrics-base" + }, + { + "path": "../otlp-exporter-base" + }, + { + "path": "../otlp-proto-exporter-base" } ] } diff --git a/experimental/packages/otlp-exporter-base/.eslintignore b/experimental/packages/otlp-exporter-base/.eslintignore new file mode 100644 index 0000000000..378eac25d3 --- /dev/null +++ b/experimental/packages/otlp-exporter-base/.eslintignore @@ -0,0 +1 @@ +build diff --git a/experimental/packages/otlp-exporter-base/.eslintrc.js b/experimental/packages/otlp-exporter-base/.eslintrc.js new file mode 100644 index 0000000000..e41d9a9299 --- /dev/null +++ b/experimental/packages/otlp-exporter-base/.eslintrc.js @@ -0,0 +1,9 @@ +module.exports = { + "env": { + "mocha": true, + "commonjs": true, + "node": true, + "browser": true + }, + ...require('../../../eslint.config.js') +} diff --git a/experimental/packages/otlp-exporter-base/.npmignore b/experimental/packages/otlp-exporter-base/.npmignore new file mode 100644 index 0000000000..9505ba9450 --- /dev/null +++ b/experimental/packages/otlp-exporter-base/.npmignore @@ -0,0 +1,4 @@ +/bin +/coverage +/doc +/test diff --git a/experimental/packages/otlp-exporter-base/LICENSE b/experimental/packages/otlp-exporter-base/LICENSE new file mode 100644 index 0000000000..5d6f747bfd --- /dev/null +++ b/experimental/packages/otlp-exporter-base/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2020 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. diff --git a/experimental/packages/otlp-exporter-base/README.md b/experimental/packages/otlp-exporter-base/README.md new file mode 100644 index 0000000000..cdb8a26cdc --- /dev/null +++ b/experimental/packages/otlp-exporter-base/README.md @@ -0,0 +1,42 @@ +# OpenTelemetry Collector Exporter for web and node + +[![NPM Published Version][npm-img]][npm-url] +[![Apache License][license-image]][license-image] + +This module provides a base exporter for web and node to be used with [opentelemetry-collector][opentelemetry-collector-url]. + +## Installation + +```bash +npm install --save @opentelemetry/otlp-exporter-base +``` + +## GRPC + +For GRPC please check [npm-url-grpc] + +## PROTOBUF + +For PROTOBUF please check [npm-url-proto] + +## Useful links + +- For more information on OpenTelemetry, visit: +- For more about OpenTelemetry JavaScript: +- For help or feedback on this project, join us in [GitHub Discussions][discussions-url] + +## License + +Apache 2.0 - See [LICENSE][license-url] for more information. + +[discussions-url]: https://github.com/open-telemetry/opentelemetry-js/discussions +[license-url]: https://github.com/open-telemetry/opentelemetry-js/blob/main/LICENSE +[license-image]: https://img.shields.io/badge/license-Apache_2.0-green.svg?style=flat +[npm-url]: https://www.npmjs.com/package/@opentelemetry/otlp-exporter-base +[npm-url-grpc]: https://www.npmjs.com/package/@opentelemetry/otlp-grpc-exporter-base +[npm-url-proto]: https://www.npmjs.com/package/@opentelemetry/otlp-proto-exporter-base +[npm-img]: https://badge.fury.io/js/%40opentelemetry%2Fotlp-exporter-base.svg +[opentelemetry-collector-url]: https://github.com/open-telemetry/opentelemetry-collector +[opentelemetry-spec-protocol-exporter]: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/exporter.md#configuration-options +[semconv-resource-service-name]: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/resource/semantic_conventions/README.md#service +[metrics-exporter-url]: https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-exporter-metrics-otlp-http diff --git a/experimental/packages/otlp-exporter-base/karma.conf.js b/experimental/packages/otlp-exporter-base/karma.conf.js new file mode 100644 index 0000000000..4c60b54edb --- /dev/null +++ b/experimental/packages/otlp-exporter-base/karma.conf.js @@ -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'] } + })) +}; diff --git a/experimental/packages/otlp-exporter-base/package.json b/experimental/packages/otlp-exporter-base/package.json new file mode 100644 index 0000000000..f389ac9650 --- /dev/null +++ b/experimental/packages/otlp-exporter-base/package.json @@ -0,0 +1,78 @@ +{ + "name": "@opentelemetry/otlp-exporter-base", + "version": "0.27.0", + "description": "OpenTelemetry OTLP Exporter base (for internal use only)", + "main": "build/src/index.js", + "module": "build/esm/index.js", + "esnext": "build/esnext/index.js", + "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 tsconfig.all.json", + "clean": "tsc --build --clean tsconfig.all.json", + "codecov": "nyc report --reporter=json && codecov -f coverage/*.json -p ../../../", + "codecov:browser": "nyc report --reporter=json && codecov -f coverage/*.json -p ../../../", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", + "tdd": "npm run test -- --watch-extensions ts --watch", + "tdd:browser": "karma start", + "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 --build --watch tsconfig.all.json", + "precompile": "lerna run version --scope $(npm pkg get name) --include-dependencies", + "prewatch": "npm run precompile" + }, + "keywords": [ + "opentelemetry", + "nodejs", + "tracing", + "profiling", + "metrics", + "stats", + "monitoring" + ], + "author": "OpenTelemetry Authors", + "license": "Apache-2.0", + "engines": { + "node": ">=8.12.0" + }, + "files": [ + "build/src/**/*.js", + "build/src/**/*.js.map", + "build/src/**/*.d.ts", + "LICENSE", + "README.md" + ], + "publishConfig": { + "access": "public" + }, + "dependencies": { + "@opentelemetry/core": "1.1.1" + }, + "devDependencies": { + "@opentelemetry/api": "^1.0.0", + "@types/mocha": "8.2.3", + "@types/node": "14.17.33", + "@types/sinon": "10.0.6", + "codecov": "3.8.3", + "istanbul-instrumenter-loader": "3.0.1", + "mocha": "7.2.0", + "nock": "13.0.11", + "nyc": "15.1.0", + "sinon": "12.0.1", + "ts-loader": "8.3.0", + "ts-mocha": "8.0.0", + "typescript": "4.4.4" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } +} diff --git a/experimental/packages/exporter-trace-otlp-http/src/OTLPExporterBase.ts b/experimental/packages/otlp-exporter-base/src/OTLPExporterBase.ts similarity index 99% rename from experimental/packages/exporter-trace-otlp-http/src/OTLPExporterBase.ts rename to experimental/packages/otlp-exporter-base/src/OTLPExporterBase.ts index 1679aae11e..421ceae2e9 100644 --- a/experimental/packages/exporter-trace-otlp-http/src/OTLPExporterBase.ts +++ b/experimental/packages/otlp-exporter-base/src/OTLPExporterBase.ts @@ -29,7 +29,7 @@ export abstract class OTLPExporterBase< T extends OTLPExporterConfigBase, ExportItem, ServiceRequest -> { + > { public readonly url: string; public readonly hostname: string | undefined; public readonly attributes?: SpanAttributes; diff --git a/experimental/packages/otlp-exporter-base/src/index.ts b/experimental/packages/otlp-exporter-base/src/index.ts new file mode 100644 index 0000000000..e1149d2add --- /dev/null +++ b/experimental/packages/otlp-exporter-base/src/index.ts @@ -0,0 +1,19 @@ +/* + * 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. + */ +export * from './OTLPExporterBase'; +export * from './platform'; +export * from './types'; +export * from './util'; diff --git a/experimental/packages/exporter-trace-otlp-http/src/platform/browser/OTLPExporterBrowserBase.ts b/experimental/packages/otlp-exporter-base/src/platform/browser/OTLPExporterBrowserBase.ts similarity index 100% rename from experimental/packages/exporter-trace-otlp-http/src/platform/browser/OTLPExporterBrowserBase.ts rename to experimental/packages/otlp-exporter-base/src/platform/browser/OTLPExporterBrowserBase.ts diff --git a/experimental/packages/otlp-exporter-base/src/platform/browser/index.ts b/experimental/packages/otlp-exporter-base/src/platform/browser/index.ts new file mode 100644 index 0000000000..c9678a8017 --- /dev/null +++ b/experimental/packages/otlp-exporter-base/src/platform/browser/index.ts @@ -0,0 +1,17 @@ +/* + * 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. + */ + +export * from './OTLPExporterBrowserBase'; diff --git a/experimental/packages/exporter-trace-otlp-http/src/platform/browser/util.ts b/experimental/packages/otlp-exporter-base/src/platform/browser/util.ts similarity index 87% rename from experimental/packages/exporter-trace-otlp-http/src/platform/browser/util.ts rename to experimental/packages/otlp-exporter-base/src/platform/browser/util.ts index 8030552c17..af47f4bebf 100644 --- a/experimental/packages/exporter-trace-otlp-http/src/platform/browser/util.ts +++ b/experimental/packages/otlp-exporter-base/src/platform/browser/util.ts @@ -14,11 +14,13 @@ * limitations under the License. */ import { diag } from '@opentelemetry/api'; -import * as otlpTypes from '../../types'; +import { OTLPExporterError } from '../../types'; /** * Send metrics/spans using browser navigator.sendBeacon * @param body + * @param url + * @param blobPropertyBag * @param onSuccess * @param onError */ @@ -27,13 +29,13 @@ export function sendWithBeacon( url: string, blobPropertyBag: BlobPropertyBag, onSuccess: () => void, - onError: (error: otlpTypes.OTLPExporterError) => void + onError: (error: OTLPExporterError) => void ): void { if (navigator.sendBeacon(url, new Blob([body], blobPropertyBag))) { diag.debug('sendBeacon - can send', body); onSuccess(); } else { - const error = new otlpTypes.OTLPExporterError( + const error = new OTLPExporterError( `sendBeacon - cannot send ${body}` ); onError(error); @@ -44,6 +46,8 @@ export function sendWithBeacon( * function to send metrics/spans using browser XMLHttpRequest * used when navigator.sendBeacon is not available * @param body + * @param url + * @param headers * @param onSuccess * @param onError */ @@ -52,7 +56,7 @@ export function sendWithXhr( url: string, headers: Record, onSuccess: () => void, - onError: (error: otlpTypes.OTLPExporterError) => void + onError: (error: OTLPExporterError) => void ): void { const xhr = new XMLHttpRequest(); xhr.open('POST', url); @@ -77,11 +81,10 @@ export function sendWithXhr( diag.debug('xhr success', body); onSuccess(); } else { - const error = new otlpTypes.OTLPExporterError( + const error = new OTLPExporterError( `Failed to export with XHR (status: ${xhr.status})`, xhr.status ); - onError(error); } } diff --git a/experimental/packages/otlp-exporter-base/src/platform/index.ts b/experimental/packages/otlp-exporter-base/src/platform/index.ts new file mode 100644 index 0000000000..86a320fde6 --- /dev/null +++ b/experimental/packages/otlp-exporter-base/src/platform/index.ts @@ -0,0 +1,17 @@ +/* + * 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. + */ +export * from './node'; +export { OTLPExporterBrowserBase } from './browser'; diff --git a/experimental/packages/exporter-trace-otlp-http/src/platform/node/OTLPExporterNodeBase.ts b/experimental/packages/otlp-exporter-base/src/platform/node/OTLPExporterNodeBase.ts similarity index 100% rename from experimental/packages/exporter-trace-otlp-http/src/platform/node/OTLPExporterNodeBase.ts rename to experimental/packages/otlp-exporter-base/src/platform/node/OTLPExporterNodeBase.ts diff --git a/experimental/packages/otlp-exporter-base/src/platform/node/index.ts b/experimental/packages/otlp-exporter-base/src/platform/node/index.ts new file mode 100644 index 0000000000..8a75162ea2 --- /dev/null +++ b/experimental/packages/otlp-exporter-base/src/platform/node/index.ts @@ -0,0 +1,19 @@ +/* + * 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. + */ + +export * from './OTLPExporterNodeBase'; +export * from './util'; +export * from './types'; diff --git a/experimental/packages/exporter-trace-otlp-http/src/platform/node/types.ts b/experimental/packages/otlp-exporter-base/src/platform/node/types.ts similarity index 100% rename from experimental/packages/exporter-trace-otlp-http/src/platform/node/types.ts rename to experimental/packages/otlp-exporter-base/src/platform/node/types.ts diff --git a/experimental/packages/exporter-trace-otlp-http/src/platform/node/util.ts b/experimental/packages/otlp-exporter-base/src/platform/node/util.ts similarity index 96% rename from experimental/packages/exporter-trace-otlp-http/src/platform/node/util.ts rename to experimental/packages/otlp-exporter-base/src/platform/node/util.ts index 8ea6d49f4d..392063cea7 100644 --- a/experimental/packages/exporter-trace-otlp-http/src/platform/node/util.ts +++ b/experimental/packages/otlp-exporter-base/src/platform/node/util.ts @@ -18,12 +18,12 @@ import * as http from 'http'; import * as https from 'https'; import * as zlib from 'zlib'; import { Readable } from 'stream'; -import * as otlpTypes from '../../types'; import { OTLPExporterNodeBase } from './OTLPExporterNodeBase'; import { OTLPExporterNodeConfigBase } from '.'; import { diag } from '@opentelemetry/api'; import { CompressionAlgorithm } from './types'; import { getEnv } from '@opentelemetry/core'; +import { OTLPExporterError } from '../../types'; let gzip: zlib.Gzip | undefined; @@ -40,7 +40,7 @@ export function sendWithHttp( data: string | Buffer, contentType: string, onSuccess: () => void, - onError: (error: otlpTypes.OTLPExporterError) => void + onError: (error: OTLPExporterError) => void ): void { const parsedUrl = new url.URL(collector.url); @@ -66,7 +66,7 @@ export function sendWithHttp( diag.debug(`statusCode: ${res.statusCode}`, responseData); onSuccess(); } else { - const error = new otlpTypes.OTLPExporterError( + const error = new OTLPExporterError( res.statusMessage, res.statusCode, responseData diff --git a/experimental/packages/otlp-exporter-base/src/types.ts b/experimental/packages/otlp-exporter-base/src/types.ts new file mode 100644 index 0000000000..ffe91fda80 --- /dev/null +++ b/experimental/packages/otlp-exporter-base/src/types.ts @@ -0,0 +1,55 @@ +/* + * 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 { SpanAttributes } from '@opentelemetry/api'; + +/** + * Interface for handling error + */ +export class OTLPExporterError extends Error { + readonly code?: number; + override readonly name: string = 'OTLPExporterError'; + readonly data?: string; + + constructor(message?: string, code?: number, data?: string) { + super(message); + this.data = data; + this.code = code; + } +} + +/** + * Interface for handling export service errors + */ +export interface ExportServiceError { + name: string; + code: number; + details: string; + metadata: { [key: string]: unknown }; + message: string; + stack: string; +} + +/** + * Collector Exporter base config + */ +export interface OTLPExporterConfigBase { + headers?: Partial>; + hostname?: string; + attributes?: SpanAttributes; + url?: string; + concurrencyLimit?: number; +} diff --git a/experimental/packages/exporter-trace-otlp-http/src/util.ts b/experimental/packages/otlp-exporter-base/src/util.ts similarity index 100% rename from experimental/packages/exporter-trace-otlp-http/src/util.ts rename to experimental/packages/otlp-exporter-base/src/util.ts diff --git a/experimental/packages/otlp-exporter-base/test/browser/index-webpack.ts b/experimental/packages/otlp-exporter-base/test/browser/index-webpack.ts new file mode 100644 index 0000000000..99100a0f6e --- /dev/null +++ b/experimental/packages/otlp-exporter-base/test/browser/index-webpack.ts @@ -0,0 +1,23 @@ +/* + * 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. + */ +const testsContext = require.context('../browser', true, /test$/); +testsContext.keys().forEach(testsContext); + +const testsContextCommon = require.context('../common', true, /test$/); +testsContextCommon.keys().forEach(testsContextCommon); + +const srcContext = require.context('.', true, /src$/); +srcContext.keys().forEach(srcContext); diff --git a/experimental/packages/exporter-trace-otlp-http/test/browser/util.test.ts b/experimental/packages/otlp-exporter-base/test/browser/util.test.ts similarity index 97% rename from experimental/packages/exporter-trace-otlp-http/test/browser/util.test.ts rename to experimental/packages/otlp-exporter-base/test/browser/util.test.ts index 3cb6aa4474..106e04b4da 100644 --- a/experimental/packages/exporter-trace-otlp-http/test/browser/util.test.ts +++ b/experimental/packages/otlp-exporter-base/test/browser/util.test.ts @@ -16,7 +16,7 @@ import * as sinon from 'sinon'; import { sendWithXhr } from '../../src/platform/browser/util'; -import { ensureHeadersContain } from '../traceHelper'; +import { ensureHeadersContain } from '../testHelper'; describe('util - browser', () => { let server: any; @@ -49,8 +49,8 @@ describe('util - browser', () => { describe('and Content-Type header is set', () => { beforeEach(()=>{ const explicitContentType = { - 'Content-Type': 'application/json', - }; + 'Content-Type': 'application/json', + }; sendWithXhr(body, url, explicitContentType, onSuccessStub, onErrorStub); }); it('Request Headers should contain "Content-Type" header', done => { diff --git a/experimental/packages/otlp-exporter-base/test/certs/ca.crt b/experimental/packages/otlp-exporter-base/test/certs/ca.crt new file mode 100644 index 0000000000..529ce2f7b8 --- /dev/null +++ b/experimental/packages/otlp-exporter-base/test/certs/ca.crt @@ -0,0 +1,33 @@ +-----BEGIN CERTIFICATE----- +MIIFozCCA4ugAwIBAgIUa6OxgyEYxNjpjac0jTAKn+IkGTYwDQYJKoZIhvcNAQEL +BQAwYTELMAkGA1UEBhMCQ0wxCzAJBgNVBAgMAlJNMRowGAYDVQQHDBFPcGVuVGVs +ZW1ldHJ5VGVzdDENMAsGA1UECgwEUm9vdDENMAsGA1UECwwEVGVzdDELMAkGA1UE +AwwCY2EwHhcNMjEwNjA3MjAxMDExWhcNMjIwNjA3MjAxMDExWjBhMQswCQYDVQQG +EwJDTDELMAkGA1UECAwCUk0xGjAYBgNVBAcMEU9wZW5UZWxlbWV0cnlUZXN0MQ0w +CwYDVQQKDARSb290MQ0wCwYDVQQLDARUZXN0MQswCQYDVQQDDAJjYTCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMbVyp3NCtDwKpGbV+MCML63o+vGVhpd +Dlt3ncpcwz0FMK6UJDXzTe4joKCaezWto3Bmhb28Lezcf8AdzmTdnoENAaqUX2SE +giGVoeaJ/M1hW1IiOffa9zIMkt6cwf8MUUMl5kTRMdAqmpikNqN0rqNpaGuqBYf9 +kvDy3hw+dj19hKEeEXI2zt/HYDOBHYgpalWiOS8qwj0zSfxAUeura+eXKMlx0JOY +h5N25OUH1oLt1flhyuHnwRThKbvyMnL36Ey+G7uCFH0hQSGO0BLhg1LPDWG1PmTn +KzsvqaIgDF/tMCXykvaWcsSxrhvsNeOFFmmkKp1ECVOFgFYsGuK8lJlEvm6Owrvz +4X69L0phCJtaCCaSUFdybqx+G2ZKLZNqTtnMw/3YECp37KyrRd75Gy1UrU031+XC +Fpt4pHw+3isjAOf1bj32F2Ed7aaqVqM2A7m8AgA0m22J/f+jBzmv6UJN/kvfFXzC +0lbX6b1fGj49vU9WEO/o+F3qaH/c50HPf45AB2d4pWbDl5alXZei58ZyEemBndlv +XcGPtVR9S/5rphlX1vAIOT7ePWgUVkAi5fB/rLVGyC1FwA0zYvdyj9CVigJNs29G +yftsvMynF8TL7/qCIGNz72qtW/Pn227OI4WamvYhX6fJwJirXwTEQhAfKXljocI/ +Liqxx15Sfs+3AgMBAAGjUzBRMB0GA1UdDgQWBBSMocah0cTqX4owoPL4+zV1pe5F +QzAfBgNVHSMEGDAWgBSMocah0cTqX4owoPL4+zV1pe5FQzAPBgNVHRMBAf8EBTAD +AQH/MA0GCSqGSIb3DQEBCwUAA4ICAQCIpnaYSMXT+nrdOgw2zKHTk47wANGf6nfK +76VwsQfzVkJm/tzEgq+saEznGRW1ttdQfXHJM3NCfneVhjXDkihrHsxiL4S+5OMq +cusp2tKupGXlxwOt7tsAhH5j4SQLyEUiWMmm/Wvwtx2HWuNO8LZGhoAcUrT7r94f +vqr3tYyb3D06/rBRj2QcybYGJHsQAULEQvmWJvCveh5gqxkRjDJlwmqV/lIarPCt +diKbsZqHJMNaRMbgsxV8hVSvD6RKtBG+K8hpuHF2ZKfzb7Yt1IDPtUGCL811ykzh +2PjumjaQ2JCP6vtYAhTS1r/+cbOi+4v5JzF+kxHxFc9vK/gzBT88174S2MQaqwhF +jQiS3YfElLXkr37E9gxMKLDanbFsxPPiXO96s0RSjNK2mzSbz/gfmsjGqxKNq3t1 +IwAfjePmmx4FJ1O/FwOA5RWE+KRhzNucktjxz39oZrnqtPeTqHnAivNOyK3XB68v +5HRjP79TrzIbLCauyJD/qM5UtCRXW2La1rsH8lIBtcxUcZOkvDnE6Po44D5hH2kQ +swRqF9Vy7PL9MWJPTgn4+WFLNoBe+nMY82y7xstRv7c2ctXpAxSWxIXgBN+B9nXo +3Lqpgg0UkjTiCp13Mejq/7DYAw+/Ou8bxWs3BuCQvFcG2+FBMWh0dL1FxVq3BPyq +oveTgr1sfQ== +-----END CERTIFICATE----- diff --git a/experimental/packages/otlp-exporter-base/test/certs/ca.key b/experimental/packages/otlp-exporter-base/test/certs/ca.key new file mode 100644 index 0000000000..df94d44c38 --- /dev/null +++ b/experimental/packages/otlp-exporter-base/test/certs/ca.key @@ -0,0 +1,54 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,7EE0C188F59416E9 + +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 +-----END RSA PRIVATE KEY----- diff --git a/experimental/packages/otlp-exporter-base/test/certs/client.crt b/experimental/packages/otlp-exporter-base/test/certs/client.crt new file mode 100644 index 0000000000..b1519dede6 --- /dev/null +++ b/experimental/packages/otlp-exporter-base/test/certs/client.crt @@ -0,0 +1,31 @@ +-----BEGIN CERTIFICATE----- +MIIFPzCCAycCAQEwDQYJKoZIhvcNAQELBQAwYTELMAkGA1UEBhMCQ0wxCzAJBgNV +BAgMAlJNMRowGAYDVQQHDBFPcGVuVGVsZW1ldHJ5VGVzdDENMAsGA1UECgwEUm9v +dDENMAsGA1UECwwEVGVzdDELMAkGA1UEAwwCY2EwHhcNMjEwNjA3MjAxMDExWhcN +MjIwNjA3MjAxMDExWjBqMQswCQYDVQQGEwJDTDELMAkGA1UECAwCUk0xGjAYBgNV +BAcMEU9wZW5UZWxlbWV0cnlUZXN0MQ0wCwYDVQQKDARUZXN0MQ8wDQYDVQQLDAZD +bGllbnQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAN1or7F+548RpVIgdrzYmuWgKMfWsO5FhgqpGp+xuoVgMMTlZM3i +yiarMnAE0G6ZVMwqCeXkiUGL9QLatJ1S/HO2sWLUkWaPD7X7O4k1yGtl6UsRcr4K ++YBUbucxfrCQjaWKlBc1GMBrDyY/u/rl0CIYu3GtegniN6HG6rBXC2e98DVctQ3M +r/RXB9DWqMC2KW2X92X+FyWqTfGjv8wjRnhQdDNXPA/PCembzhfCL8VlmG65rDiz +VQxiTotTOCmaxULdF307jorMTLIHZVV2OnAA/udeDcxITnKcksLiRKKAiHUXMIPq +RGxNtLX1sdBD/FoQ28sr8o6Ko7qb3uaA4CZhp2I4RR925oZISyObzY3QxrlafN4g +hFnWkTFJY0K+43cxta8K3gAnQXxN/BANDEydS1YM9adqYbt09wctSUjMqJHGZWnn +IVOged+/DEIW9EmyLSPM1DC1s1owOrgwBXzHRRNXuUFjZPPrMC8TkBexNjsapLjr +nE/xa5cB80DIntkM8ysfLU6p39NihM2hmeyI2YS8osheElXEL3dz5vM8Wzv28qgF +PvGpdYz6cAibE9qJ+oT416dVc+9G6i1fcBl7X8w+KUGVFsRnftovwjoSToGlckqg +dv1Tsf6FBDpSMro3BbGogpDhkSxy//eWvzejjHBemz06Kh2DGkKhnT9rAgMBAAEw +DQYJKoZIhvcNAQELBQADggIBAIGWBdgWOoqGIy0fuSbqQgjgrhDrPGBV15TfvB4T +84xfk9YZxdRKkG3J65uLffTnnotZs6gqLx6MfosR6zQYhSK27fTXpJJdRaI55kgT +2e/xNCe867Bz/3nW+vwWIGTuFn6hFq9f8HNLZMpHu3DClj7AB7ga6qp1uFWIn5oq +xC4da8/JTR6FY2srIktyH5Vr64FnhtX9cLSa/U7df7asZjRUm6ndPS49X01G6BJQ +vH0RO1caCCbpDVqPwJnAf3BXD1MkKsNe4hULt25XCxSsyM7v0Ru4KcSSGxiYHowQ ++VzRdJVYe8ytpcg1eVlWutOlDXGLaeGNQ0/u5OEQ8iqZvp1/qiq/LQIRZlxa+ZlL +vsVAgOxolRpm6W01cYCCWX8utsrMq8lKjMIal0SZhj6oP/rwtH8UVRhqhrQyAn6y +K6IYGLGvXGacJYuHpcAFQ0f8LUCCs0kxN/zZOZ98atF0MvgUWKZFNgrvcX5se8iV +kS/7UHH4Ie9ZO6Hv9IvnElOfZY9dnFPNxcbWnA7U0kLa5CWh8CD55ScAGHrvcz3O +JXPW0SHb2xZmXDTfgmS4vMI5PYDyipSCoUDClA3BPr/dkAVssj8SMikJZWhVvDrK +IcKRHpkmrzLJbatxeDNlCtLRSAXeuTheLqqSA2HACReNYkQLPd5V7mY6uRw3d3o6 +3rKe +-----END CERTIFICATE----- diff --git a/experimental/packages/otlp-exporter-base/test/certs/client.csr b/experimental/packages/otlp-exporter-base/test/certs/client.csr new file mode 100644 index 0000000000..2d99fab566 --- /dev/null +++ b/experimental/packages/otlp-exporter-base/test/certs/client.csr @@ -0,0 +1,28 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIErzCCApcCAQAwajELMAkGA1UEBhMCQ0wxCzAJBgNVBAgMAlJNMRowGAYDVQQH +DBFPcGVuVGVsZW1ldHJ5VGVzdDENMAsGA1UECgwEVGVzdDEPMA0GA1UECwwGQ2xp +ZW50MRIwEAYDVQQDDAlsb2NhbGhvc3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDdaK+xfuePEaVSIHa82JrloCjH1rDuRYYKqRqfsbqFYDDE5WTN4som +qzJwBNBumVTMKgnl5IlBi/UC2rSdUvxztrFi1JFmjw+1+zuJNchrZelLEXK+CvmA +VG7nMX6wkI2lipQXNRjAaw8mP7v65dAiGLtxrXoJ4jehxuqwVwtnvfA1XLUNzK/0 +VwfQ1qjAtiltl/dl/hclqk3xo7/MI0Z4UHQzVzwPzwnpm84Xwi/FZZhuuaw4s1UM +Yk6LUzgpmsVC3Rd9O46KzEyyB2VVdjpwAP7nXg3MSE5ynJLC4kSigIh1FzCD6kRs +TbS19bHQQ/xaENvLK/KOiqO6m97mgOAmYadiOEUfduaGSEsjm82N0Ma5WnzeIIRZ +1pExSWNCvuN3MbWvCt4AJ0F8TfwQDQxMnUtWDPWnamG7dPcHLUlIzKiRxmVp5yFT +oHnfvwxCFvRJsi0jzNQwtbNaMDq4MAV8x0UTV7lBY2Tz6zAvE5AXsTY7GqS465xP +8WuXAfNAyJ7ZDPMrHy1Oqd/TYoTNoZnsiNmEvKLIXhJVxC93c+bzPFs79vKoBT7x +qXWM+nAImxPaifqE+NenVXPvRuotX3AZe1/MPilBlRbEZ37aL8I6Ek6BpXJKoHb9 +U7H+hQQ6UjK6NwWxqIKQ4ZEscv/3lr83o4xwXps9OiodgxpCoZ0/awIDAQABoAAw +DQYJKoZIhvcNAQELBQADggIBAE8wUkuBEsxe96X3U2vjWCfD/hB30cF69UZ2NlR6 +2UIZbjvewIy43ozr2uaCk1+US21NaaXKinNrZ0VElWKLVXWkZidfuoGEz0gY+XDF +qyjlfaYlCTexPUSh14nbpLsT0DXvHa5KI3Kq2ly/sciVB78SlH3sRzmJt/qkoaIN +f6PI2Unoqf8vJ1xvQr9z/ODc06MoX5g+ezM2vShZ+P7773bSVL6bIEVl/9yFFAyu +OHL+uwUdBYBk3NS4xKyXWXhG58AyNvGYWIO0tWTYmIVVuL2JDrNGY4QdIDQBoj+4 +hppmh0mYbvDCXolKjUVFC0wHRACaRCN1WLIKP8heE0vZsvXq/7ssuP3DtCDHRadk +pHn+6CpEwbT4bCNsW4bsci9v82npoY6YJKW8mokR+1dhcari6g1W2R80VCuWmB6E +ntJFZpILjPrCf8QCjs9Act0l87xx3+5K0LpFHQiKHygTbOrzE8++Lds+6yC/uzp/ +QtdLC20/iQMJ5GaOxSCwzBe1dUhC+ABF1/ZN1p9wgKFTFQMR+B/bR5q9l/d2AyMY +1pTorKIX7yg14OHehzL0s1tVq3QEtNl14c84hLh0m4Rf7nmRRcKDP8l6EwDujJVD +nR8cHM8ajiyC9tjjdyiQ32NLgzo+6OGiugctUxfw/ZLp7Qr0mT07IvPLcqBiRAC6 +E+9O +-----END CERTIFICATE REQUEST----- diff --git a/experimental/packages/otlp-exporter-base/test/certs/client.key b/experimental/packages/otlp-exporter-base/test/certs/client.key new file mode 100644 index 0000000000..00f82cfeeb --- /dev/null +++ b/experimental/packages/otlp-exporter-base/test/certs/client.key @@ -0,0 +1,51 @@ +-----BEGIN RSA PRIVATE KEY----- +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 +-----END RSA PRIVATE KEY----- diff --git a/experimental/packages/otlp-exporter-base/test/certs/regenerate.sh b/experimental/packages/otlp-exporter-base/test/certs/regenerate.sh new file mode 100755 index 0000000000..9e2e972c99 --- /dev/null +++ b/experimental/packages/otlp-exporter-base/test/certs/regenerate.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env sh +# +# Usage: regenerate.sh +# +# regenerate.sh regenerates certificates that are used to test gRPC with TLS +# Make sure you run it in test/certs directory. +# It also serves as a documentation on how existing certificates were generated. + +rm ca.crt ca.key client.crt client.csr client.key server.crt server.csr server.key + +openssl genrsa -des3 -out ca.key 4096 +openssl req -new -x509 -days 365 -sha256 -key ca.key -out ca.crt -subj "/C=CL/ST=RM/L=OpenTelemetryTest/O=Root/OU=Test/CN=ca" + +openssl genrsa -des3 -out server.key 4096 +openssl req -new -sha256 -key server.key -out server.csr -subj "/C=CL/ST=RM/L=OpenTelemetryTest/O=Test/OU=Server/CN=localhost" +openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt +openssl rsa -in server.key -out server.key + +openssl genrsa -des3 -out client.key 4096 +openssl req -new -sha256 -key client.key -out client.csr -subj "/C=CL/ST=RM/L=OpenTelemetryTest/O=Test/OU=Client/CN=localhost" +openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt +openssl rsa -in client.key -out client.key diff --git a/experimental/packages/otlp-exporter-base/test/certs/server.crt b/experimental/packages/otlp-exporter-base/test/certs/server.crt new file mode 100644 index 0000000000..55f0c3dbb9 --- /dev/null +++ b/experimental/packages/otlp-exporter-base/test/certs/server.crt @@ -0,0 +1,31 @@ +-----BEGIN CERTIFICATE----- +MIIFPzCCAycCAQEwDQYJKoZIhvcNAQELBQAwYTELMAkGA1UEBhMCQ0wxCzAJBgNV +BAgMAlJNMRowGAYDVQQHDBFPcGVuVGVsZW1ldHJ5VGVzdDENMAsGA1UECgwEUm9v +dDENMAsGA1UECwwEVGVzdDELMAkGA1UEAwwCY2EwHhcNMjEwNjA3MjAxMDExWhcN +MjIwNjA3MjAxMDExWjBqMQswCQYDVQQGEwJDTDELMAkGA1UECAwCUk0xGjAYBgNV +BAcMEU9wZW5UZWxlbWV0cnlUZXN0MQ0wCwYDVQQKDARUZXN0MQ8wDQYDVQQLDAZT +ZXJ2ZXIxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBALaskMk0FpoAZ8eHpOiNYIW2yOeizGsvJ7PsNZujbUFQ/f7/AYTZ +CBQ9Hc8lKz+3YHklZnTsAJW6QLCBKSgsrjPAXA25zBFQazUuKb+QrjoIqeaq8D8w +6iHL7zdHsplbWZjYrnPjLWPqoc1ga6H0p8NsH7eC6hFXJRp2ZilyZXUR4jvyMc3D +2q/MXoI0VvQ3tI/QaLrU2iaN0DZBsyJhr4B/jNzOYzGAuVieEyV52wFnOsUlJDNp +jsT/v1/Q8JrjOXSb+ko/74VlSLTCauoPSsiUb1ra0Tbu3Z0E6b7vlFKeZaOxwUyW +eLi6YT6Z9ZTOEJuiJan/7STprK1NrqL+OPneK1A0Plr10hY76SptAu2fTqgGOFGo +QkxTosnsppiSkCVaDiLKCVr4DQzBm/0CLoSgXk4fJNhiNrIT+b35gX8Xmm3hUq+U +GanZyXhJYfojBUuhPJFAUKpUUjSsiRU8Dj8R7nIZT+cUWvslYmrOG4ZjCnpIXnoo +pAjFlaZkv62/tEGwJmyBkGk2lYzn9Ka1G/aO92IjfzypUlSKXCntTxLD6BzWNF7/ +qjt19XTOWPjChQHQcYXmlTSNUvUQ09HMaRIUe5MCexlWYleX6lVG6XtMwOb06w5O +ynVuMHjiAGfkjLrUkGQqSxHrS2v/af1J7F+CIClNgI+q2pz5dYWYMaCFAgMBAAEw +DQYJKoZIhvcNAQELBQADggIBAAaVSzyc6jFBLORHUcxkP8DheyTl8m2sWIb+x732 +DkM2qp8oEAKwhJ/AWLFGCqsjyW5ep8fgpTHQgT7braEEUKKnGUbIqUPy1IBz+lSf +LoT7qD92eiMGXOrzcHWnV02PRM3mF5cmLMNu5aMUoIArG5dO1LTSxl5/ybx2l4Zy +qXcT7wJtrA6F0EmuXRzwFBIVZdxlLbI+S4SsvfKXernGatB3Mjotivvqi2SeOd8p +1tuqEyQaaIJ1s6u7vyTcAHDd0OIxSqpTu3SwaHAXhkzMi7+TRGgfQUuljkNKkKfj +N02siSNjIuKzE/DSW6yV0OFL/FCNPyvzs8CKTMwfyrrvA0UAspkFCWZFXFlA+uLs +0at4SmPecOsc+O8ATon9nUyXh06anBwtp03aXX6Mr/7UIRRPHF70BY7MDV4OvvQt +PD0osFo0uEHubflCnPBUdMrQN9KbELVJeV7G0Xj2fHTAVoEnCmSpow+LB1ehWGbR +M3U8q9wlpXi4Awhr19kRcSdE/JzI7eu9MqjsazfUdAtCcgg4dHixOre8oXgauhZ5 +jMOv9lUI6Glf61xt8mamicohSf9CFyH5PgZqRM0aSacdJ7jH6EitABOx21ZqwiBp +o4W37lV55oy+N0r7yxaNy/mSUUcjsQo6kGw/4cMpYTSEzRMtfwYPOS1DeTl9zArE +7TBI +-----END CERTIFICATE----- diff --git a/experimental/packages/otlp-exporter-base/test/certs/server.csr b/experimental/packages/otlp-exporter-base/test/certs/server.csr new file mode 100644 index 0000000000..0c5e9291bf --- /dev/null +++ b/experimental/packages/otlp-exporter-base/test/certs/server.csr @@ -0,0 +1,28 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIErzCCApcCAQAwajELMAkGA1UEBhMCQ0wxCzAJBgNVBAgMAlJNMRowGAYDVQQH +DBFPcGVuVGVsZW1ldHJ5VGVzdDENMAsGA1UECgwEVGVzdDEPMA0GA1UECwwGU2Vy +dmVyMRIwEAYDVQQDDAlsb2NhbGhvc3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQC2rJDJNBaaAGfHh6TojWCFtsjnosxrLyez7DWbo21BUP3+/wGE2QgU +PR3PJSs/t2B5JWZ07ACVukCwgSkoLK4zwFwNucwRUGs1Lim/kK46CKnmqvA/MOoh +y+83R7KZW1mY2K5z4y1j6qHNYGuh9KfDbB+3guoRVyUadmYpcmV1EeI78jHNw9qv +zF6CNFb0N7SP0Gi61NomjdA2QbMiYa+Af4zczmMxgLlYnhMledsBZzrFJSQzaY7E +/79f0PCa4zl0m/pKP++FZUi0wmrqD0rIlG9a2tE27t2dBOm+75RSnmWjscFMlni4 +umE+mfWUzhCboiWp/+0k6aytTa6i/jj53itQND5a9dIWO+kqbQLtn06oBjhRqEJM +U6LJ7KaYkpAlWg4iygla+A0MwZv9Ai6EoF5OHyTYYjayE/m9+YF/F5pt4VKvlBmp +2cl4SWH6IwVLoTyRQFCqVFI0rIkVPA4/Ee5yGU/nFFr7JWJqzhuGYwp6SF56KKQI +xZWmZL+tv7RBsCZsgZBpNpWM5/SmtRv2jvdiI388qVJUilwp7U8Sw+gc1jRe/6o7 +dfV0zlj4woUB0HGF5pU0jVL1ENPRzGkSFHuTAnsZVmJXl+pVRul7TMDm9OsOTsp1 +bjB44gBn5Iy61JBkKksR60tr/2n9SexfgiApTYCPqtqc+XWFmDGghQIDAQABoAAw +DQYJKoZIhvcNAQELBQADggIBAIJ7KMLIZbomgrup1rrizG3aU4bREy6HfHZ9Ylcr +Lo1vdL5/UZH3AHVhoccb0ua3qXDtsc8pDQAXIMzBu8BjfpbwCvrgz7YXsNsBU9zV +el8p394QB20WoPHebYDBUXPiq3JhLfjzOXBS9Ke3MBl1jDamOFmZW8dg8EpowIXv +ODFP8sErFb7Bmq7x2d0EJyX7+HydBiRWRa376oXcZ/VLl/CnNzpJeACFWPI4d0lg +P5nsadtdLyAwXF6cRQx3pOdN0sS5b3llXX3jVwGzm+kNjVTDWJiJmqWfwIF15pPr +bypoUmPpeQ4I9F+oFm9+Ff776PemqBD7NSJdG0iHRndm3oa6o2bTpn9ZypCO1Skv +UWr3ATduFylA3/YeoN6dQwP4Ol+3WJ2UbXzTbmEfoSEzmwMI5MTidOuA62A0afyN +VM0SjHaLvfD1mK4w+3BKdUivYh4TWbcLU7s1SeDwYiEP6DFZHLBPHDcNLz77d6nQ +zgvOgXqeNfk9uI5NdYBMbtdHW/mwGgEfPlDkKbY2KveOJjLlTM1EduGFsYHAXyhI +SiYozrbFeS5ts4f1EZ5tVT73KBv97MiQkKhBoVXtF1CHPUP1LTkGxtH2uoDiVfDi +r1OkRzoO05pHAh2o+4gujThsc0d3T5mmoeSySs56lgqDmC4blXNOS0kBZ4+I2u7A +C2YH +-----END CERTIFICATE REQUEST----- diff --git a/experimental/packages/otlp-exporter-base/test/certs/server.key b/experimental/packages/otlp-exporter-base/test/certs/server.key new file mode 100644 index 0000000000..9fa740554a --- /dev/null +++ b/experimental/packages/otlp-exporter-base/test/certs/server.key @@ -0,0 +1,51 @@ +-----BEGIN RSA PRIVATE KEY----- +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 +-----END RSA PRIVATE KEY----- diff --git a/experimental/packages/exporter-trace-otlp-http/test/common/CollectorTraceExporter.test.ts b/experimental/packages/otlp-exporter-base/test/common/CollectorExporter.test.ts similarity index 88% rename from experimental/packages/exporter-trace-otlp-http/test/common/CollectorTraceExporter.test.ts rename to experimental/packages/otlp-exporter-base/test/common/CollectorExporter.test.ts index 945c059e5b..c03fafc159 100644 --- a/experimental/packages/exporter-trace-otlp-http/test/common/CollectorTraceExporter.test.ts +++ b/experimental/packages/otlp-exporter-base/test/common/CollectorExporter.test.ts @@ -15,20 +15,24 @@ */ import { ExportResultCode } from '@opentelemetry/core'; -import { ReadableSpan } from '@opentelemetry/sdk-trace-base'; import * as assert from 'assert'; import * as sinon from 'sinon'; import { OTLPExporterBase } from '../../src/OTLPExporterBase'; import { OTLPExporterConfigBase } from '../../src/types'; -import { mockedReadableSpan } from '../traceHelper'; +import { ComplexTestObject, mockedComplexTestObject } from '../testHelper'; import * as otlpTypes from '../../src/types'; + +interface ExportRequest { + resourceSpans: object[] +} + type CollectorExporterConfig = OTLPExporterConfigBase; class OTLPTraceExporter extends OTLPExporterBase< CollectorExporterConfig, - ReadableSpan, - otlpTypes.opentelemetryProto.collector.trace.v1.ExportTraceServiceRequest -> { + ComplexTestObject, + ExportRequest + > { onInit() {} onShutdown() {} send( @@ -48,8 +52,8 @@ class OTLPTraceExporter extends OTLPExporterBase< } convert( - spans: ReadableSpan[] - ): otlpTypes.opentelemetryProto.collector.trace.v1.ExportTraceServiceRequest { + spans: ComplexTestObject[] + ): ExportRequest { return { resourceSpans: [] }; } } @@ -102,12 +106,12 @@ describe('OTLPTraceExporter - common', () => { }); it('should export spans as otlpTypes.Spans', done => { - const spans: ReadableSpan[] = []; - spans.push(Object.assign({}, mockedReadableSpan)); + const spans: ComplexTestObject[] = []; + spans.push(Object.assign({}, mockedComplexTestObject)); collectorExporter.export(spans, () => {}); setTimeout(() => { - const span1 = spySend.args[0][0][0] as ReadableSpan; + const span1 = spySend.args[0][0][0] as ComplexTestObject; assert.deepStrictEqual(spans[0], span1); done(); }); @@ -117,10 +121,10 @@ describe('OTLPTraceExporter - common', () => { describe('when exporter is shutdown', () => { it( 'should not export anything but return callback with code' + - ' "FailedNotRetryable"', + ' "FailedNotRetryable"', async () => { - const spans: ReadableSpan[] = []; - spans.push(Object.assign({}, mockedReadableSpan)); + const spans: ComplexTestObject[] = []; + spans.push(Object.assign({}, mockedComplexTestObject)); await collectorExporter.shutdown(); spySend.resetHistory(); @@ -139,8 +143,8 @@ describe('OTLPTraceExporter - common', () => { }); describe('when an error occurs', () => { it('should return failed export result', done => { - const spans: ReadableSpan[] = []; - spans.push(Object.assign({}, mockedReadableSpan)); + const spans: ComplexTestObject[] = []; + spans.push(Object.assign({}, mockedComplexTestObject)); spySend.throws({ code: 100, details: 'Test error', @@ -174,7 +178,7 @@ describe('OTLPTraceExporter - common', () => { ...collectorExporterConfig, concurrencyLimit: 3, }); - const spans: ReadableSpan[] = [{ ...mockedReadableSpan }]; + const spans: ComplexTestObject[] = [{ ...mockedComplexTestObject }]; const callbackSpy = sinon.spy(); for (let i = 0; i < 7; i++) { collectorExporterWithConcurrencyLimit.export(spans, callbackSpy); diff --git a/experimental/packages/exporter-trace-otlp-http/test/common/utils.test.ts b/experimental/packages/otlp-exporter-base/test/common/util.test.ts similarity index 100% rename from experimental/packages/exporter-trace-otlp-http/test/common/utils.test.ts rename to experimental/packages/otlp-exporter-base/test/common/util.test.ts diff --git a/experimental/packages/exporter-trace-otlp-http/test/node/utils.test.ts b/experimental/packages/otlp-exporter-base/test/node/util.test.ts similarity index 100% rename from experimental/packages/exporter-trace-otlp-http/test/node/utils.test.ts rename to experimental/packages/otlp-exporter-base/test/node/util.test.ts diff --git a/experimental/packages/otlp-exporter-base/test/testHelper.ts b/experimental/packages/otlp-exporter-base/test/testHelper.ts new file mode 100644 index 0000000000..4656cf17fc --- /dev/null +++ b/experimental/packages/otlp-exporter-base/test/testHelper.ts @@ -0,0 +1,79 @@ +/* + * 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 { HrTime } from '@opentelemetry/api'; +import * as assert from 'assert'; + +export interface SimpleTestObject{ + readonly propString: string; + readonly propNumber: number; + readonly propArray: number[]; +} + +export interface ComplexTestObject { + readonly propString: string; + readonly propNumber: number; + readonly propFunction: () => SimpleTestObject; + readonly propOptional?: string; + readonly propTime: HrTime; + readonly propObject: SimpleTestObject; + readonly propArray: SimpleTestObject[]; + readonly propBoolean: boolean; +} + +export const mockedComplexTestObject: ComplexTestObject = { + propArray: [ + { + propArray: [1, 2, 3], + propNumber: 42, + propString: 'this is a string.' + }, + { + propArray: [3, 2, 1], + propNumber: 3, + propString: 'this is a second string.' + } + ], + propBoolean: true, + propFunction: () => { + return { + propArray: [30, 20, 10], + propNumber: 24, + propString: 'created by function' + }; + }, + propObject: { + propArray: [4, 3, 77], + propNumber: 44, + propString: 'this is a string that is part of propObject.' + }, + propNumber: 12, + propOptional: undefined, + propString: 'this is just a string in a complex test object.', + propTime: [12, 455] +}; + +export function ensureHeadersContain( + actual: { [key: string]: string }, + expected: { [key: string]: string } +) { + Object.entries(expected).forEach(([k, v]) => { + assert.strictEqual( + v, + actual[k], + `Expected ${actual} to contain ${k}: ${v}` + ); + }); +} diff --git a/experimental/packages/otlp-exporter-base/tsconfig.all.json b/experimental/packages/otlp-exporter-base/tsconfig.all.json new file mode 100644 index 0000000000..06c5491334 --- /dev/null +++ b/experimental/packages/otlp-exporter-base/tsconfig.all.json @@ -0,0 +1,9 @@ +{ + "extends": "../../../tsconfig.base.json", + "files": [], + "references": [ + { "path": "./tsconfig.json" }, + { "path": "./tsconfig.esm.json" }, + { "path": "./tsconfig.esnext.json" } + ] +} diff --git a/experimental/packages/otlp-exporter-base/tsconfig.esm.json b/experimental/packages/otlp-exporter-base/tsconfig.esm.json new file mode 100644 index 0000000000..379f547a46 --- /dev/null +++ b/experimental/packages/otlp-exporter-base/tsconfig.esm.json @@ -0,0 +1,11 @@ +{ + "extends": "../../../tsconfig.base.esm.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "build/esm", + "tsBuildInfoFile": "build/esm/tsconfig.esm.tsbuildinfo" + }, + "include": [ + "src/**/*.ts" + ] +} diff --git a/experimental/packages/otlp-exporter-base/tsconfig.esnext.json b/experimental/packages/otlp-exporter-base/tsconfig.esnext.json new file mode 100644 index 0000000000..cb78dd6ff3 --- /dev/null +++ b/experimental/packages/otlp-exporter-base/tsconfig.esnext.json @@ -0,0 +1,11 @@ +{ + "extends": "../../../tsconfig.base.esnext.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "build/esnext", + "tsBuildInfoFile": "build/esnext/tsconfig.esnext.tsbuildinfo" + }, + "include": [ + "src/**/*.ts" + ] +} diff --git a/experimental/packages/otlp-exporter-base/tsconfig.json b/experimental/packages/otlp-exporter-base/tsconfig.json new file mode 100644 index 0000000000..3e284c16fc --- /dev/null +++ b/experimental/packages/otlp-exporter-base/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "rootDir": ".", + "outDir": "build" + }, + "include": [ + "src/**/*.ts", + "test/**/*.ts" + ], + "references": [ + { + "path": "../../../packages/opentelemetry-core" + } + ] +} diff --git a/experimental/packages/otlp-grpc-exporter-base/.eslintignore b/experimental/packages/otlp-grpc-exporter-base/.eslintignore new file mode 100644 index 0000000000..378eac25d3 --- /dev/null +++ b/experimental/packages/otlp-grpc-exporter-base/.eslintignore @@ -0,0 +1 @@ +build diff --git a/experimental/packages/otlp-grpc-exporter-base/.eslintrc.js b/experimental/packages/otlp-grpc-exporter-base/.eslintrc.js new file mode 100644 index 0000000000..3ed0fbeba3 --- /dev/null +++ b/experimental/packages/otlp-grpc-exporter-base/.eslintrc.js @@ -0,0 +1,8 @@ +module.exports = { + "env": { + "mocha": true, + "commonjs": true, + "node": true, + }, + ...require('../../../eslint.config.js') +} diff --git a/experimental/packages/otlp-grpc-exporter-base/.npmignore b/experimental/packages/otlp-grpc-exporter-base/.npmignore new file mode 100644 index 0000000000..9505ba9450 --- /dev/null +++ b/experimental/packages/otlp-grpc-exporter-base/.npmignore @@ -0,0 +1,4 @@ +/bin +/coverage +/doc +/test diff --git a/experimental/packages/otlp-grpc-exporter-base/LICENSE b/experimental/packages/otlp-grpc-exporter-base/LICENSE new file mode 100644 index 0000000000..261eeb9e9f --- /dev/null +++ b/experimental/packages/otlp-grpc-exporter-base/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/experimental/packages/otlp-grpc-exporter-base/README.md b/experimental/packages/otlp-grpc-exporter-base/README.md new file mode 100644 index 0000000000..c55d7d2e2a --- /dev/null +++ b/experimental/packages/otlp-grpc-exporter-base/README.md @@ -0,0 +1,31 @@ +# OpenTelemetry Collector Exporter for node with grpc + +[![NPM Published Version][npm-img]][npm-url] +[![Apache License][license-image]][license-image] + +This module provides a gRPC exporter base for Node.js (browsers not supported) to be used with [opentelemetry-collector][opentelemetry-collector-url]. + +## Installation + +```bash +npm install --save @opentelemetry/otlp-grpc-exporter-base +``` + +## Useful links + +- For more information on OpenTelemetry, visit: +- For more about OpenTelemetry JavaScript: +- For help or feedback on this project, join us in [GitHub Discussions][discussions-url] + +## License + +Apache 2.0 - See [LICENSE][license-url] for more information. + +[discussions-url]: https://github.com/open-telemetry/opentelemetry-js/discussions +[license-url]: https://github.com/open-telemetry/opentelemetry-js/blob/main/LICENSE +[license-image]: https://img.shields.io/badge/license-Apache_2.0-green.svg?style=flat +[npm-url]: https://www.npmjs.com/package/@opentelemetry/otlp-grpc-exporter-base +[npm-img]: https://badge.fury.io/js/%40opentelemetry%2Fotlp-grpc-exporter-base.svg +[opentelemetry-collector-url]: https://github.com/open-telemetry/opentelemetry-collector +[semconv-resource-service-name]: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/resource/semantic_conventions/README.md#service +[metrics-exporter-url]: https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc diff --git a/experimental/packages/otlp-grpc-exporter-base/package.json b/experimental/packages/otlp-grpc-exporter-base/package.json new file mode 100644 index 0000000000..e73931b514 --- /dev/null +++ b/experimental/packages/otlp-grpc-exporter-base/package.json @@ -0,0 +1,79 @@ +{ + "name": "@opentelemetry/otlp-grpc-exporter-base", + "version": "0.27.0", + "description": "OpenTelemetry OTLP-gRPC Exporter base (for internal use only)", + "main": "build/src/index.js", + "types": "build/src/index.d.ts", + "repository": "open-telemetry/opentelemetry-js", + "scripts": { + "prepublishOnly": "npm run compile", + "codecov": "nyc report --reporter=json && codecov -f coverage/*.json -p ../../../", + "compile": "tsc --build", + "clean": "tsc --build --clean", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", + "postcompile": "npm run submodule && npm run protos:copy", + "protos:copy": "cpx protos/opentelemetry/**/*.* build/protos/opentelemetry", + "submodule": "git submodule sync --recursive && git submodule update --init --recursive", + "tdd": "npm run test -- --watch-extensions ts --watch", + "test": "nyc ts-mocha -p tsconfig.json 'test/**/*.test.ts'", + "version": "node ../../../scripts/version-update.js", + "watch": "npm run protos:copy && tsc -w", + "precompile": "lerna run version --scope $(npm pkg get name) --include-dependencies", + "prewatch": "npm run precompile" + }, + "keywords": [ + "opentelemetry", + "nodejs", + "grpc", + "tracing", + "profiling", + "metrics", + "stats" + ], + "author": "OpenTelemetry Authors", + "license": "Apache-2.0", + "engines": { + "node": ">=8.12.0" + }, + "files": [ + "build/src/**/*.js", + "build/src/**/*.js.map", + "build/src/**/*.d.ts", + "build/protos/**/*.proto", + "doc", + "LICENSE", + "README.md" + ], + "publishConfig": { + "access": "public" + }, + "devDependencies": { + "@babel/core": "7.16.0", + "@opentelemetry/api": "^1.0.0", + "@types/mocha": "8.2.3", + "@types/node": "14.17.33", + "@types/sinon": "10.0.6", + "codecov": "3.8.3", + "cpx": "1.5.0", + "mocha": "7.2.0", + "nyc": "15.1.0", + "rimraf": "3.0.2", + "sinon": "12.0.1", + "ts-loader": "8.3.0", + "ts-mocha": "8.0.0", + "typescript": "4.4.4", + "@opentelemetry/sdk-trace-base": "1.1.1", + "@opentelemetry/resources": "1.1.1", + "@opentelemetry/exporter-trace-otlp-http": "0.27.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "dependencies": { + "@opentelemetry/core": "1.1.1", + "@grpc/grpc-js": "^1.5.9", + "@grpc/proto-loader": "^0.6.9", + "@opentelemetry/otlp-exporter-base": "0.27.0" + } +} diff --git a/experimental/packages/exporter-trace-otlp-grpc/protos b/experimental/packages/otlp-grpc-exporter-base/protos similarity index 100% rename from experimental/packages/exporter-trace-otlp-grpc/protos rename to experimental/packages/otlp-grpc-exporter-base/protos diff --git a/experimental/packages/exporter-trace-otlp-grpc/src/OTLPExporterNodeBase.ts b/experimental/packages/otlp-grpc-exporter-base/src/OTLPGRPCExporterNodeBase.ts similarity index 83% rename from experimental/packages/exporter-trace-otlp-grpc/src/OTLPExporterNodeBase.ts rename to experimental/packages/otlp-grpc-exporter-base/src/OTLPGRPCExporterNodeBase.ts index 19d46d0cd5..9cc349fe4e 100644 --- a/experimental/packages/exporter-trace-otlp-grpc/src/OTLPExporterNodeBase.ts +++ b/experimental/packages/otlp-grpc-exporter-base/src/OTLPGRPCExporterNodeBase.ts @@ -15,28 +15,25 @@ */ import { diag } from '@opentelemetry/api'; -import { - OTLPExporterBase, - otlpTypes, -} from '@opentelemetry/exporter-trace-otlp-http'; import { Metadata } from '@grpc/grpc-js'; import { - OTLPExporterConfigNode, + OTLPGRPCExporterConfigNode, GRPCQueueItem, ServiceClientType, } from './types'; -import { ServiceClient, CompressionAlgorithm } from './types'; +import { ServiceClient } from './types'; import { getEnv, baggageUtils } from '@opentelemetry/core'; -import { configureCompression } from './util'; +import { configureCompression, GrpcCompressionAlgorithm } from './util'; +import { OTLPExporterBase, OTLPExporterError } from '@opentelemetry/otlp-exporter-base'; /** - * OTLP Metric Exporter abstract base class + * OTLP Exporter abstract base class */ -export abstract class OTLPExporterNodeBase< +export abstract class OTLPGRPCExporterNodeBase< ExportItem, ServiceRequest > extends OTLPExporterBase< - OTLPExporterConfigNode, + OTLPGRPCExporterConfigNode, ExportItem, ServiceRequest > { @@ -44,9 +41,9 @@ export abstract class OTLPExporterNodeBase< metadata?: Metadata; serviceClient?: ServiceClient = undefined; private _send!: Function; - compression: CompressionAlgorithm; + compression: GrpcCompressionAlgorithm; - constructor(config: OTLPExporterConfigNode = {}) { + constructor(config: OTLPGRPCExporterConfigNode = {}) { super(config); if (config.headers) { diag.warn('Headers cannot be set when using grpc'); @@ -62,7 +59,7 @@ export abstract class OTLPExporterNodeBase< private _sendPromise( objects: ExportItem[], onSuccess: () => void, - onError: (error: otlpTypes.OTLPExporterError) => void + onError: (error: OTLPExporterError) => void ): void { const promise = new Promise((resolve, reject) => { this._send(this, objects, resolve, reject); @@ -77,7 +74,7 @@ export abstract class OTLPExporterNodeBase< promise.then(popPromise, popPromise); } - onInit(config: OTLPExporterConfigNode): void { + onInit(config: OTLPGRPCExporterConfigNode): void { // defer to next tick and lazy load to avoid loading grpc too early // and making this impossible to be instrumented setImmediate(() => { @@ -90,7 +87,7 @@ export abstract class OTLPExporterNodeBase< send( objects: ExportItem[], onSuccess: () => void, - onError: (error: otlpTypes.OTLPExporterError) => void + onError: (error: OTLPExporterError) => void ): void { if (this._shutdownOnce.isCalled) { diag.debug('Shutdown already started. Cannot send objects'); diff --git a/experimental/packages/otlp-grpc-exporter-base/src/index.ts b/experimental/packages/otlp-grpc-exporter-base/src/index.ts new file mode 100644 index 0000000000..6ddb52ade2 --- /dev/null +++ b/experimental/packages/otlp-grpc-exporter-base/src/index.ts @@ -0,0 +1,19 @@ +/* + * 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. + */ + +export * from './OTLPGRPCExporterNodeBase'; +export { ServiceClientType, OTLPGRPCExporterConfigNode } from './types'; +export { validateAndNormalizeUrl, GrpcCompressionAlgorithm } from './util'; diff --git a/experimental/packages/exporter-trace-otlp-grpc/src/types.ts b/experimental/packages/otlp-grpc-exporter-base/src/types.ts similarity index 79% rename from experimental/packages/exporter-trace-otlp-grpc/src/types.ts rename to experimental/packages/otlp-grpc-exporter-base/src/types.ts index 34977f8fd2..b015a4aef2 100644 --- a/experimental/packages/exporter-trace-otlp-grpc/src/types.ts +++ b/experimental/packages/otlp-grpc-exporter-base/src/types.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import { otlpTypes } from '@opentelemetry/exporter-trace-otlp-http'; import * as grpc from '@grpc/grpc-js'; +import { CompressionAlgorithm, OTLPExporterConfigBase, OTLPExporterError } from '@opentelemetry/otlp-exporter-base'; /** * Queue item to be used to save temporary spans/metrics in case the GRPC service @@ -24,7 +24,7 @@ import * as grpc from '@grpc/grpc-js'; export interface GRPCQueueItem { objects: ExportedItem[]; onSuccess: () => void; - onError: (error: otlpTypes.OTLPExporterError) => void; + onError: (error: OTLPExporterError) => void; } /** @@ -41,8 +41,8 @@ export interface ServiceClient extends grpc.Client { /** * OTLP Exporter Config for Node */ -export interface OTLPExporterConfigNode - extends otlpTypes.OTLPExporterConfigBase { +export interface OTLPGRPCExporterConfigNode + extends OTLPExporterConfigBase { credentials?: grpc.ChannelCredentials; metadata?: grpc.Metadata; compression?: CompressionAlgorithm; @@ -52,11 +52,3 @@ export enum ServiceClientType { SPANS, METRICS, } - -/** - * These values are defined by grpc client - */ -export enum CompressionAlgorithm { - NONE = 0, - GZIP = 2 -} diff --git a/experimental/packages/exporter-trace-otlp-grpc/src/util.ts b/experimental/packages/otlp-grpc-exporter-base/src/util.ts similarity index 75% rename from experimental/packages/exporter-trace-otlp-grpc/src/util.ts rename to experimental/packages/otlp-grpc-exporter-base/src/util.ts index 8adc3dba01..7165f77d5a 100644 --- a/experimental/packages/exporter-trace-otlp-grpc/src/util.ts +++ b/experimental/packages/otlp-grpc-exporter-base/src/util.ts @@ -17,21 +17,16 @@ import * as grpc from '@grpc/grpc-js'; import * as protoLoader from '@grpc/proto-loader'; import { diag } from '@opentelemetry/api'; -import { globalErrorHandler, getEnv } from '@opentelemetry/core'; -import { otlpTypes } from '@opentelemetry/exporter-trace-otlp-http'; +import { getEnv, globalErrorHandler } from '@opentelemetry/core'; import * as path from 'path'; -import { OTLPExporterNodeBase } from './OTLPExporterNodeBase'; +import { OTLPGRPCExporterNodeBase } from './OTLPGRPCExporterNodeBase'; import { URL } from 'url'; -import { - OTLPExporterConfigNode, - GRPCQueueItem, - ServiceClientType, - CompressionAlgorithm -} from './types'; +import { GRPCQueueItem, OTLPGRPCExporterConfigNode, ServiceClientType, } from './types'; +import { CompressionAlgorithm, ExportServiceError, OTLPExporterError } from '@opentelemetry/otlp-exporter-base'; export function onInit( - collector: OTLPExporterNodeBase, - config: OTLPExporterConfigNode + collector: OTLPGRPCExporterNodeBase, + config: OTLPGRPCExporterConfigNode ): void { collector.grpcQueue = []; const credentials: grpc.ChannelCredentials = @@ -82,10 +77,10 @@ export function onInit( } export function send( - collector: OTLPExporterNodeBase, + collector: OTLPGRPCExporterNodeBase, objects: ExportItem[], onSuccess: () => void, - onError: (error: otlpTypes.OTLPExporterError) => void + onError: (error: OTLPExporterError) => void ): void { if (collector.serviceClient) { const serviceRequest = collector.convert(objects); @@ -93,7 +88,7 @@ export function send( collector.serviceClient.export( serviceRequest, collector.metadata || new grpc.Metadata(), - (err: otlpTypes.ExportServiceError) => { + (err: ExportServiceError) => { if (err) { diag.error('Service request', serviceRequest); onError(err); @@ -131,12 +126,29 @@ export function validateAndNormalizeUrl(url: string): string { return target.host; } -export function configureCompression(compression: CompressionAlgorithm | undefined): CompressionAlgorithm { +function toGrpcCompression(compression: CompressionAlgorithm): GrpcCompressionAlgorithm { + if(compression === CompressionAlgorithm.NONE) + return GrpcCompressionAlgorithm.NONE; + else if (compression === CompressionAlgorithm.GZIP) + return GrpcCompressionAlgorithm.GZIP; + return GrpcCompressionAlgorithm.NONE; +} + + +/** + * These values are defined by grpc client + */ +export enum GrpcCompressionAlgorithm { + NONE = 0, + GZIP = 2 +} + +export function configureCompression(compression: CompressionAlgorithm | undefined): GrpcCompressionAlgorithm { if (compression) { - return compression; + return toGrpcCompression(compression); } else { const definedCompression = getEnv().OTEL_EXPORTER_OTLP_TRACES_COMPRESSION || getEnv().OTEL_EXPORTER_OTLP_COMPRESSION; - return definedCompression === 'gzip' ? CompressionAlgorithm.GZIP: CompressionAlgorithm.NONE; + return definedCompression === 'gzip' ? GrpcCompressionAlgorithm.GZIP: GrpcCompressionAlgorithm.NONE; } } diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/submodule.md b/experimental/packages/otlp-grpc-exporter-base/submodule.md similarity index 93% rename from experimental/packages/opentelemetry-exporter-metrics-otlp-proto/submodule.md rename to experimental/packages/otlp-grpc-exporter-base/submodule.md index bbbca131ad..68f912dcd9 100644 --- a/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/submodule.md +++ b/experimental/packages/otlp-grpc-exporter-base/submodule.md @@ -15,6 +15,7 @@ Knowing this if you want to change the submodule to point to a different version ``` 3. Find the SHA which you want to update to and copy it (the long one) +the latest sha when this guide was written is `59c488bfb8fb6d0458ad6425758b70259ff4a2bd` 4. Enter a submodule directory from this directory diff --git a/experimental/packages/exporter-trace-otlp-grpc/test/OTLPExporterNodeBase.test.ts b/experimental/packages/otlp-grpc-exporter-base/test/OTLPGRPCExporterNodeBase.test.ts similarity index 89% rename from experimental/packages/exporter-trace-otlp-grpc/test/OTLPExporterNodeBase.test.ts rename to experimental/packages/otlp-grpc-exporter-base/test/OTLPGRPCExporterNodeBase.test.ts index dbe6c6b406..aca3540763 100644 --- a/experimental/packages/exporter-trace-otlp-grpc/test/OTLPExporterNodeBase.test.ts +++ b/experimental/packages/otlp-grpc-exporter-base/test/OTLPGRPCExporterNodeBase.test.ts @@ -14,15 +14,14 @@ * limitations under the License. */ -import { otlpTypes } from '@opentelemetry/exporter-trace-otlp-http'; import { ReadableSpan } from '@opentelemetry/sdk-trace-base'; - import * as assert from 'assert'; -import { OTLPExporterNodeBase } from '../src/OTLPExporterNodeBase'; -import { OTLPExporterConfigNode, ServiceClientType } from '../src/types'; +import { OTLPGRPCExporterNodeBase } from '../src/OTLPGRPCExporterNodeBase'; +import { OTLPGRPCExporterConfigNode, ServiceClientType } from '../src/types'; import { mockedReadableSpan } from './traceHelper'; +import { OTLPExporterError } from '@opentelemetry/otlp-exporter-base'; -class MockCollectorExporter extends OTLPExporterNodeBase< +class MockCollectorExporter extends OTLPGRPCExporterNodeBase< ReadableSpan, ReadableSpan[] > { @@ -31,14 +30,14 @@ class MockCollectorExporter extends OTLPExporterNodeBase< */ sendCallbacks: { onSuccess: () => void; - onError: (error: otlpTypes.OTLPExporterError) => void; + onError: (error: OTLPExporterError) => void; }[] = []; - getDefaultUrl(config: OTLPExporterConfigNode): string { + getDefaultUrl(config: OTLPGRPCExporterConfigNode): string { return ''; } - getDefaultServiceName(config: OTLPExporterConfigNode): string { + getDefaultServiceName(config: OTLPGRPCExporterConfigNode): string { return ''; } @@ -60,12 +59,12 @@ MockCollectorExporter.prototype['_send'] = function _sendMock( self: MockCollectorExporter, objects: ReadableSpan[], onSuccess: () => void, - onError: (error: otlpTypes.OTLPExporterError) => void + onError: (error: OTLPExporterError) => void ): void { self.sendCallbacks.push({ onSuccess, onError }); }; -describe('OTLPExporterNodeBase', () => { +describe('OTLPGRPCExporterNodeBase', () => { let exporter: MockCollectorExporter; const concurrencyLimit = 5; diff --git a/experimental/packages/otlp-grpc-exporter-base/test/certs/ca.crt b/experimental/packages/otlp-grpc-exporter-base/test/certs/ca.crt new file mode 100644 index 0000000000..b6db7d0dd2 --- /dev/null +++ b/experimental/packages/otlp-grpc-exporter-base/test/certs/ca.crt @@ -0,0 +1,33 @@ +-----BEGIN CERTIFICATE----- +MIIFozCCA4ugAwIBAgIUCdllngMpqYtsqRCpqdXxPZiSbGEwDQYJKoZIhvcNAQEL +BQAwYTELMAkGA1UEBhMCQ0wxCzAJBgNVBAgMAlJNMRowGAYDVQQHDBFPcGVuVGVs +ZW1ldHJ5VGVzdDENMAsGA1UECgwEUm9vdDENMAsGA1UECwwEVGVzdDELMAkGA1UE +AwwCY2EwHhcNMjEwNjA3MjAyNzMyWhcNMjIwNjA3MjAyNzMyWjBhMQswCQYDVQQG +EwJDTDELMAkGA1UECAwCUk0xGjAYBgNVBAcMEU9wZW5UZWxlbWV0cnlUZXN0MQ0w +CwYDVQQKDARSb290MQ0wCwYDVQQLDARUZXN0MQswCQYDVQQDDAJjYTCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAKS4d8790qpxSOMAMNSxlvFxZvxZKih5 +BjKDefa3sPL8iSOZ12mSZyWqPifjU+fnb3PDLWJPEFYQiwpyMctlXoXo5qiDm1D5 +mLZPTc7/qbiyu33YZHW+iE23GiOQBfvgKHTqh2+ejWs9h/txlWlQuKm0NEDPnA2P +kHiIjudSkWCT1w0WOnlJXd/9CWq6gW0nCTeOmwGYaY7T/i1W500qQyv5j1xHrJCu +m9amRzZEc1I4L2XF8Lnz2vDuEEs2W1vjcO++sXODlSC78dIyGnDWxGuK+V7dhccB +jj/Q5V96CMUoY7RGl18hwn/MSkzmWghsQFkfYWw1Xvez8/IWh7AlEtB/hDn2Dqw7 +lr6lvn1cOUmhHAgYV+v/0gWFN482qi3OaR0z2cCdmfSxRlxhtrq0jH7B3dW5YXcf +ke9e4gh7P980HWeHPwanBlV7BAsPxJY7N+je1LsjHVkwv2OnpkAzGQqJycOzPAzn +tib/lxmhBYVV4eWhCKvLrDqkgp5J3Cp99wIovW6TEfg2PJG4jZI9PKztPQb/OHZp +995oEAG8lmgcCA6kpvwVvle/m3wXj4eKQ1U0mQLGfJja2ripSBk7aAlr7qxWbvjv +4kxe5dJPMRmVB3PRZvnNilfM78Pbn+du0X8TiSwXeG5Og8uSvGwBzQNeW0EZ//b0 +fHNgQlyp4OL9AgMBAAGjUzBRMB0GA1UdDgQWBBSsdECnQyhXkgqyNWFlhkSGlUJd +MzAfBgNVHSMEGDAWgBSsdECnQyhXkgqyNWFlhkSGlUJdMzAPBgNVHRMBAf8EBTAD +AQH/MA0GCSqGSIb3DQEBCwUAA4ICAQAAfgD6lqyOyEOfGMAhtb5OVLpn5hG6WLfd +wyjIYzMNW5DScV9hrgB1ycfA9OIqBECWY3zP76X41KVI0siu7qg3bkaPM2qh7sbO +LXYCkDHNYF69Tlf0JR+Wpr740DIqoITcZRLy+/FMFWij9tNAsY1EcLrSYuiEd8/L +OanlD9AaA3fL1pOsfiNM7Ec6nUFl537+yNFGxU+Q9T7EMb/ypz/FwN3/zBbO0xdk +ZqPh/jDETKorBH87QnFRidmK5DiXRwh323+l+cWEEe79ssGzLBcLr+rzOvDH0qbo +fLBWkRbBtAcRGJAgM0F9dLG4/hQisELobNSCZ4aITHmr1J6MFiVxaaEvIXQ94zgj +xVtAv2Fp4lvpJWMjk/iKc8IR56VkvK6bui7BYEFc+DmtJLw0ryFZDD1wEzbQ5Gzl +W7JBC3vR8zQPo7kVl99BKAsNLhC+tCGdbLLOJROyFWHai/bkcRPHOLOMY1/lM/Wf +rlIcc46pSIOzlsxnlrDzoQihjtg3SrNBkPaRaJE12WFHYELHBX+65HRGlkaXnxaY +HOqPN6NiHVB0i5C4+l0M7JdOx2kEYVQiprm4kBiM3BNMdRpThn4Vt12TnEyq/Cyz +khz4FAMw/ytbEWMxFvEQJdOK1vjmPHAMDSFXiixeklVUD5Th/9so4kRTu97j8fq/ +T0JDHso8+A== +-----END CERTIFICATE----- diff --git a/experimental/packages/otlp-grpc-exporter-base/test/certs/ca.key b/experimental/packages/otlp-grpc-exporter-base/test/certs/ca.key new file mode 100644 index 0000000000..3a12f603d4 --- /dev/null +++ b/experimental/packages/otlp-grpc-exporter-base/test/certs/ca.key @@ -0,0 +1,54 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,723F7ADBF5E86DF0 + +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 +-----END RSA PRIVATE KEY----- diff --git a/experimental/packages/otlp-grpc-exporter-base/test/certs/client.crt b/experimental/packages/otlp-grpc-exporter-base/test/certs/client.crt new file mode 100644 index 0000000000..cbd324625f --- /dev/null +++ b/experimental/packages/otlp-grpc-exporter-base/test/certs/client.crt @@ -0,0 +1,31 @@ +-----BEGIN CERTIFICATE----- +MIIFPzCCAycCAQEwDQYJKoZIhvcNAQELBQAwYTELMAkGA1UEBhMCQ0wxCzAJBgNV +BAgMAlJNMRowGAYDVQQHDBFPcGVuVGVsZW1ldHJ5VGVzdDENMAsGA1UECgwEUm9v +dDENMAsGA1UECwwEVGVzdDELMAkGA1UEAwwCY2EwHhcNMjEwNjA3MjAyNzMzWhcN +MjIwNjA3MjAyNzMzWjBqMQswCQYDVQQGEwJDTDELMAkGA1UECAwCUk0xGjAYBgNV +BAcMEU9wZW5UZWxlbWV0cnlUZXN0MQ0wCwYDVQQKDARUZXN0MQ8wDQYDVQQLDAZD +bGllbnQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAMBc1F9O8OcCu8xspnN1MNwccUZCx+lsh1F50T5D0INmxz3rXxin +TkM+QjFsJ09iF8MmgouI+yxmTayMlW733dUc/XQ9cV9GRwWVlF1RnoYp7mXVwMnz +o80s7CGWc+geliqeLUgzGIoq4bGTp1eEeB2KGJ/w8E2bTLs5a6B0pHhQuVXZ+Pq0 +E0Uzl2wPc+WwjeZyGRU4PbWzX6bN+R05Pfxq8PXhJ6Jnt0j8pNoF/XU6mOIYQyQb +THEKR8qB2SXo5+D1JOlRiofWtK4wsRH/wNm7j7tq75UezhOeqp6YU6MwGnea1loa +65K+DDG/rFyvxSlDS/53gjyKGSqYod8pevvytKjtUmw6xX5i5nFnf+wrKmMH6EDe +Hm63LReBv/CqCErYt4kV3NkdIuHmv7ZIdRfhDPdK8Q/kzAlRTX25wK/xWn5CqpSK +KCUwukEzccV266KU4sG63/4byv6zE62z8472P6u+OGSZlDxznL0BBg9iiHFYiopw +shBfFcszPCSOs1SO8XZH+6J5ypKBzBP7aAsyJflPHWGTUBACY9ZCU/7iwIF7YFPb +a/temVMLkg75oYGVow0Dlp55jQvrzMr7IaSBCxFUJEKf5u6GSNotJWmQdHYta5SH +Kj/rryFQV5qp9mBfia5DWnjHijFZTo+c/KLrgkmzfgbT4qVpnuxKahXNAgMBAAEw +DQYJKoZIhvcNAQELBQADggIBAA2nZTbaa9z/LTNJijf0clu4ULPG4RrqHgQ1q/Wh +NbrNemrxTJ+ZAwCR1gTv4oZe9NBd+V1pDXDQBid8mBTbttVrQCHdjgHFpQKNeyiK +nd2OI4awYiTvGbgDCMHAW/yf+XKCocuSkyNRnmfe8PihFD9wx6+kl6XCJuIkF3Vw +MGKEIrW2WLAARtBZeKV2yhtuVhkNm2TNFPfNrNtk2gdGO8TkX0orOllAENopR+GV +uffuLiIi9KWj9XP9T+6bdZbG2eMJX8wUNIIma54/3XN3RMi2iV9ZxW+F0j6d9ryo +j8pJJfpiW4qh6Eqi6HyvrzgdndKhkVYiIwbX5S60mqL+KcaPghX2goWexMW94QlQ +Re3/IvOAzGpu5fLn//y2tAaO9hDUsyoIJtXcFJKLbfM+mK/Bac2niEyBpr9Rzqur +N43Ga2pOsM4P/4YcAO6tvs5htvh2ala6UDXeEZV9Z1Bc5bOHAWNp13BfWE01iLNC +5rIu0XuVo1aa0FeVdJL6IpVeEwnkzDDt/9LKgp2K8w71VAtUSOg23AEYJu+GFr4D +y+0bahUiNETrFaiCsXQYa9HHFrqhA/PGOGpyq6GrBkJxWpzuL3rQQicpHzVIQEmb +3aCcIBdA2RQwQk7Z3YI2EuFMkHAElCXXZBulvxY6kl1n+2UwWRlocDMYZdkzI3+X +Tw8x +-----END CERTIFICATE----- diff --git a/experimental/packages/otlp-grpc-exporter-base/test/certs/client.csr b/experimental/packages/otlp-grpc-exporter-base/test/certs/client.csr new file mode 100644 index 0000000000..e5de7b1912 --- /dev/null +++ b/experimental/packages/otlp-grpc-exporter-base/test/certs/client.csr @@ -0,0 +1,28 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIErzCCApcCAQAwajELMAkGA1UEBhMCQ0wxCzAJBgNVBAgMAlJNMRowGAYDVQQH +DBFPcGVuVGVsZW1ldHJ5VGVzdDENMAsGA1UECgwEVGVzdDEPMA0GA1UECwwGQ2xp +ZW50MRIwEAYDVQQDDAlsb2NhbGhvc3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDAXNRfTvDnArvMbKZzdTDcHHFGQsfpbIdRedE+Q9CDZsc9618Yp05D +PkIxbCdPYhfDJoKLiPssZk2sjJVu993VHP10PXFfRkcFlZRdUZ6GKe5l1cDJ86PN +LOwhlnPoHpYqni1IMxiKKuGxk6dXhHgdihif8PBNm0y7OWugdKR4ULlV2fj6tBNF +M5dsD3PlsI3mchkVOD21s1+mzfkdOT38avD14SeiZ7dI/KTaBf11OpjiGEMkG0xx +CkfKgdkl6Ofg9STpUYqH1rSuMLER/8DZu4+7au+VHs4TnqqemFOjMBp3mtZaGuuS +vgwxv6xcr8UpQ0v+d4I8ihkqmKHfKXr78rSo7VJsOsV+YuZxZ3/sKypjB+hA3h5u +ty0Xgb/wqghK2LeJFdzZHSLh5r+2SHUX4Qz3SvEP5MwJUU19ucCv8Vp+QqqUiigl +MLpBM3HFduuilOLBut/+G8r+sxOts/OO9j+rvjhkmZQ8c5y9AQYPYohxWIqKcLIQ +XxXLMzwkjrNUjvF2R/uiecqSgcwT+2gLMiX5Tx1hk1AQAmPWQlP+4sCBe2BT22v7 +XplTC5IO+aGBlaMNA5aeeY0L68zK+yGkgQsRVCRCn+buhkjaLSVpkHR2LWuUhyo/ +668hUFeaqfZgX4muQ1p4x4oxWU6PnPyi64JJs34G0+KlaZ7sSmoVzQIDAQABoAAw +DQYJKoZIhvcNAQELBQADggIBAAtbvw2rrtnO5EeOF1Z+mJc9o3036liNbmCQTaC7 +Pf2yqo3Zk44L80R99sX5rDoq79MKEr//ED5C410EiCvzX42w330p7dasuoYRAwLw +YB0UwWnrKhm4SU20SC8zpnCUBL6K9lmXF2PJtkoMgFAnB8tIEc+DAr4hBIqh45vD +VgZ06GHH94/G6tIW3qNvi1mmvUYV0i6D3xBhcNAu6R/zopEYM3png24ZE2IlzZCX +x8hbYuMAqeQXSHQM9sKhXeb60GT8ns7d3P17S/TfpkTI7zRMkPhzsHC/Vp97xN/n +ojEEBY3MZJBPZj/q/buDfbp5x6H7/YxYdOKQKaGVWECGabISBcsg8NxaY++GKc+u +10C8O9KILRCJKGh8ze7chXx5n5+BPEoVVwhLn58eV7sOODvb4kZySUJHvFBb0ZM/ +7626K3443e5ZRkGXydvDIwPZgoiJ3L1L9+olL1cJ5rsRE6L5k6vPuJOeZITm4au2 +pE0THMHx/RjCMA1Lb/0BiDqbBHSh8hh+mHU7YXTq1Fxi2dSas0wAxcTBRs8TULsV +o57TmJqF+byiqwQvugyN7tndvWg9c+LDJHqitA5QC1GDXEi/bdjd7YeHRiL+ciVM +ZXXU9GT1O78O+84wbIDebahn8cifdGa7Kft7GftS3pCIyAjU9+eMXyT1JG3nssLr +4/ht +-----END CERTIFICATE REQUEST----- diff --git a/experimental/packages/otlp-grpc-exporter-base/test/certs/client.key b/experimental/packages/otlp-grpc-exporter-base/test/certs/client.key new file mode 100644 index 0000000000..9219944ca4 --- /dev/null +++ b/experimental/packages/otlp-grpc-exporter-base/test/certs/client.key @@ -0,0 +1,51 @@ +-----BEGIN RSA PRIVATE KEY----- +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 +-----END RSA PRIVATE KEY----- diff --git a/experimental/packages/otlp-grpc-exporter-base/test/certs/regenerate.sh b/experimental/packages/otlp-grpc-exporter-base/test/certs/regenerate.sh new file mode 100755 index 0000000000..e1f1af5b54 --- /dev/null +++ b/experimental/packages/otlp-grpc-exporter-base/test/certs/regenerate.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env sh +# +# Usage: regenerate.sh +# +# regenerate.sh regenerates certificates that are used to test gRPC with TLS +# Make sure you run it in test/certs directory. +# It also serves as a documentation on how existing certificates were generated. + +rm ca.crt ca.key client.crt client.csr client.key server.crt server.csr server.key + +openssl genrsa -nodes -des3 -out ca.key 4096 +openssl req -nodes -new -x509 -days 365 -key ca.key -out ca.crt -subj "/C=CL/ST=RM/L=OpenTelemetryTest/O=Root/OU=Test/CN=ca" + +openssl genrsa -nodes -des3 -out server.key 4096 +openssl req -nodes -new -key server.key -out server.csr -subj "/C=CL/ST=RM/L=OpenTelemetryTest/O=Test/OU=Server/CN=localhost" +openssl x509 -req -nodes -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt +openssl rsa -nodes -in server.key -out server.key + +openssl genrsa -nodes -des3 -out client.key 4096 +openssl req -nodes -new -key client.key -out client.csr -subj "/C=CL/ST=RM/L=OpenTelemetryTest/O=Test/OU=Client/CN=localhost" +openssl x509 -nodes -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt +openssl rsa -nodes -in client.key -out client.key diff --git a/experimental/packages/otlp-grpc-exporter-base/test/certs/server.crt b/experimental/packages/otlp-grpc-exporter-base/test/certs/server.crt new file mode 100644 index 0000000000..09094e4526 --- /dev/null +++ b/experimental/packages/otlp-grpc-exporter-base/test/certs/server.crt @@ -0,0 +1,31 @@ +-----BEGIN CERTIFICATE----- +MIIFPzCCAycCAQEwDQYJKoZIhvcNAQELBQAwYTELMAkGA1UEBhMCQ0wxCzAJBgNV +BAgMAlJNMRowGAYDVQQHDBFPcGVuVGVsZW1ldHJ5VGVzdDENMAsGA1UECgwEUm9v +dDENMAsGA1UECwwEVGVzdDELMAkGA1UEAwwCY2EwHhcNMjEwNjA3MjAyNzMyWhcN +MjIwNjA3MjAyNzMyWjBqMQswCQYDVQQGEwJDTDELMAkGA1UECAwCUk0xGjAYBgNV +BAcMEU9wZW5UZWxlbWV0cnlUZXN0MQ0wCwYDVQQKDARUZXN0MQ8wDQYDVQQLDAZT +ZXJ2ZXIxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBANaRv7jpdEedG0CQ/LoJEXuE32eZXzar45u05wq5CzqnUlYdHyx8 +cgCJJ44KThFXiOzgELFiiwjxmPo1CDLqGp8vEDHntvhxLhw/mFy/aa7YrCv1/1eX +0+cEvNUyoikjHKXECI7sV1ZVMrimGKXQNqRfub1JbJ+IzL+kp6MRtdA6GzxsU0Dg +Wwf7IQxtCQ4Tw3onJ3P3NZAkgz6zCVhOVkR7DuqGulzTQDa//mWwKQJie5wscURj +vLsJ0prS16Tc/5yXijwRjwx8ZEoDrJ5KszoMQwKIoLN7wHBo2r8/8RQsOGTVMJ1I +9kOkH3s9clswxCrnpzdNNmyIwTWaQ6CqpQpp0unGimF3VokanHhOhcpkWfzDArmU +jL4PIFBQBJvHIEKbuhZ4pUYL/6RtgEg2f3xVPe8s0hn/DzwJTgXqEX+TY7WvIKmH +0sMGZ9TZzWe9W64LM2/427+6pfgQOAJDHNLSYpmaa14R+630IMocdY6sj2hoZ9TK +8Ridqn+q+5kIpG/pP7bbzbzsotdzjNb6h7GBlsuyycoOfiP+C6Zs/yUZAAZEsSm0 +e4dXFCccurkXRL7cZJHC/agQhkkvcEP1TpmaygjbucME+h6H0G0St8yzBQwEJdkn +wNmfEhIdjmiX6u/fvPO6VJ5HBxgA5gONJlk+4EbiZTfl2rYauBFhloHzAgMBAAEw +DQYJKoZIhvcNAQELBQADggIBACIJLqVoH8oh8W0/0IF3sxH8LFsGByi0CUPo1JEB +1t3+FqyC7eFC9rDW12LfOKgiZl273OBpCHT8bx3OkoGZ4KwZsbsznyJv/X5OVYFH +5y5Lo8QNGWWMzXoK2JLlYJXZHMaJr5tTFOGqoIvC9C8ibLSAbL0MhtB9L5SvSxAm +mUOKZ/en7ZBepRex/s/rfCWYYTw2Ah02HZc8+H/J/aF3tvChI7Gx0anaSQxS48Ru +3eCaiaBEfoSGQvN9Jc+k1QJgJ4vZ8yi7ndl8pwW97YXo8Sg305ritqpnon+vemsV +rYoqHN+WV2/D0nqNu1AX8PldDvUYTfBtLfS7T5goN7abEIJCaTNmzU2ji0SqI9vJ +j4t9E9KcCKMshbciDrD7RPEPk3vogEDD3uygFwcPwUQfpCUFbRJOnTSH1oB/aUC4 +x9DnYSHBdDvaBmu0pBpoddJ+0pbw02P7YL9kPz5OnOAN06JP4McIYz5ytKoSt/m8 +Z7cUnvn7TRVNLuiapwpB0gtRmb9JY1q3pd63+X0SCaBEtUH+PWcRcS7eDsgMwEym +0CyANhCQYJjcKugIWLYtN/0/p2bIKcRmcH3iJiN2zZtP1AF6G7a4mp+21OynvFOc +3+ojTDGJxxD3uPtKEhJXRgYMOmfAEn3rgtoln1kkNYcd7f2EIulckwB2yeM1IMud +0le7 +-----END CERTIFICATE----- diff --git a/experimental/packages/otlp-grpc-exporter-base/test/certs/server.csr b/experimental/packages/otlp-grpc-exporter-base/test/certs/server.csr new file mode 100644 index 0000000000..bb61322340 --- /dev/null +++ b/experimental/packages/otlp-grpc-exporter-base/test/certs/server.csr @@ -0,0 +1,28 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIErzCCApcCAQAwajELMAkGA1UEBhMCQ0wxCzAJBgNVBAgMAlJNMRowGAYDVQQH +DBFPcGVuVGVsZW1ldHJ5VGVzdDENMAsGA1UECgwEVGVzdDEPMA0GA1UECwwGU2Vy +dmVyMRIwEAYDVQQDDAlsb2NhbGhvc3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDWkb+46XRHnRtAkPy6CRF7hN9nmV82q+ObtOcKuQs6p1JWHR8sfHIA +iSeOCk4RV4js4BCxYosI8Zj6NQgy6hqfLxAx57b4cS4cP5hcv2mu2Kwr9f9Xl9Pn +BLzVMqIpIxylxAiO7FdWVTK4phil0DakX7m9SWyfiMy/pKejEbXQOhs8bFNA4FsH ++yEMbQkOE8N6Jydz9zWQJIM+swlYTlZEew7qhrpc00A2v/5lsCkCYnucLHFEY7y7 +CdKa0tek3P+cl4o8EY8MfGRKA6yeSrM6DEMCiKCze8BwaNq/P/EULDhk1TCdSPZD +pB97PXJbMMQq56c3TTZsiME1mkOgqqUKadLpxophd1aJGpx4ToXKZFn8wwK5lIy+ +DyBQUASbxyBCm7oWeKVGC/+kbYBINn98VT3vLNIZ/w88CU4F6hF/k2O1ryCph9LD +BmfU2c1nvVuuCzNv+Nu/uqX4EDgCQxzS0mKZmmteEfut9CDKHHWOrI9oaGfUyvEY +nap/qvuZCKRv6T+228287KLXc4zW+oexgZbLssnKDn4j/gumbP8lGQAGRLEptHuH +VxQnHLq5F0S+3GSRwv2oEIZJL3BD9U6ZmsoI27nDBPoeh9BtErfMswUMBCXZJ8DZ +nxISHY5ol+rv37zzulSeRwcYAOYDjSZZPuBG4mU35dq2GrgRYZaB8wIDAQABoAAw +DQYJKoZIhvcNAQELBQADggIBALQRbWtd7VIT7PI0g2TJY2nyFDZ+iNLlsqtlTQ+3 +9tDUNf911AyXGFBH2OaIg49UEl3Dn3ErAH6nZluZhRNjZRUYfE2dSEVYoeAA3SmE +FElARM1CX4dQUDnV++RLLRIKKGfcnwU+vSEWN4QfXs9qjI2UK80CBr6kPEt+bMfR +wUIax5HT1XLECoLph1rNza0h3WNk5ndEJMAt51U0JNAi6PwDF04ZfnX5E2RtiEjV ++3DPW1HYlX2hepkXVJPB568bbpmWLrmJsHjVZy4vmDoQi2bzS/QPsepgQ3aXxNel +vTxh0Or5SdIRRfNnP/Ov/aYjBxzkcKY83ADh7h1aqMOlUyFenHoMfTWnMYkeNY+1 +dOoLUS/ZNA6IH54UO7uY0uOcwCfRPYZzDxZI0IkjogX0aizixSs5duQx0ux3sUOo +a4zxMNPd89ppbCMZDS7biC7cOAsdDYXKcE5ijpc5CQXVo4/dA2xyfisRT7WUq9ay +vmQoYfMCAkGv47BVYhzASyPIXuFP2/HDbtnBvZ2aeSuMAwhHzj3vX9js2HGy7t2V +kj36LymQv+YBp9mV9/crSqy0DNFAYOWOuig0mQX/SPedGa4jf9v4OhANi+kzgxtQ +hBTcA0OtJyrVxesVGGK0YwaQIIZ8jwhsK3ljlZpOfVUflHl2/etME1DXtU37U9xA +fuw0 +-----END CERTIFICATE REQUEST----- diff --git a/experimental/packages/otlp-grpc-exporter-base/test/certs/server.key b/experimental/packages/otlp-grpc-exporter-base/test/certs/server.key new file mode 100644 index 0000000000..ddac188c23 --- /dev/null +++ b/experimental/packages/otlp-grpc-exporter-base/test/certs/server.key @@ -0,0 +1,51 @@ +-----BEGIN RSA PRIVATE KEY----- +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 +-----END RSA PRIVATE KEY----- diff --git a/experimental/packages/otlp-grpc-exporter-base/test/traceHelper.ts b/experimental/packages/otlp-grpc-exporter-base/test/traceHelper.ts new file mode 100644 index 0000000000..83578d3c12 --- /dev/null +++ b/experimental/packages/otlp-grpc-exporter-base/test/traceHelper.ts @@ -0,0 +1,331 @@ +/* + * 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 { SpanStatusCode, TraceFlags } from '@opentelemetry/api'; +import { otlpTypes } from '@opentelemetry/exporter-trace-otlp-http'; +import { Resource } from '@opentelemetry/resources'; +import { ReadableSpan } from '@opentelemetry/sdk-trace-base'; +import * as assert from 'assert'; +import * as grpc from '@grpc/grpc-js'; +import { VERSION } from '@opentelemetry/core'; + +const traceIdArr = [ + 31, + 16, + 8, + 220, + 142, + 39, + 14, + 133, + 196, + 10, + 13, + 124, + 57, + 57, + 178, + 120, +]; +const spanIdArr = [94, 16, 114, 97, 246, 79, 165, 62]; +const parentIdArr = [120, 168, 145, 80, 152, 134, 67, 136]; + +export const mockedReadableSpan: ReadableSpan = { + name: 'documentFetch', + kind: 0, + spanContext: () => { + return { + traceId: '1f1008dc8e270e85c40a0d7c3939b278', + spanId: '5e107261f64fa53e', + traceFlags: TraceFlags.SAMPLED, + }; + }, + parentSpanId: '78a8915098864388', + startTime: [1574120165, 429803070], + endTime: [1574120165, 438688070], + ended: true, + status: { code: SpanStatusCode.OK }, + attributes: { component: 'document-load' }, + links: [ + { + context: { + traceId: '1f1008dc8e270e85c40a0d7c3939b278', + spanId: '78a8915098864388', + traceFlags: TraceFlags.SAMPLED, + }, + attributes: { component: 'document-load' }, + }, + ], + events: [ + { name: 'fetchStart', time: [1574120165, 429803070] }, + { + name: 'domainLookupStart', + time: [1574120165, 429803070], + }, + { name: 'domainLookupEnd', time: [1574120165, 429803070] }, + { + name: 'connectStart', + time: [1574120165, 429803070], + }, + { name: 'connectEnd', time: [1574120165, 429803070] }, + { + name: 'requestStart', + time: [1574120165, 435513070], + }, + { name: 'responseStart', time: [1574120165, 436923070] }, + { + name: 'responseEnd', + time: [1574120165, 438688070], + }, + ], + duration: [0, 8885000], + resource: Resource.default().merge(new Resource({ + service: 'ui', + version: 1, + cost: 112.12, + })), + instrumentationLibrary: { name: 'default', version: '0.0.1' }, +}; + +export function ensureExportedEventsAreCorrect( + events: otlpTypes.opentelemetryProto.trace.v1.Span.Event[] +) { + assert.deepStrictEqual( + events, + [ + { + attributes: [], + timeUnixNano: '1574120165429803008', + name: 'fetchStart', + droppedAttributesCount: 0, + }, + { + attributes: [], + timeUnixNano: '1574120165429803008', + name: 'domainLookupStart', + droppedAttributesCount: 0, + }, + { + attributes: [], + timeUnixNano: '1574120165429803008', + name: 'domainLookupEnd', + droppedAttributesCount: 0, + }, + { + attributes: [], + timeUnixNano: '1574120165429803008', + name: 'connectStart', + droppedAttributesCount: 0, + }, + { + attributes: [], + timeUnixNano: '1574120165429803008', + name: 'connectEnd', + droppedAttributesCount: 0, + }, + { + attributes: [], + timeUnixNano: '1574120165435513088', + name: 'requestStart', + droppedAttributesCount: 0, + }, + { + attributes: [], + timeUnixNano: '1574120165436923136', + name: 'responseStart', + droppedAttributesCount: 0, + }, + { + attributes: [], + timeUnixNano: '1574120165438688000', + name: 'responseEnd', + droppedAttributesCount: 0, + }, + ], + 'exported events are incorrect' + ); +} + +export function ensureExportedAttributesAreCorrect( + attributes: otlpTypes.opentelemetryProto.common.v1.KeyValue[] +) { + assert.deepStrictEqual( + attributes, + [ + { + key: 'component', + value: { + stringValue: 'document-load', + value: 'stringValue', + }, + }, + ], + 'exported attributes are incorrect' + ); +} + +export function ensureExportedLinksAreCorrect( + attributes: otlpTypes.opentelemetryProto.trace.v1.Span.Link[] +) { + assert.deepStrictEqual( + attributes, + [ + { + attributes: [ + { + key: 'component', + value: { + stringValue: 'document-load', + value: 'stringValue', + }, + }, + ], + traceId: Buffer.from(traceIdArr), + spanId: Buffer.from(parentIdArr), + traceState: '', + droppedAttributesCount: 0, + }, + ], + 'exported links are incorrect' + ); +} + +export function ensureExportedSpanIsCorrect( + span: otlpTypes.opentelemetryProto.trace.v1.Span +) { + if (span.attributes) { + ensureExportedAttributesAreCorrect(span.attributes); + } + if (span.events) { + ensureExportedEventsAreCorrect(span.events); + } + if (span.links) { + ensureExportedLinksAreCorrect(span.links); + } + assert.deepStrictEqual( + span.traceId, + Buffer.from(traceIdArr), + 'traceId is wrong' + ); + assert.deepStrictEqual( + span.spanId, + Buffer.from(spanIdArr), + 'spanId is wrong' + ); + assert.strictEqual(span.traceState, '', 'traceState is wrong'); + assert.deepStrictEqual( + span.parentSpanId, + Buffer.from(parentIdArr), + 'parentIdArr is wrong' + ); + assert.strictEqual(span.name, 'documentFetch', 'name is wrong'); + assert.strictEqual(span.kind, 'SPAN_KIND_INTERNAL', 'kind is wrong'); + assert.strictEqual( + span.startTimeUnixNano, + '1574120165429803008', + 'startTimeUnixNano is wrong' + ); + assert.strictEqual( + span.endTimeUnixNano, + '1574120165438688000', + 'endTimeUnixNano is wrong' + ); + assert.strictEqual( + span.droppedAttributesCount, + 0, + 'droppedAttributesCount is wrong' + ); + assert.strictEqual(span.droppedEventsCount, 0, 'droppedEventsCount is wrong'); + assert.strictEqual(span.droppedLinksCount, 0, 'droppedLinksCount is wrong'); + assert.deepStrictEqual( + span.status, + { + code: 'STATUS_CODE_OK', + deprecatedCode: 'DEPRECATED_STATUS_CODE_OK', + message: '', + }, + 'status is wrong' + ); +} + +export function ensureResourceIsCorrect( + resource: otlpTypes.opentelemetryProto.resource.v1.Resource +) { + assert.deepStrictEqual(resource, { + attributes: [ + { + 'key': 'service.name', + 'value': { + 'stringValue': `unknown_service:${process.argv0}`, + 'value': 'stringValue' + } + }, + { + 'key': 'telemetry.sdk.language', + 'value': { + 'stringValue': 'nodejs', + 'value': 'stringValue' + } + }, + { + 'key': 'telemetry.sdk.name', + 'value': { + 'stringValue': 'opentelemetry', + 'value': 'stringValue' + } + }, + { + 'key': 'telemetry.sdk.version', + 'value': { + 'stringValue': VERSION, + 'value': 'stringValue' + } + }, + { + key: 'service', + value: { + stringValue: 'ui', + value: 'stringValue', + }, + }, + { + key: 'version', + value: { + intValue: '1', + value: 'intValue', + }, + }, + { + key: 'cost', + value: { + doubleValue: 112.12, + value: 'doubleValue', + }, + }, + ], + droppedAttributesCount: 0, + }); +} + +export function ensureMetadataIsCorrect( + actual: grpc.Metadata, + expected: grpc.Metadata +) { + //ignore user agent + expected.remove('user-agent'); + actual.remove('user-agent'); + assert.deepStrictEqual(actual.getMap(), expected.getMap()); +} diff --git a/experimental/packages/exporter-trace-otlp-grpc/test/util.test.ts b/experimental/packages/otlp-grpc-exporter-base/test/util.test.ts similarity index 86% rename from experimental/packages/exporter-trace-otlp-grpc/test/util.test.ts rename to experimental/packages/otlp-grpc-exporter-base/test/util.test.ts index 42452850ce..cae1de6ce3 100644 --- a/experimental/packages/exporter-trace-otlp-grpc/test/util.test.ts +++ b/experimental/packages/otlp-grpc-exporter-base/test/util.test.ts @@ -18,8 +18,8 @@ import * as sinon from 'sinon'; import * as assert from 'assert'; import { diag } from '@opentelemetry/api'; -import { validateAndNormalizeUrl, configureCompression } from '../src/util'; -import { CompressionAlgorithm} from '../src/types'; +import { validateAndNormalizeUrl, configureCompression, GrpcCompressionAlgorithm } from '../src/util'; +import { CompressionAlgorithm } from '@opentelemetry/otlp-exporter-base'; // Tests added to detect breakage released in #2130 describe('validateAndNormalizeUrl()', () => { @@ -85,19 +85,19 @@ describe('configureCompression', () => { const envSource = process.env; it('should return none for compression', () => { const compression = CompressionAlgorithm.NONE; - assert.strictEqual(configureCompression(compression), CompressionAlgorithm.NONE); + assert.strictEqual(configureCompression(compression), GrpcCompressionAlgorithm.NONE); }); it('should return gzip compression defined via env', () => { envSource.OTEL_EXPORTER_OTLP_TRACES_COMPRESSION = 'gzip'; - assert.strictEqual(configureCompression(undefined),CompressionAlgorithm.GZIP); + assert.strictEqual(configureCompression(undefined),GrpcCompressionAlgorithm.GZIP); delete envSource.OTEL_EXPORTER_OTLP_TRACES_COMPRESSION; }); it('should return none for compression defined via env', () => { envSource.OTEL_EXPORTER_OTLP_TRACES_COMPRESSION = 'none'; - assert.strictEqual(configureCompression(undefined),CompressionAlgorithm.NONE); + assert.strictEqual(configureCompression(undefined),GrpcCompressionAlgorithm.NONE); delete envSource.OTEL_EXPORTER_OTLP_TRACES_COMPRESSION; }); it('should return none for compression when no compression is set', () => { - assert.strictEqual(configureCompression(undefined),CompressionAlgorithm.NONE); + assert.strictEqual(configureCompression(undefined),GrpcCompressionAlgorithm.NONE); }); }); diff --git a/experimental/packages/otlp-grpc-exporter-base/tsconfig.json b/experimental/packages/otlp-grpc-exporter-base/tsconfig.json new file mode 100644 index 0000000000..c8e54e3690 --- /dev/null +++ b/experimental/packages/otlp-grpc-exporter-base/tsconfig.json @@ -0,0 +1,28 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "rootDir": ".", + "outDir": "build" + }, + "include": [ + "src/**/*.ts", + "test/**/*.ts" + ], + "references": [ + { + "path": "../../../packages/opentelemetry-core" + }, + { + "path": "../../../packages/opentelemetry-resources" + }, + { + "path": "../../../packages/opentelemetry-sdk-trace-base" + }, + { + "path": "../exporter-trace-otlp-http" + }, + { + "path": "../otlp-exporter-base" + } + ] +} diff --git a/experimental/packages/otlp-proto-exporter-base/.eslintignore b/experimental/packages/otlp-proto-exporter-base/.eslintignore new file mode 100644 index 0000000000..378eac25d3 --- /dev/null +++ b/experimental/packages/otlp-proto-exporter-base/.eslintignore @@ -0,0 +1 @@ +build diff --git a/experimental/packages/otlp-proto-exporter-base/.eslintrc.js b/experimental/packages/otlp-proto-exporter-base/.eslintrc.js new file mode 100644 index 0000000000..3ed0fbeba3 --- /dev/null +++ b/experimental/packages/otlp-proto-exporter-base/.eslintrc.js @@ -0,0 +1,8 @@ +module.exports = { + "env": { + "mocha": true, + "commonjs": true, + "node": true, + }, + ...require('../../../eslint.config.js') +} diff --git a/experimental/packages/otlp-proto-exporter-base/.npmignore b/experimental/packages/otlp-proto-exporter-base/.npmignore new file mode 100644 index 0000000000..9505ba9450 --- /dev/null +++ b/experimental/packages/otlp-proto-exporter-base/.npmignore @@ -0,0 +1,4 @@ +/bin +/coverage +/doc +/test diff --git a/experimental/packages/otlp-proto-exporter-base/LICENSE b/experimental/packages/otlp-proto-exporter-base/LICENSE new file mode 100644 index 0000000000..261eeb9e9f --- /dev/null +++ b/experimental/packages/otlp-proto-exporter-base/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/experimental/packages/otlp-proto-exporter-base/README.md b/experimental/packages/otlp-proto-exporter-base/README.md new file mode 100644 index 0000000000..adeffe39f4 --- /dev/null +++ b/experimental/packages/otlp-proto-exporter-base/README.md @@ -0,0 +1,31 @@ +# OpenTelemetry Collector Exporter for node with protobuf + +[![NPM Published Version][npm-img]][npm-url] +[![Apache License][license-image]][license-image] + +This module provides a OTLP-http/protobuf exporter base for Node.js (browsers not supported) to be used with [opentelemetry-collector][opentelemetry-collector-url]. + +## Installation + +```bash +npm install --save @opentelemetry/otlp-proto-exporter-base +``` + +## Useful links + +- For more information on OpenTelemetry, visit: +- For more about OpenTelemetry JavaScript: +- For help or feedback on this project, join us in [GitHub Discussions][discussions-url] + +## License + +Apache 2.0 - See [LICENSE][license-url] for more information. + +[discussions-url]: https://github.com/open-telemetry/opentelemetry-js/discussions +[license-url]: https://github.com/open-telemetry/opentelemetry-js/blob/main/LICENSE +[license-image]: https://img.shields.io/badge/license-Apache_2.0-green.svg?style=flat +[npm-url]: https://www.npmjs.com/package/@opentelemetry/otlp-proto-exporter-base +[npm-img]: https://badge.fury.io/js/%40opentelemetry%2Fotlp-proto-exporter-base.svg +[opentelemetry-collector-url]: https://github.com/open-telemetry/opentelemetry-collector +[semconv-resource-service-name]: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/resource/semantic_conventions/README.md#service +[metrics-exporter-url]: https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-exporter-metrics-otlp-proto diff --git a/experimental/packages/otlp-proto-exporter-base/package.json b/experimental/packages/otlp-proto-exporter-base/package.json new file mode 100644 index 0000000000..07824c2029 --- /dev/null +++ b/experimental/packages/otlp-proto-exporter-base/package.json @@ -0,0 +1,76 @@ +{ + "name": "@opentelemetry/otlp-proto-exporter-base", + "version": "0.27.0", + "description": "OpenTelemetry OTLP-HTTP-protobuf Exporter base (for internal use only)", + "main": "build/src/index.js", + "types": "build/src/index.d.ts", + "repository": "open-telemetry/opentelemetry-js", + "scripts": { + "prepublishOnly": "npm run compile", + "codecov": "nyc report --reporter=json && codecov -f coverage/*.json -p ../../../", + "compile": "tsc --build", + "clean": "tsc --build --clean", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", + "postcompile": "npm run submodule && npm run protos:copy", + "protos:copy": "cpx protos/opentelemetry/**/*.* build/protos/opentelemetry", + "submodule": "git submodule sync --recursive && git submodule update --init --recursive", + "tdd": "npm run test -- --watch-extensions ts --watch", + "test": "nyc ts-mocha -p tsconfig.json 'test/**/*.test.ts'", + "version": "node ../../../scripts/version-update.js", + "watch": "npm run protos:copy && tsc -w", + "precompile": "lerna run version --scope $(npm pkg get name) --include-dependencies", + "prewatch": "npm run precompile" + }, + "keywords": [ + "opentelemetry", + "nodejs", + "protobuf", + "tracing", + "profiling", + "metrics", + "stats" + ], + "author": "OpenTelemetry Authors", + "license": "Apache-2.0", + "engines": { + "node": ">=8.12.0" + }, + "files": [ + "build/src/**/*.js", + "build/src/**/*.js.map", + "build/src/**/*.d.ts", + "build/protos/**/*.proto", + "doc", + "LICENSE", + "README.md" + ], + "publishConfig": { + "access": "public" + }, + "devDependencies": { + "@babel/core": "7.16.0", + "@opentelemetry/api": "^1.0.0", + "@types/mocha": "8.2.3", + "@types/node": "14.17.33", + "@types/sinon": "10.0.6", + "codecov": "3.8.3", + "cpx": "1.5.0", + "mocha": "7.2.0", + "nyc": "15.1.0", + "rimraf": "3.0.2", + "sinon": "12.0.1", + "ts-loader": "8.3.0", + "ts-mocha": "8.0.0", + "typescript": "4.4.4" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "dependencies": { + "@opentelemetry/core": "1.1.1", + "@grpc/proto-loader": "^0.6.9", + "@opentelemetry/otlp-exporter-base": "0.27.0", + "protobufjs": "^6.9.0" + } +} diff --git a/experimental/packages/exporter-trace-otlp-proto/protos b/experimental/packages/otlp-proto-exporter-base/protos similarity index 100% rename from experimental/packages/exporter-trace-otlp-proto/protos rename to experimental/packages/otlp-proto-exporter-base/protos diff --git a/experimental/packages/exporter-trace-otlp-proto/src/OTLPExporterNodeBase.ts b/experimental/packages/otlp-proto-exporter-base/src/OTLPProtoExporterNodeBase.ts similarity index 84% rename from experimental/packages/exporter-trace-otlp-proto/src/OTLPExporterNodeBase.ts rename to experimental/packages/otlp-proto-exporter-base/src/OTLPProtoExporterNodeBase.ts index eb9d6b766c..6ff136ed94 100644 --- a/experimental/packages/exporter-trace-otlp-proto/src/OTLPExporterNodeBase.ts +++ b/experimental/packages/otlp-proto-exporter-base/src/OTLPProtoExporterNodeBase.ts @@ -15,24 +15,24 @@ */ import { diag } from '@opentelemetry/api'; +import { ServiceClientType } from './types'; import { OTLPExporterNodeBase as OTLPExporterBaseMain, - otlpTypes, - OTLPExporterNodeConfigBase, CompressionAlgorithm, -} from '@opentelemetry/exporter-trace-otlp-http'; -import { ServiceClientType } from './types'; + OTLPExporterError, + OTLPExporterNodeConfigBase +} from '@opentelemetry/otlp-exporter-base'; -type SendFn = (collector: OTLPExporterNodeBase, +type SendFn = (collector: OTLPProtoExporterNodeBase, objects: ExportItem[], compression: CompressionAlgorithm, onSuccess: () => void, - onError: (error: otlpTypes.OTLPExporterError) => void) => void; + onError: (error: OTLPExporterError) => void) => void; /** - * Collector Metric Exporter abstract base class + * Collector Exporter abstract base class */ -export abstract class OTLPExporterNodeBase< +export abstract class OTLPProtoExporterNodeBase< ExportItem, ServiceRequest > extends OTLPExporterBaseMain { @@ -45,7 +45,7 @@ export abstract class OTLPExporterNodeBase< private _sendPromise( objects: ExportItem[], onSuccess: () => void, - onError: (error: otlpTypes.OTLPExporterError) => void + onError: (error: OTLPExporterError) => void ): void { const promise = new Promise((resolve, reject) => { this._send(this, objects, this.compression, resolve, reject); @@ -73,7 +73,7 @@ export abstract class OTLPExporterNodeBase< override send( objects: ExportItem[], onSuccess: () => void, - onError: (error: otlpTypes.OTLPExporterError) => void + onError: (error: OTLPExporterError) => void ): void { if (this._shutdownOnce.isCalled) { diag.debug('Shutdown already started. Cannot send objects'); diff --git a/experimental/packages/otlp-proto-exporter-base/src/index.ts b/experimental/packages/otlp-proto-exporter-base/src/index.ts new file mode 100644 index 0000000000..e2cc1ee65c --- /dev/null +++ b/experimental/packages/otlp-proto-exporter-base/src/index.ts @@ -0,0 +1,19 @@ +/* + * 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. + */ + +export { OTLPProtoExporterNodeBase } from './OTLPProtoExporterNodeBase'; +export * from './types'; +export * from './util'; diff --git a/experimental/packages/exporter-trace-otlp-proto/src/types.ts b/experimental/packages/otlp-proto-exporter-base/src/types.ts similarity index 100% rename from experimental/packages/exporter-trace-otlp-proto/src/types.ts rename to experimental/packages/otlp-proto-exporter-base/src/types.ts diff --git a/experimental/packages/exporter-trace-otlp-proto/src/util.ts b/experimental/packages/otlp-proto-exporter-base/src/util.ts similarity index 86% rename from experimental/packages/exporter-trace-otlp-proto/src/util.ts rename to experimental/packages/otlp-proto-exporter-base/src/util.ts index ea38e815d6..0ab12f2e3e 100644 --- a/experimental/packages/exporter-trace-otlp-proto/src/util.ts +++ b/experimental/packages/otlp-proto-exporter-base/src/util.ts @@ -14,18 +14,18 @@ * limitations under the License. */ -import { - otlpTypes, - sendWithHttp, - OTLPExporterNodeConfigBase, - CompressionAlgorithm, -} from '@opentelemetry/exporter-trace-otlp-http'; import * as path from 'path'; import { ServiceClientType } from './types'; -import { OTLPExporterNodeBase } from './OTLPExporterNodeBase'; +import { OTLPProtoExporterNodeBase } from './OTLPProtoExporterNodeBase'; import type { Type } from 'protobufjs'; import * as protobufjs from 'protobufjs'; +import { + CompressionAlgorithm, + OTLPExporterError, + OTLPExporterNodeConfigBase, + sendWithHttp +} from '@opentelemetry/otlp-exporter-base'; let ExportRequestProto: Type | undefined; @@ -34,7 +34,7 @@ export function getExportRequestProto(): Type | undefined { } export function onInit( - collector: OTLPExporterNodeBase, + collector: OTLPProtoExporterNodeBase, _config: OTLPExporterNodeConfigBase ): void { const dir = path.resolve(__dirname, '..', 'protos'); @@ -62,11 +62,11 @@ export function onInit( } export function send( - collector: OTLPExporterNodeBase, + collector: OTLPProtoExporterNodeBase, objects: ExportItem[], compression: CompressionAlgorithm, onSuccess: () => void, - onError: (error: otlpTypes.OTLPExporterError) => void + onError: (error: OTLPExporterError) => void ): void { const serviceRequest = collector.convert(objects); @@ -83,6 +83,6 @@ export function send( ); } } else { - onError(new otlpTypes.OTLPExporterError('No proto')); + onError(new OTLPExporterError('No proto')); } } diff --git a/experimental/packages/exporter-trace-otlp-proto/submodule.md b/experimental/packages/otlp-proto-exporter-base/submodule.md similarity index 93% rename from experimental/packages/exporter-trace-otlp-proto/submodule.md rename to experimental/packages/otlp-proto-exporter-base/submodule.md index c091e09692..c2838b1ba5 100644 --- a/experimental/packages/exporter-trace-otlp-proto/submodule.md +++ b/experimental/packages/otlp-proto-exporter-base/submodule.md @@ -15,7 +15,7 @@ Knowing this if you want to change the submodule to point to a different version ``` 3. Find the SHA which you want to update to and copy it (the long one) -the latest sha when this guide was written is `b54688569186e0b862bf7462a983ccf2c50c0547` + the latest sha when this guide was written is `59c488bfb8fb6d0458ad6425758b70259ff4a2bd` 4. Enter a submodule directory from this directory diff --git a/experimental/packages/otlp-proto-exporter-base/tsconfig.json b/experimental/packages/otlp-proto-exporter-base/tsconfig.json new file mode 100644 index 0000000000..0282e8dc83 --- /dev/null +++ b/experimental/packages/otlp-proto-exporter-base/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "rootDir": ".", + "outDir": "build" + }, + "include": [ + "src/**/*.ts", + "test/**/*.ts" + ], + "references": [ + { + "path": "../../../packages/opentelemetry-core" + }, + { + "path": "../otlp-exporter-base" + } + ] +} diff --git a/tsconfig.json b/tsconfig.json index e8b0b5cba6..7b24699251 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -133,6 +133,15 @@ { "path": "experimental/packages/opentelemetry-sdk-node" }, + { + "path": "experimental/packages/otlp-exporter-base" + }, + { + "path": "experimental/packages/otlp-grpc-exporter-base" + }, + { + "path": "experimental/packages/otlp-proto-exporter-base" + }, { "path": "experimental/packages/otlp-transformer" },