LogTide plugin for Elysia — automatic request tracing, error capture, and breadcrumbs via lifecycle hooks.
- Automatic request spans via
onRequest/onAfterHandlelifecycle hooks - Error capture via
onErrorhook with full request context - W3C Trace Context propagation (
traceparentin/out) - Breadcrumbs for HTTP requests
- Global plugin — traces all routes automatically
- Designed for Bun — works with Elysia's native runtime
- Full TypeScript support with strict types
npm install @logtide/elysia
# or
pnpm add @logtide/elysia
# or
bun add @logtide/elysiaimport { Elysia } from 'elysia';
import { logtide } from '@logtide/elysia';
const app = new Elysia()
.use(logtide({
dsn: 'https://lp_your_key@your-instance.com',
// Or use apiUrl + apiKey instead of dsn:
// apiUrl: 'https://your-instance.com',
// apiKey: 'lp_your_key',
service: 'my-elysia-api',
environment: 'production',
}))
.get('/hello', () => 'Hello World')
.listen(3000);The plugin registers global lifecycle hooks on the Elysia app:
onRequest— extracts incomingtraceparent, creates a span, stores scope on a WeakMap keyed by the requestonAfterHandle— finishes the span withokorerror, injectstraceparentinto response headersonError— finishes the span aserror, captures the error with full HTTP context
The plugin is registered with .as('global') so it applies to all routes, including those added after the plugin.
All ClientOptions from @logtide/core are supported:
| Option | Type | Default | Description |
|---|---|---|---|
dsn |
string |
required | DSN string: https://lp_KEY@host/PROJECT |
service |
string |
required | Service name for log attribution |
environment |
string |
— | Environment (e.g. production, staging) |
release |
string |
— | Release / version identifier |
debug |
boolean |
false |
Enable debug logging |
tracesSampleRate |
number |
1.0 |
Sample rate for traces (0.0 to 1.0) |
See @logtide/core README for the full list of options.
Errors thrown by handlers are automatically captured:
const app = new Elysia()
.use(logtide({ dsn: '...', service: 'my-api' }))
.get('/boom', () => {
throw new Error('Something broke');
// Automatically captured with:
// - http.url, http.method
// - Error message and stack trace
// - Span marked as 'error'
});Incoming traceparent headers are extracted and used as parent context:
# Client sends a traced request
curl -H "traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01" \
http://localhost:3000/api/dataThe span created by the plugin will use the same trace ID, enabling end-to-end distributed tracing across services.
Outgoing responses include a traceparent header with the span's context.
import { logtide } from '@logtide/elysia';
import type { LogtideElysiaOptions } from '@logtide/elysia';MIT License - see LICENSE for details.
