| name | autotel-tanstack |
| description | OpenTelemetry for TanStack Start. Trace server functions, route loaders, middleware, and request handlers. Supports zero-config, middleware-based, and explicit wrapper patterns.
|
autotel-tanstack
OpenTelemetry instrumentation for TanStack Start (React Start and Solid Start).
Quick Start — pick one approach
Zero-config
import 'autotel-tanstack/auto';
Middleware (recommended)
import { tracingMiddleware } from 'autotel-tanstack/middleware';
export const startInstance = createStart(() => ({
requestMiddleware: [tracingMiddleware()],
}));
export const getUser = createServerFn({ method: 'GET' })
.middleware([tracingMiddleware({ type: 'function' })])
.handler(async ({ data: id }) => db.users.findUnique({ where: { id } }));
Explicit wrappers
import { traceServerFn } from 'autotel-tanstack/server-functions';
import { traceLoader } from 'autotel-tanstack/loaders';
import { wrapStartHandler } from 'autotel-tanstack/handlers';
export const getUser = traceServerFn(
createServerFn({ method: 'GET' }).handler(async ({ data }) => { ... }),
{ name: 'getUser', captureArgs: true },
);
export const Route = createFileRoute('/users/$userId')({
loader: traceLoader(async ({ params }) => {
return db.users.findUnique({ where: { id: params.userId } });
}),
});
export default wrapStartHandler({
service: 'my-app',
endpoint: process.env.OTEL_EXPORTER_OTLP_ENDPOINT,
})(createStartHandler(defaultStreamHandler));
Configuration Options
tracingMiddleware({
captureHeaders: ['x-request-id'],
captureArgs: true,
captureResults: false,
captureParams: true,
excludePaths: ['/health', /^\/api\/internal/],
sampling: 'adaptive',
customAttributes: (ctx) => ({ 'app.tenant': ctx.tenant }),
});
Entry Points (tree-shaking)
| Import | What |
|---|
autotel-tanstack | Everything |
autotel-tanstack/auto | Zero-config |
autotel-tanstack/middleware | Middleware only |
autotel-tanstack/server-functions | Server function wrappers |
autotel-tanstack/loaders | Loader wrappers |
autotel-tanstack/handlers | Handler wrappers |
autotel-tanstack/context | Trace context propagation |
Common Mistakes
- Do NOT use
tracingMiddleware() in browser — it no-ops. Server functions run server-side only.
- Do NOT forget to wrap the start handler — without it, there's no root span for requests.
- Use
captureArgs: true carefully — it serializes function arguments into span attributes. Avoid for large payloads.
- Prefer middleware over explicit wrappers — middleware composes with TanStack's built-in patterns.