autotel-adapters 0.3.19 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -0
- package/dist/cloudflare.cjs +44 -29
- package/dist/cloudflare.cjs.map +1 -1
- package/dist/cloudflare.d.cts +11 -17
- package/dist/cloudflare.d.cts.map +1 -1
- package/dist/cloudflare.d.ts +11 -17
- package/dist/cloudflare.d.ts.map +1 -1
- package/dist/cloudflare.js +47 -30
- package/dist/cloudflare.js.map +1 -1
- package/dist/core.cjs +7 -11
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.cts +7 -11
- package/dist/core.d.cts.map +1 -1
- package/dist/core.d.ts +6 -10
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +7 -12
- package/dist/core.js.map +1 -1
- package/dist/elysia.cjs +50 -0
- package/dist/elysia.cjs.map +1 -0
- package/dist/elysia.d.cts +18 -0
- package/dist/elysia.d.cts.map +1 -0
- package/dist/elysia.d.ts +18 -0
- package/dist/elysia.d.ts.map +1 -0
- package/dist/elysia.js +44 -0
- package/dist/elysia.js.map +1 -0
- package/dist/express.cjs +5 -16
- package/dist/express.cjs.map +1 -1
- package/dist/express.d.cts +6 -15
- package/dist/express.d.cts.map +1 -1
- package/dist/express.d.ts +6 -15
- package/dist/express.d.ts.map +1 -1
- package/dist/express.js +7 -16
- package/dist/express.js.map +1 -1
- package/dist/fastify.cjs +5 -16
- package/dist/fastify.cjs.map +1 -1
- package/dist/fastify.d.cts +6 -15
- package/dist/fastify.d.cts.map +1 -1
- package/dist/fastify.d.ts +6 -15
- package/dist/fastify.d.ts.map +1 -1
- package/dist/fastify.js +7 -16
- package/dist/fastify.js.map +1 -1
- package/dist/hono.cjs +52 -11
- package/dist/hono.cjs.map +1 -1
- package/dist/hono.d.cts +12 -5
- package/dist/hono.d.cts.map +1 -1
- package/dist/hono.d.ts +12 -5
- package/dist/hono.d.ts.map +1 -1
- package/dist/hono.js +49 -12
- package/dist/hono.js.map +1 -1
- package/dist/index.cjs +14 -9
- package/dist/index.d.cts +12 -9
- package/dist/index.d.ts +12 -9
- package/dist/index.js +12 -9
- package/dist/integration-DI-1RuTh.d.cts +100 -0
- package/dist/integration-DI-1RuTh.d.cts.map +1 -0
- package/dist/integration-IUpfttGT.js +335 -0
- package/dist/integration-IUpfttGT.js.map +1 -0
- package/dist/integration-guh7BHTF.cjs +412 -0
- package/dist/integration-guh7BHTF.cjs.map +1 -0
- package/dist/integration-rYoX8QLk.d.ts +100 -0
- package/dist/integration-rYoX8QLk.d.ts.map +1 -0
- package/dist/nestjs.cjs +119 -0
- package/dist/nestjs.cjs.map +1 -0
- package/dist/nestjs.d.cts +42 -0
- package/dist/nestjs.d.cts.map +1 -0
- package/dist/nestjs.d.ts +42 -0
- package/dist/nestjs.d.ts.map +1 -0
- package/dist/nestjs.js +114 -0
- package/dist/nestjs.js.map +1 -0
- package/dist/next.cjs +35 -33
- package/dist/next.cjs.map +1 -1
- package/dist/next.d.cts +6 -17
- package/dist/next.d.cts.map +1 -1
- package/dist/next.d.ts +6 -17
- package/dist/next.d.ts.map +1 -1
- package/dist/next.js +38 -34
- package/dist/next.js.map +1 -1
- package/dist/nitro.cjs +33 -41
- package/dist/nitro.cjs.map +1 -1
- package/dist/nitro.d.cts +6 -17
- package/dist/nitro.d.cts.map +1 -1
- package/dist/nitro.d.ts +6 -17
- package/dist/nitro.d.ts.map +1 -1
- package/dist/nitro.js +33 -42
- package/dist/nitro.js.map +1 -1
- package/dist/sveltekit.cjs +48 -0
- package/dist/sveltekit.cjs.map +1 -0
- package/dist/sveltekit.d.cts +24 -0
- package/dist/sveltekit.d.cts.map +1 -0
- package/dist/sveltekit.d.ts +24 -0
- package/dist/sveltekit.d.ts.map +1 -0
- package/dist/sveltekit.js +43 -0
- package/dist/sveltekit.js.map +1 -0
- package/dist/tanstack.cjs +0 -8
- package/dist/tanstack.cjs.map +1 -1
- package/dist/tanstack.d.cts +1 -7
- package/dist/tanstack.d.cts.map +1 -1
- package/dist/tanstack.d.ts +1 -7
- package/dist/tanstack.d.ts.map +1 -1
- package/dist/tanstack.js +2 -9
- package/dist/tanstack.js.map +1 -1
- package/dist/toolkit/index.cjs +23 -0
- package/dist/toolkit/index.d.cts +42 -0
- package/dist/toolkit/index.d.cts.map +1 -0
- package/dist/toolkit/index.d.ts +42 -0
- package/dist/toolkit/index.d.ts.map +1 -0
- package/dist/toolkit/index.js +4 -0
- package/dist/toolkit/storage.cjs +35 -0
- package/dist/toolkit/storage.cjs.map +1 -0
- package/dist/toolkit/storage.d.cts +20 -0
- package/dist/toolkit/storage.d.cts.map +1 -0
- package/dist/toolkit/storage.d.ts +20 -0
- package/dist/toolkit/storage.d.ts.map +1 -0
- package/dist/toolkit/storage.js +33 -0
- package/dist/toolkit/storage.js.map +1 -0
- package/package.json +39 -8
- package/skills/autotel-adapters/SKILL.md +42 -34
|
@@ -10,9 +10,12 @@ Framework-specific wrappers around autotel's core tracing primitives. Each adapt
|
|
|
10
10
|
|
|
11
11
|
- A handler wrapper that opens a span and binds a request-scoped `RequestLogger`
|
|
12
12
|
- A `useLogger()` function that retrieves the logger from within the handler
|
|
13
|
-
-
|
|
13
|
+
- Direct re-exports of the utilities `parseError`, `createStructuredError`, and `createDrainPipeline`
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
Options are passed per call site (e.g. `withAutotel(handler, options)`). There are no
|
|
16
|
+
`create*Adapter` factories or `*Toolkit` bundles.
|
|
17
|
+
|
|
18
|
+
All adapters use `AsyncLocalStorage` (or a `WeakMap` for Cloudflare) internally so logger access is implicit. You never pass a logger through call chains manually.
|
|
16
19
|
|
|
17
20
|
## Setup
|
|
18
21
|
|
|
@@ -32,7 +35,7 @@ pnpm add hono # Hono
|
|
|
32
35
|
|
|
33
36
|
Import from the subpath `autotel-adapters/next` (or from the barrel `autotel-adapters`).
|
|
34
37
|
|
|
35
|
-
**Option A
|
|
38
|
+
**Option A, per-handler wrap:**
|
|
36
39
|
|
|
37
40
|
```typescript
|
|
38
41
|
import { withAutotel, useLogger } from 'autotel-adapters/next';
|
|
@@ -44,16 +47,18 @@ export const GET = withAutotel(async (request) => {
|
|
|
44
47
|
});
|
|
45
48
|
```
|
|
46
49
|
|
|
47
|
-
**Option B
|
|
50
|
+
**Option B, share defaults by passing options at each wrap:**
|
|
48
51
|
|
|
49
52
|
```typescript
|
|
50
53
|
// lib/autotel.ts
|
|
51
|
-
import {
|
|
54
|
+
import { withAutotel } from 'autotel-adapters/next';
|
|
52
55
|
|
|
53
|
-
|
|
56
|
+
const autotelOptions = {
|
|
54
57
|
spanName: (req) => `api ${new URL(req?.url ?? '/').pathname}`,
|
|
55
|
-
|
|
56
|
-
}
|
|
58
|
+
enrichRequest: (req) => ({ 'tenant.id': req?.headers?.get('x-tenant-id') }),
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export const withTracing = (handler) => withAutotel(handler, autotelOptions);
|
|
57
62
|
```
|
|
58
63
|
|
|
59
64
|
`withAutotel` accepts any function whose first argument is `NextRequestLike`. The `spanName` option can be a static string or a function receiving the request. The auto-enrichment sets `http.request.method`, `url.full`, `http.route`, and `http.request.header.x-request-id`.
|
|
@@ -69,11 +74,11 @@ export default defineEventHandler(
|
|
|
69
74
|
const log = useLogger(event);
|
|
70
75
|
log.info('handling event');
|
|
71
76
|
return { ok: true };
|
|
72
|
-
})
|
|
77
|
+
}),
|
|
73
78
|
);
|
|
74
79
|
```
|
|
75
80
|
|
|
76
|
-
`withAutotelEventHandler` reads `event.method`, `event.path`, and `event.context.requestId` automatically.
|
|
81
|
+
`withAutotelEventHandler` reads `event.method`, `event.path`, and `event.context.requestId` automatically. Pass options as the second argument to share config across handlers.
|
|
77
82
|
|
|
78
83
|
### Cloudflare Workers
|
|
79
84
|
|
|
@@ -95,46 +100,50 @@ Cloudflare stores the logger in a `WeakMap` keyed on the request object (no `Asy
|
|
|
95
100
|
|
|
96
101
|
```typescript
|
|
97
102
|
import { Hono } from 'hono';
|
|
98
|
-
import {
|
|
103
|
+
import { autotelMiddleware, useLogger } from 'autotel-adapters/hono';
|
|
99
104
|
|
|
100
105
|
const app = new Hono();
|
|
106
|
+
app.use('*', autotelMiddleware());
|
|
101
107
|
|
|
102
108
|
app.get('/', (c) => {
|
|
103
|
-
const log =
|
|
109
|
+
const log = useLogger();
|
|
104
110
|
log.info('hello hono');
|
|
105
111
|
return c.json({ ok: true });
|
|
106
112
|
});
|
|
107
113
|
```
|
|
108
114
|
|
|
109
|
-
|
|
115
|
+
Register `autotelMiddleware()` before your routes; it opens a span per request and
|
|
116
|
+
binds the logger to `AsyncLocalStorage`, so `useLogger()` (no argument) resolves
|
|
117
|
+
inside any downstream handler.
|
|
110
118
|
|
|
111
119
|
### TanStack Start
|
|
112
120
|
|
|
113
121
|
```typescript
|
|
114
|
-
import {
|
|
122
|
+
import { useLogger } from 'autotel-adapters/tanstack';
|
|
115
123
|
|
|
116
|
-
// Inside a server function or API route:
|
|
117
|
-
const log =
|
|
124
|
+
// Inside a server function or API route already running in an autotel trace:
|
|
125
|
+
const log = useLogger({ pathname: '/api/data', method: 'GET' });
|
|
118
126
|
log.info('handling request');
|
|
119
127
|
```
|
|
120
128
|
|
|
121
|
-
###
|
|
129
|
+
### Utilities
|
|
122
130
|
|
|
123
|
-
|
|
131
|
+
Each subpath re-exports `parseError`, `createStructuredError`, and
|
|
132
|
+
`createDrainPipeline` directly (they also live in `autotel`):
|
|
124
133
|
|
|
125
|
-
|
|
|
126
|
-
|
|
127
|
-
| `useLogger(ctx?, opts?)`
|
|
128
|
-
| `parseError(error)`
|
|
134
|
+
| Export | Description |
|
|
135
|
+
| ------------------------------ | --------------------------------------------------------- |
|
|
136
|
+
| `useLogger(ctx?, opts?)` | Get the request-scoped `RequestLogger` |
|
|
137
|
+
| `parseError(error)` | Normalise any thrown value into `ParsedError` |
|
|
129
138
|
| `createStructuredError(input)` | Build a `StructuredError` for consistent API error shapes |
|
|
130
|
-
| `createDrainPipeline(opts?)`
|
|
139
|
+
| `createDrainPipeline(opts?)` | Create a batching drain pipeline |
|
|
131
140
|
|
|
132
|
-
### Custom adapter (
|
|
141
|
+
### Custom adapter (createUseLogger)
|
|
133
142
|
|
|
134
143
|
```typescript
|
|
135
|
-
import {
|
|
144
|
+
import { createUseLogger } from 'autotel-adapters/core';
|
|
136
145
|
|
|
137
|
-
const
|
|
146
|
+
const useLogger = createUseLogger<MyContext>({
|
|
138
147
|
adapterName: 'my-framework',
|
|
139
148
|
enrich: (ctx) => ({ 'tenant.id': ctx.tenantId }),
|
|
140
149
|
});
|
|
@@ -142,7 +151,7 @@ const myToolkit = createAdapterToolkit<MyContext>({
|
|
|
142
151
|
|
|
143
152
|
## Common Mistakes
|
|
144
153
|
|
|
145
|
-
### HIGH
|
|
154
|
+
### HIGH: Calling useLogger outside a traced handler
|
|
146
155
|
|
|
147
156
|
```typescript
|
|
148
157
|
// WRONG: no active trace context
|
|
@@ -155,28 +164,27 @@ export async function myFunction() {
|
|
|
155
164
|
// CORRECT: always call useLogger inside a handler wrapped with withAutotel / withAutotelEventHandler
|
|
156
165
|
export const GET = withAutotel(async (request) => {
|
|
157
166
|
const log = useLogger(request); // ok — trace context is active
|
|
158
|
-
await myFunction(log);
|
|
167
|
+
await myFunction(log); // pass the logger down if needed
|
|
159
168
|
});
|
|
160
169
|
```
|
|
161
170
|
|
|
162
171
|
`useLogger` looks up an `AsyncLocalStorage` store populated by the handler wrapper. Calling it outside that wrapper throws.
|
|
163
172
|
|
|
164
|
-
### HIGH
|
|
173
|
+
### HIGH: Importing from wrong subpath
|
|
165
174
|
|
|
166
175
|
```typescript
|
|
167
176
|
// WRONG
|
|
168
|
-
import {
|
|
169
|
-
import { useLogger } from 'autotel-adapters'; // this is the Next.js useLogger, not Hono's
|
|
177
|
+
import { useLogger } from 'autotel-adapters'; // this is Hono's useLogger from the barrel, not Next's
|
|
170
178
|
```
|
|
171
179
|
|
|
172
180
|
```typescript
|
|
173
181
|
// CORRECT: use framework-specific subpaths
|
|
174
|
-
import {
|
|
182
|
+
import { autotelMiddleware, useLogger } from 'autotel-adapters/hono';
|
|
175
183
|
import { useLogger } from 'autotel-adapters/next';
|
|
176
184
|
import { withAutotelEventHandler } from 'autotel-adapters/nitro';
|
|
177
185
|
```
|
|
178
186
|
|
|
179
|
-
### MEDIUM
|
|
187
|
+
### MEDIUM: Skipping the request argument in Next.js useLogger
|
|
180
188
|
|
|
181
189
|
```typescript
|
|
182
190
|
// WRONG: loses auto-enrichment (method, url, route, requestId)
|
|
@@ -190,7 +198,7 @@ const log = useLogger(request);
|
|
|
190
198
|
|
|
191
199
|
The request argument is optional only when you are certain the `AsyncLocalStorage` store is already populated (i.e., called from code deeply nested inside a `withAutotel`-wrapped handler).
|
|
192
200
|
|
|
193
|
-
### MEDIUM
|
|
201
|
+
### MEDIUM: Not passing request to useLogger on Cloudflare
|
|
194
202
|
|
|
195
203
|
In Cloudflare Workers, the logger is stored per-request in a `WeakMap`. If you call `useLogger()` without the request object, you always get a new logger with no stored enrichment.
|
|
196
204
|
|