UNPKG

@embrace-io/web-sdk

Version:
1 lines 7.58 kB
{"version":3,"file":"UserTimingInstrumentation.cjs","names":["EmbraceInstrumentationBase","createPerformanceObserver","KEY_EMB_TYPE","KEY_EMB_INSTRUMENTATION","KEY_EMB_USER_TIMING_ENTRY_TYPE","KEY_EMB_USER_TIMING_START_TIME","KEY_EMB_USER_TIMING_DURATION","USER_TIMING_EVENT_NAME","SeverityNumber","KEY_EMB_USER_TIMING_NAME"],"sources":["../../../../src/instrumentations/user-timing/UserTimingInstrumentation/UserTimingInstrumentation.ts"],"sourcesContent":["import { SeverityNumber } from '@opentelemetry/api-logs';\nimport { EMB_PERFORMANCE_INSTRUMENTATIONS } from '../../../constants/attributes.ts';\nimport {\n EMB_TYPES,\n KEY_EMB_INSTRUMENTATION,\n KEY_EMB_TYPE,\n} from '../../../constants/index.ts';\nimport { createPerformanceObserver } from '../../../utils/index.ts';\nimport { EmbraceInstrumentationBase } from '../../EmbraceInstrumentationBase/index.ts';\nimport {\n KEY_EMB_USER_TIMING_DETAIL,\n KEY_EMB_USER_TIMING_DURATION,\n KEY_EMB_USER_TIMING_ENTRY_TYPE,\n KEY_EMB_USER_TIMING_NAME,\n KEY_EMB_USER_TIMING_START_TIME,\n USER_TIMING_EVENT_NAME,\n} from './constants.ts';\nimport type {\n UserTimingEntryFilter,\n UserTimingInstrumentationArgs,\n} from './types.ts';\n\nexport class UserTimingInstrumentation extends EmbraceInstrumentationBase {\n private _markObserver: PerformanceObserver | null = null;\n private _measureObserver: PerformanceObserver | null = null;\n private _seenEntries: Set<string> = new Set();\n private readonly _allowedEntries: UserTimingEntryFilter | undefined;\n\n public constructor({\n diag,\n perf,\n limitManager,\n allowedEntries,\n }: UserTimingInstrumentationArgs = {}) {\n super({\n instrumentationName: 'UserTimingInstrumentation',\n instrumentationVersion: '1.0.0',\n diag,\n perf,\n limitManager,\n config: {},\n });\n this._allowedEntries = allowedEntries;\n\n if (this._config.enabled) {\n this.enable();\n }\n }\n\n public override onEnable(): void {\n this._seenEntries = new Set();\n\n if (this._markObserver) {\n this._markObserver.disconnect();\n }\n if (this._measureObserver) {\n this._measureObserver.disconnect();\n }\n\n this._markObserver = createPerformanceObserver<PerformanceMark>(\n 'mark',\n this._processEntry.bind(this),\n { diag: this._diag },\n );\n\n if (!this._markObserver) {\n this._diag.error('failed to enable mark observer');\n }\n\n this._measureObserver = createPerformanceObserver<PerformanceMeasure>(\n 'measure',\n (entry) => this._processEntry(entry),\n { diag: this._diag },\n );\n\n if (!this._measureObserver) {\n this._diag.error('failed to enable measure observer');\n }\n\n if (!this._markObserver && !this._measureObserver) {\n this._isEnabled = false;\n }\n }\n\n public onDisable(): void {\n if (this._markObserver) {\n this._markObserver.disconnect();\n this._markObserver = null;\n }\n\n if (this._measureObserver) {\n this._measureObserver.disconnect();\n this._measureObserver = null;\n }\n\n this._seenEntries = new Set();\n }\n\n private _processEntry(entry: PerformanceMark | PerformanceMeasure): void {\n if (!this._isEnabled) {\n return;\n }\n\n if (this._allowedEntries !== undefined) {\n const allowed = Array.isArray(this._allowedEntries)\n ? this._allowedEntries.includes(entry.name)\n : this._allowedEntries(entry);\n if (!allowed) {\n return;\n }\n }\n\n const key = `${location.href}::${entry.name}`;\n // De-duplicate entries by name and page URL, only processing the first occurrence of each unique name on each page URL\n if (this._seenEntries.has(key)) {\n return;\n }\n this._seenEntries.add(key);\n\n if (\n this.limitManager?.limitUserTimingEntry(\n entry.entryType as 'mark' | 'measure',\n )\n ) {\n return;\n }\n\n if (entry.entryType === 'measure') {\n const measureDetail = (entry as PerformanceMeasure).detail;\n const span = this.tracer.startSpan(entry.name, {\n startTime: this.perf.epochMillisFromOrigin(entry.startTime),\n attributes: {\n [KEY_EMB_TYPE]: EMB_TYPES.UserTiming,\n [KEY_EMB_INSTRUMENTATION]:\n EMB_PERFORMANCE_INSTRUMENTATIONS.UserTiming,\n [KEY_EMB_USER_TIMING_ENTRY_TYPE]: entry.entryType,\n [KEY_EMB_USER_TIMING_START_TIME]: this.perf.millisFromZeroTime(\n entry.startTime,\n ),\n [KEY_EMB_USER_TIMING_DURATION]: entry.duration,\n ...(measureDetail != null && {\n [KEY_EMB_USER_TIMING_DETAIL]: JSON.stringify(measureDetail),\n }),\n },\n });\n span.end(\n this.perf.epochMillisFromOrigin(entry.startTime + entry.duration),\n );\n return;\n }\n\n const detail = (entry as PerformanceMark).detail;\n const body = detail != null ? JSON.stringify(detail) : undefined;\n\n this.logger.emit({\n timestamp: this.perf.epochMillisFromOrigin(entry.startTime),\n eventName: USER_TIMING_EVENT_NAME,\n severityNumber: SeverityNumber.INFO,\n attributes: {\n [KEY_EMB_TYPE]: EMB_TYPES.UserTiming,\n [KEY_EMB_USER_TIMING_NAME]: entry.name,\n [KEY_EMB_USER_TIMING_START_TIME]: this.perf.millisFromZeroTime(\n entry.startTime,\n ),\n [KEY_EMB_USER_TIMING_DURATION]: entry.duration,\n [KEY_EMB_USER_TIMING_ENTRY_TYPE]: entry.entryType,\n },\n body,\n });\n }\n}\n"],"mappings":";;;;;;;AAsBA,IAAa,4BAAb,cAA+CA,+EAAAA,2BAA2B;CACxE,gBAAoD;CACpD,mBAAuD;CACvD,+BAAoC,IAAI,IAAI;CAC5C;CAEA,YAAmB,EACjB,MACA,MACA,cACA,mBACiC,CAAC,GAAG;EACrC,MAAM;GACJ,qBAAqB;GACrB,wBAAwB;GACxB;GACA;GACA;GACA,QAAQ,CAAC;EACX,CAAC;EACD,KAAK,kBAAkB;EAEvB,IAAI,KAAK,QAAQ,SACf,KAAK,OAAO;CAEhB;CAEA,WAAiC;EAC/B,KAAK,+BAAe,IAAI,IAAI;EAE5B,IAAI,KAAK,eACP,KAAK,cAAc,WAAW;EAEhC,IAAI,KAAK,kBACP,KAAK,iBAAiB,WAAW;EAGnC,KAAK,gBAAgBC,sDAAAA,0BACnB,QACA,KAAK,cAAc,KAAK,IAAI,GAC5B,EAAE,MAAM,KAAK,MAAM,CACrB;EAEA,IAAI,CAAC,KAAK,eACR,KAAK,MAAM,MAAM,gCAAgC;EAGnD,KAAK,mBAAmBA,sDAAAA,0BACtB,YACC,UAAU,KAAK,cAAc,KAAK,GACnC,EAAE,MAAM,KAAK,MAAM,CACrB;EAEA,IAAI,CAAC,KAAK,kBACR,KAAK,MAAM,MAAM,mCAAmC;EAGtD,IAAI,CAAC,KAAK,iBAAiB,CAAC,KAAK,kBAC/B,KAAK,aAAa;CAEtB;CAEA,YAAyB;EACvB,IAAI,KAAK,eAAe;GACtB,KAAK,cAAc,WAAW;GAC9B,KAAK,gBAAgB;EACvB;EAEA,IAAI,KAAK,kBAAkB;GACzB,KAAK,iBAAiB,WAAW;GACjC,KAAK,mBAAmB;EAC1B;EAEA,KAAK,+BAAe,IAAI,IAAI;CAC9B;CAEA,cAAsB,OAAmD;EACvE,IAAI,CAAC,KAAK,YACR;EAGF,IAAI,KAAK,oBAAoB,KAAA;OAIvB,EAHY,MAAM,QAAQ,KAAK,eAAe,IAC9C,KAAK,gBAAgB,SAAS,MAAM,IAAI,IACxC,KAAK,gBAAgB,KAAK,IAE5B;EAAA;EAIJ,MAAM,MAAM,GAAG,SAAS,KAAK,IAAI,MAAM;EAEvC,IAAI,KAAK,aAAa,IAAI,GAAG,GAC3B;EAEF,KAAK,aAAa,IAAI,GAAG;EAEzB,IACE,KAAK,cAAc,qBACjB,MAAM,SACR,GAEA;EAGF,IAAI,MAAM,cAAc,WAAW;GACjC,MAAM,gBAAiB,MAA6B;GAiBpD,KAhBkB,OAAO,UAAU,MAAM,MAAM;IAC7C,WAAW,KAAK,KAAK,sBAAsB,MAAM,SAAS;IAC1D,YAAY;MACTC,6BAAAA,eAAAA;MACAC,6BAAAA,0BAAAA;MAEAC,yEAAAA,iCAAiC,MAAM;MACvCC,yEAAAA,iCAAiC,KAAK,KAAK,mBAC1C,MAAM,SACR;MACCC,yEAAAA,+BAA+B,MAAM;KACtC,GAAI,iBAAiB,QAAQ,GAAA,2BACG,KAAK,UAAU,aAAa,EAC5D;IACF;GACF,CACG,CAAC,CAAC,IACH,KAAK,KAAK,sBAAsB,MAAM,YAAY,MAAM,QAAQ,CAClE;GACA;EACF;EAEA,MAAM,SAAU,MAA0B;EAC1C,MAAM,OAAO,UAAU,OAAO,KAAK,UAAU,MAAM,IAAI,KAAA;EAEvD,KAAK,OAAO,KAAK;GACf,WAAW,KAAK,KAAK,sBAAsB,MAAM,SAAS;GAC1D,WAAWC,yEAAAA;GACX,gBAAgBC,wBAAAA,eAAe;GAC/B,YAAY;KACTN,6BAAAA,eAAAA;KACAO,yEAAAA,2BAA2B,MAAM;KACjCJ,yEAAAA,iCAAiC,KAAK,KAAK,mBAC1C,MAAM,SACR;KACCC,yEAAAA,+BAA+B,MAAM;KACrCF,yEAAAA,iCAAiC,MAAM;GAC1C;GACA;EACF,CAAC;CACH;AACF"}