diff --git a/packages/twenty-server/src/engine/api/graphql/direct-execution/hooks/use-direct-execution.hook.ts b/packages/twenty-server/src/engine/api/graphql/direct-execution/hooks/use-direct-execution.hook.ts index f33b4f0c8d..3069617909 100644 --- a/packages/twenty-server/src/engine/api/graphql/direct-execution/hooks/use-direct-execution.hook.ts +++ b/packages/twenty-server/src/engine/api/graphql/direct-execution/hooks/use-direct-execution.hook.ts @@ -1,3 +1,4 @@ +import * as Sentry from '@sentry/node'; import { type Request } from 'express'; import { DocumentNode, parse } from 'graphql'; import { type Plugin } from 'graphql-yoga'; @@ -36,8 +37,13 @@ export function useDirectExecution( return; } + const operationDefinition = findOperationDefinition( + document, + operationName, + ); + if ( - !findOperationDefinition(document, operationName) || + !operationDefinition || isSubscriptionOperation(document, operationName) ) { return; @@ -67,6 +73,17 @@ export function useDirectExecution( return; } + if (Sentry.isInitialized()) { + const transactionName = + operationName || operationDefinition.name?.value || ''; + + Sentry.setTags({ + operationName: transactionName, + operation: operationDefinition.operation, + }); + Sentry.getCurrentScope().setTransactionName(transactionName); + } + const result = await config.directExecutionService.execute( req, document, diff --git a/packages/twenty-server/src/engine/api/graphql/metadata.module-factory.ts b/packages/twenty-server/src/engine/api/graphql/metadata.module-factory.ts index eb56b9a901..575cbace32 100644 --- a/packages/twenty-server/src/engine/api/graphql/metadata.module-factory.ts +++ b/packages/twenty-server/src/engine/api/graphql/metadata.module-factory.ts @@ -1,4 +1,5 @@ import { type YogaDriverConfig } from '@graphql-yoga/nestjs'; +import * as Sentry from '@sentry/node'; import GraphQLJSON from 'graphql-type-json'; import { NodeEnvironment } from 'src/engine/core-modules/twenty-config/interfaces/node-environment.interface'; @@ -8,6 +9,7 @@ import { MetadataGraphQLApiModule } from 'src/engine/api/graphql/metadata-graphq import { type CacheStorageService } from 'src/engine/core-modules/cache-storage/services/cache-storage.service'; import { ClientConfig } from 'src/engine/core-modules/client-config/client-config.entity'; import { type ExceptionHandlerService } from 'src/engine/core-modules/exception-handler/exception-handler.service'; +import { useSentryTracing } from 'src/engine/core-modules/exception-handler/hooks/use-sentry-tracing'; import { type FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service'; import { useDisableIntrospectionAndSuggestionsForUnauthenticatedUsers } from 'src/engine/core-modules/graphql/hooks/use-disable-introspection-and-suggestions-for-unauthenticated-users.hook'; import { useGraphQLErrorHandlerHook } from 'src/engine/core-modules/graphql/hooks/use-graphql-error-handler.hook'; @@ -39,6 +41,7 @@ export const metadataModuleFactory = async ( }, resolvers: { JSON: GraphQLJSON }, plugins: [ + ...(Sentry.isInitialized() ? [useSentryTracing()] : []), useGraphQLErrorHandlerHook({ metricsService: metricsService, exceptionHandlerService,