From aca2b29aa439318fda2d0a2755ef1410154ee072 Mon Sep 17 00:00:00 2001 From: Ash Davis <11312962+Shpadoinkle@users.noreply.github.com> Date: Wed, 22 May 2024 18:51:14 +1000 Subject: [PATCH] feat: better logging for failed webhooks (#14825) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Peer Richelsen Co-authored-by: Carina Wollendorfer <30310907+CarinaWolli@users.noreply.github.com> Co-authored-by: Omar López --- apps/web/pages/api/recorded-daily-video.ts | 5 ++++- .../features/bookings/lib/handleBookingRequested.ts | 6 +++--- .../features/bookings/lib/handleCancelBooking.ts | 6 +++++- packages/features/bookings/lib/handleConfirmation.ts | 12 ++++++------ .../lib/handleSeats/cancel/cancelAttendeeSeat.ts | 8 +++++--- .../features/bookings/lib/handleWebhookTrigger.ts | 7 ++++--- .../viewer/bookings/requestReschedule.handler.ts | 5 ++++- 7 files changed, 31 insertions(+), 18 deletions(-) diff --git a/apps/web/pages/api/recorded-daily-video.ts b/apps/web/pages/api/recorded-daily-video.ts index 715acd1d71..cf3fe95eca 100644 --- a/apps/web/pages/api/recorded-daily-video.ts +++ b/apps/web/pages/api/recorded-daily-video.ts @@ -80,7 +80,10 @@ const triggerWebhook = async ({ ...evt, downloadLink, }).catch((e) => { - console.error(`Error executing webhook for event: ${eventTrigger}, URL: ${webhook.subscriberUrl}`, e); + log.error( + `Error executing webhook for event: ${eventTrigger}, URL: ${webhook.subscriberUrl}, bookingId: ${evt.bookingId}, bookingUid: ${evt.uid}`, + safeStringify(e) + ); }) ); await Promise.all(promises); diff --git a/packages/features/bookings/lib/handleBookingRequested.ts b/packages/features/bookings/lib/handleBookingRequested.ts index 0798191fe6..3d785987b5 100644 --- a/packages/features/bookings/lib/handleBookingRequested.ts +++ b/packages/features/bookings/lib/handleBookingRequested.ts @@ -60,9 +60,9 @@ export async function handleBookingRequested(args: { sub, webhookPayload ).catch((e) => { - console.error( - `Error executing webhook for event: ${WebhookTriggerEvents.BOOKING_REQUESTED}, URL: ${sub.subscriberUrl}`, - e + log.error( + `Error executing webhook for event: ${WebhookTriggerEvents.BOOKING_REQUESTED}, URL: ${sub.subscriberUrl}, bookingId: ${evt.bookingId}, bookingUid: ${evt.uid}`, + safeStringify(e) ); }) ); diff --git a/packages/features/bookings/lib/handleCancelBooking.ts b/packages/features/bookings/lib/handleCancelBooking.ts index badb3241e0..360bbc9417 100644 --- a/packages/features/bookings/lib/handleCancelBooking.ts +++ b/packages/features/bookings/lib/handleCancelBooking.ts @@ -19,6 +19,7 @@ import { isPrismaObjOrUndefined, parseRecurringEvent } from "@calcom/lib"; import { getTeamIdFromEventType } from "@calcom/lib/getTeamIdFromEventType"; import { HttpError } from "@calcom/lib/http-error"; import logger from "@calcom/lib/logger"; +import { safeStringify } from "@calcom/lib/safeStringify"; import { getTranslation } from "@calcom/lib/server/i18n"; import { getTimeFormatStringFromUserTimeFormat } from "@calcom/lib/timeFormat"; import prisma, { bookingMinimalSelect } from "@calcom/prisma"; @@ -307,7 +308,10 @@ async function handler(req: CustomRequest) { status: "CANCELLED", smsReminderNumber: bookingToDelete.smsReminderNumber || undefined, }).catch((e) => { - console.error(`Error executing webhook for event: ${eventTrigger}, URL: ${webhook.subscriberUrl}`, e); + logger.error( + `Error executing webhook for event: ${eventTrigger}, URL: ${webhook.subscriberUrl}, bookingId: ${evt.bookingId}, bookingUid: ${evt.uid}`, + safeStringify(e) + ); }) ); await Promise.all(promises); diff --git a/packages/features/bookings/lib/handleConfirmation.ts b/packages/features/bookings/lib/handleConfirmation.ts index 380f74b293..af20d51014 100644 --- a/packages/features/bookings/lib/handleConfirmation.ts +++ b/packages/features/bookings/lib/handleConfirmation.ts @@ -369,9 +369,9 @@ export async function handleConfirmation(args: { smsReminderNumber: booking.smsReminderNumber || undefined, metadata: meetingUrl ? { videoCallUrl: meetingUrl } : undefined, }).catch((e) => { - console.error( - `Error executing webhook for event: ${WebhookTriggerEvents.BOOKING_CREATED}, URL: ${sub.subscriberUrl}`, - e + log.error( + `Error executing webhook for event: ${WebhookTriggerEvents.BOOKING_CREATED}, URL: ${sub.subscriberUrl}, bookingId: ${evt.bookingId}, bookingUid: ${evt.uid}`, + safeStringify(e) ); }) ); @@ -426,9 +426,9 @@ export async function handleConfirmation(args: { ...(paid ? paymentMetadata : {}), }, }).catch((e) => { - console.error( - `Error executing webhook for event: ${WebhookTriggerEvents.BOOKING_PAID}, URL: ${sub.subscriberUrl}`, - e + log.error( + `Error executing webhook for event: ${WebhookTriggerEvents.BOOKING_PAID}, URL: ${sub.subscriberUrl}, bookingId: ${evt.bookingId}, bookingUid: ${evt.uid}`, + safeStringify(e) ); }) ); diff --git a/packages/features/bookings/lib/handleSeats/cancel/cancelAttendeeSeat.ts b/packages/features/bookings/lib/handleSeats/cancel/cancelAttendeeSeat.ts index 91fe47308e..0473710af4 100644 --- a/packages/features/bookings/lib/handleSeats/cancel/cancelAttendeeSeat.ts +++ b/packages/features/bookings/lib/handleSeats/cancel/cancelAttendeeSeat.ts @@ -7,6 +7,8 @@ import { deleteScheduledWhatsappReminder } from "@calcom/features/ee/workflows/l import sendPayload from "@calcom/features/webhooks/lib/sendOrSchedulePayload"; import type { EventTypeInfo } from "@calcom/features/webhooks/lib/sendPayload"; import { HttpError } from "@calcom/lib/http-error"; +import logger from "@calcom/lib/logger"; +import { safeStringify } from "@calcom/lib/safeStringify"; import { getTranslation } from "@calcom/lib/server/i18n"; import prisma from "@calcom/prisma"; import { WebhookTriggerEvents, WorkflowMethods } from "@calcom/prisma/enums"; @@ -130,9 +132,9 @@ async function cancelAttendeeSeat( status: "CANCELLED", smsReminderNumber: bookingToDelete.smsReminderNumber || undefined, }).catch((e) => { - console.error( - `Error executing webhook for event: ${WebhookTriggerEvents.BOOKING_CANCELLED}, URL: ${webhook.subscriberUrl}`, - e + logger.error( + `Error executing webhook for event: ${WebhookTriggerEvents.BOOKING_CANCELLED}, URL: ${webhook.subscriberUrl}, bookingId: ${evt.bookingId}, bookingUid: ${evt.uid}`, + safeStringify(e) ); }) ); diff --git a/packages/features/bookings/lib/handleWebhookTrigger.ts b/packages/features/bookings/lib/handleWebhookTrigger.ts index dbbcaaf75f..64696cefca 100644 --- a/packages/features/bookings/lib/handleWebhookTrigger.ts +++ b/packages/features/bookings/lib/handleWebhookTrigger.ts @@ -3,6 +3,7 @@ import type { GetSubscriberOptions } from "@calcom/features/webhooks/lib/getWebh import sendPayload from "@calcom/features/webhooks/lib/sendOrSchedulePayload"; import type { WebhookDataType } from "@calcom/features/webhooks/lib/sendPayload"; import logger from "@calcom/lib/logger"; +import { safeStringify } from "@calcom/lib/safeStringify"; export async function handleWebhookTrigger(args: { subscriberOptions: GetSubscriberOptions; @@ -15,9 +16,9 @@ export async function handleWebhookTrigger(args: { const promises = subscribers.map((sub) => sendPayload(sub.secret, args.eventTrigger, new Date().toISOString(), sub, args.webhookData).catch( (e) => { - console.error( - `Error executing webhook for event: ${args.eventTrigger}, URL: ${sub.subscriberUrl}`, - e + logger.error( + `Error executing webhook for event: ${args.eventTrigger}, URL: ${sub.subscriberUrl}, bookingId: ${args.webhookData.bookingId}, bookingUid: ${args.webhookData.uid}`, + safeStringify(e) ); } ) diff --git a/packages/trpc/server/routers/viewer/bookings/requestReschedule.handler.ts b/packages/trpc/server/routers/viewer/bookings/requestReschedule.handler.ts index f22ebc0fde..4d4616b713 100644 --- a/packages/trpc/server/routers/viewer/bookings/requestReschedule.handler.ts +++ b/packages/trpc/server/routers/viewer/bookings/requestReschedule.handler.ts @@ -304,7 +304,10 @@ export const requestRescheduleHandler = async ({ ctx, input }: RequestReschedule ...evt, smsReminderNumber: bookingToReschedule.smsReminderNumber || undefined, }).catch((e) => { - console.error(`Error executing webhook for event: ${eventTrigger}, URL: ${webhook.subscriberUrl}`, e); + log.error( + `Error executing webhook for event: ${eventTrigger}, URL: ${webhook.subscriberUrl}, bookingId: ${evt.bookingId}, bookingUid: ${evt.uid}`, + safeStringify(e) + ); }) ); await Promise.all(promises);