From b7e72c3aa69640ac999d624782ee986d724f0e9b Mon Sep 17 00:00:00 2001 From: Antoine Moreaux Date: Tue, 24 Jun 2025 17:43:03 +0200 Subject: [PATCH] feat(captcha): improve telemetry on captcha error (#12836) --- .../src/engine/core-modules/captcha/captcha.guard.ts | 1 + .../captcha/drivers/google-recaptcha.driver.ts | 2 +- .../core-modules/captcha/drivers/turnstile.driver.ts | 2 +- .../src/engine/core-modules/metrics/metrics.service.ts | 10 +++++++--- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/twenty-server/src/engine/core-modules/captcha/captcha.guard.ts b/packages/twenty-server/src/engine/core-modules/captcha/captcha.guard.ts index 6199515ab..93e1c145e 100644 --- a/packages/twenty-server/src/engine/core-modules/captcha/captcha.guard.ts +++ b/packages/twenty-server/src/engine/core-modules/captcha/captcha.guard.ts @@ -30,6 +30,7 @@ export class CaptchaGuard implements CanActivate { await this.metricsService.incrementCounter({ key: MetricsKeys.InvalidCaptcha, eventId: token || '', + ...(result.error ? { attributes: { error: result.error } } : {}), }); throw new BadRequestException( diff --git a/packages/twenty-server/src/engine/core-modules/captcha/drivers/google-recaptcha.driver.ts b/packages/twenty-server/src/engine/core-modules/captcha/drivers/google-recaptcha.driver.ts index 008d8705b..9608e37ba 100644 --- a/packages/twenty-server/src/engine/core-modules/captcha/drivers/google-recaptcha.driver.ts +++ b/packages/twenty-server/src/engine/core-modules/captcha/drivers/google-recaptcha.driver.ts @@ -32,7 +32,7 @@ export class GoogleRecaptchaDriver implements CaptchaDriver { return { success: responseData.success, ...(!responseData.success && { - error: responseData['error-codes']?.[0] ?? 'Captcha Error', + error: responseData['error-codes']?.[0] ?? 'unknown-error', }), }; } diff --git a/packages/twenty-server/src/engine/core-modules/captcha/drivers/turnstile.driver.ts b/packages/twenty-server/src/engine/core-modules/captcha/drivers/turnstile.driver.ts index ff21d8f62..608099ff6 100644 --- a/packages/twenty-server/src/engine/core-modules/captcha/drivers/turnstile.driver.ts +++ b/packages/twenty-server/src/engine/core-modules/captcha/drivers/turnstile.driver.ts @@ -32,7 +32,7 @@ export class TurnstileDriver implements CaptchaDriver { return { success: responseData.success, ...(!responseData.success && { - error: responseData['error-codes']?.[0] ?? 'Captcha Error', + error: responseData['error-codes']?.[0] ?? 'unknown-error', }), }; } diff --git a/packages/twenty-server/src/engine/core-modules/metrics/metrics.service.ts b/packages/twenty-server/src/engine/core-modules/metrics/metrics.service.ts index eda81959a..fcbf232cb 100644 --- a/packages/twenty-server/src/engine/core-modules/metrics/metrics.service.ts +++ b/packages/twenty-server/src/engine/core-modules/metrics/metrics.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@nestjs/common'; -import { metrics } from '@opentelemetry/api'; +import { metrics, Attributes } from '@opentelemetry/api'; import { MetricsCacheService } from 'src/engine/core-modules/metrics/metrics-cache.service'; import { MetricsKeys } from 'src/engine/core-modules/metrics/types/metrics-keys.type'; @@ -12,17 +12,19 @@ export class MetricsService { async incrementCounter({ key, eventId, + attributes, shouldStoreInCache = true, }: { key: MetricsKeys; eventId?: string; + attributes?: Attributes; shouldStoreInCache?: boolean; }) { //TODO : Define meter name usage in monitoring const meter = metrics.getMeter('twenty-server'); const counter = meter.createCounter(key); - counter.add(1); + counter.add(1, attributes); if (shouldStoreInCache && eventId) { this.metricsCacheService.updateCounter(key, [eventId]); @@ -32,17 +34,19 @@ export class MetricsService { async batchIncrementCounter({ key, eventIds, + attributes, shouldStoreInCache = true, }: { key: MetricsKeys; eventIds: string[]; + attributes?: Attributes; shouldStoreInCache?: boolean; }) { //TODO : Define meter name usage in monitoring const meter = metrics.getMeter('twenty-server'); const counter = meter.createCounter(key); - counter.add(eventIds.length); + counter.add(eventIds.length, attributes); if (shouldStoreInCache) { this.metricsCacheService.updateCounter(key, eventIds);