@adobe-commerce/aio-toolkit 1.0.13 → 1.0.14
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/CHANGELOG.md +79 -0
- package/README.md +28 -9
- package/dist/index.d.mts +43 -16
- package/dist/index.d.ts +43 -16
- package/dist/index.js +1030 -166
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1034 -167
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,85 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [1.0.14] - 2026-01-20
|
|
9
|
+
|
|
10
|
+
### ✨ Features
|
|
11
|
+
|
|
12
|
+
- **feat(telemetry):** Enhanced telemetry instrumentation with conditional span access
|
|
13
|
+
- Added `Telemetry.getCurrentSpan()` method that accepts params and conditionally returns spans based on `ENABLE_TELEMETRY` flag
|
|
14
|
+
- Updated all action classes to pass params to `getCurrentSpan()` for conditional instrumentation
|
|
15
|
+
- Enables developers to access current OpenTelemetry span for custom instrumentation when telemetry is enabled
|
|
16
|
+
- Returns `undefined` when telemetry is disabled, allowing safe optional chaining patterns
|
|
17
|
+
|
|
18
|
+
### 🔧 Refactoring
|
|
19
|
+
|
|
20
|
+
- **refactor(telemetry):** Converted Telemetry class from static to instance methods
|
|
21
|
+
- Telemetry class now uses instance methods instead of static methods for better testability
|
|
22
|
+
- Added telemetry object to action context (`ctx.telemetry`) for easy access in action handlers
|
|
23
|
+
- Standardized parameter ordering across all action classes (params, ctx, logger)
|
|
24
|
+
- Updated JSDoc documentation with consistent examples showing telemetry usage
|
|
25
|
+
- Improved encapsulation and dependency injection patterns
|
|
26
|
+
|
|
27
|
+
### 📝 Technical Details
|
|
28
|
+
|
|
29
|
+
- Enhanced action classes with telemetry context:
|
|
30
|
+
- `RuntimeAction`: Added `ctx.telemetry` with access to current span and `instrument()` method
|
|
31
|
+
- `WebhookAction`: Added `ctx.telemetry` with access to current span and `instrument()` method
|
|
32
|
+
- `OpenwhiskAction`: Added `ctx.telemetry` with access to current span and `instrument()` method
|
|
33
|
+
- `EventConsumerAction`: Added `ctx.telemetry` with access to current span and `instrument()` method
|
|
34
|
+
- `GraphQlAction`: Added `ctx.telemetry` with access to current span and `instrument()` method
|
|
35
|
+
- Telemetry API methods:
|
|
36
|
+
- `getCurrentSpan(params?)`: Returns current OpenTelemetry span (conditional based on ENABLE_TELEMETRY)
|
|
37
|
+
- `instrument(spanName, fn)`: Wraps function with automatic span creation for custom instrumentation
|
|
38
|
+
- Achieved 100% test coverage for all framework action classes:
|
|
39
|
+
- RuntimeAction (100% statements/branches/functions/lines)
|
|
40
|
+
- Telemetry (100% statements/branches/functions/lines)
|
|
41
|
+
- WebhookAction (100% statements/branches/functions/lines)
|
|
42
|
+
- OpenwhiskAction (100% statements/branches/functions/lines)
|
|
43
|
+
- GraphQlAction (100% statements/branches/functions/lines)
|
|
44
|
+
- EventConsumerAction (100% statements/branches/functions/lines)
|
|
45
|
+
- Added 25 comprehensive instrumentation tests covering all action types and edge cases
|
|
46
|
+
- Fixed all linting and formatting issues (0 errors, 0 warnings)
|
|
47
|
+
- All 636 tests passing across 30 test suites
|
|
48
|
+
- No breaking changes - purely additive enhancements with backward compatibility
|
|
49
|
+
|
|
50
|
+
### 💡 Usage Example
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
const { RuntimeAction, RuntimeActionResponse, HttpMethod } = require('@adobe-commerce/aio-toolkit');
|
|
54
|
+
|
|
55
|
+
// Custom function with telemetry
|
|
56
|
+
const processData = (data, telemetry, logger) => {
|
|
57
|
+
const span = telemetry?.getCurrentSpan?.();
|
|
58
|
+
if (span) {
|
|
59
|
+
span.setAttribute('data.size', data.length);
|
|
60
|
+
}
|
|
61
|
+
logger.info('Processing data');
|
|
62
|
+
return { processed: true };
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
exports.main = RuntimeAction.execute(
|
|
66
|
+
'my-action',
|
|
67
|
+
[HttpMethod.POST],
|
|
68
|
+
['data'],
|
|
69
|
+
['Authorization'],
|
|
70
|
+
async (params, ctx) => {
|
|
71
|
+
const { logger, telemetry } = ctx;
|
|
72
|
+
|
|
73
|
+
// Wrap function to create child span
|
|
74
|
+
const instrumented = telemetry?.instrument?.('data.process', processData) || processData;
|
|
75
|
+
const result = instrumented(params.data, telemetry, logger);
|
|
76
|
+
|
|
77
|
+
return RuntimeActionResponse.success(result);
|
|
78
|
+
}
|
|
79
|
+
);
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**Key Features:**
|
|
83
|
+
- `telemetry.getCurrentSpan(params)` - Access current span for custom attributes and events
|
|
84
|
+
- `telemetry.instrument(spanName, fn)` - Wrap functions to create child spans automatically
|
|
85
|
+
- Safe with optional chaining - gracefully degrades when telemetry is disabled
|
|
86
|
+
|
|
8
87
|
## [1.0.13] - 2026-01-07
|
|
9
88
|
|
|
10
89
|
### ✨ Features
|
package/README.md
CHANGED
|
@@ -289,6 +289,9 @@ OpenTelemetry integration for enterprise-grade observability with distributed tr
|
|
|
289
289
|
- Automatic telemetry instrumentation for all framework action classes
|
|
290
290
|
- Request ID correlation across all log messages (`x-adobe-commerce-request-id`)
|
|
291
291
|
- Action type identification for better filtering (`action.type`)
|
|
292
|
+
- Access to current OpenTelemetry span via `ctx.telemetry` for custom instrumentation
|
|
293
|
+
- `telemetry.instrument()` method for wrapping functions with automatic span creation
|
|
294
|
+
- Conditional span access based on `ENABLE_TELEMETRY` flag
|
|
292
295
|
- Multi-provider support (New Relic implemented, Grafana ready)
|
|
293
296
|
- Graceful fallback when telemetry is not configured
|
|
294
297
|
- Zero performance impact when disabled (opt-in via feature flags)
|
|
@@ -334,27 +337,43 @@ Telemetry is automatically initialized when you use framework action classes:
|
|
|
334
337
|
*/
|
|
335
338
|
|
|
336
339
|
const { RuntimeAction, RuntimeActionResponse, HttpMethod } = require("@adobe-commerce/aio-toolkit");
|
|
337
|
-
|
|
340
|
+
|
|
341
|
+
// Custom function with telemetry
|
|
342
|
+
const processData = (data, telemetry, logger) => {
|
|
343
|
+
const span = telemetry?.getCurrentSpan?.();
|
|
344
|
+
if (span) {
|
|
345
|
+
span.setAttribute('data.size', data.length);
|
|
346
|
+
}
|
|
347
|
+
logger.info('Processing data');
|
|
348
|
+
return { processed: true };
|
|
349
|
+
};
|
|
338
350
|
|
|
339
351
|
exports.main = RuntimeAction.execute(
|
|
340
|
-
|
|
352
|
+
'my-action',
|
|
341
353
|
[HttpMethod.POST],
|
|
342
|
-
[],
|
|
354
|
+
['data'],
|
|
343
355
|
['Authorization'],
|
|
344
356
|
async (params, ctx) => {
|
|
345
|
-
const { logger } = ctx;
|
|
357
|
+
const { logger, telemetry } = ctx;
|
|
346
358
|
|
|
347
359
|
// Logger automatically includes x-adobe-commerce-request-id and action.type
|
|
348
|
-
logger.info(
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
360
|
+
logger.info('Action started');
|
|
361
|
+
|
|
362
|
+
// Wrap function to create child span
|
|
363
|
+
const instrumented = telemetry?.instrument?.('data.process', processData) || processData;
|
|
364
|
+
const result = instrumented(params.data, telemetry, logger);
|
|
352
365
|
|
|
353
|
-
return RuntimeActionResponse.success(
|
|
366
|
+
return RuntimeActionResponse.success(result);
|
|
354
367
|
}
|
|
355
368
|
);
|
|
356
369
|
```
|
|
357
370
|
|
|
371
|
+
**Key Features:**
|
|
372
|
+
- `telemetry.getCurrentSpan(params)` - Access current span for custom attributes and events
|
|
373
|
+
- `telemetry.instrument(spanName, fn)` - Wrap functions to create child spans automatically
|
|
374
|
+
- Safe with optional chaining - gracefully degrades when telemetry is disabled
|
|
375
|
+
- Logger automatically includes request ID and action type for correlation
|
|
376
|
+
|
|
358
377
|
**What Gets Logged Automatically:**
|
|
359
378
|
|
|
360
379
|
All log messages automatically include:
|
package/dist/index.d.mts
CHANGED
|
@@ -41,6 +41,30 @@ interface ErrorResponse {
|
|
|
41
41
|
}
|
|
42
42
|
type RuntimeActionResponseType = SuccessResponse | ErrorResponse;
|
|
43
43
|
|
|
44
|
+
interface BaseTelemetryValidator {
|
|
45
|
+
isConfigured(params: Record<string, unknown>): boolean;
|
|
46
|
+
validateConfiguration(params: Record<string, unknown>): void;
|
|
47
|
+
}
|
|
48
|
+
interface BaseTelemetry {
|
|
49
|
+
canInitialize(params: Record<string, unknown>): boolean;
|
|
50
|
+
getConfig(): EntrypointInstrumentationConfig;
|
|
51
|
+
initialize(action: (params: Record<string, unknown>) => any): (params: Record<string, unknown>) => any;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
declare class Telemetry {
|
|
55
|
+
private params;
|
|
56
|
+
private logger;
|
|
57
|
+
constructor(params?: Record<string, unknown> | undefined);
|
|
58
|
+
getParams(): Record<string, unknown>;
|
|
59
|
+
setParams(params: Record<string, unknown>): void;
|
|
60
|
+
getLogger(): any;
|
|
61
|
+
createLogger(name: string): any;
|
|
62
|
+
formatError(error: unknown): Record<string, unknown>;
|
|
63
|
+
getCurrentSpan(): any;
|
|
64
|
+
instrument<T extends (...args: any[]) => any>(spanName: string, fn: T): T;
|
|
65
|
+
initialize(action: (params: Record<string, unknown>) => any): (params: Record<string, unknown>) => any;
|
|
66
|
+
}
|
|
67
|
+
|
|
44
68
|
declare class RuntimeAction {
|
|
45
69
|
private static actionType;
|
|
46
70
|
private static actionTypeName;
|
|
@@ -55,9 +79,12 @@ declare class RuntimeAction {
|
|
|
55
79
|
headers: {
|
|
56
80
|
[key: string]: any;
|
|
57
81
|
};
|
|
82
|
+
telemetry: Telemetry;
|
|
58
83
|
}) => Promise<RuntimeActionResponseType>): (params: {
|
|
59
84
|
[key: string]: any;
|
|
60
85
|
}) => Promise<RuntimeActionResponseType>;
|
|
86
|
+
private static executeActionWithInstrumentation;
|
|
87
|
+
private static validateRequestWithInstrumentation;
|
|
61
88
|
private static validateRequest;
|
|
62
89
|
}
|
|
63
90
|
|
|
@@ -91,9 +118,12 @@ declare class EventConsumerAction {
|
|
|
91
118
|
headers: {
|
|
92
119
|
[key: string]: any;
|
|
93
120
|
};
|
|
121
|
+
telemetry: Telemetry;
|
|
94
122
|
}) => Promise<RuntimeActionResponseType>): (params: {
|
|
95
123
|
[key: string]: any;
|
|
96
124
|
}) => Promise<RuntimeActionResponseType>;
|
|
125
|
+
private static validateWithInstrumentation;
|
|
126
|
+
private static executeActionWithInstrumentation;
|
|
97
127
|
}
|
|
98
128
|
|
|
99
129
|
declare class GraphQlAction {
|
|
@@ -105,9 +135,15 @@ declare class GraphQlAction {
|
|
|
105
135
|
params: {
|
|
106
136
|
[key: string]: any;
|
|
107
137
|
};
|
|
138
|
+
telemetry: Telemetry;
|
|
108
139
|
}) => Promise<any>, name?: string, disableIntrospection?: boolean): (params: {
|
|
109
140
|
[key: string]: any;
|
|
110
141
|
}) => Promise<RuntimeActionResponseType>;
|
|
142
|
+
private static buildSchemaWithInstrumentation;
|
|
143
|
+
private static parseQueryWithInstrumentation;
|
|
144
|
+
private static validateQueryWithInstrumentation;
|
|
145
|
+
private static checkIntrospectionWithInstrumentation;
|
|
146
|
+
private static executeGraphQLWithInstrumentation;
|
|
111
147
|
}
|
|
112
148
|
|
|
113
149
|
interface OpenwhiskConfig {
|
|
@@ -128,9 +164,11 @@ declare class OpenwhiskAction {
|
|
|
128
164
|
headers: {
|
|
129
165
|
[key: string]: any;
|
|
130
166
|
};
|
|
167
|
+
telemetry: Telemetry;
|
|
131
168
|
}) => Promise<RuntimeActionResponseType>): (params: {
|
|
132
169
|
[key: string]: any;
|
|
133
170
|
}) => Promise<RuntimeActionResponseType>;
|
|
171
|
+
private static executeActionWithInstrumentation;
|
|
134
172
|
}
|
|
135
173
|
|
|
136
174
|
interface FileRecord {
|
|
@@ -231,9 +269,14 @@ declare class WebhookAction {
|
|
|
231
269
|
headers: {
|
|
232
270
|
[key: string]: any;
|
|
233
271
|
};
|
|
272
|
+
telemetry: Telemetry;
|
|
234
273
|
}) => Promise<WebhookActionResponseType | WebhookActionResponseType[]>): (params: {
|
|
235
274
|
[key: string]: any;
|
|
236
275
|
}) => Promise<RuntimeActionResponseType>;
|
|
276
|
+
private static executeActionWithInstrumentation;
|
|
277
|
+
private static verifySignatureWithInstrumentation;
|
|
278
|
+
private static validateWithInstrumentation;
|
|
279
|
+
private static verifySignature;
|
|
237
280
|
}
|
|
238
281
|
|
|
239
282
|
declare class WebhookActionResponse {
|
|
@@ -284,22 +327,6 @@ declare class RuntimeApiGatewayService {
|
|
|
284
327
|
delete(endpoint: string, additionalHeaders?: Record<string, string>): Promise<any>;
|
|
285
328
|
}
|
|
286
329
|
|
|
287
|
-
interface BaseTelemetryValidator {
|
|
288
|
-
isConfigured(params: Record<string, unknown>): boolean;
|
|
289
|
-
validateConfiguration(params: Record<string, unknown>): void;
|
|
290
|
-
}
|
|
291
|
-
interface BaseTelemetry {
|
|
292
|
-
canInitialize(params: Record<string, unknown>): boolean;
|
|
293
|
-
getConfig(): EntrypointInstrumentationConfig;
|
|
294
|
-
initialize(action: (params: Record<string, unknown>) => any): (params: Record<string, unknown>) => any;
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
declare class Telemetry {
|
|
298
|
-
static createLogger(name: string, params: Record<string, unknown>): any;
|
|
299
|
-
static formatError(error: unknown): Record<string, unknown>;
|
|
300
|
-
static initialize(action: (params: Record<string, unknown>) => any): (params: Record<string, unknown>) => any;
|
|
301
|
-
}
|
|
302
|
-
|
|
303
330
|
declare class TelemetryInputError extends Error {
|
|
304
331
|
constructor(message: string);
|
|
305
332
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -41,6 +41,30 @@ interface ErrorResponse {
|
|
|
41
41
|
}
|
|
42
42
|
type RuntimeActionResponseType = SuccessResponse | ErrorResponse;
|
|
43
43
|
|
|
44
|
+
interface BaseTelemetryValidator {
|
|
45
|
+
isConfigured(params: Record<string, unknown>): boolean;
|
|
46
|
+
validateConfiguration(params: Record<string, unknown>): void;
|
|
47
|
+
}
|
|
48
|
+
interface BaseTelemetry {
|
|
49
|
+
canInitialize(params: Record<string, unknown>): boolean;
|
|
50
|
+
getConfig(): EntrypointInstrumentationConfig;
|
|
51
|
+
initialize(action: (params: Record<string, unknown>) => any): (params: Record<string, unknown>) => any;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
declare class Telemetry {
|
|
55
|
+
private params;
|
|
56
|
+
private logger;
|
|
57
|
+
constructor(params?: Record<string, unknown> | undefined);
|
|
58
|
+
getParams(): Record<string, unknown>;
|
|
59
|
+
setParams(params: Record<string, unknown>): void;
|
|
60
|
+
getLogger(): any;
|
|
61
|
+
createLogger(name: string): any;
|
|
62
|
+
formatError(error: unknown): Record<string, unknown>;
|
|
63
|
+
getCurrentSpan(): any;
|
|
64
|
+
instrument<T extends (...args: any[]) => any>(spanName: string, fn: T): T;
|
|
65
|
+
initialize(action: (params: Record<string, unknown>) => any): (params: Record<string, unknown>) => any;
|
|
66
|
+
}
|
|
67
|
+
|
|
44
68
|
declare class RuntimeAction {
|
|
45
69
|
private static actionType;
|
|
46
70
|
private static actionTypeName;
|
|
@@ -55,9 +79,12 @@ declare class RuntimeAction {
|
|
|
55
79
|
headers: {
|
|
56
80
|
[key: string]: any;
|
|
57
81
|
};
|
|
82
|
+
telemetry: Telemetry;
|
|
58
83
|
}) => Promise<RuntimeActionResponseType>): (params: {
|
|
59
84
|
[key: string]: any;
|
|
60
85
|
}) => Promise<RuntimeActionResponseType>;
|
|
86
|
+
private static executeActionWithInstrumentation;
|
|
87
|
+
private static validateRequestWithInstrumentation;
|
|
61
88
|
private static validateRequest;
|
|
62
89
|
}
|
|
63
90
|
|
|
@@ -91,9 +118,12 @@ declare class EventConsumerAction {
|
|
|
91
118
|
headers: {
|
|
92
119
|
[key: string]: any;
|
|
93
120
|
};
|
|
121
|
+
telemetry: Telemetry;
|
|
94
122
|
}) => Promise<RuntimeActionResponseType>): (params: {
|
|
95
123
|
[key: string]: any;
|
|
96
124
|
}) => Promise<RuntimeActionResponseType>;
|
|
125
|
+
private static validateWithInstrumentation;
|
|
126
|
+
private static executeActionWithInstrumentation;
|
|
97
127
|
}
|
|
98
128
|
|
|
99
129
|
declare class GraphQlAction {
|
|
@@ -105,9 +135,15 @@ declare class GraphQlAction {
|
|
|
105
135
|
params: {
|
|
106
136
|
[key: string]: any;
|
|
107
137
|
};
|
|
138
|
+
telemetry: Telemetry;
|
|
108
139
|
}) => Promise<any>, name?: string, disableIntrospection?: boolean): (params: {
|
|
109
140
|
[key: string]: any;
|
|
110
141
|
}) => Promise<RuntimeActionResponseType>;
|
|
142
|
+
private static buildSchemaWithInstrumentation;
|
|
143
|
+
private static parseQueryWithInstrumentation;
|
|
144
|
+
private static validateQueryWithInstrumentation;
|
|
145
|
+
private static checkIntrospectionWithInstrumentation;
|
|
146
|
+
private static executeGraphQLWithInstrumentation;
|
|
111
147
|
}
|
|
112
148
|
|
|
113
149
|
interface OpenwhiskConfig {
|
|
@@ -128,9 +164,11 @@ declare class OpenwhiskAction {
|
|
|
128
164
|
headers: {
|
|
129
165
|
[key: string]: any;
|
|
130
166
|
};
|
|
167
|
+
telemetry: Telemetry;
|
|
131
168
|
}) => Promise<RuntimeActionResponseType>): (params: {
|
|
132
169
|
[key: string]: any;
|
|
133
170
|
}) => Promise<RuntimeActionResponseType>;
|
|
171
|
+
private static executeActionWithInstrumentation;
|
|
134
172
|
}
|
|
135
173
|
|
|
136
174
|
interface FileRecord {
|
|
@@ -231,9 +269,14 @@ declare class WebhookAction {
|
|
|
231
269
|
headers: {
|
|
232
270
|
[key: string]: any;
|
|
233
271
|
};
|
|
272
|
+
telemetry: Telemetry;
|
|
234
273
|
}) => Promise<WebhookActionResponseType | WebhookActionResponseType[]>): (params: {
|
|
235
274
|
[key: string]: any;
|
|
236
275
|
}) => Promise<RuntimeActionResponseType>;
|
|
276
|
+
private static executeActionWithInstrumentation;
|
|
277
|
+
private static verifySignatureWithInstrumentation;
|
|
278
|
+
private static validateWithInstrumentation;
|
|
279
|
+
private static verifySignature;
|
|
237
280
|
}
|
|
238
281
|
|
|
239
282
|
declare class WebhookActionResponse {
|
|
@@ -284,22 +327,6 @@ declare class RuntimeApiGatewayService {
|
|
|
284
327
|
delete(endpoint: string, additionalHeaders?: Record<string, string>): Promise<any>;
|
|
285
328
|
}
|
|
286
329
|
|
|
287
|
-
interface BaseTelemetryValidator {
|
|
288
|
-
isConfigured(params: Record<string, unknown>): boolean;
|
|
289
|
-
validateConfiguration(params: Record<string, unknown>): void;
|
|
290
|
-
}
|
|
291
|
-
interface BaseTelemetry {
|
|
292
|
-
canInitialize(params: Record<string, unknown>): boolean;
|
|
293
|
-
getConfig(): EntrypointInstrumentationConfig;
|
|
294
|
-
initialize(action: (params: Record<string, unknown>) => any): (params: Record<string, unknown>) => any;
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
declare class Telemetry {
|
|
298
|
-
static createLogger(name: string, params: Record<string, unknown>): any;
|
|
299
|
-
static formatError(error: unknown): Record<string, unknown>;
|
|
300
|
-
static initialize(action: (params: Record<string, unknown>) => any): (params: Record<string, unknown>) => any;
|
|
301
|
-
}
|
|
302
|
-
|
|
303
330
|
declare class TelemetryInputError extends Error {
|
|
304
331
|
constructor(message: string);
|
|
305
332
|
}
|