{"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"}