@opentelemetry/sdk-trace-web 1.30.1 → 2.0.0-dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/build/esm/StackContextManager.js +27 -66
  2. package/build/esm/StackContextManager.js.map +1 -1
  3. package/build/esm/WebTracerProvider.d.ts +1 -1
  4. package/build/esm/WebTracerProvider.js +43 -41
  5. package/build/esm/WebTracerProvider.js.map +1 -1
  6. package/build/esm/enums/PerformanceTimingNames.d.ts +1 -0
  7. package/build/esm/enums/PerformanceTimingNames.js +1 -0
  8. package/build/esm/enums/PerformanceTimingNames.js.map +1 -1
  9. package/build/esm/index.d.ts +1 -1
  10. package/build/esm/index.js +1 -1
  11. package/build/esm/index.js.map +1 -1
  12. package/build/esm/types.d.ts +4 -3
  13. package/build/esm/types.js.map +1 -1
  14. package/build/esm/utils.d.ts +5 -4
  15. package/build/esm/utils.js +69 -84
  16. package/build/esm/utils.js.map +1 -1
  17. package/build/esm/version.d.ts +1 -1
  18. package/build/esm/version.js +1 -1
  19. package/build/esm/version.js.map +1 -1
  20. package/build/esnext/StackContextManager.js +8 -10
  21. package/build/esnext/StackContextManager.js.map +1 -1
  22. package/build/esnext/WebTracerProvider.d.ts +1 -1
  23. package/build/esnext/WebTracerProvider.js +37 -14
  24. package/build/esnext/WebTracerProvider.js.map +1 -1
  25. package/build/esnext/enums/PerformanceTimingNames.d.ts +1 -0
  26. package/build/esnext/enums/PerformanceTimingNames.js +1 -0
  27. package/build/esnext/enums/PerformanceTimingNames.js.map +1 -1
  28. package/build/esnext/index.d.ts +1 -1
  29. package/build/esnext/index.js +1 -1
  30. package/build/esnext/index.js.map +1 -1
  31. package/build/esnext/types.d.ts +4 -3
  32. package/build/esnext/types.js.map +1 -1
  33. package/build/esnext/utils.d.ts +5 -4
  34. package/build/esnext/utils.js +19 -30
  35. package/build/esnext/utils.js.map +1 -1
  36. package/build/esnext/version.d.ts +1 -1
  37. package/build/esnext/version.js +1 -1
  38. package/build/esnext/version.js.map +1 -1
  39. package/build/src/StackContextManager.js +8 -10
  40. package/build/src/StackContextManager.js.map +1 -1
  41. package/build/src/WebTracerProvider.d.ts +1 -1
  42. package/build/src/WebTracerProvider.js +37 -14
  43. package/build/src/WebTracerProvider.js.map +1 -1
  44. package/build/src/enums/PerformanceTimingNames.d.ts +1 -0
  45. package/build/src/enums/PerformanceTimingNames.js +1 -0
  46. package/build/src/enums/PerformanceTimingNames.js.map +1 -1
  47. package/build/src/index.d.ts +1 -1
  48. package/build/src/index.js +1 -4
  49. package/build/src/index.js.map +1 -1
  50. package/build/src/types.d.ts +4 -3
  51. package/build/src/types.js.map +1 -1
  52. package/build/src/utils.d.ts +5 -4
  53. package/build/src/utils.js +19 -30
  54. package/build/src/utils.js.map +1 -1
  55. package/build/src/version.d.ts +1 -1
  56. package/build/src/version.js +1 -1
  57. package/build/src/version.js.map +1 -1
  58. package/package.json +17 -19
@@ -17,7 +17,7 @@ import { PerformanceTimingNames as PTN } from './enums/PerformanceTimingNames';
17
17
  import { hrTimeToNanoseconds, timeInputToHrTime, urlMatches, } from '@opentelemetry/core';
18
18
  import { SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH, SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH_UNCOMPRESSED, } from '@opentelemetry/semantic-conventions';
19
19
  // Used to normalize relative URLs
20
- var urlNormalizingAnchor;
20
+ let urlNormalizingAnchor;
21
21
  function getUrlNormalizingAnchor() {
22
22
  if (!urlNormalizingAnchor) {
23
23
  urlNormalizingAnchor = document.createElement('a');
@@ -29,7 +29,6 @@ function getUrlNormalizingAnchor() {
29
29
  * @param obj
30
30
  * @param key
31
31
  */
32
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
33
32
  export function hasKey(obj, key) {
34
33
  return key in obj;
35
34
  }
@@ -38,24 +37,13 @@ export function hasKey(obj, key) {
38
37
  * @param span
39
38
  * @param performanceName name of performance entry for time start
40
39
  * @param entries
41
- * @param refPerfName name of performance entry to use for reference
40
+ * @param ignoreZeros
42
41
  */
43
- export function addSpanNetworkEvent(span, performanceName, entries, refPerfName) {
44
- var perfTime = undefined;
45
- var refTime = undefined;
42
+ export function addSpanNetworkEvent(span, performanceName, entries, ignoreZeros = true) {
46
43
  if (hasKey(entries, performanceName) &&
47
- typeof entries[performanceName] === 'number') {
48
- perfTime = entries[performanceName];
49
- }
50
- var refName = refPerfName || PTN.FETCH_START;
51
- // Use a reference time which is the earliest possible value so that the performance timings that are earlier should not be added
52
- // using FETCH START time in case no reference is provided
53
- if (hasKey(entries, refName) && typeof entries[refName] === 'number') {
54
- refTime = entries[refName];
55
- }
56
- if (perfTime !== undefined && refTime !== undefined && perfTime >= refTime) {
57
- span.addEvent(performanceName, perfTime);
58
- return span;
44
+ typeof entries[performanceName] === 'number' &&
45
+ !(ignoreZeros && entries[performanceName] === 0)) {
46
+ return span.addEvent(performanceName, entries[performanceName]);
59
47
  }
60
48
  return undefined;
61
49
  }
@@ -64,28 +52,28 @@ export function addSpanNetworkEvent(span, performanceName, entries, refPerfName)
64
52
  * @param span
65
53
  * @param resource
66
54
  * @param ignoreNetworkEvents
55
+ * @param ignoreZeros
67
56
  */
68
- export function addSpanNetworkEvents(span, resource, ignoreNetworkEvents) {
69
- if (ignoreNetworkEvents === void 0) { ignoreNetworkEvents = false; }
57
+ export function addSpanNetworkEvents(span, resource, ignoreNetworkEvents = false, ignoreZeros) {
58
+ if (ignoreZeros === undefined) {
59
+ ignoreZeros = resource[PTN.START_TIME] !== 0;
60
+ }
70
61
  if (!ignoreNetworkEvents) {
71
- addSpanNetworkEvent(span, PTN.FETCH_START, resource);
72
- addSpanNetworkEvent(span, PTN.DOMAIN_LOOKUP_START, resource);
73
- addSpanNetworkEvent(span, PTN.DOMAIN_LOOKUP_END, resource);
74
- addSpanNetworkEvent(span, PTN.CONNECT_START, resource);
75
- if (hasKey(resource, 'name') &&
76
- resource['name'].startsWith('https:')) {
77
- addSpanNetworkEvent(span, PTN.SECURE_CONNECTION_START, resource);
78
- }
79
- addSpanNetworkEvent(span, PTN.CONNECT_END, resource);
80
- addSpanNetworkEvent(span, PTN.REQUEST_START, resource);
81
- addSpanNetworkEvent(span, PTN.RESPONSE_START, resource);
82
- addSpanNetworkEvent(span, PTN.RESPONSE_END, resource);
62
+ addSpanNetworkEvent(span, PTN.FETCH_START, resource, ignoreZeros);
63
+ addSpanNetworkEvent(span, PTN.DOMAIN_LOOKUP_START, resource, ignoreZeros);
64
+ addSpanNetworkEvent(span, PTN.DOMAIN_LOOKUP_END, resource, ignoreZeros);
65
+ addSpanNetworkEvent(span, PTN.CONNECT_START, resource, ignoreZeros);
66
+ addSpanNetworkEvent(span, PTN.SECURE_CONNECTION_START, resource, ignoreZeros);
67
+ addSpanNetworkEvent(span, PTN.CONNECT_END, resource, ignoreZeros);
68
+ addSpanNetworkEvent(span, PTN.REQUEST_START, resource, ignoreZeros);
69
+ addSpanNetworkEvent(span, PTN.RESPONSE_START, resource, ignoreZeros);
70
+ addSpanNetworkEvent(span, PTN.RESPONSE_END, resource, ignoreZeros);
83
71
  }
84
- var encodedLength = resource[PTN.ENCODED_BODY_SIZE];
72
+ const encodedLength = resource[PTN.ENCODED_BODY_SIZE];
85
73
  if (encodedLength !== undefined) {
86
74
  span.setAttribute(SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH, encodedLength);
87
75
  }
88
- var decodedLength = resource[PTN.DECODED_BODY_SIZE];
76
+ const decodedLength = resource[PTN.DECODED_BODY_SIZE];
89
77
  // Spec: Not set if transport encoding not used (in which case encoded and decoded sizes match)
90
78
  if (decodedLength !== undefined && encodedLength !== decodedLength) {
91
79
  span.setAttribute(SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH_UNCOMPRESSED, decodedLength);
@@ -96,9 +84,9 @@ export function addSpanNetworkEvents(span, resource, ignoreNetworkEvents) {
96
84
  * @param filteredResources
97
85
  */
98
86
  export function sortResources(filteredResources) {
99
- return filteredResources.slice().sort(function (a, b) {
100
- var valueA = a[PTN.FETCH_START];
101
- var valueB = b[PTN.FETCH_START];
87
+ return filteredResources.slice().sort((a, b) => {
88
+ const valueA = a[PTN.FETCH_START];
89
+ const valueB = b[PTN.FETCH_START];
102
90
  if (valueA > valueB) {
103
91
  return 1;
104
92
  }
@@ -122,12 +110,11 @@ function getOrigin() {
122
110
  * @param ignoredResources
123
111
  * @param initiatorType
124
112
  */
125
- export function getResource(spanUrl, startTimeHR, endTimeHR, resources, ignoredResources, initiatorType) {
126
- if (ignoredResources === void 0) { ignoredResources = new WeakSet(); }
113
+ export function getResource(spanUrl, startTimeHR, endTimeHR, resources, ignoredResources = new WeakSet(), initiatorType) {
127
114
  // de-relativize the URL before usage (does no harm to absolute URLs)
128
- var parsedSpanUrl = parseUrl(spanUrl);
115
+ const parsedSpanUrl = parseUrl(spanUrl);
129
116
  spanUrl = parsedSpanUrl.toString();
130
- var filteredResources = filterResourcesForSpan(spanUrl, startTimeHR, endTimeHR, resources, ignoredResources, initiatorType);
117
+ const filteredResources = filterResourcesForSpan(spanUrl, startTimeHR, endTimeHR, resources, ignoredResources, initiatorType);
131
118
  if (filteredResources.length === 0) {
132
119
  return {
133
120
  mainRequest: undefined,
@@ -138,20 +125,20 @@ export function getResource(spanUrl, startTimeHR, endTimeHR, resources, ignoredR
138
125
  mainRequest: filteredResources[0],
139
126
  };
140
127
  }
141
- var sorted = sortResources(filteredResources);
128
+ const sorted = sortResources(filteredResources);
142
129
  if (parsedSpanUrl.origin !== getOrigin() && sorted.length > 1) {
143
- var corsPreFlightRequest = sorted[0];
144
- var mainRequest = findMainRequest(sorted, corsPreFlightRequest[PTN.RESPONSE_END], endTimeHR);
145
- var responseEnd = corsPreFlightRequest[PTN.RESPONSE_END];
146
- var fetchStart = mainRequest[PTN.FETCH_START];
130
+ let corsPreFlightRequest = sorted[0];
131
+ let mainRequest = findMainRequest(sorted, corsPreFlightRequest[PTN.RESPONSE_END], endTimeHR);
132
+ const responseEnd = corsPreFlightRequest[PTN.RESPONSE_END];
133
+ const fetchStart = mainRequest[PTN.FETCH_START];
147
134
  // no corsPreFlightRequest
148
135
  if (fetchStart < responseEnd) {
149
136
  mainRequest = corsPreFlightRequest;
150
137
  corsPreFlightRequest = undefined;
151
138
  }
152
139
  return {
153
- corsPreFlightRequest: corsPreFlightRequest,
154
- mainRequest: mainRequest,
140
+ corsPreFlightRequest,
141
+ mainRequest,
155
142
  };
156
143
  }
157
144
  else {
@@ -167,16 +154,16 @@ export function getResource(spanUrl, startTimeHR, endTimeHR, resources, ignoredR
167
154
  * @param spanEndTimeHR
168
155
  */
169
156
  function findMainRequest(resources, corsPreFlightRequestEndTime, spanEndTimeHR) {
170
- var spanEndTime = hrTimeToNanoseconds(spanEndTimeHR);
171
- var minTime = hrTimeToNanoseconds(timeInputToHrTime(corsPreFlightRequestEndTime));
172
- var mainRequest = resources[1];
173
- var bestGap;
174
- var length = resources.length;
175
- for (var i = 1; i < length; i++) {
176
- var resource = resources[i];
177
- var resourceStartTime = hrTimeToNanoseconds(timeInputToHrTime(resource[PTN.FETCH_START]));
178
- var resourceEndTime = hrTimeToNanoseconds(timeInputToHrTime(resource[PTN.RESPONSE_END]));
179
- var currentGap = spanEndTime - resourceEndTime;
157
+ const spanEndTime = hrTimeToNanoseconds(spanEndTimeHR);
158
+ const minTime = hrTimeToNanoseconds(timeInputToHrTime(corsPreFlightRequestEndTime));
159
+ let mainRequest = resources[1];
160
+ let bestGap;
161
+ const length = resources.length;
162
+ for (let i = 1; i < length; i++) {
163
+ const resource = resources[i];
164
+ const resourceStartTime = hrTimeToNanoseconds(timeInputToHrTime(resource[PTN.FETCH_START]));
165
+ const resourceEndTime = hrTimeToNanoseconds(timeInputToHrTime(resource[PTN.RESPONSE_END]));
166
+ const currentGap = spanEndTime - resourceEndTime;
180
167
  if (resourceStartTime >= minTime && (!bestGap || currentGap < bestGap)) {
181
168
  bestGap = currentGap;
182
169
  mainRequest = resource;
@@ -194,11 +181,11 @@ function findMainRequest(resources, corsPreFlightRequestEndTime, spanEndTimeHR)
194
181
  * @param ignoredResources
195
182
  */
196
183
  function filterResourcesForSpan(spanUrl, startTimeHR, endTimeHR, resources, ignoredResources, initiatorType) {
197
- var startTime = hrTimeToNanoseconds(startTimeHR);
198
- var endTime = hrTimeToNanoseconds(endTimeHR);
199
- var filteredResources = resources.filter(function (resource) {
200
- var resourceStartTime = hrTimeToNanoseconds(timeInputToHrTime(resource[PTN.FETCH_START]));
201
- var resourceEndTime = hrTimeToNanoseconds(timeInputToHrTime(resource[PTN.RESPONSE_END]));
184
+ const startTime = hrTimeToNanoseconds(startTimeHR);
185
+ const endTime = hrTimeToNanoseconds(endTimeHR);
186
+ let filteredResources = resources.filter(resource => {
187
+ const resourceStartTime = hrTimeToNanoseconds(timeInputToHrTime(resource[PTN.FETCH_START]));
188
+ const resourceEndTime = hrTimeToNanoseconds(timeInputToHrTime(resource[PTN.RESPONSE_END]));
202
189
  return (resource.initiatorType.toLowerCase() ===
203
190
  (initiatorType || 'xmlhttprequest') &&
204
191
  resource.name === spanUrl &&
@@ -206,7 +193,7 @@ function filterResourcesForSpan(spanUrl, startTimeHR, endTimeHR, resources, igno
206
193
  resourceEndTime <= endTime);
207
194
  });
208
195
  if (filteredResources.length > 0) {
209
- filteredResources = filteredResources.filter(function (resource) {
196
+ filteredResources = filteredResources.filter(resource => {
210
197
  return !ignoredResources.has(resource);
211
198
  });
212
199
  }
@@ -224,7 +211,7 @@ export function parseUrl(url) {
224
211
  ? location.href
225
212
  : undefined);
226
213
  }
227
- var element = getUrlNormalizingAnchor();
214
+ const element = getUrlNormalizingAnchor();
228
215
  element.href = url;
229
216
  return element;
230
217
  }
@@ -237,7 +224,7 @@ export function parseUrl(url) {
237
224
  * @param url
238
225
  */
239
226
  export function normalizeUrl(url) {
240
- var urlLike = parseUrl(url);
227
+ const urlLike = parseUrl(url);
241
228
  return urlLike.href;
242
229
  }
243
230
  /**
@@ -251,11 +238,11 @@ export function getElementXPath(target, optimised) {
251
238
  if (target.nodeType === Node.DOCUMENT_NODE) {
252
239
  return '/';
253
240
  }
254
- var targetValue = getNodeValue(target, optimised);
241
+ const targetValue = getNodeValue(target, optimised);
255
242
  if (optimised && targetValue.indexOf('@id') > 0) {
256
243
  return targetValue;
257
244
  }
258
- var xpath = '';
245
+ let xpath = '';
259
246
  if (target.parentNode) {
260
247
  xpath += getElementXPath(target.parentNode, false);
261
248
  }
@@ -270,13 +257,13 @@ function getNodeIndex(target) {
270
257
  if (!target.parentNode) {
271
258
  return 0;
272
259
  }
273
- var allowedTypes = [target.nodeType];
260
+ const allowedTypes = [target.nodeType];
274
261
  if (target.nodeType === Node.CDATA_SECTION_NODE) {
275
262
  allowedTypes.push(Node.TEXT_NODE);
276
263
  }
277
- var elements = Array.from(target.parentNode.childNodes);
278
- elements = elements.filter(function (element) {
279
- var localName = element.localName;
264
+ let elements = Array.from(target.parentNode.childNodes);
265
+ elements = elements.filter((element) => {
266
+ const localName = element.localName;
280
267
  return (allowedTypes.indexOf(element.nodeType) >= 0 &&
281
268
  localName === target.localName);
282
269
  });
@@ -292,13 +279,13 @@ function getNodeIndex(target) {
292
279
  * @param optimised
293
280
  */
294
281
  function getNodeValue(target, optimised) {
295
- var nodeType = target.nodeType;
296
- var index = getNodeIndex(target);
297
- var nodeValue = '';
282
+ const nodeType = target.nodeType;
283
+ const index = getNodeIndex(target);
284
+ let nodeValue = '';
298
285
  if (nodeType === Node.ELEMENT_NODE) {
299
- var id = target.getAttribute('id');
286
+ const id = target.getAttribute('id');
300
287
  if (optimised && id) {
301
- return "//*[@id=\"" + id + "\"]";
288
+ return `//*[@id="${id}"]`;
302
289
  }
303
290
  nodeValue = target.localName;
304
291
  }
@@ -314,9 +301,9 @@ function getNodeValue(target, optimised) {
314
301
  }
315
302
  // if index is 1 it can be omitted in xpath
316
303
  if (nodeValue && index > 1) {
317
- return "/" + nodeValue + "[" + index + "]";
304
+ return `/${nodeValue}[${index}]`;
318
305
  }
319
- return "/" + nodeValue;
306
+ return `/${nodeValue}`;
320
307
  }
321
308
  /**
322
309
  * Checks if trace headers should be propagated
@@ -324,19 +311,17 @@ function getNodeValue(target, optimised) {
324
311
  * @private
325
312
  */
326
313
  export function shouldPropagateTraceHeaders(spanUrl, propagateTraceHeaderCorsUrls) {
327
- var propagateTraceHeaderUrls = propagateTraceHeaderCorsUrls || [];
314
+ let propagateTraceHeaderUrls = propagateTraceHeaderCorsUrls || [];
328
315
  if (typeof propagateTraceHeaderUrls === 'string' ||
329
316
  propagateTraceHeaderUrls instanceof RegExp) {
330
317
  propagateTraceHeaderUrls = [propagateTraceHeaderUrls];
331
318
  }
332
- var parsedSpanUrl = parseUrl(spanUrl);
319
+ const parsedSpanUrl = parseUrl(spanUrl);
333
320
  if (parsedSpanUrl.origin === getOrigin()) {
334
321
  return true;
335
322
  }
336
323
  else {
337
- return propagateTraceHeaderUrls.some(function (propagateTraceHeaderUrl) {
338
- return urlMatches(spanUrl, propagateTraceHeaderUrl);
339
- });
324
+ return propagateTraceHeaderUrls.some(propagateTraceHeaderUrl => urlMatches(spanUrl, propagateTraceHeaderUrl));
340
325
  }
341
326
  }
342
327
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n PerformanceEntries,\n PerformanceResourceTimingInfo,\n PropagateTraceHeaderCorsUrls,\n} from './types';\nimport { PerformanceTimingNames as PTN } from './enums/PerformanceTimingNames';\nimport * as api from '@opentelemetry/api';\nimport {\n hrTimeToNanoseconds,\n timeInputToHrTime,\n urlMatches,\n} from '@opentelemetry/core';\nimport {\n SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH,\n SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH_UNCOMPRESSED,\n} from '@opentelemetry/semantic-conventions';\n\n// Used to normalize relative URLs\nlet urlNormalizingAnchor: HTMLAnchorElement | undefined;\nfunction getUrlNormalizingAnchor(): HTMLAnchorElement {\n if (!urlNormalizingAnchor) {\n urlNormalizingAnchor = document.createElement('a');\n }\n\n return urlNormalizingAnchor;\n}\n\n/**\n * Helper function to be able to use enum as typed key in type and in interface when using forEach\n * @param obj\n * @param key\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function hasKey<O extends object>(\n obj: O,\n key: keyof any\n): key is keyof O {\n return key in obj;\n}\n\n/**\n * Helper function for starting an event on span based on {@link PerformanceEntries}\n * @param span\n * @param performanceName name of performance entry for time start\n * @param entries\n * @param refPerfName name of performance entry to use for reference\n */\nexport function addSpanNetworkEvent(\n span: api.Span,\n performanceName: string,\n entries: PerformanceEntries,\n refPerfName?: string\n): api.Span | undefined {\n let perfTime = undefined;\n let refTime = undefined;\n if (\n hasKey(entries, performanceName) &&\n typeof entries[performanceName] === 'number'\n ) {\n perfTime = entries[performanceName];\n }\n const refName = refPerfName || PTN.FETCH_START;\n // Use a reference time which is the earliest possible value so that the performance timings that are earlier should not be added\n // using FETCH START time in case no reference is provided\n if (hasKey(entries, refName) && typeof entries[refName] === 'number') {\n refTime = entries[refName];\n }\n if (perfTime !== undefined && refTime !== undefined && perfTime >= refTime) {\n span.addEvent(performanceName, perfTime);\n return span;\n }\n return undefined;\n}\n\n/**\n * Helper function for adding network events and content length attributes\n * @param span\n * @param resource\n * @param ignoreNetworkEvents\n */\nexport function addSpanNetworkEvents(\n span: api.Span,\n resource: PerformanceEntries,\n ignoreNetworkEvents = false\n): void {\n if (!ignoreNetworkEvents) {\n addSpanNetworkEvent(span, PTN.FETCH_START, resource);\n addSpanNetworkEvent(span, PTN.DOMAIN_LOOKUP_START, resource);\n addSpanNetworkEvent(span, PTN.DOMAIN_LOOKUP_END, resource);\n addSpanNetworkEvent(span, PTN.CONNECT_START, resource);\n if (\n hasKey(resource as PerformanceResourceTiming, 'name') &&\n (resource as PerformanceResourceTiming)['name'].startsWith('https:')\n ) {\n addSpanNetworkEvent(span, PTN.SECURE_CONNECTION_START, resource);\n }\n addSpanNetworkEvent(span, PTN.CONNECT_END, resource);\n addSpanNetworkEvent(span, PTN.REQUEST_START, resource);\n addSpanNetworkEvent(span, PTN.RESPONSE_START, resource);\n addSpanNetworkEvent(span, PTN.RESPONSE_END, resource);\n }\n const encodedLength = resource[PTN.ENCODED_BODY_SIZE];\n if (encodedLength !== undefined) {\n span.setAttribute(SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH, encodedLength);\n }\n const decodedLength = resource[PTN.DECODED_BODY_SIZE];\n // Spec: Not set if transport encoding not used (in which case encoded and decoded sizes match)\n if (decodedLength !== undefined && encodedLength !== decodedLength) {\n span.setAttribute(\n SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH_UNCOMPRESSED,\n decodedLength\n );\n }\n}\n\n/**\n * sort resources by startTime\n * @param filteredResources\n */\nexport function sortResources(\n filteredResources: PerformanceResourceTiming[]\n): PerformanceResourceTiming[] {\n return filteredResources.slice().sort((a, b) => {\n const valueA = a[PTN.FETCH_START];\n const valueB = b[PTN.FETCH_START];\n if (valueA > valueB) {\n return 1;\n } else if (valueA < valueB) {\n return -1;\n }\n return 0;\n });\n}\n\n/** Returns the origin if present (if in browser context). */\nfunction getOrigin(): string | undefined {\n return typeof location !== 'undefined' ? location.origin : undefined;\n}\n\n/**\n * Get closest performance resource ignoring the resources that have been\n * already used.\n * @param spanUrl\n * @param startTimeHR\n * @param endTimeHR\n * @param resources\n * @param ignoredResources\n * @param initiatorType\n */\nexport function getResource(\n spanUrl: string,\n startTimeHR: api.HrTime,\n endTimeHR: api.HrTime,\n resources: PerformanceResourceTiming[],\n ignoredResources: WeakSet<PerformanceResourceTiming> = new WeakSet<PerformanceResourceTiming>(),\n initiatorType?: string\n): PerformanceResourceTimingInfo {\n // de-relativize the URL before usage (does no harm to absolute URLs)\n const parsedSpanUrl = parseUrl(spanUrl);\n spanUrl = parsedSpanUrl.toString();\n\n const filteredResources = filterResourcesForSpan(\n spanUrl,\n startTimeHR,\n endTimeHR,\n resources,\n ignoredResources,\n initiatorType\n );\n\n if (filteredResources.length === 0) {\n return {\n mainRequest: undefined,\n };\n }\n if (filteredResources.length === 1) {\n return {\n mainRequest: filteredResources[0],\n };\n }\n const sorted = sortResources(filteredResources);\n\n if (parsedSpanUrl.origin !== getOrigin() && sorted.length > 1) {\n let corsPreFlightRequest: PerformanceResourceTiming | undefined = sorted[0];\n let mainRequest: PerformanceResourceTiming = findMainRequest(\n sorted,\n corsPreFlightRequest[PTN.RESPONSE_END],\n endTimeHR\n );\n\n const responseEnd = corsPreFlightRequest[PTN.RESPONSE_END];\n const fetchStart = mainRequest[PTN.FETCH_START];\n\n // no corsPreFlightRequest\n if (fetchStart < responseEnd) {\n mainRequest = corsPreFlightRequest;\n corsPreFlightRequest = undefined;\n }\n\n return {\n corsPreFlightRequest,\n mainRequest,\n };\n } else {\n return {\n mainRequest: filteredResources[0],\n };\n }\n}\n\n/**\n * Will find the main request skipping the cors pre flight requests\n * @param resources\n * @param corsPreFlightRequestEndTime\n * @param spanEndTimeHR\n */\nfunction findMainRequest(\n resources: PerformanceResourceTiming[],\n corsPreFlightRequestEndTime: number,\n spanEndTimeHR: api.HrTime\n): PerformanceResourceTiming {\n const spanEndTime = hrTimeToNanoseconds(spanEndTimeHR);\n const minTime = hrTimeToNanoseconds(\n timeInputToHrTime(corsPreFlightRequestEndTime)\n );\n\n let mainRequest: PerformanceResourceTiming = resources[1];\n let bestGap;\n\n const length = resources.length;\n for (let i = 1; i < length; i++) {\n const resource = resources[i];\n const resourceStartTime = hrTimeToNanoseconds(\n timeInputToHrTime(resource[PTN.FETCH_START])\n );\n\n const resourceEndTime = hrTimeToNanoseconds(\n timeInputToHrTime(resource[PTN.RESPONSE_END])\n );\n\n const currentGap = spanEndTime - resourceEndTime;\n\n if (resourceStartTime >= minTime && (!bestGap || currentGap < bestGap)) {\n bestGap = currentGap;\n mainRequest = resource;\n }\n }\n return mainRequest;\n}\n\n/**\n * Filter all resources that has started and finished according to span start time and end time.\n * It will return the closest resource to a start time\n * @param spanUrl\n * @param startTimeHR\n * @param endTimeHR\n * @param resources\n * @param ignoredResources\n */\nfunction filterResourcesForSpan(\n spanUrl: string,\n startTimeHR: api.HrTime,\n endTimeHR: api.HrTime,\n resources: PerformanceResourceTiming[],\n ignoredResources: WeakSet<PerformanceResourceTiming>,\n initiatorType?: string\n) {\n const startTime = hrTimeToNanoseconds(startTimeHR);\n const endTime = hrTimeToNanoseconds(endTimeHR);\n let filteredResources = resources.filter(resource => {\n const resourceStartTime = hrTimeToNanoseconds(\n timeInputToHrTime(resource[PTN.FETCH_START])\n );\n const resourceEndTime = hrTimeToNanoseconds(\n timeInputToHrTime(resource[PTN.RESPONSE_END])\n );\n\n return (\n resource.initiatorType.toLowerCase() ===\n (initiatorType || 'xmlhttprequest') &&\n resource.name === spanUrl &&\n resourceStartTime >= startTime &&\n resourceEndTime <= endTime\n );\n });\n\n if (filteredResources.length > 0) {\n filteredResources = filteredResources.filter(resource => {\n return !ignoredResources.has(resource);\n });\n }\n\n return filteredResources;\n}\n\n/**\n * The URLLike interface represents an URL and HTMLAnchorElement compatible fields.\n */\nexport interface URLLike {\n hash: string;\n host: string;\n hostname: string;\n href: string;\n readonly origin: string;\n password: string;\n pathname: string;\n port: string;\n protocol: string;\n search: string;\n username: string;\n}\n\n/**\n * Parses url using URL constructor or fallback to anchor element.\n * @param url\n */\nexport function parseUrl(url: string): URLLike {\n if (typeof URL === 'function') {\n return new URL(\n url,\n typeof document !== 'undefined'\n ? document.baseURI\n : typeof location !== 'undefined' // Some JS runtimes (e.g. Deno) don't define this\n ? location.href\n : undefined\n );\n }\n const element = getUrlNormalizingAnchor();\n element.href = url;\n return element;\n}\n\n/**\n * Parses url using URL constructor or fallback to anchor element and serialize\n * it to a string.\n *\n * Performs the steps described in https://html.spec.whatwg.org/multipage/urls-and-fetching.html#parse-a-url\n *\n * @param url\n */\nexport function normalizeUrl(url: string): string {\n const urlLike = parseUrl(url);\n return urlLike.href;\n}\n\n/**\n * Get element XPath\n * @param target - target element\n * @param optimised - when id attribute of element is present the xpath can be\n * simplified to contain id\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\nexport function getElementXPath(target: any, optimised?: boolean): string {\n if (target.nodeType === Node.DOCUMENT_NODE) {\n return '/';\n }\n const targetValue = getNodeValue(target, optimised);\n if (optimised && targetValue.indexOf('@id') > 0) {\n return targetValue;\n }\n let xpath = '';\n if (target.parentNode) {\n xpath += getElementXPath(target.parentNode, false);\n }\n xpath += targetValue;\n\n return xpath;\n}\n\n/**\n * get node index within the siblings\n * @param target\n */\nfunction getNodeIndex(target: HTMLElement): number {\n if (!target.parentNode) {\n return 0;\n }\n const allowedTypes = [target.nodeType];\n if (target.nodeType === Node.CDATA_SECTION_NODE) {\n allowedTypes.push(Node.TEXT_NODE);\n }\n let elements = Array.from(target.parentNode.childNodes);\n elements = elements.filter((element: Node) => {\n const localName = (element as HTMLElement).localName;\n return (\n allowedTypes.indexOf(element.nodeType) >= 0 &&\n localName === target.localName\n );\n });\n if (elements.length >= 1) {\n return elements.indexOf(target) + 1; // xpath starts from 1\n }\n // if there are no other similar child xpath doesn't need index\n return 0;\n}\n\n/**\n * get node value for xpath\n * @param target\n * @param optimised\n */\nfunction getNodeValue(target: HTMLElement, optimised?: boolean): string {\n const nodeType = target.nodeType;\n const index = getNodeIndex(target);\n let nodeValue = '';\n if (nodeType === Node.ELEMENT_NODE) {\n const id = target.getAttribute('id');\n if (optimised && id) {\n return `//*[@id=\"${id}\"]`;\n }\n nodeValue = target.localName;\n } else if (\n nodeType === Node.TEXT_NODE ||\n nodeType === Node.CDATA_SECTION_NODE\n ) {\n nodeValue = 'text()';\n } else if (nodeType === Node.COMMENT_NODE) {\n nodeValue = 'comment()';\n } else {\n return '';\n }\n // if index is 1 it can be omitted in xpath\n if (nodeValue && index > 1) {\n return `/${nodeValue}[${index}]`;\n }\n return `/${nodeValue}`;\n}\n\n/**\n * Checks if trace headers should be propagated\n * @param spanUrl\n * @private\n */\nexport function shouldPropagateTraceHeaders(\n spanUrl: string,\n propagateTraceHeaderCorsUrls?: PropagateTraceHeaderCorsUrls\n): boolean {\n let propagateTraceHeaderUrls = propagateTraceHeaderCorsUrls || [];\n if (\n typeof propagateTraceHeaderUrls === 'string' ||\n propagateTraceHeaderUrls instanceof RegExp\n ) {\n propagateTraceHeaderUrls = [propagateTraceHeaderUrls];\n }\n const parsedSpanUrl = parseUrl(spanUrl);\n\n if (parsedSpanUrl.origin === getOrigin()) {\n return true;\n } else {\n return propagateTraceHeaderUrls.some(propagateTraceHeaderUrl =>\n urlMatches(spanUrl, propagateTraceHeaderUrl)\n );\n }\n}\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n PerformanceEntries,\n PerformanceResourceTimingInfo,\n PropagateTraceHeaderCorsUrls,\n} from './types';\nimport { PerformanceTimingNames as PTN } from './enums/PerformanceTimingNames';\nimport * as api from '@opentelemetry/api';\nimport {\n hrTimeToNanoseconds,\n timeInputToHrTime,\n urlMatches,\n} from '@opentelemetry/core';\nimport {\n SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH,\n SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH_UNCOMPRESSED,\n} from '@opentelemetry/semantic-conventions';\n\n// Used to normalize relative URLs\nlet urlNormalizingAnchor: HTMLAnchorElement | undefined;\nfunction getUrlNormalizingAnchor(): HTMLAnchorElement {\n if (!urlNormalizingAnchor) {\n urlNormalizingAnchor = document.createElement('a');\n }\n\n return urlNormalizingAnchor;\n}\n\n/**\n * Helper function to be able to use enum as typed key in type and in interface when using forEach\n * @param obj\n * @param key\n */\nexport function hasKey<O extends object>(\n obj: O,\n key: PropertyKey\n): key is keyof O {\n return key in obj;\n}\n\n/**\n * Helper function for starting an event on span based on {@link PerformanceEntries}\n * @param span\n * @param performanceName name of performance entry for time start\n * @param entries\n * @param ignoreZeros\n */\nexport function addSpanNetworkEvent(\n span: api.Span,\n performanceName: string,\n entries: PerformanceEntries,\n ignoreZeros = true\n): api.Span | undefined {\n if (\n hasKey(entries, performanceName) &&\n typeof entries[performanceName] === 'number' &&\n !(ignoreZeros && entries[performanceName] === 0)\n ) {\n return span.addEvent(performanceName, entries[performanceName]);\n }\n\n return undefined;\n}\n\n/**\n * Helper function for adding network events and content length attributes\n * @param span\n * @param resource\n * @param ignoreNetworkEvents\n * @param ignoreZeros\n */\nexport function addSpanNetworkEvents(\n span: api.Span,\n resource: PerformanceEntries,\n ignoreNetworkEvents = false,\n ignoreZeros?: boolean\n): void {\n if (ignoreZeros === undefined) {\n ignoreZeros = resource[PTN.START_TIME] !== 0;\n }\n\n if (!ignoreNetworkEvents) {\n addSpanNetworkEvent(span, PTN.FETCH_START, resource, ignoreZeros);\n addSpanNetworkEvent(span, PTN.DOMAIN_LOOKUP_START, resource, ignoreZeros);\n addSpanNetworkEvent(span, PTN.DOMAIN_LOOKUP_END, resource, ignoreZeros);\n addSpanNetworkEvent(span, PTN.CONNECT_START, resource, ignoreZeros);\n addSpanNetworkEvent(\n span,\n PTN.SECURE_CONNECTION_START,\n resource,\n ignoreZeros\n );\n addSpanNetworkEvent(span, PTN.CONNECT_END, resource, ignoreZeros);\n addSpanNetworkEvent(span, PTN.REQUEST_START, resource, ignoreZeros);\n addSpanNetworkEvent(span, PTN.RESPONSE_START, resource, ignoreZeros);\n addSpanNetworkEvent(span, PTN.RESPONSE_END, resource, ignoreZeros);\n }\n\n const encodedLength = resource[PTN.ENCODED_BODY_SIZE];\n if (encodedLength !== undefined) {\n span.setAttribute(SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH, encodedLength);\n }\n\n const decodedLength = resource[PTN.DECODED_BODY_SIZE];\n // Spec: Not set if transport encoding not used (in which case encoded and decoded sizes match)\n if (decodedLength !== undefined && encodedLength !== decodedLength) {\n span.setAttribute(\n SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH_UNCOMPRESSED,\n decodedLength\n );\n }\n}\n\n/**\n * sort resources by startTime\n * @param filteredResources\n */\nexport function sortResources(\n filteredResources: PerformanceResourceTiming[]\n): PerformanceResourceTiming[] {\n return filteredResources.slice().sort((a, b) => {\n const valueA = a[PTN.FETCH_START];\n const valueB = b[PTN.FETCH_START];\n if (valueA > valueB) {\n return 1;\n } else if (valueA < valueB) {\n return -1;\n }\n return 0;\n });\n}\n\n/** Returns the origin if present (if in browser context). */\nfunction getOrigin(): string | undefined {\n return typeof location !== 'undefined' ? location.origin : undefined;\n}\n\n/**\n * Get closest performance resource ignoring the resources that have been\n * already used.\n * @param spanUrl\n * @param startTimeHR\n * @param endTimeHR\n * @param resources\n * @param ignoredResources\n * @param initiatorType\n */\nexport function getResource(\n spanUrl: string,\n startTimeHR: api.HrTime,\n endTimeHR: api.HrTime,\n resources: PerformanceResourceTiming[],\n ignoredResources: WeakSet<PerformanceResourceTiming> = new WeakSet<PerformanceResourceTiming>(),\n initiatorType?: string\n): PerformanceResourceTimingInfo {\n // de-relativize the URL before usage (does no harm to absolute URLs)\n const parsedSpanUrl = parseUrl(spanUrl);\n spanUrl = parsedSpanUrl.toString();\n\n const filteredResources = filterResourcesForSpan(\n spanUrl,\n startTimeHR,\n endTimeHR,\n resources,\n ignoredResources,\n initiatorType\n );\n\n if (filteredResources.length === 0) {\n return {\n mainRequest: undefined,\n };\n }\n if (filteredResources.length === 1) {\n return {\n mainRequest: filteredResources[0],\n };\n }\n const sorted = sortResources(filteredResources);\n\n if (parsedSpanUrl.origin !== getOrigin() && sorted.length > 1) {\n let corsPreFlightRequest: PerformanceResourceTiming | undefined = sorted[0];\n let mainRequest: PerformanceResourceTiming = findMainRequest(\n sorted,\n corsPreFlightRequest[PTN.RESPONSE_END],\n endTimeHR\n );\n\n const responseEnd = corsPreFlightRequest[PTN.RESPONSE_END];\n const fetchStart = mainRequest[PTN.FETCH_START];\n\n // no corsPreFlightRequest\n if (fetchStart < responseEnd) {\n mainRequest = corsPreFlightRequest;\n corsPreFlightRequest = undefined;\n }\n\n return {\n corsPreFlightRequest,\n mainRequest,\n };\n } else {\n return {\n mainRequest: filteredResources[0],\n };\n }\n}\n\n/**\n * Will find the main request skipping the cors pre flight requests\n * @param resources\n * @param corsPreFlightRequestEndTime\n * @param spanEndTimeHR\n */\nfunction findMainRequest(\n resources: PerformanceResourceTiming[],\n corsPreFlightRequestEndTime: number,\n spanEndTimeHR: api.HrTime\n): PerformanceResourceTiming {\n const spanEndTime = hrTimeToNanoseconds(spanEndTimeHR);\n const minTime = hrTimeToNanoseconds(\n timeInputToHrTime(corsPreFlightRequestEndTime)\n );\n\n let mainRequest: PerformanceResourceTiming = resources[1];\n let bestGap;\n\n const length = resources.length;\n for (let i = 1; i < length; i++) {\n const resource = resources[i];\n const resourceStartTime = hrTimeToNanoseconds(\n timeInputToHrTime(resource[PTN.FETCH_START])\n );\n\n const resourceEndTime = hrTimeToNanoseconds(\n timeInputToHrTime(resource[PTN.RESPONSE_END])\n );\n\n const currentGap = spanEndTime - resourceEndTime;\n\n if (resourceStartTime >= minTime && (!bestGap || currentGap < bestGap)) {\n bestGap = currentGap;\n mainRequest = resource;\n }\n }\n return mainRequest;\n}\n\n/**\n * Filter all resources that has started and finished according to span start time and end time.\n * It will return the closest resource to a start time\n * @param spanUrl\n * @param startTimeHR\n * @param endTimeHR\n * @param resources\n * @param ignoredResources\n */\nfunction filterResourcesForSpan(\n spanUrl: string,\n startTimeHR: api.HrTime,\n endTimeHR: api.HrTime,\n resources: PerformanceResourceTiming[],\n ignoredResources: WeakSet<PerformanceResourceTiming>,\n initiatorType?: string\n) {\n const startTime = hrTimeToNanoseconds(startTimeHR);\n const endTime = hrTimeToNanoseconds(endTimeHR);\n let filteredResources = resources.filter(resource => {\n const resourceStartTime = hrTimeToNanoseconds(\n timeInputToHrTime(resource[PTN.FETCH_START])\n );\n const resourceEndTime = hrTimeToNanoseconds(\n timeInputToHrTime(resource[PTN.RESPONSE_END])\n );\n\n return (\n resource.initiatorType.toLowerCase() ===\n (initiatorType || 'xmlhttprequest') &&\n resource.name === spanUrl &&\n resourceStartTime >= startTime &&\n resourceEndTime <= endTime\n );\n });\n\n if (filteredResources.length > 0) {\n filteredResources = filteredResources.filter(resource => {\n return !ignoredResources.has(resource);\n });\n }\n\n return filteredResources;\n}\n\n/**\n * The URLLike interface represents an URL and HTMLAnchorElement compatible fields.\n */\nexport interface URLLike {\n hash: string;\n host: string;\n hostname: string;\n href: string;\n readonly origin: string;\n password: string;\n pathname: string;\n port: string;\n protocol: string;\n search: string;\n username: string;\n}\n\n/**\n * Parses url using URL constructor or fallback to anchor element.\n * @param url\n */\nexport function parseUrl(url: string): URLLike {\n if (typeof URL === 'function') {\n return new URL(\n url,\n typeof document !== 'undefined'\n ? document.baseURI\n : typeof location !== 'undefined' // Some JS runtimes (e.g. Deno) don't define this\n ? location.href\n : undefined\n );\n }\n const element = getUrlNormalizingAnchor();\n element.href = url;\n return element;\n}\n\n/**\n * Parses url using URL constructor or fallback to anchor element and serialize\n * it to a string.\n *\n * Performs the steps described in https://html.spec.whatwg.org/multipage/urls-and-fetching.html#parse-a-url\n *\n * @param url\n */\nexport function normalizeUrl(url: string): string {\n const urlLike = parseUrl(url);\n return urlLike.href;\n}\n\n/**\n * Get element XPath\n * @param target - target element\n * @param optimised - when id attribute of element is present the xpath can be\n * simplified to contain id\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\nexport function getElementXPath(target: any, optimised?: boolean): string {\n if (target.nodeType === Node.DOCUMENT_NODE) {\n return '/';\n }\n const targetValue = getNodeValue(target, optimised);\n if (optimised && targetValue.indexOf('@id') > 0) {\n return targetValue;\n }\n let xpath = '';\n if (target.parentNode) {\n xpath += getElementXPath(target.parentNode, false);\n }\n xpath += targetValue;\n\n return xpath;\n}\n\n/**\n * get node index within the siblings\n * @param target\n */\nfunction getNodeIndex(target: HTMLElement): number {\n if (!target.parentNode) {\n return 0;\n }\n const allowedTypes = [target.nodeType];\n if (target.nodeType === Node.CDATA_SECTION_NODE) {\n allowedTypes.push(Node.TEXT_NODE);\n }\n let elements = Array.from(target.parentNode.childNodes);\n elements = elements.filter((element: Node) => {\n const localName = (element as HTMLElement).localName;\n return (\n allowedTypes.indexOf(element.nodeType) >= 0 &&\n localName === target.localName\n );\n });\n if (elements.length >= 1) {\n return elements.indexOf(target) + 1; // xpath starts from 1\n }\n // if there are no other similar child xpath doesn't need index\n return 0;\n}\n\n/**\n * get node value for xpath\n * @param target\n * @param optimised\n */\nfunction getNodeValue(target: HTMLElement, optimised?: boolean): string {\n const nodeType = target.nodeType;\n const index = getNodeIndex(target);\n let nodeValue = '';\n if (nodeType === Node.ELEMENT_NODE) {\n const id = target.getAttribute('id');\n if (optimised && id) {\n return `//*[@id=\"${id}\"]`;\n }\n nodeValue = target.localName;\n } else if (\n nodeType === Node.TEXT_NODE ||\n nodeType === Node.CDATA_SECTION_NODE\n ) {\n nodeValue = 'text()';\n } else if (nodeType === Node.COMMENT_NODE) {\n nodeValue = 'comment()';\n } else {\n return '';\n }\n // if index is 1 it can be omitted in xpath\n if (nodeValue && index > 1) {\n return `/${nodeValue}[${index}]`;\n }\n return `/${nodeValue}`;\n}\n\n/**\n * Checks if trace headers should be propagated\n * @param spanUrl\n * @private\n */\nexport function shouldPropagateTraceHeaders(\n spanUrl: string,\n propagateTraceHeaderCorsUrls?: PropagateTraceHeaderCorsUrls\n): boolean {\n let propagateTraceHeaderUrls = propagateTraceHeaderCorsUrls || [];\n if (\n typeof propagateTraceHeaderUrls === 'string' ||\n propagateTraceHeaderUrls instanceof RegExp\n ) {\n propagateTraceHeaderUrls = [propagateTraceHeaderUrls];\n }\n const parsedSpanUrl = parseUrl(spanUrl);\n\n if (parsedSpanUrl.origin === getOrigin()) {\n return true;\n } else {\n return propagateTraceHeaderUrls.some(propagateTraceHeaderUrl =>\n urlMatches(spanUrl, propagateTraceHeaderUrl)\n );\n }\n}\n"]}
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "1.30.1";
1
+ export declare const VERSION = "2.0.0-dev.1";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -14,5 +14,5 @@
14
14
  * limitations under the License.
15
15
  */
16
16
  // this is autogenerated file, see scripts/version-update.js
17
- export var VERSION = '1.30.1';
17
+ export const VERSION = '2.0.0-dev.1';
18
18
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,4DAA4D;AAC5D,MAAM,CAAC,IAAM,OAAO,GAAG,QAAQ,CAAC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// this is autogenerated file, see scripts/version-update.js\nexport const VERSION = '1.30.1';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,4DAA4D;AAC5D,MAAM,CAAC,MAAM,OAAO,GAAG,aAAa,CAAC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// this is autogenerated file, see scripts/version-update.js\nexport const VERSION = '2.0.0-dev.1';\n"]}
@@ -19,16 +19,14 @@ import { ROOT_CONTEXT } from '@opentelemetry/api';
19
19
  * it doesn't fully support the async calls though
20
20
  */
21
21
  export class StackContextManager {
22
- constructor() {
23
- /**
24
- * whether the context manager is enabled or not
25
- */
26
- this._enabled = false;
27
- /**
28
- * Keeps the reference to current context
29
- */
30
- this._currentContext = ROOT_CONTEXT;
31
- }
22
+ /**
23
+ * whether the context manager is enabled or not
24
+ */
25
+ _enabled = false;
26
+ /**
27
+ * Keeps the reference to current context
28
+ */
29
+ _currentContext = ROOT_CONTEXT;
32
30
  /**
33
31
  *
34
32
  * @param context
@@ -1 +1 @@
1
- {"version":3,"file":"StackContextManager.js","sourceRoot":"","sources":["../../src/StackContextManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAA2B,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE3E;;;GAGG;AACH,MAAM,OAAO,mBAAmB;IAAhC;QACE;;WAEG;QACK,aAAQ,GAAG,KAAK,CAAC;QAEzB;;WAEG;QACI,oBAAe,GAAG,YAAY,CAAC;IA6FxC,CAAC;IA3FC;;;;OAIG;IACH,wDAAwD;IAChD,aAAa,CACnB,OAAO,GAAG,YAAY,EACtB,MAAS;QAET,MAAM,OAAO,GAAG,IAAI,CAAC;QACrB,MAAM,cAAc,GAAG,UAAyB,GAAG,IAAe;YAChE,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC/D,CAAC,CAAC;QACF,MAAM,CAAC,cAAc,CAAC,cAAc,EAAE,QAAQ,EAAE;YAC9C,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,KAAK;YACf,KAAK,EAAE,MAAM,CAAC,MAAM;SACrB,CAAC,CAAC;QACH,OAAO,cAA8B,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED;;;;;OAKG;IACH,IAAI,CAAI,OAAgB,EAAE,MAAS;QACjC,uEAAuE;QACvE,IAAI,OAAO,KAAK,SAAS,EAAE;YACzB,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;SACzB;QACD,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;YAChC,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;SAC5C;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,CAAC,eAAe,GAAG,YAAY,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,OAAO,IAAI,CAAC;SACb;QACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,eAAe,GAAG,YAAY,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;OAOG;IACH,IAAI,CACF,OAAuB,EACvB,EAAK,EACL,OAA8B,EAC9B,GAAG,IAAO;QAEV,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;QAC7C,IAAI,CAAC,eAAe,GAAG,OAAO,IAAI,YAAY,CAAC;QAE/C,IAAI;YACF,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;SAClC;gBAAS;YACR,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;SACxC;IACH,CAAC;CACF","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Context, ContextManager, ROOT_CONTEXT } from '@opentelemetry/api';\n\n/**\n * Stack Context Manager for managing the state in web\n * it doesn't fully support the async calls though\n */\nexport class StackContextManager implements ContextManager {\n /**\n * whether the context manager is enabled or not\n */\n private _enabled = false;\n\n /**\n * Keeps the reference to current context\n */\n public _currentContext = ROOT_CONTEXT;\n\n /**\n *\n * @param context\n * @param target Function to be executed within the context\n */\n // eslint-disable-next-line @typescript-eslint/ban-types\n private _bindFunction<T extends Function>(\n context = ROOT_CONTEXT,\n target: T\n ): T {\n const manager = this;\n const contextWrapper = function (this: unknown, ...args: unknown[]) {\n return manager.with(context, () => target.apply(this, args));\n };\n Object.defineProperty(contextWrapper, 'length', {\n enumerable: false,\n configurable: true,\n writable: false,\n value: target.length,\n });\n return contextWrapper as unknown as T;\n }\n\n /**\n * Returns the active context\n */\n active(): Context {\n return this._currentContext;\n }\n\n /**\n * Binds a the certain context or the active one to the target function and then returns the target\n * @param context A context (span) to be bind to target\n * @param target a function or event emitter. When target or one of its callbacks is called,\n * the provided context will be used as the active context for the duration of the call.\n */\n bind<T>(context: Context, target: T): T {\n // if no specific context to propagate is given, we use the current one\n if (context === undefined) {\n context = this.active();\n }\n if (typeof target === 'function') {\n return this._bindFunction(context, target);\n }\n return target;\n }\n\n /**\n * Disable the context manager (clears the current context)\n */\n disable(): this {\n this._currentContext = ROOT_CONTEXT;\n this._enabled = false;\n return this;\n }\n\n /**\n * Enables the context manager and creates a default(root) context\n */\n enable(): this {\n if (this._enabled) {\n return this;\n }\n this._enabled = true;\n this._currentContext = ROOT_CONTEXT;\n return this;\n }\n\n /**\n * Calls the callback function [fn] with the provided [context]. If [context] is undefined then it will use the window.\n * The context will be set as active\n * @param context\n * @param fn Callback function\n * @param thisArg optional receiver to be used for calling fn\n * @param args optional arguments forwarded to fn\n */\n with<A extends unknown[], F extends (...args: A) => ReturnType<F>>(\n context: Context | null,\n fn: F,\n thisArg?: ThisParameterType<F>,\n ...args: A\n ): ReturnType<F> {\n const previousContext = this._currentContext;\n this._currentContext = context || ROOT_CONTEXT;\n\n try {\n return fn.call(thisArg, ...args);\n } finally {\n this._currentContext = previousContext;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"StackContextManager.js","sourceRoot":"","sources":["../../src/StackContextManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAA2B,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE3E;;;GAGG;AACH,MAAM,OAAO,mBAAmB;IAC9B;;OAEG;IACK,QAAQ,GAAG,KAAK,CAAC;IAEzB;;OAEG;IACI,eAAe,GAAG,YAAY,CAAC;IAEtC;;;;OAIG;IACH,wDAAwD;IAChD,aAAa,CACnB,OAAO,GAAG,YAAY,EACtB,MAAS;QAET,MAAM,OAAO,GAAG,IAAI,CAAC;QACrB,MAAM,cAAc,GAAG,UAAyB,GAAG,IAAe;YAChE,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC/D,CAAC,CAAC;QACF,MAAM,CAAC,cAAc,CAAC,cAAc,EAAE,QAAQ,EAAE;YAC9C,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,KAAK;YACf,KAAK,EAAE,MAAM,CAAC,MAAM;SACrB,CAAC,CAAC;QACH,OAAO,cAA8B,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED;;;;;OAKG;IACH,IAAI,CAAI,OAAgB,EAAE,MAAS;QACjC,uEAAuE;QACvE,IAAI,OAAO,KAAK,SAAS,EAAE;YACzB,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;SACzB;QACD,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;YAChC,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;SAC5C;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,CAAC,eAAe,GAAG,YAAY,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,OAAO,IAAI,CAAC;SACb;QACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,eAAe,GAAG,YAAY,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;OAOG;IACH,IAAI,CACF,OAAuB,EACvB,EAAK,EACL,OAA8B,EAC9B,GAAG,IAAO;QAEV,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;QAC7C,IAAI,CAAC,eAAe,GAAG,OAAO,IAAI,YAAY,CAAC;QAE/C,IAAI;YACF,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;SAClC;gBAAS;YACR,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;SACxC;IACH,CAAC;CACF","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Context, ContextManager, ROOT_CONTEXT } from '@opentelemetry/api';\n\n/**\n * Stack Context Manager for managing the state in web\n * it doesn't fully support the async calls though\n */\nexport class StackContextManager implements ContextManager {\n /**\n * whether the context manager is enabled or not\n */\n private _enabled = false;\n\n /**\n * Keeps the reference to current context\n */\n public _currentContext = ROOT_CONTEXT;\n\n /**\n *\n * @param context\n * @param target Function to be executed within the context\n */\n // eslint-disable-next-line @typescript-eslint/ban-types\n private _bindFunction<T extends Function>(\n context = ROOT_CONTEXT,\n target: T\n ): T {\n const manager = this;\n const contextWrapper = function (this: unknown, ...args: unknown[]) {\n return manager.with(context, () => target.apply(this, args));\n };\n Object.defineProperty(contextWrapper, 'length', {\n enumerable: false,\n configurable: true,\n writable: false,\n value: target.length,\n });\n return contextWrapper as unknown as T;\n }\n\n /**\n * Returns the active context\n */\n active(): Context {\n return this._currentContext;\n }\n\n /**\n * Binds a the certain context or the active one to the target function and then returns the target\n * @param context A context (span) to be bind to target\n * @param target a function or event emitter. When target or one of its callbacks is called,\n * the provided context will be used as the active context for the duration of the call.\n */\n bind<T>(context: Context, target: T): T {\n // if no specific context to propagate is given, we use the current one\n if (context === undefined) {\n context = this.active();\n }\n if (typeof target === 'function') {\n return this._bindFunction(context, target);\n }\n return target;\n }\n\n /**\n * Disable the context manager (clears the current context)\n */\n disable(): this {\n this._currentContext = ROOT_CONTEXT;\n this._enabled = false;\n return this;\n }\n\n /**\n * Enables the context manager and creates a default(root) context\n */\n enable(): this {\n if (this._enabled) {\n return this;\n }\n this._enabled = true;\n this._currentContext = ROOT_CONTEXT;\n return this;\n }\n\n /**\n * Calls the callback function [fn] with the provided [context]. If [context] is undefined then it will use the window.\n * The context will be set as active\n * @param context\n * @param fn Callback function\n * @param thisArg optional receiver to be used for calling fn\n * @param args optional arguments forwarded to fn\n */\n with<A extends unknown[], F extends (...args: A) => ReturnType<F>>(\n context: Context | null,\n fn: F,\n thisArg?: ThisParameterType<F>,\n ...args: A\n ): ReturnType<F> {\n const previousContext = this._currentContext;\n this._currentContext = context || ROOT_CONTEXT;\n\n try {\n return fn.call(thisArg, ...args);\n } finally {\n this._currentContext = previousContext;\n }\n }\n}\n"]}
@@ -2,7 +2,7 @@ import { BasicTracerProvider, SDKRegistrationConfig, TracerConfig } from '@opent
2
2
  /**
3
3
  * WebTracerConfig provides an interface for configuring a Web Tracer.
4
4
  */
5
- export declare type WebTracerConfig = TracerConfig;
5
+ export type WebTracerConfig = TracerConfig;
6
6
  /**
7
7
  * This class represents a web tracer with {@link StackContextManager}
8
8
  */
@@ -15,6 +15,40 @@
15
15
  */
16
16
  import { BasicTracerProvider, } from '@opentelemetry/sdk-trace-base';
17
17
  import { StackContextManager } from './StackContextManager';
18
+ import { trace, context, propagation, } from '@opentelemetry/api';
19
+ import { CompositePropagator, W3CBaggagePropagator, W3CTraceContextPropagator, } from '@opentelemetry/core';
20
+ function setupContextManager(contextManager) {
21
+ // null means 'do not register'
22
+ if (contextManager === null) {
23
+ return;
24
+ }
25
+ // undefined means 'register default'
26
+ if (contextManager === undefined) {
27
+ const defaultContextManager = new StackContextManager();
28
+ defaultContextManager.enable();
29
+ context.setGlobalContextManager(defaultContextManager);
30
+ return;
31
+ }
32
+ contextManager.enable();
33
+ context.setGlobalContextManager(contextManager);
34
+ }
35
+ function setupPropagator(propagator) {
36
+ // null means 'do not register'
37
+ if (propagator === null) {
38
+ return;
39
+ }
40
+ // undefined means 'register default'
41
+ if (propagator === undefined) {
42
+ propagation.setGlobalPropagator(new CompositePropagator({
43
+ propagators: [
44
+ new W3CTraceContextPropagator(),
45
+ new W3CBaggagePropagator(),
46
+ ],
47
+ }));
48
+ return;
49
+ }
50
+ propagation.setGlobalPropagator(propagator);
51
+ }
18
52
  /**
19
53
  * This class represents a web tracer with {@link StackContextManager}
20
54
  */
@@ -25,13 +59,6 @@ export class WebTracerProvider extends BasicTracerProvider {
25
59
  */
26
60
  constructor(config = {}) {
27
61
  super(config);
28
- if (config.contextManager) {
29
- throw ('contextManager should be defined in register method not in' +
30
- ' constructor');
31
- }
32
- if (config.propagator) {
33
- throw 'propagator should be defined in register method not in constructor';
34
- }
35
62
  }
36
63
  /**
37
64
  * Register this TracerProvider for use with the OpenTelemetry API.
@@ -41,13 +68,9 @@ export class WebTracerProvider extends BasicTracerProvider {
41
68
  * @param config Configuration object for SDK registration
42
69
  */
43
70
  register(config = {}) {
44
- if (config.contextManager === undefined) {
45
- config.contextManager = new StackContextManager();
46
- }
47
- if (config.contextManager) {
48
- config.contextManager.enable();
49
- }
50
- super.register(config);
71
+ trace.setGlobalTracerProvider(this);
72
+ setupPropagator(config.propagator);
73
+ setupContextManager(config.contextManager);
51
74
  }
52
75
  }
53
76
  //# sourceMappingURL=WebTracerProvider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WebTracerProvider.js","sourceRoot":"","sources":["../../src/WebTracerProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,mBAAmB,GAGpB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAO5D;;GAEG;AACH,MAAM,OAAO,iBAAkB,SAAQ,mBAAmB;IACxD;;;OAGG;IACH,YAAY,SAA0B,EAAE;QACtC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEd,IAAK,MAAgC,CAAC,cAAc,EAAE;YACpD,MAAM,CACJ,4DAA4D;gBAC5D,cAAc,CACf,CAAC;SACH;QACD,IAAK,MAAgC,CAAC,UAAU,EAAE;YAChD,MAAM,oEAAoE,CAAC;SAC5E;IACH,CAAC;IAED;;;;;;OAMG;IACM,QAAQ,CAAC,SAAgC,EAAE;QAClD,IAAI,MAAM,CAAC,cAAc,KAAK,SAAS,EAAE;YACvC,MAAM,CAAC,cAAc,GAAG,IAAI,mBAAmB,EAAE,CAAC;SACnD;QACD,IAAI,MAAM,CAAC,cAAc,EAAE;YACzB,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;SAChC;QAED,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;CACF","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n BasicTracerProvider,\n SDKRegistrationConfig,\n TracerConfig,\n} from '@opentelemetry/sdk-trace-base';\nimport { StackContextManager } from './StackContextManager';\n\n/**\n * WebTracerConfig provides an interface for configuring a Web Tracer.\n */\nexport type WebTracerConfig = TracerConfig;\n\n/**\n * This class represents a web tracer with {@link StackContextManager}\n */\nexport class WebTracerProvider extends BasicTracerProvider {\n /**\n * Constructs a new Tracer instance.\n * @param config Web Tracer config\n */\n constructor(config: WebTracerConfig = {}) {\n super(config);\n\n if ((config as SDKRegistrationConfig).contextManager) {\n throw (\n 'contextManager should be defined in register method not in' +\n ' constructor'\n );\n }\n if ((config as SDKRegistrationConfig).propagator) {\n throw 'propagator should be defined in register method not in constructor';\n }\n }\n\n /**\n * Register this TracerProvider for use with the OpenTelemetry API.\n * Undefined values may be replaced with defaults, and\n * null values will be skipped.\n *\n * @param config Configuration object for SDK registration\n */\n override register(config: SDKRegistrationConfig = {}): void {\n if (config.contextManager === undefined) {\n config.contextManager = new StackContextManager();\n }\n if (config.contextManager) {\n config.contextManager.enable();\n }\n\n super.register(config);\n }\n}\n"]}
1
+ {"version":3,"file":"WebTracerProvider.js","sourceRoot":"","sources":["../../src/WebTracerProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,mBAAmB,GAGpB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EACL,KAAK,EACL,OAAO,EAEP,WAAW,GAEZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,qBAAqB,CAAC;AAE7B,SAAS,mBAAmB,CAC1B,cAAiD;IAEjD,+BAA+B;IAC/B,IAAI,cAAc,KAAK,IAAI,EAAE;QAC3B,OAAO;KACR;IAED,qCAAqC;IACrC,IAAI,cAAc,KAAK,SAAS,EAAE;QAChC,MAAM,qBAAqB,GAAG,IAAI,mBAAmB,EAAE,CAAC;QACxD,qBAAqB,CAAC,MAAM,EAAE,CAAC;QAC/B,OAAO,CAAC,uBAAuB,CAAC,qBAAqB,CAAC,CAAC;QACvD,OAAO;KACR;IAED,cAAc,CAAC,MAAM,EAAE,CAAC;IACxB,OAAO,CAAC,uBAAuB,CAAC,cAAc,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,eAAe,CAAC,UAAgD;IACvE,+BAA+B;IAC/B,IAAI,UAAU,KAAK,IAAI,EAAE;QACvB,OAAO;KACR;IAED,qCAAqC;IACrC,IAAI,UAAU,KAAK,SAAS,EAAE;QAC5B,WAAW,CAAC,mBAAmB,CAC7B,IAAI,mBAAmB,CAAC;YACtB,WAAW,EAAE;gBACX,IAAI,yBAAyB,EAAE;gBAC/B,IAAI,oBAAoB,EAAE;aAC3B;SACF,CAAC,CACH,CAAC;QACF,OAAO;KACR;IAED,WAAW,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;AAC9C,CAAC;AAOD;;GAEG;AACH,MAAM,OAAO,iBAAkB,SAAQ,mBAAmB;IACxD;;;OAGG;IACH,YAAY,SAA0B,EAAE;QACtC,KAAK,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;IAED;;;;;;OAMG;IACH,QAAQ,CAAC,SAAgC,EAAE;QACzC,KAAK,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;QACpC,eAAe,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACnC,mBAAmB,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAC7C,CAAC;CACF","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n BasicTracerProvider,\n SDKRegistrationConfig,\n TracerConfig,\n} from '@opentelemetry/sdk-trace-base';\nimport { StackContextManager } from './StackContextManager';\nimport {\n trace,\n context,\n ContextManager,\n propagation,\n TextMapPropagator,\n} from '@opentelemetry/api';\nimport {\n CompositePropagator,\n W3CBaggagePropagator,\n W3CTraceContextPropagator,\n} from '@opentelemetry/core';\n\nfunction setupContextManager(\n contextManager: ContextManager | null | undefined\n) {\n // null means 'do not register'\n if (contextManager === null) {\n return;\n }\n\n // undefined means 'register default'\n if (contextManager === undefined) {\n const defaultContextManager = new StackContextManager();\n defaultContextManager.enable();\n context.setGlobalContextManager(defaultContextManager);\n return;\n }\n\n contextManager.enable();\n context.setGlobalContextManager(contextManager);\n}\n\nfunction setupPropagator(propagator: TextMapPropagator | null | undefined) {\n // null means 'do not register'\n if (propagator === null) {\n return;\n }\n\n // undefined means 'register default'\n if (propagator === undefined) {\n propagation.setGlobalPropagator(\n new CompositePropagator({\n propagators: [\n new W3CTraceContextPropagator(),\n new W3CBaggagePropagator(),\n ],\n })\n );\n return;\n }\n\n propagation.setGlobalPropagator(propagator);\n}\n\n/**\n * WebTracerConfig provides an interface for configuring a Web Tracer.\n */\nexport type WebTracerConfig = TracerConfig;\n\n/**\n * This class represents a web tracer with {@link StackContextManager}\n */\nexport class WebTracerProvider extends BasicTracerProvider {\n /**\n * Constructs a new Tracer instance.\n * @param config Web Tracer config\n */\n constructor(config: WebTracerConfig = {}) {\n super(config);\n }\n\n /**\n * Register this TracerProvider for use with the OpenTelemetry API.\n * Undefined values may be replaced with defaults, and\n * null values will be skipped.\n *\n * @param config Configuration object for SDK registration\n */\n register(config: SDKRegistrationConfig = {}): void {\n trace.setGlobalTracerProvider(this);\n setupPropagator(config.propagator);\n setupContextManager(config.contextManager);\n }\n}\n"]}
@@ -19,6 +19,7 @@ export declare enum PerformanceTimingNames {
19
19
  RESPONSE_END = "responseEnd",
20
20
  RESPONSE_START = "responseStart",
21
21
  SECURE_CONNECTION_START = "secureConnectionStart",
22
+ START_TIME = "startTime",
22
23
  UNLOAD_EVENT_END = "unloadEventEnd",
23
24
  UNLOAD_EVENT_START = "unloadEventStart"
24
25
  }
@@ -35,6 +35,7 @@ export var PerformanceTimingNames;
35
35
  PerformanceTimingNames["RESPONSE_END"] = "responseEnd";
36
36
  PerformanceTimingNames["RESPONSE_START"] = "responseStart";
37
37
  PerformanceTimingNames["SECURE_CONNECTION_START"] = "secureConnectionStart";
38
+ PerformanceTimingNames["START_TIME"] = "startTime";
38
39
  PerformanceTimingNames["UNLOAD_EVENT_END"] = "unloadEventEnd";
39
40
  PerformanceTimingNames["UNLOAD_EVENT_START"] = "unloadEventStart";
40
41
  })(PerformanceTimingNames || (PerformanceTimingNames = {}));
@@ -1 +1 @@
1
- {"version":3,"file":"PerformanceTimingNames.js","sourceRoot":"","sources":["../../../src/enums/PerformanceTimingNames.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,CAAN,IAAY,sBAuBX;AAvBD,WAAY,sBAAsB;IAChC,oDAA0B,CAAA;IAC1B,wDAA8B,CAAA;IAC9B,+DAAqC,CAAA;IACrC,sDAA4B,CAAA;IAC5B,mFAAyD,CAAA;IACzD,uFAA6D,CAAA;IAC7D,4DAAkC,CAAA;IAClC,+DAAqC,CAAA;IACrC,mEAAyC,CAAA;IACzC,+DAAqC,CAAA;IACrC,oDAA0B,CAAA;IAC1B,yDAA+B,CAAA;IAC/B,6DAAmC,CAAA;IACnC,8DAAoC,CAAA;IACpC,sDAA4B,CAAA;IAC5B,0DAAgC,CAAA;IAChC,wDAA8B,CAAA;IAC9B,sDAA4B,CAAA;IAC5B,0DAAgC,CAAA;IAChC,2EAAiD,CAAA;IACjD,6DAAmC,CAAA;IACnC,iEAAuC,CAAA;AACzC,CAAC,EAvBW,sBAAsB,KAAtB,sBAAsB,QAuBjC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport enum PerformanceTimingNames {\n CONNECT_END = 'connectEnd',\n CONNECT_START = 'connectStart',\n DECODED_BODY_SIZE = 'decodedBodySize',\n DOM_COMPLETE = 'domComplete',\n DOM_CONTENT_LOADED_EVENT_END = 'domContentLoadedEventEnd',\n DOM_CONTENT_LOADED_EVENT_START = 'domContentLoadedEventStart',\n DOM_INTERACTIVE = 'domInteractive',\n DOMAIN_LOOKUP_END = 'domainLookupEnd',\n DOMAIN_LOOKUP_START = 'domainLookupStart',\n ENCODED_BODY_SIZE = 'encodedBodySize',\n FETCH_START = 'fetchStart',\n LOAD_EVENT_END = 'loadEventEnd',\n LOAD_EVENT_START = 'loadEventStart',\n NAVIGATION_START = 'navigationStart',\n REDIRECT_END = 'redirectEnd',\n REDIRECT_START = 'redirectStart',\n REQUEST_START = 'requestStart',\n RESPONSE_END = 'responseEnd',\n RESPONSE_START = 'responseStart',\n SECURE_CONNECTION_START = 'secureConnectionStart',\n UNLOAD_EVENT_END = 'unloadEventEnd',\n UNLOAD_EVENT_START = 'unloadEventStart',\n}\n"]}
1
+ {"version":3,"file":"PerformanceTimingNames.js","sourceRoot":"","sources":["../../../src/enums/PerformanceTimingNames.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,CAAN,IAAY,sBAwBX;AAxBD,WAAY,sBAAsB;IAChC,oDAA0B,CAAA;IAC1B,wDAA8B,CAAA;IAC9B,+DAAqC,CAAA;IACrC,sDAA4B,CAAA;IAC5B,mFAAyD,CAAA;IACzD,uFAA6D,CAAA;IAC7D,4DAAkC,CAAA;IAClC,+DAAqC,CAAA;IACrC,mEAAyC,CAAA;IACzC,+DAAqC,CAAA;IACrC,oDAA0B,CAAA;IAC1B,yDAA+B,CAAA;IAC/B,6DAAmC,CAAA;IACnC,8DAAoC,CAAA;IACpC,sDAA4B,CAAA;IAC5B,0DAAgC,CAAA;IAChC,wDAA8B,CAAA;IAC9B,sDAA4B,CAAA;IAC5B,0DAAgC,CAAA;IAChC,2EAAiD,CAAA;IACjD,kDAAwB,CAAA;IACxB,6DAAmC,CAAA;IACnC,iEAAuC,CAAA;AACzC,CAAC,EAxBW,sBAAsB,KAAtB,sBAAsB,QAwBjC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport enum PerformanceTimingNames {\n CONNECT_END = 'connectEnd',\n CONNECT_START = 'connectStart',\n DECODED_BODY_SIZE = 'decodedBodySize',\n DOM_COMPLETE = 'domComplete',\n DOM_CONTENT_LOADED_EVENT_END = 'domContentLoadedEventEnd',\n DOM_CONTENT_LOADED_EVENT_START = 'domContentLoadedEventStart',\n DOM_INTERACTIVE = 'domInteractive',\n DOMAIN_LOOKUP_END = 'domainLookupEnd',\n DOMAIN_LOOKUP_START = 'domainLookupStart',\n ENCODED_BODY_SIZE = 'encodedBodySize',\n FETCH_START = 'fetchStart',\n LOAD_EVENT_END = 'loadEventEnd',\n LOAD_EVENT_START = 'loadEventStart',\n NAVIGATION_START = 'navigationStart',\n REDIRECT_END = 'redirectEnd',\n REDIRECT_START = 'redirectStart',\n REQUEST_START = 'requestStart',\n RESPONSE_END = 'responseEnd',\n RESPONSE_START = 'responseStart',\n SECURE_CONNECTION_START = 'secureConnectionStart',\n START_TIME = 'startTime',\n UNLOAD_EVENT_END = 'unloadEventEnd',\n UNLOAD_EVENT_START = 'unloadEventStart',\n}\n"]}