@opentelemetry/browser-instrumentation 0.2.0 → 0.4.0

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 (35) hide show
  1. package/README.md +115 -0
  2. package/dist/console/index.d.ts +3 -0
  3. package/dist/console/index.js +2 -0
  4. package/dist/console/instrumentation.d.ts +21 -0
  5. package/dist/console/instrumentation.js +84 -0
  6. package/dist/console/instrumentation.js.map +1 -0
  7. package/dist/console/semconv.js +14 -0
  8. package/dist/console/semconv.js.map +1 -0
  9. package/dist/console/types.d.ts +25 -0
  10. package/dist/navigation/index.d.ts +4 -0
  11. package/dist/navigation/index.js +3 -0
  12. package/dist/navigation/instrumentation.d.ts +29 -0
  13. package/dist/navigation/instrumentation.js +156 -0
  14. package/dist/navigation/instrumentation.js.map +1 -0
  15. package/dist/navigation/semconv.js +22 -0
  16. package/dist/navigation/semconv.js.map +1 -0
  17. package/dist/navigation/types.d.ts +21 -0
  18. package/dist/navigation/utils.d.ts +12 -0
  19. package/dist/navigation/utils.js +77 -0
  20. package/dist/navigation/utils.js.map +1 -0
  21. package/dist/navigation-timing/semconv.js +24 -24
  22. package/dist/navigation-timing/semconv.js.map +1 -1
  23. package/dist/package.js +1 -1
  24. package/dist/resource-timing/idle-callback-shim.js +35 -0
  25. package/dist/resource-timing/idle-callback-shim.js.map +1 -0
  26. package/dist/resource-timing/index.d.ts +3 -0
  27. package/dist/resource-timing/index.js +2 -0
  28. package/dist/resource-timing/instrumentation.d.ts +33 -0
  29. package/dist/resource-timing/instrumentation.js +160 -0
  30. package/dist/resource-timing/instrumentation.js.map +1 -0
  31. package/dist/resource-timing/semconv.js +131 -0
  32. package/dist/resource-timing/semconv.js.map +1 -0
  33. package/dist/resource-timing/types.d.ts +38 -0
  34. package/dist/utils/getElementCSSSelector.js.map +1 -1
  35. package/package.json +14 -8
@@ -0,0 +1,131 @@
1
+ //#region src/resource-timing/semconv.ts
2
+ /**
3
+ * Event name for resource timing
4
+ *
5
+ * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.
6
+ */
7
+ const RESOURCE_TIMING_EVENT_NAME = "browser.resource_timing";
8
+ /**
9
+ * The URL of the resource
10
+ *
11
+ * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.
12
+ */
13
+ const ATTR_RESOURCE_URL = "url.full";
14
+ /**
15
+ * The type of resource (script, stylesheet, img, xmlhttprequest, fetch, etc.)
16
+ *
17
+ * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.
18
+ */
19
+ const ATTR_RESOURCE_INITIATOR_TYPE = "browser.resource_timing.initiator_type";
20
+ /**
21
+ * Total duration of the resource load (in milliseconds)
22
+ *
23
+ * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.
24
+ */
25
+ const ATTR_RESOURCE_DURATION = "browser.resource_timing.duration";
26
+ /**
27
+ * Start time of the resource fetch (relative to navigation start)
28
+ *
29
+ * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.
30
+ */
31
+ const ATTR_RESOURCE_FETCH_START = "browser.resource_timing.fetch_start";
32
+ /**
33
+ * Domain lookup start time
34
+ *
35
+ * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.
36
+ */
37
+ const ATTR_RESOURCE_DOMAIN_LOOKUP_START = "browser.resource_timing.domain_lookup_start";
38
+ /**
39
+ * Domain lookup end time
40
+ *
41
+ * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.
42
+ */
43
+ const ATTR_RESOURCE_DOMAIN_LOOKUP_END = "browser.resource_timing.domain_lookup_end";
44
+ /**
45
+ * Connection start time
46
+ *
47
+ * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.
48
+ */
49
+ const ATTR_RESOURCE_CONNECT_START = "browser.resource_timing.connect_start";
50
+ /**
51
+ * Connection end time
52
+ *
53
+ * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.
54
+ */
55
+ const ATTR_RESOURCE_CONNECT_END = "browser.resource_timing.connect_end";
56
+ /**
57
+ * Secure connection start time (HTTPS)
58
+ *
59
+ * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.
60
+ */
61
+ const ATTR_RESOURCE_SECURE_CONNECTION_START = "browser.resource_timing.secure_connection_start";
62
+ /**
63
+ * Request start time
64
+ *
65
+ * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.
66
+ */
67
+ const ATTR_RESOURCE_REQUEST_START = "browser.resource_timing.request_start";
68
+ /**
69
+ * Response start time
70
+ *
71
+ * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.
72
+ */
73
+ const ATTR_RESOURCE_RESPONSE_START = "browser.resource_timing.response_start";
74
+ /**
75
+ * Response end time
76
+ *
77
+ * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.
78
+ */
79
+ const ATTR_RESOURCE_RESPONSE_END = "browser.resource_timing.response_end";
80
+ /**
81
+ * Transfer size in bytes (including headers)
82
+ *
83
+ * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.
84
+ */
85
+ const ATTR_RESOURCE_TRANSFER_SIZE = "browser.resource_timing.transfer_size";
86
+ /**
87
+ * Encoded body size in bytes (compressed)
88
+ *
89
+ * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.
90
+ */
91
+ const ATTR_RESOURCE_ENCODED_BODY_SIZE = "browser.resource_timing.encoded_body_size";
92
+ /**
93
+ * Decoded body size in bytes (uncompressed)
94
+ *
95
+ * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.
96
+ */
97
+ const ATTR_RESOURCE_DECODED_BODY_SIZE = "browser.resource_timing.decoded_body_size";
98
+ /**
99
+ * Redirect start time
100
+ *
101
+ * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.
102
+ */
103
+ const ATTR_RESOURCE_REDIRECT_START = "browser.resource_timing.redirect_start";
104
+ /**
105
+ * Redirect end time
106
+ *
107
+ * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.
108
+ */
109
+ const ATTR_RESOURCE_REDIRECT_END = "browser.resource_timing.redirect_end";
110
+ /**
111
+ * Worker start time (for Service Worker interception)
112
+ *
113
+ * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.
114
+ */
115
+ const ATTR_RESOURCE_WORKER_START = "browser.resource_timing.worker_start";
116
+ /**
117
+ * Next hop protocol (h2, h3, http/1.1, etc.)
118
+ *
119
+ * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.
120
+ */
121
+ const ATTR_RESOURCE_NEXT_HOP_PROTOCOL = "browser.resource_timing.next_hop_protocol";
122
+ /**
123
+ * Render blocking status (blocking, non-blocking)
124
+ *
125
+ * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.
126
+ */
127
+ const ATTR_RESOURCE_RENDER_BLOCKING_STATUS = "browser.resource_timing.render_blocking_status";
128
+ //#endregion
129
+ export { ATTR_RESOURCE_CONNECT_END, ATTR_RESOURCE_CONNECT_START, ATTR_RESOURCE_DECODED_BODY_SIZE, ATTR_RESOURCE_DOMAIN_LOOKUP_END, ATTR_RESOURCE_DOMAIN_LOOKUP_START, ATTR_RESOURCE_DURATION, ATTR_RESOURCE_ENCODED_BODY_SIZE, ATTR_RESOURCE_FETCH_START, ATTR_RESOURCE_INITIATOR_TYPE, ATTR_RESOURCE_NEXT_HOP_PROTOCOL, ATTR_RESOURCE_REDIRECT_END, ATTR_RESOURCE_REDIRECT_START, ATTR_RESOURCE_RENDER_BLOCKING_STATUS, ATTR_RESOURCE_REQUEST_START, ATTR_RESOURCE_RESPONSE_END, ATTR_RESOURCE_RESPONSE_START, ATTR_RESOURCE_SECURE_CONNECTION_START, ATTR_RESOURCE_TRANSFER_SIZE, ATTR_RESOURCE_URL, ATTR_RESOURCE_WORKER_START, RESOURCE_TIMING_EVENT_NAME };
130
+
131
+ //# sourceMappingURL=semconv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semconv.js","names":[],"sources":["../../src/resource-timing/semconv.ts"],"sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/*\n * This file contains a copy of unstable semantic convention definitions\n * used by this package.\n * @see https://github.com/open-telemetry/opentelemetry-js/tree/main/semantic-conventions#unstable-semconv\n */\n\n/**\n * Event name for resource timing\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n */\nexport const RESOURCE_TIMING_EVENT_NAME = 'browser.resource_timing';\n\n// Resource timing attributes\n\n/**\n * The URL of the resource\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n */\nexport const ATTR_RESOURCE_URL = 'url.full';\n\n/**\n * The type of resource (script, stylesheet, img, xmlhttprequest, fetch, etc.)\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n */\nexport const ATTR_RESOURCE_INITIATOR_TYPE =\n 'browser.resource_timing.initiator_type';\n\n/**\n * Total duration of the resource load (in milliseconds)\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n */\nexport const ATTR_RESOURCE_DURATION = 'browser.resource_timing.duration';\n\n/**\n * Start time of the resource fetch (relative to navigation start)\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n */\nexport const ATTR_RESOURCE_FETCH_START = 'browser.resource_timing.fetch_start';\n\n/**\n * Domain lookup start time\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n */\nexport const ATTR_RESOURCE_DOMAIN_LOOKUP_START =\n 'browser.resource_timing.domain_lookup_start';\n\n/**\n * Domain lookup end time\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n */\nexport const ATTR_RESOURCE_DOMAIN_LOOKUP_END =\n 'browser.resource_timing.domain_lookup_end';\n\n/**\n * Connection start time\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n */\nexport const ATTR_RESOURCE_CONNECT_START =\n 'browser.resource_timing.connect_start';\n\n/**\n * Connection end time\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n */\nexport const ATTR_RESOURCE_CONNECT_END = 'browser.resource_timing.connect_end';\n\n/**\n * Secure connection start time (HTTPS)\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n */\nexport const ATTR_RESOURCE_SECURE_CONNECTION_START =\n 'browser.resource_timing.secure_connection_start';\n\n/**\n * Request start time\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n */\nexport const ATTR_RESOURCE_REQUEST_START =\n 'browser.resource_timing.request_start';\n\n/**\n * Response start time\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n */\nexport const ATTR_RESOURCE_RESPONSE_START =\n 'browser.resource_timing.response_start';\n\n/**\n * Response end time\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n */\nexport const ATTR_RESOURCE_RESPONSE_END =\n 'browser.resource_timing.response_end';\n\n/**\n * Transfer size in bytes (including headers)\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n */\nexport const ATTR_RESOURCE_TRANSFER_SIZE =\n 'browser.resource_timing.transfer_size';\n\n/**\n * Encoded body size in bytes (compressed)\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n */\nexport const ATTR_RESOURCE_ENCODED_BODY_SIZE =\n 'browser.resource_timing.encoded_body_size';\n\n/**\n * Decoded body size in bytes (uncompressed)\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n */\nexport const ATTR_RESOURCE_DECODED_BODY_SIZE =\n 'browser.resource_timing.decoded_body_size';\n\n/**\n * Redirect start time\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n */\nexport const ATTR_RESOURCE_REDIRECT_START =\n 'browser.resource_timing.redirect_start';\n\n/**\n * Redirect end time\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n */\nexport const ATTR_RESOURCE_REDIRECT_END =\n 'browser.resource_timing.redirect_end';\n\n/**\n * Worker start time (for Service Worker interception)\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n */\nexport const ATTR_RESOURCE_WORKER_START =\n 'browser.resource_timing.worker_start';\n\n/**\n * Next hop protocol (h2, h3, http/1.1, etc.)\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n */\nexport const ATTR_RESOURCE_NEXT_HOP_PROTOCOL =\n 'browser.resource_timing.next_hop_protocol';\n\n/**\n * Render blocking status (blocking, non-blocking)\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n */\nexport const ATTR_RESOURCE_RENDER_BLOCKING_STATUS =\n 'browser.resource_timing.render_blocking_status';\n"],"mappings":";;;;;;AAgBA,MAAa,6BAA6B;;;;;;AAS1C,MAAa,oBAAoB;;;;;;AAOjC,MAAa,+BACX;;;;;;AAOF,MAAa,yBAAyB;;;;;;AAOtC,MAAa,4BAA4B;;;;;;AAOzC,MAAa,oCACX;;;;;;AAOF,MAAa,kCACX;;;;;;AAOF,MAAa,8BACX;;;;;;AAOF,MAAa,4BAA4B;;;;;;AAOzC,MAAa,wCACX;;;;;;AAOF,MAAa,8BACX;;;;;;AAOF,MAAa,+BACX;;;;;;AAOF,MAAa,6BACX;;;;;;AAOF,MAAa,8BACX;;;;;;AAOF,MAAa,kCACX;;;;;;AAOF,MAAa,kCACX;;;;;;AAOF,MAAa,+BACX;;;;;;AAOF,MAAa,6BACX;;;;;;AAOF,MAAa,6BACX;;;;;;AAOF,MAAa,kCACX;;;;;;AAOF,MAAa,uCACX"}
@@ -0,0 +1,38 @@
1
+ import { InstrumentationConfig } from "@opentelemetry/instrumentation";
2
+
3
+ //#region src/resource-timing/types.d.ts
4
+ /**
5
+ * ResourceTimingInstrumentation Configuration
6
+ */
7
+ interface ResourceTimingInstrumentationConfig extends InstrumentationConfig {
8
+ /**
9
+ * Number of resources to process per batch.
10
+ * Default: 50
11
+ */
12
+ batchSize?: number;
13
+ /**
14
+ * Maximum time in milliseconds to wait for an idle callback before forcing processing.
15
+ * Default: 1000
16
+ */
17
+ forceProcessingAfter?: number;
18
+ /**
19
+ * Maximum time in milliseconds to spend processing resources per idle callback.
20
+ * Default: 50
21
+ */
22
+ maxProcessingTime?: number;
23
+ /**
24
+ * Maximum number of resources to queue before forcing immediate flush.
25
+ * Default: 1000
26
+ */
27
+ maxQueueSize?: number;
28
+ /**
29
+ * Filter which resource types to capture by their initiator type
30
+ * (e.g. 'xmlhttprequest', 'fetch', 'script', 'link', 'img', 'css', etc.).
31
+ * When set, only entries whose initiatorType matches one of the listed values
32
+ * are captured. When unset, all resource entries are captured.
33
+ */
34
+ initiatorTypes?: string[];
35
+ }
36
+ //#endregion
37
+ export { ResourceTimingInstrumentationConfig };
38
+ //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getElementCSSSelector.js","names":[],"sources":["../../src/utils/getElementCSSSelector.ts"],"sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\ntype GetElementCSSSelectorOptions = {\n /**\n * If true, the function will attempt to use element ID to create condensed CSS selector.\n */\n useIdForTargetElement?: boolean;\n /**\n * If true, the function will attempt to use element ID for all ancestor elements to create condensed CSS selector.\n */\n useIdForAncestors?: boolean;\n};\n\n/**\n * Generates the CSS selector of a given element in the DOM tree.\n *\n * @example #main > div:nth-child(2) > button.submit\n * @example #unique-id\n */\nexport const getElementCSSSelector = (\n element: Node,\n {\n useIdForTargetElement = false,\n useIdForAncestors = false,\n }: GetElementCSSSelectorOptions = {},\n): string => {\n // Handle document node\n if (element.nodeType === Node.DOCUMENT_NODE) {\n return '';\n }\n\n const htmlElement = element as HTMLElement;\n const nodeValue = getNodeSelector(\n htmlElement,\n useIdForTargetElement || useIdForAncestors,\n );\n\n // If optimized and found an ID selector, stop recursion early\n if (nodeValue.startsWith('#')) {\n return nodeValue;\n }\n\n const parent = htmlElement.parentElement;\n const parentSelector = parent\n ? getElementCSSSelector(parent, {\n useIdForAncestors,\n useIdForTargetElement: false,\n })\n : '';\n\n return parentSelector ? `${parentSelector} > ${nodeValue}` : nodeValue;\n};\n\nconst getNodeSelector = (element: Node, useElementId = false): string => {\n if (element.nodeType !== Node.ELEMENT_NODE) {\n return '';\n }\n\n const htmlElement = element as HTMLElement;\n const id = htmlElement.getAttribute('id');\n\n // Use ID if requested and it's unique\n if (useElementId && id) {\n // Check if ID is unique in the document\n const elementsWithSameId = htmlElement.ownerDocument.querySelectorAll(\n `#${CSS.escape(id)}`,\n );\n\n if (elementsWithSameId.length === 1) {\n return `#${CSS.escape(id)}`;\n }\n }\n\n let selector = getFullClassSelector(htmlElement);\n // Add nth-child if there are siblings with the same tag and classes\n const index = getNthChild(htmlElement);\n\n if (index > 0) {\n selector += `:nth-child(${index})`;\n }\n\n return selector;\n};\n\nconst getNthChild = (element: HTMLElement): number => {\n // parentElement is needed to access children\n if (!element.parentElement) {\n return 0;\n }\n\n const selector = getFullClassSelector(element);\n\n // Get all siblings that match the same selector\n const siblings = Array.from(element.parentElement.children).filter(\n (sibling) => getFullClassSelector(sibling) === selector,\n );\n\n // Only add nth-child if there are multiple matching siblings\n if (siblings.length > 1) {\n return siblings.indexOf(element) + 1;\n }\n\n return 0;\n};\n\nconst getFullClassSelector = (element: Element): string =>\n element.localName +\n (element.classList.length > 0\n ? Array.from(element.classList)\n .map((cls) => `.${CSS.escape(cls)}`)\n .join('')\n : '');\n"],"mappings":";;;;;;;AAsBA,MAAa,yBACX,SACA,EACE,wBAAwB,OACxB,oBAAoB,UACY,EAAE,KACzB;AAEX,KAAI,QAAQ,aAAa,KAAK,cAC5B,QAAO;CAGT,MAAM,cAAc;CACpB,MAAM,YAAY,gBAChB,aACA,yBAAyB,kBAC1B;AAGD,KAAI,UAAU,WAAW,IAAI,CAC3B,QAAO;CAGT,MAAM,SAAS,YAAY;CAC3B,MAAM,iBAAiB,SACnB,sBAAsB,QAAQ;EAC5B;EACA,uBAAuB;EACxB,CAAC,GACF;AAEJ,QAAO,iBAAiB,GAAG,eAAe,KAAK,cAAc;;AAG/D,MAAM,mBAAmB,SAAe,eAAe,UAAkB;AACvE,KAAI,QAAQ,aAAa,KAAK,aAC5B,QAAO;CAGT,MAAM,cAAc;CACpB,MAAM,KAAK,YAAY,aAAa,KAAK;AAGzC,KAAI,gBAAgB;MAES,YAAY,cAAc,iBACnD,IAAI,IAAI,OAAO,GAAG,GACnB,CAEsB,WAAW,EAChC,QAAO,IAAI,IAAI,OAAO,GAAG;;CAI7B,IAAI,WAAW,qBAAqB,YAAY;CAEhD,MAAM,QAAQ,YAAY,YAAY;AAEtC,KAAI,QAAQ,EACV,aAAY,cAAc,MAAM;AAGlC,QAAO;;AAGT,MAAM,eAAe,YAAiC;AAEpD,KAAI,CAAC,QAAQ,cACX,QAAO;CAGT,MAAM,WAAW,qBAAqB,QAAQ;CAG9C,MAAM,WAAW,MAAM,KAAK,QAAQ,cAAc,SAAS,CAAC,QACzD,YAAY,qBAAqB,QAAQ,KAAK,SAChD;AAGD,KAAI,SAAS,SAAS,EACpB,QAAO,SAAS,QAAQ,QAAQ,GAAG;AAGrC,QAAO;;AAGT,MAAM,wBAAwB,YAC5B,QAAQ,aACP,QAAQ,UAAU,SAAS,IACxB,MAAM,KAAK,QAAQ,UAAU,CAC1B,KAAK,QAAQ,IAAI,IAAI,OAAO,IAAI,GAAG,CACnC,KAAK,GAAG,GACX"}
1
+ {"version":3,"file":"getElementCSSSelector.js","names":[],"sources":["../../src/utils/getElementCSSSelector.ts"],"sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\ntype GetElementCSSSelectorOptions = {\n /**\n * If true, the function will attempt to use element ID to create condensed CSS selector.\n */\n useIdForTargetElement?: boolean;\n /**\n * If true, the function will attempt to use element ID for all ancestor elements to create condensed CSS selector.\n */\n useIdForAncestors?: boolean;\n};\n\n/**\n * Generates the CSS selector of a given element in the DOM tree.\n *\n * @example #main > div:nth-child(2) > button.submit\n * @example #unique-id\n */\nexport const getElementCSSSelector = (\n element: Node,\n {\n useIdForTargetElement = false,\n useIdForAncestors = false,\n }: GetElementCSSSelectorOptions = {},\n): string => {\n // Handle document node\n if (element.nodeType === Node.DOCUMENT_NODE) {\n return '';\n }\n\n const htmlElement = element as HTMLElement;\n const nodeValue = getNodeSelector(\n htmlElement,\n useIdForTargetElement || useIdForAncestors,\n );\n\n // If optimized and found an ID selector, stop recursion early\n if (nodeValue.startsWith('#')) {\n return nodeValue;\n }\n\n const parent = htmlElement.parentElement;\n const parentSelector = parent\n ? getElementCSSSelector(parent, {\n useIdForAncestors,\n useIdForTargetElement: false,\n })\n : '';\n\n return parentSelector ? `${parentSelector} > ${nodeValue}` : nodeValue;\n};\n\nconst getNodeSelector = (element: Node, useElementId = false): string => {\n if (element.nodeType !== Node.ELEMENT_NODE) {\n return '';\n }\n\n const htmlElement = element as HTMLElement;\n const id = htmlElement.getAttribute('id');\n\n // Use ID if requested and it's unique\n if (useElementId && id) {\n // Check if ID is unique in the document\n const elementsWithSameId = htmlElement.ownerDocument.querySelectorAll(\n `#${CSS.escape(id)}`,\n );\n\n if (elementsWithSameId.length === 1) {\n return `#${CSS.escape(id)}`;\n }\n }\n\n let selector = getFullClassSelector(htmlElement);\n // Add nth-child if there are siblings with the same tag and classes\n const index = getNthChild(htmlElement);\n\n if (index > 0) {\n selector += `:nth-child(${index})`;\n }\n\n return selector;\n};\n\nconst getNthChild = (element: HTMLElement): number => {\n // parentElement is needed to access children\n if (!element.parentElement) {\n return 0;\n }\n\n const selector = getFullClassSelector(element);\n\n // Get all siblings that match the same selector\n const siblings = Array.from(element.parentElement.children).filter(\n (sibling) => getFullClassSelector(sibling) === selector,\n );\n\n // Only add nth-child if there are multiple matching siblings\n if (siblings.length > 1) {\n return siblings.indexOf(element) + 1;\n }\n\n return 0;\n};\n\nconst getFullClassSelector = (element: Element): string =>\n element.localName +\n (element.classList.length > 0\n ? Array.from(element.classList)\n .map((cls) => `.${CSS.escape(cls)}`)\n .join('')\n : '');\n"],"mappings":";;;;;;;AAsBA,MAAa,yBACX,SACA,EACE,wBAAwB,OACxB,oBAAoB,UACY,EAAE,KACzB;AAEX,KAAI,QAAQ,aAAa,KAAK,cAC5B,QAAO;CAGT,MAAM,cAAc;CACpB,MAAM,YAAY,gBAChB,aACA,yBAAyB,kBAC1B;AAGD,KAAI,UAAU,WAAW,IAAI,CAC3B,QAAO;CAGT,MAAM,SAAS,YAAY;CAC3B,MAAM,iBAAiB,SACnB,sBAAsB,QAAQ;EAC5B;EACA,uBAAuB;EACxB,CAAC,GACF;AAEJ,QAAO,iBAAiB,GAAG,eAAe,KAAK,cAAc;;AAG/D,MAAM,mBAAmB,SAAe,eAAe,UAAkB;AACvE,KAAI,QAAQ,aAAa,KAAK,aAC5B,QAAO;CAGT,MAAM,cAAc;CACpB,MAAM,KAAK,YAAY,aAAa,KAAK;AAGzC,KAAI,gBAAgB;MAES,YAAY,cAAc,iBACnD,IAAI,IAAI,OAAO,GAAG,GAGE,CAAC,WAAW,EAChC,QAAO,IAAI,IAAI,OAAO,GAAG;;CAI7B,IAAI,WAAW,qBAAqB,YAAY;CAEhD,MAAM,QAAQ,YAAY,YAAY;AAEtC,KAAI,QAAQ,EACV,aAAY,cAAc,MAAM;AAGlC,QAAO;;AAGT,MAAM,eAAe,YAAiC;AAEpD,KAAI,CAAC,QAAQ,cACX,QAAO;CAGT,MAAM,WAAW,qBAAqB,QAAQ;CAG9C,MAAM,WAAW,MAAM,KAAK,QAAQ,cAAc,SAAS,CAAC,QACzD,YAAY,qBAAqB,QAAQ,KAAK,SAChD;AAGD,KAAI,SAAS,SAAS,EACpB,QAAO,SAAS,QAAQ,QAAQ,GAAG;AAGrC,QAAO;;AAGT,MAAM,wBAAwB,YAC5B,QAAQ,aACP,QAAQ,UAAU,SAAS,IACxB,MAAM,KAAK,QAAQ,UAAU,CAC1B,KAAK,QAAQ,IAAI,IAAI,OAAO,IAAI,GAAG,CACnC,KAAK,GAAG,GACX"}
package/package.json CHANGED
@@ -1,15 +1,18 @@
1
1
  {
2
2
  "name": "@opentelemetry/browser-instrumentation",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "OpenTelemetry browser instrumentations.",
5
5
  "keywords": [
6
6
  "opentelemetry",
7
7
  "browser",
8
8
  "web",
9
9
  "instrumentation",
10
+ "console",
10
11
  "navigation-timing",
11
12
  "user-action",
12
- "web-vitals"
13
+ "web-vitals",
14
+ "resource-timing",
15
+ "navigation"
13
16
  ],
14
17
  "homepage": "https://github.com/open-telemetry/opentelemetry-browser",
15
18
  "bugs": "https://github.com/open-telemetry/opentelemetry-browser/issues",
@@ -26,9 +29,12 @@
26
29
  "#instrumentation-test-utils": "./src/test-utils/index.ts"
27
30
  },
28
31
  "exports": {
32
+ "./experimental/navigation": "./dist/navigation/index.js",
33
+ "./experimental/console": "./dist/console/index.js",
29
34
  "./experimental/navigation-timing": "./dist/navigation-timing/index.js",
30
35
  "./experimental/user-action": "./dist/user-action/index.js",
31
- "./experimental/web-vitals": "./dist/web-vitals/index.js"
36
+ "./experimental/web-vitals": "./dist/web-vitals/index.js",
37
+ "./experimental/resource-timing": "./dist/resource-timing/index.js"
32
38
  },
33
39
  "files": [
34
40
  "dist"
@@ -42,15 +48,15 @@
42
48
  "test:coverage": "vitest --coverage"
43
49
  },
44
50
  "dependencies": {
45
- "@opentelemetry/api-logs": "^0.213.0",
46
- "@opentelemetry/instrumentation": "^0.213.0",
47
- "web-vitals": "^5.1.0"
51
+ "@opentelemetry/api-logs": "^0.216.0",
52
+ "@opentelemetry/instrumentation": "^0.216.0",
53
+ "web-vitals": "^5.2.0"
48
54
  },
49
55
  "peerDependencies": {
50
- "@opentelemetry/api": "^1.9.0"
56
+ "@opentelemetry/api": "^1.9.1"
51
57
  },
52
58
  "devDependencies": {
53
- "@opentelemetry/sdk-logs": "^0.213.0"
59
+ "@opentelemetry/sdk-logs": "0.216.0"
54
60
  },
55
61
  "publishConfig": {
56
62
  "access": "public"