From 47f6b48ff0f726c785eeb1ec1f033be8a9d64fab Mon Sep 17 00:00:00 2001 From: Mayur Kale Date: Thu, 5 Mar 2020 10:50:34 -0800 Subject: [PATCH 1/8] export resource to exporters --- .../package.json | 1 + .../src/transform.ts | 6 ++++++ .../test/transform.test.ts | 19 ++++++++++++++++--- .../opentelemetry-resources/src/Resource.ts | 6 ++++++ packages/opentelemetry-tracing/src/Span.ts | 2 +- 5 files changed, 30 insertions(+), 4 deletions(-) diff --git a/packages/opentelemetry-exporter-collector/package.json b/packages/opentelemetry-exporter-collector/package.json index 9ca0d23062..ef88ecfee1 100644 --- a/packages/opentelemetry-exporter-collector/package.json +++ b/packages/opentelemetry-exporter-collector/package.json @@ -49,6 +49,7 @@ "access": "public" }, "devDependencies": { + "@opentelemetry/resources": "^0.4.0", "@babel/core": "^7.6.0", "@opentelemetry/resources": "^0.4.0", "@types/mocha": "^5.2.5", diff --git a/packages/opentelemetry-exporter-jaeger/src/transform.ts b/packages/opentelemetry-exporter-jaeger/src/transform.ts index 04279deb35..668576ce6e 100644 --- a/packages/opentelemetry-exporter-jaeger/src/transform.ts +++ b/packages/opentelemetry-exporter-jaeger/src/transform.ts @@ -64,6 +64,12 @@ export function spanToThrift(span: ReadableSpan): ThriftSpan { if (span.kind !== undefined) { tags.push({ key: 'span.kind', value: SpanKind[span.kind] }); } + Object.keys(span.resource.labels).forEach(name => + tags.push({ + key: name, + value: toTagValue(span.resource.labels[name]), + }) + ); const spanTags: ThriftTag[] = ThriftUtils.getThriftTags(tags); diff --git a/packages/opentelemetry-exporter-jaeger/test/transform.test.ts b/packages/opentelemetry-exporter-jaeger/test/transform.test.ts index bc58b031aa..26f795e416 100644 --- a/packages/opentelemetry-exporter-jaeger/test/transform.test.ts +++ b/packages/opentelemetry-exporter-jaeger/test/transform.test.ts @@ -70,7 +70,11 @@ describe('transform', () => { }, ], duration: [32, 800000000], - resource: Resource.empty(), + resource: new Resource({ + service: 'ui', + version: 1, + cost: 112.12, + }), }; const thriftSpan = spanToThrift(readableSpan); @@ -95,8 +99,8 @@ describe('transform', () => { thriftSpan.startTime, Utils.encodeInt64(hrTimeToMicroseconds(readableSpan.startTime)) ); - assert.strictEqual(thriftSpan.tags.length, 6); - const [tag1, tag2, tag3, tag4, tag5, tag6] = thriftSpan.tags; + assert.strictEqual(thriftSpan.tags.length, 9); + const [tag1, tag2, tag3, tag4, tag5, tag6, tag7, tag8, tag9] = thriftSpan.tags; assert.strictEqual(tag1.key, 'testBool'); assert.strictEqual(tag1.vType, 'BOOL'); assert.strictEqual(tag1.vBool, true); @@ -115,6 +119,15 @@ describe('transform', () => { assert.strictEqual(tag6.key, 'span.kind'); assert.strictEqual(tag6.vType, 'STRING'); assert.strictEqual(tag6.vStr, 'INTERNAL'); + assert.strictEqual(tag7.key, 'service'); + assert.strictEqual(tag7.vType, 'STRING'); + assert.strictEqual(tag7.vStr, 'ui'); + assert.strictEqual(tag8.key, 'version'); + assert.strictEqual(tag8.vType, 'DOUBLE'); + assert.strictEqual(tag8.vDouble, 1); + assert.strictEqual(tag9.key, 'cost'); + assert.strictEqual(tag9.vType, 'DOUBLE'); + assert.strictEqual(tag9.vDouble, 112.12); assert.strictEqual(thriftSpan.references.length, 0); assert.strictEqual(thriftSpan.logs.length, 1); diff --git a/packages/opentelemetry-resources/src/Resource.ts b/packages/opentelemetry-resources/src/Resource.ts index 471e7a943a..89522abffb 100644 --- a/packages/opentelemetry-resources/src/Resource.ts +++ b/packages/opentelemetry-resources/src/Resource.ts @@ -66,4 +66,10 @@ export class Resource { const mergedLabels = Object.assign({}, other.labels, this.labels); return new Resource(mergedLabels); } + + static empty(): Resource { + return EMPTY_RESOURCE; + } } + +const EMPTY_RESOURCE = new Resource({}); diff --git a/packages/opentelemetry-tracing/src/Span.ts b/packages/opentelemetry-tracing/src/Span.ts index 4028564a4d..4227441685 100644 --- a/packages/opentelemetry-tracing/src/Span.ts +++ b/packages/opentelemetry-tracing/src/Span.ts @@ -21,11 +21,11 @@ import { isTimeInput, timeInputToHrTime, } from '@opentelemetry/core'; -import { Resource } from '@opentelemetry/resources'; import { ReadableSpan } from './export/ReadableSpan'; import { Tracer } from './Tracer'; import { SpanProcessor } from './SpanProcessor'; import { TraceParams } from './types'; +import { Resource } from "@opentelemetry/resources"; /** * This class represents a span. From 43cb2170a40e923f19736089e62ada08a153ae6b Mon Sep 17 00:00:00 2001 From: Mayur Kale Date: Thu, 5 Mar 2020 15:26:24 -0800 Subject: [PATCH 2/8] update Zipkin and Stackdriver exporter to use Resource --- .../package.json | 1 + .../test/transform.test.ts | 12 +++++++++- .../package.json | 1 + .../src/transform.ts | 24 ++++++++++++++----- .../test/exporter.test.ts | 6 ++++- .../test/transform.test.ts | 11 +++++++-- .../package.json | 1 + .../src/transform.ts | 14 ++++++++--- .../test/transform.test.ts | 20 +++++++++++++--- .../test/zipkin.test.ts | 6 ++++- packages/opentelemetry-tracing/src/Span.ts | 2 +- 11 files changed, 80 insertions(+), 18 deletions(-) diff --git a/packages/opentelemetry-exporter-collector/package.json b/packages/opentelemetry-exporter-collector/package.json index ef88ecfee1..11566a378e 100644 --- a/packages/opentelemetry-exporter-collector/package.json +++ b/packages/opentelemetry-exporter-collector/package.json @@ -84,6 +84,7 @@ "@opentelemetry/api": "^0.4.0", "@opentelemetry/base": "^0.4.0", "@opentelemetry/core": "^0.4.0", + "@opentelemetry/resources": "^0.4.0", "@opentelemetry/tracing": "^0.4.0" } } diff --git a/packages/opentelemetry-exporter-jaeger/test/transform.test.ts b/packages/opentelemetry-exporter-jaeger/test/transform.test.ts index 26f795e416..c79fb6d1b6 100644 --- a/packages/opentelemetry-exporter-jaeger/test/transform.test.ts +++ b/packages/opentelemetry-exporter-jaeger/test/transform.test.ts @@ -100,7 +100,17 @@ describe('transform', () => { Utils.encodeInt64(hrTimeToMicroseconds(readableSpan.startTime)) ); assert.strictEqual(thriftSpan.tags.length, 9); - const [tag1, tag2, tag3, tag4, tag5, tag6, tag7, tag8, tag9] = thriftSpan.tags; + const [ + tag1, + tag2, + tag3, + tag4, + tag5, + tag6, + tag7, + tag8, + tag9, + ] = thriftSpan.tags; assert.strictEqual(tag1.key, 'testBool'); assert.strictEqual(tag1.vType, 'BOOL'); assert.strictEqual(tag1.vBool, true); diff --git a/packages/opentelemetry-exporter-stackdriver-trace/package.json b/packages/opentelemetry-exporter-stackdriver-trace/package.json index f1de5af310..8e21271323 100644 --- a/packages/opentelemetry-exporter-stackdriver-trace/package.json +++ b/packages/opentelemetry-exporter-stackdriver-trace/package.json @@ -63,6 +63,7 @@ "@opentelemetry/api": "^0.4.0", "@opentelemetry/base": "^0.4.0", "@opentelemetry/core": "^0.4.0", + "@opentelemetry/resources": "^0.4.0", "@opentelemetry/tracing": "^0.4.0", "google-auth-library": "^5.7.0", "googleapis": "^46.0.0" diff --git a/packages/opentelemetry-exporter-stackdriver-trace/src/transform.ts b/packages/opentelemetry-exporter-stackdriver-trace/src/transform.ts index d694f9e216..b99e34f607 100644 --- a/packages/opentelemetry-exporter-stackdriver-trace/src/transform.ts +++ b/packages/opentelemetry-exporter-stackdriver-trace/src/transform.ts @@ -30,6 +30,7 @@ import { TruncatableString, } from './types'; import { VERSION } from './version'; +import { Resource } from '@opentelemetry/resources'; const AGENT_LABEL_KEY = 'g.co/agent'; const AGENT_LABEL_VALUE = `opentelemetry-js [${CORE_VERSION}]; stackdriver-trace-exporter [${VERSION}]`; @@ -38,10 +39,14 @@ export function getReadableSpanTransformer( projectId: string ): (span: ReadableSpan) => Span { return span => { - const attributes = transformAttributes(span.attributes, { - project_id: projectId, - [AGENT_LABEL_KEY]: AGENT_LABEL_VALUE, - }); + const attributes = transformAttributes( + span.attributes, + { + project_id: projectId, + [AGENT_LABEL_KEY]: AGENT_LABEL_VALUE, + }, + span.resource + ); const out: Span = { attributes, @@ -85,9 +90,16 @@ function transformLink(link: ot.Link): Link { function transformAttributes( requestAttributes: ot.Attributes = {}, - serviceAttributes: ot.Attributes = {} + serviceAttributes: ot.Attributes = {}, + resource: Resource = Resource.empty() ): Attributes { - const attributes = Object.assign({}, requestAttributes, serviceAttributes); + const attributes = Object.assign( + {}, + requestAttributes, + serviceAttributes, + resource.labels + ); + const attributeMap = transformAttributeValues(attributes); return { attributeMap: attributeMap, diff --git a/packages/opentelemetry-exporter-stackdriver-trace/test/exporter.test.ts b/packages/opentelemetry-exporter-stackdriver-trace/test/exporter.test.ts index 6d4321f52b..6ad382e226 100644 --- a/packages/opentelemetry-exporter-stackdriver-trace/test/exporter.test.ts +++ b/packages/opentelemetry-exporter-stackdriver-trace/test/exporter.test.ts @@ -122,7 +122,11 @@ describe('Stackdriver Trace Exporter', () => { isRemote: true, }, status: { code: types.CanonicalCode.OK }, - resource: Resource.empty(), + resource: new Resource({ + service: 'ui', + version: 1, + cost: 112.12, + }), }; const result = await new Promise((resolve, reject) => { diff --git a/packages/opentelemetry-exporter-stackdriver-trace/test/transform.test.ts b/packages/opentelemetry-exporter-stackdriver-trace/test/transform.test.ts index 32f7de8312..a1d257b89c 100644 --- a/packages/opentelemetry-exporter-stackdriver-trace/test/transform.test.ts +++ b/packages/opentelemetry-exporter-stackdriver-trace/test/transform.test.ts @@ -51,7 +51,11 @@ describe('transform', () => { name: 'my-span', spanContext, status: { code: types.CanonicalCode.OK }, - resource: Resource.empty(), + resource: new Resource({ + service: 'ui', + version: 1, + cost: 112.12, + }), }; }); @@ -67,6 +71,9 @@ describe('transform', () => { value: `opentelemetry-js [${CORE_VERSION}]; stackdriver-trace-exporter [${VERSION}]`, }, }, + cost: { intValue: '112' }, + service: { stringValue: { value: 'ui' } }, + version: { intValue: '1' }, }, droppedAttributesCount: 0, }, @@ -130,7 +137,7 @@ describe('transform', () => { assert.deepStrictEqual(result.attributes!.droppedAttributesCount, 1); assert.deepStrictEqual( Object.keys(result.attributes!.attributeMap!).length, - 2 + 5 ); }); diff --git a/packages/opentelemetry-exporter-zipkin/package.json b/packages/opentelemetry-exporter-zipkin/package.json index 44788807a6..7407f14b72 100644 --- a/packages/opentelemetry-exporter-zipkin/package.json +++ b/packages/opentelemetry-exporter-zipkin/package.json @@ -59,6 +59,7 @@ "@opentelemetry/api": "^0.4.0", "@opentelemetry/base": "^0.4.0", "@opentelemetry/core": "^0.4.0", + "@opentelemetry/resources": "^0.4.0", "@opentelemetry/tracing": "^0.4.0" } } diff --git a/packages/opentelemetry-exporter-zipkin/src/transform.ts b/packages/opentelemetry-exporter-zipkin/src/transform.ts index cbf0908526..b52e152f7a 100644 --- a/packages/opentelemetry-exporter-zipkin/src/transform.ts +++ b/packages/opentelemetry-exporter-zipkin/src/transform.ts @@ -18,6 +18,7 @@ import * as types from '@opentelemetry/api'; import { ReadableSpan } from '@opentelemetry/tracing'; import { hrTimeToMicroseconds } from '@opentelemetry/core'; import * as zipkinTypes from './types'; +import { Resource } from '@opentelemetry/resources'; const ZIPKIN_SPAN_KIND_MAPPING = { [types.SpanKind.CLIENT]: zipkinTypes.SpanKind.CLIENT, @@ -54,7 +55,8 @@ export function toZipkinSpan( span.attributes, span.status, statusCodeTagName, - statusDescriptionTagName + statusDescriptionTagName, + span.resource ), annotations: span.events.length ? _toZipkinAnnotations(span.events) @@ -69,9 +71,10 @@ export function _toZipkinTags( attributes: types.Attributes, status: types.Status, statusCodeTagName: string, - statusDescriptionTagName: string + statusDescriptionTagName: string, + resource: Resource ): zipkinTypes.Tags { - const tags: { [key: string]: string } = {}; + const tags: { [key: string]: unknown } = {}; for (const key of Object.keys(attributes)) { tags[key] = String(attributes[key]); } @@ -79,6 +82,11 @@ export function _toZipkinTags( if (status.message) { tags[statusDescriptionTagName] = status.message; } + + Object.keys(resource.labels).forEach( + name => (tags[name] = resource.labels[name]) + ); + return tags; } diff --git a/packages/opentelemetry-exporter-zipkin/test/transform.test.ts b/packages/opentelemetry-exporter-zipkin/test/transform.test.ts index f32512003f..9d51333bb6 100644 --- a/packages/opentelemetry-exporter-zipkin/test/transform.test.ts +++ b/packages/opentelemetry-exporter-zipkin/test/transform.test.ts @@ -30,6 +30,7 @@ import { statusDescriptionTagName, } from '../src/transform'; import * as zipkinTypes from '../src/types'; +import { Resource } from '@opentelemetry/resources'; const logger = new NoopLogger(); const tracer = new BasicTracerProvider({ @@ -42,6 +43,13 @@ const spanContext: types.SpanContext = { traceFlags: types.TraceFlags.SAMPLED, }; +const DUMMY_RESOUCE = new Resource({ + service: 'ui', + version: 1, + cost: 112.12, +}); +const EMPTY_RESOUCE = Resource.empty(); + describe('transform', () => { describe('toZipkinSpan', () => { it('should convert an OpenTelemetry span to a Zipkin span', () => { @@ -184,13 +192,17 @@ describe('transform', () => { span.attributes, span.status, statusCodeTagName, - statusDescriptionTagName + statusDescriptionTagName, + DUMMY_RESOUCE ); assert.deepStrictEqual(tags, { key1: 'value1', key2: 'value2', [statusCodeTagName]: 'OK', + cost: 112.12, + service: 'ui', + version: 1, }); }); it('should map OpenTelemetry Status.code to a Zipkin tag', () => { @@ -213,7 +225,8 @@ describe('transform', () => { span.attributes, span.status, statusCodeTagName, - statusDescriptionTagName + statusDescriptionTagName, + EMPTY_RESOUCE ); assert.deepStrictEqual(tags, { @@ -243,7 +256,8 @@ describe('transform', () => { span.attributes, span.status, statusCodeTagName, - statusDescriptionTagName + statusDescriptionTagName, + Resource.empty() ); assert.deepStrictEqual(tags, { diff --git a/packages/opentelemetry-exporter-zipkin/test/zipkin.test.ts b/packages/opentelemetry-exporter-zipkin/test/zipkin.test.ts index bd0105e553..14f516dd14 100644 --- a/packages/opentelemetry-exporter-zipkin/test/zipkin.test.ts +++ b/packages/opentelemetry-exporter-zipkin/test/zipkin.test.ts @@ -49,7 +49,11 @@ function getReadableSpan() { attributes: {}, links: [], events: [], - resource: Resource.empty(), + resource: new Resource({ + service: 'ui', + version: 1, + cost: 112.12, + }), }; return readableSpan; } diff --git a/packages/opentelemetry-tracing/src/Span.ts b/packages/opentelemetry-tracing/src/Span.ts index 4227441685..44afabe534 100644 --- a/packages/opentelemetry-tracing/src/Span.ts +++ b/packages/opentelemetry-tracing/src/Span.ts @@ -25,7 +25,7 @@ import { ReadableSpan } from './export/ReadableSpan'; import { Tracer } from './Tracer'; import { SpanProcessor } from './SpanProcessor'; import { TraceParams } from './types'; -import { Resource } from "@opentelemetry/resources"; +import { Resource } from '@opentelemetry/resources'; /** * This class represents a span. From c9bba15e895bd0e6df48d4d91f72a59f955ad08d Mon Sep 17 00:00:00 2001 From: Mayur Kale Date: Thu, 5 Mar 2020 15:29:06 -0800 Subject: [PATCH 3/8] chore: remove redundant dependency --- packages/opentelemetry-exporter-collector/package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/opentelemetry-exporter-collector/package.json b/packages/opentelemetry-exporter-collector/package.json index 11566a378e..ef88ecfee1 100644 --- a/packages/opentelemetry-exporter-collector/package.json +++ b/packages/opentelemetry-exporter-collector/package.json @@ -84,7 +84,6 @@ "@opentelemetry/api": "^0.4.0", "@opentelemetry/base": "^0.4.0", "@opentelemetry/core": "^0.4.0", - "@opentelemetry/resources": "^0.4.0", "@opentelemetry/tracing": "^0.4.0" } } From 8237a93c878835acca3e658c229f40815e176606 Mon Sep 17 00:00:00 2001 From: Mayur Kale Date: Thu, 5 Mar 2020 16:07:16 -0800 Subject: [PATCH 4/8] update Collector exporter to use Resource --- packages/opentelemetry-exporter-collector/package.json | 2 +- .../src/CollectorExporter.ts | 5 ++++- .../src/platform/browser/sendSpans.ts | 7 +++++-- .../src/platform/node/sendSpans.ts | 7 +++++-- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/packages/opentelemetry-exporter-collector/package.json b/packages/opentelemetry-exporter-collector/package.json index ef88ecfee1..594e0f4bbd 100644 --- a/packages/opentelemetry-exporter-collector/package.json +++ b/packages/opentelemetry-exporter-collector/package.json @@ -49,7 +49,6 @@ "access": "public" }, "devDependencies": { - "@opentelemetry/resources": "^0.4.0", "@babel/core": "^7.6.0", "@opentelemetry/resources": "^0.4.0", "@types/mocha": "^5.2.5", @@ -84,6 +83,7 @@ "@opentelemetry/api": "^0.4.0", "@opentelemetry/base": "^0.4.0", "@opentelemetry/core": "^0.4.0", + "@opentelemetry/resources": "^0.4.0", "@opentelemetry/tracing": "^0.4.0" } } diff --git a/packages/opentelemetry-exporter-collector/src/CollectorExporter.ts b/packages/opentelemetry-exporter-collector/src/CollectorExporter.ts index 82aee23399..4e2c71504f 100644 --- a/packages/opentelemetry-exporter-collector/src/CollectorExporter.ts +++ b/packages/opentelemetry-exporter-collector/src/CollectorExporter.ts @@ -21,6 +21,7 @@ import { Attributes, Logger } from '@opentelemetry/api'; import * as collectorTypes from './types'; import { toCollectorSpan } from './transform'; import { onInit, onShutdown, sendSpans } from './platform/index'; +import { Resource } from '@opentelemetry/resources'; /** * Collector Exporter Config @@ -100,10 +101,12 @@ export class CollectorExporter implements SpanExporter { toCollectorSpan(span) ); this.logger.debug('spans to be sent', spansToBeSent); + const resource = + spansToBeSent.length > 0 ? spans[0].resource : Resource.empty(); // Send spans to [opentelemetry collector]{@link https://github.com/open-telemetry/opentelemetry-collector} // it will use the appropriate transport layer automatically depends on platform - sendSpans(spansToBeSent, resolve, reject, this); + sendSpans(spansToBeSent, resolve, reject, this, resource); } catch (e) { reject(e); } diff --git a/packages/opentelemetry-exporter-collector/src/platform/browser/sendSpans.ts b/packages/opentelemetry-exporter-collector/src/platform/browser/sendSpans.ts index ca8b1f9203..e3836266cf 100644 --- a/packages/opentelemetry-exporter-collector/src/platform/browser/sendSpans.ts +++ b/packages/opentelemetry-exporter-collector/src/platform/browser/sendSpans.ts @@ -19,6 +19,7 @@ import { Logger } from '@opentelemetry/api'; import { CollectorExporter } from '../../CollectorExporter'; import * as collectorTypes from '../../types'; import { VERSION } from '../../version'; +import { Resource } from '@opentelemetry/resources'; /** * function that is called once when {@link ExporterCollector} is initialised @@ -43,12 +44,14 @@ export function onShutdown(shutdownF: EventListener) { * @param onSuccess * @param onError * @param collectorExporter + * @param resource */ export function sendSpans( spans: collectorTypes.Span[], onSuccess: () => void, onError: (status?: number) => void, - collectorExporter: CollectorExporter + collectorExporter: CollectorExporter, + resource: Resource ) { const exportTraceServiceRequest: collectorTypes.ExportTraceServiceRequest = { node: { @@ -66,7 +69,7 @@ export function sendSpans( }, attributes: collectorExporter.attributes, }, - // resource: '', not implemented + resource: resource.labels, spans, }; diff --git a/packages/opentelemetry-exporter-collector/src/platform/node/sendSpans.ts b/packages/opentelemetry-exporter-collector/src/platform/node/sendSpans.ts index aaf23d2820..363bcc5ce6 100644 --- a/packages/opentelemetry-exporter-collector/src/platform/node/sendSpans.ts +++ b/packages/opentelemetry-exporter-collector/src/platform/node/sendSpans.ts @@ -25,6 +25,7 @@ import * as collectorTypes from '../../types'; import * as url from 'url'; import { VERSION } from '../../version'; +import { Resource } from '@opentelemetry/resources'; /** * function that is called once when {@link ExporterCollector} is initialised @@ -47,12 +48,14 @@ export function onShutdown(shutdownF: Function) {} * @param onSuccess * @param onError * @param collectorExporter + * @param resource */ export function sendSpans( spans: collectorTypes.Span[], onSuccess: () => void, onError: (status?: number) => void, - collectorExporter: CollectorExporter + collectorExporter: CollectorExporter, + resource: Resource ) { const exportTraceServiceRequest: collectorTypes.ExportTraceServiceRequest = { node: { @@ -70,7 +73,7 @@ export function sendSpans( }, attributes: collectorExporter.attributes, }, - // resource: '', not implemented + resource: resource.labels, spans, }; const body = JSON.stringify(exportTraceServiceRequest); From ecdac34fb49d2871a7ece32ecd304cbe1647e04a Mon Sep 17 00:00:00 2001 From: Mayur Kale Date: Wed, 11 Mar 2020 14:12:32 -0700 Subject: [PATCH 5/8] rebase with #846 --- .../opentelemetry-exporter-collector/package.json | 1 - .../package.json | 1 - packages/opentelemetry-exporter-zipkin/package.json | 1 - .../test/transform.test.ts | 13 +++++++++++-- packages/opentelemetry-resources/src/Resource.ts | 6 ------ 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/opentelemetry-exporter-collector/package.json b/packages/opentelemetry-exporter-collector/package.json index 594e0f4bbd..9e11325b52 100644 --- a/packages/opentelemetry-exporter-collector/package.json +++ b/packages/opentelemetry-exporter-collector/package.json @@ -50,7 +50,6 @@ }, "devDependencies": { "@babel/core": "^7.6.0", - "@opentelemetry/resources": "^0.4.0", "@types/mocha": "^5.2.5", "@types/node": "^12.6.8", "@types/sinon": "^7.0.13", diff --git a/packages/opentelemetry-exporter-stackdriver-trace/package.json b/packages/opentelemetry-exporter-stackdriver-trace/package.json index 8e21271323..088bb8580c 100644 --- a/packages/opentelemetry-exporter-stackdriver-trace/package.json +++ b/packages/opentelemetry-exporter-stackdriver-trace/package.json @@ -41,7 +41,6 @@ "access": "public" }, "devDependencies": { - "@opentelemetry/resources": "^0.4.0", "@types/mocha": "^5.2.7", "@types/nock": "^11.1.0", "@types/node": "^12.6.9", diff --git a/packages/opentelemetry-exporter-zipkin/package.json b/packages/opentelemetry-exporter-zipkin/package.json index 7407f14b72..3b5db3ba0b 100644 --- a/packages/opentelemetry-exporter-zipkin/package.json +++ b/packages/opentelemetry-exporter-zipkin/package.json @@ -39,7 +39,6 @@ "access": "public" }, "devDependencies": { - "@opentelemetry/resources": "^0.4.0", "@types/mocha": "^5.2.7", "@types/nock": "^10.0.3", "@types/node": "^12.6.9", diff --git a/packages/opentelemetry-exporter-zipkin/test/transform.test.ts b/packages/opentelemetry-exporter-zipkin/test/transform.test.ts index 9d51333bb6..6f5854d2e6 100644 --- a/packages/opentelemetry-exporter-zipkin/test/transform.test.ts +++ b/packages/opentelemetry-exporter-zipkin/test/transform.test.ts @@ -21,6 +21,7 @@ import { NoopLogger, hrTimeToMicroseconds, hrTimeDuration, + VERSION, } from '@opentelemetry/core'; import { toZipkinSpan, @@ -48,7 +49,6 @@ const DUMMY_RESOUCE = new Resource({ version: 1, cost: 112.12, }); -const EMPTY_RESOUCE = Resource.empty(); describe('transform', () => { describe('toZipkinSpan', () => { @@ -94,6 +94,9 @@ describe('transform', () => { key1: 'value1', key2: 'value2', [statusCodeTagName]: 'OK', + 'telemetry.sdk.language': 'nodejs', + 'telemetry.sdk.name': 'opentelemetry', + 'telemetry.sdk.version': VERSION, }, timestamp: hrTimeToMicroseconds(span.startTime), traceId: span.spanContext.traceId, @@ -128,6 +131,9 @@ describe('transform', () => { parentId: undefined, tags: { [statusCodeTagName]: 'OK', + 'telemetry.sdk.language': 'nodejs', + 'telemetry.sdk.name': 'opentelemetry', + 'telemetry.sdk.version': VERSION, }, timestamp: hrTimeToMicroseconds(span.startTime), traceId: span.spanContext.traceId, @@ -167,6 +173,9 @@ describe('transform', () => { parentId: undefined, tags: { [statusCodeTagName]: 'OK', + 'telemetry.sdk.language': 'nodejs', + 'telemetry.sdk.name': 'opentelemetry', + 'telemetry.sdk.version': VERSION, }, timestamp: hrTimeToMicroseconds(span.startTime), traceId: span.spanContext.traceId, @@ -226,7 +235,7 @@ describe('transform', () => { span.status, statusCodeTagName, statusDescriptionTagName, - EMPTY_RESOUCE + Resource.empty() ); assert.deepStrictEqual(tags, { diff --git a/packages/opentelemetry-resources/src/Resource.ts b/packages/opentelemetry-resources/src/Resource.ts index 89522abffb..471e7a943a 100644 --- a/packages/opentelemetry-resources/src/Resource.ts +++ b/packages/opentelemetry-resources/src/Resource.ts @@ -66,10 +66,4 @@ export class Resource { const mergedLabels = Object.assign({}, other.labels, this.labels); return new Resource(mergedLabels); } - - static empty(): Resource { - return EMPTY_RESOURCE; - } } - -const EMPTY_RESOURCE = new Resource({}); From 2c500365cd2bad8093a056c94b1032b9d4add51d Mon Sep 17 00:00:00 2001 From: Mayur Kale Date: Wed, 11 Mar 2020 14:22:49 -0700 Subject: [PATCH 6/8] minor --- .../test/exporter.test.ts | 6 +----- packages/opentelemetry-exporter-zipkin/test/zipkin.test.ts | 6 +----- packages/opentelemetry-tracing/src/Span.ts | 2 +- 3 files changed, 3 insertions(+), 11 deletions(-) diff --git a/packages/opentelemetry-exporter-stackdriver-trace/test/exporter.test.ts b/packages/opentelemetry-exporter-stackdriver-trace/test/exporter.test.ts index 6ad382e226..6d4321f52b 100644 --- a/packages/opentelemetry-exporter-stackdriver-trace/test/exporter.test.ts +++ b/packages/opentelemetry-exporter-stackdriver-trace/test/exporter.test.ts @@ -122,11 +122,7 @@ describe('Stackdriver Trace Exporter', () => { isRemote: true, }, status: { code: types.CanonicalCode.OK }, - resource: new Resource({ - service: 'ui', - version: 1, - cost: 112.12, - }), + resource: Resource.empty(), }; const result = await new Promise((resolve, reject) => { diff --git a/packages/opentelemetry-exporter-zipkin/test/zipkin.test.ts b/packages/opentelemetry-exporter-zipkin/test/zipkin.test.ts index 14f516dd14..bd0105e553 100644 --- a/packages/opentelemetry-exporter-zipkin/test/zipkin.test.ts +++ b/packages/opentelemetry-exporter-zipkin/test/zipkin.test.ts @@ -49,11 +49,7 @@ function getReadableSpan() { attributes: {}, links: [], events: [], - resource: new Resource({ - service: 'ui', - version: 1, - cost: 112.12, - }), + resource: Resource.empty(), }; return readableSpan; } diff --git a/packages/opentelemetry-tracing/src/Span.ts b/packages/opentelemetry-tracing/src/Span.ts index 44afabe534..4028564a4d 100644 --- a/packages/opentelemetry-tracing/src/Span.ts +++ b/packages/opentelemetry-tracing/src/Span.ts @@ -21,11 +21,11 @@ import { isTimeInput, timeInputToHrTime, } from '@opentelemetry/core'; +import { Resource } from '@opentelemetry/resources'; import { ReadableSpan } from './export/ReadableSpan'; import { Tracer } from './Tracer'; import { SpanProcessor } from './SpanProcessor'; import { TraceParams } from './types'; -import { Resource } from '@opentelemetry/resources'; /** * This class represents a span. From b7c7dc08e4ea97ca632bff757abe6a5522ba1c15 Mon Sep 17 00:00:00 2001 From: Mayur Kale Date: Thu, 12 Mar 2020 14:46:28 -0700 Subject: [PATCH 7/8] fix collector resource --- .../src/CollectorExporter.ts | 7 +-- .../src/platform/browser/sendSpans.ts | 5 +- .../src/platform/node/sendSpans.ts | 50 ++++++++++++------- .../src/transform.ts | 16 ++++++ .../test/common/transform.test.ts | 20 ++++++++ .../test/helper.ts | 6 ++- 6 files changed, 78 insertions(+), 26 deletions(-) diff --git a/packages/opentelemetry-exporter-collector/src/CollectorExporter.ts b/packages/opentelemetry-exporter-collector/src/CollectorExporter.ts index 4e2c71504f..2bbc989cc8 100644 --- a/packages/opentelemetry-exporter-collector/src/CollectorExporter.ts +++ b/packages/opentelemetry-exporter-collector/src/CollectorExporter.ts @@ -19,7 +19,7 @@ import { NoopLogger } from '@opentelemetry/core'; import { ReadableSpan, SpanExporter } from '@opentelemetry/tracing'; import { Attributes, Logger } from '@opentelemetry/api'; import * as collectorTypes from './types'; -import { toCollectorSpan } from './transform'; +import { toCollectorSpan, toCollectorResource } from './transform'; import { onInit, onShutdown, sendSpans } from './platform/index'; import { Resource } from '@opentelemetry/resources'; @@ -101,8 +101,9 @@ export class CollectorExporter implements SpanExporter { toCollectorSpan(span) ); this.logger.debug('spans to be sent', spansToBeSent); - const resource = - spansToBeSent.length > 0 ? spans[0].resource : Resource.empty(); + const resource = toCollectorResource( + spansToBeSent.length > 0 ? spans[0].resource : Resource.empty() + ); // Send spans to [opentelemetry collector]{@link https://github.com/open-telemetry/opentelemetry-collector} // it will use the appropriate transport layer automatically depends on platform diff --git a/packages/opentelemetry-exporter-collector/src/platform/browser/sendSpans.ts b/packages/opentelemetry-exporter-collector/src/platform/browser/sendSpans.ts index e3836266cf..a41faa3bf6 100644 --- a/packages/opentelemetry-exporter-collector/src/platform/browser/sendSpans.ts +++ b/packages/opentelemetry-exporter-collector/src/platform/browser/sendSpans.ts @@ -19,7 +19,6 @@ import { Logger } from '@opentelemetry/api'; import { CollectorExporter } from '../../CollectorExporter'; import * as collectorTypes from '../../types'; import { VERSION } from '../../version'; -import { Resource } from '@opentelemetry/resources'; /** * function that is called once when {@link ExporterCollector} is initialised @@ -51,7 +50,7 @@ export function sendSpans( onSuccess: () => void, onError: (status?: number) => void, collectorExporter: CollectorExporter, - resource: Resource + resource: collectorTypes.Resource ) { const exportTraceServiceRequest: collectorTypes.ExportTraceServiceRequest = { node: { @@ -69,7 +68,7 @@ export function sendSpans( }, attributes: collectorExporter.attributes, }, - resource: resource.labels, + resource, spans, }; diff --git a/packages/opentelemetry-exporter-collector/src/platform/node/sendSpans.ts b/packages/opentelemetry-exporter-collector/src/platform/node/sendSpans.ts index 363bcc5ce6..197e2425d3 100644 --- a/packages/opentelemetry-exporter-collector/src/platform/node/sendSpans.ts +++ b/packages/opentelemetry-exporter-collector/src/platform/node/sendSpans.ts @@ -55,27 +55,13 @@ export function sendSpans( onSuccess: () => void, onError: (status?: number) => void, collectorExporter: CollectorExporter, - resource: Resource + resource: collectorTypes.Resource ) { - const exportTraceServiceRequest: collectorTypes.ExportTraceServiceRequest = { - node: { - identifier: { - hostName: collectorExporter.hostName, - startTimestamp: core.hrTimeToTimeStamp(core.hrTime()), - }, - libraryInfo: { - language: collectorTypes.LibraryInfoLanguage.NODE_JS, - coreLibraryVersion: core.VERSION, - exporterVersion: VERSION, - }, - serviceInfo: { - name: collectorExporter.serviceName, - }, - attributes: collectorExporter.attributes, - }, - resource: resource.labels, + const exportTraceServiceRequest = toCollectorTraceServiceRequest( spans, - }; + collectorExporter, + resource + ); const body = JSON.stringify(exportTraceServiceRequest); const parsedUrl = url.parse(collectorExporter.url); @@ -108,3 +94,29 @@ export function sendSpans( req.write(body); req.end(); } + +export function toCollectorTraceServiceRequest( + spans: collectorTypes.Span[], + collectorExporter: CollectorExporter, + resource: collectorTypes.Resource +): collectorTypes.ExportTraceServiceRequest { + return { + node: { + identifier: { + hostName: collectorExporter.hostName, + startTimestamp: core.hrTimeToTimeStamp(core.hrTime()), + }, + libraryInfo: { + language: collectorTypes.LibraryInfoLanguage.NODE_JS, + coreLibraryVersion: core.VERSION, + exporterVersion: VERSION, + }, + serviceInfo: { + name: collectorExporter.serviceName, + }, + attributes: collectorExporter.attributes, + }, + resource, + spans, + }; +} diff --git a/packages/opentelemetry-exporter-collector/src/transform.ts b/packages/opentelemetry-exporter-collector/src/transform.ts index a1299ec8b9..84fb97f3d9 100644 --- a/packages/opentelemetry-exporter-collector/src/transform.ts +++ b/packages/opentelemetry-exporter-collector/src/transform.ts @@ -18,6 +18,7 @@ import { hexToBase64, hrTimeToTimeStamp } from '@opentelemetry/core'; import { ReadableSpan } from '@opentelemetry/tracing'; import { Attributes, Link, TimedEvent, TraceState } from '@opentelemetry/api'; import * as collectorTypes from './types'; +import { Resource } from '@opentelemetry/resources'; const OT_MAX_STRING_LENGTH = 128; @@ -201,6 +202,21 @@ export function toCollectorSpan(span: ReadableSpan): collectorTypes.Span { }; } +/** + * converts span resource + * @param resource + */ +export function toCollectorResource( + resource: Resource +): collectorTypes.Resource { + const labels: { [key: string]: string } = {}; + Object.keys(resource.labels).forEach( + name => (labels[name] = String(resource.labels[name])) + ); + // @TODO: add type support + return { labels }; +} + /** * @param traceState */ diff --git a/packages/opentelemetry-exporter-collector/test/common/transform.test.ts b/packages/opentelemetry-exporter-collector/test/common/transform.test.ts index 4eb4213eac..544c7a136f 100644 --- a/packages/opentelemetry-exporter-collector/test/common/transform.test.ts +++ b/packages/opentelemetry-exporter-collector/test/common/transform.test.ts @@ -18,6 +18,7 @@ import { Attributes, TimedEvent } from '@opentelemetry/api'; import * as assert from 'assert'; import * as transform from '../../src/transform'; import { ensureSpanIsCorrect, mockedReadableSpan } from '../helper'; +import { Resource } from '@opentelemetry/resources'; describe('transform', () => { describe('toCollectorTruncatableString', () => { @@ -149,4 +150,23 @@ describe('transform', () => { ensureSpanIsCorrect(transform.toCollectorSpan(mockedReadableSpan)); }); }); + + describe('toCollectorResource', () => { + it('should convert resource', () => { + const resource = transform.toCollectorResource( + new Resource({ + service: 'ui', + version: 1.0, + success: true, + }) + ); + assert.deepStrictEqual(resource, { + labels: { + service: 'ui', + version: '1', + success: 'true', + }, + }); + }); + }); }); diff --git a/packages/opentelemetry-exporter-collector/test/helper.ts b/packages/opentelemetry-exporter-collector/test/helper.ts index 750f32599b..043865b86a 100644 --- a/packages/opentelemetry-exporter-collector/test/helper.ts +++ b/packages/opentelemetry-exporter-collector/test/helper.ts @@ -69,7 +69,11 @@ export const mockedReadableSpan: ReadableSpan = { }, ], duration: [0, 8885000], - resource: Resource.empty(), + resource: new Resource({ + service: 'ui', + version: 1, + cost: 112.12, + }), }; export function ensureSpanIsCorrect(span: collectorTypes.Span) { From 912a5a385c28065fbe0ac761738cd27f19d059ba Mon Sep 17 00:00:00 2001 From: Mayur Kale Date: Thu, 12 Mar 2020 14:52:12 -0700 Subject: [PATCH 8/8] fix build --- .../src/platform/node/sendSpans.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/opentelemetry-exporter-collector/src/platform/node/sendSpans.ts b/packages/opentelemetry-exporter-collector/src/platform/node/sendSpans.ts index 197e2425d3..18faf59bce 100644 --- a/packages/opentelemetry-exporter-collector/src/platform/node/sendSpans.ts +++ b/packages/opentelemetry-exporter-collector/src/platform/node/sendSpans.ts @@ -25,7 +25,6 @@ import * as collectorTypes from '../../types'; import * as url from 'url'; import { VERSION } from '../../version'; -import { Resource } from '@opentelemetry/resources'; /** * function that is called once when {@link ExporterCollector} is initialised