synthesizeEventPair(metric, timeOriginEvt) {
    // We'll masquerade our fake events to look mostly like the timeOrigin event
    const eventBase = {
      pid: timeOriginEvt.pid,
      tid: timeOriginEvt.tid,
      cat: 'blink.user_timing',
      name: metric.name,
      args: {},
      // randomized id is same for the pair
      id: `0x${((Math.random() * 1000000) | 0).toString(16)}`,
    };
    const fakeMeasureStartEvent = Object.assign({}, eventBase, {
      ts: timeOriginEvt.ts,
      ph: 'b',
    });
    const fakeMeasureEndEvent = Object.assign({}, eventBase, {
      ts: metric.ts,
      ph: 'e',
    });
    return /** @type {Array<LH.TraceEvent>} */ ([fakeMeasureStartEvent, fakeMeasureEndEvent]);
  }
Constructs performance.measure trace events, which have start/end events as follows:
    { "pid": 89922,"tid":1295,"ts":77176783452,"ph":"b","cat":"blink.user_timing","name":"innermeasure","args":{},"tts":1257886,"id":"0xe66c67"}
    { "pid": 89922,"tid":1295,"ts":77176882592,"ph":"e","cat":"blink.user_timing","name":"innermeasure","args":{},"tts":1257898,"id":"0xe66c67"}
@param {{ts: number, id: string, name: string}} metric
@param {{pid: number, tid: number, ts: number}} timeOriginEvt
@return {Array<LH.TraceEvent>} Pair of trace events (start/end)