diff --git a/packages/opentelemetry-core/src/baggage/propagation/HttpBaggage.ts b/packages/opentelemetry-core/src/baggage/propagation/HttpBaggage.ts index 9452623b992..dabd2923398 100644 --- a/packages/opentelemetry-core/src/baggage/propagation/HttpBaggage.ts +++ b/packages/opentelemetry-core/src/baggage/propagation/HttpBaggage.ts @@ -15,7 +15,6 @@ */ import { - Baggage, Context, BaggageEntry, getBaggage, @@ -24,22 +23,17 @@ import { TextMapPropagator, TextMapSetter, createBaggage, - baggageEntryMetadataFromString, isInstrumentationSuppressed, } from '@opentelemetry/api'; - -const KEY_PAIR_SEPARATOR = '='; -const PROPERTIES_SEPARATOR = ';'; -const ITEMS_SEPARATOR = ','; - -// Name of the http header used to propagate the baggage -export const BAGGAGE_HEADER = 'baggage'; -// Maximum number of name-value pairs allowed by w3c spec -export const MAX_NAME_VALUE_PAIRS = 180; -// Maximum number of bytes per a single name-value pair allowed by w3c spec -export const MAX_PER_NAME_VALUE_PAIRS = 4096; -// Maximum total length of all name-value pairs allowed by w3c spec -export const MAX_TOTAL_LENGTH = 8192; +import { + getKeyPairs, + serializeKeyPairs, + parsePairKeyValue, + MAX_NAME_VALUE_PAIRS, + ITEMS_SEPARATOR, + BAGGAGE_HEADER, + MAX_PER_NAME_VALUE_PAIRS, +} from '../utils'; /** * Propagates {@link Baggage} through Context format propagation. @@ -51,35 +45,17 @@ export class HttpBaggage implements TextMapPropagator { inject(context: Context, carrier: unknown, setter: TextMapSetter) { const baggage = getBaggage(context); if (!baggage || isInstrumentationSuppressed(context)) return; - const keyPairs = this._getKeyPairs(baggage) + const keyPairs = getKeyPairs(baggage) .filter((pair: string) => { return pair.length <= MAX_PER_NAME_VALUE_PAIRS; }) .slice(0, MAX_NAME_VALUE_PAIRS); - const headerValue = this._serializeKeyPairs(keyPairs); + const headerValue = serializeKeyPairs(keyPairs); if (headerValue.length > 0) { setter.set(carrier, BAGGAGE_HEADER, headerValue); } } - private _serializeKeyPairs(keyPairs: string[]) { - return keyPairs.reduce((hValue: string, current: string) => { - const value = `${hValue}${ - hValue !== '' ? ITEMS_SEPARATOR : '' - }${current}`; - return value.length > MAX_TOTAL_LENGTH ? hValue : value; - }, ''); - } - - private _getKeyPairs(baggage: Baggage): string[] { - return baggage - .getAllEntries() - .map( - ([key, value]) => - `${encodeURIComponent(key)}=${encodeURIComponent(value.value)}` - ); - } - extract(context: Context, carrier: unknown, getter: TextMapGetter): Context { const headerValue: string = getter.get(carrier, BAGGAGE_HEADER) as string; if (!headerValue) return context; @@ -89,7 +65,7 @@ export class HttpBaggage implements TextMapPropagator { } const pairs = headerValue.split(ITEMS_SEPARATOR); pairs.forEach(entry => { - const keyPair = this._parsePairKeyValue(entry); + const keyPair = parsePairKeyValue(entry); if (keyPair) { const baggageEntry: BaggageEntry = { value: keyPair.value }; if (keyPair.metadata) { @@ -104,24 +80,6 @@ export class HttpBaggage implements TextMapPropagator { return setBaggage(context, createBaggage(baggage)); } - private _parsePairKeyValue(entry: string) { - const valueProps = entry.split(PROPERTIES_SEPARATOR); - if (valueProps.length <= 0) return; - const keyPairPart = valueProps.shift(); - if (!keyPairPart) return; - const keyPair = keyPairPart.split(KEY_PAIR_SEPARATOR); - if (keyPair.length !== 2) return; - const key = decodeURIComponent(keyPair[0].trim()); - const value = decodeURIComponent(keyPair[1].trim()); - let metadata; - if (valueProps.length > 0) { - metadata = baggageEntryMetadataFromString( - valueProps.join(PROPERTIES_SEPARATOR) - ); - } - return { key, value, metadata }; - } - fields(): string[] { return [BAGGAGE_HEADER]; } diff --git a/packages/opentelemetry-core/src/baggage/utils.ts b/packages/opentelemetry-core/src/baggage/utils.ts new file mode 100644 index 00000000000..4d6b84508de --- /dev/null +++ b/packages/opentelemetry-core/src/baggage/utils.ts @@ -0,0 +1,63 @@ +/* + * 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 { Baggage, baggageEntryMetadataFromString } from '@opentelemetry/api'; + +export const KEY_PAIR_SEPARATOR = '='; +export const PROPERTIES_SEPARATOR = ';'; +export const ITEMS_SEPARATOR = ','; + +// Name of the http header used to propagate the baggage +export const BAGGAGE_HEADER = 'baggage'; +// Maximum number of name-value pairs allowed by w3c spec +export const MAX_NAME_VALUE_PAIRS = 180; +// Maximum number of bytes per a single name-value pair allowed by w3c spec +export const MAX_PER_NAME_VALUE_PAIRS = 4096; +// Maximum total length of all name-value pairs allowed by w3c spec +export const MAX_TOTAL_LENGTH = 8192; + +export const serializeKeyPairs = (keyPairs: string[]) => { + return keyPairs.reduce((hValue: string, current: string) => { + const value = `${hValue}${hValue !== '' ? ITEMS_SEPARATOR : ''}${current}`; + return value.length > MAX_TOTAL_LENGTH ? hValue : value; + }, ''); +}; + +export const getKeyPairs = (baggage: Baggage): string[] => { + return baggage + .getAllEntries() + .map( + ([key, value]) => + `${encodeURIComponent(key)}=${encodeURIComponent(value.value)}` + ); +}; + +export const parsePairKeyValue = (entry: string) => { + const valueProps = entry.split(PROPERTIES_SEPARATOR); + if (valueProps.length <= 0) return; + const keyPairPart = valueProps.shift(); + if (!keyPairPart) return; + const keyPair = keyPairPart.split(KEY_PAIR_SEPARATOR); + if (keyPair.length !== 2) return; + const key = decodeURIComponent(keyPair[0].trim()); + const value = decodeURIComponent(keyPair[1].trim()); + let metadata; + if (valueProps.length > 0) { + metadata = baggageEntryMetadataFromString( + valueProps.join(PROPERTIES_SEPARATOR) + ); + } + return { key, value, metadata }; +}; diff --git a/packages/opentelemetry-core/src/index.ts b/packages/opentelemetry-core/src/index.ts index 9245f0148a0..ecdb2a1c90e 100644 --- a/packages/opentelemetry-core/src/index.ts +++ b/packages/opentelemetry-core/src/index.ts @@ -25,6 +25,7 @@ export * from './context/propagation/composite'; export * from './context/propagation/HttpTraceContext'; export * from './context/propagation/types'; export * from './baggage/propagation/HttpBaggage'; +export * as baggageUtils from './baggage/utils'; export * from './platform'; export * from './trace/sampler/AlwaysOffSampler'; export * from './trace/sampler/AlwaysOnSampler'; diff --git a/packages/opentelemetry-core/src/utils/environment.ts b/packages/opentelemetry-core/src/utils/environment.ts index e5e3ef0847a..2c0f79045fc 100644 --- a/packages/opentelemetry-core/src/utils/environment.ts +++ b/packages/opentelemetry-core/src/utils/environment.ts @@ -69,6 +69,12 @@ export type ENVIRONMENT = { OTEL_EXPORTER_JAEGER_USER?: string; OTEL_LOG_LEVEL?: DiagLogLevel; OTEL_RESOURCE_ATTRIBUTES?: string; + OTEL_EXPORTER_OTLP_ENDPOINT?: string; + OTEL_EXPORTER_OTLP_TRACES_ENDPOINT?: string; + OTEL_EXPORTER_OTLP_METRICS_ENDPOINT?: string; + OTEL_EXPORTER_OTLP_HEADERS?: string; + OTEL_EXPORTER_OTLP_TRACES_HEADERS?: string; + OTEL_EXPORTER_OTLP_METRICS_HEADERS?: string; } & ENVIRONMENT_NUMBERS & ENVIRONMENT_LISTS; @@ -102,6 +108,12 @@ export const DEFAULT_ENVIRONMENT: Required = { OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT: 1000, OTEL_SPAN_EVENT_COUNT_LIMIT: 1000, OTEL_SPAN_LINK_COUNT_LIMIT: 1000, + OTEL_EXPORTER_OTLP_ENDPOINT: '', + OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: '', + OTEL_EXPORTER_OTLP_METRICS_ENDPOINT: '', + OTEL_EXPORTER_OTLP_HEADERS: '', + OTEL_EXPORTER_OTLP_TRACES_HEADERS: '', + OTEL_EXPORTER_OTLP_METRICS_HEADERS: '', }; /** diff --git a/packages/opentelemetry-core/test/baggage/HttpBaggage.test.ts b/packages/opentelemetry-core/test/baggage/HttpBaggage.test.ts index 464be7c2c9a..bc152214d1e 100644 --- a/packages/opentelemetry-core/test/baggage/HttpBaggage.test.ts +++ b/packages/opentelemetry-core/test/baggage/HttpBaggage.test.ts @@ -25,10 +25,7 @@ import { } from '@opentelemetry/api'; import { ROOT_CONTEXT } from '@opentelemetry/api'; import * as assert from 'assert'; -import { - BAGGAGE_HEADER, - HttpBaggage, -} from '../../src/baggage/propagation/HttpBaggage'; +import { baggageUtils, HttpBaggage } from '../../src/'; describe('HttpBaggage', () => { const httpTraceContext = new HttpBaggage(); @@ -53,7 +50,7 @@ describe('HttpBaggage', () => { defaultTextMapSetter ); assert.deepStrictEqual( - carrier[BAGGAGE_HEADER], + carrier[baggageUtils.BAGGAGE_HEADER], 'key1=d4cda95b652f4a1592b449d5929fda1b,key3=c88815a7-0fa9-4d95-a1f1-cdccce3c5c2a,with%2Fslash=with%20spaces' ); }); @@ -70,7 +67,7 @@ describe('HttpBaggage', () => { defaultTextMapSetter ); assert.deepStrictEqual( - carrier[BAGGAGE_HEADER], + carrier[baggageUtils.BAGGAGE_HEADER], 'key1=d4cda95b,key3=c88815a7' ); }); @@ -91,7 +88,7 @@ describe('HttpBaggage', () => { defaultTextMapSetter ); - let header = carrier[BAGGAGE_HEADER]; + let header = carrier[baggageUtils.BAGGAGE_HEADER]; assert.ok(typeof header === 'string'); assert.deepStrictEqual(header, `aa=shortvalue,${shortKey}=${value}`); @@ -107,7 +104,7 @@ describe('HttpBaggage', () => { defaultTextMapSetter ); - header = carrier[BAGGAGE_HEADER]; + header = carrier[baggageUtils.BAGGAGE_HEADER]; assert.ok(typeof header === 'string'); assert.deepStrictEqual(header, 'aa=shortvalue'); }); @@ -129,7 +126,7 @@ describe('HttpBaggage', () => { defaultTextMapSetter ); - let header = carrier[BAGGAGE_HEADER]; + let header = carrier[baggageUtils.BAGGAGE_HEADER]; assert.ok(typeof header === 'string'); assert.deepStrictEqual(header.length, 8192); assert.deepStrictEqual(header.split(',').length, 3); @@ -147,7 +144,7 @@ describe('HttpBaggage', () => { defaultTextMapSetter ); - header = carrier[BAGGAGE_HEADER]; + header = carrier[baggageUtils.BAGGAGE_HEADER]; assert.ok(typeof header === 'string'); assert.deepStrictEqual(header.length, 8100); assert.deepStrictEqual(header.split(',').length, 2); @@ -170,7 +167,7 @@ describe('HttpBaggage', () => { defaultTextMapSetter ); - const header = carrier[BAGGAGE_HEADER]; + const header = carrier[baggageUtils.BAGGAGE_HEADER]; assert.ok(typeof header === 'string'); assert.strictEqual(header.split(',').length, 180); }); @@ -178,7 +175,7 @@ describe('HttpBaggage', () => { describe('.extract()', () => { it('should extract context of a sampled span from carrier', () => { - carrier[BAGGAGE_HEADER] = + carrier[baggageUtils.BAGGAGE_HEADER] = 'key1=d4cda95b,key3=c88815a7, keyn = valn, keym =valm'; const extractedBaggage = getBaggage( httpTraceContext.extract(ROOT_CONTEXT, carrier, defaultTextMapGetter) @@ -197,7 +194,9 @@ describe('HttpBaggage', () => { describe('fields()', () => { it('returns the fields used by the baggage spec', () => { const propagator = new HttpBaggage(); - assert.deepStrictEqual(propagator.fields(), [BAGGAGE_HEADER]); + assert.deepStrictEqual(propagator.fields(), [ + baggageUtils.BAGGAGE_HEADER, + ]); }); }); @@ -211,7 +210,8 @@ describe('HttpBaggage', () => { }); it('returns keys with their properties', () => { - carrier[BAGGAGE_HEADER] = 'key1=d4cda95b,key3=c88815a7;prop1=value1'; + carrier[baggageUtils.BAGGAGE_HEADER] = + 'key1=d4cda95b,key3=c88815a7;prop1=value1'; const bag = getBaggage( httpTraceContext.extract(ROOT_CONTEXT, carrier, defaultTextMapGetter) ); @@ -262,7 +262,7 @@ describe('HttpBaggage', () => { }, }; Object.getOwnPropertyNames(testCases).forEach(testCase => { - carrier[BAGGAGE_HEADER] = testCases[testCase].header; + carrier[baggageUtils.BAGGAGE_HEADER] = testCases[testCase].header; const extractedSpanContext = getBaggage( httpTraceContext.extract(ROOT_CONTEXT, carrier, defaultTextMapGetter) diff --git a/packages/opentelemetry-exporter-collector-grpc/src/CollectorExporterNodeBase.ts b/packages/opentelemetry-exporter-collector-grpc/src/CollectorExporterNodeBase.ts index 9c7048c1889..7c7185a2943 100644 --- a/packages/opentelemetry-exporter-collector-grpc/src/CollectorExporterNodeBase.ts +++ b/packages/opentelemetry-exporter-collector-grpc/src/CollectorExporterNodeBase.ts @@ -20,11 +20,7 @@ import { collectorTypes, } from '@opentelemetry/exporter-collector'; import type { Metadata } from 'grpc'; -import { - CollectorExporterConfigNode, - GRPCQueueItem, - ServiceClientType, -} from './types'; +import { CollectorExporterConfigNode, GRPCQueueItem } from './types'; import { ServiceClient } from './types'; /** @@ -119,5 +115,4 @@ export abstract class CollectorExporterNodeBase< } abstract getServiceProtoPath(): string; - abstract getServiceClientType(): ServiceClientType; } diff --git a/packages/opentelemetry-exporter-collector-grpc/src/CollectorMetricExporter.ts b/packages/opentelemetry-exporter-collector-grpc/src/CollectorMetricExporter.ts index 9e2417805ec..0d61d6edc06 100644 --- a/packages/opentelemetry-exporter-collector-grpc/src/CollectorMetricExporter.ts +++ b/packages/opentelemetry-exporter-collector-grpc/src/CollectorMetricExporter.ts @@ -19,12 +19,8 @@ import { toCollectorExportMetricServiceRequest, } from '@opentelemetry/exporter-collector'; import { MetricRecord, MetricExporter } from '@opentelemetry/metrics'; -import { CollectorExporterConfigNode, ServiceClientType } from './types'; import { CollectorExporterNodeBase } from './CollectorExporterNodeBase'; -const DEFAULT_SERVICE_NAME = 'collector-metric-exporter'; -const DEFAULT_COLLECTOR_URL = 'localhost:4317'; - /** * Collector Metric Exporter for Node */ @@ -47,22 +43,15 @@ export class CollectorMetricExporter ); } - getDefaultUrl(config: CollectorExporterConfigNode): string { - if (!config.url) { - return DEFAULT_COLLECTOR_URL; - } - return config.url; - } - - getDefaultServiceName(config: CollectorExporterConfigNode): string { - return config.serviceName || DEFAULT_SERVICE_NAME; + getServiceProtoPath(): string { + return 'opentelemetry/proto/collector/metrics/v1/metrics_service.proto'; } - getServiceClientType() { - return ServiceClientType.METRICS; + getExporterType() { + return 'trace' as const; } - getServiceProtoPath(): string { - return 'opentelemetry/proto/collector/metrics/v1/metrics_service.proto'; + getProtocol() { + return 'grpc' as const; } } diff --git a/packages/opentelemetry-exporter-collector-grpc/src/CollectorTraceExporter.ts b/packages/opentelemetry-exporter-collector-grpc/src/CollectorTraceExporter.ts index da36d28c807..ff603149213 100644 --- a/packages/opentelemetry-exporter-collector-grpc/src/CollectorTraceExporter.ts +++ b/packages/opentelemetry-exporter-collector-grpc/src/CollectorTraceExporter.ts @@ -20,10 +20,6 @@ import { collectorTypes, toCollectorExportTraceServiceRequest, } from '@opentelemetry/exporter-collector'; -import { CollectorExporterConfigNode, ServiceClientType } from './types'; - -const DEFAULT_SERVICE_NAME = 'collector-trace-exporter'; -const DEFAULT_COLLECTOR_URL = 'localhost:4317'; /** * Collector Trace Exporter for Node @@ -40,22 +36,15 @@ export class CollectorTraceExporter return toCollectorExportTraceServiceRequest(spans, this); } - getDefaultUrl(config: CollectorExporterConfigNode): string { - if (!config.url) { - return DEFAULT_COLLECTOR_URL; - } - return config.url; - } - - getDefaultServiceName(config: CollectorExporterConfigNode): string { - return config.serviceName || DEFAULT_SERVICE_NAME; + getServiceProtoPath(): string { + return 'opentelemetry/proto/collector/trace/v1/trace_service.proto'; } - getServiceClientType() { - return ServiceClientType.SPANS; + getExporterType() { + return 'trace' as const; } - getServiceProtoPath(): string { - return 'opentelemetry/proto/collector/trace/v1/trace_service.proto'; + getProtocol() { + return 'grpc' as const; } } diff --git a/packages/opentelemetry-exporter-collector-grpc/src/types.ts b/packages/opentelemetry-exporter-collector-grpc/src/types.ts index aa8f98a0a4f..7cfec81738b 100644 --- a/packages/opentelemetry-exporter-collector-grpc/src/types.ts +++ b/packages/opentelemetry-exporter-collector-grpc/src/types.ts @@ -46,8 +46,3 @@ export interface CollectorExporterConfigNode credentials?: grpc.ChannelCredentials; metadata?: grpc.Metadata; } - -export enum ServiceClientType { - SPANS, - METRICS, -} diff --git a/packages/opentelemetry-exporter-collector-grpc/src/util.ts b/packages/opentelemetry-exporter-collector-grpc/src/util.ts index 7da27e95bc1..a91b858b050 100644 --- a/packages/opentelemetry-exporter-collector-grpc/src/util.ts +++ b/packages/opentelemetry-exporter-collector-grpc/src/util.ts @@ -20,11 +20,7 @@ import { collectorTypes } from '@opentelemetry/exporter-collector'; import * as grpc from 'grpc'; import * as path from 'path'; -import { - CollectorExporterConfigNode, - GRPCQueueItem, - ServiceClientType, -} from './types'; +import { CollectorExporterConfigNode, GRPCQueueItem } from './types'; import { CollectorExporterNodeBase } from './CollectorExporterNodeBase'; export function onInit( @@ -50,12 +46,12 @@ export function onInit( .then(packageDefinition => { const packageObject: any = grpc.loadPackageDefinition(packageDefinition); - if (collector.getServiceClientType() === ServiceClientType.SPANS) { + if (collector.getExporterType() === 'trace') { collector.serviceClient = new packageObject.opentelemetry.proto.collector.trace.v1.TraceService( serverAddress, credentials ); - } else { + } else if (collector.getExporterType() === 'metric') { collector.serviceClient = new packageObject.opentelemetry.proto.collector.metrics.v1.MetricsService( serverAddress, credentials diff --git a/packages/opentelemetry-exporter-collector-proto/src/CollectorExporterNodeBase.ts b/packages/opentelemetry-exporter-collector-proto/src/CollectorExporterNodeBase.ts index 3a8bc2dfa6f..1412da09e40 100644 --- a/packages/opentelemetry-exporter-collector-proto/src/CollectorExporterNodeBase.ts +++ b/packages/opentelemetry-exporter-collector-proto/src/CollectorExporterNodeBase.ts @@ -20,7 +20,6 @@ import { collectorTypes, CollectorExporterNodeConfigBase, } from '@opentelemetry/exporter-collector'; -import { ServiceClientType } from './types'; /** * Collector Metric Exporter abstract base class @@ -90,6 +89,4 @@ export abstract class CollectorExporterNodeBase< this._sendPromise(objects, onSuccess, onError); } } - - abstract getServiceClientType(): ServiceClientType; } diff --git a/packages/opentelemetry-exporter-collector-proto/src/CollectorMetricExporter.ts b/packages/opentelemetry-exporter-collector-proto/src/CollectorMetricExporter.ts index 43618f5c068..5ce12e8bfb5 100644 --- a/packages/opentelemetry-exporter-collector-proto/src/CollectorMetricExporter.ts +++ b/packages/opentelemetry-exporter-collector-proto/src/CollectorMetricExporter.ts @@ -17,15 +17,10 @@ import { collectorTypes, toCollectorExportMetricServiceRequest, - CollectorExporterNodeConfigBase, } from '@opentelemetry/exporter-collector'; import { MetricRecord, MetricExporter } from '@opentelemetry/metrics'; -import { ServiceClientType } from './types'; import { CollectorExporterNodeBase } from './CollectorExporterNodeBase'; -const DEFAULT_SERVICE_NAME = 'collector-metric-exporter'; -const DEFAULT_COLLECTOR_URL = 'http://localhost:55681/v1/metrics'; - /** * Collector Metric Exporter for Node with protobuf */ @@ -48,18 +43,11 @@ export class CollectorMetricExporter ); } - getDefaultUrl(config: CollectorExporterNodeConfigBase): string { - if (!config.url) { - return DEFAULT_COLLECTOR_URL; - } - return config.url; - } - - getDefaultServiceName(config: CollectorExporterNodeConfigBase): string { - return config.serviceName || DEFAULT_SERVICE_NAME; + public getExporterType() { + return 'metric' as const; } - getServiceClientType() { - return ServiceClientType.METRICS; + getProtocol() { + return 'http/protobuf' as const; } } diff --git a/packages/opentelemetry-exporter-collector-proto/src/CollectorTraceExporter.ts b/packages/opentelemetry-exporter-collector-proto/src/CollectorTraceExporter.ts index 49d29c5d60d..e8775360905 100644 --- a/packages/opentelemetry-exporter-collector-proto/src/CollectorTraceExporter.ts +++ b/packages/opentelemetry-exporter-collector-proto/src/CollectorTraceExporter.ts @@ -19,12 +19,7 @@ import { CollectorExporterNodeBase } from './CollectorExporterNodeBase'; import { collectorTypes, toCollectorExportTraceServiceRequest, - CollectorExporterNodeConfigBase, } from '@opentelemetry/exporter-collector'; -import { ServiceClientType } from './types'; - -const DEFAULT_SERVICE_NAME = 'collector-trace-exporter'; -const DEFAULT_COLLECTOR_URL = 'http://localhost:55681/v1/trace'; /** * Collector Trace Exporter for Node with protobuf @@ -41,18 +36,11 @@ export class CollectorTraceExporter return toCollectorExportTraceServiceRequest(spans, this); } - getDefaultUrl(config: CollectorExporterNodeConfigBase): string { - if (!config.url) { - return DEFAULT_COLLECTOR_URL; - } - return config.url; - } - - getDefaultServiceName(config: CollectorExporterNodeConfigBase): string { - return config.serviceName || DEFAULT_SERVICE_NAME; + public getExporterType() { + return 'trace' as const; } - getServiceClientType() { - return ServiceClientType.SPANS; + getProtocol() { + return 'http/protobuf' as const; } } diff --git a/packages/opentelemetry-exporter-collector-proto/src/types.ts b/packages/opentelemetry-exporter-collector-proto/src/types.ts deleted file mode 100644 index 389cfb1f522..00000000000 --- a/packages/opentelemetry-exporter-collector-proto/src/types.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* - * 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 enum ServiceClientType { - SPANS, - METRICS, -} diff --git a/packages/opentelemetry-exporter-collector-proto/src/util.ts b/packages/opentelemetry-exporter-collector-proto/src/util.ts index f944d91512b..3e2be64e007 100644 --- a/packages/opentelemetry-exporter-collector-proto/src/util.ts +++ b/packages/opentelemetry-exporter-collector-proto/src/util.ts @@ -21,7 +21,6 @@ import { } from '@opentelemetry/exporter-collector'; import * as path from 'path'; -import { ServiceClientType } from './types'; import { CollectorExporterNodeBase } from './CollectorExporterNodeBase'; import type { Type } from 'protobufjs'; import * as protobufjs from 'protobufjs'; @@ -41,7 +40,7 @@ export function onInit( root.resolvePath = function (origin, target) { return `${dir}/${target}`; }; - if (collector.getServiceClientType() === ServiceClientType.SPANS) { + if (collector.getExporterType() === 'trace') { const proto = root.loadSync([ 'opentelemetry/proto/common/v1/common.proto', 'opentelemetry/proto/resource/v1/resource.proto', @@ -49,7 +48,7 @@ export function onInit( 'opentelemetry/proto/collector/trace/v1/trace_service.proto', ]); ExportRequestProto = proto?.lookupType('ExportTraceServiceRequest'); - } else { + } else if (collector.getExporterType() === 'metric') { const proto = root.loadSync([ 'opentelemetry/proto/common/v1/common.proto', 'opentelemetry/proto/resource/v1/resource.proto', diff --git a/packages/opentelemetry-exporter-collector/src/CollectorExporterBase.ts b/packages/opentelemetry-exporter-collector/src/CollectorExporterBase.ts index c8a4d47637b..7ed343872ab 100644 --- a/packages/opentelemetry-exporter-collector/src/CollectorExporterBase.ts +++ b/packages/opentelemetry-exporter-collector/src/CollectorExporterBase.ts @@ -15,12 +15,18 @@ */ import { SpanAttributes, diag } from '@opentelemetry/api'; -import { ExportResult, ExportResultCode } from '@opentelemetry/core'; +import { + ExportResult, + ExportResultCode, + getEnv, + baggageUtils, +} from '@opentelemetry/core'; import { CollectorExporterError, CollectorExporterConfigBase, ExportServiceError, } from './types'; +import { parseHeaders } from './util'; /** * Collector Exporter abstract base class @@ -34,17 +40,22 @@ export abstract class CollectorExporterBase< public readonly url: string; public readonly hostname: string | undefined; public readonly attributes?: SpanAttributes; + public readonly headers: Record; protected _concurrencyLimit: number; protected _isShutdown: boolean = false; private _shuttingDownPromise: Promise = Promise.resolve(); protected _sendingPromises: Promise[] = []; + private _defaultEndpoint = 'localhost:4317'; + /** * @param config */ constructor(config: T = {} as T) { - this.serviceName = this.getDefaultServiceName(config); - this.url = this.getDefaultUrl(config); + this.serviceName = this._getDefaultServiceName(config); + this.url = this._getUrl(config); + this.headers = this._getHeaders(config); + if (typeof config.hostname === 'string') { this.hostname = config.hostname; } @@ -132,6 +143,98 @@ export abstract class CollectorExporterBase< return this._shuttingDownPromise; } + private _getUrl(config: T): string { + // if given, use url defined in config + if (typeof config.url !== 'undefined') { + return config.url; + } + const endpointFromEnv = getEnv().OTEL_EXPORTER_OTLP_ENDPOINT; + const defaultEndpoint = this.getProtocol().includes('http') + ? `http://${this._defaultEndpoint}/v1/${this.getExporterType()}s` + : this._defaultEndpoint; + console.log(this.getExporterType(), this.getProtocol(), defaultEndpoint) + switch (this.getExporterType()) { + case 'metric': { + const url = getEnv().OTEL_EXPORTER_OTLP_METRICS_ENDPOINT; + return url && url.length > 0 + ? url + : endpointFromEnv && endpointFromEnv.length > 0 + ? endpointFromEnv + : defaultEndpoint; + } + case 'trace': { + const url = getEnv().OTEL_EXPORTER_OTLP_TRACES_ENDPOINT; + return url && url.length > 0 + ? url + : endpointFromEnv && endpointFromEnv.length > 0 + ? endpointFromEnv + : defaultEndpoint; + } + default: { + return getEnv().OTEL_EXPORTER_OTLP_ENDPOINT; + } + } + } + + private _getDefaultServiceName(config: T): string { + // if given, use url defined in config + if (typeof config.serviceName !== 'undefined') { + return config.serviceName; + } + switch (this.getExporterType()) { + case 'metric': + return 'collector-metric-exporter'; + case 'trace': + return 'collector-trace-exporter'; + default: + return 'collector-exporter'; + } + } + + private _getHeaders(config: T): Record { + const configuredHeaders = parseHeaders(config.headers ?? {}); + switch (this.getExporterType()) { + case 'metric': { + return Object.assign( + configuredHeaders, + this._parseHeadersFromEnv(getEnv().OTEL_EXPORTER_OTLP_HEADERS), + this._parseHeadersFromEnv(getEnv().OTEL_EXPORTER_OTLP_METRICS_HEADERS) + ); + } + case 'trace': { + return Object.assign( + configuredHeaders, + this._parseHeadersFromEnv(getEnv().OTEL_EXPORTER_OTLP_HEADERS), + this._parseHeadersFromEnv(getEnv().OTEL_EXPORTER_OTLP_TRACES_HEADERS) + ); + } + default: { + return Object.assign( + configuredHeaders, + this._parseHeadersFromEnv(getEnv().OTEL_EXPORTER_OTLP_HEADERS) + ); + } + } + } + + /** + * Parse headers from environment variable in the baggage HTTP Format: + * https://github.com/w3c/baggage/blob/master/baggage/HTTP_HEADER_FORMAT.md + */ + private _parseHeadersFromEnv(envValue?: string) { + if (typeof envValue !== 'string' || envValue.length === 0) return {}; + return envValue + .split(baggageUtils.ITEMS_SEPARATOR) + .map(entry => { + return baggageUtils.parsePairKeyValue(entry); + }) + .filter(keyPair => keyPair !== undefined && keyPair.value.length > 0) + .reduce((headers, keyPair) => { + headers[keyPair!.key] = keyPair!.value; + return headers; + }, {} as Record); + } + abstract onShutdown(): void; abstract onInit(config: T): void; abstract send( @@ -139,7 +242,7 @@ export abstract class CollectorExporterBase< onSuccess: () => void, onError: (error: CollectorExporterError) => void ): void; - abstract getDefaultUrl(config: T): string; - abstract getDefaultServiceName(config: T): string; abstract convert(objects: ExportItem[]): ServiceRequest; + public abstract getExporterType(): 'trace' | 'metric'; + public abstract getProtocol(): 'http/json' | 'grpc' | 'http/protobuf'; } diff --git a/packages/opentelemetry-exporter-collector/src/platform/browser/CollectorExporterBrowserBase.ts b/packages/opentelemetry-exporter-collector/src/platform/browser/CollectorExporterBrowserBase.ts index 00a43641276..2e3ea1d7763 100644 --- a/packages/opentelemetry-exporter-collector/src/platform/browser/CollectorExporterBrowserBase.ts +++ b/packages/opentelemetry-exporter-collector/src/platform/browser/CollectorExporterBrowserBase.ts @@ -17,7 +17,6 @@ import { CollectorExporterBase } from '../../CollectorExporterBase'; import { CollectorExporterConfigBase } from '../../types'; import * as collectorTypes from '../../types'; -import { parseHeaders } from '../../util'; import { sendWithBeacon, sendWithXhr } from './util'; import { diag } from '@opentelemetry/api'; @@ -32,7 +31,6 @@ export abstract class CollectorExporterBrowserBase< ExportItem, ServiceRequest > { - private _headers: Record; private _useXHR: boolean = false; /** @@ -42,11 +40,6 @@ export abstract class CollectorExporterBrowserBase< super(config); this._useXHR = !!config.headers || typeof navigator.sendBeacon !== 'function'; - if (this._useXHR) { - this._headers = parseHeaders(config.headers); - } else { - this._headers = {}; - } } onInit(): void { @@ -85,7 +78,7 @@ export abstract class CollectorExporterBrowserBase< }; if (this._useXHR) { - sendWithXhr(body, this.url, this._headers, _onSuccess, _onError); + sendWithXhr(body, this.url, this.headers, _onSuccess, _onError); } else { sendWithBeacon(body, this.url, _onSuccess, _onError); } diff --git a/packages/opentelemetry-exporter-collector/src/platform/browser/CollectorMetricExporter.ts b/packages/opentelemetry-exporter-collector/src/platform/browser/CollectorMetricExporter.ts index 09224a90aa0..fc9abb3e18d 100644 --- a/packages/opentelemetry-exporter-collector/src/platform/browser/CollectorMetricExporter.ts +++ b/packages/opentelemetry-exporter-collector/src/platform/browser/CollectorMetricExporter.ts @@ -15,14 +15,10 @@ */ import { MetricRecord, MetricExporter } from '@opentelemetry/metrics'; -import { CollectorExporterConfigBase } from '../../types'; import * as collectorTypes from '../../types'; import { CollectorExporterBrowserBase } from './CollectorExporterBrowserBase'; import { toCollectorExportMetricServiceRequest } from '../../transformMetrics'; -const DEFAULT_COLLECTOR_URL = 'http://localhost:55681/v1/metrics'; -const DEFAULT_SERVICE_NAME = 'collector-metric-exporter'; - /** * Collector Metric Exporter for Web */ @@ -45,11 +41,11 @@ export class CollectorMetricExporter ); } - getDefaultUrl(config: CollectorExporterConfigBase): string { - return config.url || DEFAULT_COLLECTOR_URL; + getExporterType() { + return 'metric' as const; } - getDefaultServiceName(config: CollectorExporterConfigBase): string { - return config.serviceName || DEFAULT_SERVICE_NAME; + getProtocol() { + return 'http/json' as const; } } diff --git a/packages/opentelemetry-exporter-collector/src/platform/browser/CollectorTraceExporter.ts b/packages/opentelemetry-exporter-collector/src/platform/browser/CollectorTraceExporter.ts index e5826de390f..f38e68f34d2 100644 --- a/packages/opentelemetry-exporter-collector/src/platform/browser/CollectorTraceExporter.ts +++ b/packages/opentelemetry-exporter-collector/src/platform/browser/CollectorTraceExporter.ts @@ -14,15 +14,11 @@ * limitations under the License. */ -import { CollectorExporterConfigBase } from '../../types'; import { CollectorExporterBrowserBase } from './CollectorExporterBrowserBase'; import { ReadableSpan, SpanExporter } from '@opentelemetry/tracing'; import { toCollectorExportTraceServiceRequest } from '../../transform'; import * as collectorTypes from '../../types'; -const DEFAULT_SERVICE_NAME = 'collector-trace-exporter'; -const DEFAULT_COLLECTOR_URL = 'http://localhost:55681/v1/trace'; - /** * Collector Trace Exporter for Web */ @@ -38,11 +34,11 @@ export class CollectorTraceExporter return toCollectorExportTraceServiceRequest(spans, this, true); } - getDefaultUrl(config: CollectorExporterConfigBase) { - return config.url || DEFAULT_COLLECTOR_URL; + getExporterType() { + return 'trace' as const; } - getDefaultServiceName(config: CollectorExporterConfigBase): string { - return config.serviceName || DEFAULT_SERVICE_NAME; + getProtocol() { + return 'http/json' as const; } } diff --git a/packages/opentelemetry-exporter-collector/src/platform/node/CollectorExporterNodeBase.ts b/packages/opentelemetry-exporter-collector/src/platform/node/CollectorExporterNodeBase.ts index a57e362d0d7..7207b5951d8 100644 --- a/packages/opentelemetry-exporter-collector/src/platform/node/CollectorExporterNodeBase.ts +++ b/packages/opentelemetry-exporter-collector/src/platform/node/CollectorExporterNodeBase.ts @@ -20,7 +20,6 @@ import type * as https from 'https'; import { CollectorExporterBase } from '../../CollectorExporterBase'; import { CollectorExporterNodeConfigBase } from './types'; import * as collectorTypes from '../../types'; -import { parseHeaders } from '../../util'; import { createHttpAgent, sendWithHttp } from './util'; import { diag } from '@opentelemetry/api'; @@ -35,15 +34,12 @@ export abstract class CollectorExporterNodeBase< ExportItem, ServiceRequest > { - DEFAULT_HEADERS: Record = {}; - headers: Record; agent: http.Agent | https.Agent | undefined; constructor(config: CollectorExporterNodeConfigBase = {}) { super(config); if ((config as any).metadata) { diag.warn('Metadata cannot be set when using http'); } - this.headers = parseHeaders(config.headers) || this.DEFAULT_HEADERS; this.agent = createHttpAgent(config); } diff --git a/packages/opentelemetry-exporter-collector/src/platform/node/CollectorMetricExporter.ts b/packages/opentelemetry-exporter-collector/src/platform/node/CollectorMetricExporter.ts index 30c70e9e07a..fe7a608256b 100644 --- a/packages/opentelemetry-exporter-collector/src/platform/node/CollectorMetricExporter.ts +++ b/packages/opentelemetry-exporter-collector/src/platform/node/CollectorMetricExporter.ts @@ -16,13 +16,9 @@ import { MetricRecord, MetricExporter } from '@opentelemetry/metrics'; import * as collectorTypes from '../../types'; -import { CollectorExporterNodeConfigBase } from './types'; import { CollectorExporterNodeBase } from './CollectorExporterNodeBase'; import { toCollectorExportMetricServiceRequest } from '../../transformMetrics'; -const DEFAULT_SERVICE_NAME = 'collector-metric-exporter'; -const DEFAULT_COLLECTOR_URL = 'http://localhost:55681/v1/metrics'; - /** * Collector Metric Exporter for Node */ @@ -45,14 +41,11 @@ export class CollectorMetricExporter ); } - getDefaultUrl(config: CollectorExporterNodeConfigBase): string { - if (!config.url) { - return DEFAULT_COLLECTOR_URL; - } - return config.url; + getExporterType() { + return 'metric' as const; } - getDefaultServiceName(config: CollectorExporterNodeConfigBase): string { - return config.serviceName || DEFAULT_SERVICE_NAME; + getProtocol() { + return 'http/json' as const; } } diff --git a/packages/opentelemetry-exporter-collector/src/platform/node/CollectorTraceExporter.ts b/packages/opentelemetry-exporter-collector/src/platform/node/CollectorTraceExporter.ts index 4d6e4c03ffa..526fbe6c509 100644 --- a/packages/opentelemetry-exporter-collector/src/platform/node/CollectorTraceExporter.ts +++ b/packages/opentelemetry-exporter-collector/src/platform/node/CollectorTraceExporter.ts @@ -16,13 +16,9 @@ import { ReadableSpan, SpanExporter } from '@opentelemetry/tracing'; import { CollectorExporterNodeBase } from './CollectorExporterNodeBase'; -import { CollectorExporterNodeConfigBase } from './types'; import * as collectorTypes from '../../types'; import { toCollectorExportTraceServiceRequest } from '../../transform'; -const DEFAULT_SERVICE_NAME = 'collector-trace-exporter'; -const DEFAULT_COLLECTOR_URL = 'http://localhost:55681/v1/trace'; - /** * Collector Trace Exporter for Node */ @@ -32,20 +28,19 @@ export class CollectorTraceExporter collectorTypes.opentelemetryProto.collector.trace.v1.ExportTraceServiceRequest > implements SpanExporter { + protected _signal = 'trace' as const; + convert( spans: ReadableSpan[] ): collectorTypes.opentelemetryProto.collector.trace.v1.ExportTraceServiceRequest { return toCollectorExportTraceServiceRequest(spans, this, true); } - getDefaultUrl(config: CollectorExporterNodeConfigBase): string { - if (!config.url) { - return DEFAULT_COLLECTOR_URL; - } - return config.url; + getExporterType() { + return 'trace' as const; } - getDefaultServiceName(config: CollectorExporterNodeConfigBase): string { - return config.serviceName || DEFAULT_SERVICE_NAME; + getProtocol() { + return 'http/json' as const; } } diff --git a/packages/opentelemetry-exporter-collector/src/types.ts b/packages/opentelemetry-exporter-collector/src/types.ts index f0b02825f3f..bace3f24a3f 100644 --- a/packages/opentelemetry-exporter-collector/src/types.ts +++ b/packages/opentelemetry-exporter-collector/src/types.ts @@ -341,7 +341,7 @@ export interface ExportServiceError { * Collector Exporter base config */ export interface CollectorExporterConfigBase { - headers?: Partial>; + headers?: Record; hostname?: string; serviceName?: string; attributes?: SpanAttributes; diff --git a/packages/opentelemetry-exporter-collector/test/browser/CollectorTraceExporter.test.ts b/packages/opentelemetry-exporter-collector/test/browser/CollectorTraceExporter.test.ts index 2c02f751cb8..df3d3cc8aeb 100644 --- a/packages/opentelemetry-exporter-collector/test/browser/CollectorTraceExporter.test.ts +++ b/packages/opentelemetry-exporter-collector/test/browser/CollectorTraceExporter.test.ts @@ -294,7 +294,7 @@ describe('CollectorTraceExporter - browser (getDefaultUrl)', () => { setTimeout(() => { assert.strictEqual( collectorExporter['url'], - 'http://localhost:55681/v1/trace' + 'http://localhost:4317/v1/traces' ); done(); }); diff --git a/packages/opentelemetry-exporter-collector/test/common/CollectorMetricExporter.test.ts b/packages/opentelemetry-exporter-collector/test/common/CollectorMetricExporter.test.ts index c455c0d1ad0..02de14875ea 100644 --- a/packages/opentelemetry-exporter-collector/test/common/CollectorMetricExporter.test.ts +++ b/packages/opentelemetry-exporter-collector/test/common/CollectorMetricExporter.test.ts @@ -38,17 +38,17 @@ class CollectorMetricExporter extends CollectorExporterBase< onInit() {} onShutdown() {} send() {} - getDefaultUrl(config: CollectorExporterConfig) { - return config.url || ''; - } - getDefaultServiceName(config: CollectorExporterConfig): string { - return config.serviceName || 'collector-metric-exporter'; - } convert( metrics: MetricRecord[] ): collectorTypes.opentelemetryProto.collector.metrics.v1.ExportMetricsServiceRequest { return { resourceMetrics: [] }; } + getExporterType() { + return 'metric' as const; + } + getProtocol() { + return 'http/json' as const; + } } describe('CollectorMetricExporter - common', () => { @@ -121,6 +121,46 @@ describe('CollectorMetricExporter - common', () => { ); }); }); + + describe('when configuring via environment', () => { + const envSource = (typeof window !== 'undefined' + ? window + : process.env) as any; + it('should use url defined in env', () => { + envSource.OTEL_EXPORTER_OTLP_ENDPOINT = 'http://foo.bar'; + const collectorExporter = new CollectorMetricExporter(); + assert.strictEqual( + collectorExporter.url, + envSource.OTEL_EXPORTER_OTLP_ENDPOINT + ); + envSource.OTEL_EXPORTER_OTLP_ENDPOINT = ''; + }); + it('should override global exporter url with signal url defined in env', () => { + envSource.OTEL_EXPORTER_OTLP_ENDPOINT = 'http://foo.bar'; + envSource.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT = 'http://foo.metrics'; + const collectorExporter = new CollectorMetricExporter(); + assert.strictEqual( + collectorExporter.url, + envSource.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT + ); + envSource.OTEL_EXPORTER_OTLP_ENDPOINT = ''; + envSource.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT = ''; + }); + it('should use headers defined via env', () => { + envSource.OTEL_EXPORTER_OTLP_HEADERS = 'foo=bar'; + const collectorExporter = new CollectorMetricExporter(); + assert.strictEqual(collectorExporter.headers.foo, 'bar'); + envSource.OTEL_EXPORTER_OTLP_HEADERS = ''; + }); + it('should override global headers config with signal headers defined via env', () => { + envSource.OTEL_EXPORTER_OTLP_HEADERS = 'foo=bar,bar=foo'; + envSource.OTEL_EXPORTER_OTLP_METRICS_HEADERS = 'foo=boo'; + const collectorExporter = new CollectorMetricExporter(); + assert.strictEqual(collectorExporter.headers.foo, 'boo'); + assert.strictEqual(collectorExporter.headers.bar, 'foo'); + envSource.OTEL_EXPORTER_OTLP_METRICS_HEADERS = ''; + }); + }); }); describe('export', () => { diff --git a/packages/opentelemetry-exporter-collector/test/common/CollectorTraceExporter.test.ts b/packages/opentelemetry-exporter-collector/test/common/CollectorTraceExporter.test.ts index d104fd26c1b..24cfafa7eb1 100644 --- a/packages/opentelemetry-exporter-collector/test/common/CollectorTraceExporter.test.ts +++ b/packages/opentelemetry-exporter-collector/test/common/CollectorTraceExporter.test.ts @@ -43,18 +43,18 @@ class CollectorTraceExporter extends CollectorExporterBase< ) ); } - getDefaultUrl(config: CollectorExporterConfig): string { - return config.url || ''; - } - getDefaultServiceName(config: CollectorExporterConfig): string { - return config.serviceName || 'collector-exporter'; - } convert( spans: ReadableSpan[] ): collectorTypes.opentelemetryProto.collector.trace.v1.ExportTraceServiceRequest { return { resourceSpans: [] }; } + getExporterType() { + return 'trace' as const; + } + getProtocol() { + return 'http/json' as const; + } } describe('CollectorTraceExporter - common', () => { @@ -107,7 +107,50 @@ describe('CollectorTraceExporter - common', () => { }); it('should set default serviceName', () => { - assert.strictEqual(collectorExporter.serviceName, 'collector-exporter'); + assert.strictEqual( + collectorExporter.serviceName, + 'collector-trace-exporter' + ); + }); + }); + + describe('when configuring via environment', () => { + const envSource = (typeof window !== 'undefined' + ? window + : process.env) as any; + it('should use url defined in env', () => { + envSource.OTEL_EXPORTER_OTLP_ENDPOINT = 'http://foo.bar'; + const collectorExporter = new CollectorTraceExporter(); + assert.strictEqual( + collectorExporter.url, + envSource.OTEL_EXPORTER_OTLP_ENDPOINT + ); + envSource.OTEL_EXPORTER_OTLP_ENDPOINT = ''; + }); + it('should override global exporter url with signal url defined in env', () => { + envSource.OTEL_EXPORTER_OTLP_ENDPOINT = 'http://foo.bar'; + envSource.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT = 'http://foo.traces'; + const collectorExporter = new CollectorTraceExporter(); + assert.strictEqual( + collectorExporter.url, + envSource.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT + ); + envSource.OTEL_EXPORTER_OTLP_ENDPOINT = ''; + envSource.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT = ''; + }); + it('should use headers defined via env', () => { + envSource.OTEL_EXPORTER_OTLP_HEADERS = 'foo=bar'; + const collectorExporter = new CollectorTraceExporter(); + assert.strictEqual(collectorExporter.headers.foo, 'bar'); + envSource.OTEL_EXPORTER_OTLP_HEADERS = ''; + }); + it('should override global headers config with signal headers defined via env', () => { + envSource.OTEL_EXPORTER_OTLP_HEADERS = 'foo=bar,bar=foo'; + envSource.OTEL_EXPORTER_OTLP_TRACES_HEADERS = 'foo=boo'; + const collectorExporter = new CollectorTraceExporter(); + assert.strictEqual(collectorExporter.headers.foo, 'boo'); + assert.strictEqual(collectorExporter.headers.bar, 'foo'); + envSource.OTEL_EXPORTER_OTLP_TRACES_HEADERS = ''; }); }); }); diff --git a/packages/opentelemetry-exporter-collector/test/node/CollectorMetricExporter.test.ts b/packages/opentelemetry-exporter-collector/test/node/CollectorMetricExporter.test.ts index 765b603077d..411ad87ac62 100644 --- a/packages/opentelemetry-exporter-collector/test/node/CollectorMetricExporter.test.ts +++ b/packages/opentelemetry-exporter-collector/test/node/CollectorMetricExporter.test.ts @@ -254,7 +254,7 @@ describe('CollectorMetricExporter - node with json over http', () => { setTimeout(() => { assert.strictEqual( collectorExporter['url'], - 'http://localhost:55681/v1/metrics' + 'http://localhost:4317/v1/metrics' ); done(); }); diff --git a/packages/opentelemetry-exporter-collector/test/node/CollectorTraceExporter.test.ts b/packages/opentelemetry-exporter-collector/test/node/CollectorTraceExporter.test.ts index 129e8b9ba6d..1c598f369fb 100644 --- a/packages/opentelemetry-exporter-collector/test/node/CollectorTraceExporter.test.ts +++ b/packages/opentelemetry-exporter-collector/test/node/CollectorTraceExporter.test.ts @@ -210,7 +210,7 @@ describe('CollectorTraceExporter - node with json over http', () => { setTimeout(() => { assert.strictEqual( collectorExporter['url'], - 'http://localhost:55681/v1/trace' + 'http://localhost:4317/v1/traces' ); done(); });