Skip to content

Prisma

Prisma has an official @opentelemetry/instrumentation-prisma package. Use it directly with autotel.

Terminal window
npm install autotel @prisma/instrumentation @prisma/client
instrumentation.ts
import { init } from 'autotel';
import { PrismaInstrumentation } from '@prisma/instrumentation';
init({
service: 'my-app',
instrumentations: [new PrismaInstrumentation()],
endpoint: process.env.OTLP_ENDPOINT,
});
Terminal window
tsx --import ./instrumentation.ts src/index.ts
import { trace, type TraceContext } from 'autotel';
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
export const createUser = trace(
(ctx) => async (email: string, name?: string) => {
ctx.setAttribute('user.email', email);
const user = await prisma.user.create({
data: { email, name },
});
// PrismaInstrumentation auto-creates child spans for the DB call
return user;
},
);
export const getUserWithPosts = trace((ctx) => async (userId: number) => {
ctx.setAttribute('user.id', userId);
const user = await prisma.user.findUnique({
where: { id: userId },
include: { posts: true },
});
return user;
});

PrismaInstrumentation automatically captures:

  • prisma:client:operation — Full Prisma operation
  • prisma:client:serialize — Query serialization
  • prisma:engine:query — Query engine execution
  • prisma:engine:connection — Database connection
  • prisma:engine:db_query — Actual SQL query
  • prisma:engine:serialize — Response serialization
  • example-prisma — SQLite setup with User/Post models, nested queries, and transactions.