From 1eaa6cb4ac19bc174620806665fad87424b71c80 Mon Sep 17 00:00:00 2001 From: Maksym Kulish Date: Wed, 10 Apr 2024 17:07:47 +0300 Subject: [PATCH] Configure timeout and retries for webhook-caller --- src/app/app.spec.ts | 6 ++++++ src/app/module.ts | 14 ++++++++------ src/services/config/service.ts | 14 ++++++++++++++ src/services/webhook-caller/service.ts | 22 ++++++++++++++++++++-- 4 files changed, 48 insertions(+), 8 deletions(-) diff --git a/src/app/app.spec.ts b/src/app/app.spec.ts index fdbbee3f..396e5ef3 100644 --- a/src/app/app.spec.ts +++ b/src/app/app.spec.ts @@ -34,6 +34,12 @@ const mockConfig = async (config) => { format: 'simple', } }, + makeWebhookProcessorConfig() { + return { + WEBHOOK_ABORT_TIMEOUT_MS: 10_000, + WEBHOOK_MAX_RETRIES: 0, + } + }, } }) } diff --git a/src/app/module.ts b/src/app/module.ts index 200714c9..21df79d7 100644 --- a/src/app/module.ts +++ b/src/app/module.ts @@ -11,7 +11,11 @@ import { makeJobRunner } from 'lido-nanolib' import dotenv from 'dotenv' -import { makeConfig, makeLoggerConfig } from '../services/config/service.js' +import { + makeConfig, + makeLoggerConfig, + makeWebhookProcessorConfig, +} from '../services/config/service.js' import { makeConsensusApi } from '../services/consensus-api/service.js' import { makeExecutionApi } from '../services/execution-api/service.js' import { makeMetrics, register } from '../services/prom/service.js' @@ -90,11 +94,9 @@ export const makeAppModule = async () => { gsService, }) - const webhookProcessor = makeWebhookProcessor( - makeRequest([loggerMiddleware(logger), notOkError(), abort(10_000)]), - logger, - metrics - ) + const webhookConfig = makeWebhookProcessorConfig({ env: process.env }) + + const webhookProcessor = makeWebhookProcessor(webhookConfig, logger, metrics) const messageReloader = makeMessageReloader({ logger, diff --git a/src/services/config/service.ts b/src/services/config/service.ts index b195af0f..14faeecb 100644 --- a/src/services/config/service.ts +++ b/src/services/config/service.ts @@ -113,6 +113,20 @@ export const makeLoggerConfig = ({ env }: { env: NodeJS.ProcessEnv }) => { return config } +export const makeWebhookProcessorConfig = ({ + env, +}: { + env: NodeJS.ProcessEnv +}) => { + const config = { + WEBHOOK_ABORT_TIMEOUT_MS: + optional(() => num(env.WEBHOOK_ABORT_TIMEOUT_MS)) ?? 10_000, + WEBHOOK_MAX_RETRIES: optional(() => num(env.WEBHOOK_MAX_RETRIES)) ?? 0, + } + + return config +} + const envOrFile = (env: NodeJS.ProcessEnv, envName: string) => { if (env[envName]) return env[envName] diff --git a/src/services/webhook-caller/service.ts b/src/services/webhook-caller/service.ts index 8676be10..aa692029 100644 --- a/src/services/webhook-caller/service.ts +++ b/src/services/webhook-caller/service.ts @@ -1,13 +1,31 @@ -import { LoggerService, RequestService } from 'lido-nanolib' +import { + LoggerService, + makeRequest, + logger as loggerMiddleware, + abort, + notOkError, + retry, +} from 'lido-nanolib' import { MetricsService } from '../prom/service.js' export type WebhookProcessorService = ReturnType export const makeWebhookProcessor = ( - request: RequestService, + config: { WEBHOOK_ABORT_TIMEOUT_MS: number; WEBHOOK_MAX_RETRIES: number }, logger: LoggerService, metrics: MetricsService ) => { + let middlewares = [ + loggerMiddleware(logger), + notOkError(), + abort(config.WEBHOOK_ABORT_TIMEOUT_MS), + ] + + if (config.WEBHOOK_MAX_RETRIES > 0) { + middlewares = [retry(config.WEBHOOK_MAX_RETRIES)].concat(middlewares) + } + + const request = makeRequest(middlewares) const send = async ( url: string, event: {