autotel-tanstack 1.1.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/LICENSE +21 -0
- package/README.md +294 -0
- package/dist/auto.d.ts +44 -0
- package/dist/auto.js +47 -0
- package/dist/auto.js.map +1 -0
- package/dist/browser/context.d.ts +48 -0
- package/dist/browser/context.js +3 -0
- package/dist/browser/context.js.map +1 -0
- package/dist/browser/debug-headers.d.ts +16 -0
- package/dist/browser/debug-headers.js +3 -0
- package/dist/browser/debug-headers.js.map +1 -0
- package/dist/browser/error-reporting.d.ts +37 -0
- package/dist/browser/error-reporting.js +3 -0
- package/dist/browser/error-reporting.js.map +1 -0
- package/dist/browser/handlers.d.ts +19 -0
- package/dist/browser/handlers.js +3 -0
- package/dist/browser/handlers.js.map +1 -0
- package/dist/browser/index.d.ts +10 -0
- package/dist/browser/index.js +12 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/loaders.d.ts +36 -0
- package/dist/browser/loaders.js +3 -0
- package/dist/browser/loaders.js.map +1 -0
- package/dist/browser/metrics.d.ts +54 -0
- package/dist/browser/metrics.js +3 -0
- package/dist/browser/metrics.js.map +1 -0
- package/dist/browser/middleware.d.ts +39 -0
- package/dist/browser/middleware.js +3 -0
- package/dist/browser/middleware.js.map +1 -0
- package/dist/browser/server-functions.d.ts +19 -0
- package/dist/browser/server-functions.js +3 -0
- package/dist/browser/server-functions.js.map +1 -0
- package/dist/browser/testing.d.ts +45 -0
- package/dist/browser/testing.js +3 -0
- package/dist/browser/testing.js.map +1 -0
- package/dist/browser/types.d.ts +85 -0
- package/dist/browser/types.js +3 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/chunk-4C7T5ZIM.js +20 -0
- package/dist/chunk-4C7T5ZIM.js.map +1 -0
- package/dist/chunk-CSFIPJC2.js +11 -0
- package/dist/chunk-CSFIPJC2.js.map +1 -0
- package/dist/chunk-DTZCOB4W.js +32 -0
- package/dist/chunk-DTZCOB4W.js.map +1 -0
- package/dist/chunk-EGRHWZRV.js +3 -0
- package/dist/chunk-EGRHWZRV.js.map +1 -0
- package/dist/chunk-EUYFVNYE.js +16 -0
- package/dist/chunk-EUYFVNYE.js.map +1 -0
- package/dist/chunk-HIQYW2HB.js +20 -0
- package/dist/chunk-HIQYW2HB.js.map +1 -0
- package/dist/chunk-HKM7LMO6.js +129 -0
- package/dist/chunk-HKM7LMO6.js.map +1 -0
- package/dist/chunk-I4LX3LOG.js +35 -0
- package/dist/chunk-I4LX3LOG.js.map +1 -0
- package/dist/chunk-JSI6QG7M.js +96 -0
- package/dist/chunk-JSI6QG7M.js.map +1 -0
- package/dist/chunk-JXO7H6KO.js +10 -0
- package/dist/chunk-JXO7H6KO.js.map +1 -0
- package/dist/chunk-MFYOV2SF.js +32 -0
- package/dist/chunk-MFYOV2SF.js.map +1 -0
- package/dist/chunk-MNP65ZX7.js +21 -0
- package/dist/chunk-MNP65ZX7.js.map +1 -0
- package/dist/chunk-NTY64BKS.js +38 -0
- package/dist/chunk-NTY64BKS.js.map +1 -0
- package/dist/chunk-OLBHLVLE.js +220 -0
- package/dist/chunk-OLBHLVLE.js.map +1 -0
- package/dist/chunk-TNOQTZ3N.js +92 -0
- package/dist/chunk-TNOQTZ3N.js.map +1 -0
- package/dist/chunk-UMEJU65Q.js +34 -0
- package/dist/chunk-UMEJU65Q.js.map +1 -0
- package/dist/chunk-UTPW3QRT.js +52 -0
- package/dist/chunk-UTPW3QRT.js.map +1 -0
- package/dist/chunk-V3RO5N2M.js +8 -0
- package/dist/chunk-V3RO5N2M.js.map +1 -0
- package/dist/chunk-XXBHZR3M.js +99 -0
- package/dist/chunk-XXBHZR3M.js.map +1 -0
- package/dist/chunk-Z3MJ3GZ6.js +18 -0
- package/dist/chunk-Z3MJ3GZ6.js.map +1 -0
- package/dist/chunk-Z5D2V4DU.js +216 -0
- package/dist/chunk-Z5D2V4DU.js.map +1 -0
- package/dist/context.d.ts +94 -0
- package/dist/context.js +4 -0
- package/dist/context.js.map +1 -0
- package/dist/debug-headers.d.ts +43 -0
- package/dist/debug-headers.js +5 -0
- package/dist/debug-headers.js.map +1 -0
- package/dist/error-reporting.d.ts +118 -0
- package/dist/error-reporting.js +4 -0
- package/dist/error-reporting.js.map +1 -0
- package/dist/handlers.d.ts +70 -0
- package/dist/handlers.js +6 -0
- package/dist/handlers.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/loaders.d.ts +124 -0
- package/dist/loaders.js +6 -0
- package/dist/loaders.js.map +1 -0
- package/dist/metrics.d.ts +113 -0
- package/dist/metrics.js +4 -0
- package/dist/metrics.js.map +1 -0
- package/dist/middleware.d.ts +104 -0
- package/dist/middleware.js +7 -0
- package/dist/middleware.js.map +1 -0
- package/dist/server-functions.d.ts +71 -0
- package/dist/server-functions.js +6 -0
- package/dist/server-functions.js.map +1 -0
- package/dist/testing.d.ts +128 -0
- package/dist/testing.js +110 -0
- package/dist/testing.js.map +1 -0
- package/dist/types-C37KSxMN.d.ts +152 -0
- package/package.json +166 -0
- package/src/auto.ts +86 -0
- package/src/browser/context.ts +88 -0
- package/src/browser/debug-headers.ts +19 -0
- package/src/browser/error-reporting.ts +63 -0
- package/src/browser/handlers.ts +23 -0
- package/src/browser/index.ts +65 -0
- package/src/browser/loaders.ts +62 -0
- package/src/browser/metrics.ts +86 -0
- package/src/browser/middleware.ts +61 -0
- package/src/browser/server-functions.ts +31 -0
- package/src/browser/testing.ts +67 -0
- package/src/browser/types.ts +100 -0
- package/src/context.test.ts +90 -0
- package/src/context.ts +145 -0
- package/src/debug-headers.ts +109 -0
- package/src/env.ts +56 -0
- package/src/error-reporting.ts +204 -0
- package/src/handlers.ts +339 -0
- package/src/index.ts +92 -0
- package/src/loaders.test.ts +123 -0
- package/src/loaders.ts +267 -0
- package/src/metrics.ts +183 -0
- package/src/middleware.test.ts +191 -0
- package/src/middleware.ts +400 -0
- package/src/server-functions.test.ts +86 -0
- package/src/server-functions.ts +184 -0
- package/src/testing.test.ts +72 -0
- package/src/testing.ts +276 -0
- package/src/types.test.ts +46 -0
- package/src/types.ts +182 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) Jag Reehal 2025
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
# autotel-tanstack
|
|
2
|
+
|
|
3
|
+
OpenTelemetry instrumentation for TanStack Start applications. Automatic tracing for server functions, middleware, and route loaders.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Zero-Config Option** - Just import `autotel-tanstack/auto` and you're done
|
|
8
|
+
- **Framework-Aligned API** - Uses TanStack's middleware patterns
|
|
9
|
+
- **Full Coverage** - Server functions, loaders, beforeLoad, HTTP requests
|
|
10
|
+
- **Tree-Shakeable** - Only bundle what you use
|
|
11
|
+
- **Type-Safe** - Full TypeScript support
|
|
12
|
+
- **Vendor-Agnostic** - Works with any OTLP-compatible backend (Honeycomb, Datadog, Jaeger, etc.)
|
|
13
|
+
|
|
14
|
+
## Installation
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npm install autotel-tanstack autotel
|
|
18
|
+
# or
|
|
19
|
+
pnpm add autotel-tanstack autotel
|
|
20
|
+
# or
|
|
21
|
+
yarn add autotel-tanstack autotel
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Quick Start
|
|
25
|
+
|
|
26
|
+
### Option 1: Zero-Config (Recommended)
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
// app/start.ts (React) or app/start.ts (Solid)
|
|
30
|
+
import 'autotel-tanstack/auto';
|
|
31
|
+
import { createStart } from '@tanstack/react-start';
|
|
32
|
+
|
|
33
|
+
// Set env vars: OTEL_SERVICE_NAME, OTEL_EXPORTER_OTLP_ENDPOINT
|
|
34
|
+
export const startInstance = createStart(() => ({}));
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Option 2: Middleware-Based
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
// app/start.ts
|
|
41
|
+
import { createStart } from '@tanstack/react-start';
|
|
42
|
+
import { tracingMiddleware } from 'autotel-tanstack/middleware';
|
|
43
|
+
import { init } from 'autotel';
|
|
44
|
+
|
|
45
|
+
// Initialize autotel
|
|
46
|
+
init({
|
|
47
|
+
service: 'my-app',
|
|
48
|
+
endpoint: 'https://api.honeycomb.io',
|
|
49
|
+
headers: { 'x-honeycomb-team': process.env.HONEYCOMB_API_KEY },
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
export const startInstance = createStart(() => ({
|
|
53
|
+
requestMiddleware: [tracingMiddleware()],
|
|
54
|
+
}));
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Option 3: Handler Wrapper (Full Control)
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
// server.ts
|
|
61
|
+
import {
|
|
62
|
+
createStartHandler,
|
|
63
|
+
defaultStreamHandler,
|
|
64
|
+
} from '@tanstack/react-start/server';
|
|
65
|
+
import { wrapStartHandler } from 'autotel-tanstack/handlers';
|
|
66
|
+
|
|
67
|
+
export default wrapStartHandler({
|
|
68
|
+
service: 'my-app',
|
|
69
|
+
endpoint: process.env.OTEL_EXPORTER_OTLP_ENDPOINT,
|
|
70
|
+
headers: { 'x-honeycomb-team': process.env.HONEYCOMB_API_KEY },
|
|
71
|
+
})(createStartHandler(defaultStreamHandler));
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Usage
|
|
75
|
+
|
|
76
|
+
### Tracing Server Functions
|
|
77
|
+
|
|
78
|
+
```typescript
|
|
79
|
+
import { createServerFn } from '@tanstack/react-start';
|
|
80
|
+
import { functionTracingMiddleware } from 'autotel-tanstack/middleware';
|
|
81
|
+
|
|
82
|
+
// Using middleware (recommended)
|
|
83
|
+
export const getUser = createServerFn({ method: 'GET' })
|
|
84
|
+
.middleware([functionTracingMiddleware()])
|
|
85
|
+
.handler(async ({ data: id }) => {
|
|
86
|
+
return await db.users.findUnique({ where: { id } });
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
// Or using explicit wrapper
|
|
90
|
+
import { traceServerFn } from 'autotel-tanstack/server-functions';
|
|
91
|
+
|
|
92
|
+
const getUserBase = createServerFn({ method: 'GET' }).handler(
|
|
93
|
+
async ({ data: id }) => {
|
|
94
|
+
return await db.users.findUnique({ where: { id } });
|
|
95
|
+
},
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
export const getUser = traceServerFn(getUserBase, { name: 'getUser' });
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Tracing Route Loaders
|
|
102
|
+
|
|
103
|
+
```typescript
|
|
104
|
+
import { createFileRoute } from '@tanstack/react-router';
|
|
105
|
+
import { traceLoader, traceBeforeLoad } from 'autotel-tanstack/loaders';
|
|
106
|
+
|
|
107
|
+
export const Route = createFileRoute('/users/$userId')({
|
|
108
|
+
beforeLoad: traceBeforeLoad(async ({ context }) => {
|
|
109
|
+
if (!context.auth.isAuthenticated) {
|
|
110
|
+
throw redirect({ to: '/login' });
|
|
111
|
+
}
|
|
112
|
+
}),
|
|
113
|
+
loader: traceLoader(async ({ params }) => {
|
|
114
|
+
return await getUser(params.userId);
|
|
115
|
+
}),
|
|
116
|
+
});
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Using createTracedRoute Helper
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
import { createFileRoute } from '@tanstack/react-router';
|
|
123
|
+
import { createTracedRoute } from 'autotel-tanstack/loaders';
|
|
124
|
+
|
|
125
|
+
const traced = createTracedRoute('/users/$userId');
|
|
126
|
+
|
|
127
|
+
export const Route = createFileRoute('/users/$userId')({
|
|
128
|
+
beforeLoad: traced.beforeLoad(async ({ context }) => {
|
|
129
|
+
// Auth check
|
|
130
|
+
}),
|
|
131
|
+
loader: traced.loader(async ({ params }) => {
|
|
132
|
+
return await getUser(params.userId);
|
|
133
|
+
}),
|
|
134
|
+
});
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Configuration
|
|
138
|
+
|
|
139
|
+
### Middleware Configuration
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
import { createTracingMiddleware } from 'autotel-tanstack/middleware';
|
|
143
|
+
|
|
144
|
+
const middleware = createTracingMiddleware({
|
|
145
|
+
// Type: 'request' for global middleware, 'function' for server functions
|
|
146
|
+
type: 'request',
|
|
147
|
+
|
|
148
|
+
// Headers to capture as span attributes
|
|
149
|
+
captureHeaders: ['x-request-id', 'user-agent'],
|
|
150
|
+
|
|
151
|
+
// Whether to capture function arguments (default: true)
|
|
152
|
+
captureArgs: true,
|
|
153
|
+
|
|
154
|
+
// Whether to capture function results (default: false - PII concern)
|
|
155
|
+
captureResults: false,
|
|
156
|
+
|
|
157
|
+
// Paths to exclude from tracing
|
|
158
|
+
excludePaths: ['/health', '/metrics', '/api/internal/*'],
|
|
159
|
+
|
|
160
|
+
// Sampling strategy: 'always' | 'adaptive' | 'never'
|
|
161
|
+
sampling: 'adaptive',
|
|
162
|
+
|
|
163
|
+
// Custom attributes function
|
|
164
|
+
customAttributes: ({ type, name, request }) => ({
|
|
165
|
+
'custom.attribute': 'value',
|
|
166
|
+
}),
|
|
167
|
+
});
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### Handler Configuration
|
|
171
|
+
|
|
172
|
+
```typescript
|
|
173
|
+
import { wrapStartHandler } from 'autotel-tanstack/handlers';
|
|
174
|
+
|
|
175
|
+
const handler = wrapStartHandler({
|
|
176
|
+
// Service name (default: OTEL_SERVICE_NAME or 'tanstack-start')
|
|
177
|
+
service: 'my-app',
|
|
178
|
+
|
|
179
|
+
// OTLP endpoint (default: OTEL_EXPORTER_OTLP_ENDPOINT)
|
|
180
|
+
endpoint: 'https://api.honeycomb.io',
|
|
181
|
+
|
|
182
|
+
// OTLP headers (default: parsed from OTEL_EXPORTER_OTLP_HEADERS)
|
|
183
|
+
headers: { 'x-honeycomb-team': 'YOUR_API_KEY' },
|
|
184
|
+
|
|
185
|
+
// All middleware config options also available
|
|
186
|
+
captureHeaders: ['x-request-id'],
|
|
187
|
+
excludePaths: ['/health'],
|
|
188
|
+
});
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
## Environment Variables
|
|
192
|
+
|
|
193
|
+
| Variable | Description | Example |
|
|
194
|
+
| ----------------------------- | ---------------------------------- | --------------------------- |
|
|
195
|
+
| `OTEL_SERVICE_NAME` | Service name for spans | `my-app` |
|
|
196
|
+
| `OTEL_EXPORTER_OTLP_ENDPOINT` | OTLP collector URL | `https://api.honeycomb.io` |
|
|
197
|
+
| `OTEL_EXPORTER_OTLP_HEADERS` | Auth headers (key=value,key=value) | `x-honeycomb-team=YOUR_KEY` |
|
|
198
|
+
| `AUTOTEL_DEBUG` | Enable debug logging | `true` |
|
|
199
|
+
|
|
200
|
+
## Span Attributes
|
|
201
|
+
|
|
202
|
+
### HTTP Request Spans
|
|
203
|
+
|
|
204
|
+
- `http.request.method` - GET, POST, etc.
|
|
205
|
+
- `url.path` - Request path
|
|
206
|
+
- `url.query` - Query string
|
|
207
|
+
- `http.response.status_code` - Response status
|
|
208
|
+
- `tanstack.request.duration_ms` - Request duration
|
|
209
|
+
|
|
210
|
+
### Server Function Spans
|
|
211
|
+
|
|
212
|
+
- `rpc.system` - "tanstack-start"
|
|
213
|
+
- `rpc.method` - Function name
|
|
214
|
+
- `tanstack.server_function.name` - Function name
|
|
215
|
+
- `tanstack.server_function.method` - HTTP method
|
|
216
|
+
- `tanstack.server_function.args` - Serialized arguments (if enabled)
|
|
217
|
+
|
|
218
|
+
### Loader Spans
|
|
219
|
+
|
|
220
|
+
- `tanstack.loader.route_id` - Route identifier
|
|
221
|
+
- `tanstack.loader.type` - "loader" or "beforeLoad"
|
|
222
|
+
- `tanstack.loader.params` - Route params (if enabled)
|
|
223
|
+
|
|
224
|
+
## Testing
|
|
225
|
+
|
|
226
|
+
```typescript
|
|
227
|
+
import { describe, it, beforeEach, afterEach } from 'vitest';
|
|
228
|
+
import { createTestHarness } from 'autotel-tanstack/testing';
|
|
229
|
+
|
|
230
|
+
describe('MyServerFunction', () => {
|
|
231
|
+
let harness: ReturnType<typeof createTestHarness>;
|
|
232
|
+
|
|
233
|
+
beforeEach(() => {
|
|
234
|
+
harness = createTestHarness();
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
afterEach(() => {
|
|
238
|
+
harness.reset();
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
it('should trace the server function', async () => {
|
|
242
|
+
await myServerFunction({ id: '123' });
|
|
243
|
+
|
|
244
|
+
harness.assertServerFnTraced('myServerFunction');
|
|
245
|
+
harness.assertSpanHasAttribute(
|
|
246
|
+
/tanstack\.serverFn/,
|
|
247
|
+
'tanstack.server_function.name',
|
|
248
|
+
'myServerFunction',
|
|
249
|
+
);
|
|
250
|
+
});
|
|
251
|
+
});
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### Mock Utilities
|
|
255
|
+
|
|
256
|
+
```typescript
|
|
257
|
+
import {
|
|
258
|
+
createMockRequest,
|
|
259
|
+
generateTraceparent,
|
|
260
|
+
} from 'autotel-tanstack/testing';
|
|
261
|
+
|
|
262
|
+
// Create mock request
|
|
263
|
+
const request = createMockRequest('GET', '/api/users', {
|
|
264
|
+
headers: { 'x-request-id': 'test-123' },
|
|
265
|
+
traceparent: generateTraceparent(),
|
|
266
|
+
});
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
## Context Propagation
|
|
270
|
+
|
|
271
|
+
For distributed tracing across services:
|
|
272
|
+
|
|
273
|
+
```typescript
|
|
274
|
+
import {
|
|
275
|
+
createTracedHeaders,
|
|
276
|
+
extractContextFromRequest,
|
|
277
|
+
} from 'autotel-tanstack/context';
|
|
278
|
+
|
|
279
|
+
// Outgoing requests - inject trace context
|
|
280
|
+
const headers = createTracedHeaders({ 'Content-Type': 'application/json' });
|
|
281
|
+
await fetch('https://api.example.com', { headers, method: 'POST', body });
|
|
282
|
+
|
|
283
|
+
// Incoming requests - extract parent context
|
|
284
|
+
const parentContext = extractContextFromRequest(request);
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
## Supported Frameworks
|
|
288
|
+
|
|
289
|
+
- **@tanstack/react-start** ^1.139.14
|
|
290
|
+
- **@tanstack/solid-start** ^1.139.14
|
|
291
|
+
|
|
292
|
+
## License
|
|
293
|
+
|
|
294
|
+
MIT
|
package/dist/auto.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export { functionTracingMiddleware, tracingMiddleware } from './middleware.js';
|
|
2
|
+
export { traceServerFn } from './server-functions.js';
|
|
3
|
+
export { traceBeforeLoad, traceLoader } from './loaders.js';
|
|
4
|
+
import './types-C37KSxMN.js';
|
|
5
|
+
import '@opentelemetry/api';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Zero-config auto-instrumentation for TanStack Start
|
|
9
|
+
*
|
|
10
|
+
* Import this module to automatically instrument TanStack Start applications
|
|
11
|
+
* with OpenTelemetry tracing. Configuration is read from environment variables.
|
|
12
|
+
*
|
|
13
|
+
* Environment Variables:
|
|
14
|
+
* - OTEL_SERVICE_NAME: Service name (default: 'tanstack-start')
|
|
15
|
+
* - OTEL_EXPORTER_OTLP_ENDPOINT: OTLP collector URL
|
|
16
|
+
* - OTEL_EXPORTER_OTLP_HEADERS: Authentication headers (key=value,key=value)
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* // app/start.ts
|
|
21
|
+
* import 'autotel-tanstack/auto';
|
|
22
|
+
* import { createStart } from '@tanstack/react-start';
|
|
23
|
+
*
|
|
24
|
+
* // Tracing is automatically configured!
|
|
25
|
+
* export const startInstance = createStart(() => ({}));
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* @module
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Check if auto-instrumentation is active
|
|
33
|
+
*/
|
|
34
|
+
declare function isAutoInstrumentationActive(): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Get the configured service name
|
|
37
|
+
*/
|
|
38
|
+
declare function getServiceName(): string;
|
|
39
|
+
/**
|
|
40
|
+
* Get the configured endpoint
|
|
41
|
+
*/
|
|
42
|
+
declare function getEndpoint(): string | undefined;
|
|
43
|
+
|
|
44
|
+
export { getEndpoint, getServiceName, isAutoInstrumentationActive };
|
package/dist/auto.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export { functionTracingMiddleware, tracingMiddleware } from './chunk-OLBHLVLE.js';
|
|
2
|
+
export { traceServerFn } from './chunk-TNOQTZ3N.js';
|
|
3
|
+
export { traceBeforeLoad, traceLoader } from './chunk-HKM7LMO6.js';
|
|
4
|
+
import './chunk-EUYFVNYE.js';
|
|
5
|
+
import './chunk-I4LX3LOG.js';
|
|
6
|
+
import './chunk-NTY64BKS.js';
|
|
7
|
+
import './chunk-EGRHWZRV.js';
|
|
8
|
+
import { init } from 'autotel';
|
|
9
|
+
|
|
10
|
+
var service = process.env.OTEL_SERVICE_NAME || "tanstack-start";
|
|
11
|
+
var endpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT;
|
|
12
|
+
var headers;
|
|
13
|
+
if (process.env.OTEL_EXPORTER_OTLP_HEADERS) {
|
|
14
|
+
headers = {};
|
|
15
|
+
const pairs = process.env.OTEL_EXPORTER_OTLP_HEADERS.split(",");
|
|
16
|
+
for (const pair of pairs) {
|
|
17
|
+
const [key, value] = pair.split("=");
|
|
18
|
+
if (key && value) {
|
|
19
|
+
headers[key.trim()] = value.trim();
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
init({
|
|
24
|
+
service,
|
|
25
|
+
endpoint,
|
|
26
|
+
headers
|
|
27
|
+
});
|
|
28
|
+
if (process.env.NODE_ENV === "development" || process.env.AUTOTEL_DEBUG) {
|
|
29
|
+
console.log("[autotel-tanstack] Auto-initialized with:", {
|
|
30
|
+
service,
|
|
31
|
+
endpoint: endpoint || "(not configured)",
|
|
32
|
+
hasHeaders: !!headers
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
function isAutoInstrumentationActive() {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
function getServiceName() {
|
|
39
|
+
return service;
|
|
40
|
+
}
|
|
41
|
+
function getEndpoint() {
|
|
42
|
+
return endpoint;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export { getEndpoint, getServiceName, isAutoInstrumentationActive };
|
|
46
|
+
//# sourceMappingURL=auto.js.map
|
|
47
|
+
//# sourceMappingURL=auto.js.map
|
package/dist/auto.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/auto.ts"],"names":[],"mappings":";;;;;;;;;AA2BA,IAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,iBAAA,IAAqB,gBAAA;AAGjD,IAAM,QAAA,GAAW,QAAQ,GAAA,CAAI,2BAAA;AAG7B,IAAI,OAAA;AACJ,IAAI,OAAA,CAAQ,IAAI,0BAAA,EAA4B;AAC1C,EAAA,OAAA,GAAU,EAAC;AACX,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,0BAAA,CAA2B,MAAM,GAAG,CAAA;AAC9D,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,CAAC,GAAA,EAAK,KAAK,CAAA,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AACnC,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,EAAM,CAAA,GAAI,MAAM,IAAA,EAAK;AAAA,IACnC;AAAA,EACF;AACF;AAGA,IAAA,CAAK;AAAA,EACH,OAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAC,CAAA;AAGD,IAAI,QAAQ,GAAA,CAAI,QAAA,KAAa,aAAA,IAAiB,OAAA,CAAQ,IAAI,aAAA,EAAe;AACvE,EAAA,OAAA,CAAQ,IAAI,2CAAA,EAA6C;AAAA,IACvD,OAAA;AAAA,IACA,UAAU,QAAA,IAAY,kBAAA;AAAA,IACtB,UAAA,EAAY,CAAC,CAAC;AAAA,GACf,CAAA;AACH;AAUO,SAAS,2BAAA,GAAuC;AACrD,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,cAAA,GAAyB;AACvC,EAAA,OAAO,OAAA;AACT;AAKO,SAAS,WAAA,GAAkC;AAChD,EAAA,OAAO,QAAA;AACT","file":"auto.js","sourcesContent":["/**\n * Zero-config auto-instrumentation for TanStack Start\n *\n * Import this module to automatically instrument TanStack Start applications\n * with OpenTelemetry tracing. Configuration is read from environment variables.\n *\n * Environment Variables:\n * - OTEL_SERVICE_NAME: Service name (default: 'tanstack-start')\n * - OTEL_EXPORTER_OTLP_ENDPOINT: OTLP collector URL\n * - OTEL_EXPORTER_OTLP_HEADERS: Authentication headers (key=value,key=value)\n *\n * @example\n * ```typescript\n * // app/start.ts\n * import 'autotel-tanstack/auto';\n * import { createStart } from '@tanstack/react-start';\n *\n * // Tracing is automatically configured!\n * export const startInstance = createStart(() => ({}));\n * ```\n *\n * @module\n */\n\nimport { init } from 'autotel';\n\n// Parse service name\nconst service = process.env.OTEL_SERVICE_NAME || 'tanstack-start';\n\n// Parse endpoint\nconst endpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT;\n\n// Parse headers\nlet headers: Record<string, string> | undefined;\nif (process.env.OTEL_EXPORTER_OTLP_HEADERS) {\n headers = {};\n const pairs = process.env.OTEL_EXPORTER_OTLP_HEADERS.split(',');\n for (const pair of pairs) {\n const [key, value] = pair.split('=');\n if (key && value) {\n headers[key.trim()] = value.trim();\n }\n }\n}\n\n// Initialize autotel\ninit({\n service,\n endpoint,\n headers,\n});\n\n// Log initialization (only in development)\nif (process.env.NODE_ENV === 'development' || process.env.AUTOTEL_DEBUG) {\n console.log('[autotel-tanstack] Auto-initialized with:', {\n service,\n endpoint: endpoint || '(not configured)',\n hasHeaders: !!headers,\n });\n}\n\n// Re-export middleware for convenience\nexport { tracingMiddleware, functionTracingMiddleware } from './middleware';\nexport { traceServerFn } from './server-functions';\nexport { traceLoader, traceBeforeLoad } from './loaders';\n\n/**\n * Check if auto-instrumentation is active\n */\nexport function isAutoInstrumentationActive(): boolean {\n return true;\n}\n\n/**\n * Get the configured service name\n */\nexport function getServiceName(): string {\n return service;\n}\n\n/**\n * Get the configured endpoint\n */\nexport function getEndpoint(): string | undefined {\n return endpoint;\n}\n"]}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser stub for context module
|
|
3
|
+
*
|
|
4
|
+
* In browser environments, context propagation is not needed.
|
|
5
|
+
* These functions return empty/default values.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Type representing values that can be used to initialize Headers
|
|
9
|
+
*/
|
|
10
|
+
type HeadersInitType = Headers | Record<string, string> | [string, string][];
|
|
11
|
+
/**
|
|
12
|
+
* Browser stub: Returns root context (no parent)
|
|
13
|
+
*/
|
|
14
|
+
declare function extractContextFromRequest(_request: Request): unknown;
|
|
15
|
+
/**
|
|
16
|
+
* Browser stub: Returns headers unchanged
|
|
17
|
+
*/
|
|
18
|
+
declare function injectContextToHeaders(headers: Headers, ctx?: unknown): Headers;
|
|
19
|
+
/**
|
|
20
|
+
* Browser stub: Create headers with optional initial values
|
|
21
|
+
*/
|
|
22
|
+
declare function createTracedHeaders(existingHeaders?: HeadersInitType, ctx?: unknown): Headers;
|
|
23
|
+
/**
|
|
24
|
+
* Browser stub: Run function and return result
|
|
25
|
+
*/
|
|
26
|
+
declare function runInContext<T>(parentContext: unknown, fn: () => T): T;
|
|
27
|
+
/**
|
|
28
|
+
* Browser stub: Returns empty context object
|
|
29
|
+
*/
|
|
30
|
+
declare function getActiveContext(): unknown;
|
|
31
|
+
/**
|
|
32
|
+
* Browser stub: Returns empty string
|
|
33
|
+
*/
|
|
34
|
+
declare function getTraceParent(): string;
|
|
35
|
+
/**
|
|
36
|
+
* Browser stub: Returns empty string
|
|
37
|
+
*/
|
|
38
|
+
declare function getTraceState(): string;
|
|
39
|
+
/**
|
|
40
|
+
* Browser stub: Returns undefined
|
|
41
|
+
*/
|
|
42
|
+
declare function getCurrentTraceId(): string | undefined;
|
|
43
|
+
/**
|
|
44
|
+
* Browser stub: Returns undefined
|
|
45
|
+
*/
|
|
46
|
+
declare function getCurrentSpanId(): string | undefined;
|
|
47
|
+
|
|
48
|
+
export { type HeadersInitType, createTracedHeaders, extractContextFromRequest, getActiveContext, getCurrentSpanId, getCurrentTraceId, getTraceParent, getTraceState, injectContextToHeaders, runInContext };
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { createTracedHeaders, extractContextFromRequest, getActiveContext, getCurrentSpanId, getCurrentTraceId, getTraceParent, getTraceState, injectContextToHeaders, runInContext } from '../chunk-DTZCOB4W.js';
|
|
2
|
+
//# sourceMappingURL=context.js.map
|
|
3
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"context.js"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { MiddlewareHandler } from './middleware.js';
|
|
2
|
+
import './types.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Browser stub for debug-headers module
|
|
6
|
+
*
|
|
7
|
+
* Debug headers are server-side only.
|
|
8
|
+
* In browser, this returns pass-through middleware.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Browser stub: Returns pass-through middleware
|
|
13
|
+
*/
|
|
14
|
+
declare function debugHeadersMiddleware<TContext = unknown>(): MiddlewareHandler<TContext>;
|
|
15
|
+
|
|
16
|
+
export { debugHeadersMiddleware };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"debug-headers.js"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser stub for error-reporting module
|
|
3
|
+
*
|
|
4
|
+
* Error reporting/collection only happens on the server.
|
|
5
|
+
* In browser, these are no-op functions.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Error entry structure (stub)
|
|
9
|
+
*/
|
|
10
|
+
interface ErrorEntry {
|
|
11
|
+
timestamp: string;
|
|
12
|
+
message: string;
|
|
13
|
+
stack?: string;
|
|
14
|
+
context?: Record<string, unknown>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Browser stub: No-op
|
|
18
|
+
*/
|
|
19
|
+
declare function reportError(error: Error, context?: Record<string, unknown>): void;
|
|
20
|
+
/**
|
|
21
|
+
* Browser stub: Returns empty array
|
|
22
|
+
*/
|
|
23
|
+
declare function getRecentErrors(limit?: number): ErrorEntry[];
|
|
24
|
+
/**
|
|
25
|
+
* Browser stub: No-op
|
|
26
|
+
*/
|
|
27
|
+
declare function clearErrors(): void;
|
|
28
|
+
/**
|
|
29
|
+
* Browser stub: Returns JSON Response with empty errors
|
|
30
|
+
*/
|
|
31
|
+
declare function createErrorReportingHandler(): () => Response;
|
|
32
|
+
/**
|
|
33
|
+
* Browser stub: Returns function unchanged
|
|
34
|
+
*/
|
|
35
|
+
declare function withErrorReporting<T extends (...args: unknown[]) => unknown>(fn: T, context?: Record<string, unknown>): T;
|
|
36
|
+
|
|
37
|
+
export { type ErrorEntry, clearErrors, createErrorReportingHandler, getRecentErrors, reportError, withErrorReporting };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"error-reporting.js"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { WrapStartHandlerConfig } from './types.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Browser stub for handlers module
|
|
5
|
+
*
|
|
6
|
+
* Handler wrapping only applies on the server side.
|
|
7
|
+
* In browser, we just return the handler unchanged.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Handler type
|
|
12
|
+
*/
|
|
13
|
+
type StartHandler<T = unknown> = (request: Request) => Promise<T>;
|
|
14
|
+
/**
|
|
15
|
+
* Browser stub: Returns the handler unchanged
|
|
16
|
+
*/
|
|
17
|
+
declare function wrapStartHandler<T>(config?: WrapStartHandlerConfig): (handler: StartHandler<T>) => StartHandler<T>;
|
|
18
|
+
|
|
19
|
+
export { type StartHandler, wrapStartHandler };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"handlers.js"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { Attributes, DEFAULT_CONFIG, SPAN_ATTRIBUTES, TanStackInstrumentationConfig, TraceLoaderConfig, TraceServerFnConfig, TracingMiddlewareConfig, WrapStartHandlerConfig } from './types.js';
|
|
2
|
+
export { createTracedRoute, traceBeforeLoad, traceLoader } from './loaders.js';
|
|
3
|
+
export { createTracedServerFnFactory, traceServerFn } from './server-functions.js';
|
|
4
|
+
export { MiddlewareHandler, createTracingMiddleware, functionTracingMiddleware, tracingMiddleware } from './middleware.js';
|
|
5
|
+
export { HeadersInitType, createTracedHeaders, extractContextFromRequest, getActiveContext, getCurrentSpanId, getCurrentTraceId, getTraceParent, getTraceState, injectContextToHeaders, runInContext } from './context.js';
|
|
6
|
+
export { StartHandler, wrapStartHandler } from './handlers.js';
|
|
7
|
+
export { MetricsData, createMetricsHandler, getMetrics, metricsCollector, recordError, recordTiming, resetMetrics } from './metrics.js';
|
|
8
|
+
export { ErrorEntry, clearErrors, createErrorReportingHandler, getRecentErrors, reportError, withErrorReporting } from './error-reporting.js';
|
|
9
|
+
export { debugHeadersMiddleware } from './debug-headers.js';
|
|
10
|
+
export { TestCollector, TestSpan, assertSpanCreated, assertSpanHasAttribute, createTestCollector } from './testing.js';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { createMetricsHandler, getMetrics, metricsCollector, recordError, recordTiming, resetMetrics } from '../chunk-UMEJU65Q.js';
|
|
2
|
+
export { clearErrors, createErrorReportingHandler, getRecentErrors, reportError, withErrorReporting } from '../chunk-HIQYW2HB.js';
|
|
3
|
+
export { DEFAULT_CONFIG, SPAN_ATTRIBUTES } from '../chunk-MFYOV2SF.js';
|
|
4
|
+
export { createTracingMiddleware, functionTracingMiddleware, tracingMiddleware } from '../chunk-4C7T5ZIM.js';
|
|
5
|
+
export { createTracedServerFnFactory, traceServerFn } from '../chunk-CSFIPJC2.js';
|
|
6
|
+
export { createTracedRoute, traceBeforeLoad, traceLoader } from '../chunk-MNP65ZX7.js';
|
|
7
|
+
export { createTracedHeaders, extractContextFromRequest, getActiveContext, getCurrentSpanId, getCurrentTraceId, getTraceParent, getTraceState, injectContextToHeaders, runInContext } from '../chunk-DTZCOB4W.js';
|
|
8
|
+
export { wrapStartHandler } from '../chunk-V3RO5N2M.js';
|
|
9
|
+
export { assertSpanCreated, assertSpanHasAttribute, createTestCollector } from '../chunk-Z3MJ3GZ6.js';
|
|
10
|
+
export { debugHeadersMiddleware } from '../chunk-JXO7H6KO.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { TraceLoaderConfig } from './types.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Browser stub for loaders module
|
|
5
|
+
*
|
|
6
|
+
* In browser environments, these functions are no-ops that just call the
|
|
7
|
+
* original functions without any tracing overhead.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Loader context type (compatible with TanStack router loader context)
|
|
12
|
+
*/
|
|
13
|
+
interface LoaderContext {
|
|
14
|
+
params?: Record<string, string>;
|
|
15
|
+
route?: {
|
|
16
|
+
id?: string;
|
|
17
|
+
};
|
|
18
|
+
[key: string]: unknown;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Browser stub: Returns the loader function unchanged
|
|
22
|
+
*/
|
|
23
|
+
declare function traceLoader<T extends (context: LoaderContext) => Promise<unknown>>(loaderFn: T, config?: TraceLoaderConfig): T;
|
|
24
|
+
/**
|
|
25
|
+
* Browser stub: Returns the beforeLoad function unchanged
|
|
26
|
+
*/
|
|
27
|
+
declare function traceBeforeLoad<T extends (context: LoaderContext) => Promise<unknown>>(beforeLoadFn: T, config?: TraceLoaderConfig): T;
|
|
28
|
+
/**
|
|
29
|
+
* Browser stub: Returns object with pass-through wrappers
|
|
30
|
+
*/
|
|
31
|
+
declare function createTracedRoute(routeId: string, config?: Omit<TraceLoaderConfig, 'name'>): {
|
|
32
|
+
loader<T extends (context: LoaderContext) => Promise<unknown>>(loaderFn: T): T;
|
|
33
|
+
beforeLoad<T extends (context: LoaderContext) => Promise<unknown>>(beforeLoadFn: T): T;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export { createTracedRoute, traceBeforeLoad, traceLoader };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"loaders.js"}
|