awaitly 1.35.0 → 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/dist/{duration.d.ts → di-BDlT7InM.d.cts} +15 -1
- package/dist/{duration.d.cts → di-BbFFfO8y.d.ts} +15 -1
- package/dist/errors-DtXvrCiO.d.cts +708 -0
- package/dist/errors-DtXvrCiO.d.ts +708 -0
- package/dist/index.cjs +4594 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1970 -141
- package/dist/index.d.ts +1970 -141
- package/dist/index.js +4398 -1
- package/dist/index.js.map +1 -1
- package/dist/result.cjs +641 -1
- package/dist/result.cjs.map +1 -1
- package/dist/result.d.cts +29 -4
- package/dist/result.d.ts +29 -4
- package/dist/result.js +561 -1
- package/dist/result.js.map +1 -1
- package/dist/testing.cjs +4202 -8
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.cts +2 -6
- package/dist/testing.d.ts +2 -6
- package/dist/testing.js +4154 -8
- package/dist/testing.js.map +1 -1
- package/dist/{run-entry-DGs0tySr.d.cts → types-B8NfNRGX.d.ts} +1078 -1502
- package/dist/{run-entry-BOuNyVoO.d.ts → types-BZ2f4MRR.d.cts} +1078 -1502
- package/dist/workflow.cjs +7096 -6
- package/dist/workflow.cjs.map +1 -1
- package/dist/workflow.d.cts +3346 -22
- package/dist/workflow.d.ts +3346 -22
- package/dist/workflow.js +6929 -6
- package/dist/workflow.js.map +1 -1
- package/package.json +3 -168
- package/dist/adapters.cjs +0 -7
- package/dist/adapters.cjs.map +0 -1
- package/dist/adapters.d.cts +0 -179
- package/dist/adapters.d.ts +0 -179
- package/dist/adapters.js +0 -7
- package/dist/adapters.js.map +0 -1
- package/dist/batch.cjs +0 -7
- package/dist/batch.cjs.map +0 -1
- package/dist/batch.d.cts +0 -200
- package/dist/batch.d.ts +0 -200
- package/dist/batch.js +0 -7
- package/dist/batch.js.map +0 -1
- package/dist/bind-deps.cjs +0 -2
- package/dist/bind-deps.cjs.map +0 -1
- package/dist/bind-deps.d.cts +0 -28
- package/dist/bind-deps.d.ts +0 -28
- package/dist/bind-deps.js +0 -2
- package/dist/bind-deps.js.map +0 -1
- package/dist/cache.cjs +0 -2
- package/dist/cache.cjs.map +0 -1
- package/dist/cache.d.cts +0 -269
- package/dist/cache.d.ts +0 -269
- package/dist/cache.js +0 -2
- package/dist/cache.js.map +0 -1
- package/dist/circuit-breaker.cjs +0 -7
- package/dist/circuit-breaker.cjs.map +0 -1
- package/dist/circuit-breaker.d.cts +0 -211
- package/dist/circuit-breaker.d.ts +0 -211
- package/dist/circuit-breaker.js +0 -7
- package/dist/circuit-breaker.js.map +0 -1
- package/dist/conditional.cjs +0 -2
- package/dist/conditional.cjs.map +0 -1
- package/dist/conditional.d.cts +0 -252
- package/dist/conditional.d.ts +0 -252
- package/dist/conditional.js +0 -2
- package/dist/conditional.js.map +0 -1
- package/dist/core.cjs +0 -7
- package/dist/core.cjs.map +0 -1
- package/dist/core.d.cts +0 -5
- package/dist/core.d.ts +0 -5
- package/dist/core.js +0 -7
- package/dist/core.js.map +0 -1
- package/dist/di-By77n4Fa.d.ts +0 -15
- package/dist/di-OJfsohf-.d.cts +0 -15
- package/dist/diagnostics.cjs +0 -8
- package/dist/diagnostics.cjs.map +0 -1
- package/dist/diagnostics.d.cts +0 -68
- package/dist/diagnostics.d.ts +0 -68
- package/dist/diagnostics.js +0 -8
- package/dist/diagnostics.js.map +0 -1
- package/dist/durable.cjs +0 -11
- package/dist/durable.cjs.map +0 -1
- package/dist/durable.d.cts +0 -9
- package/dist/durable.d.ts +0 -9
- package/dist/durable.js +0 -11
- package/dist/durable.js.map +0 -1
- package/dist/duration.cjs +0 -2
- package/dist/duration.cjs.map +0 -1
- package/dist/duration.js +0 -2
- package/dist/duration.js.map +0 -1
- package/dist/engine.cjs +0 -11
- package/dist/engine.cjs.map +0 -1
- package/dist/engine.d.cts +0 -115
- package/dist/engine.d.ts +0 -115
- package/dist/engine.js +0 -11
- package/dist/engine.js.map +0 -1
- package/dist/errors.cjs +0 -2
- package/dist/errors.cjs.map +0 -1
- package/dist/errors.d.cts +0 -361
- package/dist/errors.d.ts +0 -361
- package/dist/errors.js +0 -2
- package/dist/errors.js.map +0 -1
- package/dist/fetch.cjs +0 -7
- package/dist/fetch.cjs.map +0 -1
- package/dist/fetch.d.cts +0 -86
- package/dist/fetch.d.ts +0 -86
- package/dist/fetch.js +0 -7
- package/dist/fetch.js.map +0 -1
- package/dist/flow.cjs +0 -7
- package/dist/flow.cjs.map +0 -1
- package/dist/flow.d.cts +0 -163
- package/dist/flow.d.ts +0 -163
- package/dist/flow.js +0 -7
- package/dist/flow.js.map +0 -1
- package/dist/functional.cjs +0 -2
- package/dist/functional.cjs.map +0 -1
- package/dist/functional.d.cts +0 -444
- package/dist/functional.d.ts +0 -444
- package/dist/functional.js +0 -2
- package/dist/functional.js.map +0 -1
- package/dist/guards-4sV7mTqj.d.cts +0 -72
- package/dist/guards-BIX05ALH.d.ts +0 -72
- package/dist/hitl-DFn4Xa_l.d.cts +0 -468
- package/dist/hitl-DU5VpKq7.d.ts +0 -468
- package/dist/hitl.cjs +0 -7
- package/dist/hitl.cjs.map +0 -1
- package/dist/hitl.d.cts +0 -442
- package/dist/hitl.d.ts +0 -442
- package/dist/hitl.js +0 -7
- package/dist/hitl.js.map +0 -1
- package/dist/index-CnvBryQB.d.ts +0 -417
- package/dist/index-DEZEf8Fs.d.cts +0 -417
- package/dist/match-entry-DjI2bLpD.d.cts +0 -209
- package/dist/match-entry-DjI2bLpD.d.ts +0 -209
- package/dist/match.cjs +0 -2
- package/dist/match.cjs.map +0 -1
- package/dist/match.d.cts +0 -1
- package/dist/match.d.ts +0 -1
- package/dist/match.js +0 -2
- package/dist/match.js.map +0 -1
- package/dist/otel.cjs +0 -2
- package/dist/otel.cjs.map +0 -1
- package/dist/otel.d.cts +0 -188
- package/dist/otel.d.ts +0 -188
- package/dist/otel.js +0 -2
- package/dist/otel.js.map +0 -1
- package/dist/persistence-entry-B-8PjnSR.d.cts +0 -831
- package/dist/persistence-entry-D8zRkLiT.d.ts +0 -831
- package/dist/persistence.cjs +0 -2
- package/dist/persistence.cjs.map +0 -1
- package/dist/persistence.d.cts +0 -7
- package/dist/persistence.d.ts +0 -7
- package/dist/persistence.js +0 -2
- package/dist/persistence.js.map +0 -1
- package/dist/policies.cjs +0 -2
- package/dist/policies.cjs.map +0 -1
- package/dist/policies.d.cts +0 -379
- package/dist/policies.d.ts +0 -379
- package/dist/policies.js +0 -2
- package/dist/policies.js.map +0 -1
- package/dist/ratelimit.cjs +0 -7
- package/dist/ratelimit.cjs.map +0 -1
- package/dist/ratelimit.d.cts +0 -458
- package/dist/ratelimit.d.ts +0 -458
- package/dist/ratelimit.js +0 -7
- package/dist/ratelimit.js.map +0 -1
- package/dist/reliability.cjs +0 -11
- package/dist/reliability.cjs.map +0 -1
- package/dist/reliability.d.cts +0 -11
- package/dist/reliability.d.ts +0 -11
- package/dist/reliability.js +0 -11
- package/dist/reliability.js.map +0 -1
- package/dist/resolver.cjs +0 -7
- package/dist/resolver.cjs.map +0 -1
- package/dist/resolver.d.cts +0 -68
- package/dist/resolver.d.ts +0 -68
- package/dist/resolver.js +0 -7
- package/dist/resolver.js.map +0 -1
- package/dist/resource.cjs +0 -7
- package/dist/resource.cjs.map +0 -1
- package/dist/resource.d.cts +0 -174
- package/dist/resource.d.ts +0 -174
- package/dist/resource.js +0 -7
- package/dist/resource.js.map +0 -1
- package/dist/result/retry.cjs +0 -2
- package/dist/result/retry.cjs.map +0 -1
- package/dist/result/retry.d.cts +0 -70
- package/dist/result/retry.d.ts +0 -70
- package/dist/result/retry.js +0 -2
- package/dist/result/retry.js.map +0 -1
- package/dist/retry.cjs +0 -2
- package/dist/retry.cjs.map +0 -1
- package/dist/retry.d.cts +0 -388
- package/dist/retry.d.ts +0 -388
- package/dist/retry.js +0 -2
- package/dist/retry.js.map +0 -1
- package/dist/run.cjs +0 -7
- package/dist/run.cjs.map +0 -1
- package/dist/run.d.cts +0 -4
- package/dist/run.d.ts +0 -4
- package/dist/run.js +0 -7
- package/dist/run.js.map +0 -1
- package/dist/saga.cjs +0 -11
- package/dist/saga.cjs.map +0 -1
- package/dist/saga.d.cts +0 -164
- package/dist/saga.d.ts +0 -164
- package/dist/saga.js +0 -11
- package/dist/saga.js.map +0 -1
- package/dist/singleflight.cjs +0 -2
- package/dist/singleflight.cjs.map +0 -1
- package/dist/singleflight.d.cts +0 -145
- package/dist/singleflight.d.ts +0 -145
- package/dist/singleflight.js +0 -2
- package/dist/singleflight.js.map +0 -1
- package/dist/slugs.cjs +0 -2
- package/dist/slugs.cjs.map +0 -1
- package/dist/slugs.d.cts +0 -67
- package/dist/slugs.d.ts +0 -67
- package/dist/slugs.js +0 -2
- package/dist/slugs.js.map +0 -1
- package/dist/streaming.cjs +0 -9
- package/dist/streaming.cjs.map +0 -1
- package/dist/streaming.d.cts +0 -596
- package/dist/streaming.d.ts +0 -596
- package/dist/streaming.js +0 -9
- package/dist/streaming.js.map +0 -1
- package/dist/tagged-error.cjs +0 -2
- package/dist/tagged-error.cjs.map +0 -1
- package/dist/tagged-error.d.cts +0 -275
- package/dist/tagged-error.d.ts +0 -275
- package/dist/tagged-error.js +0 -2
- package/dist/tagged-error.js.map +0 -1
- package/dist/types-BziYHFkD.d.ts +0 -323
- package/dist/types-C5jLEUqY.d.cts +0 -323
- package/dist/webhook.cjs +0 -7
- package/dist/webhook.cjs.map +0 -1
- package/dist/webhook.d.cts +0 -499
- package/dist/webhook.d.ts +0 -499
- package/dist/webhook.js +0 -7
- package/dist/webhook.js.map +0 -1
package/dist/otel.d.ts
DELETED
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
import { ae as WorkflowEvent } from './run-entry-BOuNyVoO.js';
|
|
2
|
-
import './errors.js';
|
|
3
|
-
import './tagged-error.js';
|
|
4
|
-
import './slugs.js';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Autotel Integration
|
|
8
|
-
*
|
|
9
|
-
* First-class OpenTelemetry spans and metrics from the workflow event stream
|
|
10
|
-
* using the autotel library.
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* ```typescript
|
|
14
|
-
* import { createAutotelAdapter } from 'awaitly/autotel';
|
|
15
|
-
* import { init } from 'autotel';
|
|
16
|
-
*
|
|
17
|
-
* // Initialize autotel
|
|
18
|
-
* init({ service: 'checkout-api' });
|
|
19
|
-
*
|
|
20
|
-
* // Create adapter
|
|
21
|
-
* const otel = createAutotelAdapter({ serviceName: 'checkout' });
|
|
22
|
-
*
|
|
23
|
-
* // Use with workflow
|
|
24
|
-
* const workflow = createWorkflow(deps, { onEvent: otel.handleEvent });
|
|
25
|
-
*
|
|
26
|
-
* // Automatic spans: workflow > step > retry attempts
|
|
27
|
-
* // Automatic metrics: step_duration, retry_count, error_rate
|
|
28
|
-
* ```
|
|
29
|
-
*/
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Configuration for the autotel adapter.
|
|
33
|
-
*/
|
|
34
|
-
interface AutotelAdapterConfig {
|
|
35
|
-
/**
|
|
36
|
-
* Service name for spans (used as prefix).
|
|
37
|
-
*/
|
|
38
|
-
serviceName?: string;
|
|
39
|
-
/**
|
|
40
|
-
* Whether to create spans for each step.
|
|
41
|
-
* @default true
|
|
42
|
-
*/
|
|
43
|
-
createStepSpans?: boolean;
|
|
44
|
-
/**
|
|
45
|
-
* Whether to record metrics for steps.
|
|
46
|
-
* @default true
|
|
47
|
-
*/
|
|
48
|
-
recordMetrics?: boolean;
|
|
49
|
-
/**
|
|
50
|
-
* Custom attributes to add to all spans.
|
|
51
|
-
*/
|
|
52
|
-
defaultAttributes?: Record<string, string | number | boolean>;
|
|
53
|
-
/**
|
|
54
|
-
* Whether to record retry events as span events.
|
|
55
|
-
* @default true
|
|
56
|
-
*/
|
|
57
|
-
recordRetryEvents?: boolean;
|
|
58
|
-
/**
|
|
59
|
-
* Whether to mark workflow errors as span errors.
|
|
60
|
-
* @default true
|
|
61
|
-
*/
|
|
62
|
-
markErrorsOnSpan?: boolean;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Metrics collected by the adapter.
|
|
66
|
-
*/
|
|
67
|
-
interface AutotelMetrics {
|
|
68
|
-
stepDurations: Array<{
|
|
69
|
-
name: string;
|
|
70
|
-
durationMs: number;
|
|
71
|
-
success: boolean;
|
|
72
|
-
attributes?: Record<string, string | number | boolean>;
|
|
73
|
-
}>;
|
|
74
|
-
retryCount: number;
|
|
75
|
-
errorCount: number;
|
|
76
|
-
cacheHits: number;
|
|
77
|
-
cacheMisses: number;
|
|
78
|
-
/** Default attributes applied to all metrics */
|
|
79
|
-
defaultAttributes: Record<string, string | number | boolean>;
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Autotel adapter interface.
|
|
83
|
-
*/
|
|
84
|
-
interface AutotelAdapter {
|
|
85
|
-
/**
|
|
86
|
-
* Handle workflow events (pass to onEvent option).
|
|
87
|
-
*/
|
|
88
|
-
handleEvent: (event: WorkflowEvent<unknown>) => void;
|
|
89
|
-
/**
|
|
90
|
-
* Get current active spans count (for debugging).
|
|
91
|
-
*/
|
|
92
|
-
getActiveSpansCount: () => {
|
|
93
|
-
workflows: number;
|
|
94
|
-
steps: number;
|
|
95
|
-
};
|
|
96
|
-
/**
|
|
97
|
-
* Get collected metrics.
|
|
98
|
-
*/
|
|
99
|
-
getMetrics: () => AutotelMetrics;
|
|
100
|
-
/**
|
|
101
|
-
* Reset adapter state.
|
|
102
|
-
*/
|
|
103
|
-
reset: () => void;
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Create an autotel adapter for workflow observability.
|
|
107
|
-
*
|
|
108
|
-
* This adapter translates workflow events into metrics and tracking data.
|
|
109
|
-
* When autotel is installed and initialized, it will also create OpenTelemetry spans.
|
|
110
|
-
*
|
|
111
|
-
* @param config - Adapter configuration
|
|
112
|
-
* @returns An AutotelAdapter instance
|
|
113
|
-
*
|
|
114
|
-
* @example
|
|
115
|
-
* ```typescript
|
|
116
|
-
* import { createAutotelAdapter } from 'awaitly/autotel';
|
|
117
|
-
*
|
|
118
|
-
* const otel = createAutotelAdapter({ serviceName: 'checkout' });
|
|
119
|
-
*
|
|
120
|
-
* const workflow = createWorkflow(deps, {
|
|
121
|
-
* onEvent: otel.handleEvent,
|
|
122
|
-
* });
|
|
123
|
-
* ```
|
|
124
|
-
*/
|
|
125
|
-
declare function createAutotelAdapter(config?: AutotelAdapterConfig): AutotelAdapter;
|
|
126
|
-
/**
|
|
127
|
-
* Create an event handler that integrates with autotel's trace() function.
|
|
128
|
-
*
|
|
129
|
-
* This is a higher-level integration that creates actual OpenTelemetry spans
|
|
130
|
-
* for each workflow and step when autotel is initialized.
|
|
131
|
-
*
|
|
132
|
-
* @param options - Configuration options
|
|
133
|
-
* @returns An event handler function
|
|
134
|
-
*
|
|
135
|
-
* @example
|
|
136
|
-
* ```typescript
|
|
137
|
-
* import { createAutotelEventHandler } from 'awaitly/autotel';
|
|
138
|
-
* import { init } from 'autotel';
|
|
139
|
-
*
|
|
140
|
-
* init({ service: 'checkout-api' });
|
|
141
|
-
*
|
|
142
|
-
* const handler = createAutotelEventHandler({ serviceName: 'checkout' });
|
|
143
|
-
*
|
|
144
|
-
* const workflow = createWorkflow(deps, {
|
|
145
|
-
* onEvent: handler,
|
|
146
|
-
* });
|
|
147
|
-
* ```
|
|
148
|
-
*/
|
|
149
|
-
declare function createAutotelEventHandler(options?: {
|
|
150
|
-
serviceName?: string;
|
|
151
|
-
includeStepDetails?: boolean;
|
|
152
|
-
}): (event: WorkflowEvent<unknown>) => void;
|
|
153
|
-
/**
|
|
154
|
-
* Wrapper type for autotel trace function.
|
|
155
|
-
* Use this when you want to explicitly type the autotel integration.
|
|
156
|
-
*/
|
|
157
|
-
type AutotelTraceFn = <T>(name: string, fn: (ctx: {
|
|
158
|
-
setAttribute: (key: string, value: unknown) => void;
|
|
159
|
-
}) => T | Promise<T>) => T | Promise<T>;
|
|
160
|
-
/**
|
|
161
|
-
* Create a workflow wrapper that adds autotel tracing.
|
|
162
|
-
*
|
|
163
|
-
* This creates a higher-order function that wraps workflow execution
|
|
164
|
-
* in an autotel trace span.
|
|
165
|
-
*
|
|
166
|
-
* @param traceFn - The autotel trace function
|
|
167
|
-
* @param options - Wrapper options
|
|
168
|
-
* @returns A workflow wrapper function
|
|
169
|
-
*
|
|
170
|
-
* @example
|
|
171
|
-
* ```typescript
|
|
172
|
-
* import { trace } from 'autotel';
|
|
173
|
-
* import { withAutotelTracing } from 'awaitly/autotel';
|
|
174
|
-
*
|
|
175
|
-
* const traced = withAutotelTracing(trace, { serviceName: 'checkout' });
|
|
176
|
-
*
|
|
177
|
-
* const result = await traced('process-order', async () => {
|
|
178
|
-
* return workflow(async ({ step }) => {
|
|
179
|
-
* // ... workflow logic
|
|
180
|
-
* });
|
|
181
|
-
* });
|
|
182
|
-
* ```
|
|
183
|
-
*/
|
|
184
|
-
declare function withAutotelTracing(traceFn: AutotelTraceFn, options?: {
|
|
185
|
-
serviceName?: string;
|
|
186
|
-
}): <T>(name: string, fn: () => T | Promise<T>, attributes?: Record<string, string | number | boolean>) => Promise<T>;
|
|
187
|
-
|
|
188
|
-
export { type AutotelAdapter, type AutotelAdapterConfig, type AutotelMetrics, type AutotelTraceFn, createAutotelAdapter, createAutotelEventHandler, withAutotelTracing };
|
package/dist/otel.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
function m(l={}){let{serviceName:c="workflow",createStepSpans:i=!0,recordMetrics:e=!0,defaultAttributes:s={},recordRetryEvents:u=!0,markErrorsOnSpan:f=!0}=l,o={workflows:new Map,steps:new Map},r={stepDurations:[],retryCount:0,errorCount:0,cacheHits:0,cacheMisses:0,defaultAttributes:s};function d(t,n){return t?`${c}.${t}`:n?`${c}.step.${n}`:`${c}.step`}function w(t){switch(t.type){case"workflow_start":o.workflows.set(t.workflowId,{workflowId:t.workflowId,startTime:t.ts});break;case"workflow_success":case"workflow_error":o.workflows.get(t.workflowId)&&o.workflows.delete(t.workflowId),t.type==="workflow_error"&&f&&r.errorCount++;break;case"step_start":if(i){let n=t.stepId;o.steps.set(n,{workflowId:t.workflowId,stepId:n,stepKey:t.stepKey,name:t.name,startTime:t.ts,metadata:t.metadata})}break;case"step_success":case"step_error":if(i){let n=t.stepId,a=o.steps.get(n);if(a){if(o.steps.delete(n),e){let p={...Object.keys(s).length>0?s:{}};a.metadata&&(a.metadata.domain&&(p["step.domain"]=a.metadata.domain),a.metadata.owner&&(p["step.owner"]=a.metadata.owner),a.metadata.intent&&a.metadata.intent.length<=100&&(p["step.intent"]=a.metadata.intent)),t.type==="step_error"&&t.diagnostics&&(t.diagnostics.classification?.severity&&(p["error.severity"]=t.diagnostics.classification.severity),t.diagnostics.classification?.retryable!==void 0&&(p["error.retryable"]=t.diagnostics.classification.retryable)),r.stepDurations.push({name:d(a.name,a.stepKey),durationMs:t.durationMs,success:t.type==="step_success",attributes:Object.keys(p).length>0?p:void 0})}t.type==="step_error"&&f&&r.errorCount++}}break;case"step_retry":u&&r.retryCount++;break;case"step_cache_hit":r.cacheHits++;break;case"step_cache_miss":r.cacheMisses++;break;default:break}}return{handleEvent:w,getActiveSpansCount(){return{workflows:o.workflows.size,steps:o.steps.size}},getMetrics(){return{...r,stepDurations:[...r.stepDurations]}},reset(){o.workflows.clear(),o.steps.clear(),r.stepDurations.length=0,r.retryCount=0,r.errorCount=0,r.cacheHits=0,r.cacheMisses=0}}}function k(l){let{serviceName:c="workflow",includeStepDetails:i=!0}=l??{};return e=>{if(process.env.AUTOTEL_DEBUG==="true"){let s=`[${c}]`;switch(e.type){case"workflow_start":console.log(`${s} Workflow started: ${e.workflowId}`);break;case"workflow_success":console.log(`${s} Workflow success: ${e.workflowId} (${e.durationMs}ms)`);break;case"workflow_error":console.log(`${s} Workflow error: ${e.workflowId}`,e.error);break;case"step_start":i&&console.log(`${s} Step started: ${e.name??e.stepKey??e.stepId}`);break;case"step_success":i&&console.log(`${s} Step success: ${e.name??e.stepKey??e.stepId} (${e.durationMs}ms)`);break;case"step_error":i&&console.log(`${s} Step error: ${e.name??e.stepKey??e.stepId}`,e.error);break;case"step_retry":console.log(`${s} Step retry: ${e.name??e.stepKey??e.stepId} (attempt ${e.attempt}/${e.maxAttempts})`);break}}}}function g(l,c){let{serviceName:i="workflow"}=c??{};return async(e,s,u)=>{let f=`${i}.${e}`;return l(f,async o=>{if(u)for(let[r,d]of Object.entries(u))o.setAttribute(r,d);return s()})}}export{m as createAutotelAdapter,k as createAutotelEventHandler,g as withAutotelTracing};
|
|
2
|
-
//# sourceMappingURL=otel.js.map
|
package/dist/otel.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/autotel.ts"],"sourcesContent":["/**\n * Autotel Integration\n *\n * First-class OpenTelemetry spans and metrics from the workflow event stream\n * using the autotel library.\n *\n * @example\n * ```typescript\n * import { createAutotelAdapter } from 'awaitly/autotel';\n * import { init } from 'autotel';\n *\n * // Initialize autotel\n * init({ service: 'checkout-api' });\n *\n * // Create adapter\n * const otel = createAutotelAdapter({ serviceName: 'checkout' });\n *\n * // Use with workflow\n * const workflow = createWorkflow(deps, { onEvent: otel.handleEvent });\n *\n * // Automatic spans: workflow > step > retry attempts\n * // Automatic metrics: step_duration, retry_count, error_rate\n * ```\n */\n\nimport type { WorkflowEvent, StepMetadata } from \"./core\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Configuration for the autotel adapter.\n */\nexport interface AutotelAdapterConfig {\n /**\n * Service name for spans (used as prefix).\n */\n serviceName?: string;\n\n /**\n * Whether to create spans for each step.\n * @default true\n */\n createStepSpans?: boolean;\n\n /**\n * Whether to record metrics for steps.\n * @default true\n */\n recordMetrics?: boolean;\n\n /**\n * Custom attributes to add to all spans.\n */\n defaultAttributes?: Record<string, string | number | boolean>;\n\n /**\n * Whether to record retry events as span events.\n * @default true\n */\n recordRetryEvents?: boolean;\n\n /**\n * Whether to mark workflow errors as span errors.\n * @default true\n */\n markErrorsOnSpan?: boolean;\n}\n\n/**\n * Span tracking info.\n */\ninterface SpanInfo {\n workflowId: string;\n stepId?: string;\n stepKey?: string;\n name?: string;\n startTime: number;\n metadata?: StepMetadata;\n}\n\n/**\n * Active spans tracking.\n */\ninterface ActiveSpans {\n workflows: Map<string, SpanInfo>;\n steps: Map<string, SpanInfo>;\n}\n\n/**\n * Metrics collected by the adapter.\n */\nexport interface AutotelMetrics {\n stepDurations: Array<{ \n name: string; \n durationMs: number; \n success: boolean;\n attributes?: Record<string, string | number | boolean>;\n }>;\n retryCount: number;\n errorCount: number;\n cacheHits: number;\n cacheMisses: number;\n /** Default attributes applied to all metrics */\n defaultAttributes: Record<string, string | number | boolean>;\n}\n\n/**\n * Autotel adapter interface.\n */\nexport interface AutotelAdapter {\n /**\n * Handle workflow events (pass to onEvent option).\n */\n handleEvent: (event: WorkflowEvent<unknown>) => void;\n\n /**\n * Get current active spans count (for debugging).\n */\n getActiveSpansCount: () => { workflows: number; steps: number };\n\n /**\n * Get collected metrics.\n */\n getMetrics: () => AutotelMetrics;\n\n /**\n * Reset adapter state.\n */\n reset: () => void;\n}\n\n// =============================================================================\n// Implementation\n// =============================================================================\n\n/**\n * Create an autotel adapter for workflow observability.\n *\n * This adapter translates workflow events into metrics and tracking data.\n * When autotel is installed and initialized, it will also create OpenTelemetry spans.\n *\n * @param config - Adapter configuration\n * @returns An AutotelAdapter instance\n *\n * @example\n * ```typescript\n * import { createAutotelAdapter } from 'awaitly/autotel';\n *\n * const otel = createAutotelAdapter({ serviceName: 'checkout' });\n *\n * const workflow = createWorkflow(deps, {\n * onEvent: otel.handleEvent,\n * });\n * ```\n */\nexport function createAutotelAdapter(\n config: AutotelAdapterConfig = {}\n): AutotelAdapter {\n const {\n serviceName = \"workflow\",\n createStepSpans = true,\n recordMetrics = true,\n defaultAttributes = {},\n recordRetryEvents = true,\n markErrorsOnSpan = true,\n } = config;\n\n // Track active spans\n const activeSpans: ActiveSpans = {\n workflows: new Map(),\n steps: new Map(),\n };\n\n // Metrics counters\n const metrics: AutotelMetrics = {\n stepDurations: [],\n retryCount: 0,\n errorCount: 0,\n cacheHits: 0,\n cacheMisses: 0,\n defaultAttributes,\n };\n\n /**\n * Get span name for a step.\n */\n function getSpanName(name?: string, stepKey?: string): string {\n if (name) return `${serviceName}.${name}`;\n if (stepKey) return `${serviceName}.step.${stepKey}`;\n return `${serviceName}.step`;\n }\n\n /**\n * Handle workflow event.\n */\n function handleEvent(event: WorkflowEvent<unknown>): void {\n switch (event.type) {\n case \"workflow_start\":\n activeSpans.workflows.set(event.workflowId, {\n workflowId: event.workflowId,\n startTime: event.ts,\n });\n break;\n\n case \"workflow_success\":\n case \"workflow_error\":\n {\n const span = activeSpans.workflows.get(event.workflowId);\n if (span) {\n activeSpans.workflows.delete(event.workflowId);\n }\n\n if (event.type === \"workflow_error\" && markErrorsOnSpan) {\n metrics.errorCount++;\n }\n }\n break;\n\n case \"step_start\":\n if (createStepSpans) {\n const stepId = event.stepId;\n activeSpans.steps.set(stepId, {\n workflowId: event.workflowId,\n stepId,\n stepKey: event.stepKey,\n name: event.name,\n startTime: event.ts,\n metadata: event.metadata,\n });\n }\n break;\n\n case \"step_success\":\n case \"step_error\":\n if (createStepSpans) {\n const stepId = event.stepId;\n const span = activeSpans.steps.get(stepId);\n if (span) {\n activeSpans.steps.delete(stepId);\n\n if (recordMetrics) {\n // Build attributes: default + low-cardinality metadata\n const attrs: Record<string, string | number | boolean> = {\n ...(Object.keys(defaultAttributes).length > 0 ? defaultAttributes : {}),\n };\n\n // Add low-cardinality metadata attributes (cardinality guardrails)\n if (span.metadata) {\n if (span.metadata.domain) attrs[\"step.domain\"] = span.metadata.domain;\n if (span.metadata.owner) attrs[\"step.owner\"] = span.metadata.owner;\n // step.intent only if <= 100 chars (cardinality guard)\n if (span.metadata.intent && span.metadata.intent.length <= 100) {\n attrs[\"step.intent\"] = span.metadata.intent;\n }\n // Omit step.tags and step.calls from span attributes (high cardinality)\n }\n\n // Add error diagnostics attributes\n if (event.type === \"step_error\" && event.diagnostics) {\n if (event.diagnostics.classification?.severity) {\n attrs[\"error.severity\"] = event.diagnostics.classification.severity;\n }\n if (event.diagnostics.classification?.retryable !== undefined) {\n attrs[\"error.retryable\"] = event.diagnostics.classification.retryable;\n }\n }\n\n metrics.stepDurations.push({\n name: getSpanName(span.name, span.stepKey),\n durationMs: event.durationMs,\n success: event.type === \"step_success\",\n attributes: Object.keys(attrs).length > 0 ? attrs : undefined,\n });\n }\n\n if (event.type === \"step_error\" && markErrorsOnSpan) {\n metrics.errorCount++;\n }\n }\n }\n break;\n\n case \"step_retry\":\n if (recordRetryEvents) {\n metrics.retryCount++;\n }\n break;\n\n case \"step_cache_hit\":\n metrics.cacheHits++;\n break;\n\n case \"step_cache_miss\":\n metrics.cacheMisses++;\n break;\n\n default:\n // Other events (timeout, etc.) - can be extended\n break;\n }\n }\n\n return {\n handleEvent,\n\n getActiveSpansCount() {\n return {\n workflows: activeSpans.workflows.size,\n steps: activeSpans.steps.size,\n };\n },\n\n getMetrics() {\n return { ...metrics, stepDurations: [...metrics.stepDurations] };\n },\n\n reset() {\n activeSpans.workflows.clear();\n activeSpans.steps.clear();\n metrics.stepDurations.length = 0;\n metrics.retryCount = 0;\n metrics.errorCount = 0;\n metrics.cacheHits = 0;\n metrics.cacheMisses = 0;\n // Note: defaultAttributes are preserved across resets\n },\n };\n}\n\n/**\n * Create an event handler that integrates with autotel's trace() function.\n *\n * This is a higher-level integration that creates actual OpenTelemetry spans\n * for each workflow and step when autotel is initialized.\n *\n * @param options - Configuration options\n * @returns An event handler function\n *\n * @example\n * ```typescript\n * import { createAutotelEventHandler } from 'awaitly/autotel';\n * import { init } from 'autotel';\n *\n * init({ service: 'checkout-api' });\n *\n * const handler = createAutotelEventHandler({ serviceName: 'checkout' });\n *\n * const workflow = createWorkflow(deps, {\n * onEvent: handler,\n * });\n * ```\n */\nexport function createAutotelEventHandler(options?: {\n serviceName?: string;\n includeStepDetails?: boolean;\n}): (event: WorkflowEvent<unknown>) => void {\n const { serviceName = \"workflow\", includeStepDetails = true } = options ?? {};\n\n // This is a simple pass-through handler\n // The actual autotel integration happens via the trace() wrapper\n return (event: WorkflowEvent<unknown>) => {\n // Log events for debugging when AUTOTEL_DEBUG is set\n if (process.env.AUTOTEL_DEBUG === \"true\") {\n const prefix = `[${serviceName}]`;\n switch (event.type) {\n case \"workflow_start\":\n console.log(`${prefix} Workflow started: ${event.workflowId}`);\n break;\n case \"workflow_success\":\n console.log(`${prefix} Workflow success: ${event.workflowId} (${event.durationMs}ms)`);\n break;\n case \"workflow_error\":\n console.log(`${prefix} Workflow error: ${event.workflowId}`, event.error);\n break;\n case \"step_start\":\n if (includeStepDetails) {\n console.log(`${prefix} Step started: ${event.name ?? event.stepKey ?? event.stepId}`);\n }\n break;\n case \"step_success\":\n if (includeStepDetails) {\n console.log(`${prefix} Step success: ${event.name ?? event.stepKey ?? event.stepId} (${event.durationMs}ms)`);\n }\n break;\n case \"step_error\":\n if (includeStepDetails) {\n console.log(`${prefix} Step error: ${event.name ?? event.stepKey ?? event.stepId}`, event.error);\n }\n break;\n case \"step_retry\":\n console.log(`${prefix} Step retry: ${event.name ?? event.stepKey ?? event.stepId} (attempt ${event.attempt}/${event.maxAttempts})`);\n break;\n }\n }\n };\n}\n\n/**\n * Wrapper type for autotel trace function.\n * Use this when you want to explicitly type the autotel integration.\n */\nexport type AutotelTraceFn = <T>(\n name: string,\n fn: (ctx: { setAttribute: (key: string, value: unknown) => void }) => T | Promise<T>\n) => T | Promise<T>;\n\n/**\n * Create a workflow wrapper that adds autotel tracing.\n *\n * This creates a higher-order function that wraps workflow execution\n * in an autotel trace span.\n *\n * @param traceFn - The autotel trace function\n * @param options - Wrapper options\n * @returns A workflow wrapper function\n *\n * @example\n * ```typescript\n * import { trace } from 'autotel';\n * import { withAutotelTracing } from 'awaitly/autotel';\n *\n * const traced = withAutotelTracing(trace, { serviceName: 'checkout' });\n *\n * const result = await traced('process-order', async () => {\n * return workflow(async ({ step }) => {\n * // ... workflow logic\n * });\n * });\n * ```\n */\nexport function withAutotelTracing(\n traceFn: AutotelTraceFn,\n options?: { serviceName?: string }\n): <T>(\n name: string,\n fn: () => T | Promise<T>,\n attributes?: Record<string, string | number | boolean>\n) => Promise<T> {\n const { serviceName = \"workflow\" } = options ?? {};\n\n return async <T>(\n name: string,\n fn: () => T | Promise<T>,\n attributes?: Record<string, string | number | boolean>\n ): Promise<T> => {\n const spanName = `${serviceName}.${name}`;\n return traceFn(spanName, async (ctx) => {\n if (attributes) {\n for (const [key, value] of Object.entries(attributes)) {\n ctx.setAttribute(key, value);\n }\n }\n return fn();\n }) as Promise<T>;\n };\n}\n"],"mappings":"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","names":["createAutotelAdapter","config","serviceName","createStepSpans","recordMetrics","defaultAttributes","recordRetryEvents","markErrorsOnSpan","activeSpans","metrics","getSpanName","name","stepKey","handleEvent","event","stepId","span","attrs","createAutotelEventHandler","options","includeStepDetails","prefix","withAutotelTracing","traceFn","fn","attributes","spanName","ctx","key","value"]}
|