From 2679f6c3eeab57c84dd0b347c9cc86ac56a69c6b Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Thu, 16 Mar 2023 22:06:28 +0000 Subject: [PATCH 1/8] Tracing from `@sentry/node` --- packages/nextjs/src/index.types.ts | 2 + .../suites/express/tracing/server.ts | 3 +- .../tracing-new/apollo-graphql/scenario.ts | 44 ++++++++++ .../suites/tracing-new/apollo-graphql/test.ts | 35 ++++++++ .../auto-instrument/mongodb/scenario.ts | 46 ++++++++++ .../auto-instrument/mongodb/test.ts | 85 +++++++++++++++++++ .../auto-instrument/mysql/scenario.ts | 36 ++++++++ .../tracing-new/auto-instrument/mysql/test.ts | 23 +++++ .../auto-instrument/pg/scenario.ts | 25 ++++++ .../tracing-new/auto-instrument/pg/test.ts | 54 ++++++++++++ .../tracing-new/prisma-orm/docker-compose.yml | 13 +++ .../tracing-new/prisma-orm/package.json | 22 +++++ .../prisma/migrations/migration_lock.toml | 3 + .../migrations/sentry_test/migration.sql | 12 +++ .../prisma-orm/prisma/schema.prisma | 15 ++++ .../suites/tracing-new/prisma-orm/scenario.ts | 48 +++++++++++ .../suites/tracing-new/prisma-orm/setup.ts | 16 ++++ .../suites/tracing-new/prisma-orm/test.ts | 17 ++++ .../suites/tracing-new/prisma-orm/yarn.lock | 27 ++++++ .../tracePropagationTargets/scenario.ts | 26 ++++++ .../tracePropagationTargets/test.ts | 42 +++++++++ packages/node/package.json | 1 + packages/node/src/index.ts | 1 + packages/node/src/tracing.ts | 36 ++++++++ packages/tracing-internal/src/index.ts | 13 ++- .../src/node/integrations/apollo.ts | 2 + .../src/node/integrations/express.ts | 2 + .../src/node/integrations/graphql.ts | 5 ++ .../src/node/integrations/index.ts | 1 + .../src/node/integrations/lazy.ts | 47 ++++++++++ .../src/node/integrations/mongo.ts | 2 + .../src/node/integrations/mysql.ts | 5 ++ .../src/node/integrations/postgres.ts | 2 + .../src/node/integrations/prisma.ts | 2 + 34 files changed, 710 insertions(+), 3 deletions(-) create mode 100644 packages/node-integration-tests/suites/tracing-new/apollo-graphql/scenario.ts create mode 100644 packages/node-integration-tests/suites/tracing-new/apollo-graphql/test.ts create mode 100644 packages/node-integration-tests/suites/tracing-new/auto-instrument/mongodb/scenario.ts create mode 100644 packages/node-integration-tests/suites/tracing-new/auto-instrument/mongodb/test.ts create mode 100644 packages/node-integration-tests/suites/tracing-new/auto-instrument/mysql/scenario.ts create mode 100644 packages/node-integration-tests/suites/tracing-new/auto-instrument/mysql/test.ts create mode 100644 packages/node-integration-tests/suites/tracing-new/auto-instrument/pg/scenario.ts create mode 100644 packages/node-integration-tests/suites/tracing-new/auto-instrument/pg/test.ts create mode 100644 packages/node-integration-tests/suites/tracing-new/prisma-orm/docker-compose.yml create mode 100644 packages/node-integration-tests/suites/tracing-new/prisma-orm/package.json create mode 100644 packages/node-integration-tests/suites/tracing-new/prisma-orm/prisma/migrations/migration_lock.toml create mode 100644 packages/node-integration-tests/suites/tracing-new/prisma-orm/prisma/migrations/sentry_test/migration.sql create mode 100644 packages/node-integration-tests/suites/tracing-new/prisma-orm/prisma/schema.prisma create mode 100644 packages/node-integration-tests/suites/tracing-new/prisma-orm/scenario.ts create mode 100755 packages/node-integration-tests/suites/tracing-new/prisma-orm/setup.ts create mode 100644 packages/node-integration-tests/suites/tracing-new/prisma-orm/test.ts create mode 100644 packages/node-integration-tests/suites/tracing-new/prisma-orm/yarn.lock create mode 100644 packages/node-integration-tests/suites/tracing-new/tracePropagationTargets/scenario.ts create mode 100644 packages/node-integration-tests/suites/tracing-new/tracePropagationTargets/test.ts create mode 100644 packages/node/src/tracing.ts create mode 100644 packages/tracing-internal/src/node/integrations/lazy.ts diff --git a/packages/nextjs/src/index.types.ts b/packages/nextjs/src/index.types.ts index b0cd45e43084..3a7390c42da5 100644 --- a/packages/nextjs/src/index.types.ts +++ b/packages/nextjs/src/index.types.ts @@ -36,6 +36,8 @@ export declare const ErrorBoundary: typeof clientSdk.ErrorBoundary; export declare const showReportDialog: typeof clientSdk.showReportDialog; export declare const withErrorBoundary: typeof clientSdk.withErrorBoundary; +export declare function addTracingExtensions(): void; + export declare const Span: typeof edgeSdk.Span; /** diff --git a/packages/node-integration-tests/suites/express/tracing/server.ts b/packages/node-integration-tests/suites/express/tracing/server.ts index faf5a50f95ed..3639b6bf6cc7 100644 --- a/packages/node-integration-tests/suites/express/tracing/server.ts +++ b/packages/node-integration-tests/suites/express/tracing/server.ts @@ -1,5 +1,4 @@ import * as Sentry from '@sentry/node'; -import * as Tracing from '@sentry/tracing'; import cors from 'cors'; import express from 'express'; @@ -8,7 +7,7 @@ const app = express(); Sentry.init({ dsn: 'https://public@dsn.ingest.sentry.io/1337', release: '1.0', - integrations: [new Sentry.Integrations.Http({ tracing: true }), new Tracing.Integrations.Express({ app })], + integrations: [new Sentry.Integrations.Http({ tracing: true }), new Sentry.Express({ app })], tracesSampleRate: 1.0, }); diff --git a/packages/node-integration-tests/suites/tracing-new/apollo-graphql/scenario.ts b/packages/node-integration-tests/suites/tracing-new/apollo-graphql/scenario.ts new file mode 100644 index 000000000000..cea4a03df10e --- /dev/null +++ b/packages/node-integration-tests/suites/tracing-new/apollo-graphql/scenario.ts @@ -0,0 +1,44 @@ +import * as Sentry from '@sentry/node'; +import * as Tracing from '@sentry/tracing'; +import { ApolloServer, gql } from 'apollo-server'; + +Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + release: '1.0', + tracesSampleRate: 1.0, + integrations: [new Tracing.Integrations.GraphQL(), new Tracing.Integrations.Apollo()], +}); + +const typeDefs = gql` + type Query { + hello: String + } +`; + +const resolvers = { + Query: { + hello: () => { + return 'Hello world!'; + }, + }, +}; + +const server = new ApolloServer({ + typeDefs, + resolvers, +}); + +const transaction = Sentry.startTransaction({ name: 'test_transaction', op: 'transaction' }); + +Sentry.configureScope(scope => { + scope.setSpan(transaction); +}); + +void (async () => { + // Ref: https://www.apollographql.com/docs/apollo-server/testing/testing/#testing-using-executeoperation + await server.executeOperation({ + query: '{hello}', + }); + + transaction.finish(); +})(); diff --git a/packages/node-integration-tests/suites/tracing-new/apollo-graphql/test.ts b/packages/node-integration-tests/suites/tracing-new/apollo-graphql/test.ts new file mode 100644 index 000000000000..128f8a2f164b --- /dev/null +++ b/packages/node-integration-tests/suites/tracing-new/apollo-graphql/test.ts @@ -0,0 +1,35 @@ +import { assertSentryTransaction, conditionalTest, TestEnv } from '../../../utils'; + +// Node 10 is not supported by `graphql-js` +// Ref: https://github.com/graphql/graphql-js/blob/main/package.json +conditionalTest({ min: 12 })('GraphQL/Apollo Tests', () => { + test('should instrument GraphQL and Apollo Server.', async () => { + const env = await TestEnv.init(__dirname); + const envelope = await env.getEnvelopeRequest({ envelopeType: 'transaction' }); + + expect(envelope).toHaveLength(3); + + const transaction = envelope[2]; + const parentSpanId = (transaction as any)?.contexts?.trace?.span_id; + const graphqlSpanId = (transaction as any)?.spans?.[0].span_id; + + expect(parentSpanId).toBeDefined(); + expect(graphqlSpanId).toBeDefined(); + + assertSentryTransaction(transaction, { + transaction: 'test_transaction', + spans: [ + { + description: 'execute', + op: 'graphql.execute', + parent_span_id: parentSpanId, + }, + { + description: 'Query.hello', + op: 'graphql.resolve', + parent_span_id: graphqlSpanId, + }, + ], + }); + }); +}); diff --git a/packages/node-integration-tests/suites/tracing-new/auto-instrument/mongodb/scenario.ts b/packages/node-integration-tests/suites/tracing-new/auto-instrument/mongodb/scenario.ts new file mode 100644 index 000000000000..31d7356765e9 --- /dev/null +++ b/packages/node-integration-tests/suites/tracing-new/auto-instrument/mongodb/scenario.ts @@ -0,0 +1,46 @@ +import * as Sentry from '@sentry/node'; +import { MongoClient } from 'mongodb'; + +// suppress logging of the mongo download +global.console.log = () => null; + +Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + release: '1.0', + tracesSampleRate: 1.0, + integrations: [...Sentry.autoDiscoverNodePerformanceMonitoringIntegrations()], +}); + +const client = new MongoClient(process.env.MONGO_URL || '', { + useUnifiedTopology: true, +}); + +async function run(): Promise { + const transaction = Sentry.startTransaction({ + name: 'Test Transaction', + op: 'transaction', + }); + + Sentry.configureScope(scope => { + scope.setSpan(transaction); + }); + + try { + await client.connect(); + + const database = client.db('admin'); + const collection = database.collection('movies'); + + await collection.insertOne({ title: 'Rick and Morty' }); + await collection.findOne({ title: 'Back to the Future' }); + await collection.updateOne({ title: 'Back to the Future' }, { $set: { title: 'South Park' } }); + await collection.findOne({ title: 'South Park' }); + + await collection.find({ title: 'South Park' }).toArray(); + } finally { + if (transaction) transaction.finish(); + await client.close(); + } +} + +void run(); diff --git a/packages/node-integration-tests/suites/tracing-new/auto-instrument/mongodb/test.ts b/packages/node-integration-tests/suites/tracing-new/auto-instrument/mongodb/test.ts new file mode 100644 index 000000000000..5664aac9422b --- /dev/null +++ b/packages/node-integration-tests/suites/tracing-new/auto-instrument/mongodb/test.ts @@ -0,0 +1,85 @@ +import { MongoMemoryServer } from 'mongodb-memory-server-global'; + +import { assertSentryTransaction, conditionalTest, TestEnv } from '../../../../utils'; + +// This test can take longer. +jest.setTimeout(15000); + +conditionalTest({ min: 12 })('MongoDB Test', () => { + let mongoServer: MongoMemoryServer; + + beforeAll(async () => { + mongoServer = await MongoMemoryServer.create(); + process.env.MONGO_URL = mongoServer.getUri(); + }, 10000); + + afterAll(async () => { + if (mongoServer) { + await mongoServer.stop(); + } + }); + + test('should auto-instrument `mongodb` package.', async () => { + const env = await TestEnv.init(__dirname); + const envelope = await env.getEnvelopeRequest({ envelopeType: 'transaction' }); + + expect(envelope).toHaveLength(3); + + assertSentryTransaction(envelope[2], { + transaction: 'Test Transaction', + spans: [ + { + data: { + collectionName: 'movies', + dbName: 'admin', + namespace: 'admin.movies', + doc: '{"title":"Rick and Morty"}', + }, + description: 'insertOne', + op: 'db', + }, + { + data: { + collectionName: 'movies', + dbName: 'admin', + namespace: 'admin.movies', + query: '{"title":"Back to the Future"}', + }, + description: 'findOne', + op: 'db', + }, + { + data: { + collectionName: 'movies', + dbName: 'admin', + namespace: 'admin.movies', + filter: '{"title":"Back to the Future"}', + update: '{"$set":{"title":"South Park"}}', + }, + description: 'updateOne', + op: 'db', + }, + { + data: { + collectionName: 'movies', + dbName: 'admin', + namespace: 'admin.movies', + query: '{"title":"South Park"}', + }, + description: 'findOne', + op: 'db', + }, + { + data: { + collectionName: 'movies', + dbName: 'admin', + namespace: 'admin.movies', + query: '{"title":"South Park"}', + }, + description: 'find', + op: 'db', + }, + ], + }); + }); +}); diff --git a/packages/node-integration-tests/suites/tracing-new/auto-instrument/mysql/scenario.ts b/packages/node-integration-tests/suites/tracing-new/auto-instrument/mysql/scenario.ts new file mode 100644 index 000000000000..0f576cb793aa --- /dev/null +++ b/packages/node-integration-tests/suites/tracing-new/auto-instrument/mysql/scenario.ts @@ -0,0 +1,36 @@ +import * as Sentry from '@sentry/node'; +import mysql from 'mysql'; + +Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + release: '1.0', + tracesSampleRate: 1.0, + integrations: [...Sentry.autoDiscoverNodePerformanceMonitoringIntegrations()], +}); + +const connection = mysql.createConnection({ + user: 'root', + password: 'docker', +}); + +connection.connect(function (err: unknown) { + if (err) { + return; + } +}); + +const transaction = Sentry.startTransaction({ + op: 'transaction', + name: 'Test Transaction', +}); + +Sentry.configureScope(scope => { + scope.setSpan(transaction); +}); + +connection.query('SELECT 1 + 1 AS solution', function () { + connection.query('SELECT NOW()', ['1', '2'], () => { + if (transaction) transaction.finish(); + connection.end(); + }); +}); diff --git a/packages/node-integration-tests/suites/tracing-new/auto-instrument/mysql/test.ts b/packages/node-integration-tests/suites/tracing-new/auto-instrument/mysql/test.ts new file mode 100644 index 000000000000..3b96f2cafec0 --- /dev/null +++ b/packages/node-integration-tests/suites/tracing-new/auto-instrument/mysql/test.ts @@ -0,0 +1,23 @@ +import { assertSentryTransaction, TestEnv } from '../../../../utils'; + +test('should auto-instrument `mysql` package.', async () => { + const env = await TestEnv.init(__dirname); + const envelope = await env.getEnvelopeRequest({ envelopeType: 'transaction' }); + + expect(envelope).toHaveLength(3); + + assertSentryTransaction(envelope[2], { + transaction: 'Test Transaction', + spans: [ + { + description: 'SELECT 1 + 1 AS solution', + op: 'db', + }, + + { + description: 'SELECT NOW()', + op: 'db', + }, + ], + }); +}); diff --git a/packages/node-integration-tests/suites/tracing-new/auto-instrument/pg/scenario.ts b/packages/node-integration-tests/suites/tracing-new/auto-instrument/pg/scenario.ts new file mode 100644 index 000000000000..a7859fd562a3 --- /dev/null +++ b/packages/node-integration-tests/suites/tracing-new/auto-instrument/pg/scenario.ts @@ -0,0 +1,25 @@ +import * as Sentry from '@sentry/node'; +import pg from 'pg'; + +Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + release: '1.0', + tracesSampleRate: 1.0, + integrations: [...Sentry.autoDiscoverNodePerformanceMonitoringIntegrations()], +}); + +const transaction = Sentry.startTransaction({ + op: 'transaction', + name: 'Test Transaction', +}); + +Sentry.configureScope(scope => { + scope.setSpan(transaction); +}); + +const client = new pg.Client(); +client.query('SELECT * FROM foo where bar ilike "baz%"', ['a', 'b'], () => + client.query('SELECT * FROM bazz', () => { + client.query('SELECT NOW()', () => transaction.finish()); + }), +); diff --git a/packages/node-integration-tests/suites/tracing-new/auto-instrument/pg/test.ts b/packages/node-integration-tests/suites/tracing-new/auto-instrument/pg/test.ts new file mode 100644 index 000000000000..edfa67cee9d7 --- /dev/null +++ b/packages/node-integration-tests/suites/tracing-new/auto-instrument/pg/test.ts @@ -0,0 +1,54 @@ +import { assertSentryTransaction, TestEnv } from '../../../../utils'; + +class PgClient { + // https://node-postgres.com/api/client#clientquery + public query(_text: unknown, values: unknown, callback?: () => void) { + if (typeof callback === 'function') { + callback(); + return; + } + + if (typeof values === 'function') { + values(); + return; + } + + return Promise.resolve(); + } +} + +beforeAll(() => { + jest.mock('pg', () => { + return { + Client: PgClient, + native: { + Client: PgClient, + }, + }; + }); +}); + +test('should auto-instrument `pg` package.', async () => { + const env = await TestEnv.init(__dirname); + const envelope = await env.getEnvelopeRequest({ envelopeType: 'transaction' }); + + expect(envelope).toHaveLength(3); + + assertSentryTransaction(envelope[2], { + transaction: 'Test Transaction', + spans: [ + { + description: 'SELECT * FROM foo where bar ilike "baz%"', + op: 'db', + }, + { + description: 'SELECT * FROM bazz', + op: 'db', + }, + { + description: 'SELECT NOW()', + op: 'db', + }, + ], + }); +}); diff --git a/packages/node-integration-tests/suites/tracing-new/prisma-orm/docker-compose.yml b/packages/node-integration-tests/suites/tracing-new/prisma-orm/docker-compose.yml new file mode 100644 index 000000000000..45caa4bb3179 --- /dev/null +++ b/packages/node-integration-tests/suites/tracing-new/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-new/prisma-orm/package.json b/packages/node-integration-tests/suites/tracing-new/prisma-orm/package.json new file mode 100644 index 000000000000..f8b24d7d0465 --- /dev/null +++ b/packages/node-integration-tests/suites/tracing-new/prisma-orm/package.json @@ -0,0 +1,22 @@ +{ + "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-new/prisma-orm/prisma/migrations/migration_lock.toml b/packages/node-integration-tests/suites/tracing-new/prisma-orm/prisma/migrations/migration_lock.toml new file mode 100644 index 000000000000..fbffa92c2bb7 --- /dev/null +++ b/packages/node-integration-tests/suites/tracing-new/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-new/prisma-orm/prisma/migrations/sentry_test/migration.sql b/packages/node-integration-tests/suites/tracing-new/prisma-orm/prisma/migrations/sentry_test/migration.sql new file mode 100644 index 000000000000..8619aaceb2b0 --- /dev/null +++ b/packages/node-integration-tests/suites/tracing-new/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-new/prisma-orm/prisma/schema.prisma b/packages/node-integration-tests/suites/tracing-new/prisma-orm/prisma/schema.prisma new file mode 100644 index 000000000000..4363c97738ee --- /dev/null +++ b/packages/node-integration-tests/suites/tracing-new/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-new/prisma-orm/scenario.ts b/packages/node-integration-tests/suites/tracing-new/prisma-orm/scenario.ts new file mode 100644 index 000000000000..047166a9e136 --- /dev/null +++ b/packages/node-integration-tests/suites/tracing-new/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-new/prisma-orm/setup.ts b/packages/node-integration-tests/suites/tracing-new/prisma-orm/setup.ts new file mode 100755 index 000000000000..3c40d12f7337 --- /dev/null +++ b/packages/node-integration-tests/suites/tracing-new/prisma-orm/setup.ts @@ -0,0 +1,16 @@ +import { parseSemver } from '@sentry/utils'; +import { execSync } from 'child_process'; + +const NODE_VERSION = parseSemver(process.versions.node); + +if (NODE_VERSION.major && NODE_VERSION.major < 12) { + // eslint-disable-next-line no-console + console.warn(`Skipping Prisma tests on Node: ${NODE_VERSION.major}`); + process.exit(0); +} + +try { + execSync('yarn && yarn setup'); +} catch (_) { + process.exit(1); +} diff --git a/packages/node-integration-tests/suites/tracing-new/prisma-orm/test.ts b/packages/node-integration-tests/suites/tracing-new/prisma-orm/test.ts new file mode 100644 index 000000000000..e3393f5fe2f8 --- /dev/null +++ b/packages/node-integration-tests/suites/tracing-new/prisma-orm/test.ts @@ -0,0 +1,17 @@ +import { assertSentryTransaction, conditionalTest, TestEnv } from '../../../utils'; + +conditionalTest({ min: 12 })('Prisma ORM Integration', () => { + test('should instrument Prisma client for tracing.', async () => { + const env = await TestEnv.init(__dirname); + const envelope = await env.getEnvelopeRequest({ envelopeType: 'transaction' }); + + assertSentryTransaction(envelope[2], { + transaction: 'Test Transaction', + spans: [ + { description: 'User create', op: 'db.sql.prisma' }, + { description: 'User findMany', op: 'db.sql.prisma' }, + { description: 'User deleteMany', op: 'db.sql.prisma' }, + ], + }); + }); +}); diff --git a/packages/node-integration-tests/suites/tracing-new/prisma-orm/yarn.lock b/packages/node-integration-tests/suites/tracing-new/prisma-orm/yarn.lock new file mode 100644 index 000000000000..d228adebd621 --- /dev/null +++ b/packages/node-integration-tests/suites/tracing-new/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/packages/node-integration-tests/suites/tracing-new/tracePropagationTargets/scenario.ts b/packages/node-integration-tests/suites/tracing-new/tracePropagationTargets/scenario.ts new file mode 100644 index 000000000000..a4d5e84484a5 --- /dev/null +++ b/packages/node-integration-tests/suites/tracing-new/tracePropagationTargets/scenario.ts @@ -0,0 +1,26 @@ +// eslint-disable-next-line @typescript-eslint/no-unused-vars +import '@sentry/tracing'; + +import * as Sentry from '@sentry/node'; +import * as http from 'http'; + +Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + release: '1.0', + tracesSampleRate: 1.0, + tracePropagationTargets: [/\/v0/, 'v1'], + integrations: [new Sentry.Integrations.Http({ tracing: true })], +}); + +const transaction = Sentry.startTransaction({ name: 'test_transaction' }); + +Sentry.configureScope(scope => { + scope.setSpan(transaction); +}); + +http.get('http://match-this-url.com/api/v0'); +http.get('http://match-this-url.com/api/v1'); +http.get('http://dont-match-this-url.com/api/v2'); +http.get('http://dont-match-this-url.com/api/v3'); + +transaction.finish(); diff --git a/packages/node-integration-tests/suites/tracing-new/tracePropagationTargets/test.ts b/packages/node-integration-tests/suites/tracing-new/tracePropagationTargets/test.ts new file mode 100644 index 000000000000..1209c59da46a --- /dev/null +++ b/packages/node-integration-tests/suites/tracing-new/tracePropagationTargets/test.ts @@ -0,0 +1,42 @@ +import nock from 'nock'; + +import { runScenario, TestEnv } from '../../../utils'; + +test('HttpIntegration should instrument correct requests when tracePropagationTargets option is provided', async () => { + const match1 = nock('http://match-this-url.com') + .get('/api/v0') + .matchHeader('baggage', val => typeof val === 'string') + .matchHeader('sentry-trace', val => typeof val === 'string') + .reply(200); + + const match2 = nock('http://match-this-url.com') + .get('/api/v1') + .matchHeader('baggage', val => typeof val === 'string') + .matchHeader('sentry-trace', val => typeof val === 'string') + .reply(200); + + const match3 = nock('http://dont-match-this-url.com') + .get('/api/v2') + .matchHeader('baggage', val => val === undefined) + .matchHeader('sentry-trace', val => val === undefined) + .reply(200); + + const match4 = nock('http://dont-match-this-url.com') + .get('/api/v3') + .matchHeader('baggage', val => val === undefined) + .matchHeader('sentry-trace', val => val === undefined) + .reply(200); + + const env = await TestEnv.init(__dirname); + await runScenario(env.url); + + env.server.close(); + nock.cleanAll(); + + await new Promise(resolve => env.server.close(resolve)); + + expect(match1.isDone()).toBe(true); + expect(match2.isDone()).toBe(true); + expect(match3.isDone()).toBe(true); + expect(match4.isDone()).toBe(true); +}); diff --git a/packages/node/package.json b/packages/node/package.json index 832387bda88c..bcf1d4465f44 100644 --- a/packages/node/package.json +++ b/packages/node/package.json @@ -19,6 +19,7 @@ "@sentry/core": "7.43.0", "@sentry/types": "7.43.0", "@sentry/utils": "7.43.0", + "@sentry-internal/tracing": "7.43.0", "cookie": "^0.4.1", "https-proxy-agent": "^5.0.0", "lru_map": "^0.3.3", diff --git a/packages/node/src/index.ts b/packages/node/src/index.ts index 92d3cfcf835f..1d72ada97ad2 100644 --- a/packages/node/src/index.ts +++ b/packages/node/src/index.ts @@ -45,6 +45,7 @@ export { setUser, withScope, } from '@sentry/core'; +export * from './tracing'; export { NodeClient } from './client'; export { makeNodeTransport } from './transports'; diff --git a/packages/node/src/tracing.ts b/packages/node/src/tracing.ts new file mode 100644 index 000000000000..6d1c7e14a8ef --- /dev/null +++ b/packages/node/src/tracing.ts @@ -0,0 +1,36 @@ +export { + Apollo, + Express, + GraphQL, + Mongo, + Mysql, + Postgres, + Prisma, + lazyLoadedNodePerformanceMonitoringIntegrations, +} from '@sentry-internal/tracing'; +export { addTracingExtensions } from '@sentry/core'; + +import { lazyLoadedNodePerformanceMonitoringIntegrations } from '@sentry-internal/tracing'; +import type { Integration } from '@sentry/types'; +import { logger } from '@sentry/utils'; + +/** + * Automatically detects and returns integrations that will work with your dependencies. + */ +export function autoDiscoverNodePerformanceMonitoringIntegrations(): Integration[] { + const loadedIntegrations = lazyLoadedNodePerformanceMonitoringIntegrations + .map(tryLoad => { + try { + return tryLoad(); + } catch (_) { + return undefined; + } + }) + .filter(integration => !!integration) as Integration[]; + + if (loadedIntegrations.length === 0) { + logger.warn('Performance monitoring integrations could not be automatically loaded.'); + } + + return loadedIntegrations; +} diff --git a/packages/tracing-internal/src/index.ts b/packages/tracing-internal/src/index.ts index c735942fbe19..d78af2931f8b 100644 --- a/packages/tracing-internal/src/index.ts +++ b/packages/tracing-internal/src/index.ts @@ -1,6 +1,15 @@ export * from './exports'; -export { Apollo, Express, GraphQL, Mongo, Mysql, Postgres, Prisma } from './node/integrations'; +export { + Apollo, + Express, + GraphQL, + Mongo, + Mysql, + Postgres, + Prisma, + lazyLoadedNodePerformanceMonitoringIntegrations, +} from './node'; export { BrowserTracing, @@ -12,3 +21,5 @@ export { export type { RequestInstrumentationOptions } from './browser'; export { addExtensionMethods } from './extensions'; + +export { registerErrorInstrumentation } from './errors'; diff --git a/packages/tracing-internal/src/node/integrations/apollo.ts b/packages/tracing-internal/src/node/integrations/apollo.ts index 3a076444af5e..a575aa5dd3b0 100644 --- a/packages/tracing-internal/src/node/integrations/apollo.ts +++ b/packages/tracing-internal/src/node/integrations/apollo.ts @@ -1,4 +1,5 @@ import type { Hub } from '@sentry/core'; +import { addTracingExtensions } from '@sentry/core'; import type { EventProcessor, Integration } from '@sentry/types'; import { arrayify, fill, isThenable, loadModule, logger } from '@sentry/utils'; @@ -39,6 +40,7 @@ export class Apollo implements Integration { }, ) { this._useNest = !!options.useNestjs; + addTracingExtensions(); } /** diff --git a/packages/tracing-internal/src/node/integrations/express.ts b/packages/tracing-internal/src/node/integrations/express.ts index 8b3bcb52fcf4..686b33f8dfaa 100644 --- a/packages/tracing-internal/src/node/integrations/express.ts +++ b/packages/tracing-internal/src/node/integrations/express.ts @@ -1,4 +1,5 @@ /* eslint-disable max-lines */ +import { addTracingExtensions } from '@sentry/core'; import type { Hub, Integration, PolymorphicRequest, Transaction } from '@sentry/types'; import { extractPathForTransaction, getNumberOfUrlSegments, isRegExp, logger } from '@sentry/utils'; @@ -102,6 +103,7 @@ export class Express implements Integration { public constructor(options: { app?: Router; router?: Router; methods?: Method[] } = {}) { this._router = options.router || options.app; this._methods = (Array.isArray(options.methods) ? options.methods : []).concat('use'); + addTracingExtensions(); } /** diff --git a/packages/tracing-internal/src/node/integrations/graphql.ts b/packages/tracing-internal/src/node/integrations/graphql.ts index 12f04b7c1e57..a6caeb9d51bb 100644 --- a/packages/tracing-internal/src/node/integrations/graphql.ts +++ b/packages/tracing-internal/src/node/integrations/graphql.ts @@ -1,4 +1,5 @@ import type { Hub } from '@sentry/core'; +import { addTracingExtensions } from '@sentry/core'; import type { EventProcessor, Integration } from '@sentry/types'; import { fill, isThenable, loadModule, logger } from '@sentry/utils'; @@ -16,6 +17,10 @@ export class GraphQL implements Integration { */ public name: string = GraphQL.id; + public constructor() { + addTracingExtensions(); + } + /** * @inheritDoc */ diff --git a/packages/tracing-internal/src/node/integrations/index.ts b/packages/tracing-internal/src/node/integrations/index.ts index 607a3e129984..0b69f4440f3a 100644 --- a/packages/tracing-internal/src/node/integrations/index.ts +++ b/packages/tracing-internal/src/node/integrations/index.ts @@ -5,3 +5,4 @@ export { Mongo } from './mongo'; export { Prisma } from './prisma'; export { GraphQL } from './graphql'; export { Apollo } from './apollo'; +export * from './lazy'; diff --git a/packages/tracing-internal/src/node/integrations/lazy.ts b/packages/tracing-internal/src/node/integrations/lazy.ts new file mode 100644 index 000000000000..f53ff756cd48 --- /dev/null +++ b/packages/tracing-internal/src/node/integrations/lazy.ts @@ -0,0 +1,47 @@ +import type { Integration, IntegrationClass } from '@sentry/types'; +import { dynamicRequire } from '@sentry/utils'; + +export const lazyLoadedNodePerformanceMonitoringIntegrations: (() => Integration)[] = [ + () => { + const integration = dynamicRequire(module, './apollo') as { + Apollo: IntegrationClass; + }; + return new integration.Apollo(); + }, + () => { + const integration = dynamicRequire(module, './apollo') as { + Apollo: IntegrationClass; + }; + return new integration.Apollo({ useNestjs: true }); + }, + () => { + const integration = dynamicRequire(module, './graphql') as { + GraphQL: IntegrationClass; + }; + return new integration.GraphQL(); + }, + () => { + const integration = dynamicRequire(module, './mongo') as { + Mongo: IntegrationClass; + }; + return new integration.Mongo(); + }, + () => { + const integration = dynamicRequire(module, './mongo') as { + Mongo: IntegrationClass; + }; + return new integration.Mongo({ mongoose: true }); + }, + () => { + const integration = dynamicRequire(module, './mysql') as { + Mysql: IntegrationClass; + }; + return new integration.Mysql(); + }, + () => { + const integration = dynamicRequire(module, './postgres') as { + Postgres: IntegrationClass; + }; + return new integration.Postgres(); + }, +]; diff --git a/packages/tracing-internal/src/node/integrations/mongo.ts b/packages/tracing-internal/src/node/integrations/mongo.ts index 37335358c82e..a72278be4d26 100644 --- a/packages/tracing-internal/src/node/integrations/mongo.ts +++ b/packages/tracing-internal/src/node/integrations/mongo.ts @@ -1,4 +1,5 @@ import type { Hub } from '@sentry/core'; +import { addTracingExtensions } from '@sentry/core'; import type { EventProcessor, Integration, SpanContext } from '@sentry/types'; import { fill, isThenable, loadModule, logger } from '@sentry/utils'; @@ -121,6 +122,7 @@ export class Mongo implements Integration { this._operations = Array.isArray(options.operations) ? options.operations : (OPERATIONS as unknown as Operation[]); this._describeOperations = 'describeOperations' in options ? options.describeOperations : true; this._useMongoose = !!options.useMongoose; + addTracingExtensions(); } /** diff --git a/packages/tracing-internal/src/node/integrations/mysql.ts b/packages/tracing-internal/src/node/integrations/mysql.ts index 6e6a80ac59a6..4c77470e378e 100644 --- a/packages/tracing-internal/src/node/integrations/mysql.ts +++ b/packages/tracing-internal/src/node/integrations/mysql.ts @@ -1,4 +1,5 @@ import type { Hub } from '@sentry/core'; +import { addTracingExtensions } from '@sentry/core'; import type { EventProcessor, Integration } from '@sentry/types'; import { fill, loadModule, logger } from '@sentry/utils'; @@ -20,6 +21,10 @@ export class Mysql implements Integration { */ public name: string = Mysql.id; + public constructor() { + addTracingExtensions(); + } + /** * @inheritDoc */ diff --git a/packages/tracing-internal/src/node/integrations/postgres.ts b/packages/tracing-internal/src/node/integrations/postgres.ts index 41ad31b20660..a2a0eea6764c 100644 --- a/packages/tracing-internal/src/node/integrations/postgres.ts +++ b/packages/tracing-internal/src/node/integrations/postgres.ts @@ -1,4 +1,5 @@ import type { Hub } from '@sentry/core'; +import { addTracingExtensions } from '@sentry/core'; import type { EventProcessor, Integration } from '@sentry/types'; import { fill, isThenable, loadModule, logger } from '@sentry/utils'; @@ -30,6 +31,7 @@ export class Postgres implements Integration { public constructor(options: PgOptions = {}) { this._usePgNative = !!options.usePgNative; + addTracingExtensions(); } /** diff --git a/packages/tracing-internal/src/node/integrations/prisma.ts b/packages/tracing-internal/src/node/integrations/prisma.ts index 2215cf2a817a..66c378eef13f 100644 --- a/packages/tracing-internal/src/node/integrations/prisma.ts +++ b/packages/tracing-internal/src/node/integrations/prisma.ts @@ -1,4 +1,5 @@ import type { Hub } from '@sentry/core'; +import { addTracingExtensions } from '@sentry/core'; import type { EventProcessor, Integration } from '@sentry/types'; import { isThenable, logger } from '@sentry/utils'; @@ -71,6 +72,7 @@ export class Prisma implements Integration { `Unsupported Prisma client provided to PrismaIntegration. Provided client: ${JSON.stringify(options.client)}`, ); } + addTracingExtensions(); } /** From a056ddd93c2c38adbb96e59ad240cc4f9302ded0 Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Fri, 17 Mar 2023 11:03:43 +0000 Subject: [PATCH 2/8] Use new API in tracing-new tests --- .../suites/tracing-new/apollo-graphql/scenario.ts | 3 +-- .../suites/tracing-new/prisma-orm/scenario.ts | 3 +-- .../suites/tracing-new/tracePropagationTargets/scenario.ts | 4 ++-- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/node-integration-tests/suites/tracing-new/apollo-graphql/scenario.ts b/packages/node-integration-tests/suites/tracing-new/apollo-graphql/scenario.ts index cea4a03df10e..c416fc32845d 100644 --- a/packages/node-integration-tests/suites/tracing-new/apollo-graphql/scenario.ts +++ b/packages/node-integration-tests/suites/tracing-new/apollo-graphql/scenario.ts @@ -1,12 +1,11 @@ import * as Sentry from '@sentry/node'; -import * as Tracing from '@sentry/tracing'; import { ApolloServer, gql } from 'apollo-server'; Sentry.init({ dsn: 'https://public@dsn.ingest.sentry.io/1337', release: '1.0', tracesSampleRate: 1.0, - integrations: [new Tracing.Integrations.GraphQL(), new Tracing.Integrations.Apollo()], + integrations: [new Sentry.GraphQL(), new Sentry.Apollo()], }); const typeDefs = gql` diff --git a/packages/node-integration-tests/suites/tracing-new/prisma-orm/scenario.ts b/packages/node-integration-tests/suites/tracing-new/prisma-orm/scenario.ts index 047166a9e136..4b07493953a9 100644 --- a/packages/node-integration-tests/suites/tracing-new/prisma-orm/scenario.ts +++ b/packages/node-integration-tests/suites/tracing-new/prisma-orm/scenario.ts @@ -1,7 +1,6 @@ /* 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(); @@ -10,7 +9,7 @@ Sentry.init({ dsn: 'https://public@dsn.ingest.sentry.io/1337', release: '1.0', tracesSampleRate: 1.0, - integrations: [new Tracing.Integrations.Prisma({ client })], + integrations: [new Sentry.Prisma({ client })], }); async function run(): Promise { diff --git a/packages/node-integration-tests/suites/tracing-new/tracePropagationTargets/scenario.ts b/packages/node-integration-tests/suites/tracing-new/tracePropagationTargets/scenario.ts index a4d5e84484a5..a6197e5ab743 100644 --- a/packages/node-integration-tests/suites/tracing-new/tracePropagationTargets/scenario.ts +++ b/packages/node-integration-tests/suites/tracing-new/tracePropagationTargets/scenario.ts @@ -1,9 +1,9 @@ // eslint-disable-next-line @typescript-eslint/no-unused-vars -import '@sentry/tracing'; - import * as Sentry from '@sentry/node'; import * as http from 'http'; +Sentry.addTracingExtensions(); + Sentry.init({ dsn: 'https://public@dsn.ingest.sentry.io/1337', release: '1.0', From ffff5d91045976c3c2972289622f658d1f11b696 Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Fri, 17 Mar 2023 12:23:27 +0000 Subject: [PATCH 3/8] couple of fixes --- packages/node/src/tracing.ts | 11 +---------- packages/tracing-internal/src/index.ts | 2 -- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/packages/node/src/tracing.ts b/packages/node/src/tracing.ts index 6d1c7e14a8ef..f9a6ba880b0e 100644 --- a/packages/node/src/tracing.ts +++ b/packages/node/src/tracing.ts @@ -1,13 +1,4 @@ -export { - Apollo, - Express, - GraphQL, - Mongo, - Mysql, - Postgres, - Prisma, - lazyLoadedNodePerformanceMonitoringIntegrations, -} from '@sentry-internal/tracing'; +export { Apollo, Express, GraphQL, Mongo, Mysql, Postgres, Prisma } from '@sentry-internal/tracing'; export { addTracingExtensions } from '@sentry/core'; import { lazyLoadedNodePerformanceMonitoringIntegrations } from '@sentry-internal/tracing'; diff --git a/packages/tracing-internal/src/index.ts b/packages/tracing-internal/src/index.ts index d78af2931f8b..c4e17c25294f 100644 --- a/packages/tracing-internal/src/index.ts +++ b/packages/tracing-internal/src/index.ts @@ -21,5 +21,3 @@ export { export type { RequestInstrumentationOptions } from './browser'; export { addExtensionMethods } from './extensions'; - -export { registerErrorInstrumentation } from './errors'; From e8c976cafd499bac8559e1dbd3f56177347ea946 Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Mon, 20 Mar 2023 10:39:00 +0000 Subject: [PATCH 4/8] Always enable tracing for Node client --- packages/nextjs/src/index.types.ts | 2 -- packages/node/src/client.ts | 5 ++++- packages/tracing-internal/src/node/integrations/apollo.ts | 2 -- packages/tracing-internal/src/node/integrations/express.ts | 2 -- packages/tracing-internal/src/node/integrations/graphql.ts | 5 ----- packages/tracing-internal/src/node/integrations/mongo.ts | 2 -- packages/tracing-internal/src/node/integrations/mysql.ts | 4 ---- packages/tracing-internal/src/node/integrations/postgres.ts | 2 -- packages/tracing-internal/src/node/integrations/prisma.ts | 2 -- 9 files changed, 4 insertions(+), 22 deletions(-) diff --git a/packages/nextjs/src/index.types.ts b/packages/nextjs/src/index.types.ts index 3a7390c42da5..b0cd45e43084 100644 --- a/packages/nextjs/src/index.types.ts +++ b/packages/nextjs/src/index.types.ts @@ -36,8 +36,6 @@ export declare const ErrorBoundary: typeof clientSdk.ErrorBoundary; export declare const showReportDialog: typeof clientSdk.showReportDialog; export declare const withErrorBoundary: typeof clientSdk.withErrorBoundary; -export declare function addTracingExtensions(): void; - export declare const Span: typeof edgeSdk.Span; /** diff --git a/packages/node/src/client.ts b/packages/node/src/client.ts index 0b3a925d775e..d0d0ae7424be 100644 --- a/packages/node/src/client.ts +++ b/packages/node/src/client.ts @@ -1,5 +1,5 @@ import type { Scope } from '@sentry/core'; -import { BaseClient, SDK_VERSION, SessionFlusher } from '@sentry/core'; +import { addTracingExtensions, BaseClient, SDK_VERSION, SessionFlusher } from '@sentry/core'; import type { Event, EventHint, Severity, SeverityLevel } from '@sentry/types'; import { logger, resolvedSyncPromise } from '@sentry/utils'; import * as os from 'os'; @@ -40,6 +40,9 @@ export class NodeClient extends BaseClient { ...options.transportOptions, }; + // The Node client always supports tracing + addTracingExtensions(); + super(options); } diff --git a/packages/tracing-internal/src/node/integrations/apollo.ts b/packages/tracing-internal/src/node/integrations/apollo.ts index a575aa5dd3b0..3a076444af5e 100644 --- a/packages/tracing-internal/src/node/integrations/apollo.ts +++ b/packages/tracing-internal/src/node/integrations/apollo.ts @@ -1,5 +1,4 @@ import type { Hub } from '@sentry/core'; -import { addTracingExtensions } from '@sentry/core'; import type { EventProcessor, Integration } from '@sentry/types'; import { arrayify, fill, isThenable, loadModule, logger } from '@sentry/utils'; @@ -40,7 +39,6 @@ export class Apollo implements Integration { }, ) { this._useNest = !!options.useNestjs; - addTracingExtensions(); } /** diff --git a/packages/tracing-internal/src/node/integrations/express.ts b/packages/tracing-internal/src/node/integrations/express.ts index 686b33f8dfaa..8b3bcb52fcf4 100644 --- a/packages/tracing-internal/src/node/integrations/express.ts +++ b/packages/tracing-internal/src/node/integrations/express.ts @@ -1,5 +1,4 @@ /* eslint-disable max-lines */ -import { addTracingExtensions } from '@sentry/core'; import type { Hub, Integration, PolymorphicRequest, Transaction } from '@sentry/types'; import { extractPathForTransaction, getNumberOfUrlSegments, isRegExp, logger } from '@sentry/utils'; @@ -103,7 +102,6 @@ export class Express implements Integration { public constructor(options: { app?: Router; router?: Router; methods?: Method[] } = {}) { this._router = options.router || options.app; this._methods = (Array.isArray(options.methods) ? options.methods : []).concat('use'); - addTracingExtensions(); } /** diff --git a/packages/tracing-internal/src/node/integrations/graphql.ts b/packages/tracing-internal/src/node/integrations/graphql.ts index a6caeb9d51bb..12f04b7c1e57 100644 --- a/packages/tracing-internal/src/node/integrations/graphql.ts +++ b/packages/tracing-internal/src/node/integrations/graphql.ts @@ -1,5 +1,4 @@ import type { Hub } from '@sentry/core'; -import { addTracingExtensions } from '@sentry/core'; import type { EventProcessor, Integration } from '@sentry/types'; import { fill, isThenable, loadModule, logger } from '@sentry/utils'; @@ -17,10 +16,6 @@ export class GraphQL implements Integration { */ public name: string = GraphQL.id; - public constructor() { - addTracingExtensions(); - } - /** * @inheritDoc */ diff --git a/packages/tracing-internal/src/node/integrations/mongo.ts b/packages/tracing-internal/src/node/integrations/mongo.ts index a72278be4d26..37335358c82e 100644 --- a/packages/tracing-internal/src/node/integrations/mongo.ts +++ b/packages/tracing-internal/src/node/integrations/mongo.ts @@ -1,5 +1,4 @@ import type { Hub } from '@sentry/core'; -import { addTracingExtensions } from '@sentry/core'; import type { EventProcessor, Integration, SpanContext } from '@sentry/types'; import { fill, isThenable, loadModule, logger } from '@sentry/utils'; @@ -122,7 +121,6 @@ export class Mongo implements Integration { this._operations = Array.isArray(options.operations) ? options.operations : (OPERATIONS as unknown as Operation[]); this._describeOperations = 'describeOperations' in options ? options.describeOperations : true; this._useMongoose = !!options.useMongoose; - addTracingExtensions(); } /** diff --git a/packages/tracing-internal/src/node/integrations/mysql.ts b/packages/tracing-internal/src/node/integrations/mysql.ts index 4c77470e378e..7a7b4022688d 100644 --- a/packages/tracing-internal/src/node/integrations/mysql.ts +++ b/packages/tracing-internal/src/node/integrations/mysql.ts @@ -21,10 +21,6 @@ export class Mysql implements Integration { */ public name: string = Mysql.id; - public constructor() { - addTracingExtensions(); - } - /** * @inheritDoc */ diff --git a/packages/tracing-internal/src/node/integrations/postgres.ts b/packages/tracing-internal/src/node/integrations/postgres.ts index a2a0eea6764c..41ad31b20660 100644 --- a/packages/tracing-internal/src/node/integrations/postgres.ts +++ b/packages/tracing-internal/src/node/integrations/postgres.ts @@ -1,5 +1,4 @@ import type { Hub } from '@sentry/core'; -import { addTracingExtensions } from '@sentry/core'; import type { EventProcessor, Integration } from '@sentry/types'; import { fill, isThenable, loadModule, logger } from '@sentry/utils'; @@ -31,7 +30,6 @@ export class Postgres implements Integration { public constructor(options: PgOptions = {}) { this._usePgNative = !!options.usePgNative; - addTracingExtensions(); } /** diff --git a/packages/tracing-internal/src/node/integrations/prisma.ts b/packages/tracing-internal/src/node/integrations/prisma.ts index 66c378eef13f..2215cf2a817a 100644 --- a/packages/tracing-internal/src/node/integrations/prisma.ts +++ b/packages/tracing-internal/src/node/integrations/prisma.ts @@ -1,5 +1,4 @@ import type { Hub } from '@sentry/core'; -import { addTracingExtensions } from '@sentry/core'; import type { EventProcessor, Integration } from '@sentry/types'; import { isThenable, logger } from '@sentry/utils'; @@ -72,7 +71,6 @@ export class Prisma implements Integration { `Unsupported Prisma client provided to PrismaIntegration. Provided client: ${JSON.stringify(options.client)}`, ); } - addTracingExtensions(); } /** From d5bbfd4a60fc39f9f2a8beadcf25aca8b1c8a25e Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Mon, 20 Mar 2023 10:43:47 +0000 Subject: [PATCH 5/8] lint --- packages/tracing-internal/src/node/integrations/mysql.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/tracing-internal/src/node/integrations/mysql.ts b/packages/tracing-internal/src/node/integrations/mysql.ts index 7a7b4022688d..6e6a80ac59a6 100644 --- a/packages/tracing-internal/src/node/integrations/mysql.ts +++ b/packages/tracing-internal/src/node/integrations/mysql.ts @@ -1,5 +1,4 @@ import type { Hub } from '@sentry/core'; -import { addTracingExtensions } from '@sentry/core'; import type { EventProcessor, Integration } from '@sentry/types'; import { fill, loadModule, logger } from '@sentry/utils'; From 3a60e3d14aae3288a73c8130ef2b44fae3641dcc Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Mon, 20 Mar 2023 10:45:28 +0000 Subject: [PATCH 6/8] no need to export addTracingExtensions from node package --- packages/node/src/tracing.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/node/src/tracing.ts b/packages/node/src/tracing.ts index f9a6ba880b0e..ed2dd78d7737 100644 --- a/packages/node/src/tracing.ts +++ b/packages/node/src/tracing.ts @@ -1,5 +1,4 @@ export { Apollo, Express, GraphQL, Mongo, Mysql, Postgres, Prisma } from '@sentry-internal/tracing'; -export { addTracingExtensions } from '@sentry/core'; import { lazyLoadedNodePerformanceMonitoringIntegrations } from '@sentry-internal/tracing'; import type { Integration } from '@sentry/types'; From 80fce83017f2d2203fa8dab05f286934c42ca9ef Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Mon, 20 Mar 2023 11:22:39 +0000 Subject: [PATCH 7/8] Fix prisma test --- packages/node-integration-tests/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/node-integration-tests/package.json b/packages/node-integration-tests/package.json index 586326ea26d0..7f19ec2e91d5 100644 --- a/packages/node-integration-tests/package.json +++ b/packages/node-integration-tests/package.json @@ -9,6 +9,7 @@ "scripts": { "clean": "rimraf -g **/node_modules", "prisma:init": "(cd suites/tracing/prisma-orm && ts-node ./setup.ts)", + "prisma:init:new": "(cd suites/tracing-new/prisma-orm && ts-node ./setup.ts)", "lint": "run-s lint:prettier lint:eslint", "lint:eslint": "eslint . --format stylish", "lint:prettier": "prettier --check \"{suites,utils}/**/*.ts\"", @@ -16,7 +17,7 @@ "fix:eslint": "eslint . --format stylish --fix", "fix:prettier": "prettier --write \"{suites,utils}/**/*.ts\"", "type-check": "tsc", - "pretest": "run-s --silent prisma:init", + "pretest": "run-s --silent prisma:init prisma:init:new", "test": "ts-node ./utils/run-tests.ts", "test:watch": "yarn test --watch" }, From c474b9633f7c9333c80150db5ebf02b480f32e0a Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Tue, 21 Mar 2023 17:43:41 +0000 Subject: [PATCH 8/8] Move tracing integrations to Sentry.Integrations --- .../node-integration-tests/suites/express/tracing/server.ts | 2 +- .../suites/tracing-new/apollo-graphql/scenario.ts | 2 +- .../suites/tracing-new/prisma-orm/scenario.ts | 2 +- packages/node/src/index.ts | 4 +++- packages/node/src/{tracing.ts => tracing/index.ts} | 2 -- packages/node/src/tracing/integrations.ts | 1 + 6 files changed, 7 insertions(+), 6 deletions(-) rename packages/node/src/{tracing.ts => tracing/index.ts} (88%) create mode 100644 packages/node/src/tracing/integrations.ts diff --git a/packages/node-integration-tests/suites/express/tracing/server.ts b/packages/node-integration-tests/suites/express/tracing/server.ts index 3639b6bf6cc7..e857621ad22e 100644 --- a/packages/node-integration-tests/suites/express/tracing/server.ts +++ b/packages/node-integration-tests/suites/express/tracing/server.ts @@ -7,7 +7,7 @@ const app = express(); Sentry.init({ dsn: 'https://public@dsn.ingest.sentry.io/1337', release: '1.0', - integrations: [new Sentry.Integrations.Http({ tracing: true }), new Sentry.Express({ app })], + integrations: [new Sentry.Integrations.Http({ tracing: true }), new Sentry.Integrations.Express({ app })], tracesSampleRate: 1.0, }); diff --git a/packages/node-integration-tests/suites/tracing-new/apollo-graphql/scenario.ts b/packages/node-integration-tests/suites/tracing-new/apollo-graphql/scenario.ts index c416fc32845d..5bd8aa815cbe 100644 --- a/packages/node-integration-tests/suites/tracing-new/apollo-graphql/scenario.ts +++ b/packages/node-integration-tests/suites/tracing-new/apollo-graphql/scenario.ts @@ -5,7 +5,7 @@ Sentry.init({ dsn: 'https://public@dsn.ingest.sentry.io/1337', release: '1.0', tracesSampleRate: 1.0, - integrations: [new Sentry.GraphQL(), new Sentry.Apollo()], + integrations: [new Sentry.Integrations.GraphQL(), new Sentry.Integrations.Apollo()], }); const typeDefs = gql` diff --git a/packages/node-integration-tests/suites/tracing-new/prisma-orm/scenario.ts b/packages/node-integration-tests/suites/tracing-new/prisma-orm/scenario.ts index 4b07493953a9..0eb40d9c83ee 100644 --- a/packages/node-integration-tests/suites/tracing-new/prisma-orm/scenario.ts +++ b/packages/node-integration-tests/suites/tracing-new/prisma-orm/scenario.ts @@ -9,7 +9,7 @@ Sentry.init({ dsn: 'https://public@dsn.ingest.sentry.io/1337', release: '1.0', tracesSampleRate: 1.0, - integrations: [new Sentry.Prisma({ client })], + integrations: [new Sentry.Integrations.Prisma({ client })], }); async function run(): Promise { diff --git a/packages/node/src/index.ts b/packages/node/src/index.ts index 1d72ada97ad2..07db6be2f07d 100644 --- a/packages/node/src/index.ts +++ b/packages/node/src/index.ts @@ -45,7 +45,7 @@ export { setUser, withScope, } from '@sentry/core'; -export * from './tracing'; +export { autoDiscoverNodePerformanceMonitoringIntegrations } from './tracing'; export { NodeClient } from './client'; export { makeNodeTransport } from './transports'; @@ -58,10 +58,12 @@ import * as domain from 'domain'; import * as Handlers from './handlers'; import * as NodeIntegrations from './integrations'; +import * as TracingIntegrations from './tracing/integrations'; const INTEGRATIONS = { ...CoreIntegrations, ...NodeIntegrations, + ...TracingIntegrations, }; export { INTEGRATIONS as Integrations, Handlers }; diff --git a/packages/node/src/tracing.ts b/packages/node/src/tracing/index.ts similarity index 88% rename from packages/node/src/tracing.ts rename to packages/node/src/tracing/index.ts index ed2dd78d7737..15c4e2889b3f 100644 --- a/packages/node/src/tracing.ts +++ b/packages/node/src/tracing/index.ts @@ -1,5 +1,3 @@ -export { Apollo, Express, GraphQL, Mongo, Mysql, Postgres, Prisma } from '@sentry-internal/tracing'; - import { lazyLoadedNodePerformanceMonitoringIntegrations } from '@sentry-internal/tracing'; import type { Integration } from '@sentry/types'; import { logger } from '@sentry/utils'; diff --git a/packages/node/src/tracing/integrations.ts b/packages/node/src/tracing/integrations.ts new file mode 100644 index 000000000000..a37bf6bfd494 --- /dev/null +++ b/packages/node/src/tracing/integrations.ts @@ -0,0 +1 @@ +export { Apollo, Express, GraphQL, Mongo, Mysql, Postgres, Prisma } from '@sentry-internal/tracing';