metrics.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import { v4 as uuid } from 'uuid'
  2. import { sendMB } from '../../../infrastructure/event-tracking'
  3. import { trackPdfDownloadEnabled } from './pdf-caching-flags'
  4. import { debugConsole } from '@/utils/debugging'
  5. import { DeliveryLatencies, PdfCachingMetrics } from './types'
  6. import { CompileResponseData } from '@ol-types/compile'
  7. // VERSION should get incremented when making changes to caching behavior or
  8. // adjusting metrics collection.
  9. const VERSION = 9
  10. // editing session id
  11. export const EDITOR_SESSION_ID = uuid()
  12. const pdfCachingMetrics: PdfCachingMetrics = {
  13. viewerId: EDITOR_SESSION_ID,
  14. }
  15. export function getPdfCachingMetrics() {
  16. return pdfCachingMetrics
  17. }
  18. export function trackPdfDownload(
  19. response: CompileResponseData,
  20. compileTimeClientE2E: number,
  21. t0: number
  22. ): {
  23. deliveryLatencies: DeliveryLatencies
  24. firstRenderDone: (args: {
  25. latencyFetch: number
  26. latencyRender: number | undefined
  27. pdfCachingMetrics: typeof pdfCachingMetrics
  28. }) => void
  29. } {
  30. const { timings, pdfCachingMinChunkSize } = response
  31. const deliveryLatencies: DeliveryLatencies = {
  32. compileTimeClientE2E,
  33. compileTimeServerE2E: timings?.compileE2E,
  34. }
  35. // There can be multiple "first" renderings with two pdf viewers.
  36. // E.g. two pdf detach tabs or pdf detacher plus pdf detach.
  37. // Let the pdfCachingMetrics round trip to account for pdf-detach.
  38. let isFirstRender = true
  39. function firstRenderDone({
  40. latencyFetch,
  41. latencyRender,
  42. pdfCachingMetrics,
  43. }: {
  44. latencyFetch: number
  45. latencyRender: number | undefined
  46. pdfCachingMetrics: PdfCachingMetrics
  47. }) {
  48. if (!isFirstRender) return
  49. isFirstRender = false
  50. deliveryLatencies.totalDeliveryTime = Math.ceil(performance.now() - t0)
  51. deliveryLatencies.latencyFetch = latencyFetch
  52. if (latencyRender) {
  53. deliveryLatencies.latencyRender = latencyRender
  54. }
  55. if (trackPdfDownloadEnabled) {
  56. // Submit latency along with compile context.
  57. submitCompileMetrics({
  58. pdfCachingMinChunkSize,
  59. ...deliveryLatencies,
  60. ...pdfCachingMetrics,
  61. })
  62. }
  63. }
  64. return {
  65. deliveryLatencies,
  66. firstRenderDone,
  67. }
  68. }
  69. type Metrics = DeliveryLatencies &
  70. PdfCachingMetrics & { pdfCachingMinChunkSize: number }
  71. function submitCompileMetrics(metrics: Metrics) {
  72. const leanMetrics = {
  73. version: VERSION,
  74. ...metrics,
  75. id: EDITOR_SESSION_ID,
  76. }
  77. debugConsole.log('/event/compile-metrics', JSON.stringify(leanMetrics))
  78. sendMB('compile-metrics-v6', leanMetrics)
  79. }