metrics.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import { v4 as uuid } from 'uuid'
  2. import { sendMB } from '../../../infrastructure/event-tracking'
  3. import getMeta from '../../../utils/meta'
  4. // VERSION should get incremented when making changes to caching behavior or
  5. // adjusting metrics collection.
  6. const VERSION = 3
  7. // editing session id
  8. const EDITOR_SESSION_ID = uuid()
  9. let pdfCachingMetrics
  10. export function setCachingMetrics(metrics) {
  11. pdfCachingMetrics = metrics
  12. }
  13. export function trackPdfDownload(response, compileTimeClientE2E) {
  14. const { stats, timings } = response
  15. const t0 = performance.now()
  16. const deliveryLatencies = {
  17. compileTimeClientE2E,
  18. compileTimeServerE2E: timings?.compileE2E,
  19. }
  20. function firstRenderDone({ timePDFFetched, timePDFRendered }) {
  21. const latencyFetch = Math.ceil(timePDFFetched - t0)
  22. deliveryLatencies.latencyFetch = latencyFetch
  23. // The renderer does not yield in case the browser tab is hidden.
  24. // It will yield when the browser tab is visible again.
  25. // This will skew our performance metrics for rendering!
  26. // We are omitting the render time in case we detect this state.
  27. let latencyRender
  28. if (timePDFRendered) {
  29. latencyRender = Math.ceil(timePDFRendered - timePDFFetched)
  30. deliveryLatencies.latencyRender = latencyRender
  31. }
  32. done({ latencyFetch, latencyRender })
  33. }
  34. let done
  35. const onFirstRenderDone = new Promise(resolve => {
  36. done = resolve
  37. })
  38. if (getMeta('ol-trackPdfDownload')) {
  39. // Submit latency along with compile context.
  40. onFirstRenderDone.then(({ latencyFetch, latencyRender }) => {
  41. submitCompileMetrics({
  42. latencyFetch,
  43. latencyRender,
  44. compileTimeClientE2E,
  45. stats,
  46. timings,
  47. })
  48. })
  49. }
  50. return {
  51. deliveryLatencies,
  52. firstRenderDone,
  53. }
  54. }
  55. function submitCompileMetrics(metrics) {
  56. const { latencyFetch, latencyRender, compileTimeClientE2E } = metrics
  57. const leanMetrics = {
  58. version: VERSION,
  59. latencyFetch,
  60. latencyRender,
  61. compileTimeClientE2E,
  62. id: EDITOR_SESSION_ID,
  63. ...(pdfCachingMetrics || {}),
  64. }
  65. sl_console.log('/event/compile-metrics', JSON.stringify(metrics))
  66. sendMB('compile-metrics-v6', leanMetrics)
  67. }