Skip to content

Commit 782756b

Browse files
authored
fix(node): Ensure prisma integration creates valid DB spans (#11908)
Closes #11891
1 parent 0904ae9 commit 782756b

File tree

3 files changed

+55
-39
lines changed

3 files changed

+55
-39
lines changed

dev-packages/node-integration-tests/suites/tracing/prisma-orm/scenario.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
const { randomBytes } = require('crypto');
2-
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
3-
const { PrismaClient } = require('@prisma/client');
41
const Sentry = require('@sentry/node');
52
const { loggingTransport } = require('@sentry-internal/node-integration-tests');
63

@@ -12,6 +9,9 @@ Sentry.init({
129
integrations: [Sentry.prismaIntegration()],
1310
});
1411

12+
const { randomBytes } = require('crypto');
13+
const { PrismaClient } = require('@prisma/client');
14+
1515
// Stop the process from exiting before the transaction is sent
1616
setInterval(() => {}, 1000);
1717

@@ -49,5 +49,4 @@ async function run() {
4949
);
5050
}
5151

52-
// eslint-disable-next-line @typescript-eslint/no-floating-promises
5352
run();

dev-packages/node-integration-tests/suites/tracing/prisma-orm/test.ts

Lines changed: 38 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -7,100 +7,104 @@ conditionalTest({ min: 16 })('Prisma ORM Tests', () => {
77
transaction: 'Test Transaction',
88
spans: expect.arrayContaining([
99
expect.objectContaining({
10-
data: expect.objectContaining({
10+
data: {
1111
method: 'create',
1212
model: 'User',
1313
name: 'User.create',
1414
'otel.kind': 'INTERNAL',
15-
'sentry.origin': 'manual',
16-
}),
15+
'sentry.origin': 'auto.db.otel.prisma',
16+
},
1717
description: 'prisma:client:operation',
1818
status: 'ok',
1919
}),
2020
expect.objectContaining({
21-
data: expect.objectContaining({
21+
data: {
2222
'otel.kind': 'INTERNAL',
23-
'sentry.origin': 'manual',
24-
}),
23+
'sentry.origin': 'auto.db.otel.prisma',
24+
},
2525
description: 'prisma:client:serialize',
2626
status: 'ok',
2727
}),
2828
expect.objectContaining({
29-
data: expect.objectContaining({
29+
data: {
3030
'otel.kind': 'INTERNAL',
31-
'sentry.origin': 'manual',
32-
}),
31+
'sentry.origin': 'auto.db.otel.prisma',
32+
},
3333
description: 'prisma:client:connect',
3434
status: 'ok',
3535
}),
3636
expect.objectContaining({
37-
data: expect.objectContaining({
37+
data: {
3838
'otel.kind': 'INTERNAL',
39-
'sentry.origin': 'manual',
40-
}),
39+
'sentry.origin': 'auto.db.otel.prisma',
40+
},
4141
description: 'prisma:engine',
4242
status: 'ok',
4343
}),
4444
expect.objectContaining({
45-
data: expect.objectContaining({
45+
data: {
4646
'db.type': 'postgres',
4747
'otel.kind': 'INTERNAL',
48-
'sentry.origin': 'manual',
49-
}),
48+
'sentry.origin': 'auto.db.otel.prisma',
49+
},
5050
description: 'prisma:engine:connection',
5151
status: 'ok',
5252
}),
5353
expect.objectContaining({
54-
data: expect.objectContaining({
54+
data: {
5555
'db.statement': expect.stringContaining(
5656
'INSERT INTO "public"."User" ("createdAt","email","name") VALUES ($1,$2,$3) RETURNING "public"."User"."id", "public"."User"."createdAt", "public"."User"."email", "public"."User"."name" /* traceparent',
5757
),
5858
'otel.kind': 'INTERNAL',
59-
'sentry.origin': 'manual',
60-
}),
61-
description: 'prisma:engine:db_query',
59+
'sentry.origin': 'auto.db.otel.prisma',
60+
'db.system': 'prisma',
61+
'sentry.op': 'db',
62+
},
63+
description: expect.stringContaining(
64+
'INSERT INTO "public"."User" ("createdAt","email","name") VALUES ($1,$2,$3) RETURNING "public"."User"."id", "public"."User"."createdAt", "public"."User"."email", "public"."User"."name" /* traceparent',
65+
),
6266
status: 'ok',
6367
}),
6468
expect.objectContaining({
65-
data: expect.objectContaining({
69+
data: {
6670
'otel.kind': 'INTERNAL',
67-
'sentry.origin': 'manual',
68-
}),
71+
'sentry.origin': 'auto.db.otel.prisma',
72+
},
6973
description: 'prisma:engine:serialize',
7074
status: 'ok',
7175
}),
7276
expect.objectContaining({
73-
data: expect.objectContaining({
77+
data: {
7478
'otel.kind': 'INTERNAL',
75-
'sentry.origin': 'manual',
76-
}),
79+
'sentry.origin': 'auto.db.otel.prisma',
80+
},
7781
description: 'prisma:engine:response_json_serialization',
7882
status: 'ok',
7983
}),
8084
expect.objectContaining({
81-
data: expect.objectContaining({
85+
data: {
8286
method: 'findMany',
8387
model: 'User',
8488
name: 'User.findMany',
8589
'otel.kind': 'INTERNAL',
86-
'sentry.origin': 'manual',
87-
}),
90+
'sentry.origin': 'auto.db.otel.prisma',
91+
},
8892
description: 'prisma:client:operation',
8993
status: 'ok',
9094
}),
9195
expect.objectContaining({
92-
data: expect.objectContaining({
96+
data: {
9397
'otel.kind': 'INTERNAL',
94-
'sentry.origin': 'manual',
95-
}),
98+
'sentry.origin': 'auto.db.otel.prisma',
99+
},
96100
description: 'prisma:client:serialize',
97101
status: 'ok',
98102
}),
99103
expect.objectContaining({
100-
data: expect.objectContaining({
104+
data: {
101105
'otel.kind': 'INTERNAL',
102-
'sentry.origin': 'manual',
103-
}),
106+
'sentry.origin': 'auto.db.otel.prisma',
107+
},
104108
description: 'prisma:engine',
105109
status: 'ok',
106110
}),

packages/node/src/integrations/tracing/prisma.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// When importing CJS modules into an ESM module, we cannot import the named exports directly.
22
import * as prismaInstrumentation from '@prisma/instrumentation';
3-
import { defineIntegration } from '@sentry/core';
3+
import { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, defineIntegration, spanToJSON } from '@sentry/core';
44
import { addOpenTelemetryInstrumentation } from '@sentry/opentelemetry';
55
import type { IntegrationFn } from '@sentry/types';
66

@@ -13,6 +13,19 @@ const _prismaIntegration = (() => {
1313
new prismaInstrumentation.PrismaInstrumentation({}),
1414
);
1515
},
16+
17+
setup(client) {
18+
client.on('spanStart', span => {
19+
const spanJSON = spanToJSON(span);
20+
if (spanJSON.description?.startsWith('prisma:')) {
21+
span.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, 'auto.db.otel.prisma');
22+
}
23+
24+
if (spanJSON.description === 'prisma:engine:db_query') {
25+
span.setAttribute('db.system', 'prisma');
26+
}
27+
});
28+
},
1629
};
1730
}) satisfies IntegrationFn;
1831

0 commit comments

Comments
 (0)