diff --git a/packages/doorman-api/src/common/DoormanHandler.ts b/packages/doorman-api/src/common/DoormanHandler.ts index 900e0d9..e02fa62 100644 --- a/packages/doorman-api/src/common/DoormanHandler.ts +++ b/packages/doorman-api/src/common/DoormanHandler.ts @@ -24,6 +24,7 @@ export enum CommonMetrics { HTTP_CLIENT_ERROR = "HttpClientError", LOKI_ERROR = "LokiError", LOKI_LOG_AFTER_CLOSE = "LokiLogAfterClose", + TWILIO_ISOLATION_BUSTED = "TwilioIsolationBusted", }; export function getMetricFromRegistry(metricsRegistry: Registry, metric: string): T { @@ -33,7 +34,6 @@ export function getMetricFromRegistry(metricsRegistry: Registry, metric: stri export function gracefullyEndLogger(logger: Logger): Promise { return new Promise((fulfill, reject) => { // Add logic for other transports here ... - logger.on('finish', () => { fulfill(); }); @@ -42,6 +42,9 @@ export function gracefullyEndLogger(logger: Logger): Promise { }); } +const MINIMUM_MS_TO_SEND_RESPONSE: number = 250; +const FUNCTION_MAXIMUM_DURATION_MS: number = 10_000; + /** * A decorator for twilio handlers. It provides a metrics registry and * should implement timeout and cleanup jobs based on lambda timeout @@ -92,6 +95,11 @@ export function withMetrics help: "Tried to write logs after log stream closed", })); + metricsRegistry.registerMetric(new Counter({ + name: CommonMetrics.TWILIO_ISOLATION_BUSTED, + help: "Twilio invocation lasted longer than 10s", + })); + // Create a Winston logger const logger = createLogger({ level: 'info', @@ -199,13 +207,25 @@ export function withMetrics console.timeEnd("[CommonHandler] nested handler time"); const endTime = Date.now(); - const remainingTime = 10000 - (endTime - startTime); + const remainingTime = FUNCTION_MAXIMUM_DURATION_MS - (endTime - startTime); + + if (remainingTime < 0) { + console.error("[CommonHandler] remaining time is negative for some reason..."); + getMetricFromRegistry(metricsRegistry, CommonMetrics.TWILIO_ISOLATION_BUSTED).inc(1); + } + + // abandoning metrics, since there isn't enough time + if (remainingTime <= MINIMUM_MS_TO_SEND_RESPONSE) { + console.error("[CommonHandler] there is no time to send metrics / logs abandoning them"); + callback(...result); + return; + } console.log(`[CommonHandler] there is ${remainingTime} ms left to send metrics`); let metricsTimeout = setTimeout(() => { callback(...result); - }, remainingTime - 250); + }, remainingTime - MINIMUM_MS_TO_SEND_RESPONSE); summaryTimer(); console.log("[CommonHandler] attempting to push metrics..."); diff --git a/packages/doorman-client/src/functions/buzzer-activated.ts b/packages/doorman-client/src/functions/buzzer-activated.ts index 3ea41d5..1ccf3d7 100644 --- a/packages/doorman-client/src/functions/buzzer-activated.ts +++ b/packages/doorman-client/src/functions/buzzer-activated.ts @@ -26,7 +26,7 @@ export const handler: ServerlessFunctionSignature(metricsRegistry, BuzzerActivatedMetrics.API_UNLOCK) .inc({ door: config.door }, 1); @@ -91,11 +91,11 @@ export const handler: ServerlessFunctionSignature console.log(invokeId, err)); + }).catch(err => console.log(invokeId + err)); }, 1250)); }); @@ -109,7 +109,7 @@ export const handler: ServerlessFunctionSignature((resolve, reject) => { @@ -136,14 +136,14 @@ export const handler: ServerlessFunctionSignature clearTimeout(timeout)); intervals.forEach(interval => clearInterval(interval)); callback(null, twiml);