report.ts 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import 'reflect-metadata'
  2. import 'newrelic'
  3. import { Logger } from 'winston'
  4. import { ContainerConfigLoader } from '../src/Bootstrap/Container'
  5. import TYPES from '../src/Bootstrap/Types'
  6. import { Env } from '../src/Bootstrap/Env'
  7. import {
  8. DomainEventPublisherInterface,
  9. DailyAnalyticsReportGeneratedEvent,
  10. DomainEventService,
  11. } from '@standardnotes/domain-events'
  12. import { AnalyticsActivity, AnalyticsStoreInterface, Period, StatisticsStoreInterface } from '@standardnotes/analytics'
  13. const requestReport = async (
  14. analyticsStore: AnalyticsStoreInterface,
  15. statisticsStore: StatisticsStoreInterface,
  16. domainEventPublisher: DomainEventPublisherInterface,
  17. ): Promise<void> => {
  18. const event: DailyAnalyticsReportGeneratedEvent = {
  19. type: 'DAILY_ANALYTICS_REPORT_GENERATED',
  20. createdAt: new Date(),
  21. meta: {
  22. correlation: {
  23. userIdentifier: '',
  24. userIdentifierType: 'uuid',
  25. },
  26. origin: DomainEventService.ApiGateway,
  27. },
  28. payload: {
  29. applicationStatistics: await statisticsStore.getYesterdayApplicationUsage(),
  30. snjsStatistics: await statisticsStore.getYesterdaySNJSUsage(),
  31. outOfSyncIncidents: await statisticsStore.getYesterdayOutOfSyncIncidents(),
  32. activityStatistics: [
  33. {
  34. name: AnalyticsActivity.EditingItems,
  35. retention: await analyticsStore.calculateActivityRetention(
  36. AnalyticsActivity.EditingItems,
  37. Period.DayBeforeYesterday,
  38. Period.Yesterday,
  39. ),
  40. totalCount: await analyticsStore.calculateActivityTotalCount(
  41. AnalyticsActivity.EditingItems,
  42. Period.Yesterday,
  43. ),
  44. },
  45. ],
  46. },
  47. }
  48. await domainEventPublisher.publish(event)
  49. }
  50. const container = new ContainerConfigLoader()
  51. void container.load().then((container) => {
  52. const env: Env = new Env()
  53. env.load()
  54. const logger: Logger = container.get(TYPES.Logger)
  55. logger.info('Starting usage report generation...')
  56. const analyticsStore: AnalyticsStoreInterface = container.get(TYPES.AnalyticsStore)
  57. const statisticsStore: StatisticsStoreInterface = container.get(TYPES.StatisticsStore)
  58. const domainEventPublisher: DomainEventPublisherInterface = container.get(TYPES.DomainEventPublisher)
  59. Promise.resolve(requestReport(analyticsStore, statisticsStore, domainEventPublisher))
  60. .then(() => {
  61. logger.info('Usage report generation complete')
  62. process.exit(0)
  63. })
  64. .catch((error) => {
  65. logger.error(`Could not finish usage report generation: ${error.message}`)
  66. process.exit(1)
  67. })
  68. })