From e8e0e89c5729470d905986c279c0a8d249b8bab7 Mon Sep 17 00:00:00 2001 From: Georg Bremer Date: Tue, 7 May 2024 15:05:44 +0200 Subject: [PATCH] chore: more granular tracing for processRecurrence --- .../private/mutations/processRecurrence.ts | 115 +++++++++--------- 1 file changed, 59 insertions(+), 56 deletions(-) diff --git a/packages/server/graphql/private/mutations/processRecurrence.ts b/packages/server/graphql/private/mutations/processRecurrence.ts index 606e1c86064..004b98b6736 100644 --- a/packages/server/graphql/private/mutations/processRecurrence.ts +++ b/packages/server/graphql/private/mutations/processRecurrence.ts @@ -158,64 +158,67 @@ const processRecurrence: MutationResolvers['processRecurrence'] = async (_source ) await tracer.trace('processRecurrence.startActiveMeetingSeries', async () => Promise.allSettled( - activeMeetingSeries.map(async (meetingSeries) => { - const seriesTeam = await dataLoader.get('teams').loadNonNull(meetingSeries.teamId) - if (seriesTeam.isArchived || !seriesTeam.isPaid) { - return - } - - const [seriesOrg, lastMeeting] = await Promise.all([ - dataLoader.get('organizations').load(seriesTeam.orgId), - dataLoader.get('lastMeetingByMeetingSeriesId').load(meetingSeries.id) - ]) - - // remove this check after 2024-05-05 - if ( - lastMeeting?.meetingSeriesId !== meetingSeries.id || - lastMeeting.teamId !== meetingSeries.teamId - ) { - const error = new Error( - 'lastMeetingByMeetingSeriesId returned a meeting that does not match the series' - ) - sendToSentry(error) - throw error - } - - if (seriesOrg.lockedAt) { - return - } - - // For meetings that should still be active, start the meeting and set its end time. - // Any subscriptions are handled by the shared meeting start code - const rrule = RRule.fromString(meetingSeries.recurrenceRule) - // technically, RRULE should never return NaN here but there's a bug in the library - // https://github.com/jakubroztocil/rrule/issues/321 - if (isNaN(rrule.options.interval)) { - return - } - - // Only get meetings that should currently be active, i.e. meetings that should have started - // within the last 24 hours, started after the last meeting in the series, and started before - // 'now'. - const fromDate = lastMeeting - ? new Date( - Math.max(lastMeeting.createdAt.getTime() + ms('10m'), now.getTime() - ms('24h')) + activeMeetingSeries.map(async (meetingSeries) => + tracer.trace('processRecurrence.startActiveMeetingSeries.meeting', async (span) => { + span?.setTag('meetingSeriesId', meetingSeries.id) + const seriesTeam = await dataLoader.get('teams').loadNonNull(meetingSeries.teamId) + if (seriesTeam.isArchived || !seriesTeam.isPaid) { + return + } + + const [seriesOrg, lastMeeting] = await Promise.all([ + dataLoader.get('organizations').load(seriesTeam.orgId), + dataLoader.get('lastMeetingByMeetingSeriesId').load(meetingSeries.id) + ]) + + // remove this check after 2024-05-05 + if ( + lastMeeting?.meetingSeriesId !== meetingSeries.id || + lastMeeting.teamId !== meetingSeries.teamId + ) { + const error = new Error( + 'lastMeetingByMeetingSeriesId returned a meeting that does not match the series' ) - : new Date(0) - const newMeetingsStartTimes = rrule.between( - getRRuleDateFromJSDate(fromDate), - getRRuleDateFromJSDate(now) - ) - for (const startTime of newMeetingsStartTimes) { - const err = await startRecurringMeeting( - meetingSeries, - getJSDateFromRRuleDate(startTime), - dataLoader, - subOptions + sendToSentry(error) + throw error + } + + if (seriesOrg.lockedAt) { + return + } + + // For meetings that should still be active, start the meeting and set its end time. + // Any subscriptions are handled by the shared meeting start code + const rrule = RRule.fromString(meetingSeries.recurrenceRule) + // technically, RRULE should never return NaN here but there's a bug in the library + // https://github.com/jakubroztocil/rrule/issues/321 + if (isNaN(rrule.options.interval)) { + return + } + + // Only get meetings that should currently be active, i.e. meetings that should have started + // within the last 24 hours, started after the last meeting in the series, and started before + // 'now'. + const fromDate = lastMeeting + ? new Date( + Math.max(lastMeeting.createdAt.getTime() + ms('10m'), now.getTime() - ms('24h')) + ) + : new Date(0) + const newMeetingsStartTimes = rrule.between( + getRRuleDateFromJSDate(fromDate), + getRRuleDateFromJSDate(now) ) - if (!err) meetingsStarted++ - } - }) + for (const startTime of newMeetingsStartTimes) { + const err = await startRecurringMeeting( + meetingSeries, + getJSDateFromRRuleDate(startTime), + dataLoader, + subOptions + ) + if (!err) meetingsStarted++ + } + }) + ) ) )