From 9c885861a33eb98a1fd86bd10e53ee7472e2a7a8 Mon Sep 17 00:00:00 2001 From: Charles Bochet Date: Wed, 18 Sep 2024 00:10:35 +0200 Subject: [PATCH] Add logs to troubleshoot performances issues --- .../workspace-query-runner.service.ts | 47 ++++++++++++++++++- .../factories/workspace-datasource.factory.ts | 6 ++- .../storage/cache-manager.storage.ts | 3 ++ 3 files changed, 54 insertions(+), 2 deletions(-) diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/workspace-query-runner.service.ts b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/workspace-query-runner.service.ts index 848e85b65..b754b4094 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/workspace-query-runner.service.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/workspace-query-runner.service.ts @@ -65,8 +65,8 @@ import { } from './interfaces/pg-graphql.interface'; import { WorkspaceQueryRunnerOptions } from './interfaces/query-runner-option.interface'; import { - computePgGraphQLError, PgGraphQLConfig, + computePgGraphQLError, } from './utils/compute-pg-graphql-error.util'; @Injectable() @@ -99,6 +99,9 @@ export class WorkspaceQueryRunnerService { ): Promise | undefined> { const { authContext, objectMetadataItem } = options; + console.log( + `running findMany for ${objectMetadataItem.nameSingular} on workspace ${authContext.workspace.id}`, + ); const hookedArgs = await this.workspaceQueryHookService.executePreQueryHooks( authContext, @@ -131,6 +134,10 @@ export class WorkspaceQueryRunnerService { } const { authContext, objectMetadataItem } = options; + console.log( + `running findOne for ${objectMetadataItem.nameSingular} on workspace ${authContext.workspace.id}`, + ); + const hookedArgs = await this.workspaceQueryHookService.executePreQueryHooks( authContext, @@ -168,6 +175,10 @@ export class WorkspaceQueryRunnerService { const { authContext, objectMetadataItem } = options; + console.log( + `running findDuplicates for ${objectMetadataItem.nameSingular} on workspace ${authContext.workspace.id}`, + ); + const hookedArgs = await this.workspaceQueryHookService.executePreQueryHooks( authContext, @@ -222,6 +233,10 @@ export class WorkspaceQueryRunnerService { ): Promise { const { authContext, objectMetadataItem } = options; + console.log( + `running createMany for ${objectMetadataItem.nameSingular} on workspace ${authContext.workspace.id}`, + ); + const isQueryRunnerTwentyORMEnabled = await this.featureFlagService.isFeatureEnabled( FeatureFlagKey.IsQueryRunnerTwentyORMEnabled, @@ -313,6 +328,9 @@ export class WorkspaceQueryRunnerService { args: CreateManyResolverArgs>, options: WorkspaceQueryRunnerOptions, ): Promise { + console.log( + `running upsertMany for ${options.objectMetadataItem.nameSingular} on workspace ${options.authContext.workspace.id}`, + ); const ids = args.data .map((item) => item.id) .filter((id) => id !== undefined); @@ -379,6 +397,11 @@ export class WorkspaceQueryRunnerService { options: WorkspaceQueryRunnerOptions, ): Promise { const { authContext, objectMetadataItem } = options; + + console.log( + `running updateOne for ${objectMetadataItem.nameSingular} on workspace ${authContext.workspace.id}`, + ); + const repository = await this.twentyORMGlobalManager.getRepositoryForWorkspace( authContext.workspace.id, @@ -454,6 +477,11 @@ export class WorkspaceQueryRunnerService { options: WorkspaceQueryRunnerOptions, ): Promise { const { authContext, objectMetadataItem } = options; + + console.log( + `running updateMany for ${objectMetadataItem.nameSingular} on workspace ${authContext.workspace.id}`, + ); + const repository = await this.twentyORMGlobalManager.getRepositoryForWorkspace( authContext.workspace.id, @@ -549,6 +577,10 @@ export class WorkspaceQueryRunnerService { ): Promise { const { authContext, objectMetadataItem } = options; + console.log( + `running deleteMany for ${objectMetadataItem.nameSingular} on workspace ${authContext.workspace.id}`, + ); + assertMutationNotOnRemoteObject(objectMetadataItem); const maximumRecordAffected = this.environmentService.get( @@ -638,6 +670,10 @@ export class WorkspaceQueryRunnerService { ): Promise { const { authContext, objectMetadataItem } = options; + console.log( + `running destroyMany for ${objectMetadataItem.nameSingular} on workspace ${authContext.workspace.id}`, + ); + assertMutationNotOnRemoteObject(objectMetadataItem); const maximumRecordAffected = this.environmentService.get( @@ -694,6 +730,10 @@ export class WorkspaceQueryRunnerService { ): Promise { const { authContext, objectMetadataItem } = options; + console.log( + `running restoreMany for ${objectMetadataItem.nameSingular} on workspace ${authContext.workspace.id}`, + ); + assertMutationNotOnRemoteObject(objectMetadataItem); const maximumRecordAffected = this.environmentService.get( @@ -765,6 +805,11 @@ export class WorkspaceQueryRunnerService { options: WorkspaceQueryRunnerOptions, ): Promise { const { authContext, objectMetadataItem } = options; + + console.log( + `running deleteOne for ${objectMetadataItem.nameSingular} on workspace ${authContext.workspace.id}`, + ); + const repository = await this.twentyORMGlobalManager.getRepositoryForWorkspace( authContext.workspace.id, diff --git a/packages/twenty-server/src/engine/twenty-orm/factories/workspace-datasource.factory.ts b/packages/twenty-server/src/engine/twenty-orm/factories/workspace-datasource.factory.ts index 833d2d785..54c5e8ef6 100644 --- a/packages/twenty-server/src/engine/twenty-orm/factories/workspace-datasource.factory.ts +++ b/packages/twenty-server/src/engine/twenty-orm/factories/workspace-datasource.factory.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@nestjs/common'; +import { Injectable, Logger } from '@nestjs/common'; import { EntitySchema } from 'typeorm'; @@ -16,6 +16,7 @@ import { WorkspaceCacheStorageService } from 'src/engine/workspace-cache-storage @Injectable() export class WorkspaceDatasourceFactory { + private readonly logger = new Logger(WorkspaceDatasourceFactory.name); private cacheManager = new CacheManager(); constructor( @@ -39,6 +40,9 @@ export class WorkspaceDatasourceFactory { const workspaceDataSource = await this.cacheManager.execute( `${workspaceId}-${desiredWorkspaceMetadataVersion}`, async () => { + this.logger.log( + `Creating workspace data source for workspace ${workspaceId} and metadata version ${desiredWorkspaceMetadataVersion}`, + ); const cachedObjectMetadataMap = await this.workspaceCacheStorageService.getObjectMetadataMap( workspaceId, diff --git a/packages/twenty-server/src/engine/twenty-orm/storage/cache-manager.storage.ts b/packages/twenty-server/src/engine/twenty-orm/storage/cache-manager.storage.ts index d73b61a36..83c30080b 100644 --- a/packages/twenty-server/src/engine/twenty-orm/storage/cache-manager.storage.ts +++ b/packages/twenty-server/src/engine/twenty-orm/storage/cache-manager.storage.ts @@ -13,6 +13,8 @@ export class CacheManager { const [workspaceId] = cacheKey.split('-'); if (this.cache.has(cacheKey)) { + console.log('Cache hit for key:', cacheKey); + return this.cache.get(cacheKey)!; } @@ -23,6 +25,7 @@ export class CacheManager { } } + console.log('Cache miss for key:', cacheKey); const value = await factory(); if (!value) {