From 3852bd02b23b70544d3eee059996ecb34c57fedf Mon Sep 17 00:00:00 2001 From: John Bley Date: Tue, 30 Jun 2020 10:06:01 -0400 Subject: [PATCH 1/7] feat(opentelemetry-web): capture transferSize from PerformanceResourceTiming --- .../opentelemetry-web/src/enums/PerformanceTimingNames.ts | 1 + packages/opentelemetry-web/src/types.ts | 1 + packages/opentelemetry-web/src/utils.ts | 3 +++ packages/opentelemetry-web/test/utils.test.ts | 4 ++++ 4 files changed, 9 insertions(+) diff --git a/packages/opentelemetry-web/src/enums/PerformanceTimingNames.ts b/packages/opentelemetry-web/src/enums/PerformanceTimingNames.ts index 846a9ba967..979b832d9a 100644 --- a/packages/opentelemetry-web/src/enums/PerformanceTimingNames.ts +++ b/packages/opentelemetry-web/src/enums/PerformanceTimingNames.ts @@ -32,6 +32,7 @@ export enum PerformanceTimingNames { RESPONSE_END = 'responseEnd', RESPONSE_START = 'responseStart', SECURE_CONNECTION_START = 'secureConnectionStart', + TRANSFER_SIZE = 'transferSize', UNLOAD_EVENT_END = 'unloadEventEnd', UNLOAD_EVENT_START = 'unloadEventStart', } diff --git a/packages/opentelemetry-web/src/types.ts b/packages/opentelemetry-web/src/types.ts index 10ee04f14e..0e11312c1e 100644 --- a/packages/opentelemetry-web/src/types.ts +++ b/packages/opentelemetry-web/src/types.ts @@ -33,6 +33,7 @@ export type PerformanceEntries = { [PerformanceTimingNames.RESPONSE_END]?: number; [PerformanceTimingNames.RESPONSE_START]?: number; [PerformanceTimingNames.SECURE_CONNECTION_START]?: number; + [PerformanceTimingNames.TRANSFER_SIZE]?: number; [PerformanceTimingNames.UNLOAD_EVENT_END]?: number; [PerformanceTimingNames.UNLOAD_EVENT_START]?: number; }; diff --git a/packages/opentelemetry-web/src/utils.ts b/packages/opentelemetry-web/src/utils.ts index aa3dd320b6..55f2606a23 100644 --- a/packages/opentelemetry-web/src/utils.ts +++ b/packages/opentelemetry-web/src/utils.ts @@ -81,6 +81,9 @@ export function addSpanNetworkEvents( addSpanNetworkEvent(span, PTN.REQUEST_START, resource); addSpanNetworkEvent(span, PTN.RESPONSE_START, resource); addSpanNetworkEvent(span, PTN.RESPONSE_END, resource); + if (resource.transferSize) { + span.setAttribute('transferSize', resource.transferSize); + } } /** diff --git a/packages/opentelemetry-web/test/utils.test.ts b/packages/opentelemetry-web/test/utils.test.ts index 805986de71..c9ea982247 100644 --- a/packages/opentelemetry-web/test/utils.test.ts +++ b/packages/opentelemetry-web/test/utils.test.ts @@ -137,8 +137,10 @@ describe('utils', () => { describe('addSpanNetworkEvents', () => { it('should add all network events to span', () => { const addEventSpy = sinon.spy(); + const setAttributeSpy = sinon.spy(); const span = ({ addEvent: addEventSpy, + setAttribute: setAttributeSpy, } as unknown) as tracing.Span; const entries = { [PTN.FETCH_START]: 123, @@ -150,6 +152,7 @@ describe('utils', () => { [PTN.REQUEST_START]: 123, [PTN.RESPONSE_START]: 123, [PTN.RESPONSE_END]: 123, + [PTN.TRANSFER_SIZE]: 123, } as PerformanceEntries; assert.strictEqual(addEventSpy.callCount, 0); @@ -157,6 +160,7 @@ describe('utils', () => { addSpanNetworkEvents(span, entries); assert.strictEqual(addEventSpy.callCount, 9); + assert.strictEqual(setAttributeSpy.callCount, 1); }); }); describe('addSpanNetworkEvent', () => { From 45c6543134e935604c54c2e3f1b0a525867466d4 Mon Sep 17 00:00:00 2001 From: John Bley Date: Tue, 30 Jun 2020 10:39:30 -0400 Subject: [PATCH 2/7] chore: adjust xhr and fetch tests for transfersize --- .../src/enums/AttributeNames.ts | 1 + .../test/fetch.test.ts | 6 +++++- .../test/xhr.test.ts | 16 ++++++++++------ 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/packages/opentelemetry-plugin-fetch/src/enums/AttributeNames.ts b/packages/opentelemetry-plugin-fetch/src/enums/AttributeNames.ts index 452a1111dd..3748f616ea 100644 --- a/packages/opentelemetry-plugin-fetch/src/enums/AttributeNames.ts +++ b/packages/opentelemetry-plugin-fetch/src/enums/AttributeNames.ts @@ -28,4 +28,5 @@ export enum AttributeNames { HTTP_URL = 'http.url', HTTP_TARGET = 'http.target', HTTP_USER_AGENT = 'http.user_agent', + TRANSFER_SIZE = 'transferSize', } diff --git a/packages/opentelemetry-plugin-fetch/test/fetch.test.ts b/packages/opentelemetry-plugin-fetch/test/fetch.test.ts index cf27f84f40..7a7be9c03e 100644 --- a/packages/opentelemetry-plugin-fetch/test/fetch.test.ts +++ b/packages/opentelemetry-plugin-fetch/test/fetch.test.ts @@ -300,8 +300,12 @@ describe('fetch', () => { attributes[keys[7]] !== '', `attributes ${AttributeNames.HTTP_USER_AGENT} is not defined` ); + assert.ok( + (attributes[keys[8]] as Number) > 0, + `attributes ${AttributeNames.TRANSFER_SIZE} is <= 0` + ); - assert.strictEqual(keys.length, 8, 'number of attributes is wrong'); + assert.strictEqual(keys.length, 9, 'number of attributes is wrong'); }); it('span should have correct events', () => { diff --git a/packages/opentelemetry-plugin-xml-http-request/test/xhr.test.ts b/packages/opentelemetry-plugin-xml-http-request/test/xhr.test.ts index 7887339acb..6feb2c9529 100644 --- a/packages/opentelemetry-plugin-xml-http-request/test/xhr.test.ts +++ b/packages/opentelemetry-plugin-xml-http-request/test/xhr.test.ts @@ -290,31 +290,35 @@ describe('xhr', () => { url, `attributes ${HttpAttribute.HTTP_URL} is wrong` ); + assert.ok( + (attributes[keys[2]] as Number) > 0, + `attributes transferSize <= 0` + ); assert.strictEqual( - attributes[keys[2]], + attributes[keys[3]], 200, `attributes ${HttpAttribute.HTTP_STATUS_CODE} is wrong` ); assert.strictEqual( - attributes[keys[3]], + attributes[keys[4]], 'OK', `attributes ${HttpAttribute.HTTP_STATUS_TEXT} is wrong` ); assert.strictEqual( - attributes[keys[4]], + attributes[keys[5]], parseUrl(url).host, `attributes ${HttpAttribute.HTTP_HOST} is wrong` ); assert.ok( - attributes[keys[5]] === 'http' || attributes[keys[5]] === 'https', + attributes[keys[6]] === 'http' || attributes[keys[6]] === 'https', `attributes ${HttpAttribute.HTTP_SCHEME} is wrong` ); assert.ok( - attributes[keys[6]] !== '', + attributes[keys[7]] !== '', `attributes ${HttpAttribute.HTTP_USER_AGENT} is not defined` ); - assert.strictEqual(keys.length, 7, 'number of attributes is wrong'); + assert.strictEqual(keys.length, 8, 'number of attributes is wrong'); }); it('span should have correct events', () => { From c9548ccda03594d1c3795902da58fefcffe37b97 Mon Sep 17 00:00:00 2001 From: John Bley Date: Tue, 30 Jun 2020 10:45:29 -0400 Subject: [PATCH 3/7] chore: lint:fix --- packages/opentelemetry-plugin-fetch/test/fetch.test.ts | 2 +- .../opentelemetry-plugin-xml-http-request/test/xhr.test.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/opentelemetry-plugin-fetch/test/fetch.test.ts b/packages/opentelemetry-plugin-fetch/test/fetch.test.ts index 7a7be9c03e..d6e296b916 100644 --- a/packages/opentelemetry-plugin-fetch/test/fetch.test.ts +++ b/packages/opentelemetry-plugin-fetch/test/fetch.test.ts @@ -301,7 +301,7 @@ describe('fetch', () => { `attributes ${AttributeNames.HTTP_USER_AGENT} is not defined` ); assert.ok( - (attributes[keys[8]] as Number) > 0, + (attributes[keys[8]] as number) > 0, `attributes ${AttributeNames.TRANSFER_SIZE} is <= 0` ); diff --git a/packages/opentelemetry-plugin-xml-http-request/test/xhr.test.ts b/packages/opentelemetry-plugin-xml-http-request/test/xhr.test.ts index 6feb2c9529..0354343e08 100644 --- a/packages/opentelemetry-plugin-xml-http-request/test/xhr.test.ts +++ b/packages/opentelemetry-plugin-xml-http-request/test/xhr.test.ts @@ -291,8 +291,8 @@ describe('xhr', () => { `attributes ${HttpAttribute.HTTP_URL} is wrong` ); assert.ok( - (attributes[keys[2]] as Number) > 0, - `attributes transferSize <= 0` + (attributes[keys[2]] as number) > 0, + 'attributes transferSize <= 0' ); assert.strictEqual( attributes[keys[3]], From 7509de9945c91d6beee987daf59163135fc796a5 Mon Sep 17 00:00:00 2001 From: John Bley Date: Wed, 1 Jul 2020 21:20:39 -0400 Subject: [PATCH 4/7] chore: use decodedBodySize -> http.response_content_length instead of transferSize --- .../opentelemetry-plugin-fetch/src/enums/AttributeNames.ts | 2 +- packages/opentelemetry-plugin-fetch/test/fetch.test.ts | 2 +- .../opentelemetry-plugin-xml-http-request/test/xhr.test.ts | 2 +- packages/opentelemetry-semantic-conventions/src/trace/http.ts | 1 + .../opentelemetry-web/src/enums/PerformanceTimingNames.ts | 2 +- packages/opentelemetry-web/src/types.ts | 2 +- packages/opentelemetry-web/src/utils.ts | 4 ++-- packages/opentelemetry-web/test/utils.test.ts | 2 +- 8 files changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/opentelemetry-plugin-fetch/src/enums/AttributeNames.ts b/packages/opentelemetry-plugin-fetch/src/enums/AttributeNames.ts index 3748f616ea..f216cee8be 100644 --- a/packages/opentelemetry-plugin-fetch/src/enums/AttributeNames.ts +++ b/packages/opentelemetry-plugin-fetch/src/enums/AttributeNames.ts @@ -28,5 +28,5 @@ export enum AttributeNames { HTTP_URL = 'http.url', HTTP_TARGET = 'http.target', HTTP_USER_AGENT = 'http.user_agent', - TRANSFER_SIZE = 'transferSize', + HTTP_RESPONSE_CONTENT_LENGTH = 'http.response_content_length', } diff --git a/packages/opentelemetry-plugin-fetch/test/fetch.test.ts b/packages/opentelemetry-plugin-fetch/test/fetch.test.ts index d6e296b916..0ce12cb82d 100644 --- a/packages/opentelemetry-plugin-fetch/test/fetch.test.ts +++ b/packages/opentelemetry-plugin-fetch/test/fetch.test.ts @@ -302,7 +302,7 @@ describe('fetch', () => { ); assert.ok( (attributes[keys[8]] as number) > 0, - `attributes ${AttributeNames.TRANSFER_SIZE} is <= 0` + `attributes ${AttributeNames.HTTP_RESPONSE_CONTENT_LENGTH} is <= 0` ); assert.strictEqual(keys.length, 9, 'number of attributes is wrong'); diff --git a/packages/opentelemetry-plugin-xml-http-request/test/xhr.test.ts b/packages/opentelemetry-plugin-xml-http-request/test/xhr.test.ts index 0354343e08..4491cb0fb9 100644 --- a/packages/opentelemetry-plugin-xml-http-request/test/xhr.test.ts +++ b/packages/opentelemetry-plugin-xml-http-request/test/xhr.test.ts @@ -292,7 +292,7 @@ describe('xhr', () => { ); assert.ok( (attributes[keys[2]] as number) > 0, - 'attributes transferSize <= 0' + 'attributes ${HttpAttributes.HTTP_RESPONSE_CONTENT_SIZE} <= 0' ); assert.strictEqual( attributes[keys[3]], diff --git a/packages/opentelemetry-semantic-conventions/src/trace/http.ts b/packages/opentelemetry-semantic-conventions/src/trace/http.ts index d194db6a41..d54166c545 100644 --- a/packages/opentelemetry-semantic-conventions/src/trace/http.ts +++ b/packages/opentelemetry-semantic-conventions/src/trace/http.ts @@ -25,6 +25,7 @@ export const HttpAttribute = { HTTP_SERVER_NAME: 'http.server_name', HTTP_CLIENT_IP: 'http.client_ip', HTTP_SCHEME: 'http.scheme', + HTTP_RESPONSE_CONTENT_LENGTH: 'http.response_content_length', // NOT ON OFFICIAL SPEC HTTP_ERROR_NAME: 'http.error_name', diff --git a/packages/opentelemetry-web/src/enums/PerformanceTimingNames.ts b/packages/opentelemetry-web/src/enums/PerformanceTimingNames.ts index 979b832d9a..cbcfc4fe36 100644 --- a/packages/opentelemetry-web/src/enums/PerformanceTimingNames.ts +++ b/packages/opentelemetry-web/src/enums/PerformanceTimingNames.ts @@ -23,6 +23,7 @@ export enum PerformanceTimingNames { DOM_INTERACTIVE = 'domInteractive', DOMAIN_LOOKUP_END = 'domainLookupEnd', DOMAIN_LOOKUP_START = 'domainLookupStart', + ENCODED_BODY_SIZE = 'encodedBodySize', FETCH_START = 'fetchStart', LOAD_EVENT_END = 'loadEventEnd', LOAD_EVENT_START = 'loadEventStart', @@ -32,7 +33,6 @@ export enum PerformanceTimingNames { RESPONSE_END = 'responseEnd', RESPONSE_START = 'responseStart', SECURE_CONNECTION_START = 'secureConnectionStart', - TRANSFER_SIZE = 'transferSize', UNLOAD_EVENT_END = 'unloadEventEnd', UNLOAD_EVENT_START = 'unloadEventStart', } diff --git a/packages/opentelemetry-web/src/types.ts b/packages/opentelemetry-web/src/types.ts index 0e11312c1e..923ec0e13c 100644 --- a/packages/opentelemetry-web/src/types.ts +++ b/packages/opentelemetry-web/src/types.ts @@ -24,6 +24,7 @@ export type PerformanceEntries = { [PerformanceTimingNames.DOM_INTERACTIVE]?: number; [PerformanceTimingNames.DOMAIN_LOOKUP_END]?: number; [PerformanceTimingNames.DOMAIN_LOOKUP_START]?: number; + [PerformanceTimingNames.ENCODED_BODY_SIZE]?: number; [PerformanceTimingNames.FETCH_START]?: number; [PerformanceTimingNames.LOAD_EVENT_END]?: number; [PerformanceTimingNames.LOAD_EVENT_START]?: number; @@ -33,7 +34,6 @@ export type PerformanceEntries = { [PerformanceTimingNames.RESPONSE_END]?: number; [PerformanceTimingNames.RESPONSE_START]?: number; [PerformanceTimingNames.SECURE_CONNECTION_START]?: number; - [PerformanceTimingNames.TRANSFER_SIZE]?: number; [PerformanceTimingNames.UNLOAD_EVENT_END]?: number; [PerformanceTimingNames.UNLOAD_EVENT_START]?: number; }; diff --git a/packages/opentelemetry-web/src/utils.ts b/packages/opentelemetry-web/src/utils.ts index 55f2606a23..9a11bec745 100644 --- a/packages/opentelemetry-web/src/utils.ts +++ b/packages/opentelemetry-web/src/utils.ts @@ -81,8 +81,8 @@ export function addSpanNetworkEvents( addSpanNetworkEvent(span, PTN.REQUEST_START, resource); addSpanNetworkEvent(span, PTN.RESPONSE_START, resource); addSpanNetworkEvent(span, PTN.RESPONSE_END, resource); - if (resource.transferSize) { - span.setAttribute('transferSize', resource.transferSize); + if (resource.encodedBodySize) { + span.setAttribute('http.response_content_length', resource.encodedBodySize); } } diff --git a/packages/opentelemetry-web/test/utils.test.ts b/packages/opentelemetry-web/test/utils.test.ts index c9ea982247..046589793b 100644 --- a/packages/opentelemetry-web/test/utils.test.ts +++ b/packages/opentelemetry-web/test/utils.test.ts @@ -152,7 +152,7 @@ describe('utils', () => { [PTN.REQUEST_START]: 123, [PTN.RESPONSE_START]: 123, [PTN.RESPONSE_END]: 123, - [PTN.TRANSFER_SIZE]: 123, + [PTN.ENCODED_BODY_SIZE]: 123, } as PerformanceEntries; assert.strictEqual(addEventSpy.callCount, 0); From 63fef8cfd2dab248f8499bcecb730af5c8d28051 Mon Sep 17 00:00:00 2001 From: John Bley Date: Fri, 3 Jul 2020 10:52:22 -0400 Subject: [PATCH 5/7] chore: use PTN enum for encodedBodySize --- packages/opentelemetry-web/src/utils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/opentelemetry-web/src/utils.ts b/packages/opentelemetry-web/src/utils.ts index 9a11bec745..948513572b 100644 --- a/packages/opentelemetry-web/src/utils.ts +++ b/packages/opentelemetry-web/src/utils.ts @@ -81,8 +81,8 @@ export function addSpanNetworkEvents( addSpanNetworkEvent(span, PTN.REQUEST_START, resource); addSpanNetworkEvent(span, PTN.RESPONSE_START, resource); addSpanNetworkEvent(span, PTN.RESPONSE_END, resource); - if (resource.encodedBodySize) { - span.setAttribute('http.response_content_length', resource.encodedBodySize); + if (resource[PTN.ENCODED_BODY_SIZE]) { + span.setAttribute('http.response_content_length', resource[PTN.ENCODED_BODY_SIZE]); } } From 0fa2acc60a9a320ce007b23ef51586bd77afc8ab Mon Sep 17 00:00:00 2001 From: John Bley Date: Fri, 3 Jul 2020 11:01:13 -0400 Subject: [PATCH 6/7] chore: lint:fix --- packages/opentelemetry-web/src/utils.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/opentelemetry-web/src/utils.ts b/packages/opentelemetry-web/src/utils.ts index 948513572b..ba17e51730 100644 --- a/packages/opentelemetry-web/src/utils.ts +++ b/packages/opentelemetry-web/src/utils.ts @@ -82,7 +82,10 @@ export function addSpanNetworkEvents( addSpanNetworkEvent(span, PTN.RESPONSE_START, resource); addSpanNetworkEvent(span, PTN.RESPONSE_END, resource); if (resource[PTN.ENCODED_BODY_SIZE]) { - span.setAttribute('http.response_content_length', resource[PTN.ENCODED_BODY_SIZE]); + span.setAttribute( + 'http.response_content_length', + resource[PTN.ENCODED_BODY_SIZE] + ); } } From c72dcdacba20e4c3bab016fe85e39a504cad95e6 Mon Sep 17 00:00:00 2001 From: John Bley Date: Mon, 6 Jul 2020 12:13:24 -0400 Subject: [PATCH 7/7] chore: use constant for http.response_content_length --- packages/opentelemetry-web/package.json | 1 + packages/opentelemetry-web/src/utils.ts | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/opentelemetry-web/package.json b/packages/opentelemetry-web/package.json index 60f966c82f..a584ebb6ea 100644 --- a/packages/opentelemetry-web/package.json +++ b/packages/opentelemetry-web/package.json @@ -78,6 +78,7 @@ "@opentelemetry/api": "^0.9.0", "@opentelemetry/context-base": "^0.9.0", "@opentelemetry/core": "^0.9.0", + "@opentelemetry/semantic-conventions": "^0.9.0", "@opentelemetry/tracing": "^0.9.0" } } diff --git a/packages/opentelemetry-web/src/utils.ts b/packages/opentelemetry-web/src/utils.ts index ba17e51730..a1d539987a 100644 --- a/packages/opentelemetry-web/src/utils.ts +++ b/packages/opentelemetry-web/src/utils.ts @@ -26,6 +26,7 @@ import { timeInputToHrTime, urlMatches, } from '@opentelemetry/core'; +import { HttpAttribute } from '@opentelemetry/semantic-conventions'; /** * Helper function to be able to use enum as typed key in type and in interface when using forEach @@ -83,7 +84,7 @@ export function addSpanNetworkEvents( addSpanNetworkEvent(span, PTN.RESPONSE_END, resource); if (resource[PTN.ENCODED_BODY_SIZE]) { span.setAttribute( - 'http.response_content_length', + HttpAttribute.HTTP_RESPONSE_CONTENT_LENGTH, resource[PTN.ENCODED_BODY_SIZE] ); }