From 363d8666a9ab47878e3299fa45e84c6cdadcb189 Mon Sep 17 00:00:00 2001 From: Onur Temizkan Date: Wed, 13 Apr 2022 11:09:02 +0300 Subject: [PATCH 01/10] feat(tracing): Add Prisma ORM integration. --- packages/tracing/src/hubextensions.ts | 6 ++ packages/tracing/src/integrations/index.ts | 1 + .../tracing/src/integrations/node/prisma.ts | 59 +++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 packages/tracing/src/integrations/node/prisma.ts diff --git a/packages/tracing/src/hubextensions.ts b/packages/tracing/src/hubextensions.ts index bd38b270cc22..0be2c9c4286e 100644 --- a/packages/tracing/src/hubextensions.ts +++ b/packages/tracing/src/hubextensions.ts @@ -261,6 +261,12 @@ function _autoloadDatabaseIntegrations(): void { }; return new integration.Postgres(); }, + prisma() { + const integration = dynamicRequire(module, './integrations/node/prisma') as { + Prisma: IntegrationClass; + }; + return new integration.Prisma(); + }, }; const mappedPackages = Object.keys(packageToIntegrationMapping) diff --git a/packages/tracing/src/integrations/index.ts b/packages/tracing/src/integrations/index.ts index b35eff6c495f..6fb86c1afc78 100644 --- a/packages/tracing/src/integrations/index.ts +++ b/packages/tracing/src/integrations/index.ts @@ -2,6 +2,7 @@ export { Express } from './node/express'; export { Postgres } from './node/postgres'; export { Mysql } from './node/mysql'; export { Mongo } from './node/mongo'; +export { Prisma } from './node/prisma'; // TODO(v7): Remove this export // Please see `src/index.ts` for more details. diff --git a/packages/tracing/src/integrations/node/prisma.ts b/packages/tracing/src/integrations/node/prisma.ts new file mode 100644 index 000000000000..aebdeaf0e656 --- /dev/null +++ b/packages/tracing/src/integrations/node/prisma.ts @@ -0,0 +1,59 @@ +import { Hub } from '@sentry/hub'; +import { EventProcessor, Integration } from '@sentry/types'; +import { fill, isThenable, loadModule, logger } from '@sentry/utils'; + +import { IS_DEBUG_BUILD } from '../../flags'; + +interface PrismaClient { + prototype: { + query: () => void | Promise; + }; +} + +/** Tracing integration for @prisma/client package */ +export class Prisma implements Integration { + /** + * @inheritDoc + */ + public static id: string = 'Prisma'; + + /** + * @inheritDoc + */ + public name: string = Prisma.id; + + /** + * @inheritDoc + */ + public setupOnce(_: (callback: EventProcessor) => void, getCurrentHub: () => Hub): void { + const pkg = loadModule<{ PrismaClient: PrismaClient }>('@prisma/client'); + + if (!pkg) { + IS_DEBUG_BUILD && logger.error('Prisma integration was unable to require `@prisma/client` package.'); + return; + } + + fill(pkg.PrismaClient.prototype, '_executeRequest', function (orig: () => void | Promise) { + return function (this: unknown, config: unknown) { + const scope = getCurrentHub().getScope(); + const parentSpan = scope?.getSpan(); + const span = parentSpan?.startChild({ + description: typeof config === 'string' ? config : (config as { clientMethod: string }).clientMethod, + op: 'db', + }); + + const rv = orig.call(this, config); + + if (isThenable(rv)) { + return rv.then((res: unknown) => { + span?.finish(); + return res; + }); + } + + span?.finish(); + return rv; + }; + }); + } +} From fdcad2ab1073364f6049c88c421cec77504d5bd3 Mon Sep 17 00:00:00 2001 From: Onur Temizkan Date: Wed, 13 Apr 2022 21:36:11 +0300 Subject: [PATCH 02/10] Disable `max-lines` rule for hubextensions. --- packages/tracing/src/hubextensions.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/tracing/src/hubextensions.ts b/packages/tracing/src/hubextensions.ts index 0be2c9c4286e..327b94126fa7 100644 --- a/packages/tracing/src/hubextensions.ts +++ b/packages/tracing/src/hubextensions.ts @@ -1,3 +1,4 @@ +/* eslint-disable max-lines */ import { getMainCarrier, Hub } from '@sentry/hub'; import { CustomSamplingContext, From 65e9c8c45e683465f890a099b6ac81a10056370d Mon Sep 17 00:00:00 2001 From: Onur Temizkan Date: Tue, 19 Apr 2022 13:33:42 +0300 Subject: [PATCH 03/10] Switch to instance based manual instrumentation. --- packages/tracing/src/hubextensions.ts | 6 -- .../tracing/src/integrations/node/prisma.ts | 92 +++++++++++++------ 2 files changed, 66 insertions(+), 32 deletions(-) diff --git a/packages/tracing/src/hubextensions.ts b/packages/tracing/src/hubextensions.ts index 327b94126fa7..41b2f95ca9a8 100644 --- a/packages/tracing/src/hubextensions.ts +++ b/packages/tracing/src/hubextensions.ts @@ -262,12 +262,6 @@ function _autoloadDatabaseIntegrations(): void { }; return new integration.Postgres(); }, - prisma() { - const integration = dynamicRequire(module, './integrations/node/prisma') as { - Prisma: IntegrationClass; - }; - return new integration.Prisma(); - }, }; const mappedPackages = Object.keys(packageToIntegrationMapping) diff --git a/packages/tracing/src/integrations/node/prisma.ts b/packages/tracing/src/integrations/node/prisma.ts index aebdeaf0e656..4a5d80aabd63 100644 --- a/packages/tracing/src/integrations/node/prisma.ts +++ b/packages/tracing/src/integrations/node/prisma.ts @@ -1,13 +1,41 @@ import { Hub } from '@sentry/hub'; import { EventProcessor, Integration } from '@sentry/types'; -import { fill, isThenable, loadModule, logger } from '@sentry/utils'; +import { isThenable, logger } from '@sentry/utils'; import { IS_DEBUG_BUILD } from '../../flags'; +type PrismaAction = + | 'findUnique' + | 'findMany' + | 'findFirst' + | 'create' + | 'createMany' + | 'update' + | 'updateMany' + | 'upsert' + | 'delete' + | 'deleteMany' + | 'executeRaw' + | 'queryRaw' + | 'aggregate' + | 'count' + | 'runCommandRaw'; + +interface PrismaMiddlewareParams { + model?: any; + action: PrismaAction; + args: any; + dataPath: string[]; + runInTransaction: boolean; +} + +type PrismaMiddleware = ( + params: PrismaMiddlewareParams, + next: (params: PrismaMiddlewareParams) => Promise, +) => Promise; + interface PrismaClient { - prototype: { - query: () => void | Promise; - }; + $use: (cb: PrismaMiddleware) => void; } /** Tracing integration for @prisma/client package */ @@ -22,38 +50,50 @@ export class Prisma implements Integration { */ public name: string = Prisma.id; + /** + * Prisma ORM Client Instance + */ + private readonly _client?: PrismaClient; + /** * @inheritDoc */ - public setupOnce(_: (callback: EventProcessor) => void, getCurrentHub: () => Hub): void { - const pkg = loadModule<{ PrismaClient: PrismaClient }>('@prisma/client'); + public constructor(options: { client?: PrismaClient } = {}) { + this._client = options.client; + } - if (!pkg) { - IS_DEBUG_BUILD && logger.error('Prisma integration was unable to require `@prisma/client` package.'); + /** + * @inheritDoc + */ + public setupOnce(_: (callback: EventProcessor) => void, getCurrentHub: () => Hub): void { + if (!this._client) { + IS_DEBUG_BUILD && logger.error('PrismaIntegration is missing a Prisma Client Instance'); return; } - fill(pkg.PrismaClient.prototype, '_executeRequest', function (orig: () => void | Promise) { - return function (this: unknown, config: unknown) { - const scope = getCurrentHub().getScope(); - const parentSpan = scope?.getSpan(); - const span = parentSpan?.startChild({ - description: typeof config === 'string' ? config : (config as { clientMethod: string }).clientMethod, - op: 'db', - }); + this._client.$use((params: PrismaMiddlewareParams, next: (params: PrismaMiddlewareParams) => Promise) => { + const scope = getCurrentHub().getScope(); + const parentSpan = scope?.getSpan(); + + const action = params.action; + const model = params.model; - const rv = orig.call(this, config); + const span = parentSpan?.startChild({ + description: `Action: ${action}, ${model ? `Model: ${model}` : ''}`, + op: 'prisma', + }); - if (isThenable(rv)) { - return rv.then((res: unknown) => { - span?.finish(); - return res; - }); - } + const rv = next(params); + + if (isThenable(rv)) { + return rv.then((res: unknown) => { + span?.finish(); + return res; + }); + } - span?.finish(); - return rv; - }; + span?.finish(); + return rv; }); } } From 9fda7121faec89524c2ddd37bd39e2fae721bfe7 Mon Sep 17 00:00:00 2001 From: Onur Temizkan Date: Tue, 19 Apr 2022 14:03:06 +0300 Subject: [PATCH 04/10] Add integration test. --- packages/node-integration-tests/.gitignore | 1 + packages/node-integration-tests/package.json | 4 ++ .../tracing/prisma-orm/docker-compose.yml | 13 +++++ .../suites/tracing/prisma-orm/package.json | 19 ++++++++ .../prisma/migrations/migration_lock.toml | 3 ++ .../migrations/sentry_test/migration.sql | 12 +++++ .../tracing/prisma-orm/prisma/schema.prisma | 15 ++++++ .../suites/tracing/prisma-orm/scenario.ts | 48 +++++++++++++++++++ .../suites/tracing/prisma-orm/test.ts | 15 ++++++ .../suites/tracing/prisma-orm/yarn.lock | 27 +++++++++++ yarn.lock | 12 +++++ 11 files changed, 169 insertions(+) create mode 100644 packages/node-integration-tests/.gitignore create mode 100644 packages/node-integration-tests/suites/tracing/prisma-orm/docker-compose.yml create mode 100644 packages/node-integration-tests/suites/tracing/prisma-orm/package.json create mode 100644 packages/node-integration-tests/suites/tracing/prisma-orm/prisma/migrations/migration_lock.toml create mode 100644 packages/node-integration-tests/suites/tracing/prisma-orm/prisma/migrations/sentry_test/migration.sql create mode 100644 packages/node-integration-tests/suites/tracing/prisma-orm/prisma/schema.prisma create mode 100644 packages/node-integration-tests/suites/tracing/prisma-orm/scenario.ts create mode 100644 packages/node-integration-tests/suites/tracing/prisma-orm/test.ts create mode 100644 packages/node-integration-tests/suites/tracing/prisma-orm/yarn.lock diff --git a/packages/node-integration-tests/.gitignore b/packages/node-integration-tests/.gitignore new file mode 100644 index 000000000000..3c3629e647f5 --- /dev/null +++ b/packages/node-integration-tests/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/packages/node-integration-tests/package.json b/packages/node-integration-tests/package.json index 3f09e8d64192..b8796c03c618 100644 --- a/packages/node-integration-tests/package.json +++ b/packages/node-integration-tests/package.json @@ -7,14 +7,18 @@ }, "private": true, "scripts": { + "clean": "rimraf -g **/node_modules", + "prisma:init": "(cd suites/tracing/prisma-orm && yarn && yarn setup)", "lint": "run-s lint:prettier lint:eslint", "lint:eslint": "eslint . --cache --cache-location '../../eslintcache/' --format stylish", "lint:prettier": "prettier --check \"{suites,utils}/**/*.ts\"", "type-check": "tsc", + "pretest": "run-s --silent prisma:init", "test": "jest --detectOpenHandles --runInBand --forceExit", "test:watch": "yarn test --watch" }, "dependencies": { + "@prisma/client": "^3.12.0", "@types/mongodb": "^3.6.20", "@types/mysql": "^2.15.21", "@types/pg": "^8.6.5", diff --git a/packages/node-integration-tests/suites/tracing/prisma-orm/docker-compose.yml b/packages/node-integration-tests/suites/tracing/prisma-orm/docker-compose.yml new file mode 100644 index 000000000000..45caa4bb3179 --- /dev/null +++ b/packages/node-integration-tests/suites/tracing/prisma-orm/docker-compose.yml @@ -0,0 +1,13 @@ +version: '3.9' + +services: + db: + image: postgres:13 + restart: always + container_name: integration-tests-prisma + ports: + - '5433:5432' + environment: + POSTGRES_USER: prisma + POSTGRES_PASSWORD: prisma + POSTGRES_DB: tests diff --git a/packages/node-integration-tests/suites/tracing/prisma-orm/package.json b/packages/node-integration-tests/suites/tracing/prisma-orm/package.json new file mode 100644 index 000000000000..96890a1b81f3 --- /dev/null +++ b/packages/node-integration-tests/suites/tracing/prisma-orm/package.json @@ -0,0 +1,19 @@ +{ + "name": "sentry-prisma-test", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "db-up": "docker-compose up -d", + "generate": "prisma generate", + "migrate": "prisma migrate dev -n sentry-test", + "setup": "run-s --silent db-up generate migrate" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@prisma/client": "3.12.0", + "prisma": "^3.12.0" + } +} diff --git a/packages/node-integration-tests/suites/tracing/prisma-orm/prisma/migrations/migration_lock.toml b/packages/node-integration-tests/suites/tracing/prisma-orm/prisma/migrations/migration_lock.toml new file mode 100644 index 000000000000..fbffa92c2bb7 --- /dev/null +++ b/packages/node-integration-tests/suites/tracing/prisma-orm/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" \ No newline at end of file diff --git a/packages/node-integration-tests/suites/tracing/prisma-orm/prisma/migrations/sentry_test/migration.sql b/packages/node-integration-tests/suites/tracing/prisma-orm/prisma/migrations/sentry_test/migration.sql new file mode 100644 index 000000000000..8619aaceb2b0 --- /dev/null +++ b/packages/node-integration-tests/suites/tracing/prisma-orm/prisma/migrations/sentry_test/migration.sql @@ -0,0 +1,12 @@ +-- CreateTable +CREATE TABLE "User" ( + "id" SERIAL NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "email" TEXT NOT NULL, + "name" TEXT, + + CONSTRAINT "User_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); diff --git a/packages/node-integration-tests/suites/tracing/prisma-orm/prisma/schema.prisma b/packages/node-integration-tests/suites/tracing/prisma-orm/prisma/schema.prisma new file mode 100644 index 000000000000..4363c97738ee --- /dev/null +++ b/packages/node-integration-tests/suites/tracing/prisma-orm/prisma/schema.prisma @@ -0,0 +1,15 @@ +datasource db { + url = "postgresql://prisma:prisma@localhost:5433/tests" + provider = "postgresql" +} + +generator client { + provider = "prisma-client-js" +} + +model User { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) + email String @unique + name String? +} diff --git a/packages/node-integration-tests/suites/tracing/prisma-orm/scenario.ts b/packages/node-integration-tests/suites/tracing/prisma-orm/scenario.ts new file mode 100644 index 000000000000..047166a9e136 --- /dev/null +++ b/packages/node-integration-tests/suites/tracing/prisma-orm/scenario.ts @@ -0,0 +1,48 @@ +/* eslint-disable @typescript-eslint/no-unsafe-member-access */ +import { PrismaClient } from '@prisma/client'; +import * as Sentry from '@sentry/node'; +import * as Tracing from '@sentry/tracing'; +import { randomBytes } from 'crypto'; + +const client = new PrismaClient(); + +Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + release: '1.0', + tracesSampleRate: 1.0, + integrations: [new Tracing.Integrations.Prisma({ client })], +}); + +async function run(): Promise { + const transaction = Sentry.startTransaction({ + name: 'Test Transaction', + op: 'transaction', + }); + + Sentry.configureScope(scope => { + scope.setSpan(transaction); + }); + + try { + await client.user.create({ + data: { + name: 'Tilda', + email: `tilda_${randomBytes(4).toString('hex')}@sentry.io`, + }, + }); + + await client.user.findMany(); + + await client.user.deleteMany({ + where: { + email: { + contains: 'sentry.io', + }, + }, + }); + } finally { + if (transaction) transaction.finish(); + } +} + +void run(); diff --git a/packages/node-integration-tests/suites/tracing/prisma-orm/test.ts b/packages/node-integration-tests/suites/tracing/prisma-orm/test.ts new file mode 100644 index 000000000000..0048bc2ad5dc --- /dev/null +++ b/packages/node-integration-tests/suites/tracing/prisma-orm/test.ts @@ -0,0 +1,15 @@ +import { assertSentryTransaction, getEnvelopeRequest, runServer } from '../../../utils'; + +test('should instrument Prisma ORM client for tracing.', async () => { + const url = await runServer(__dirname); + const envelope = await getEnvelopeRequest(url); + + assertSentryTransaction(envelope[2], { + transaction: 'Test Transaction', + spans: [ + { description: 'Action: create, Model: User', op: 'prisma' }, + { description: 'Action: findMany, Model: User', op: 'prisma' }, + { description: 'Action: deleteMany, Model: User', op: 'prisma' }, + ], + }); +}); diff --git a/packages/node-integration-tests/suites/tracing/prisma-orm/yarn.lock b/packages/node-integration-tests/suites/tracing/prisma-orm/yarn.lock new file mode 100644 index 000000000000..d228adebd621 --- /dev/null +++ b/packages/node-integration-tests/suites/tracing/prisma-orm/yarn.lock @@ -0,0 +1,27 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@prisma/client@3.12.0": + version "3.12.0" + resolved "https://registry.yarnpkg.com/@prisma/client/-/client-3.12.0.tgz#a0eb49ffea5c128dd11dffb896d7139a60073d12" + integrity sha512-4NEQjUcWja/NVBvfuDFscWSk1/rXg3+wj+TSkqXCb1tKlx/bsUE00rxsvOvGg7VZ6lw1JFpGkwjwmsOIc4zvQw== + dependencies: + "@prisma/engines-version" "3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980" + +"@prisma/engines-version@3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980": + version "3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980" + resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980.tgz#829ca3d9d0d92555f44644606d4edfd45b2f5886" + integrity sha512-o+jo8d7ZEiVpcpNWUDh3fj2uPQpBxl79XE9ih9nkogJbhw6P33274SHnqheedZ7PyvPIK/mvU8MLNYgetgXPYw== + +"@prisma/engines@3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980": + version "3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980" + resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980.tgz#e52e364084c4d05278f62768047b788665e64a45" + integrity sha512-zULjkN8yhzS7B3yeEz4aIym4E2w1ChrV12i14pht3ePFufvsAvBSoZ+tuXMvfSoNTgBS5E4bolRzLbMmbwkkMQ== + +prisma@^3.12.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/prisma/-/prisma-3.12.0.tgz#9675e0e72407122759d3eadcb6d27cdccd3497bd" + integrity sha512-ltCMZAx1i0i9xuPM692Srj8McC665h6E5RqJom999sjtVSccHSD8Z+HSdBN2183h9PJKvC5dapkn78dd0NWMBg== + dependencies: + "@prisma/engines" "3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980" diff --git a/yarn.lock b/yarn.lock index 69010b40b996..acccd2ebea61 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3292,6 +3292,18 @@ resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.12.tgz#431ec342a7195622f86688bbda82e3166ce8cb28" integrity sha512-6RglhutqrGFMO1MNUXp95RBuYIuc8wTnMAV5MUhLmjTOy78ncwOw7RgeQ/HeymkKXRhZd0s2DNrM1rL7unk3MQ== +"@prisma/client@^3.12.0": + version "3.12.0" + resolved "https://registry.yarnpkg.com/@prisma/client/-/client-3.12.0.tgz#a0eb49ffea5c128dd11dffb896d7139a60073d12" + integrity sha512-4NEQjUcWja/NVBvfuDFscWSk1/rXg3+wj+TSkqXCb1tKlx/bsUE00rxsvOvGg7VZ6lw1JFpGkwjwmsOIc4zvQw== + dependencies: + "@prisma/engines-version" "3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980" + +"@prisma/engines-version@3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980": + version "3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980" + resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980.tgz#829ca3d9d0d92555f44644606d4edfd45b2f5886" + integrity sha512-o+jo8d7ZEiVpcpNWUDh3fj2uPQpBxl79XE9ih9nkogJbhw6P33274SHnqheedZ7PyvPIK/mvU8MLNYgetgXPYw== + "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" From a92f781079cc6f24a42d509fd68ede1982b90729 Mon Sep 17 00:00:00 2001 From: Onur Temizkan Date: Tue, 19 Apr 2022 14:24:33 +0300 Subject: [PATCH 05/10] Skip test on Node 10. --- packages/node-integration-tests/package.json | 2 +- .../suites/tracing/prisma-orm/package.json | 3 +++ .../suites/tracing/prisma-orm/setup.sh | 10 ++++++++ .../suites/tracing/prisma-orm/test.ts | 24 ++++++++++--------- 4 files changed, 27 insertions(+), 12 deletions(-) create mode 100755 packages/node-integration-tests/suites/tracing/prisma-orm/setup.sh diff --git a/packages/node-integration-tests/package.json b/packages/node-integration-tests/package.json index b8796c03c618..1b03eb90429a 100644 --- a/packages/node-integration-tests/package.json +++ b/packages/node-integration-tests/package.json @@ -8,7 +8,7 @@ "private": true, "scripts": { "clean": "rimraf -g **/node_modules", - "prisma:init": "(cd suites/tracing/prisma-orm && yarn && yarn setup)", + "prisma:init": "(cd suites/tracing/prisma-orm && ./setup.sh)", "lint": "run-s lint:prettier lint:eslint", "lint:eslint": "eslint . --cache --cache-location '../../eslintcache/' --format stylish", "lint:prettier": "prettier --check \"{suites,utils}/**/*.ts\"", diff --git a/packages/node-integration-tests/suites/tracing/prisma-orm/package.json b/packages/node-integration-tests/suites/tracing/prisma-orm/package.json index 96890a1b81f3..f8b24d7d0465 100644 --- a/packages/node-integration-tests/suites/tracing/prisma-orm/package.json +++ b/packages/node-integration-tests/suites/tracing/prisma-orm/package.json @@ -3,6 +3,9 @@ "version": "1.0.0", "description": "", "main": "index.js", + "engines": { + "node": ">=12" + }, "scripts": { "db-up": "docker-compose up -d", "generate": "prisma generate", diff --git a/packages/node-integration-tests/suites/tracing/prisma-orm/setup.sh b/packages/node-integration-tests/suites/tracing/prisma-orm/setup.sh new file mode 100755 index 000000000000..7e68da11012b --- /dev/null +++ b/packages/node-integration-tests/suites/tracing/prisma-orm/setup.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +NODE_MAJOR=$(node -v | cut -c2- | cut -d. -f1) + +if [ "$NODE_MAJOR" -lt "12" ]; then + echo "Skipping Prisma tests on Node: $NODE_MAJOR" + exit 0 +fi + +yarn && yarn setup diff --git a/packages/node-integration-tests/suites/tracing/prisma-orm/test.ts b/packages/node-integration-tests/suites/tracing/prisma-orm/test.ts index 0048bc2ad5dc..065038265542 100644 --- a/packages/node-integration-tests/suites/tracing/prisma-orm/test.ts +++ b/packages/node-integration-tests/suites/tracing/prisma-orm/test.ts @@ -1,15 +1,17 @@ -import { assertSentryTransaction, getEnvelopeRequest, runServer } from '../../../utils'; +import { assertSentryTransaction, conditionalTest, getEnvelopeRequest, runServer } from '../../../utils'; -test('should instrument Prisma ORM client for tracing.', async () => { - const url = await runServer(__dirname); - const envelope = await getEnvelopeRequest(url); +conditionalTest({ min: 12 })('Prisma ORM Integration', () => { + test('should instrument Prisma client for tracing.', async () => { + const url = await runServer(__dirname); + const envelope = await getEnvelopeRequest(url); - assertSentryTransaction(envelope[2], { - transaction: 'Test Transaction', - spans: [ - { description: 'Action: create, Model: User', op: 'prisma' }, - { description: 'Action: findMany, Model: User', op: 'prisma' }, - { description: 'Action: deleteMany, Model: User', op: 'prisma' }, - ], + assertSentryTransaction(envelope[2], { + transaction: 'Test Transaction', + spans: [ + { description: 'Action: create, Model: User', op: 'prisma' }, + { description: 'Action: findMany, Model: User', op: 'prisma' }, + { description: 'Action: deleteMany, Model: User', op: 'prisma' }, + ], + }); }); }); From b599f6da791ca0e047bbe4cf9c70b14a2e282214 Mon Sep 17 00:00:00 2001 From: Onur Temizkan Date: Tue, 19 Apr 2022 15:00:09 +0000 Subject: [PATCH 06/10] Update packages/tracing/src/integrations/node/prisma.ts Co-authored-by: Abhijeet Prasad --- packages/tracing/src/integrations/node/prisma.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/tracing/src/integrations/node/prisma.ts b/packages/tracing/src/integrations/node/prisma.ts index 4a5d80aabd63..226e16bd489d 100644 --- a/packages/tracing/src/integrations/node/prisma.ts +++ b/packages/tracing/src/integrations/node/prisma.ts @@ -79,8 +79,8 @@ export class Prisma implements Integration { const model = params.model; const span = parentSpan?.startChild({ - description: `Action: ${action}, ${model ? `Model: ${model}` : ''}`, - op: 'prisma', + description: model ? `${model} ${action}` : action, + op: 'db.prisma', }); const rv = next(params); From ff59aac1197b47ec25f8aed584ae0bf6b8579c5f Mon Sep 17 00:00:00 2001 From: Onur Temizkan Date: Tue, 19 Apr 2022 18:12:21 +0300 Subject: [PATCH 07/10] Update assertions. --- .../suites/tracing/prisma-orm/test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/node-integration-tests/suites/tracing/prisma-orm/test.ts b/packages/node-integration-tests/suites/tracing/prisma-orm/test.ts index 065038265542..91e6f39da889 100644 --- a/packages/node-integration-tests/suites/tracing/prisma-orm/test.ts +++ b/packages/node-integration-tests/suites/tracing/prisma-orm/test.ts @@ -8,9 +8,9 @@ conditionalTest({ min: 12 })('Prisma ORM Integration', () => { assertSentryTransaction(envelope[2], { transaction: 'Test Transaction', spans: [ - { description: 'Action: create, Model: User', op: 'prisma' }, - { description: 'Action: findMany, Model: User', op: 'prisma' }, - { description: 'Action: deleteMany, Model: User', op: 'prisma' }, + { description: 'User create', op: 'db.prisma' }, + { description: 'User findMany', op: 'db.prisma' }, + { description: 'User deleteMany', op: 'db.prisma' }, ], }); }); From 3963d1d5104c734ede1cbac69eada594a0160f72 Mon Sep 17 00:00:00 2001 From: Onur Temizkan Date: Thu, 21 Apr 2022 19:05:18 +0300 Subject: [PATCH 08/10] Add a simple unit test. --- .../test/integrations/node/prisma.test.ts | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 packages/tracing/test/integrations/node/prisma.test.ts diff --git a/packages/tracing/test/integrations/node/prisma.test.ts b/packages/tracing/test/integrations/node/prisma.test.ts new file mode 100644 index 000000000000..89ec4784fe29 --- /dev/null +++ b/packages/tracing/test/integrations/node/prisma.test.ts @@ -0,0 +1,60 @@ +import { Hub, Scope } from '@sentry/hub'; + +import { Prisma } from '../../../src/integrations/node/prisma'; +import { Span } from '../../../src/span'; + +type PrismaMiddleware = (params: unknown, next: (params?: unknown) => Promise) => Promise; + +class PrismaClient { + constructor() { + this.middleware = undefined; + } + + private middleware?: PrismaMiddleware; + + public $use(cb: PrismaMiddleware) { + this.middleware = cb; + } + + public user = { + create: () => this.middleware?.({ action: 'create', model: 'user' }, () => Promise.resolve('result')), + }; +} + +describe('setupOnce', () => { + const Client: PrismaClient = new PrismaClient(); + + let scope = new Scope(); + let parentSpan: Span; + let childSpan: Span; + + beforeAll(() => { + // @ts-ignore + new Prisma({ client: Client }).setupOnce( + () => undefined, + () => new Hub(undefined, scope), + ); + }); + + beforeEach(() => { + scope = new Scope(); + parentSpan = new Span(); + childSpan = parentSpan.startChild(); + jest.spyOn(scope, 'getSpan').mockReturnValueOnce(parentSpan); + jest.spyOn(parentSpan, 'startChild').mockReturnValueOnce(childSpan); + jest.spyOn(childSpan, 'finish'); + }); + + it(`should add middleware with $use method correctly`, done => { + Client.user.create()?.then(res => { + expect(res).toBe('result'); + expect(scope.getSpan).toBeCalled(); + expect(parentSpan.startChild).toBeCalledWith({ + description: 'user create', + op: 'db.prisma', + }); + expect(childSpan.finish).toBeCalled(); + done(); + }); + }); +}); From 050d8dd8e866c80820b1176cf5e80f4045a0b992 Mon Sep 17 00:00:00 2001 From: Onur Temizkan Date: Thu, 21 Apr 2022 19:11:46 +0300 Subject: [PATCH 09/10] Remove integration tests. --- packages/node-integration-tests/.gitignore | 1 - packages/node-integration-tests/package.json | 4 -- .../tracing/prisma-orm/docker-compose.yml | 13 ----- .../suites/tracing/prisma-orm/package.json | 22 --------- .../prisma/migrations/migration_lock.toml | 3 -- .../migrations/sentry_test/migration.sql | 12 ----- .../tracing/prisma-orm/prisma/schema.prisma | 15 ------ .../suites/tracing/prisma-orm/scenario.ts | 48 ------------------- .../suites/tracing/prisma-orm/setup.sh | 10 ---- .../suites/tracing/prisma-orm/test.ts | 17 ------- .../suites/tracing/prisma-orm/yarn.lock | 27 ----------- packages/tracing/src/hubextensions.ts | 1 - yarn.lock | 12 ----- 13 files changed, 185 deletions(-) delete mode 100644 packages/node-integration-tests/.gitignore delete mode 100644 packages/node-integration-tests/suites/tracing/prisma-orm/docker-compose.yml delete mode 100644 packages/node-integration-tests/suites/tracing/prisma-orm/package.json delete mode 100644 packages/node-integration-tests/suites/tracing/prisma-orm/prisma/migrations/migration_lock.toml delete mode 100644 packages/node-integration-tests/suites/tracing/prisma-orm/prisma/migrations/sentry_test/migration.sql delete mode 100644 packages/node-integration-tests/suites/tracing/prisma-orm/prisma/schema.prisma delete mode 100644 packages/node-integration-tests/suites/tracing/prisma-orm/scenario.ts delete mode 100755 packages/node-integration-tests/suites/tracing/prisma-orm/setup.sh delete mode 100644 packages/node-integration-tests/suites/tracing/prisma-orm/test.ts delete mode 100644 packages/node-integration-tests/suites/tracing/prisma-orm/yarn.lock diff --git a/packages/node-integration-tests/.gitignore b/packages/node-integration-tests/.gitignore deleted file mode 100644 index 3c3629e647f5..000000000000 --- a/packages/node-integration-tests/.gitignore +++ /dev/null @@ -1 +0,0 @@ -node_modules diff --git a/packages/node-integration-tests/package.json b/packages/node-integration-tests/package.json index 53bac132f9c4..002031983f52 100644 --- a/packages/node-integration-tests/package.json +++ b/packages/node-integration-tests/package.json @@ -7,18 +7,14 @@ }, "private": true, "scripts": { - "clean": "rimraf -g **/node_modules", - "prisma:init": "(cd suites/tracing/prisma-orm && ./setup.sh)", "lint": "run-s lint:prettier lint:eslint", "lint:eslint": "eslint . --cache --cache-location '../../eslintcache/' --format stylish", "lint:prettier": "prettier --check \"{suites,utils}/**/*.ts\"", "type-check": "tsc", - "pretest": "run-s --silent prisma:init", "test": "jest --runInBand --forceExit", "test:watch": "yarn test --watch" }, "dependencies": { - "@prisma/client": "^3.12.0", "@types/mongodb": "^3.6.20", "@types/mysql": "^2.15.21", "@types/pg": "^8.6.5", diff --git a/packages/node-integration-tests/suites/tracing/prisma-orm/docker-compose.yml b/packages/node-integration-tests/suites/tracing/prisma-orm/docker-compose.yml deleted file mode 100644 index 45caa4bb3179..000000000000 --- a/packages/node-integration-tests/suites/tracing/prisma-orm/docker-compose.yml +++ /dev/null @@ -1,13 +0,0 @@ -version: '3.9' - -services: - db: - image: postgres:13 - restart: always - container_name: integration-tests-prisma - ports: - - '5433:5432' - environment: - POSTGRES_USER: prisma - POSTGRES_PASSWORD: prisma - POSTGRES_DB: tests diff --git a/packages/node-integration-tests/suites/tracing/prisma-orm/package.json b/packages/node-integration-tests/suites/tracing/prisma-orm/package.json deleted file mode 100644 index f8b24d7d0465..000000000000 --- a/packages/node-integration-tests/suites/tracing/prisma-orm/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "sentry-prisma-test", - "version": "1.0.0", - "description": "", - "main": "index.js", - "engines": { - "node": ">=12" - }, - "scripts": { - "db-up": "docker-compose up -d", - "generate": "prisma generate", - "migrate": "prisma migrate dev -n sentry-test", - "setup": "run-s --silent db-up generate migrate" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "@prisma/client": "3.12.0", - "prisma": "^3.12.0" - } -} diff --git a/packages/node-integration-tests/suites/tracing/prisma-orm/prisma/migrations/migration_lock.toml b/packages/node-integration-tests/suites/tracing/prisma-orm/prisma/migrations/migration_lock.toml deleted file mode 100644 index fbffa92c2bb7..000000000000 --- a/packages/node-integration-tests/suites/tracing/prisma-orm/prisma/migrations/migration_lock.toml +++ /dev/null @@ -1,3 +0,0 @@ -# Please do not edit this file manually -# It should be added in your version-control system (i.e. Git) -provider = "postgresql" \ No newline at end of file diff --git a/packages/node-integration-tests/suites/tracing/prisma-orm/prisma/migrations/sentry_test/migration.sql b/packages/node-integration-tests/suites/tracing/prisma-orm/prisma/migrations/sentry_test/migration.sql deleted file mode 100644 index 8619aaceb2b0..000000000000 --- a/packages/node-integration-tests/suites/tracing/prisma-orm/prisma/migrations/sentry_test/migration.sql +++ /dev/null @@ -1,12 +0,0 @@ --- CreateTable -CREATE TABLE "User" ( - "id" SERIAL NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "email" TEXT NOT NULL, - "name" TEXT, - - CONSTRAINT "User_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); diff --git a/packages/node-integration-tests/suites/tracing/prisma-orm/prisma/schema.prisma b/packages/node-integration-tests/suites/tracing/prisma-orm/prisma/schema.prisma deleted file mode 100644 index 4363c97738ee..000000000000 --- a/packages/node-integration-tests/suites/tracing/prisma-orm/prisma/schema.prisma +++ /dev/null @@ -1,15 +0,0 @@ -datasource db { - url = "postgresql://prisma:prisma@localhost:5433/tests" - provider = "postgresql" -} - -generator client { - provider = "prisma-client-js" -} - -model User { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - email String @unique - name String? -} diff --git a/packages/node-integration-tests/suites/tracing/prisma-orm/scenario.ts b/packages/node-integration-tests/suites/tracing/prisma-orm/scenario.ts deleted file mode 100644 index 047166a9e136..000000000000 --- a/packages/node-integration-tests/suites/tracing/prisma-orm/scenario.ts +++ /dev/null @@ -1,48 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unsafe-member-access */ -import { PrismaClient } from '@prisma/client'; -import * as Sentry from '@sentry/node'; -import * as Tracing from '@sentry/tracing'; -import { randomBytes } from 'crypto'; - -const client = new PrismaClient(); - -Sentry.init({ - dsn: 'https://public@dsn.ingest.sentry.io/1337', - release: '1.0', - tracesSampleRate: 1.0, - integrations: [new Tracing.Integrations.Prisma({ client })], -}); - -async function run(): Promise { - const transaction = Sentry.startTransaction({ - name: 'Test Transaction', - op: 'transaction', - }); - - Sentry.configureScope(scope => { - scope.setSpan(transaction); - }); - - try { - await client.user.create({ - data: { - name: 'Tilda', - email: `tilda_${randomBytes(4).toString('hex')}@sentry.io`, - }, - }); - - await client.user.findMany(); - - await client.user.deleteMany({ - where: { - email: { - contains: 'sentry.io', - }, - }, - }); - } finally { - if (transaction) transaction.finish(); - } -} - -void run(); diff --git a/packages/node-integration-tests/suites/tracing/prisma-orm/setup.sh b/packages/node-integration-tests/suites/tracing/prisma-orm/setup.sh deleted file mode 100755 index 7e68da11012b..000000000000 --- a/packages/node-integration-tests/suites/tracing/prisma-orm/setup.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -NODE_MAJOR=$(node -v | cut -c2- | cut -d. -f1) - -if [ "$NODE_MAJOR" -lt "12" ]; then - echo "Skipping Prisma tests on Node: $NODE_MAJOR" - exit 0 -fi - -yarn && yarn setup diff --git a/packages/node-integration-tests/suites/tracing/prisma-orm/test.ts b/packages/node-integration-tests/suites/tracing/prisma-orm/test.ts deleted file mode 100644 index 91e6f39da889..000000000000 --- a/packages/node-integration-tests/suites/tracing/prisma-orm/test.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { assertSentryTransaction, conditionalTest, getEnvelopeRequest, runServer } from '../../../utils'; - -conditionalTest({ min: 12 })('Prisma ORM Integration', () => { - test('should instrument Prisma client for tracing.', async () => { - const url = await runServer(__dirname); - const envelope = await getEnvelopeRequest(url); - - assertSentryTransaction(envelope[2], { - transaction: 'Test Transaction', - spans: [ - { description: 'User create', op: 'db.prisma' }, - { description: 'User findMany', op: 'db.prisma' }, - { description: 'User deleteMany', op: 'db.prisma' }, - ], - }); - }); -}); diff --git a/packages/node-integration-tests/suites/tracing/prisma-orm/yarn.lock b/packages/node-integration-tests/suites/tracing/prisma-orm/yarn.lock deleted file mode 100644 index d228adebd621..000000000000 --- a/packages/node-integration-tests/suites/tracing/prisma-orm/yarn.lock +++ /dev/null @@ -1,27 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@prisma/client@3.12.0": - version "3.12.0" - resolved "https://registry.yarnpkg.com/@prisma/client/-/client-3.12.0.tgz#a0eb49ffea5c128dd11dffb896d7139a60073d12" - integrity sha512-4NEQjUcWja/NVBvfuDFscWSk1/rXg3+wj+TSkqXCb1tKlx/bsUE00rxsvOvGg7VZ6lw1JFpGkwjwmsOIc4zvQw== - dependencies: - "@prisma/engines-version" "3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980" - -"@prisma/engines-version@3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980": - version "3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980" - resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980.tgz#829ca3d9d0d92555f44644606d4edfd45b2f5886" - integrity sha512-o+jo8d7ZEiVpcpNWUDh3fj2uPQpBxl79XE9ih9nkogJbhw6P33274SHnqheedZ7PyvPIK/mvU8MLNYgetgXPYw== - -"@prisma/engines@3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980": - version "3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980" - resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980.tgz#e52e364084c4d05278f62768047b788665e64a45" - integrity sha512-zULjkN8yhzS7B3yeEz4aIym4E2w1ChrV12i14pht3ePFufvsAvBSoZ+tuXMvfSoNTgBS5E4bolRzLbMmbwkkMQ== - -prisma@^3.12.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/prisma/-/prisma-3.12.0.tgz#9675e0e72407122759d3eadcb6d27cdccd3497bd" - integrity sha512-ltCMZAx1i0i9xuPM692Srj8McC665h6E5RqJom999sjtVSccHSD8Z+HSdBN2183h9PJKvC5dapkn78dd0NWMBg== - dependencies: - "@prisma/engines" "3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980" diff --git a/packages/tracing/src/hubextensions.ts b/packages/tracing/src/hubextensions.ts index 41b2f95ca9a8..bd38b270cc22 100644 --- a/packages/tracing/src/hubextensions.ts +++ b/packages/tracing/src/hubextensions.ts @@ -1,4 +1,3 @@ -/* eslint-disable max-lines */ import { getMainCarrier, Hub } from '@sentry/hub'; import { CustomSamplingContext, diff --git a/yarn.lock b/yarn.lock index acccd2ebea61..69010b40b996 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3292,18 +3292,6 @@ resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.12.tgz#431ec342a7195622f86688bbda82e3166ce8cb28" integrity sha512-6RglhutqrGFMO1MNUXp95RBuYIuc8wTnMAV5MUhLmjTOy78ncwOw7RgeQ/HeymkKXRhZd0s2DNrM1rL7unk3MQ== -"@prisma/client@^3.12.0": - version "3.12.0" - resolved "https://registry.yarnpkg.com/@prisma/client/-/client-3.12.0.tgz#a0eb49ffea5c128dd11dffb896d7139a60073d12" - integrity sha512-4NEQjUcWja/NVBvfuDFscWSk1/rXg3+wj+TSkqXCb1tKlx/bsUE00rxsvOvGg7VZ6lw1JFpGkwjwmsOIc4zvQw== - dependencies: - "@prisma/engines-version" "3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980" - -"@prisma/engines-version@3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980": - version "3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980" - resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980.tgz#829ca3d9d0d92555f44644606d4edfd45b2f5886" - integrity sha512-o+jo8d7ZEiVpcpNWUDh3fj2uPQpBxl79XE9ih9nkogJbhw6P33274SHnqheedZ7PyvPIK/mvU8MLNYgetgXPYw== - "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" From 215beafed9e18f0183f6f6a582d6e0610a3feb4e Mon Sep 17 00:00:00 2001 From: Onur Temizkan Date: Thu, 21 Apr 2022 19:37:06 +0300 Subject: [PATCH 10/10] Fix linter issues. --- .../tracing/src/integrations/node/prisma.ts | 6 ++--- .../test/integrations/node/prisma.test.ts | 25 ++++++++++--------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/packages/tracing/src/integrations/node/prisma.ts b/packages/tracing/src/integrations/node/prisma.ts index 226e16bd489d..e70fce9f0f60 100644 --- a/packages/tracing/src/integrations/node/prisma.ts +++ b/packages/tracing/src/integrations/node/prisma.ts @@ -22,14 +22,14 @@ type PrismaAction = | 'runCommandRaw'; interface PrismaMiddlewareParams { - model?: any; + model?: unknown; action: PrismaAction; - args: any; + args: unknown; dataPath: string[]; runInTransaction: boolean; } -type PrismaMiddleware = ( +type PrismaMiddleware = ( params: PrismaMiddlewareParams, next: (params: PrismaMiddlewareParams) => Promise, ) => Promise; diff --git a/packages/tracing/test/integrations/node/prisma.test.ts b/packages/tracing/test/integrations/node/prisma.test.ts index 89ec4784fe29..501101dbce6f 100644 --- a/packages/tracing/test/integrations/node/prisma.test.ts +++ b/packages/tracing/test/integrations/node/prisma.test.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/unbound-method */ import { Hub, Scope } from '@sentry/hub'; import { Prisma } from '../../../src/integrations/node/prisma'; @@ -6,22 +7,22 @@ import { Span } from '../../../src/span'; type PrismaMiddleware = (params: unknown, next: (params?: unknown) => Promise) => Promise; class PrismaClient { + public user: { create: () => Promise | undefined } = { + create: () => this._middleware?.({ action: 'create', model: 'user' }, () => Promise.resolve('result')), + }; + + private _middleware?: PrismaMiddleware; + constructor() { - this.middleware = undefined; + this._middleware = undefined; } - private middleware?: PrismaMiddleware; - public $use(cb: PrismaMiddleware) { - this.middleware = cb; + this._middleware = cb; } - - public user = { - create: () => this.middleware?.({ action: 'create', model: 'user' }, () => Promise.resolve('result')), - }; } -describe('setupOnce', () => { +describe('setupOnce', function () { const Client: PrismaClient = new PrismaClient(); let scope = new Scope(); @@ -29,7 +30,7 @@ describe('setupOnce', () => { let childSpan: Span; beforeAll(() => { - // @ts-ignore + // @ts-ignore, not to export PrismaClient types from integration source new Prisma({ client: Client }).setupOnce( () => undefined, () => new Hub(undefined, scope), @@ -45,8 +46,8 @@ describe('setupOnce', () => { jest.spyOn(childSpan, 'finish'); }); - it(`should add middleware with $use method correctly`, done => { - Client.user.create()?.then(res => { + it('should add middleware with $use method correctly', done => { + void Client.user.create()?.then(res => { expect(res).toBe('result'); expect(scope.getSpan).toBeCalled(); expect(parentSpan.startChild).toBeCalledWith({