@safaricom-mxl/web-sdk 0.0.8 → 0.0.9
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.
- package/dist/constants/attributes.cjs +2 -0
- package/dist/constants/attributes.cjs.map +1 -1
- package/dist/constants/attributes.d.cts +2 -1
- package/dist/constants/attributes.d.cts.map +1 -1
- package/dist/constants/attributes.d.ts +2 -1
- package/dist/constants/attributes.d.ts.map +1 -1
- package/dist/constants/attributes.js +2 -1
- package/dist/constants/attributes.js.map +1 -1
- package/dist/constants/index.cjs +1 -0
- package/dist/constants/index.d.cts +2 -2
- package/dist/constants/index.d.ts +2 -2
- package/dist/constants/index.js +2 -2
- package/dist/instrumentations/web-vitals/WebVitalsInstrumentation/WebVitalsInstrumentation.cjs +1 -0
- package/dist/instrumentations/web-vitals/WebVitalsInstrumentation/WebVitalsInstrumentation.cjs.map +1 -1
- package/dist/instrumentations/web-vitals/WebVitalsInstrumentation/WebVitalsInstrumentation.d.cts.map +1 -1
- package/dist/instrumentations/web-vitals/WebVitalsInstrumentation/WebVitalsInstrumentation.d.ts.map +1 -1
- package/dist/instrumentations/web-vitals/WebVitalsInstrumentation/WebVitalsInstrumentation.js +2 -1
- package/dist/instrumentations/web-vitals/WebVitalsInstrumentation/WebVitalsInstrumentation.js.map +1 -1
- package/dist/mxl-web-sdk.js +1 -1
- package/dist/mxl-web-sdk.js.map +1 -1
- package/dist/processors/BrowserLogRecordProcessor/BrowserLogRecordProcessor.cjs +26 -0
- package/dist/processors/BrowserLogRecordProcessor/BrowserLogRecordProcessor.cjs.map +1 -0
- package/dist/processors/BrowserLogRecordProcessor/BrowserLogRecordProcessor.d.cts +19 -0
- package/dist/processors/BrowserLogRecordProcessor/BrowserLogRecordProcessor.d.cts.map +1 -0
- package/dist/processors/BrowserLogRecordProcessor/BrowserLogRecordProcessor.d.ts +19 -0
- package/dist/processors/BrowserLogRecordProcessor/BrowserLogRecordProcessor.d.ts.map +1 -0
- package/dist/processors/BrowserLogRecordProcessor/BrowserLogRecordProcessor.js +25 -0
- package/dist/processors/BrowserLogRecordProcessor/BrowserLogRecordProcessor.js.map +1 -0
- package/dist/processors/BrowserLogRecordProcessor/index.cjs +4 -0
- package/dist/processors/BrowserLogRecordProcessor/index.d.cts +2 -0
- package/dist/processors/BrowserLogRecordProcessor/index.d.ts +2 -0
- package/dist/processors/BrowserLogRecordProcessor/index.js +3 -0
- package/dist/processors/BrowserLogRecordProcessor/types.cjs +0 -0
- package/dist/processors/BrowserLogRecordProcessor/types.d.cts +9 -0
- package/dist/processors/BrowserLogRecordProcessor/types.d.cts.map +1 -0
- package/dist/processors/BrowserLogRecordProcessor/types.d.ts +9 -0
- package/dist/processors/BrowserLogRecordProcessor/types.d.ts.map +1 -0
- package/dist/processors/BrowserLogRecordProcessor/types.js +0 -0
- package/dist/processors/BrowserSpanProcessor/BrowserSpanProcessor.cjs +27 -0
- package/dist/processors/BrowserSpanProcessor/BrowserSpanProcessor.cjs.map +1 -0
- package/dist/processors/BrowserSpanProcessor/BrowserSpanProcessor.d.cts +20 -0
- package/dist/processors/BrowserSpanProcessor/BrowserSpanProcessor.d.cts.map +1 -0
- package/dist/processors/BrowserSpanProcessor/BrowserSpanProcessor.d.ts +20 -0
- package/dist/processors/BrowserSpanProcessor/BrowserSpanProcessor.d.ts.map +1 -0
- package/dist/processors/BrowserSpanProcessor/BrowserSpanProcessor.js +26 -0
- package/dist/processors/BrowserSpanProcessor/BrowserSpanProcessor.js.map +1 -0
- package/dist/processors/BrowserSpanProcessor/index.cjs +4 -0
- package/dist/processors/BrowserSpanProcessor/index.d.cts +2 -0
- package/dist/processors/BrowserSpanProcessor/index.d.ts +2 -0
- package/dist/processors/BrowserSpanProcessor/index.js +3 -0
- package/dist/processors/BrowserSpanProcessor/types.cjs +0 -0
- package/dist/processors/BrowserSpanProcessor/types.d.cts +9 -0
- package/dist/processors/BrowserSpanProcessor/types.d.cts.map +1 -0
- package/dist/processors/BrowserSpanProcessor/types.d.ts +9 -0
- package/dist/processors/BrowserSpanProcessor/types.d.ts.map +1 -0
- package/dist/processors/BrowserSpanProcessor/types.js +0 -0
- package/dist/processors/index.cjs +4 -0
- package/dist/processors/index.d.cts +3 -1
- package/dist/processors/index.d.ts +5 -1
- package/dist/processors/index.js +3 -1
- package/dist/sdk/initSDK.cjs +13 -55
- package/dist/sdk/initSDK.cjs.map +1 -1
- package/dist/sdk/initSDK.d.cts.map +1 -1
- package/dist/sdk/initSDK.d.ts.map +1 -1
- package/dist/sdk/initSDK.js +13 -55
- package/dist/sdk/initSDK.js.map +1 -1
- package/package.json +1 -1
|
@@ -26,6 +26,7 @@ const KEY_MXL_JS_FILE_BUNDLE_IDS = "mxl.js_file_bundle_ids";
|
|
|
26
26
|
const KEY_MXL_W3C_TRACEPARENT = "mxl.w3c_traceparent";
|
|
27
27
|
const KEY_MXL_NAVIGATION_SOURCE = "mxl.navigation_source";
|
|
28
28
|
const KEY_MXL_REFERRER_URL = "mxl.referrer_url";
|
|
29
|
+
const KEY_BROWSER_URL_FULL = "browser.url.full";
|
|
29
30
|
const KEY_MXL_MAX_PENDING_SPANS_REACHED = "mxl.max_pending_spans_reached";
|
|
30
31
|
const KEY_MXL_PAGE_PATH = "app.surface.name";
|
|
31
32
|
const KEY_MXL_PAGE_ID = "app.surface.id";
|
|
@@ -61,6 +62,7 @@ let MXL_ERROR_INSTRUMENTATIONS = /* @__PURE__ */ function(MXL_ERROR_INSTRUMENTAT
|
|
|
61
62
|
|
|
62
63
|
//#endregion
|
|
63
64
|
exports.KEY_APP_SURFACE_LABEL = KEY_APP_SURFACE_LABEL;
|
|
65
|
+
exports.KEY_BROWSER_URL_FULL = KEY_BROWSER_URL_FULL;
|
|
64
66
|
exports.KEY_MXL_APP_INSTANCE_ID = KEY_MXL_APP_INSTANCE_ID;
|
|
65
67
|
exports.KEY_MXL_COLD_START = KEY_MXL_COLD_START;
|
|
66
68
|
exports.KEY_MXL_ERROR_CODE = KEY_MXL_ERROR_CODE;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attributes.cjs","names":[],"sources":["../../src/constants/attributes.ts"],"sourcesContent":["export const KEY_MXL_TYPE = 'mxl.type';\nexport const KEY_MXL_STATE = 'mxl.state';\nexport const KEY_MXL_COLD_START = 'mxl.cold_start';\nexport const KEY_MXL_SESSION_NUMBER = 'mxl.session_number';\nexport const KEY_MXL_EXCEPTION_NUMBER = 'mxl.exception_number';\nexport const KEY_MXL_SDK_STARTUP_DURATION = 'mxl.sdk_startup_duration';\nexport const KEY_PREFIX_MXL_PROPERTIES = 'mxl.properties.';\nexport const KEY_MXL_SESSION_REASON_ENDED = 'mxl.session_end_type';\nexport const KEY_MXL_SESSION_REASON_STARTED = 'mxl.session_start_type';\nexport const KEY_MXL_JS_EXCEPTION_STACKTRACE = 'mxl.stacktrace.js';\nexport const KEY_MXL_EXCEPTION_HANDLING = 'mxl.exception_handling';\nexport const KEY_MXL_EXCEPTION_CAUSE = 'mxl.exception_cause';\nexport const KEY_MXL_ERROR_CODE = 'mxl.error_code';\nexport const KEY_MXL_APP_INSTANCE_ID = 'mxl.app_instance_id';\nexport const KEY_MXL_TAB_ID = 'mxl.tab_id';\nexport const KEY_MXL_SOURCE_TAB_ID = 'mxl.source_tab_id';\nexport const KEY_MXL_EXPERIENCE_ID = 'mxl.experience_id';\nexport const KEY_MXL_ERROR_LOG_COUNT = 'mxl.error_log_count';\nexport const KEY_MXL_INSTRUMENTATION = 'mxl.instrumentation';\nexport const KEY_MXL_UNHANDLED_EXCEPTIONS_COUNT =\n 'mxl.unhandled_exceptions_count';\nexport const KEY_MXL_FROM_STORAGE = 'mxl.from_storage';\nexport const KEY_MXL_JS_FILE_BUNDLE_IDS = 'mxl.js_file_bundle_ids';\nexport const KEY_MXL_W3C_TRACEPARENT = 'mxl.w3c_traceparent';\nexport const KEY_MXL_NAVIGATION_SOURCE = 'mxl.navigation_source';\nexport const KEY_MXL_REFERRER_URL = 'mxl.referrer_url';\nexport const KEY_MXL_MAX_PENDING_SPANS_REACHED =\n 'mxl.max_pending_spans_reached';\n// In the backend we use 'app.surface.name' and 'app.surface.id' for the page name and id\n// to be consistent with mobile where we use 'app.surface.*' for screen names and ids\nexport const KEY_MXL_PAGE_PATH = 'app.surface.name';\nexport const KEY_MXL_PAGE_ID = 'app.surface.id';\nexport const KEY_APP_SURFACE_LABEL = 'app.surface.label';\n\nexport enum MXL_TYPES {\n Session = 'ux.session',\n Network = 'perf.network_request',\n Perf = 'perf',\n SystemLog = 'sys.log', // SystemLog is a log emb type that tells the MXL BE to treat this as an MXL Log to be shown in the dashboard.\n SystemException = 'sys.exception',\n WebVital = 'ux.web_vital',\n ResourceFetch = 'ux.resource_fetch',\n DocumentLoad = 'ux.document_load',\n Surface = 'ux.surface',\n}\n\nexport enum MXL_STATES {\n Foreground = 'foreground',\n Background = 'background',\n}\n\nexport enum MXL_NAVIGATION_INSTRUMENTATIONS {\n DeclarativeLegacy = 'react_router_declarative_legacy',\n Declarative = 'react_router_declarative',\n Data = 'react_router_data',\n Manual = 'manual',\n}\n\nexport enum MXL_ERROR_INSTRUMENTATIONS {\n ReactErrorBoundary = 'react_error_boundary',\n}\n\nexport type MXL_INSTRUMENTATIONS =\n | MXL_NAVIGATION_INSTRUMENTATIONS\n | MXL_ERROR_INSTRUMENTATIONS;\n"],"mappings":";;;AAAA,MAAa,eAAe;AAC5B,MAAa,gBAAgB;AAC7B,MAAa,qBAAqB;AAClC,MAAa,yBAAyB;AACtC,MAAa,2BAA2B;AACxC,MAAa,+BAA+B;AAC5C,MAAa,4BAA4B;AACzC,MAAa,+BAA+B;AAC5C,MAAa,iCAAiC;AAC9C,MAAa,kCAAkC;AAC/C,MAAa,6BAA6B;AAC1C,MAAa,0BAA0B;AACvC,MAAa,qBAAqB;AAClC,MAAa,0BAA0B;AACvC,MAAa,iBAAiB;AAC9B,MAAa,wBAAwB;AACrC,MAAa,wBAAwB;AACrC,MAAa,0BAA0B;AACvC,MAAa,0BAA0B;AACvC,MAAa,qCACX;AACF,MAAa,uBAAuB;AACpC,MAAa,6BAA6B;AAC1C,MAAa,0BAA0B;AACvC,MAAa,4BAA4B;AACzC,MAAa,uBAAuB;AACpC,MAAa,oCACX;AAGF,MAAa,oBAAoB;AACjC,MAAa,kBAAkB;AAC/B,MAAa,wBAAwB;AAErC,IAAY,gDAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGF,IAAY,kDAAL;AACL;AACA;;;AAGF,IAAY,4FAAL;AACL;AACA;AACA;AACA;;;AAGF,IAAY,kFAAL;AACL"}
|
|
1
|
+
{"version":3,"file":"attributes.cjs","names":[],"sources":["../../src/constants/attributes.ts"],"sourcesContent":["export const KEY_MXL_TYPE = 'mxl.type';\nexport const KEY_MXL_STATE = 'mxl.state';\nexport const KEY_MXL_COLD_START = 'mxl.cold_start';\nexport const KEY_MXL_SESSION_NUMBER = 'mxl.session_number';\nexport const KEY_MXL_EXCEPTION_NUMBER = 'mxl.exception_number';\nexport const KEY_MXL_SDK_STARTUP_DURATION = 'mxl.sdk_startup_duration';\nexport const KEY_PREFIX_MXL_PROPERTIES = 'mxl.properties.';\nexport const KEY_MXL_SESSION_REASON_ENDED = 'mxl.session_end_type';\nexport const KEY_MXL_SESSION_REASON_STARTED = 'mxl.session_start_type';\nexport const KEY_MXL_JS_EXCEPTION_STACKTRACE = 'mxl.stacktrace.js';\nexport const KEY_MXL_EXCEPTION_HANDLING = 'mxl.exception_handling';\nexport const KEY_MXL_EXCEPTION_CAUSE = 'mxl.exception_cause';\nexport const KEY_MXL_ERROR_CODE = 'mxl.error_code';\nexport const KEY_MXL_APP_INSTANCE_ID = 'mxl.app_instance_id';\nexport const KEY_MXL_TAB_ID = 'mxl.tab_id';\nexport const KEY_MXL_SOURCE_TAB_ID = 'mxl.source_tab_id';\nexport const KEY_MXL_EXPERIENCE_ID = 'mxl.experience_id';\nexport const KEY_MXL_ERROR_LOG_COUNT = 'mxl.error_log_count';\nexport const KEY_MXL_INSTRUMENTATION = 'mxl.instrumentation';\nexport const KEY_MXL_UNHANDLED_EXCEPTIONS_COUNT =\n 'mxl.unhandled_exceptions_count';\nexport const KEY_MXL_FROM_STORAGE = 'mxl.from_storage';\nexport const KEY_MXL_JS_FILE_BUNDLE_IDS = 'mxl.js_file_bundle_ids';\nexport const KEY_MXL_W3C_TRACEPARENT = 'mxl.w3c_traceparent';\nexport const KEY_MXL_NAVIGATION_SOURCE = 'mxl.navigation_source';\nexport const KEY_MXL_REFERRER_URL = 'mxl.referrer_url';\nexport const KEY_BROWSER_URL_FULL = 'browser.url.full';\nexport const KEY_MXL_MAX_PENDING_SPANS_REACHED =\n 'mxl.max_pending_spans_reached';\n// In the backend we use 'app.surface.name' and 'app.surface.id' for the page name and id\n// to be consistent with mobile where we use 'app.surface.*' for screen names and ids\nexport const KEY_MXL_PAGE_PATH = 'app.surface.name';\nexport const KEY_MXL_PAGE_ID = 'app.surface.id';\nexport const KEY_APP_SURFACE_LABEL = 'app.surface.label';\n\nexport enum MXL_TYPES {\n Session = 'ux.session',\n Network = 'perf.network_request',\n Perf = 'perf',\n SystemLog = 'sys.log', // SystemLog is a log emb type that tells the MXL BE to treat this as an MXL Log to be shown in the dashboard.\n SystemException = 'sys.exception',\n WebVital = 'ux.web_vital',\n ResourceFetch = 'ux.resource_fetch',\n DocumentLoad = 'ux.document_load',\n Surface = 'ux.surface',\n}\n\nexport enum MXL_STATES {\n Foreground = 'foreground',\n Background = 'background',\n}\n\nexport enum MXL_NAVIGATION_INSTRUMENTATIONS {\n DeclarativeLegacy = 'react_router_declarative_legacy',\n Declarative = 'react_router_declarative',\n Data = 'react_router_data',\n Manual = 'manual',\n}\n\nexport enum MXL_ERROR_INSTRUMENTATIONS {\n ReactErrorBoundary = 'react_error_boundary',\n}\n\nexport type MXL_INSTRUMENTATIONS =\n | MXL_NAVIGATION_INSTRUMENTATIONS\n | MXL_ERROR_INSTRUMENTATIONS;\n"],"mappings":";;;AAAA,MAAa,eAAe;AAC5B,MAAa,gBAAgB;AAC7B,MAAa,qBAAqB;AAClC,MAAa,yBAAyB;AACtC,MAAa,2BAA2B;AACxC,MAAa,+BAA+B;AAC5C,MAAa,4BAA4B;AACzC,MAAa,+BAA+B;AAC5C,MAAa,iCAAiC;AAC9C,MAAa,kCAAkC;AAC/C,MAAa,6BAA6B;AAC1C,MAAa,0BAA0B;AACvC,MAAa,qBAAqB;AAClC,MAAa,0BAA0B;AACvC,MAAa,iBAAiB;AAC9B,MAAa,wBAAwB;AACrC,MAAa,wBAAwB;AACrC,MAAa,0BAA0B;AACvC,MAAa,0BAA0B;AACvC,MAAa,qCACX;AACF,MAAa,uBAAuB;AACpC,MAAa,6BAA6B;AAC1C,MAAa,0BAA0B;AACvC,MAAa,4BAA4B;AACzC,MAAa,uBAAuB;AACpC,MAAa,uBAAuB;AACpC,MAAa,oCACX;AAGF,MAAa,oBAAoB;AACjC,MAAa,kBAAkB;AAC/B,MAAa,wBAAwB;AAErC,IAAY,gDAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGF,IAAY,kDAAL;AACL;AACA;;;AAGF,IAAY,4FAAL;AACL;AACA;AACA;AACA;;;AAGF,IAAY,kFAAL;AACL"}
|
|
@@ -24,6 +24,7 @@ declare const KEY_MXL_JS_FILE_BUNDLE_IDS = "mxl.js_file_bundle_ids";
|
|
|
24
24
|
declare const KEY_MXL_W3C_TRACEPARENT = "mxl.w3c_traceparent";
|
|
25
25
|
declare const KEY_MXL_NAVIGATION_SOURCE = "mxl.navigation_source";
|
|
26
26
|
declare const KEY_MXL_REFERRER_URL = "mxl.referrer_url";
|
|
27
|
+
declare const KEY_BROWSER_URL_FULL = "browser.url.full";
|
|
27
28
|
declare const KEY_MXL_MAX_PENDING_SPANS_REACHED = "mxl.max_pending_spans_reached";
|
|
28
29
|
declare const KEY_MXL_PAGE_PATH = "app.surface.name";
|
|
29
30
|
declare const KEY_MXL_PAGE_ID = "app.surface.id";
|
|
@@ -55,5 +56,5 @@ declare enum MXL_ERROR_INSTRUMENTATIONS {
|
|
|
55
56
|
}
|
|
56
57
|
type MXL_INSTRUMENTATIONS = MXL_NAVIGATION_INSTRUMENTATIONS | MXL_ERROR_INSTRUMENTATIONS;
|
|
57
58
|
//#endregion
|
|
58
|
-
export { KEY_APP_SURFACE_LABEL, KEY_MXL_APP_INSTANCE_ID, KEY_MXL_COLD_START, KEY_MXL_ERROR_CODE, KEY_MXL_ERROR_LOG_COUNT, KEY_MXL_EXCEPTION_CAUSE, KEY_MXL_EXCEPTION_HANDLING, KEY_MXL_EXCEPTION_NUMBER, KEY_MXL_EXPERIENCE_ID, KEY_MXL_FROM_STORAGE, KEY_MXL_INSTRUMENTATION, KEY_MXL_JS_EXCEPTION_STACKTRACE, KEY_MXL_JS_FILE_BUNDLE_IDS, KEY_MXL_MAX_PENDING_SPANS_REACHED, KEY_MXL_NAVIGATION_SOURCE, KEY_MXL_PAGE_ID, KEY_MXL_PAGE_PATH, KEY_MXL_REFERRER_URL, KEY_MXL_SDK_STARTUP_DURATION, KEY_MXL_SESSION_NUMBER, KEY_MXL_SESSION_REASON_ENDED, KEY_MXL_SESSION_REASON_STARTED, KEY_MXL_SOURCE_TAB_ID, KEY_MXL_STATE, KEY_MXL_TAB_ID, KEY_MXL_TYPE, KEY_MXL_UNHANDLED_EXCEPTIONS_COUNT, KEY_MXL_W3C_TRACEPARENT, KEY_PREFIX_MXL_PROPERTIES, MXL_ERROR_INSTRUMENTATIONS, MXL_INSTRUMENTATIONS, MXL_NAVIGATION_INSTRUMENTATIONS, MXL_STATES, MXL_TYPES };
|
|
59
|
+
export { KEY_APP_SURFACE_LABEL, KEY_BROWSER_URL_FULL, KEY_MXL_APP_INSTANCE_ID, KEY_MXL_COLD_START, KEY_MXL_ERROR_CODE, KEY_MXL_ERROR_LOG_COUNT, KEY_MXL_EXCEPTION_CAUSE, KEY_MXL_EXCEPTION_HANDLING, KEY_MXL_EXCEPTION_NUMBER, KEY_MXL_EXPERIENCE_ID, KEY_MXL_FROM_STORAGE, KEY_MXL_INSTRUMENTATION, KEY_MXL_JS_EXCEPTION_STACKTRACE, KEY_MXL_JS_FILE_BUNDLE_IDS, KEY_MXL_MAX_PENDING_SPANS_REACHED, KEY_MXL_NAVIGATION_SOURCE, KEY_MXL_PAGE_ID, KEY_MXL_PAGE_PATH, KEY_MXL_REFERRER_URL, KEY_MXL_SDK_STARTUP_DURATION, KEY_MXL_SESSION_NUMBER, KEY_MXL_SESSION_REASON_ENDED, KEY_MXL_SESSION_REASON_STARTED, KEY_MXL_SOURCE_TAB_ID, KEY_MXL_STATE, KEY_MXL_TAB_ID, KEY_MXL_TYPE, KEY_MXL_UNHANDLED_EXCEPTIONS_COUNT, KEY_MXL_W3C_TRACEPARENT, KEY_PREFIX_MXL_PROPERTIES, MXL_ERROR_INSTRUMENTATIONS, MXL_INSTRUMENTATIONS, MXL_NAVIGATION_INSTRUMENTATIONS, MXL_STATES, MXL_TYPES };
|
|
59
60
|
//# sourceMappingURL=attributes.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attributes.d.cts","names":[],"sources":["../../src/constants/attributes.ts"],"mappings":";cAAa,YAAA;AAAA,cACA,aAAA;AAAA,cACA,kBAAA;AAAA,cACA,sBAAA;AAAA,cACA,wBAAA;AAAA,cACA,4BAAA;AAAA,cACA,yBAAA;AAAA,cACA,4BAAA;AAAA,cACA,8BAAA;AAAA,cACA,+BAAA;AAAA,cACA,0BAAA;AAAA,cACA,uBAAA;AAAA,cACA,kBAAA;AAAA,cACA,uBAAA;AAAA,cACA,cAAA;AAAA,cACA,qBAAA;AAAA,cACA,qBAAA;AAAA,cACA,uBAAA;AAAA,cACA,uBAAA;AAAA,cACA,kCAAA;AAAA,cAEA,oBAAA;AAAA,cACA,0BAAA;AAAA,cACA,uBAAA;AAAA,cACA,yBAAA;AAAA,cACA,oBAAA;AAAA,cACA,iCAAA;AAAA,cAIA,iBAAA;AAAA,cACA,eAAA;AAAA,cACA,qBAAA;AAAA,aAED,SAAA;EACV,OAAA;EACA,OAAA;EACA,IAAA;EACA,SAAA;EAAA;EACA,eAAA;EACA,QAAA;EACA,aAAA;EACA,YAAA;EACA,OAAA;AAAA;AAAA,aAGU,UAAA;EACV,UAAA;EACA,UAAA;AAAA;AAAA,aAGU,+BAAA;EACV,iBAAA;EACA,WAAA;EACA,IAAA;EACA,MAAA;AAAA;AAAA,aAGU,0BAAA;EACV,kBAAA;AAAA;AAAA,KAGU,oBAAA,GACR,+BAAA,GACA,0BAAA"}
|
|
1
|
+
{"version":3,"file":"attributes.d.cts","names":[],"sources":["../../src/constants/attributes.ts"],"mappings":";cAAa,YAAA;AAAA,cACA,aAAA;AAAA,cACA,kBAAA;AAAA,cACA,sBAAA;AAAA,cACA,wBAAA;AAAA,cACA,4BAAA;AAAA,cACA,yBAAA;AAAA,cACA,4BAAA;AAAA,cACA,8BAAA;AAAA,cACA,+BAAA;AAAA,cACA,0BAAA;AAAA,cACA,uBAAA;AAAA,cACA,kBAAA;AAAA,cACA,uBAAA;AAAA,cACA,cAAA;AAAA,cACA,qBAAA;AAAA,cACA,qBAAA;AAAA,cACA,uBAAA;AAAA,cACA,uBAAA;AAAA,cACA,kCAAA;AAAA,cAEA,oBAAA;AAAA,cACA,0BAAA;AAAA,cACA,uBAAA;AAAA,cACA,yBAAA;AAAA,cACA,oBAAA;AAAA,cACA,oBAAA;AAAA,cACA,iCAAA;AAAA,cAIA,iBAAA;AAAA,cACA,eAAA;AAAA,cACA,qBAAA;AAAA,aAED,SAAA;EACV,OAAA;EACA,OAAA;EACA,IAAA;EACA,SAAA;EAAA;EACA,eAAA;EACA,QAAA;EACA,aAAA;EACA,YAAA;EACA,OAAA;AAAA;AAAA,aAGU,UAAA;EACV,UAAA;EACA,UAAA;AAAA;AAAA,aAGU,+BAAA;EACV,iBAAA;EACA,WAAA;EACA,IAAA;EACA,MAAA;AAAA;AAAA,aAGU,0BAAA;EACV,kBAAA;AAAA;AAAA,KAGU,oBAAA,GACR,+BAAA,GACA,0BAAA"}
|
|
@@ -24,6 +24,7 @@ declare const KEY_MXL_JS_FILE_BUNDLE_IDS = "mxl.js_file_bundle_ids";
|
|
|
24
24
|
declare const KEY_MXL_W3C_TRACEPARENT = "mxl.w3c_traceparent";
|
|
25
25
|
declare const KEY_MXL_NAVIGATION_SOURCE = "mxl.navigation_source";
|
|
26
26
|
declare const KEY_MXL_REFERRER_URL = "mxl.referrer_url";
|
|
27
|
+
declare const KEY_BROWSER_URL_FULL = "browser.url.full";
|
|
27
28
|
declare const KEY_MXL_MAX_PENDING_SPANS_REACHED = "mxl.max_pending_spans_reached";
|
|
28
29
|
declare const KEY_MXL_PAGE_PATH = "app.surface.name";
|
|
29
30
|
declare const KEY_MXL_PAGE_ID = "app.surface.id";
|
|
@@ -55,5 +56,5 @@ declare enum MXL_ERROR_INSTRUMENTATIONS {
|
|
|
55
56
|
}
|
|
56
57
|
type MXL_INSTRUMENTATIONS = MXL_NAVIGATION_INSTRUMENTATIONS | MXL_ERROR_INSTRUMENTATIONS;
|
|
57
58
|
//#endregion
|
|
58
|
-
export { KEY_APP_SURFACE_LABEL, KEY_MXL_APP_INSTANCE_ID, KEY_MXL_COLD_START, KEY_MXL_ERROR_CODE, KEY_MXL_ERROR_LOG_COUNT, KEY_MXL_EXCEPTION_CAUSE, KEY_MXL_EXCEPTION_HANDLING, KEY_MXL_EXCEPTION_NUMBER, KEY_MXL_EXPERIENCE_ID, KEY_MXL_FROM_STORAGE, KEY_MXL_INSTRUMENTATION, KEY_MXL_JS_EXCEPTION_STACKTRACE, KEY_MXL_JS_FILE_BUNDLE_IDS, KEY_MXL_MAX_PENDING_SPANS_REACHED, KEY_MXL_NAVIGATION_SOURCE, KEY_MXL_PAGE_ID, KEY_MXL_PAGE_PATH, KEY_MXL_REFERRER_URL, KEY_MXL_SDK_STARTUP_DURATION, KEY_MXL_SESSION_NUMBER, KEY_MXL_SESSION_REASON_ENDED, KEY_MXL_SESSION_REASON_STARTED, KEY_MXL_SOURCE_TAB_ID, KEY_MXL_STATE, KEY_MXL_TAB_ID, KEY_MXL_TYPE, KEY_MXL_UNHANDLED_EXCEPTIONS_COUNT, KEY_MXL_W3C_TRACEPARENT, KEY_PREFIX_MXL_PROPERTIES, MXL_ERROR_INSTRUMENTATIONS, MXL_INSTRUMENTATIONS, MXL_NAVIGATION_INSTRUMENTATIONS, MXL_STATES, MXL_TYPES };
|
|
59
|
+
export { KEY_APP_SURFACE_LABEL, KEY_BROWSER_URL_FULL, KEY_MXL_APP_INSTANCE_ID, KEY_MXL_COLD_START, KEY_MXL_ERROR_CODE, KEY_MXL_ERROR_LOG_COUNT, KEY_MXL_EXCEPTION_CAUSE, KEY_MXL_EXCEPTION_HANDLING, KEY_MXL_EXCEPTION_NUMBER, KEY_MXL_EXPERIENCE_ID, KEY_MXL_FROM_STORAGE, KEY_MXL_INSTRUMENTATION, KEY_MXL_JS_EXCEPTION_STACKTRACE, KEY_MXL_JS_FILE_BUNDLE_IDS, KEY_MXL_MAX_PENDING_SPANS_REACHED, KEY_MXL_NAVIGATION_SOURCE, KEY_MXL_PAGE_ID, KEY_MXL_PAGE_PATH, KEY_MXL_REFERRER_URL, KEY_MXL_SDK_STARTUP_DURATION, KEY_MXL_SESSION_NUMBER, KEY_MXL_SESSION_REASON_ENDED, KEY_MXL_SESSION_REASON_STARTED, KEY_MXL_SOURCE_TAB_ID, KEY_MXL_STATE, KEY_MXL_TAB_ID, KEY_MXL_TYPE, KEY_MXL_UNHANDLED_EXCEPTIONS_COUNT, KEY_MXL_W3C_TRACEPARENT, KEY_PREFIX_MXL_PROPERTIES, MXL_ERROR_INSTRUMENTATIONS, MXL_INSTRUMENTATIONS, MXL_NAVIGATION_INSTRUMENTATIONS, MXL_STATES, MXL_TYPES };
|
|
59
60
|
//# sourceMappingURL=attributes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attributes.d.ts","names":[],"sources":["../../src/constants/attributes.ts"],"mappings":";cAAa,YAAA;AAAA,cACA,aAAA;AAAA,cACA,kBAAA;AAAA,cACA,sBAAA;AAAA,cACA,wBAAA;AAAA,cACA,4BAAA;AAAA,cACA,yBAAA;AAAA,cACA,4BAAA;AAAA,cACA,8BAAA;AAAA,cACA,+BAAA;AAAA,cACA,0BAAA;AAAA,cACA,uBAAA;AAAA,cACA,kBAAA;AAAA,cACA,uBAAA;AAAA,cACA,cAAA;AAAA,cACA,qBAAA;AAAA,cACA,qBAAA;AAAA,cACA,uBAAA;AAAA,cACA,uBAAA;AAAA,cACA,kCAAA;AAAA,cAEA,oBAAA;AAAA,cACA,0BAAA;AAAA,cACA,uBAAA;AAAA,cACA,yBAAA;AAAA,cACA,oBAAA;AAAA,cACA,iCAAA;AAAA,cAIA,iBAAA;AAAA,cACA,eAAA;AAAA,cACA,qBAAA;AAAA,aAED,SAAA;EACV,OAAA;EACA,OAAA;EACA,IAAA;EACA,SAAA;EAAA;EACA,eAAA;EACA,QAAA;EACA,aAAA;EACA,YAAA;EACA,OAAA;AAAA;AAAA,aAGU,UAAA;EACV,UAAA;EACA,UAAA;AAAA;AAAA,aAGU,+BAAA;EACV,iBAAA;EACA,WAAA;EACA,IAAA;EACA,MAAA;AAAA;AAAA,aAGU,0BAAA;EACV,kBAAA;AAAA;AAAA,KAGU,oBAAA,GACR,+BAAA,GACA,0BAAA"}
|
|
1
|
+
{"version":3,"file":"attributes.d.ts","names":[],"sources":["../../src/constants/attributes.ts"],"mappings":";cAAa,YAAA;AAAA,cACA,aAAA;AAAA,cACA,kBAAA;AAAA,cACA,sBAAA;AAAA,cACA,wBAAA;AAAA,cACA,4BAAA;AAAA,cACA,yBAAA;AAAA,cACA,4BAAA;AAAA,cACA,8BAAA;AAAA,cACA,+BAAA;AAAA,cACA,0BAAA;AAAA,cACA,uBAAA;AAAA,cACA,kBAAA;AAAA,cACA,uBAAA;AAAA,cACA,cAAA;AAAA,cACA,qBAAA;AAAA,cACA,qBAAA;AAAA,cACA,uBAAA;AAAA,cACA,uBAAA;AAAA,cACA,kCAAA;AAAA,cAEA,oBAAA;AAAA,cACA,0BAAA;AAAA,cACA,uBAAA;AAAA,cACA,yBAAA;AAAA,cACA,oBAAA;AAAA,cACA,oBAAA;AAAA,cACA,iCAAA;AAAA,cAIA,iBAAA;AAAA,cACA,eAAA;AAAA,cACA,qBAAA;AAAA,aAED,SAAA;EACV,OAAA;EACA,OAAA;EACA,IAAA;EACA,SAAA;EAAA;EACA,eAAA;EACA,QAAA;EACA,aAAA;EACA,YAAA;EACA,OAAA;AAAA;AAAA,aAGU,UAAA;EACV,UAAA;EACA,UAAA;AAAA;AAAA,aAGU,+BAAA;EACV,iBAAA;EACA,WAAA;EACA,IAAA;EACA,MAAA;AAAA;AAAA,aAGU,0BAAA;EACV,kBAAA;AAAA;AAAA,KAGU,oBAAA,GACR,+BAAA,GACA,0BAAA"}
|
|
@@ -24,6 +24,7 @@ const KEY_MXL_JS_FILE_BUNDLE_IDS = "mxl.js_file_bundle_ids";
|
|
|
24
24
|
const KEY_MXL_W3C_TRACEPARENT = "mxl.w3c_traceparent";
|
|
25
25
|
const KEY_MXL_NAVIGATION_SOURCE = "mxl.navigation_source";
|
|
26
26
|
const KEY_MXL_REFERRER_URL = "mxl.referrer_url";
|
|
27
|
+
const KEY_BROWSER_URL_FULL = "browser.url.full";
|
|
27
28
|
const KEY_MXL_MAX_PENDING_SPANS_REACHED = "mxl.max_pending_spans_reached";
|
|
28
29
|
const KEY_MXL_PAGE_PATH = "app.surface.name";
|
|
29
30
|
const KEY_MXL_PAGE_ID = "app.surface.id";
|
|
@@ -58,5 +59,5 @@ let MXL_ERROR_INSTRUMENTATIONS = /* @__PURE__ */ function(MXL_ERROR_INSTRUMENTAT
|
|
|
58
59
|
}({});
|
|
59
60
|
|
|
60
61
|
//#endregion
|
|
61
|
-
export { KEY_APP_SURFACE_LABEL, KEY_MXL_APP_INSTANCE_ID, KEY_MXL_COLD_START, KEY_MXL_ERROR_CODE, KEY_MXL_ERROR_LOG_COUNT, KEY_MXL_EXCEPTION_CAUSE, KEY_MXL_EXCEPTION_HANDLING, KEY_MXL_EXCEPTION_NUMBER, KEY_MXL_EXPERIENCE_ID, KEY_MXL_FROM_STORAGE, KEY_MXL_INSTRUMENTATION, KEY_MXL_JS_EXCEPTION_STACKTRACE, KEY_MXL_JS_FILE_BUNDLE_IDS, KEY_MXL_MAX_PENDING_SPANS_REACHED, KEY_MXL_NAVIGATION_SOURCE, KEY_MXL_PAGE_ID, KEY_MXL_PAGE_PATH, KEY_MXL_REFERRER_URL, KEY_MXL_SDK_STARTUP_DURATION, KEY_MXL_SESSION_NUMBER, KEY_MXL_SESSION_REASON_ENDED, KEY_MXL_SESSION_REASON_STARTED, KEY_MXL_SOURCE_TAB_ID, KEY_MXL_STATE, KEY_MXL_TAB_ID, KEY_MXL_TYPE, KEY_MXL_UNHANDLED_EXCEPTIONS_COUNT, KEY_MXL_W3C_TRACEPARENT, KEY_PREFIX_MXL_PROPERTIES, MXL_ERROR_INSTRUMENTATIONS, MXL_NAVIGATION_INSTRUMENTATIONS, MXL_STATES, MXL_TYPES };
|
|
62
|
+
export { KEY_APP_SURFACE_LABEL, KEY_BROWSER_URL_FULL, KEY_MXL_APP_INSTANCE_ID, KEY_MXL_COLD_START, KEY_MXL_ERROR_CODE, KEY_MXL_ERROR_LOG_COUNT, KEY_MXL_EXCEPTION_CAUSE, KEY_MXL_EXCEPTION_HANDLING, KEY_MXL_EXCEPTION_NUMBER, KEY_MXL_EXPERIENCE_ID, KEY_MXL_FROM_STORAGE, KEY_MXL_INSTRUMENTATION, KEY_MXL_JS_EXCEPTION_STACKTRACE, KEY_MXL_JS_FILE_BUNDLE_IDS, KEY_MXL_MAX_PENDING_SPANS_REACHED, KEY_MXL_NAVIGATION_SOURCE, KEY_MXL_PAGE_ID, KEY_MXL_PAGE_PATH, KEY_MXL_REFERRER_URL, KEY_MXL_SDK_STARTUP_DURATION, KEY_MXL_SESSION_NUMBER, KEY_MXL_SESSION_REASON_ENDED, KEY_MXL_SESSION_REASON_STARTED, KEY_MXL_SOURCE_TAB_ID, KEY_MXL_STATE, KEY_MXL_TAB_ID, KEY_MXL_TYPE, KEY_MXL_UNHANDLED_EXCEPTIONS_COUNT, KEY_MXL_W3C_TRACEPARENT, KEY_PREFIX_MXL_PROPERTIES, MXL_ERROR_INSTRUMENTATIONS, MXL_NAVIGATION_INSTRUMENTATIONS, MXL_STATES, MXL_TYPES };
|
|
62
63
|
//# sourceMappingURL=attributes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attributes.js","names":[],"sources":["../../src/constants/attributes.ts"],"sourcesContent":["export const KEY_MXL_TYPE = 'mxl.type';\nexport const KEY_MXL_STATE = 'mxl.state';\nexport const KEY_MXL_COLD_START = 'mxl.cold_start';\nexport const KEY_MXL_SESSION_NUMBER = 'mxl.session_number';\nexport const KEY_MXL_EXCEPTION_NUMBER = 'mxl.exception_number';\nexport const KEY_MXL_SDK_STARTUP_DURATION = 'mxl.sdk_startup_duration';\nexport const KEY_PREFIX_MXL_PROPERTIES = 'mxl.properties.';\nexport const KEY_MXL_SESSION_REASON_ENDED = 'mxl.session_end_type';\nexport const KEY_MXL_SESSION_REASON_STARTED = 'mxl.session_start_type';\nexport const KEY_MXL_JS_EXCEPTION_STACKTRACE = 'mxl.stacktrace.js';\nexport const KEY_MXL_EXCEPTION_HANDLING = 'mxl.exception_handling';\nexport const KEY_MXL_EXCEPTION_CAUSE = 'mxl.exception_cause';\nexport const KEY_MXL_ERROR_CODE = 'mxl.error_code';\nexport const KEY_MXL_APP_INSTANCE_ID = 'mxl.app_instance_id';\nexport const KEY_MXL_TAB_ID = 'mxl.tab_id';\nexport const KEY_MXL_SOURCE_TAB_ID = 'mxl.source_tab_id';\nexport const KEY_MXL_EXPERIENCE_ID = 'mxl.experience_id';\nexport const KEY_MXL_ERROR_LOG_COUNT = 'mxl.error_log_count';\nexport const KEY_MXL_INSTRUMENTATION = 'mxl.instrumentation';\nexport const KEY_MXL_UNHANDLED_EXCEPTIONS_COUNT =\n 'mxl.unhandled_exceptions_count';\nexport const KEY_MXL_FROM_STORAGE = 'mxl.from_storage';\nexport const KEY_MXL_JS_FILE_BUNDLE_IDS = 'mxl.js_file_bundle_ids';\nexport const KEY_MXL_W3C_TRACEPARENT = 'mxl.w3c_traceparent';\nexport const KEY_MXL_NAVIGATION_SOURCE = 'mxl.navigation_source';\nexport const KEY_MXL_REFERRER_URL = 'mxl.referrer_url';\nexport const KEY_MXL_MAX_PENDING_SPANS_REACHED =\n 'mxl.max_pending_spans_reached';\n// In the backend we use 'app.surface.name' and 'app.surface.id' for the page name and id\n// to be consistent with mobile where we use 'app.surface.*' for screen names and ids\nexport const KEY_MXL_PAGE_PATH = 'app.surface.name';\nexport const KEY_MXL_PAGE_ID = 'app.surface.id';\nexport const KEY_APP_SURFACE_LABEL = 'app.surface.label';\n\nexport enum MXL_TYPES {\n Session = 'ux.session',\n Network = 'perf.network_request',\n Perf = 'perf',\n SystemLog = 'sys.log', // SystemLog is a log emb type that tells the MXL BE to treat this as an MXL Log to be shown in the dashboard.\n SystemException = 'sys.exception',\n WebVital = 'ux.web_vital',\n ResourceFetch = 'ux.resource_fetch',\n DocumentLoad = 'ux.document_load',\n Surface = 'ux.surface',\n}\n\nexport enum MXL_STATES {\n Foreground = 'foreground',\n Background = 'background',\n}\n\nexport enum MXL_NAVIGATION_INSTRUMENTATIONS {\n DeclarativeLegacy = 'react_router_declarative_legacy',\n Declarative = 'react_router_declarative',\n Data = 'react_router_data',\n Manual = 'manual',\n}\n\nexport enum MXL_ERROR_INSTRUMENTATIONS {\n ReactErrorBoundary = 'react_error_boundary',\n}\n\nexport type MXL_INSTRUMENTATIONS =\n | MXL_NAVIGATION_INSTRUMENTATIONS\n | MXL_ERROR_INSTRUMENTATIONS;\n"],"mappings":";AAAA,MAAa,eAAe;AAC5B,MAAa,gBAAgB;AAC7B,MAAa,qBAAqB;AAClC,MAAa,yBAAyB;AACtC,MAAa,2BAA2B;AACxC,MAAa,+BAA+B;AAC5C,MAAa,4BAA4B;AACzC,MAAa,+BAA+B;AAC5C,MAAa,iCAAiC;AAC9C,MAAa,kCAAkC;AAC/C,MAAa,6BAA6B;AAC1C,MAAa,0BAA0B;AACvC,MAAa,qBAAqB;AAClC,MAAa,0BAA0B;AACvC,MAAa,iBAAiB;AAC9B,MAAa,wBAAwB;AACrC,MAAa,wBAAwB;AACrC,MAAa,0BAA0B;AACvC,MAAa,0BAA0B;AACvC,MAAa,qCACX;AACF,MAAa,uBAAuB;AACpC,MAAa,6BAA6B;AAC1C,MAAa,0BAA0B;AACvC,MAAa,4BAA4B;AACzC,MAAa,uBAAuB;AACpC,MAAa,oCACX;AAGF,MAAa,oBAAoB;AACjC,MAAa,kBAAkB;AAC/B,MAAa,wBAAwB;AAErC,IAAY,gDAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGF,IAAY,kDAAL;AACL;AACA;;;AAGF,IAAY,4FAAL;AACL;AACA;AACA;AACA;;;AAGF,IAAY,kFAAL;AACL"}
|
|
1
|
+
{"version":3,"file":"attributes.js","names":[],"sources":["../../src/constants/attributes.ts"],"sourcesContent":["export const KEY_MXL_TYPE = 'mxl.type';\nexport const KEY_MXL_STATE = 'mxl.state';\nexport const KEY_MXL_COLD_START = 'mxl.cold_start';\nexport const KEY_MXL_SESSION_NUMBER = 'mxl.session_number';\nexport const KEY_MXL_EXCEPTION_NUMBER = 'mxl.exception_number';\nexport const KEY_MXL_SDK_STARTUP_DURATION = 'mxl.sdk_startup_duration';\nexport const KEY_PREFIX_MXL_PROPERTIES = 'mxl.properties.';\nexport const KEY_MXL_SESSION_REASON_ENDED = 'mxl.session_end_type';\nexport const KEY_MXL_SESSION_REASON_STARTED = 'mxl.session_start_type';\nexport const KEY_MXL_JS_EXCEPTION_STACKTRACE = 'mxl.stacktrace.js';\nexport const KEY_MXL_EXCEPTION_HANDLING = 'mxl.exception_handling';\nexport const KEY_MXL_EXCEPTION_CAUSE = 'mxl.exception_cause';\nexport const KEY_MXL_ERROR_CODE = 'mxl.error_code';\nexport const KEY_MXL_APP_INSTANCE_ID = 'mxl.app_instance_id';\nexport const KEY_MXL_TAB_ID = 'mxl.tab_id';\nexport const KEY_MXL_SOURCE_TAB_ID = 'mxl.source_tab_id';\nexport const KEY_MXL_EXPERIENCE_ID = 'mxl.experience_id';\nexport const KEY_MXL_ERROR_LOG_COUNT = 'mxl.error_log_count';\nexport const KEY_MXL_INSTRUMENTATION = 'mxl.instrumentation';\nexport const KEY_MXL_UNHANDLED_EXCEPTIONS_COUNT =\n 'mxl.unhandled_exceptions_count';\nexport const KEY_MXL_FROM_STORAGE = 'mxl.from_storage';\nexport const KEY_MXL_JS_FILE_BUNDLE_IDS = 'mxl.js_file_bundle_ids';\nexport const KEY_MXL_W3C_TRACEPARENT = 'mxl.w3c_traceparent';\nexport const KEY_MXL_NAVIGATION_SOURCE = 'mxl.navigation_source';\nexport const KEY_MXL_REFERRER_URL = 'mxl.referrer_url';\nexport const KEY_BROWSER_URL_FULL = 'browser.url.full';\nexport const KEY_MXL_MAX_PENDING_SPANS_REACHED =\n 'mxl.max_pending_spans_reached';\n// In the backend we use 'app.surface.name' and 'app.surface.id' for the page name and id\n// to be consistent with mobile where we use 'app.surface.*' for screen names and ids\nexport const KEY_MXL_PAGE_PATH = 'app.surface.name';\nexport const KEY_MXL_PAGE_ID = 'app.surface.id';\nexport const KEY_APP_SURFACE_LABEL = 'app.surface.label';\n\nexport enum MXL_TYPES {\n Session = 'ux.session',\n Network = 'perf.network_request',\n Perf = 'perf',\n SystemLog = 'sys.log', // SystemLog is a log emb type that tells the MXL BE to treat this as an MXL Log to be shown in the dashboard.\n SystemException = 'sys.exception',\n WebVital = 'ux.web_vital',\n ResourceFetch = 'ux.resource_fetch',\n DocumentLoad = 'ux.document_load',\n Surface = 'ux.surface',\n}\n\nexport enum MXL_STATES {\n Foreground = 'foreground',\n Background = 'background',\n}\n\nexport enum MXL_NAVIGATION_INSTRUMENTATIONS {\n DeclarativeLegacy = 'react_router_declarative_legacy',\n Declarative = 'react_router_declarative',\n Data = 'react_router_data',\n Manual = 'manual',\n}\n\nexport enum MXL_ERROR_INSTRUMENTATIONS {\n ReactErrorBoundary = 'react_error_boundary',\n}\n\nexport type MXL_INSTRUMENTATIONS =\n | MXL_NAVIGATION_INSTRUMENTATIONS\n | MXL_ERROR_INSTRUMENTATIONS;\n"],"mappings":";AAAA,MAAa,eAAe;AAC5B,MAAa,gBAAgB;AAC7B,MAAa,qBAAqB;AAClC,MAAa,yBAAyB;AACtC,MAAa,2BAA2B;AACxC,MAAa,+BAA+B;AAC5C,MAAa,4BAA4B;AACzC,MAAa,+BAA+B;AAC5C,MAAa,iCAAiC;AAC9C,MAAa,kCAAkC;AAC/C,MAAa,6BAA6B;AAC1C,MAAa,0BAA0B;AACvC,MAAa,qBAAqB;AAClC,MAAa,0BAA0B;AACvC,MAAa,iBAAiB;AAC9B,MAAa,wBAAwB;AACrC,MAAa,wBAAwB;AACrC,MAAa,0BAA0B;AACvC,MAAa,0BAA0B;AACvC,MAAa,qCACX;AACF,MAAa,uBAAuB;AACpC,MAAa,6BAA6B;AAC1C,MAAa,0BAA0B;AACvC,MAAa,4BAA4B;AACzC,MAAa,uBAAuB;AACpC,MAAa,uBAAuB;AACpC,MAAa,oCACX;AAGF,MAAa,oBAAoB;AACjC,MAAa,kBAAkB;AAC/B,MAAa,wBAAwB;AAErC,IAAY,gDAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGF,IAAY,kDAAL;AACL;AACA;;;AAGF,IAAY,4FAAL;AACL;AACA;AACA;AACA;;;AAGF,IAAY,kFAAL;AACL"}
|
package/dist/constants/index.cjs
CHANGED
|
@@ -2,6 +2,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
2
2
|
const require_constants_attributes = require('./attributes.cjs');
|
|
3
3
|
|
|
4
4
|
exports.KEY_APP_SURFACE_LABEL = require_constants_attributes.KEY_APP_SURFACE_LABEL;
|
|
5
|
+
exports.KEY_BROWSER_URL_FULL = require_constants_attributes.KEY_BROWSER_URL_FULL;
|
|
5
6
|
exports.KEY_MXL_APP_INSTANCE_ID = require_constants_attributes.KEY_MXL_APP_INSTANCE_ID;
|
|
6
7
|
exports.KEY_MXL_COLD_START = require_constants_attributes.KEY_MXL_COLD_START;
|
|
7
8
|
exports.KEY_MXL_ERROR_CODE = require_constants_attributes.KEY_MXL_ERROR_CODE;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { KEY_APP_SURFACE_LABEL, KEY_MXL_APP_INSTANCE_ID, KEY_MXL_COLD_START, KEY_MXL_ERROR_CODE, KEY_MXL_EXCEPTION_HANDLING, KEY_MXL_EXCEPTION_NUMBER, KEY_MXL_EXPERIENCE_ID, KEY_MXL_FROM_STORAGE, KEY_MXL_INSTRUMENTATION, KEY_MXL_JS_EXCEPTION_STACKTRACE, KEY_MXL_MAX_PENDING_SPANS_REACHED, KEY_MXL_NAVIGATION_SOURCE, KEY_MXL_PAGE_ID, KEY_MXL_PAGE_PATH, KEY_MXL_REFERRER_URL, KEY_MXL_SDK_STARTUP_DURATION, KEY_MXL_SESSION_NUMBER, KEY_MXL_SESSION_REASON_ENDED, KEY_MXL_SESSION_REASON_STARTED, KEY_MXL_SOURCE_TAB_ID, KEY_MXL_STATE, KEY_MXL_TAB_ID, KEY_MXL_TYPE, KEY_MXL_W3C_TRACEPARENT, KEY_PREFIX_MXL_PROPERTIES, MXL_ERROR_INSTRUMENTATIONS, MXL_INSTRUMENTATIONS, MXL_NAVIGATION_INSTRUMENTATIONS, MXL_STATES, MXL_TYPES } from "./attributes.cjs";
|
|
2
|
-
export { KEY_APP_SURFACE_LABEL, KEY_MXL_APP_INSTANCE_ID, KEY_MXL_COLD_START, KEY_MXL_ERROR_CODE, KEY_MXL_EXCEPTION_HANDLING, KEY_MXL_EXCEPTION_NUMBER, KEY_MXL_EXPERIENCE_ID, KEY_MXL_FROM_STORAGE, KEY_MXL_INSTRUMENTATION, KEY_MXL_JS_EXCEPTION_STACKTRACE, KEY_MXL_MAX_PENDING_SPANS_REACHED, KEY_MXL_NAVIGATION_SOURCE, KEY_MXL_PAGE_ID, KEY_MXL_PAGE_PATH, KEY_MXL_REFERRER_URL, KEY_MXL_SDK_STARTUP_DURATION, KEY_MXL_SESSION_NUMBER, KEY_MXL_SESSION_REASON_ENDED, KEY_MXL_SESSION_REASON_STARTED, KEY_MXL_SOURCE_TAB_ID, KEY_MXL_STATE, KEY_MXL_TAB_ID, KEY_MXL_TYPE, KEY_MXL_W3C_TRACEPARENT, KEY_PREFIX_MXL_PROPERTIES, MXL_ERROR_INSTRUMENTATIONS, type MXL_INSTRUMENTATIONS, MXL_NAVIGATION_INSTRUMENTATIONS, MXL_STATES, MXL_TYPES };
|
|
1
|
+
import { KEY_APP_SURFACE_LABEL, KEY_BROWSER_URL_FULL, KEY_MXL_APP_INSTANCE_ID, KEY_MXL_COLD_START, KEY_MXL_ERROR_CODE, KEY_MXL_EXCEPTION_HANDLING, KEY_MXL_EXCEPTION_NUMBER, KEY_MXL_EXPERIENCE_ID, KEY_MXL_FROM_STORAGE, KEY_MXL_INSTRUMENTATION, KEY_MXL_JS_EXCEPTION_STACKTRACE, KEY_MXL_MAX_PENDING_SPANS_REACHED, KEY_MXL_NAVIGATION_SOURCE, KEY_MXL_PAGE_ID, KEY_MXL_PAGE_PATH, KEY_MXL_REFERRER_URL, KEY_MXL_SDK_STARTUP_DURATION, KEY_MXL_SESSION_NUMBER, KEY_MXL_SESSION_REASON_ENDED, KEY_MXL_SESSION_REASON_STARTED, KEY_MXL_SOURCE_TAB_ID, KEY_MXL_STATE, KEY_MXL_TAB_ID, KEY_MXL_TYPE, KEY_MXL_W3C_TRACEPARENT, KEY_PREFIX_MXL_PROPERTIES, MXL_ERROR_INSTRUMENTATIONS, MXL_INSTRUMENTATIONS, MXL_NAVIGATION_INSTRUMENTATIONS, MXL_STATES, MXL_TYPES } from "./attributes.cjs";
|
|
2
|
+
export { KEY_APP_SURFACE_LABEL, KEY_BROWSER_URL_FULL, KEY_MXL_APP_INSTANCE_ID, KEY_MXL_COLD_START, KEY_MXL_ERROR_CODE, KEY_MXL_EXCEPTION_HANDLING, KEY_MXL_EXCEPTION_NUMBER, KEY_MXL_EXPERIENCE_ID, KEY_MXL_FROM_STORAGE, KEY_MXL_INSTRUMENTATION, KEY_MXL_JS_EXCEPTION_STACKTRACE, KEY_MXL_MAX_PENDING_SPANS_REACHED, KEY_MXL_NAVIGATION_SOURCE, KEY_MXL_PAGE_ID, KEY_MXL_PAGE_PATH, KEY_MXL_REFERRER_URL, KEY_MXL_SDK_STARTUP_DURATION, KEY_MXL_SESSION_NUMBER, KEY_MXL_SESSION_REASON_ENDED, KEY_MXL_SESSION_REASON_STARTED, KEY_MXL_SOURCE_TAB_ID, KEY_MXL_STATE, KEY_MXL_TAB_ID, KEY_MXL_TYPE, KEY_MXL_W3C_TRACEPARENT, KEY_PREFIX_MXL_PROPERTIES, MXL_ERROR_INSTRUMENTATIONS, type MXL_INSTRUMENTATIONS, MXL_NAVIGATION_INSTRUMENTATIONS, MXL_STATES, MXL_TYPES };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { KEY_APP_SURFACE_LABEL, KEY_MXL_APP_INSTANCE_ID, KEY_MXL_COLD_START, KEY_MXL_ERROR_CODE, KEY_MXL_EXCEPTION_HANDLING, KEY_MXL_EXCEPTION_NUMBER, KEY_MXL_EXPERIENCE_ID, KEY_MXL_FROM_STORAGE, KEY_MXL_INSTRUMENTATION, KEY_MXL_JS_EXCEPTION_STACKTRACE, KEY_MXL_MAX_PENDING_SPANS_REACHED, KEY_MXL_NAVIGATION_SOURCE, KEY_MXL_PAGE_ID, KEY_MXL_PAGE_PATH, KEY_MXL_REFERRER_URL, KEY_MXL_SDK_STARTUP_DURATION, KEY_MXL_SESSION_NUMBER, KEY_MXL_SESSION_REASON_ENDED, KEY_MXL_SESSION_REASON_STARTED, KEY_MXL_SOURCE_TAB_ID, KEY_MXL_STATE, KEY_MXL_TAB_ID, KEY_MXL_TYPE, KEY_MXL_W3C_TRACEPARENT, KEY_PREFIX_MXL_PROPERTIES, MXL_ERROR_INSTRUMENTATIONS, MXL_INSTRUMENTATIONS, MXL_NAVIGATION_INSTRUMENTATIONS, MXL_STATES, MXL_TYPES } from "./attributes.js";
|
|
2
|
-
export { KEY_APP_SURFACE_LABEL, KEY_MXL_APP_INSTANCE_ID, KEY_MXL_COLD_START, KEY_MXL_ERROR_CODE, KEY_MXL_EXCEPTION_HANDLING, KEY_MXL_EXCEPTION_NUMBER, KEY_MXL_EXPERIENCE_ID, KEY_MXL_FROM_STORAGE, KEY_MXL_INSTRUMENTATION, KEY_MXL_JS_EXCEPTION_STACKTRACE, KEY_MXL_MAX_PENDING_SPANS_REACHED, KEY_MXL_NAVIGATION_SOURCE, KEY_MXL_PAGE_ID, KEY_MXL_PAGE_PATH, KEY_MXL_REFERRER_URL, KEY_MXL_SDK_STARTUP_DURATION, KEY_MXL_SESSION_NUMBER, KEY_MXL_SESSION_REASON_ENDED, KEY_MXL_SESSION_REASON_STARTED, KEY_MXL_SOURCE_TAB_ID, KEY_MXL_STATE, KEY_MXL_TAB_ID, KEY_MXL_TYPE, KEY_MXL_W3C_TRACEPARENT, KEY_PREFIX_MXL_PROPERTIES, MXL_ERROR_INSTRUMENTATIONS, type MXL_INSTRUMENTATIONS, MXL_NAVIGATION_INSTRUMENTATIONS, MXL_STATES, MXL_TYPES };
|
|
1
|
+
import { KEY_APP_SURFACE_LABEL, KEY_BROWSER_URL_FULL, KEY_MXL_APP_INSTANCE_ID, KEY_MXL_COLD_START, KEY_MXL_ERROR_CODE, KEY_MXL_EXCEPTION_HANDLING, KEY_MXL_EXCEPTION_NUMBER, KEY_MXL_EXPERIENCE_ID, KEY_MXL_FROM_STORAGE, KEY_MXL_INSTRUMENTATION, KEY_MXL_JS_EXCEPTION_STACKTRACE, KEY_MXL_MAX_PENDING_SPANS_REACHED, KEY_MXL_NAVIGATION_SOURCE, KEY_MXL_PAGE_ID, KEY_MXL_PAGE_PATH, KEY_MXL_REFERRER_URL, KEY_MXL_SDK_STARTUP_DURATION, KEY_MXL_SESSION_NUMBER, KEY_MXL_SESSION_REASON_ENDED, KEY_MXL_SESSION_REASON_STARTED, KEY_MXL_SOURCE_TAB_ID, KEY_MXL_STATE, KEY_MXL_TAB_ID, KEY_MXL_TYPE, KEY_MXL_W3C_TRACEPARENT, KEY_PREFIX_MXL_PROPERTIES, MXL_ERROR_INSTRUMENTATIONS, MXL_INSTRUMENTATIONS, MXL_NAVIGATION_INSTRUMENTATIONS, MXL_STATES, MXL_TYPES } from "./attributes.js";
|
|
2
|
+
export { KEY_APP_SURFACE_LABEL, KEY_BROWSER_URL_FULL, KEY_MXL_APP_INSTANCE_ID, KEY_MXL_COLD_START, KEY_MXL_ERROR_CODE, KEY_MXL_EXCEPTION_HANDLING, KEY_MXL_EXCEPTION_NUMBER, KEY_MXL_EXPERIENCE_ID, KEY_MXL_FROM_STORAGE, KEY_MXL_INSTRUMENTATION, KEY_MXL_JS_EXCEPTION_STACKTRACE, KEY_MXL_MAX_PENDING_SPANS_REACHED, KEY_MXL_NAVIGATION_SOURCE, KEY_MXL_PAGE_ID, KEY_MXL_PAGE_PATH, KEY_MXL_REFERRER_URL, KEY_MXL_SDK_STARTUP_DURATION, KEY_MXL_SESSION_NUMBER, KEY_MXL_SESSION_REASON_ENDED, KEY_MXL_SESSION_REASON_STARTED, KEY_MXL_SOURCE_TAB_ID, KEY_MXL_STATE, KEY_MXL_TAB_ID, KEY_MXL_TYPE, KEY_MXL_W3C_TRACEPARENT, KEY_PREFIX_MXL_PROPERTIES, MXL_ERROR_INSTRUMENTATIONS, type MXL_INSTRUMENTATIONS, MXL_NAVIGATION_INSTRUMENTATIONS, MXL_STATES, MXL_TYPES };
|
package/dist/constants/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { KEY_APP_SURFACE_LABEL, KEY_MXL_APP_INSTANCE_ID, KEY_MXL_COLD_START, KEY_MXL_ERROR_CODE, KEY_MXL_EXCEPTION_HANDLING, KEY_MXL_EXCEPTION_NUMBER, KEY_MXL_EXPERIENCE_ID, KEY_MXL_FROM_STORAGE, KEY_MXL_INSTRUMENTATION, KEY_MXL_JS_EXCEPTION_STACKTRACE, KEY_MXL_MAX_PENDING_SPANS_REACHED, KEY_MXL_NAVIGATION_SOURCE, KEY_MXL_PAGE_ID, KEY_MXL_PAGE_PATH, KEY_MXL_REFERRER_URL, KEY_MXL_SDK_STARTUP_DURATION, KEY_MXL_SESSION_NUMBER, KEY_MXL_SESSION_REASON_ENDED, KEY_MXL_SESSION_REASON_STARTED, KEY_MXL_SOURCE_TAB_ID, KEY_MXL_STATE, KEY_MXL_TAB_ID, KEY_MXL_TYPE, KEY_MXL_W3C_TRACEPARENT, KEY_PREFIX_MXL_PROPERTIES, MXL_ERROR_INSTRUMENTATIONS, MXL_NAVIGATION_INSTRUMENTATIONS, MXL_STATES, MXL_TYPES } from "./attributes.js";
|
|
1
|
+
import { KEY_APP_SURFACE_LABEL, KEY_BROWSER_URL_FULL, KEY_MXL_APP_INSTANCE_ID, KEY_MXL_COLD_START, KEY_MXL_ERROR_CODE, KEY_MXL_EXCEPTION_HANDLING, KEY_MXL_EXCEPTION_NUMBER, KEY_MXL_EXPERIENCE_ID, KEY_MXL_FROM_STORAGE, KEY_MXL_INSTRUMENTATION, KEY_MXL_JS_EXCEPTION_STACKTRACE, KEY_MXL_MAX_PENDING_SPANS_REACHED, KEY_MXL_NAVIGATION_SOURCE, KEY_MXL_PAGE_ID, KEY_MXL_PAGE_PATH, KEY_MXL_REFERRER_URL, KEY_MXL_SDK_STARTUP_DURATION, KEY_MXL_SESSION_NUMBER, KEY_MXL_SESSION_REASON_ENDED, KEY_MXL_SESSION_REASON_STARTED, KEY_MXL_SOURCE_TAB_ID, KEY_MXL_STATE, KEY_MXL_TAB_ID, KEY_MXL_TYPE, KEY_MXL_W3C_TRACEPARENT, KEY_PREFIX_MXL_PROPERTIES, MXL_ERROR_INSTRUMENTATIONS, MXL_NAVIGATION_INSTRUMENTATIONS, MXL_STATES, MXL_TYPES } from "./attributes.js";
|
|
2
2
|
|
|
3
|
-
export { KEY_APP_SURFACE_LABEL, KEY_MXL_APP_INSTANCE_ID, KEY_MXL_COLD_START, KEY_MXL_ERROR_CODE, KEY_MXL_EXCEPTION_HANDLING, KEY_MXL_EXCEPTION_NUMBER, KEY_MXL_EXPERIENCE_ID, KEY_MXL_FROM_STORAGE, KEY_MXL_INSTRUMENTATION, KEY_MXL_JS_EXCEPTION_STACKTRACE, KEY_MXL_MAX_PENDING_SPANS_REACHED, KEY_MXL_NAVIGATION_SOURCE, KEY_MXL_PAGE_ID, KEY_MXL_PAGE_PATH, KEY_MXL_REFERRER_URL, KEY_MXL_SDK_STARTUP_DURATION, KEY_MXL_SESSION_NUMBER, KEY_MXL_SESSION_REASON_ENDED, KEY_MXL_SESSION_REASON_STARTED, KEY_MXL_SOURCE_TAB_ID, KEY_MXL_STATE, KEY_MXL_TAB_ID, KEY_MXL_TYPE, KEY_MXL_W3C_TRACEPARENT, KEY_PREFIX_MXL_PROPERTIES, MXL_ERROR_INSTRUMENTATIONS, MXL_NAVIGATION_INSTRUMENTATIONS, MXL_STATES, MXL_TYPES };
|
|
3
|
+
export { KEY_APP_SURFACE_LABEL, KEY_BROWSER_URL_FULL, KEY_MXL_APP_INSTANCE_ID, KEY_MXL_COLD_START, KEY_MXL_ERROR_CODE, KEY_MXL_EXCEPTION_HANDLING, KEY_MXL_EXCEPTION_NUMBER, KEY_MXL_EXPERIENCE_ID, KEY_MXL_FROM_STORAGE, KEY_MXL_INSTRUMENTATION, KEY_MXL_JS_EXCEPTION_STACKTRACE, KEY_MXL_MAX_PENDING_SPANS_REACHED, KEY_MXL_NAVIGATION_SOURCE, KEY_MXL_PAGE_ID, KEY_MXL_PAGE_PATH, KEY_MXL_REFERRER_URL, KEY_MXL_SDK_STARTUP_DURATION, KEY_MXL_SESSION_NUMBER, KEY_MXL_SESSION_REASON_ENDED, KEY_MXL_SESSION_REASON_STARTED, KEY_MXL_SOURCE_TAB_ID, KEY_MXL_STATE, KEY_MXL_TAB_ID, KEY_MXL_TYPE, KEY_MXL_W3C_TRACEPARENT, KEY_PREFIX_MXL_PROPERTIES, MXL_ERROR_INSTRUMENTATIONS, MXL_NAVIGATION_INSTRUMENTATIONS, MXL_STATES, MXL_TYPES };
|
package/dist/instrumentations/web-vitals/WebVitalsInstrumentation/WebVitalsInstrumentation.cjs
CHANGED
|
@@ -151,6 +151,7 @@ var WebVitalsInstrumentation = class extends require_instrumentations_MXLInstrum
|
|
|
151
151
|
const attrs = {
|
|
152
152
|
[require_constants_attributes.KEY_MXL_TYPE]: require_constants_attributes.MXL_TYPES.WebVital,
|
|
153
153
|
[_opentelemetry_semantic_conventions.ATTR_URL_FULL]: attributedPage.fullURL,
|
|
154
|
+
[require_constants_attributes.KEY_BROWSER_URL_FULL]: attributedPage.fullURL,
|
|
154
155
|
"mxl.web_vital.navigation_type": metric.navigationType,
|
|
155
156
|
"mxl.web_vital.name": metric.name,
|
|
156
157
|
"mxl.web_vital.rating": metric.rating,
|
package/dist/instrumentations/web-vitals/WebVitalsInstrumentation/WebVitalsInstrumentation.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebVitalsInstrumentation.cjs","names":["MXLInstrumentationBase","WEB_VITALS_ID_TO_LISTENER","page","KEY_MXL_TYPE","MXL_TYPES","ATTR_URL_FULL","KEY_MXL_PAGE_PATH","KEY_MXL_PAGE_ID","KEY_APP_SURFACE_LABEL","MXL_WEB_VITALS_PREFIX"],"sources":["../../../../src/instrumentations/web-vitals/WebVitalsInstrumentation/WebVitalsInstrumentation.ts"],"sourcesContent":["import type { Attributes } from '@opentelemetry/api';\nimport { ATTR_URL_FULL } from '@opentelemetry/semantic-conventions';\nimport type {\n CLSAttribution,\n CLSMetricWithAttribution,\n INPAttribution,\n LCPAttribution,\n Metric,\n MetricWithAttribution,\n} from 'web-vitals/attribution';\nimport type { PageManager } from '../../../api-page/index.ts';\nimport { page } from '../../../api-page/index.ts';\nimport type { URLDocument } from '../../../common/index.ts';\nimport {\n KEY_APP_SURFACE_LABEL,\n KEY_MXL_PAGE_ID,\n KEY_MXL_PAGE_PATH,\n KEY_MXL_TYPE,\n MXL_TYPES,\n} from '../../../constants/index.ts';\nimport { MXLInstrumentationBase } from '../../MXLInstrumentationBase/index.ts';\nimport {\n ALL_WEB_VITALS,\n MXL_WEB_VITALS_PREFIX,\n WEB_VITALS_ID_TO_LISTENER,\n} from './constants.ts';\nimport type {\n WebVitalListeners,\n WebVitalsInstrumentationArgs,\n} from './types.ts';\n\ntype AttributedPage = {\n fullURL: string;\n path?: string;\n pageID?: string;\n label?: string;\n};\n\nconst webVitalAttributionToReport = (\n name: Metric['name'],\n metric: MetricWithAttribution,\n) => {\n const attributes: Attributes = {};\n const toReport: {\n key: string;\n value: string | boolean | number | undefined;\n }[] = [];\n\n if (name === 'CLS') {\n // https://www.npmjs.com/package/web-vitals#CLSAttribution\n const attribution = metric.attribution as CLSAttribution;\n toReport.push(\n ...[\n {\n key: 'largestShiftTarget',\n value: attribution.largestShiftTarget,\n },\n {\n key: 'largestShiftValue',\n value: attribution.largestShiftValue,\n },\n ],\n );\n } else if (name === 'INP') {\n // https://www.npmjs.com/package/web-vitals#inpattribution\n const attribution = metric.attribution as INPAttribution;\n toReport.push(\n ...[\n { key: 'interactionTarget', value: attribution.interactionTarget },\n { key: 'interactionType', value: attribution.interactionType },\n { key: 'nextPaintTime', value: attribution.nextPaintTime },\n { key: 'inputDelay', value: attribution.inputDelay },\n { key: 'processingDuration', value: attribution.processingDuration },\n { key: 'presentationDelay', value: attribution.presentationDelay },\n { key: 'totalScriptDuration', value: attribution.totalScriptDuration },\n {\n key: 'totalStyleAndLayoutDuration',\n value: attribution.totalStyleAndLayoutDuration,\n },\n { key: 'totalPaintDuration', value: attribution.totalPaintDuration },\n {\n key: 'totalUnattributedDuration',\n value: attribution.totalUnattributedDuration,\n },\n { key: 'loadState', value: attribution.loadState },\n ],\n );\n } else if (name === 'LCP') {\n // https://www.npmjs.com/package/web-vitals#lcpattribution\n const attribution = metric.attribution as LCPAttribution;\n toReport.push(\n ...[\n { key: 'target', value: attribution.target },\n { key: 'url', value: attribution.url },\n { key: 'timeToFirstByte', value: attribution.timeToFirstByte },\n { key: 'resourceLoadDelay', value: attribution.resourceLoadDelay },\n {\n key: 'resourceLoadDuration',\n value: attribution.resourceLoadDuration,\n },\n { key: 'elementRenderDelay', value: attribution.elementRenderDelay },\n ],\n );\n }\n\n toReport.forEach((report) => {\n if (report.value !== undefined) {\n attributes[`mxl.web_vital.attribution.${report.key}`] = report.value;\n }\n });\n\n return attributes;\n};\n\nexport class WebVitalsInstrumentation extends MXLInstrumentationBase {\n private readonly _listeners: WebVitalListeners;\n private readonly _urlDocument: URLDocument;\n private readonly _urlAttribution: boolean;\n private readonly _pageManager: PageManager;\n private readonly _attributedPage: Record<\n Metric['name'],\n AttributedPage | undefined\n > = {\n INP: undefined,\n LCP: undefined,\n CLS: undefined,\n FCP: undefined,\n TTFB: undefined,\n };\n private _largestShiftTargetForCLS: string | undefined;\n private _listenersRegistered = false;\n private _isEnabled = false;\n\n // instrumentation that adds an event to the session span for each web vital report\n public constructor({\n diag,\n perf,\n listeners = WEB_VITALS_ID_TO_LISTENER,\n urlDocument = window.document,\n urlAttribution = true,\n pageManager,\n }: WebVitalsInstrumentationArgs = {}) {\n super({\n instrumentationName: 'WebVitalsInstrumentation',\n instrumentationVersion: '1.0.0',\n diag,\n perf,\n config: {},\n });\n this._listeners = listeners;\n this._urlDocument = urlDocument;\n this._urlAttribution = urlAttribution;\n this._pageManager = pageManager ?? page.getPageManager();\n\n if (this._config.enabled) {\n this.enable();\n }\n }\n\n public override disable(): void {\n // web-vitals library doesn't support removing listeners, so we just pause emission\n // https://github.com/GoogleChrome/web-vitals/issues/357#issuecomment-1593439036\n this._isEnabled = false;\n this._diag.debug('WebVitalsInstrumentation disabled, pausing emission');\n }\n\n public enable(): void {\n this._isEnabled = true;\n\n // web-vitals library doesn't support removing listeners, so only register once\n if (this._listenersRegistered) {\n this._diag.debug(\n 'WebVitalsInstrumentation listeners already registered, resuming emission',\n );\n return;\n }\n this._listenersRegistered = true;\n\n ALL_WEB_VITALS.forEach((name) => {\n this._listeners[name]?.((metric) => {\n if (!this._isEnabled) {\n return;\n }\n\n const currentSessionSpan = this.sessionManager.getSessionSpan();\n\n if (!currentSessionSpan) {\n return;\n }\n\n // first thing record the time when this cb was invoked\n const metricTime = this._getTimeForMetric(metric);\n\n const attributedPage = this._getAttributedPageForMetric(metric);\n\n const attrs: Attributes = {\n [KEY_MXL_TYPE]: MXL_TYPES.WebVital,\n [ATTR_URL_FULL]: attributedPage.fullURL,\n 'mxl.web_vital.navigation_type': metric.navigationType,\n 'mxl.web_vital.name': metric.name,\n 'mxl.web_vital.rating': metric.rating,\n 'mxl.web_vital.id': metric.id,\n 'mxl.web_vital.delta': metric.delta,\n 'mxl.web_vital.value': metric.value,\n ...webVitalAttributionToReport(name, metric),\n };\n\n // Add page attributes if route and page ID exist\n if (attributedPage.path && attributedPage.pageID) {\n attrs[KEY_MXL_PAGE_PATH] = attributedPage.path;\n attrs[KEY_MXL_PAGE_ID] = attributedPage.pageID;\n }\n\n if (attributedPage.label) {\n attrs[KEY_APP_SURFACE_LABEL] = attributedPage.label;\n }\n\n currentSessionSpan.addEvent(\n `${MXL_WEB_VITALS_PREFIX}-report-${name}`,\n attrs,\n metricTime,\n );\n });\n });\n\n if (this._urlAttribution) {\n // When these web vitals make their final report (e.g. when the listeners w/ reportAllChanges=false trigger) the\n // document's URL at that time may not match what it was at the time the scores were last updated. Instead, listen\n // for updates to the scores and keep track of the Page information to attribute for each\n this._listeners.TTFB?.(\n () => {\n this._attributedPage.TTFB = this._currentAttributedPage();\n },\n {\n reportAllChanges: true,\n },\n );\n this._listeners.FCP?.(\n () => {\n this._attributedPage.FCP = this._currentAttributedPage();\n },\n {\n reportAllChanges: true,\n },\n );\n this._listeners.INP?.(\n () => {\n this._attributedPage.INP = this._currentAttributedPage();\n },\n {\n reportAllChanges: true,\n },\n );\n this._listeners.LCP?.(\n () => {\n this._attributedPage.LCP = this._currentAttributedPage();\n },\n {\n reportAllChanges: true,\n },\n );\n this._listeners.CLS?.(\n (metric: MetricWithAttribution) => {\n const clsMetric = metric as CLSMetricWithAttribution;\n // A layout shift could cause CLS to change its rating but because the score is cumulative this might not\n // correspond with an updated `largestShiftTarget`. Since we want to tie the attributed URL to the page that\n // the `largestShiftTarget` was on we only update the attributed URL if that target has changed\n if (\n this._largestShiftTargetForCLS !==\n clsMetric.attribution.largestShiftTarget\n ) {\n this._largestShiftTargetForCLS =\n clsMetric.attribution.largestShiftTarget;\n this._attributedPage.CLS = this._currentAttributedPage();\n }\n },\n {\n reportAllChanges: true,\n },\n );\n }\n }\n\n private _getTimeForMetric(metric: MetricWithAttribution): number {\n if (metric.name === 'CLS' && metric.attribution.largestShiftTime) {\n return this.perf.epochMillisFromOriginOffset(\n metric.attribution.largestShiftTime,\n );\n }\n\n if (metric.name === 'INP' && metric.attribution.interactionTime) {\n return this.perf.epochMillisFromOriginOffset(\n metric.attribution.interactionTime,\n );\n }\n\n return this.perf.getNowMillis();\n }\n\n private _currentAttributedPage(): AttributedPage {\n const attributed: AttributedPage = {\n fullURL: this._urlDocument.URL,\n };\n\n const currentRoute = this._pageManager.getCurrentRoute();\n const currentPageId = this._pageManager.getCurrentPageId();\n if (currentRoute && currentPageId) {\n attributed.path = currentRoute.path;\n attributed.pageID = currentPageId;\n }\n\n const pageLabel = this._pageManager.getPageLabel();\n if (pageLabel) {\n attributed.label = pageLabel;\n }\n\n return attributed;\n }\n\n private _getAttributedPageForMetric(\n metric: MetricWithAttribution,\n ): AttributedPage {\n if (metric.name === 'FCP' && this._attributedPage.FCP) {\n return this._attributedPage.FCP;\n }\n\n if (metric.name === 'TTFB' && this._attributedPage.TTFB) {\n return this._attributedPage.TTFB;\n }\n\n if (metric.name === 'INP' && this._attributedPage.INP) {\n return this._attributedPage.INP;\n }\n\n if (metric.name === 'LCP' && this._attributedPage.LCP) {\n return this._attributedPage.LCP;\n }\n\n if (\n metric.name === 'CLS' &&\n this._attributedPage.CLS &&\n metric.attribution.largestShiftTarget === this._largestShiftTargetForCLS\n ) {\n return this._attributedPage.CLS;\n }\n\n return this._currentAttributedPage();\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WebVitalsInstrumentation.cjs","names":["MXLInstrumentationBase","WEB_VITALS_ID_TO_LISTENER","page","KEY_MXL_TYPE","MXL_TYPES","ATTR_URL_FULL","KEY_BROWSER_URL_FULL","KEY_MXL_PAGE_PATH","KEY_MXL_PAGE_ID","KEY_APP_SURFACE_LABEL","MXL_WEB_VITALS_PREFIX"],"sources":["../../../../src/instrumentations/web-vitals/WebVitalsInstrumentation/WebVitalsInstrumentation.ts"],"sourcesContent":["import type { Attributes } from '@opentelemetry/api';\nimport { ATTR_URL_FULL } from '@opentelemetry/semantic-conventions';\nimport type {\n CLSAttribution,\n CLSMetricWithAttribution,\n INPAttribution,\n LCPAttribution,\n Metric,\n MetricWithAttribution,\n} from 'web-vitals/attribution';\nimport type { PageManager } from '../../../api-page/index.ts';\nimport { page } from '../../../api-page/index.ts';\nimport type { URLDocument } from '../../../common/index.ts';\nimport {\n KEY_APP_SURFACE_LABEL,\n KEY_MXL_PAGE_ID,\n KEY_MXL_PAGE_PATH,\n KEY_MXL_TYPE,\n KEY_BROWSER_URL_FULL,\n MXL_TYPES,\n} from '../../../constants/index.ts';\nimport { MXLInstrumentationBase } from '../../MXLInstrumentationBase/index.ts';\nimport {\n ALL_WEB_VITALS,\n MXL_WEB_VITALS_PREFIX,\n WEB_VITALS_ID_TO_LISTENER,\n} from './constants.ts';\nimport type {\n WebVitalListeners,\n WebVitalsInstrumentationArgs,\n} from './types.ts';\n\ntype AttributedPage = {\n fullURL: string;\n path?: string;\n pageID?: string;\n label?: string;\n};\n\nconst webVitalAttributionToReport = (\n name: Metric['name'],\n metric: MetricWithAttribution,\n) => {\n const attributes: Attributes = {};\n const toReport: {\n key: string;\n value: string | boolean | number | undefined;\n }[] = [];\n\n if (name === 'CLS') {\n // https://www.npmjs.com/package/web-vitals#CLSAttribution\n const attribution = metric.attribution as CLSAttribution;\n toReport.push(\n ...[\n {\n key: 'largestShiftTarget',\n value: attribution.largestShiftTarget,\n },\n {\n key: 'largestShiftValue',\n value: attribution.largestShiftValue,\n },\n ],\n );\n } else if (name === 'INP') {\n // https://www.npmjs.com/package/web-vitals#inpattribution\n const attribution = metric.attribution as INPAttribution;\n toReport.push(\n ...[\n { key: 'interactionTarget', value: attribution.interactionTarget },\n { key: 'interactionType', value: attribution.interactionType },\n { key: 'nextPaintTime', value: attribution.nextPaintTime },\n { key: 'inputDelay', value: attribution.inputDelay },\n { key: 'processingDuration', value: attribution.processingDuration },\n { key: 'presentationDelay', value: attribution.presentationDelay },\n { key: 'totalScriptDuration', value: attribution.totalScriptDuration },\n {\n key: 'totalStyleAndLayoutDuration',\n value: attribution.totalStyleAndLayoutDuration,\n },\n { key: 'totalPaintDuration', value: attribution.totalPaintDuration },\n {\n key: 'totalUnattributedDuration',\n value: attribution.totalUnattributedDuration,\n },\n { key: 'loadState', value: attribution.loadState },\n ],\n );\n } else if (name === 'LCP') {\n // https://www.npmjs.com/package/web-vitals#lcpattribution\n const attribution = metric.attribution as LCPAttribution;\n toReport.push(\n ...[\n { key: 'target', value: attribution.target },\n { key: 'url', value: attribution.url },\n { key: 'timeToFirstByte', value: attribution.timeToFirstByte },\n { key: 'resourceLoadDelay', value: attribution.resourceLoadDelay },\n {\n key: 'resourceLoadDuration',\n value: attribution.resourceLoadDuration,\n },\n { key: 'elementRenderDelay', value: attribution.elementRenderDelay },\n ],\n );\n }\n\n toReport.forEach((report) => {\n if (report.value !== undefined) {\n attributes[`mxl.web_vital.attribution.${report.key}`] = report.value;\n }\n });\n\n return attributes;\n};\n\nexport class WebVitalsInstrumentation extends MXLInstrumentationBase {\n private readonly _listeners: WebVitalListeners;\n private readonly _urlDocument: URLDocument;\n private readonly _urlAttribution: boolean;\n private readonly _pageManager: PageManager;\n private readonly _attributedPage: Record<\n Metric['name'],\n AttributedPage | undefined\n > = {\n INP: undefined,\n LCP: undefined,\n CLS: undefined,\n FCP: undefined,\n TTFB: undefined,\n };\n private _largestShiftTargetForCLS: string | undefined;\n private _listenersRegistered = false;\n private _isEnabled = false;\n\n // instrumentation that adds an event to the session span for each web vital report\n public constructor({\n diag,\n perf,\n listeners = WEB_VITALS_ID_TO_LISTENER,\n urlDocument = window.document,\n urlAttribution = true,\n pageManager,\n }: WebVitalsInstrumentationArgs = {}) {\n super({\n instrumentationName: 'WebVitalsInstrumentation',\n instrumentationVersion: '1.0.0',\n diag,\n perf,\n config: {},\n });\n this._listeners = listeners;\n this._urlDocument = urlDocument;\n this._urlAttribution = urlAttribution;\n this._pageManager = pageManager ?? page.getPageManager();\n\n if (this._config.enabled) {\n this.enable();\n }\n }\n\n public override disable(): void {\n // web-vitals library doesn't support removing listeners, so we just pause emission\n // https://github.com/GoogleChrome/web-vitals/issues/357#issuecomment-1593439036\n this._isEnabled = false;\n this._diag.debug('WebVitalsInstrumentation disabled, pausing emission');\n }\n\n public enable(): void {\n this._isEnabled = true;\n\n // web-vitals library doesn't support removing listeners, so only register once\n if (this._listenersRegistered) {\n this._diag.debug(\n 'WebVitalsInstrumentation listeners already registered, resuming emission',\n );\n return;\n }\n this._listenersRegistered = true;\n\n ALL_WEB_VITALS.forEach((name) => {\n this._listeners[name]?.((metric) => {\n if (!this._isEnabled) {\n return;\n }\n\n const currentSessionSpan = this.sessionManager.getSessionSpan();\n\n if (!currentSessionSpan) {\n return;\n }\n\n // first thing record the time when this cb was invoked\n const metricTime = this._getTimeForMetric(metric);\n\n const attributedPage = this._getAttributedPageForMetric(metric);\n\n const attrs: Attributes = {\n [KEY_MXL_TYPE]: MXL_TYPES.WebVital,\n [ATTR_URL_FULL]: attributedPage.fullURL,\n [KEY_BROWSER_URL_FULL]: attributedPage.fullURL,\n 'mxl.web_vital.navigation_type': metric.navigationType,\n 'mxl.web_vital.name': metric.name,\n 'mxl.web_vital.rating': metric.rating,\n 'mxl.web_vital.id': metric.id,\n 'mxl.web_vital.delta': metric.delta,\n 'mxl.web_vital.value': metric.value,\n ...webVitalAttributionToReport(name, metric),\n };\n\n // Add page attributes if route and page ID exist\n if (attributedPage.path && attributedPage.pageID) {\n attrs[KEY_MXL_PAGE_PATH] = attributedPage.path;\n attrs[KEY_MXL_PAGE_ID] = attributedPage.pageID;\n }\n\n if (attributedPage.label) {\n attrs[KEY_APP_SURFACE_LABEL] = attributedPage.label;\n }\n\n currentSessionSpan.addEvent(\n `${MXL_WEB_VITALS_PREFIX}-report-${name}`,\n attrs,\n metricTime,\n );\n });\n });\n\n if (this._urlAttribution) {\n // When these web vitals make their final report (e.g. when the listeners w/ reportAllChanges=false trigger) the\n // document's URL at that time may not match what it was at the time the scores were last updated. Instead, listen\n // for updates to the scores and keep track of the Page information to attribute for each\n this._listeners.TTFB?.(\n () => {\n this._attributedPage.TTFB = this._currentAttributedPage();\n },\n {\n reportAllChanges: true,\n },\n );\n this._listeners.FCP?.(\n () => {\n this._attributedPage.FCP = this._currentAttributedPage();\n },\n {\n reportAllChanges: true,\n },\n );\n this._listeners.INP?.(\n () => {\n this._attributedPage.INP = this._currentAttributedPage();\n },\n {\n reportAllChanges: true,\n },\n );\n this._listeners.LCP?.(\n () => {\n this._attributedPage.LCP = this._currentAttributedPage();\n },\n {\n reportAllChanges: true,\n },\n );\n this._listeners.CLS?.(\n (metric: MetricWithAttribution) => {\n const clsMetric = metric as CLSMetricWithAttribution;\n // A layout shift could cause CLS to change its rating but because the score is cumulative this might not\n // correspond with an updated `largestShiftTarget`. Since we want to tie the attributed URL to the page that\n // the `largestShiftTarget` was on we only update the attributed URL if that target has changed\n if (\n this._largestShiftTargetForCLS !==\n clsMetric.attribution.largestShiftTarget\n ) {\n this._largestShiftTargetForCLS =\n clsMetric.attribution.largestShiftTarget;\n this._attributedPage.CLS = this._currentAttributedPage();\n }\n },\n {\n reportAllChanges: true,\n },\n );\n }\n }\n\n private _getTimeForMetric(metric: MetricWithAttribution): number {\n if (metric.name === 'CLS' && metric.attribution.largestShiftTime) {\n return this.perf.epochMillisFromOriginOffset(\n metric.attribution.largestShiftTime,\n );\n }\n\n if (metric.name === 'INP' && metric.attribution.interactionTime) {\n return this.perf.epochMillisFromOriginOffset(\n metric.attribution.interactionTime,\n );\n }\n\n return this.perf.getNowMillis();\n }\n\n private _currentAttributedPage(): AttributedPage {\n const attributed: AttributedPage = {\n fullURL: this._urlDocument.URL,\n };\n\n const currentRoute = this._pageManager.getCurrentRoute();\n const currentPageId = this._pageManager.getCurrentPageId();\n if (currentRoute && currentPageId) {\n attributed.path = currentRoute.path;\n attributed.pageID = currentPageId;\n }\n\n const pageLabel = this._pageManager.getPageLabel();\n if (pageLabel) {\n attributed.label = pageLabel;\n }\n\n return attributed;\n }\n\n private _getAttributedPageForMetric(\n metric: MetricWithAttribution,\n ): AttributedPage {\n if (metric.name === 'FCP' && this._attributedPage.FCP) {\n return this._attributedPage.FCP;\n }\n\n if (metric.name === 'TTFB' && this._attributedPage.TTFB) {\n return this._attributedPage.TTFB;\n }\n\n if (metric.name === 'INP' && this._attributedPage.INP) {\n return this._attributedPage.INP;\n }\n\n if (metric.name === 'LCP' && this._attributedPage.LCP) {\n return this._attributedPage.LCP;\n }\n\n if (\n metric.name === 'CLS' &&\n this._attributedPage.CLS &&\n metric.attribution.largestShiftTarget === this._largestShiftTargetForCLS\n ) {\n return this._attributedPage.CLS;\n }\n\n return this._currentAttributedPage();\n }\n}\n"],"mappings":"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"}
|
package/dist/instrumentations/web-vitals/WebVitalsInstrumentation/WebVitalsInstrumentation.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebVitalsInstrumentation.d.cts","names":[],"sources":["../../../../src/instrumentations/web-vitals/WebVitalsInstrumentation/WebVitalsInstrumentation.ts"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"WebVitalsInstrumentation.d.cts","names":[],"sources":["../../../../src/instrumentations/web-vitals/WebVitalsInstrumentation/WebVitalsInstrumentation.ts"],"mappings":";;;;cAmHa,wBAAA,SAAiC,sBAAA;EAAA,iBAC3B,UAAA;EAAA,iBACA,YAAA;EAAA,iBACA,eAAA;EAAA,iBACA,YAAA;EAAA,iBACA,eAAA;EAAA,QAUT,yBAAA;EAAA,QACA,oBAAA;EAAA,QACA,UAAA;;IAIN,IAAA;IACA,IAAA;IACA,SAAA;IACA,WAAA;IACA,cAAA;IACA;EAAA,IACC,4BAAA;EAkBa,OAAA,CAAA;EAOT,MAAA,CAAA;EAAA,QAsHC,iBAAA;EAAA,QAgBA,sBAAA;EAAA,QAoBA,2BAAA;AAAA"}
|
package/dist/instrumentations/web-vitals/WebVitalsInstrumentation/WebVitalsInstrumentation.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebVitalsInstrumentation.d.ts","names":[],"sources":["../../../../src/instrumentations/web-vitals/WebVitalsInstrumentation/WebVitalsInstrumentation.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"WebVitalsInstrumentation.d.ts","names":[],"sources":["../../../../src/instrumentations/web-vitals/WebVitalsInstrumentation/WebVitalsInstrumentation.ts"],"mappings":";;;;;cAmHa,wBAAA,SAAiC,sBAAA;EAAA,iBAC3B,UAAA;EAAA,iBACA,YAAA;EAAA,iBACA,eAAA;EAAA,iBACA,YAAA;EAAA,iBACA,eAAA;EAAA,QAUT,yBAAA;EAAA,QACA,oBAAA;EAAA,QACA,UAAA;;IAIN,IAAA;IACA,IAAA;IACA,SAAA;IACA,WAAA;IACA,cAAA;IACA;EAAA,IACC,4BAAA;EAkBa,OAAA,CAAA;EAOT,MAAA,CAAA;EAAA,QAsHC,iBAAA;EAAA,QAgBA,sBAAA;EAAA,QAoBA,2BAAA;AAAA"}
|
package/dist/instrumentations/web-vitals/WebVitalsInstrumentation/WebVitalsInstrumentation.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { KEY_APP_SURFACE_LABEL, KEY_MXL_PAGE_ID, KEY_MXL_PAGE_PATH, KEY_MXL_TYPE, MXL_TYPES } from "../../../constants/attributes.js";
|
|
1
|
+
import { KEY_APP_SURFACE_LABEL, KEY_BROWSER_URL_FULL, KEY_MXL_PAGE_ID, KEY_MXL_PAGE_PATH, KEY_MXL_TYPE, MXL_TYPES } from "../../../constants/attributes.js";
|
|
2
2
|
import { page } from "../../../api-page/pageAPI.js";
|
|
3
3
|
import { MXLInstrumentationBase } from "../../MXLInstrumentationBase/MXLInstrumentationBase.js";
|
|
4
4
|
import { ALL_WEB_VITALS, MXL_WEB_VITALS_PREFIX, WEB_VITALS_ID_TO_LISTENER } from "./constants.js";
|
|
@@ -149,6 +149,7 @@ var WebVitalsInstrumentation = class extends MXLInstrumentationBase {
|
|
|
149
149
|
const attrs = {
|
|
150
150
|
[KEY_MXL_TYPE]: MXL_TYPES.WebVital,
|
|
151
151
|
[ATTR_URL_FULL]: attributedPage.fullURL,
|
|
152
|
+
[KEY_BROWSER_URL_FULL]: attributedPage.fullURL,
|
|
152
153
|
"mxl.web_vital.navigation_type": metric.navigationType,
|
|
153
154
|
"mxl.web_vital.name": metric.name,
|
|
154
155
|
"mxl.web_vital.rating": metric.rating,
|
package/dist/instrumentations/web-vitals/WebVitalsInstrumentation/WebVitalsInstrumentation.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebVitalsInstrumentation.js","names":[],"sources":["../../../../src/instrumentations/web-vitals/WebVitalsInstrumentation/WebVitalsInstrumentation.ts"],"sourcesContent":["import type { Attributes } from '@opentelemetry/api';\nimport { ATTR_URL_FULL } from '@opentelemetry/semantic-conventions';\nimport type {\n CLSAttribution,\n CLSMetricWithAttribution,\n INPAttribution,\n LCPAttribution,\n Metric,\n MetricWithAttribution,\n} from 'web-vitals/attribution';\nimport type { PageManager } from '../../../api-page/index.ts';\nimport { page } from '../../../api-page/index.ts';\nimport type { URLDocument } from '../../../common/index.ts';\nimport {\n KEY_APP_SURFACE_LABEL,\n KEY_MXL_PAGE_ID,\n KEY_MXL_PAGE_PATH,\n KEY_MXL_TYPE,\n MXL_TYPES,\n} from '../../../constants/index.ts';\nimport { MXLInstrumentationBase } from '../../MXLInstrumentationBase/index.ts';\nimport {\n ALL_WEB_VITALS,\n MXL_WEB_VITALS_PREFIX,\n WEB_VITALS_ID_TO_LISTENER,\n} from './constants.ts';\nimport type {\n WebVitalListeners,\n WebVitalsInstrumentationArgs,\n} from './types.ts';\n\ntype AttributedPage = {\n fullURL: string;\n path?: string;\n pageID?: string;\n label?: string;\n};\n\nconst webVitalAttributionToReport = (\n name: Metric['name'],\n metric: MetricWithAttribution,\n) => {\n const attributes: Attributes = {};\n const toReport: {\n key: string;\n value: string | boolean | number | undefined;\n }[] = [];\n\n if (name === 'CLS') {\n // https://www.npmjs.com/package/web-vitals#CLSAttribution\n const attribution = metric.attribution as CLSAttribution;\n toReport.push(\n ...[\n {\n key: 'largestShiftTarget',\n value: attribution.largestShiftTarget,\n },\n {\n key: 'largestShiftValue',\n value: attribution.largestShiftValue,\n },\n ],\n );\n } else if (name === 'INP') {\n // https://www.npmjs.com/package/web-vitals#inpattribution\n const attribution = metric.attribution as INPAttribution;\n toReport.push(\n ...[\n { key: 'interactionTarget', value: attribution.interactionTarget },\n { key: 'interactionType', value: attribution.interactionType },\n { key: 'nextPaintTime', value: attribution.nextPaintTime },\n { key: 'inputDelay', value: attribution.inputDelay },\n { key: 'processingDuration', value: attribution.processingDuration },\n { key: 'presentationDelay', value: attribution.presentationDelay },\n { key: 'totalScriptDuration', value: attribution.totalScriptDuration },\n {\n key: 'totalStyleAndLayoutDuration',\n value: attribution.totalStyleAndLayoutDuration,\n },\n { key: 'totalPaintDuration', value: attribution.totalPaintDuration },\n {\n key: 'totalUnattributedDuration',\n value: attribution.totalUnattributedDuration,\n },\n { key: 'loadState', value: attribution.loadState },\n ],\n );\n } else if (name === 'LCP') {\n // https://www.npmjs.com/package/web-vitals#lcpattribution\n const attribution = metric.attribution as LCPAttribution;\n toReport.push(\n ...[\n { key: 'target', value: attribution.target },\n { key: 'url', value: attribution.url },\n { key: 'timeToFirstByte', value: attribution.timeToFirstByte },\n { key: 'resourceLoadDelay', value: attribution.resourceLoadDelay },\n {\n key: 'resourceLoadDuration',\n value: attribution.resourceLoadDuration,\n },\n { key: 'elementRenderDelay', value: attribution.elementRenderDelay },\n ],\n );\n }\n\n toReport.forEach((report) => {\n if (report.value !== undefined) {\n attributes[`mxl.web_vital.attribution.${report.key}`] = report.value;\n }\n });\n\n return attributes;\n};\n\nexport class WebVitalsInstrumentation extends MXLInstrumentationBase {\n private readonly _listeners: WebVitalListeners;\n private readonly _urlDocument: URLDocument;\n private readonly _urlAttribution: boolean;\n private readonly _pageManager: PageManager;\n private readonly _attributedPage: Record<\n Metric['name'],\n AttributedPage | undefined\n > = {\n INP: undefined,\n LCP: undefined,\n CLS: undefined,\n FCP: undefined,\n TTFB: undefined,\n };\n private _largestShiftTargetForCLS: string | undefined;\n private _listenersRegistered = false;\n private _isEnabled = false;\n\n // instrumentation that adds an event to the session span for each web vital report\n public constructor({\n diag,\n perf,\n listeners = WEB_VITALS_ID_TO_LISTENER,\n urlDocument = window.document,\n urlAttribution = true,\n pageManager,\n }: WebVitalsInstrumentationArgs = {}) {\n super({\n instrumentationName: 'WebVitalsInstrumentation',\n instrumentationVersion: '1.0.0',\n diag,\n perf,\n config: {},\n });\n this._listeners = listeners;\n this._urlDocument = urlDocument;\n this._urlAttribution = urlAttribution;\n this._pageManager = pageManager ?? page.getPageManager();\n\n if (this._config.enabled) {\n this.enable();\n }\n }\n\n public override disable(): void {\n // web-vitals library doesn't support removing listeners, so we just pause emission\n // https://github.com/GoogleChrome/web-vitals/issues/357#issuecomment-1593439036\n this._isEnabled = false;\n this._diag.debug('WebVitalsInstrumentation disabled, pausing emission');\n }\n\n public enable(): void {\n this._isEnabled = true;\n\n // web-vitals library doesn't support removing listeners, so only register once\n if (this._listenersRegistered) {\n this._diag.debug(\n 'WebVitalsInstrumentation listeners already registered, resuming emission',\n );\n return;\n }\n this._listenersRegistered = true;\n\n ALL_WEB_VITALS.forEach((name) => {\n this._listeners[name]?.((metric) => {\n if (!this._isEnabled) {\n return;\n }\n\n const currentSessionSpan = this.sessionManager.getSessionSpan();\n\n if (!currentSessionSpan) {\n return;\n }\n\n // first thing record the time when this cb was invoked\n const metricTime = this._getTimeForMetric(metric);\n\n const attributedPage = this._getAttributedPageForMetric(metric);\n\n const attrs: Attributes = {\n [KEY_MXL_TYPE]: MXL_TYPES.WebVital,\n [ATTR_URL_FULL]: attributedPage.fullURL,\n 'mxl.web_vital.navigation_type': metric.navigationType,\n 'mxl.web_vital.name': metric.name,\n 'mxl.web_vital.rating': metric.rating,\n 'mxl.web_vital.id': metric.id,\n 'mxl.web_vital.delta': metric.delta,\n 'mxl.web_vital.value': metric.value,\n ...webVitalAttributionToReport(name, metric),\n };\n\n // Add page attributes if route and page ID exist\n if (attributedPage.path && attributedPage.pageID) {\n attrs[KEY_MXL_PAGE_PATH] = attributedPage.path;\n attrs[KEY_MXL_PAGE_ID] = attributedPage.pageID;\n }\n\n if (attributedPage.label) {\n attrs[KEY_APP_SURFACE_LABEL] = attributedPage.label;\n }\n\n currentSessionSpan.addEvent(\n `${MXL_WEB_VITALS_PREFIX}-report-${name}`,\n attrs,\n metricTime,\n );\n });\n });\n\n if (this._urlAttribution) {\n // When these web vitals make their final report (e.g. when the listeners w/ reportAllChanges=false trigger) the\n // document's URL at that time may not match what it was at the time the scores were last updated. Instead, listen\n // for updates to the scores and keep track of the Page information to attribute for each\n this._listeners.TTFB?.(\n () => {\n this._attributedPage.TTFB = this._currentAttributedPage();\n },\n {\n reportAllChanges: true,\n },\n );\n this._listeners.FCP?.(\n () => {\n this._attributedPage.FCP = this._currentAttributedPage();\n },\n {\n reportAllChanges: true,\n },\n );\n this._listeners.INP?.(\n () => {\n this._attributedPage.INP = this._currentAttributedPage();\n },\n {\n reportAllChanges: true,\n },\n );\n this._listeners.LCP?.(\n () => {\n this._attributedPage.LCP = this._currentAttributedPage();\n },\n {\n reportAllChanges: true,\n },\n );\n this._listeners.CLS?.(\n (metric: MetricWithAttribution) => {\n const clsMetric = metric as CLSMetricWithAttribution;\n // A layout shift could cause CLS to change its rating but because the score is cumulative this might not\n // correspond with an updated `largestShiftTarget`. Since we want to tie the attributed URL to the page that\n // the `largestShiftTarget` was on we only update the attributed URL if that target has changed\n if (\n this._largestShiftTargetForCLS !==\n clsMetric.attribution.largestShiftTarget\n ) {\n this._largestShiftTargetForCLS =\n clsMetric.attribution.largestShiftTarget;\n this._attributedPage.CLS = this._currentAttributedPage();\n }\n },\n {\n reportAllChanges: true,\n },\n );\n }\n }\n\n private _getTimeForMetric(metric: MetricWithAttribution): number {\n if (metric.name === 'CLS' && metric.attribution.largestShiftTime) {\n return this.perf.epochMillisFromOriginOffset(\n metric.attribution.largestShiftTime,\n );\n }\n\n if (metric.name === 'INP' && metric.attribution.interactionTime) {\n return this.perf.epochMillisFromOriginOffset(\n metric.attribution.interactionTime,\n );\n }\n\n return this.perf.getNowMillis();\n }\n\n private _currentAttributedPage(): AttributedPage {\n const attributed: AttributedPage = {\n fullURL: this._urlDocument.URL,\n };\n\n const currentRoute = this._pageManager.getCurrentRoute();\n const currentPageId = this._pageManager.getCurrentPageId();\n if (currentRoute && currentPageId) {\n attributed.path = currentRoute.path;\n attributed.pageID = currentPageId;\n }\n\n const pageLabel = this._pageManager.getPageLabel();\n if (pageLabel) {\n attributed.label = pageLabel;\n }\n\n return attributed;\n }\n\n private _getAttributedPageForMetric(\n metric: MetricWithAttribution,\n ): AttributedPage {\n if (metric.name === 'FCP' && this._attributedPage.FCP) {\n return this._attributedPage.FCP;\n }\n\n if (metric.name === 'TTFB' && this._attributedPage.TTFB) {\n return this._attributedPage.TTFB;\n }\n\n if (metric.name === 'INP' && this._attributedPage.INP) {\n return this._attributedPage.INP;\n }\n\n if (metric.name === 'LCP' && this._attributedPage.LCP) {\n return this._attributedPage.LCP;\n }\n\n if (\n metric.name === 'CLS' &&\n this._attributedPage.CLS &&\n metric.attribution.largestShiftTarget === this._largestShiftTargetForCLS\n ) {\n return this._attributedPage.CLS;\n }\n\n return this._currentAttributedPage();\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WebVitalsInstrumentation.js","names":[],"sources":["../../../../src/instrumentations/web-vitals/WebVitalsInstrumentation/WebVitalsInstrumentation.ts"],"sourcesContent":["import type { Attributes } from '@opentelemetry/api';\nimport { ATTR_URL_FULL } from '@opentelemetry/semantic-conventions';\nimport type {\n CLSAttribution,\n CLSMetricWithAttribution,\n INPAttribution,\n LCPAttribution,\n Metric,\n MetricWithAttribution,\n} from 'web-vitals/attribution';\nimport type { PageManager } from '../../../api-page/index.ts';\nimport { page } from '../../../api-page/index.ts';\nimport type { URLDocument } from '../../../common/index.ts';\nimport {\n KEY_APP_SURFACE_LABEL,\n KEY_MXL_PAGE_ID,\n KEY_MXL_PAGE_PATH,\n KEY_MXL_TYPE,\n KEY_BROWSER_URL_FULL,\n MXL_TYPES,\n} from '../../../constants/index.ts';\nimport { MXLInstrumentationBase } from '../../MXLInstrumentationBase/index.ts';\nimport {\n ALL_WEB_VITALS,\n MXL_WEB_VITALS_PREFIX,\n WEB_VITALS_ID_TO_LISTENER,\n} from './constants.ts';\nimport type {\n WebVitalListeners,\n WebVitalsInstrumentationArgs,\n} from './types.ts';\n\ntype AttributedPage = {\n fullURL: string;\n path?: string;\n pageID?: string;\n label?: string;\n};\n\nconst webVitalAttributionToReport = (\n name: Metric['name'],\n metric: MetricWithAttribution,\n) => {\n const attributes: Attributes = {};\n const toReport: {\n key: string;\n value: string | boolean | number | undefined;\n }[] = [];\n\n if (name === 'CLS') {\n // https://www.npmjs.com/package/web-vitals#CLSAttribution\n const attribution = metric.attribution as CLSAttribution;\n toReport.push(\n ...[\n {\n key: 'largestShiftTarget',\n value: attribution.largestShiftTarget,\n },\n {\n key: 'largestShiftValue',\n value: attribution.largestShiftValue,\n },\n ],\n );\n } else if (name === 'INP') {\n // https://www.npmjs.com/package/web-vitals#inpattribution\n const attribution = metric.attribution as INPAttribution;\n toReport.push(\n ...[\n { key: 'interactionTarget', value: attribution.interactionTarget },\n { key: 'interactionType', value: attribution.interactionType },\n { key: 'nextPaintTime', value: attribution.nextPaintTime },\n { key: 'inputDelay', value: attribution.inputDelay },\n { key: 'processingDuration', value: attribution.processingDuration },\n { key: 'presentationDelay', value: attribution.presentationDelay },\n { key: 'totalScriptDuration', value: attribution.totalScriptDuration },\n {\n key: 'totalStyleAndLayoutDuration',\n value: attribution.totalStyleAndLayoutDuration,\n },\n { key: 'totalPaintDuration', value: attribution.totalPaintDuration },\n {\n key: 'totalUnattributedDuration',\n value: attribution.totalUnattributedDuration,\n },\n { key: 'loadState', value: attribution.loadState },\n ],\n );\n } else if (name === 'LCP') {\n // https://www.npmjs.com/package/web-vitals#lcpattribution\n const attribution = metric.attribution as LCPAttribution;\n toReport.push(\n ...[\n { key: 'target', value: attribution.target },\n { key: 'url', value: attribution.url },\n { key: 'timeToFirstByte', value: attribution.timeToFirstByte },\n { key: 'resourceLoadDelay', value: attribution.resourceLoadDelay },\n {\n key: 'resourceLoadDuration',\n value: attribution.resourceLoadDuration,\n },\n { key: 'elementRenderDelay', value: attribution.elementRenderDelay },\n ],\n );\n }\n\n toReport.forEach((report) => {\n if (report.value !== undefined) {\n attributes[`mxl.web_vital.attribution.${report.key}`] = report.value;\n }\n });\n\n return attributes;\n};\n\nexport class WebVitalsInstrumentation extends MXLInstrumentationBase {\n private readonly _listeners: WebVitalListeners;\n private readonly _urlDocument: URLDocument;\n private readonly _urlAttribution: boolean;\n private readonly _pageManager: PageManager;\n private readonly _attributedPage: Record<\n Metric['name'],\n AttributedPage | undefined\n > = {\n INP: undefined,\n LCP: undefined,\n CLS: undefined,\n FCP: undefined,\n TTFB: undefined,\n };\n private _largestShiftTargetForCLS: string | undefined;\n private _listenersRegistered = false;\n private _isEnabled = false;\n\n // instrumentation that adds an event to the session span for each web vital report\n public constructor({\n diag,\n perf,\n listeners = WEB_VITALS_ID_TO_LISTENER,\n urlDocument = window.document,\n urlAttribution = true,\n pageManager,\n }: WebVitalsInstrumentationArgs = {}) {\n super({\n instrumentationName: 'WebVitalsInstrumentation',\n instrumentationVersion: '1.0.0',\n diag,\n perf,\n config: {},\n });\n this._listeners = listeners;\n this._urlDocument = urlDocument;\n this._urlAttribution = urlAttribution;\n this._pageManager = pageManager ?? page.getPageManager();\n\n if (this._config.enabled) {\n this.enable();\n }\n }\n\n public override disable(): void {\n // web-vitals library doesn't support removing listeners, so we just pause emission\n // https://github.com/GoogleChrome/web-vitals/issues/357#issuecomment-1593439036\n this._isEnabled = false;\n this._diag.debug('WebVitalsInstrumentation disabled, pausing emission');\n }\n\n public enable(): void {\n this._isEnabled = true;\n\n // web-vitals library doesn't support removing listeners, so only register once\n if (this._listenersRegistered) {\n this._diag.debug(\n 'WebVitalsInstrumentation listeners already registered, resuming emission',\n );\n return;\n }\n this._listenersRegistered = true;\n\n ALL_WEB_VITALS.forEach((name) => {\n this._listeners[name]?.((metric) => {\n if (!this._isEnabled) {\n return;\n }\n\n const currentSessionSpan = this.sessionManager.getSessionSpan();\n\n if (!currentSessionSpan) {\n return;\n }\n\n // first thing record the time when this cb was invoked\n const metricTime = this._getTimeForMetric(metric);\n\n const attributedPage = this._getAttributedPageForMetric(metric);\n\n const attrs: Attributes = {\n [KEY_MXL_TYPE]: MXL_TYPES.WebVital,\n [ATTR_URL_FULL]: attributedPage.fullURL,\n [KEY_BROWSER_URL_FULL]: attributedPage.fullURL,\n 'mxl.web_vital.navigation_type': metric.navigationType,\n 'mxl.web_vital.name': metric.name,\n 'mxl.web_vital.rating': metric.rating,\n 'mxl.web_vital.id': metric.id,\n 'mxl.web_vital.delta': metric.delta,\n 'mxl.web_vital.value': metric.value,\n ...webVitalAttributionToReport(name, metric),\n };\n\n // Add page attributes if route and page ID exist\n if (attributedPage.path && attributedPage.pageID) {\n attrs[KEY_MXL_PAGE_PATH] = attributedPage.path;\n attrs[KEY_MXL_PAGE_ID] = attributedPage.pageID;\n }\n\n if (attributedPage.label) {\n attrs[KEY_APP_SURFACE_LABEL] = attributedPage.label;\n }\n\n currentSessionSpan.addEvent(\n `${MXL_WEB_VITALS_PREFIX}-report-${name}`,\n attrs,\n metricTime,\n );\n });\n });\n\n if (this._urlAttribution) {\n // When these web vitals make their final report (e.g. when the listeners w/ reportAllChanges=false trigger) the\n // document's URL at that time may not match what it was at the time the scores were last updated. Instead, listen\n // for updates to the scores and keep track of the Page information to attribute for each\n this._listeners.TTFB?.(\n () => {\n this._attributedPage.TTFB = this._currentAttributedPage();\n },\n {\n reportAllChanges: true,\n },\n );\n this._listeners.FCP?.(\n () => {\n this._attributedPage.FCP = this._currentAttributedPage();\n },\n {\n reportAllChanges: true,\n },\n );\n this._listeners.INP?.(\n () => {\n this._attributedPage.INP = this._currentAttributedPage();\n },\n {\n reportAllChanges: true,\n },\n );\n this._listeners.LCP?.(\n () => {\n this._attributedPage.LCP = this._currentAttributedPage();\n },\n {\n reportAllChanges: true,\n },\n );\n this._listeners.CLS?.(\n (metric: MetricWithAttribution) => {\n const clsMetric = metric as CLSMetricWithAttribution;\n // A layout shift could cause CLS to change its rating but because the score is cumulative this might not\n // correspond with an updated `largestShiftTarget`. Since we want to tie the attributed URL to the page that\n // the `largestShiftTarget` was on we only update the attributed URL if that target has changed\n if (\n this._largestShiftTargetForCLS !==\n clsMetric.attribution.largestShiftTarget\n ) {\n this._largestShiftTargetForCLS =\n clsMetric.attribution.largestShiftTarget;\n this._attributedPage.CLS = this._currentAttributedPage();\n }\n },\n {\n reportAllChanges: true,\n },\n );\n }\n }\n\n private _getTimeForMetric(metric: MetricWithAttribution): number {\n if (metric.name === 'CLS' && metric.attribution.largestShiftTime) {\n return this.perf.epochMillisFromOriginOffset(\n metric.attribution.largestShiftTime,\n );\n }\n\n if (metric.name === 'INP' && metric.attribution.interactionTime) {\n return this.perf.epochMillisFromOriginOffset(\n metric.attribution.interactionTime,\n );\n }\n\n return this.perf.getNowMillis();\n }\n\n private _currentAttributedPage(): AttributedPage {\n const attributed: AttributedPage = {\n fullURL: this._urlDocument.URL,\n };\n\n const currentRoute = this._pageManager.getCurrentRoute();\n const currentPageId = this._pageManager.getCurrentPageId();\n if (currentRoute && currentPageId) {\n attributed.path = currentRoute.path;\n attributed.pageID = currentPageId;\n }\n\n const pageLabel = this._pageManager.getPageLabel();\n if (pageLabel) {\n attributed.label = pageLabel;\n }\n\n return attributed;\n }\n\n private _getAttributedPageForMetric(\n metric: MetricWithAttribution,\n ): AttributedPage {\n if (metric.name === 'FCP' && this._attributedPage.FCP) {\n return this._attributedPage.FCP;\n }\n\n if (metric.name === 'TTFB' && this._attributedPage.TTFB) {\n return this._attributedPage.TTFB;\n }\n\n if (metric.name === 'INP' && this._attributedPage.INP) {\n return this._attributedPage.INP;\n }\n\n if (metric.name === 'LCP' && this._attributedPage.LCP) {\n return this._attributedPage.LCP;\n }\n\n if (\n metric.name === 'CLS' &&\n this._attributedPage.CLS &&\n metric.attribution.largestShiftTarget === this._largestShiftTargetForCLS\n ) {\n return this._attributedPage.CLS;\n }\n\n return this._currentAttributedPage();\n }\n}\n"],"mappings":"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"}
|