Observability - add new counters (#15292)

closes https://github.com/twentyhq/core-team-issues/issues/1741
This commit is contained in:
Etienne
2025-10-23 16:33:45 +02:00
committed by GitHub
parent 0780380fe5
commit e23f2c9183
5 changed files with 23 additions and 2 deletions
@@ -26,4 +26,6 @@ export enum MetricsKeys {
AIToolExecutionSucceeded = 'ai-tool-execution/succeeded', AIToolExecutionSucceeded = 'ai-tool-execution/succeeded',
SchemaVersionMismatch = 'schema-version/mismatch', SchemaVersionMismatch = 'schema-version/mismatch',
AppVersionMismatch = 'app-version/mismatch', AppVersionMismatch = 'app-version/mismatch',
CronJobDeletedWorkspace = 'cron-job/deleted-workspace',
JobWebhookCallCompleted = 'job/webhook-call-completed',
} }
@@ -9,6 +9,8 @@ import { WEBHOOK_RESPONSE_EVENT } from 'src/engine/core-modules/audit/utils/even
import { Process } from 'src/engine/core-modules/message-queue/decorators/process.decorator'; import { Process } from 'src/engine/core-modules/message-queue/decorators/process.decorator';
import { Processor } from 'src/engine/core-modules/message-queue/decorators/processor.decorator'; import { Processor } from 'src/engine/core-modules/message-queue/decorators/processor.decorator';
import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants';
import { MetricsService } from 'src/engine/core-modules/metrics/metrics.service';
import { MetricsKeys } from 'src/engine/core-modules/metrics/types/metrics-keys.type';
export type CallWebhookJobData = { export type CallWebhookJobData = {
targetUrl: string; targetUrl: string;
@@ -28,6 +30,7 @@ export class CallWebhookJob {
constructor( constructor(
private readonly httpService: HttpService, private readonly httpService: HttpService,
private readonly auditService: AuditService, private readonly auditService: AuditService,
private readonly metricsService: MetricsService,
) {} ) {}
private generateSignature( private generateSignature(
@@ -95,6 +98,11 @@ export class CallWebhookJob {
success, success,
...commonPayload, ...commonPayload,
}); });
this.metricsService.incrementCounter({
key: MetricsKeys.JobWebhookCallCompleted,
shouldStoreInCache: false,
});
} catch (err) { } catch (err) {
auditService.insertWorkspaceEvent(WEBHOOK_RESPONSE_EVENT, { auditService.insertWorkspaceEvent(WEBHOOK_RESPONSE_EVENT, {
success: false, success: false,
@@ -2,12 +2,13 @@ import { HttpModule } from '@nestjs/axios';
import { Module } from '@nestjs/common'; import { Module } from '@nestjs/common';
import { AuditModule } from 'src/engine/core-modules/audit/audit.module'; import { AuditModule } from 'src/engine/core-modules/audit/audit.module';
import { WebhookModule } from 'src/engine/core-modules/webhook/webhook.module'; import { MetricsModule } from 'src/engine/core-modules/metrics/metrics.module';
import { CallWebhookJobsJob } from 'src/engine/core-modules/webhook/jobs/call-webhook-jobs.job'; import { CallWebhookJobsJob } from 'src/engine/core-modules/webhook/jobs/call-webhook-jobs.job';
import { CallWebhookJob } from 'src/engine/core-modules/webhook/jobs/call-webhook.job'; import { CallWebhookJob } from 'src/engine/core-modules/webhook/jobs/call-webhook.job';
import { WebhookModule } from 'src/engine/core-modules/webhook/webhook.module';
@Module({ @Module({
imports: [HttpModule, AuditModule, WebhookModule], imports: [HttpModule, AuditModule, WebhookModule, MetricsModule],
providers: [CallWebhookJobsJob, CallWebhookJob], providers: [CallWebhookJobsJob, CallWebhookJob],
}) })
export class WebhookJobModule {} export class WebhookJobModule {}
@@ -16,6 +16,8 @@ import { BillingSubscriptionEntity } from 'src/engine/core-modules/billing/entit
import { SubscriptionStatus } from 'src/engine/core-modules/billing/enums/billing-subscription-status.enum'; import { SubscriptionStatus } from 'src/engine/core-modules/billing/enums/billing-subscription-status.enum';
import { EmailService } from 'src/engine/core-modules/email/email.service'; import { EmailService } from 'src/engine/core-modules/email/email.service';
import { I18nService } from 'src/engine/core-modules/i18n/i18n.service'; import { I18nService } from 'src/engine/core-modules/i18n/i18n.service';
import { MetricsService } from 'src/engine/core-modules/metrics/metrics.service';
import { MetricsKeys } from 'src/engine/core-modules/metrics/types/metrics-keys.type';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { UserWorkspaceEntity } from 'src/engine/core-modules/user-workspace/user-workspace.entity'; import { UserWorkspaceEntity } from 'src/engine/core-modules/user-workspace/user-workspace.entity';
import { UserService } from 'src/engine/core-modules/user/services/user.service'; import { UserService } from 'src/engine/core-modules/user/services/user.service';
@@ -51,6 +53,7 @@ export class CleanerWorkspaceService {
@InjectRepository(UserWorkspaceEntity) @InjectRepository(UserWorkspaceEntity)
private readonly userWorkspaceRepository: Repository<UserWorkspaceEntity>, private readonly userWorkspaceRepository: Repository<UserWorkspaceEntity>,
private readonly i18nService: I18nService, private readonly i18nService: I18nService,
private readonly metricsService: MetricsService,
) { ) {
this.inactiveDaysBeforeSoftDelete = this.twentyConfigService.get( this.inactiveDaysBeforeSoftDelete = this.twentyConfigService.get(
'WORKSPACE_INACTIVE_DAYS_BEFORE_SOFT_DELETION', 'WORKSPACE_INACTIVE_DAYS_BEFORE_SOFT_DELETION',
@@ -447,6 +450,11 @@ export class CleanerWorkspaceService {
if (!dryRun) { if (!dryRun) {
await this.workspaceService.deleteWorkspace(workspace.id); await this.workspaceService.deleteWorkspace(workspace.id);
this.metricsService.incrementCounter({
key: MetricsKeys.CronJobDeletedWorkspace,
shouldStoreInCache: false,
});
} }
this.logger.log( this.logger.log(
@@ -4,6 +4,7 @@ import { TypeOrmModule } from '@nestjs/typeorm';
import { BillingModule } from 'src/engine/core-modules/billing/billing.module'; import { BillingModule } from 'src/engine/core-modules/billing/billing.module';
import { BillingSubscriptionEntity } from 'src/engine/core-modules/billing/entities/billing-subscription.entity'; import { BillingSubscriptionEntity } from 'src/engine/core-modules/billing/entities/billing-subscription.entity';
import { EmailModule } from 'src/engine/core-modules/email/email.module'; import { EmailModule } from 'src/engine/core-modules/email/email.module';
import { MetricsModule } from 'src/engine/core-modules/metrics/metrics.module';
import { UserWorkspaceEntity } from 'src/engine/core-modules/user-workspace/user-workspace.entity'; import { UserWorkspaceEntity } from 'src/engine/core-modules/user-workspace/user-workspace.entity';
import { UserVarsModule } from 'src/engine/core-modules/user/user-vars/user-vars.module'; import { UserVarsModule } from 'src/engine/core-modules/user/user-vars/user-vars.module';
import { UserModule } from 'src/engine/core-modules/user/user.module'; import { UserModule } from 'src/engine/core-modules/user/user.module';
@@ -31,6 +32,7 @@ import { CleanerWorkspaceService } from 'src/engine/workspace-manager/workspace-
UserModule, UserModule,
EmailModule, EmailModule,
BillingModule, BillingModule,
MetricsModule,
], ],
providers: [ providers: [
DeleteWorkspacesCommand, DeleteWorkspacesCommand,