From 61a6b6523abac0f51012946d2efc3358b9b1b3d0 Mon Sep 17 00:00:00 2001 From: Kristina Fefelova Date: Thu, 8 Aug 2024 21:33:09 +0400 Subject: [PATCH 1/2] Add logs on notify request Signed-off-by: Kristina Fefelova --- .../pod-telegram-bot/src/config.ts | 2 +- .../pod-telegram-bot/src/server.ts | 37 +++++++++++-------- .../pod-telegram-bot/src/start.ts | 2 +- 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/services/telegram-bot/pod-telegram-bot/src/config.ts b/services/telegram-bot/pod-telegram-bot/src/config.ts index 40c92e4d21..c4f37e063d 100644 --- a/services/telegram-bot/pod-telegram-bot/src/config.ts +++ b/services/telegram-bot/pod-telegram-bot/src/config.ts @@ -39,7 +39,7 @@ const config: Config = (() => { AccountsUrl: process.env.ACCOUNTS_URL, ServiceId: process.env.SERVICE_ID, Secret: process.env.SECRET, - Domain: process.env.DOMAIN, + Domain: process.env.DOMAIN ?? '', BotPort: parseNumber(process.env.BOT_PORT) ?? 8443, // TODO: later we should get this title from branding map App: process.env.APP ?? 'Huly', diff --git a/services/telegram-bot/pod-telegram-bot/src/server.ts b/services/telegram-bot/pod-telegram-bot/src/server.ts index 66fe435471..86f4efcd51 100644 --- a/services/telegram-bot/pod-telegram-bot/src/server.ts +++ b/services/telegram-bot/pod-telegram-bot/src/server.ts @@ -86,6 +86,7 @@ const handleRequest = async ( const token = extractToken(req.headers) await fn(req, res, token, next) } catch (err: unknown) { + console.error('Error during extract token', err) next(err) } } @@ -94,7 +95,7 @@ const wrapRequest = (fn: AsyncRequestHandler) => (req: Request, res: Response, n void handleRequest(fn, req, res, next) } -export function createServer (bot: Telegraf, worker: PlatformWorker): Express { +export function createServer (bot: Telegraf, worker: PlatformWorker, ctx: MeasureContext): Express { const limiter = new Limiter() const app = express() @@ -174,28 +175,32 @@ export function createServer (bot: Telegraf, worker: PlatformWorker): Express { app.post( '/notify', wrapRequest(async (req, res, token) => { + ctx.info('Received notification', { email: token.email }) if (req.body == null || !Array.isArray(req.body)) { + ctx.error('Invalid request body', { body: req.body, email: token.email }) throw new ApiError(400) } const notificationRecords = req.body as TelegramNotificationRecord[] - const usersRecords = await worker.getUsersRecords() + const userRecord = await worker.getUserRecordByEmail(token.email) + + if (userRecord === undefined) { + ctx.error('User not found', { email: token.email }) + throw new ApiError(404) + } for (const notificationRecord of notificationRecords) { - const userRecord = usersRecords.find((record) => record.email === token.email) - if (userRecord !== undefined) { - void limiter.add(userRecord.telegramId, async () => { - const formattedMessage = toTelegramHtml(notificationRecord) - const message = await bot.telegram.sendMessage(userRecord.telegramId, formattedMessage, { - parse_mode: 'HTML' - }) - await worker.addNotificationRecord({ - notificationId: notificationRecord.notificationId, - email: userRecord.email, - workspace: notificationRecord.workspace, - telegramId: message.message_id - }) + void limiter.add(userRecord.telegramId, async () => { + const formattedMessage = toTelegramHtml(notificationRecord) + const message = await bot.telegram.sendMessage(userRecord.telegramId, formattedMessage, { + parse_mode: 'HTML' + }) + await worker.addNotificationRecord({ + notificationId: notificationRecord.notificationId, + email: userRecord.email, + workspace: notificationRecord.workspace, + telegramId: message.message_id }) - } + }) } res.status(200) diff --git a/services/telegram-bot/pod-telegram-bot/src/start.ts b/services/telegram-bot/pod-telegram-bot/src/start.ts index ffdaab9d05..030f5f17e1 100644 --- a/services/telegram-bot/pod-telegram-bot/src/start.ts +++ b/services/telegram-bot/pod-telegram-bot/src/start.ts @@ -34,7 +34,7 @@ export const start = async (): Promise => { const worker = await PlatformWorker.create() const bot = await setUpBot(worker) - const app = createServer(bot, worker) + const app = createServer(bot, worker, ctx) if (config.Domain === '') { void bot.launch({ dropPendingUpdates: true }) From b957077ab8e67a4ad253c0bfde92a64bf2d3694e Mon Sep 17 00:00:00 2001 From: Kristina Fefelova Date: Thu, 8 Aug 2024 22:01:01 +0400 Subject: [PATCH 2/2] Fix ctx creation Signed-off-by: Kristina Fefelova --- .../pod-telegram-bot/package.json | 2 ++ .../pod-telegram-bot/src/config.ts | 4 +++- .../pod-telegram-bot/src/start.ts | 21 ++++++++++++++++--- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/services/telegram-bot/pod-telegram-bot/package.json b/services/telegram-bot/pod-telegram-bot/package.json index 2f3858f397..5697bde6d0 100644 --- a/services/telegram-bot/pod-telegram-bot/package.json +++ b/services/telegram-bot/pod-telegram-bot/package.json @@ -55,6 +55,8 @@ }, "dependencies": { "@hcengineering/activity": "^0.6.0", + "@hcengineering/analytics": "^0.6.0", + "@hcengineering/analytics-service": "^0.6.0", "@hcengineering/chunter": "^0.6.20", "@hcengineering/client": "^0.6.18", "@hcengineering/client-resources": "^0.6.27", diff --git a/services/telegram-bot/pod-telegram-bot/src/config.ts b/services/telegram-bot/pod-telegram-bot/src/config.ts index c4f37e063d..49d3b6a640 100644 --- a/services/telegram-bot/pod-telegram-bot/src/config.ts +++ b/services/telegram-bot/pod-telegram-bot/src/config.ts @@ -26,6 +26,7 @@ export interface Config { OtpTimeToLiveSec: number OtpRetryDelaySec: number AccountsUrl: string + SentryDSN: string } const parseNumber = (str: string | undefined): number | undefined => (str !== undefined ? Number(str) : undefined) @@ -44,7 +45,8 @@ const config: Config = (() => { // TODO: later we should get this title from branding map App: process.env.APP ?? 'Huly', OtpTimeToLiveSec: parseNumber(process.env.OTP_TIME_TO_LIVE_SEC) ?? 60, - OtpRetryDelaySec: parseNumber(process.env.OTP_RETRY_DELAY_SEC) ?? 60 + OtpRetryDelaySec: parseNumber(process.env.OTP_RETRY_DELAY_SEC) ?? 60, + SentryDSN: process.env.SENTRY_DSN ?? '' } const missingEnv = (Object.keys(params) as Array).filter((key) => params[key] === undefined) diff --git a/services/telegram-bot/pod-telegram-bot/src/start.ts b/services/telegram-bot/pod-telegram-bot/src/start.ts index 030f5f17e1..855c84fe75 100644 --- a/services/telegram-bot/pod-telegram-bot/src/start.ts +++ b/services/telegram-bot/pod-telegram-bot/src/start.ts @@ -13,10 +13,13 @@ // limitations under the License. // -import { MeasureMetricsContext } from '@hcengineering/core' +import { MeasureMetricsContext, newMetrics } from '@hcengineering/core' import { setMetadata } from '@hcengineering/platform' import serverToken from '@hcengineering/server-token' import serverClient from '@hcengineering/server-client' +import { SplitLogger, configureAnalytics } from '@hcengineering/analytics-service' +import { Analytics } from '@hcengineering/analytics' +import { join } from 'path' import config from './config' import { createServer, listen } from './server' @@ -24,14 +27,26 @@ import { setUpBot } from './bot' import { PlatformWorker } from './worker' import { registerLoaders } from './loaders' +const ctx = new MeasureMetricsContext( + 'telegram-bot-service', + {}, + {}, + newMetrics(), + new SplitLogger('telegram-bot-service', { + root: join(process.cwd(), 'logs'), + enableConsole: (process.env.ENABLE_CONSOLE ?? 'true') === 'true' + }) +) + +configureAnalytics(config.SentryDSN, config) +Analytics.setTag('application', 'telegram-bot-service') + export const start = async (): Promise => { setMetadata(serverToken.metadata.Secret, config.Secret) setMetadata(serverClient.metadata.Endpoint, config.AccountsUrl) setMetadata(serverClient.metadata.UserAgent, config.ServiceId) registerLoaders() - const ctx = new MeasureMetricsContext('telegram-bot', {}) - const worker = await PlatformWorker.create() const bot = await setUpBot(worker) const app = createServer(bot, worker, ctx)