autotel 4.1.0 → 4.2.1

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.
Files changed (253) hide show
  1. package/dist/auto.cjs +5 -3
  2. package/dist/auto.cjs.map +1 -1
  3. package/dist/auto.js +3 -3
  4. package/dist/auto.js.map +1 -1
  5. package/dist/chunk-C_NdSu1c.cjs +34 -0
  6. package/dist/correlation-id.cjs +1 -1
  7. package/dist/correlation-id.d.cts.map +1 -1
  8. package/dist/correlation-id.d.ts.map +1 -1
  9. package/dist/correlation-id.js +1 -1
  10. package/dist/decorators.cjs +1 -1
  11. package/dist/decorators.js +1 -1
  12. package/dist/{event-ByBTV9M2.js → event-531asIM6.js} +4 -4
  13. package/dist/{event-ByBTV9M2.js.map → event-531asIM6.js.map} +1 -1
  14. package/dist/{event-BhHREDJk.cjs → event-CcZYwp50.cjs} +4 -4
  15. package/dist/{event-BhHREDJk.cjs.map → event-CcZYwp50.cjs.map} +1 -1
  16. package/dist/event.cjs +1 -1
  17. package/dist/event.js +1 -1
  18. package/dist/{functional-zpzNLhky.cjs → functional-C8B0Qa7o.cjs} +10 -7
  19. package/dist/functional-C8B0Qa7o.cjs.map +1 -0
  20. package/dist/{functional-DtI0u4vx.js → functional-r-AUIRy_.js} +9 -9
  21. package/dist/functional-r-AUIRy_.js.map +1 -0
  22. package/dist/functional.cjs +1 -1
  23. package/dist/functional.js +1 -1
  24. package/dist/http.cjs +1 -1
  25. package/dist/http.js +1 -1
  26. package/dist/index.cjs +15 -13
  27. package/dist/index.cjs.map +1 -1
  28. package/dist/index.d.cts.map +1 -1
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +14 -14
  31. package/dist/index.js.map +1 -1
  32. package/dist/{init-D-jnNMix.js → init-BS2JVkrL.js} +2 -2
  33. package/dist/{init-D-jnNMix.js.map → init-BS2JVkrL.js.map} +1 -1
  34. package/dist/{init-BX7AmFRl.cjs → init-BXiuPK6j.cjs} +3 -3
  35. package/dist/{init-BX7AmFRl.cjs.map → init-BXiuPK6j.cjs.map} +1 -1
  36. package/dist/instrumentation.cjs +2 -2
  37. package/dist/instrumentation.js +2 -2
  38. package/dist/logger.cjs +236 -8
  39. package/dist/logger.cjs.map +1 -0
  40. package/dist/messaging.cjs +1 -1
  41. package/dist/messaging.js +1 -1
  42. package/dist/{node-require-DF5QBX6z.cjs → node-require-CZ_PU448.cjs} +6 -4
  43. package/dist/node-require-CZ_PU448.cjs.map +1 -0
  44. package/dist/{node-require-Db1oDpLj.js → node-require-vROmTeJ8.js} +5 -5
  45. package/dist/node-require-vROmTeJ8.js.map +1 -0
  46. package/dist/{operation-context-C-2hmmtP.js → operation-context-CKBoA4Qy.js} +3 -3
  47. package/dist/operation-context-CKBoA4Qy.js.map +1 -0
  48. package/dist/{operation-context-n4_obUwq.cjs → operation-context-D6LDf4W_.cjs} +3 -1
  49. package/dist/operation-context-D6LDf4W_.cjs.map +1 -0
  50. package/dist/register.cjs +3 -1
  51. package/dist/register.cjs.map +1 -1
  52. package/dist/register.js +2 -2
  53. package/dist/register.js.map +1 -1
  54. package/dist/semantic-helpers.cjs +1 -1
  55. package/dist/semantic-helpers.js +1 -1
  56. package/dist/{stable-hash-Cg5cT34Q.js → stable-hash-ChFBIhNt.js} +3 -3
  57. package/dist/stable-hash-ChFBIhNt.js.map +1 -0
  58. package/dist/{stable-hash-BNTMrmdB.cjs → stable-hash-brKISGf1.cjs} +4 -2
  59. package/dist/stable-hash-brKISGf1.cjs.map +1 -0
  60. package/dist/trace-context-Cijqoi6e.d.cts.map +1 -1
  61. package/dist/trace-context-Cijqoi6e.d.ts.map +1 -1
  62. package/dist/trace-helpers.cjs +1 -1
  63. package/dist/trace-helpers.js +1 -1
  64. package/dist/{track-wc0HafS_.js → track-COUuU48p.js} +5 -5
  65. package/dist/track-COUuU48p.js.map +1 -0
  66. package/dist/{track-D59FfpL0.cjs → track-Cb3Q4QmS.cjs} +4 -2
  67. package/dist/track-Cb3Q4QmS.cjs.map +1 -0
  68. package/dist/validate.cjs +1 -1
  69. package/dist/validate.js +1 -1
  70. package/dist/webhook.cjs +1 -1
  71. package/dist/webhook.js +1 -1
  72. package/dist/workflow-distributed.cjs +1 -1
  73. package/dist/workflow-distributed.js +1 -1
  74. package/dist/workflow.cjs +3 -1
  75. package/dist/workflow.cjs.map +1 -1
  76. package/dist/workflow.d.cts.map +1 -1
  77. package/dist/workflow.d.ts.map +1 -1
  78. package/dist/workflow.js +3 -3
  79. package/dist/workflow.js.map +1 -1
  80. package/dist/yaml-config.cjs +233 -4
  81. package/dist/yaml-config.cjs.map +1 -0
  82. package/dist/yaml-config.d.cts.map +1 -1
  83. package/dist/yaml-config.d.ts.map +1 -1
  84. package/dist/yaml-config.js +8 -7
  85. package/dist/yaml-config.js.map +1 -1
  86. package/package.json +1 -2
  87. package/dist/functional-DtI0u4vx.js.map +0 -1
  88. package/dist/functional-zpzNLhky.cjs.map +0 -1
  89. package/dist/logger-thMPLpOG.cjs +0 -487
  90. package/dist/logger-thMPLpOG.cjs.map +0 -1
  91. package/dist/node-require-DF5QBX6z.cjs.map +0 -1
  92. package/dist/node-require-Db1oDpLj.js.map +0 -1
  93. package/dist/operation-context-C-2hmmtP.js.map +0 -1
  94. package/dist/operation-context-n4_obUwq.cjs.map +0 -1
  95. package/dist/stable-hash-BNTMrmdB.cjs.map +0 -1
  96. package/dist/stable-hash-Cg5cT34Q.js.map +0 -1
  97. package/dist/track-D59FfpL0.cjs.map +0 -1
  98. package/dist/track-wc0HafS_.js.map +0 -1
  99. package/dist/yaml-config-Ck2uB0Dp.cjs +0 -273
  100. package/dist/yaml-config-Ck2uB0Dp.cjs.map +0 -1
  101. package/src/attribute-redacting-processor.test.ts +0 -763
  102. package/src/attribute-redacting-processor.ts +0 -621
  103. package/src/attributes/attachers.ts +0 -161
  104. package/src/attributes/builders.ts +0 -529
  105. package/src/attributes/domains.ts +0 -42
  106. package/src/attributes/index.ts +0 -81
  107. package/src/attributes/registry.ts +0 -323
  108. package/src/attributes/types.ts +0 -211
  109. package/src/attributes/utils.ts +0 -64
  110. package/src/attributes/validators.ts +0 -266
  111. package/src/attributes.test.ts +0 -292
  112. package/src/auto.ts +0 -67
  113. package/src/autotel-logger.test.ts +0 -548
  114. package/src/autotel-logger.ts +0 -364
  115. package/src/baggage-span-processor.test.ts +0 -202
  116. package/src/baggage-span-processor.ts +0 -100
  117. package/src/business-baggage.test.ts +0 -500
  118. package/src/business-baggage.ts +0 -669
  119. package/src/circuit-breaker.test.ts +0 -341
  120. package/src/circuit-breaker.ts +0 -184
  121. package/src/config.test.ts +0 -94
  122. package/src/config.ts +0 -172
  123. package/src/correlated-events.test.ts +0 -151
  124. package/src/correlated-events.ts +0 -47
  125. package/src/correlation-id.test.ts +0 -163
  126. package/src/correlation-id.ts +0 -206
  127. package/src/db.test.ts +0 -252
  128. package/src/db.ts +0 -447
  129. package/src/decorators.test.ts +0 -153
  130. package/src/decorators.ts +0 -188
  131. package/src/define-event.test.ts +0 -41
  132. package/src/define-event.ts +0 -58
  133. package/src/devtools.ts +0 -60
  134. package/src/drain-pipeline.test.ts +0 -68
  135. package/src/drain-pipeline.ts +0 -199
  136. package/src/drain-toolkit.test.ts +0 -113
  137. package/src/drain-toolkit.ts +0 -129
  138. package/src/enricher-toolkit.test.ts +0 -67
  139. package/src/enricher-toolkit.ts +0 -79
  140. package/src/enrichers.test.ts +0 -150
  141. package/src/enrichers.ts +0 -145
  142. package/src/env-config.test.ts +0 -323
  143. package/src/env-config.ts +0 -309
  144. package/src/error-catalog.test.ts +0 -133
  145. package/src/error-catalog.ts +0 -262
  146. package/src/event-queue.test.ts +0 -864
  147. package/src/event-queue.ts +0 -699
  148. package/src/event-subscriber.ts +0 -262
  149. package/src/event-testing.ts +0 -197
  150. package/src/event.test.ts +0 -1104
  151. package/src/event.ts +0 -988
  152. package/src/events-config.ts +0 -235
  153. package/src/exporters.ts +0 -165
  154. package/src/filtering-span-processor.test.ts +0 -281
  155. package/src/filtering-span-processor.ts +0 -111
  156. package/src/flatten-attributes.test.ts +0 -76
  157. package/src/flatten-attributes.ts +0 -80
  158. package/src/functional.strict-types.typecheck.ts +0 -53
  159. package/src/functional.test.ts +0 -1464
  160. package/src/functional.ts +0 -2539
  161. package/src/functional.types.test.ts +0 -135
  162. package/src/hook.mjs +0 -15
  163. package/src/http.test.ts +0 -485
  164. package/src/http.ts +0 -424
  165. package/src/index.ts +0 -433
  166. package/src/init-auto-redactor.test.ts +0 -53
  167. package/src/init-redactor.test.ts +0 -8
  168. package/src/init.customization.test.ts +0 -665
  169. package/src/init.integrations.test.ts +0 -399
  170. package/src/init.openllmetry.test.ts +0 -194
  171. package/src/init.protocol.test.ts +0 -215
  172. package/src/init.ts +0 -2439
  173. package/src/instrumentation.test.ts +0 -108
  174. package/src/instrumentation.ts +0 -319
  175. package/src/logger.test.ts +0 -125
  176. package/src/logger.ts +0 -341
  177. package/src/messaging-adapters.test.ts +0 -595
  178. package/src/messaging-adapters.ts +0 -583
  179. package/src/messaging-testing.test.ts +0 -573
  180. package/src/messaging-testing.ts +0 -935
  181. package/src/messaging.test.ts +0 -1646
  182. package/src/messaging.ts +0 -2245
  183. package/src/metric-helpers.ts +0 -47
  184. package/src/metric-testing.ts +0 -197
  185. package/src/metric.ts +0 -446
  186. package/src/metrics.test.ts +0 -241
  187. package/src/node-require.ts +0 -123
  188. package/src/operation-context.ts +0 -93
  189. package/src/parse-error.test.ts +0 -73
  190. package/src/parse-error.ts +0 -112
  191. package/src/posthog-logs.test.ts +0 -115
  192. package/src/posthog-logs.ts +0 -77
  193. package/src/pretty-console-exporter.test.ts +0 -545
  194. package/src/pretty-console-exporter.ts +0 -413
  195. package/src/pretty-log-formatter.test.ts +0 -123
  196. package/src/pretty-log-formatter.ts +0 -210
  197. package/src/processors/canonical-log-line-processor.test.ts +0 -523
  198. package/src/processors/canonical-log-line-processor.ts +0 -396
  199. package/src/processors.ts +0 -152
  200. package/src/rate-limiter.test.ts +0 -199
  201. package/src/rate-limiter.ts +0 -98
  202. package/src/redact-values.test.ts +0 -90
  203. package/src/redact-values.ts +0 -34
  204. package/src/register.ts +0 -37
  205. package/src/request-logger.test.ts +0 -545
  206. package/src/request-logger.ts +0 -342
  207. package/src/sampling.test.ts +0 -1060
  208. package/src/sampling.ts +0 -737
  209. package/src/security-schema.test.ts +0 -45
  210. package/src/security-schema.ts +0 -107
  211. package/src/semantic-conventions.ts +0 -15
  212. package/src/semantic-helpers.test.ts +0 -226
  213. package/src/semantic-helpers.ts +0 -438
  214. package/src/shutdown.test.ts +0 -364
  215. package/src/shutdown.ts +0 -246
  216. package/src/span-name-normalizer.test.ts +0 -377
  217. package/src/span-name-normalizer.ts +0 -213
  218. package/src/stable-hash.ts +0 -27
  219. package/src/structured-error.test.ts +0 -191
  220. package/src/structured-error.ts +0 -157
  221. package/src/stub.integration.test.ts +0 -361
  222. package/src/tail-sampling-processor.test.ts +0 -230
  223. package/src/tail-sampling-processor.ts +0 -55
  224. package/src/test-span-collector.test.ts +0 -234
  225. package/src/test-span-collector.ts +0 -150
  226. package/src/testing.ts +0 -705
  227. package/src/trace-context.test.ts +0 -73
  228. package/src/trace-context.ts +0 -567
  229. package/src/trace-helpers.new.test.ts +0 -278
  230. package/src/trace-helpers.test.ts +0 -290
  231. package/src/trace-helpers.ts +0 -710
  232. package/src/trace-hybrid.test.ts +0 -42
  233. package/src/trace-hybrid.ts +0 -37
  234. package/src/tracer-provider.test.ts +0 -183
  235. package/src/tracer-provider.ts +0 -266
  236. package/src/track.test.ts +0 -154
  237. package/src/track.ts +0 -216
  238. package/src/validate.test.ts +0 -287
  239. package/src/validate.ts +0 -307
  240. package/src/validation-attributes.ts +0 -43
  241. package/src/validation.test.ts +0 -330
  242. package/src/validation.ts +0 -246
  243. package/src/variable-name-inference.test.ts +0 -178
  244. package/src/variable-name-inference.ts +0 -242
  245. package/src/webhook.test.ts +0 -649
  246. package/src/webhook.ts +0 -637
  247. package/src/workflow-distributed.test.ts +0 -786
  248. package/src/workflow-distributed.ts +0 -916
  249. package/src/workflow.async-safety.integration.test.ts +0 -345
  250. package/src/workflow.test.ts +0 -647
  251. package/src/workflow.ts +0 -810
  252. package/src/yaml-config.test.ts +0 -373
  253. package/src/yaml-config.ts +0 -351
@@ -1,438 +0,0 @@
1
- /**
2
- * Semantic convention helpers for OpenTelemetry
3
- *
4
- * Pre-configured trace helpers that follow OpenTelemetry semantic conventions
5
- * for common operation types. Reduces boilerplate and ensures consistency.
6
- *
7
- * Based on: https://opentelemetry.io/docs/specs/semconv/
8
- */
9
-
10
- import { trace } from './functional';
11
- import type { TraceContext } from './trace-context';
12
- import type { Attributes } from '@opentelemetry/api';
13
-
14
- /**
15
- * Configuration for database operations
16
- *
17
- * Follows DB semantic conventions:
18
- * https://opentelemetry.io/docs/specs/semconv/database/
19
- */
20
- export interface DBConfig {
21
- /** Database system (e.g., 'postgresql', 'mongodb', 'redis') */
22
- system: string;
23
- /** Operation type (e.g., 'SELECT', 'INSERT', 'find', 'get') */
24
- operation?: string;
25
- /** Database name */
26
- database?: string;
27
- /** Collection/table name */
28
- collection?: string;
29
- /** Additional attributes to add to the span */
30
- attributes?: Attributes;
31
- }
32
-
33
- /**
34
- * Configuration for HTTP client operations
35
- *
36
- * Follows HTTP semantic conventions:
37
- * https://opentelemetry.io/docs/specs/semconv/http/
38
- */
39
- export interface HTTPConfig {
40
- /** HTTP method (e.g., 'GET', 'POST') */
41
- method?: string;
42
- /** Target URL or URL template */
43
- url?: string;
44
- /** Additional attributes to add to the span */
45
- attributes?: Attributes;
46
- }
47
-
48
- /**
49
- * Configuration for messaging operations
50
- *
51
- * Follows Messaging semantic conventions:
52
- * https://opentelemetry.io/docs/specs/semconv/messaging/
53
- */
54
- export interface MessagingConfig {
55
- /** Messaging system (e.g., 'kafka', 'rabbitmq', 'sqs') */
56
- system: string;
57
- /** Operation type */
58
- operation?: 'publish' | 'receive' | 'process';
59
- /** Destination name (queue/topic) */
60
- destination?: string;
61
- /** Additional attributes to add to the span */
62
- attributes?: Attributes;
63
- }
64
-
65
- /**
66
- * Trace database operations with DB semantic conventions
67
- *
68
- * Automatically adds standard attributes for database operations:
69
- * - db.system
70
- * - db.operation
71
- * - db.name
72
- * - db.collection.name (for NoSQL)
73
- *
74
- * **Use Cases:**
75
- * - SQL queries (PostgreSQL, MySQL, SQLite)
76
- * - NoSQL operations (MongoDB, DynamoDB, Redis)
77
- * - ORM queries (Prisma, TypeORM, Drizzle)
78
- *
79
- * @param config - Database operation configuration
80
- * @returns Traced function factory with DB attributes
81
- *
82
- * @example PostgreSQL query
83
- * ```typescript
84
- * import { traceDB } from 'autotel/semantic-helpers'
85
- * import { pool } from './db'
86
- *
87
- * export const getUser = traceDB({
88
- * system: 'postgresql',
89
- * operation: 'SELECT',
90
- * database: 'app_db',
91
- * collection: 'users'
92
- * })(ctx => async (userId: string) => {
93
- * const query = 'SELECT * FROM users WHERE id = $1'
94
- * ctx.setAttribute('db.statement', query)
95
- *
96
- * const result = await pool.query(query, [userId])
97
- * ctx.setAttribute('db.rows_affected', result.rowCount)
98
- *
99
- * return result.rows[0]
100
- * })
101
- * ```
102
- *
103
- * @example MongoDB with Mongoose
104
- * ```typescript
105
- * import { traceDB } from 'autotel/semantic-helpers'
106
- * import { User } from './models/User'
107
- *
108
- * export const findUsers = traceDB({
109
- * system: 'mongodb',
110
- * operation: 'find',
111
- * database: 'app_db',
112
- * collection: 'users'
113
- * })(ctx => async (filter: object) => {
114
- * ctx.setAttribute('db.mongodb.filter', JSON.stringify(filter))
115
- *
116
- * const users = await User.find(filter).limit(100)
117
- * ctx.setAttribute('db.response.count', users.length)
118
- *
119
- * return users
120
- * })
121
- * ```
122
- *
123
- * @example Redis operations
124
- * ```typescript
125
- * import { traceDB } from 'autotel/semantic-helpers'
126
- * import { redis } from './redis'
127
- *
128
- * export const cacheGet = traceDB({
129
- * system: 'redis',
130
- * operation: 'GET'
131
- * })(ctx => async (key: string) => {
132
- * ctx.setAttribute('db.redis.key', key)
133
- *
134
- * const value = await redis.get(key)
135
- * ctx.setAttribute('db.response.cache_hit', value !== null)
136
- *
137
- * return value
138
- * })
139
- * ```
140
- *
141
- * @example Prisma with detailed query info
142
- * ```typescript
143
- * import { traceDB } from 'autotel/semantic-helpers'
144
- * import { prisma } from './prisma'
145
- *
146
- * export const createPost = traceDB({
147
- * system: 'postgresql',
148
- * operation: 'INSERT',
149
- * database: 'app_db',
150
- * collection: 'posts'
151
- * })(ctx => async (data: { title: string; content: string; authorId: string }) => {
152
- * ctx.setAttribute('db.prisma.model', 'Post')
153
- * ctx.setAttribute('db.prisma.action', 'create')
154
- *
155
- * const post = await prisma.post.create({ data })
156
- *
157
- * ctx.setAttribute('db.response.id', post.id)
158
- * return post
159
- * })
160
- * ```
161
- *
162
- * @public
163
- */
164
- export function traceDB<TArgs extends unknown[], TReturn>(config: DBConfig) {
165
- return (
166
- fnFactory: (ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>,
167
- ): ((...args: TArgs) => Promise<TReturn>) => {
168
- return trace<TArgs, TReturn>((ctx) => {
169
- // Set semantic convention attributes
170
- ctx.setAttribute('db.system', config.system);
171
- if (config.operation) {
172
- ctx.setAttribute('db.operation', config.operation);
173
- }
174
- if (config.database) {
175
- ctx.setAttribute('db.name', config.database);
176
- }
177
- if (config.collection) {
178
- ctx.setAttribute('db.collection.name', config.collection);
179
- }
180
- if (config.attributes) {
181
- for (const [key, value] of Object.entries(config.attributes)) {
182
- if (value !== undefined && value !== null) {
183
- // setAttribute only accepts primitives (string | number | boolean)
184
- // Arrays and objects should be serialized
185
- const attrValue =
186
- typeof value === 'string' ||
187
- typeof value === 'number' ||
188
- typeof value === 'boolean'
189
- ? value
190
- : JSON.stringify(value);
191
- ctx.setAttribute(key, attrValue);
192
- }
193
- }
194
- }
195
-
196
- // Call the user's factory to get their function and return it
197
- return fnFactory(ctx);
198
- });
199
- };
200
- }
201
-
202
- /**
203
- * Trace HTTP client operations with HTTP semantic conventions
204
- *
205
- * Automatically adds standard attributes for HTTP requests:
206
- * - http.request.method
207
- * - url.full
208
- *
209
- * **Use Cases:**
210
- * - External API calls
211
- * - Microservice communication
212
- * - Third-party integrations
213
- *
214
- * @param config - HTTP operation configuration
215
- * @returns Traced function factory with HTTP attributes
216
- *
217
- * @example Fetch API
218
- * ```typescript
219
- * import { traceHTTP } from 'autotel/semantic-helpers'
220
- *
221
- * export const fetchUser = traceHTTP({
222
- * method: 'GET',
223
- * url: 'https://api.example.com/users/:id'
224
- * })(ctx => async (userId: string) => {
225
- * const url = `https://api.example.com/users/${userId}`
226
- * ctx.setAttribute('url.full', url)
227
- *
228
- * const response = await fetch(url)
229
- * ctx.setAttribute('http.response.status_code', response.status)
230
- *
231
- * if (!response.ok) {
232
- * ctx.setAttribute('error', true)
233
- * throw new Error(`HTTP ${response.status}: ${response.statusText}`)
234
- * }
235
- *
236
- * return response.json()
237
- * })
238
- * ```
239
- *
240
- * @example Axios with retry logic
241
- * ```typescript
242
- * import { traceHTTP } from 'autotel/semantic-helpers'
243
- * import axios from 'axios'
244
- *
245
- * export const sendWebhook = traceHTTP({
246
- * method: 'POST',
247
- * url: 'https://webhook.example.com/events'
248
- * })(ctx => async (payload: object) => {
249
- * let attempts = 0
250
- * const maxAttempts = 3
251
- *
252
- * while (attempts < maxAttempts) {
253
- * try {
254
- * attempts++
255
- * ctx.setAttribute('http.request.resend_count', attempts - 1)
256
- *
257
- * const response = await axios.post('https://webhook.example.com/events', payload)
258
- * ctx.setAttribute('http.response.status_code', response.status)
259
- * return response.data
260
- * } catch (error) {
261
- * if (attempts >= maxAttempts) throw error
262
- * await new Promise(resolve => setTimeout(resolve, 1000 * attempts))
263
- * }
264
- * }
265
- * })
266
- * ```
267
- *
268
- * @public
269
- */
270
- export function traceHTTP<TArgs extends unknown[], TReturn>(
271
- config: HTTPConfig,
272
- ) {
273
- return (
274
- fnFactory: (ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>,
275
- ): ((...args: TArgs) => Promise<TReturn>) => {
276
- return trace<TArgs, TReturn>((ctx) => {
277
- // Set semantic convention attributes
278
- if (config.method) {
279
- ctx.setAttribute('http.request.method', config.method);
280
- }
281
- if (config.url) {
282
- ctx.setAttribute('url.full', config.url);
283
- }
284
- if (config.attributes) {
285
- for (const [key, value] of Object.entries(config.attributes)) {
286
- if (value !== undefined && value !== null) {
287
- // setAttribute only accepts primitives (string | number | boolean)
288
- // Arrays and objects should be serialized
289
- const attrValue =
290
- typeof value === 'string' ||
291
- typeof value === 'number' ||
292
- typeof value === 'boolean'
293
- ? value
294
- : JSON.stringify(value);
295
- ctx.setAttribute(key, attrValue);
296
- }
297
- }
298
- }
299
-
300
- // Call the user's factory to get their function and return it
301
- return fnFactory(ctx);
302
- });
303
- };
304
- }
305
-
306
- /**
307
- * Trace messaging operations with Messaging semantic conventions
308
- *
309
- * Automatically adds standard attributes for messaging:
310
- * - messaging.system
311
- * - messaging.operation
312
- * - messaging.destination.name
313
- *
314
- * **Use Cases:**
315
- * - Publishing messages to queues/topics
316
- * - Consuming messages from queues/topics
317
- * - Event-driven architectures
318
- *
319
- * @param config - Messaging operation configuration
320
- * @returns Traced function factory with Messaging attributes
321
- *
322
- * @example Publishing to Kafka
323
- * ```typescript
324
- * import { traceMessaging } from 'autotel/semantic-helpers'
325
- * import { kafka } from './kafka'
326
- *
327
- * const producer = kafka.producer()
328
- *
329
- * export const publishEvent = traceMessaging({
330
- * system: 'kafka',
331
- * operation: 'publish',
332
- * destination: 'user-events'
333
- * })(ctx => async (event: { type: string; userId: string; data: object }) => {
334
- * ctx.setAttribute('messaging.message.type', event.type)
335
- * ctx.setAttribute('messaging.kafka.partition', 0)
336
- *
337
- * await producer.send({
338
- * topic: 'user-events',
339
- * messages: [
340
- * {
341
- * key: event.userId,
342
- * value: JSON.stringify(event.data)
343
- * }
344
- * ]
345
- * })
346
- *
347
- * ctx.setAttribute('messaging.message.id', event.userId)
348
- * })
349
- * ```
350
- *
351
- * @example Consuming from RabbitMQ
352
- * ```typescript
353
- * import { traceMessaging } from 'autotel/semantic-helpers'
354
- * import { channel } from './rabbitmq'
355
- *
356
- * export const processOrder = traceMessaging({
357
- * system: 'rabbitmq',
358
- * operation: 'process',
359
- * destination: 'orders'
360
- * })(ctx => async (message: { orderId: string; items: object[] }) => {
361
- * ctx.setAttribute('messaging.message.id', message.orderId)
362
- * ctx.setAttribute('messaging.message.body.size', JSON.stringify(message).length)
363
- *
364
- * // Process order logic
365
- * const result = await processOrderInternal(message)
366
- *
367
- * ctx.setAttribute('messaging.operation.result', 'success')
368
- * return result
369
- * })
370
- * ```
371
- *
372
- * @example AWS SQS with batch processing
373
- * ```typescript
374
- * import { traceMessaging } from 'autotel/semantic-helpers'
375
- * import { SQS } from '@aws-sdk/client-sqs'
376
- *
377
- * const sqs = new SQS()
378
- *
379
- * export const sendBatch = traceMessaging({
380
- * system: 'aws_sqs',
381
- * operation: 'publish',
382
- * destination: 'notifications-queue'
383
- * })(ctx => async (messages: Array<{ id: string; body: object }>) => {
384
- * ctx.setAttribute('messaging.batch.message_count', messages.length)
385
- *
386
- * const result = await sqs.sendMessageBatch({
387
- * QueueUrl: process.env.QUEUE_URL,
388
- * Entries: messages.map(msg => ({
389
- * Id: msg.id,
390
- * MessageBody: JSON.stringify(msg.body)
391
- * }))
392
- * })
393
- *
394
- * ctx.setAttribute('messaging.operation.success_count', result.Successful?.length || 0)
395
- * ctx.setAttribute('messaging.operation.failed_count', result.Failed?.length || 0)
396
- *
397
- * return result
398
- * })
399
- * ```
400
- *
401
- * @public
402
- */
403
- export function traceMessaging<TArgs extends unknown[], TReturn>(
404
- config: MessagingConfig,
405
- ) {
406
- return (
407
- fnFactory: (ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>,
408
- ): ((...args: TArgs) => Promise<TReturn>) => {
409
- return trace<TArgs, TReturn>((ctx) => {
410
- // Set semantic convention attributes
411
- ctx.setAttribute('messaging.system', config.system);
412
- if (config.operation) {
413
- ctx.setAttribute('messaging.operation', config.operation);
414
- }
415
- if (config.destination) {
416
- ctx.setAttribute('messaging.destination.name', config.destination);
417
- }
418
- if (config.attributes) {
419
- for (const [key, value] of Object.entries(config.attributes)) {
420
- if (value !== undefined && value !== null) {
421
- // setAttribute only accepts primitives (string | number | boolean)
422
- // Arrays and objects should be serialized
423
- const attrValue =
424
- typeof value === 'string' ||
425
- typeof value === 'number' ||
426
- typeof value === 'boolean'
427
- ? value
428
- : JSON.stringify(value);
429
- ctx.setAttribute(key, attrValue);
430
- }
431
- }
432
- }
433
-
434
- // Call the user's factory to get their function and return it
435
- return fnFactory(ctx);
436
- });
437
- };
438
- }