@blokjs/runner 0.2.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.
Files changed (307) hide show
  1. package/dist/Blok.d.ts +19 -0
  2. package/dist/Blok.js +184 -0
  3. package/dist/Blok.js.map +1 -0
  4. package/dist/BlokResponse.d.ts +16 -0
  5. package/dist/BlokResponse.js +28 -0
  6. package/dist/BlokResponse.js.map +1 -0
  7. package/dist/Configuration.d.ts +37 -0
  8. package/dist/Configuration.js +248 -0
  9. package/dist/Configuration.js.map +1 -0
  10. package/dist/ConfigurationResolver.d.ts +7 -0
  11. package/dist/ConfigurationResolver.js +15 -0
  12. package/dist/ConfigurationResolver.js.map +1 -0
  13. package/dist/DefaultLogger.d.ts +65 -0
  14. package/dist/DefaultLogger.js +101 -0
  15. package/dist/DefaultLogger.js.map +1 -0
  16. package/dist/LocalStorage.d.ts +7 -0
  17. package/dist/LocalStorage.js +56 -0
  18. package/dist/LocalStorage.js.map +1 -0
  19. package/dist/MemoryUsage.d.ts +22 -0
  20. package/dist/MemoryUsage.js +83 -0
  21. package/dist/MemoryUsage.js.map +1 -0
  22. package/dist/NodeMap.d.ts +7 -0
  23. package/dist/NodeMap.js +13 -0
  24. package/dist/NodeMap.js.map +1 -0
  25. package/dist/ResolverBase.d.ts +8 -0
  26. package/dist/ResolverBase.js +18 -0
  27. package/dist/ResolverBase.js.map +1 -0
  28. package/dist/Runner.d.ts +25 -0
  29. package/dist/Runner.js +32 -0
  30. package/dist/Runner.js.map +1 -0
  31. package/dist/RunnerNode.d.ts +9 -0
  32. package/dist/RunnerNode.js +8 -0
  33. package/dist/RunnerNode.js.map +1 -0
  34. package/dist/RunnerNodeBase.d.ts +4 -0
  35. package/dist/RunnerNodeBase.js +3 -0
  36. package/dist/RunnerNodeBase.js.map +1 -0
  37. package/dist/RunnerSteps.d.ts +14 -0
  38. package/dist/RunnerSteps.js +110 -0
  39. package/dist/RunnerSteps.js.map +1 -0
  40. package/dist/RuntimeAdapterNode.d.ts +19 -0
  41. package/dist/RuntimeAdapterNode.js +87 -0
  42. package/dist/RuntimeAdapterNode.js.map +1 -0
  43. package/dist/RuntimeRegistry.d.ts +61 -0
  44. package/dist/RuntimeRegistry.js +87 -0
  45. package/dist/RuntimeRegistry.js.map +1 -0
  46. package/dist/TriggerBase.d.ts +119 -0
  47. package/dist/TriggerBase.js +413 -0
  48. package/dist/TriggerBase.js.map +1 -0
  49. package/dist/adapters/BunRuntimeAdapter.d.ts +38 -0
  50. package/dist/adapters/BunRuntimeAdapter.js +169 -0
  51. package/dist/adapters/BunRuntimeAdapter.js.map +1 -0
  52. package/dist/adapters/DockerRuntimeAdapter.d.ts +85 -0
  53. package/dist/adapters/DockerRuntimeAdapter.js +298 -0
  54. package/dist/adapters/DockerRuntimeAdapter.js.map +1 -0
  55. package/dist/adapters/HttpRuntimeAdapter.d.ts +58 -0
  56. package/dist/adapters/HttpRuntimeAdapter.js +152 -0
  57. package/dist/adapters/HttpRuntimeAdapter.js.map +1 -0
  58. package/dist/adapters/NodeJsRuntimeAdapter.d.ts +23 -0
  59. package/dist/adapters/NodeJsRuntimeAdapter.js +67 -0
  60. package/dist/adapters/NodeJsRuntimeAdapter.js.map +1 -0
  61. package/dist/adapters/RuntimeAdapter.d.ts +42 -0
  62. package/dist/adapters/RuntimeAdapter.js +2 -0
  63. package/dist/adapters/RuntimeAdapter.js.map +1 -0
  64. package/dist/adapters/WasmRuntimeAdapter.d.ts +69 -0
  65. package/dist/adapters/WasmRuntimeAdapter.js +279 -0
  66. package/dist/adapters/WasmRuntimeAdapter.js.map +1 -0
  67. package/dist/cache/NodeResultCache.d.ts +286 -0
  68. package/dist/cache/NodeResultCache.js +499 -0
  69. package/dist/cache/NodeResultCache.js.map +1 -0
  70. package/dist/cache/index.d.ts +1 -0
  71. package/dist/cache/index.js +2 -0
  72. package/dist/cache/index.js.map +1 -0
  73. package/dist/cost/CostEstimator.d.ts +57 -0
  74. package/dist/cost/CostEstimator.js +171 -0
  75. package/dist/cost/CostEstimator.js.map +1 -0
  76. package/dist/cost/index.d.ts +4 -0
  77. package/dist/cost/index.js +3 -0
  78. package/dist/cost/index.js.map +1 -0
  79. package/dist/cost/pricing.d.ts +24 -0
  80. package/dist/cost/pricing.js +169 -0
  81. package/dist/cost/pricing.js.map +1 -0
  82. package/dist/defineNode.d.ts +155 -0
  83. package/dist/defineNode.js +191 -0
  84. package/dist/defineNode.js.map +1 -0
  85. package/dist/graphql/GraphQLSchemaGenerator.d.ts +129 -0
  86. package/dist/graphql/GraphQLSchemaGenerator.js +425 -0
  87. package/dist/graphql/GraphQLSchemaGenerator.js.map +1 -0
  88. package/dist/hmr/FileWatcher.d.ts +62 -0
  89. package/dist/hmr/FileWatcher.js +185 -0
  90. package/dist/hmr/FileWatcher.js.map +1 -0
  91. package/dist/hmr/HmrDevConsole.d.ts +13 -0
  92. package/dist/hmr/HmrDevConsole.js +46 -0
  93. package/dist/hmr/HmrDevConsole.js.map +1 -0
  94. package/dist/hmr/HotReloadManager.d.ts +84 -0
  95. package/dist/hmr/HotReloadManager.js +195 -0
  96. package/dist/hmr/HotReloadManager.js.map +1 -0
  97. package/dist/hmr/index.d.ts +39 -0
  98. package/dist/hmr/index.js +38 -0
  99. package/dist/hmr/index.js.map +1 -0
  100. package/dist/index.d.ts +107 -0
  101. package/dist/index.js +107 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/integrations/APMIntegration.d.ts +141 -0
  104. package/dist/integrations/APMIntegration.js +212 -0
  105. package/dist/integrations/APMIntegration.js.map +1 -0
  106. package/dist/integrations/AzureMonitorIntegration.d.ts +118 -0
  107. package/dist/integrations/AzureMonitorIntegration.js +254 -0
  108. package/dist/integrations/AzureMonitorIntegration.js.map +1 -0
  109. package/dist/integrations/CloudWatchIntegration.d.ts +135 -0
  110. package/dist/integrations/CloudWatchIntegration.js +293 -0
  111. package/dist/integrations/CloudWatchIntegration.js.map +1 -0
  112. package/dist/integrations/SentryIntegration.d.ts +153 -0
  113. package/dist/integrations/SentryIntegration.js +200 -0
  114. package/dist/integrations/SentryIntegration.js.map +1 -0
  115. package/dist/integrations/index.d.ts +19 -0
  116. package/dist/integrations/index.js +16 -0
  117. package/dist/integrations/index.js.map +1 -0
  118. package/dist/marketplace/RuntimeAutoScaler.d.ts +148 -0
  119. package/dist/marketplace/RuntimeAutoScaler.js +366 -0
  120. package/dist/marketplace/RuntimeAutoScaler.js.map +1 -0
  121. package/dist/marketplace/RuntimeCatalog.d.ts +174 -0
  122. package/dist/marketplace/RuntimeCatalog.js +339 -0
  123. package/dist/marketplace/RuntimeCatalog.js.map +1 -0
  124. package/dist/marketplace/RuntimeDiscovery.d.ts +86 -0
  125. package/dist/marketplace/RuntimeDiscovery.js +219 -0
  126. package/dist/marketplace/RuntimeDiscovery.js.map +1 -0
  127. package/dist/marketplace/RuntimeHealthMonitor.d.ts +100 -0
  128. package/dist/marketplace/RuntimeHealthMonitor.js +241 -0
  129. package/dist/marketplace/RuntimeHealthMonitor.js.map +1 -0
  130. package/dist/marketplace/RuntimeMetricsDashboard.d.ts +113 -0
  131. package/dist/marketplace/RuntimeMetricsDashboard.js +293 -0
  132. package/dist/marketplace/RuntimeMetricsDashboard.js.map +1 -0
  133. package/dist/monitoring/CircuitBreaker.d.ts +107 -0
  134. package/dist/monitoring/CircuitBreaker.js +238 -0
  135. package/dist/monitoring/CircuitBreaker.js.map +1 -0
  136. package/dist/monitoring/DistributedTracer.d.ts +125 -0
  137. package/dist/monitoring/DistributedTracer.js +230 -0
  138. package/dist/monitoring/DistributedTracer.js.map +1 -0
  139. package/dist/monitoring/HealthCheck.d.ts +54 -0
  140. package/dist/monitoring/HealthCheck.js +102 -0
  141. package/dist/monitoring/HealthCheck.js.map +1 -0
  142. package/dist/monitoring/PerformanceProfiler.d.ts +63 -0
  143. package/dist/monitoring/PerformanceProfiler.js +229 -0
  144. package/dist/monitoring/PerformanceProfiler.js.map +1 -0
  145. package/dist/monitoring/PrometheusBootstrap.d.ts +30 -0
  146. package/dist/monitoring/PrometheusBootstrap.js +71 -0
  147. package/dist/monitoring/PrometheusBootstrap.js.map +1 -0
  148. package/dist/monitoring/PrometheusMetricsBridge.d.ts +60 -0
  149. package/dist/monitoring/PrometheusMetricsBridge.js +216 -0
  150. package/dist/monitoring/PrometheusMetricsBridge.js.map +1 -0
  151. package/dist/monitoring/RateLimiter.d.ts +58 -0
  152. package/dist/monitoring/RateLimiter.js +128 -0
  153. package/dist/monitoring/RateLimiter.js.map +1 -0
  154. package/dist/monitoring/StructuredLogger.d.ts +131 -0
  155. package/dist/monitoring/StructuredLogger.js +207 -0
  156. package/dist/monitoring/StructuredLogger.js.map +1 -0
  157. package/dist/monitoring/TracingBootstrap.d.ts +69 -0
  158. package/dist/monitoring/TracingBootstrap.js +129 -0
  159. package/dist/monitoring/TracingBootstrap.js.map +1 -0
  160. package/dist/monitoring/TriggerMetricsCollector.d.ts +94 -0
  161. package/dist/monitoring/TriggerMetricsCollector.js +174 -0
  162. package/dist/monitoring/TriggerMetricsCollector.js.map +1 -0
  163. package/dist/monitoring/index.d.ts +9 -0
  164. package/dist/monitoring/index.js +10 -0
  165. package/dist/monitoring/index.js.map +1 -0
  166. package/dist/openapi/OpenAPIGenerator.d.ts +192 -0
  167. package/dist/openapi/OpenAPIGenerator.js +373 -0
  168. package/dist/openapi/OpenAPIGenerator.js.map +1 -0
  169. package/dist/openapi/index.d.ts +20 -0
  170. package/dist/openapi/index.js +20 -0
  171. package/dist/openapi/index.js.map +1 -0
  172. package/dist/security/ABAC.d.ts +224 -0
  173. package/dist/security/ABAC.js +380 -0
  174. package/dist/security/ABAC.js.map +1 -0
  175. package/dist/security/AuditLogger.d.ts +242 -0
  176. package/dist/security/AuditLogger.js +317 -0
  177. package/dist/security/AuditLogger.js.map +1 -0
  178. package/dist/security/AuthMiddleware.d.ts +163 -0
  179. package/dist/security/AuthMiddleware.js +274 -0
  180. package/dist/security/AuthMiddleware.js.map +1 -0
  181. package/dist/security/EncryptionAtRest.d.ts +206 -0
  182. package/dist/security/EncryptionAtRest.js +236 -0
  183. package/dist/security/EncryptionAtRest.js.map +1 -0
  184. package/dist/security/OAuthProvider.d.ts +334 -0
  185. package/dist/security/OAuthProvider.js +719 -0
  186. package/dist/security/OAuthProvider.js.map +1 -0
  187. package/dist/security/PIIDetector.d.ts +233 -0
  188. package/dist/security/PIIDetector.js +354 -0
  189. package/dist/security/PIIDetector.js.map +1 -0
  190. package/dist/security/RBAC.d.ts +143 -0
  191. package/dist/security/RBAC.js +285 -0
  192. package/dist/security/RBAC.js.map +1 -0
  193. package/dist/security/SecretManager.d.ts +652 -0
  194. package/dist/security/SecretManager.js +1146 -0
  195. package/dist/security/SecretManager.js.map +1 -0
  196. package/dist/security/TLSConfig.d.ts +305 -0
  197. package/dist/security/TLSConfig.js +550 -0
  198. package/dist/security/TLSConfig.js.map +1 -0
  199. package/dist/security/index.d.ts +79 -0
  200. package/dist/security/index.js +80 -0
  201. package/dist/security/index.js.map +1 -0
  202. package/dist/testing/TestHarness.d.ts +189 -0
  203. package/dist/testing/TestHarness.js +272 -0
  204. package/dist/testing/TestHarness.js.map +1 -0
  205. package/dist/testing/TestLogger.d.ts +103 -0
  206. package/dist/testing/TestLogger.js +153 -0
  207. package/dist/testing/TestLogger.js.map +1 -0
  208. package/dist/testing/WorkflowTestRunner.d.ts +172 -0
  209. package/dist/testing/WorkflowTestRunner.js +355 -0
  210. package/dist/testing/WorkflowTestRunner.js.map +1 -0
  211. package/dist/testing/index.d.ts +21 -0
  212. package/dist/testing/index.js +22 -0
  213. package/dist/testing/index.js.map +1 -0
  214. package/dist/tracing/InMemoryRunStore.d.ts +44 -0
  215. package/dist/tracing/InMemoryRunStore.js +341 -0
  216. package/dist/tracing/InMemoryRunStore.js.map +1 -0
  217. package/dist/tracing/PostgresRunStore.d.ts +82 -0
  218. package/dist/tracing/PostgresRunStore.js +640 -0
  219. package/dist/tracing/PostgresRunStore.js.map +1 -0
  220. package/dist/tracing/RunStore.d.ts +38 -0
  221. package/dist/tracing/RunStore.js +2 -0
  222. package/dist/tracing/RunStore.js.map +1 -0
  223. package/dist/tracing/RunTracker.d.ts +75 -0
  224. package/dist/tracing/RunTracker.js +374 -0
  225. package/dist/tracing/RunTracker.js.map +1 -0
  226. package/dist/tracing/SqliteRunStore.d.ts +53 -0
  227. package/dist/tracing/SqliteRunStore.js +703 -0
  228. package/dist/tracing/SqliteRunStore.js.map +1 -0
  229. package/dist/tracing/TraceRouter.d.ts +47 -0
  230. package/dist/tracing/TraceRouter.js +904 -0
  231. package/dist/tracing/TraceRouter.js.map +1 -0
  232. package/dist/tracing/TracingLogger.d.ts +21 -0
  233. package/dist/tracing/TracingLogger.js +62 -0
  234. package/dist/tracing/TracingLogger.js.map +1 -0
  235. package/dist/tracing/createStore.d.ts +30 -0
  236. package/dist/tracing/createStore.js +75 -0
  237. package/dist/tracing/createStore.js.map +1 -0
  238. package/dist/tracing/index.d.ts +13 -0
  239. package/dist/tracing/index.js +9 -0
  240. package/dist/tracing/index.js.map +1 -0
  241. package/dist/tracing/sanitize.d.ts +7 -0
  242. package/dist/tracing/sanitize.js +95 -0
  243. package/dist/tracing/sanitize.js.map +1 -0
  244. package/dist/tracing/types.d.ts +178 -0
  245. package/dist/tracing/types.js +3 -0
  246. package/dist/tracing/types.js.map +1 -0
  247. package/dist/types/Average.d.ts +11 -0
  248. package/dist/types/Average.js +2 -0
  249. package/dist/types/Average.js.map +1 -0
  250. package/dist/types/Condition.d.ts +8 -0
  251. package/dist/types/Condition.js +2 -0
  252. package/dist/types/Condition.js.map +1 -0
  253. package/dist/types/Conditions.d.ts +5 -0
  254. package/dist/types/Conditions.js +2 -0
  255. package/dist/types/Conditions.js.map +1 -0
  256. package/dist/types/Config.d.ts +12 -0
  257. package/dist/types/Config.js +2 -0
  258. package/dist/types/Config.js.map +1 -0
  259. package/dist/types/Flow.d.ts +5 -0
  260. package/dist/types/Flow.js +2 -0
  261. package/dist/types/Flow.js.map +1 -0
  262. package/dist/types/GlobalOptions.d.ts +11 -0
  263. package/dist/types/GlobalOptions.js +2 -0
  264. package/dist/types/GlobalOptions.js.map +1 -0
  265. package/dist/types/Inputs.d.ts +5 -0
  266. package/dist/types/Inputs.js +2 -0
  267. package/dist/types/Inputs.js.map +1 -0
  268. package/dist/types/JsonLikeObject.d.ts +3 -0
  269. package/dist/types/JsonLikeObject.js +2 -0
  270. package/dist/types/JsonLikeObject.js.map +1 -0
  271. package/dist/types/Mapper.d.ts +5 -0
  272. package/dist/types/Mapper.js +2 -0
  273. package/dist/types/Mapper.js.map +1 -0
  274. package/dist/types/Node.d.ts +10 -0
  275. package/dist/types/Node.js +2 -0
  276. package/dist/types/Node.js.map +1 -0
  277. package/dist/types/ParamsDictionary.d.ts +3 -0
  278. package/dist/types/ParamsDictionary.js +2 -0
  279. package/dist/types/ParamsDictionary.js.map +1 -0
  280. package/dist/types/Properties.d.ts +5 -0
  281. package/dist/types/Properties.js +2 -0
  282. package/dist/types/Properties.js.map +1 -0
  283. package/dist/types/Targets.d.ts +5 -0
  284. package/dist/types/Targets.js +2 -0
  285. package/dist/types/Targets.js.map +1 -0
  286. package/dist/types/Trigger.d.ts +5 -0
  287. package/dist/types/Trigger.js +2 -0
  288. package/dist/types/Trigger.js.map +1 -0
  289. package/dist/types/TriggerHttp.d.ts +7 -0
  290. package/dist/types/TriggerHttp.js +2 -0
  291. package/dist/types/TriggerHttp.js.map +1 -0
  292. package/dist/types/TriggerResponse.d.ts +6 -0
  293. package/dist/types/TriggerResponse.js +2 -0
  294. package/dist/types/TriggerResponse.js.map +1 -0
  295. package/dist/types/Triggers.d.ts +5 -0
  296. package/dist/types/Triggers.js +2 -0
  297. package/dist/types/Triggers.js.map +1 -0
  298. package/dist/types/TryCatch.d.ts +6 -0
  299. package/dist/types/TryCatch.js +2 -0
  300. package/dist/types/TryCatch.js.map +1 -0
  301. package/dist/visualization/NodeDependencyGraph.d.ts +76 -0
  302. package/dist/visualization/NodeDependencyGraph.js +418 -0
  303. package/dist/visualization/NodeDependencyGraph.js.map +1 -0
  304. package/dist/visualization/WorkflowVisualizer.d.ts +144 -0
  305. package/dist/visualization/WorkflowVisualizer.js +446 -0
  306. package/dist/visualization/WorkflowVisualizer.js.map +1 -0
  307. package/package.json +95 -0
@@ -0,0 +1,207 @@
1
+ /**
2
+ * StructuredLogger - Production-grade JSON structured logging with trace context
3
+ *
4
+ * Outputs machine-parseable JSON log lines with standardized fields compatible
5
+ * with Grafana Loki, ELK Stack, CloudWatch Logs, and DataDog Logs.
6
+ *
7
+ * Key features:
8
+ * - JSON-structured output with consistent field ordering
9
+ * - OpenTelemetry trace context correlation (trace_id, span_id)
10
+ * - Log levels: debug, info, warn, error, fatal
11
+ * - Child loggers with inherited context
12
+ * - Configurable transports (stdout, stderr, callback)
13
+ * - Respects BLOK_LOG_LEVEL and CONSOLE_LOG_ACTIVE env vars
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * import { StructuredLogger } from "@blokjs/runner";
18
+ *
19
+ * const logger = new StructuredLogger({
20
+ * service: "blok-http",
21
+ * environment: "production",
22
+ * });
23
+ *
24
+ * logger.info("Workflow started", { workflow: "user-api", requestId: "abc" });
25
+ * // Output: {"timestamp":"2026-01-29T...","level":"info","service":"blok-http",
26
+ * // "message":"Workflow started","workflow":"user-api","requestId":"abc"}
27
+ *
28
+ * // Child logger with persistent fields
29
+ * const reqLogger = logger.child({ requestId: "abc", workflow: "user-api" });
30
+ * reqLogger.info("Node executed", { node: "db-query", durationMs: 42 });
31
+ * ```
32
+ */
33
+ import { trace } from "@opentelemetry/api";
34
+ const LOG_LEVEL_PRIORITY = {
35
+ debug: 0,
36
+ info: 1,
37
+ warn: 2,
38
+ error: 3,
39
+ fatal: 4,
40
+ };
41
+ export class StructuredLogger {
42
+ config;
43
+ transport;
44
+ defaultFields;
45
+ minLevelPriority;
46
+ /** Collected log entries (kept for getLogs() compatibility) */
47
+ logs = [];
48
+ maxLogBuffer;
49
+ constructor(config) {
50
+ this.config = {
51
+ service: config.service,
52
+ environment: config.environment || process.env.NODE_ENV || "development",
53
+ level: config.level || process.env.BLOK_LOG_LEVEL || "info",
54
+ };
55
+ this.minLevelPriority = LOG_LEVEL_PRIORITY[this.config.level] ?? 1;
56
+ this.defaultFields = config.defaultFields ?? {};
57
+ this.maxLogBuffer = 1000;
58
+ this.transport =
59
+ config.transport ??
60
+ ((entry) => {
61
+ const json = JSON.stringify(entry);
62
+ if (entry.level === "error" || entry.level === "fatal") {
63
+ process.stderr.write(`${json}\n`);
64
+ }
65
+ else {
66
+ process.stdout.write(`${json}\n`);
67
+ }
68
+ });
69
+ }
70
+ /**
71
+ * Create a child logger with additional persistent context fields.
72
+ * Useful for request-scoped logging.
73
+ */
74
+ child(fields) {
75
+ const child = new StructuredLogger({
76
+ service: this.config.service,
77
+ environment: this.config.environment,
78
+ level: this.config.level,
79
+ transport: this.transport,
80
+ defaultFields: { ...this.defaultFields, ...fields },
81
+ });
82
+ return child;
83
+ }
84
+ /**
85
+ * Log at debug level.
86
+ */
87
+ debug(message, fields) {
88
+ this.write("debug", message, fields);
89
+ }
90
+ /**
91
+ * Log at info level.
92
+ */
93
+ info(message, fields) {
94
+ this.write("info", message, fields);
95
+ }
96
+ /**
97
+ * Log at warn level.
98
+ */
99
+ warn(message, fields) {
100
+ this.write("warn", message, fields);
101
+ }
102
+ /**
103
+ * Log at error level, optionally with an Error object.
104
+ */
105
+ error(message, fields) {
106
+ const extra = { ...fields };
107
+ if (extra.error instanceof Error) {
108
+ extra.error_message = extra.error.message;
109
+ extra.error_stack = extra.error.stack;
110
+ extra.error_name = extra.error.name;
111
+ extra.error = undefined;
112
+ }
113
+ this.write("error", message, extra);
114
+ }
115
+ /**
116
+ * Log at fatal level.
117
+ */
118
+ fatal(message, fields) {
119
+ this.write("fatal", message, fields);
120
+ }
121
+ /**
122
+ * Log with an explicit span for trace correlation.
123
+ * Use when you have a reference to the active span.
124
+ */
125
+ withSpan(span, level, message, fields) {
126
+ const spanCtx = span.spanContext();
127
+ this.write(level, message, {
128
+ ...fields,
129
+ trace_id: spanCtx.traceId,
130
+ span_id: spanCtx.spanId,
131
+ });
132
+ }
133
+ /**
134
+ * Get collected log entries.
135
+ */
136
+ getLogs() {
137
+ return [...this.logs];
138
+ }
139
+ /**
140
+ * Get collected logs as newline-delimited JSON (NDJSON).
141
+ */
142
+ getLogsAsNDJSON() {
143
+ return this.logs.map((entry) => JSON.stringify(entry)).join("\n");
144
+ }
145
+ /**
146
+ * Clear the log buffer.
147
+ */
148
+ clearLogs() {
149
+ this.logs = [];
150
+ }
151
+ /**
152
+ * Get current minimum log level.
153
+ */
154
+ getLevel() {
155
+ return this.config.level;
156
+ }
157
+ /**
158
+ * Set minimum log level at runtime.
159
+ */
160
+ setLevel(level) {
161
+ this.config.level = level;
162
+ this.minLevelPriority = LOG_LEVEL_PRIORITY[level] ?? 1;
163
+ }
164
+ /**
165
+ * Check if a given level is enabled (at or above current minimum).
166
+ */
167
+ isLevelEnabled(level) {
168
+ return (LOG_LEVEL_PRIORITY[level] ?? 0) >= this.minLevelPriority;
169
+ }
170
+ // --- Internal ---
171
+ write(level, message, fields) {
172
+ // Check CONSOLE_LOG_ACTIVE
173
+ if (process.env.CONSOLE_LOG_ACTIVE === "false")
174
+ return;
175
+ // Check minimum level
176
+ if ((LOG_LEVEL_PRIORITY[level] ?? 0) < this.minLevelPriority)
177
+ return;
178
+ const entry = {
179
+ timestamp: new Date().toISOString(),
180
+ level,
181
+ service: this.config.service,
182
+ env: this.config.environment,
183
+ message,
184
+ ...this.defaultFields,
185
+ ...fields,
186
+ };
187
+ // Inject OpenTelemetry trace context if available and not already set
188
+ if (!entry.trace_id) {
189
+ const activeSpan = trace.getActiveSpan();
190
+ if (activeSpan) {
191
+ const spanCtx = activeSpan.spanContext();
192
+ if (spanCtx.traceId !== "00000000000000000000000000000000") {
193
+ entry.trace_id = spanCtx.traceId;
194
+ entry.span_id = spanCtx.spanId;
195
+ }
196
+ }
197
+ }
198
+ // Buffer for getLogs()
199
+ this.logs.push(entry);
200
+ if (this.logs.length > this.maxLogBuffer) {
201
+ this.logs = this.logs.slice(-Math.floor(this.maxLogBuffer / 2));
202
+ }
203
+ // Transport
204
+ this.transport(entry);
205
+ }
206
+ }
207
+ //# sourceMappingURL=StructuredLogger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StructuredLogger.js","sourceRoot":"","sources":["../../src/monitoring/StructuredLogger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * TracingBootstrap - Configures OpenTelemetry TracerProvider with OTLP/Jaeger/Zipkin exporters
3
+ *
4
+ * Uses dynamic imports for @opentelemetry/sdk-trace-node, OTLP exporter, etc.
5
+ * Returns null if the packages are not installed (they are optional peer dependencies).
6
+ * Call this once at trigger startup in listen().
7
+ *
8
+ * Supports multiple exporter backends:
9
+ * - OTLP (gRPC or HTTP) — works with Jaeger, Tempo, DataDog, New Relic, etc.
10
+ * - Console — for development/debugging
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * import { bootstrapTracing } from "@blokjs/runner";
15
+ *
16
+ * const result = await bootstrapTracing({
17
+ * serviceName: "blok-http",
18
+ * exporter: "otlp",
19
+ * endpoint: "http://localhost:4318/v1/traces",
20
+ * });
21
+ *
22
+ * if (result) {
23
+ * process.on("SIGTERM", result.shutdown);
24
+ * }
25
+ * ```
26
+ */
27
+ export type TracingExporterType = "otlp" | "console";
28
+ export interface TracingBootstrapConfig {
29
+ /** Service name used in Resource attributes */
30
+ serviceName: string;
31
+ /** Service version (default: "0.0.1") */
32
+ serviceVersion?: string;
33
+ /** Exporter type (default: "otlp") */
34
+ exporter?: TracingExporterType;
35
+ /**
36
+ * OTLP endpoint URL (default: env OTEL_EXPORTER_OTLP_TRACES_ENDPOINT
37
+ * or "http://localhost:4318/v1/traces")
38
+ */
39
+ endpoint?: string;
40
+ /** OTLP protocol: "http/protobuf" | "grpc" (default: "http/protobuf") */
41
+ protocol?: "http/protobuf" | "grpc";
42
+ /** Additional OTLP headers (e.g., auth tokens for DataDog/New Relic) */
43
+ headers?: Record<string, string>;
44
+ /** Sampling ratio (0.0 to 1.0, default: 1.0) */
45
+ samplingRatio?: number;
46
+ /** Max batch export delay in ms (default: 5000) */
47
+ batchExportDelayMs?: number;
48
+ /** Max export batch size (default: 512) */
49
+ maxExportBatchSize?: number;
50
+ }
51
+ export interface TracingBootstrapResult {
52
+ /** Graceful shutdown — flushes pending spans and shuts down the provider */
53
+ shutdown: () => Promise<void>;
54
+ /** Force flush pending spans */
55
+ forceFlush: () => Promise<void>;
56
+ }
57
+ /**
58
+ * Bootstrap distributed tracing using OpenTelemetry.
59
+ *
60
+ * Dynamically imports @opentelemetry/sdk-trace-node and the selected exporter.
61
+ * If the packages are not installed, returns null silently.
62
+ *
63
+ * @returns Bootstrap result with shutdown/flush, or null if packages unavailable
64
+ */
65
+ export declare function bootstrapTracing(config: TracingBootstrapConfig): Promise<TracingBootstrapResult | null>;
66
+ /**
67
+ * Reset the initialization state. Useful for testing.
68
+ */
69
+ export declare function resetTracingBootstrap(): void;
@@ -0,0 +1,129 @@
1
+ /**
2
+ * TracingBootstrap - Configures OpenTelemetry TracerProvider with OTLP/Jaeger/Zipkin exporters
3
+ *
4
+ * Uses dynamic imports for @opentelemetry/sdk-trace-node, OTLP exporter, etc.
5
+ * Returns null if the packages are not installed (they are optional peer dependencies).
6
+ * Call this once at trigger startup in listen().
7
+ *
8
+ * Supports multiple exporter backends:
9
+ * - OTLP (gRPC or HTTP) — works with Jaeger, Tempo, DataDog, New Relic, etc.
10
+ * - Console — for development/debugging
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * import { bootstrapTracing } from "@blokjs/runner";
15
+ *
16
+ * const result = await bootstrapTracing({
17
+ * serviceName: "blok-http",
18
+ * exporter: "otlp",
19
+ * endpoint: "http://localhost:4318/v1/traces",
20
+ * });
21
+ *
22
+ * if (result) {
23
+ * process.on("SIGTERM", result.shutdown);
24
+ * }
25
+ * ```
26
+ */
27
+ import { trace } from "@opentelemetry/api";
28
+ let initialized = false;
29
+ /**
30
+ * Bootstrap distributed tracing using OpenTelemetry.
31
+ *
32
+ * Dynamically imports @opentelemetry/sdk-trace-node and the selected exporter.
33
+ * If the packages are not installed, returns null silently.
34
+ *
35
+ * @returns Bootstrap result with shutdown/flush, or null if packages unavailable
36
+ */
37
+ export async function bootstrapTracing(config) {
38
+ if (initialized) {
39
+ return null;
40
+ }
41
+ try {
42
+ const exporterType = config.exporter ?? "otlp";
43
+ const protocol = config.protocol ?? "http/protobuf";
44
+ // Dynamic imports — these are optional peer dependencies
45
+ const sdkTracePkg = "@opentelemetry/sdk-trace-node";
46
+ const resourcesPkg = "@opentelemetry/resources";
47
+ const semconvPkg = "@opentelemetry/semantic-conventions";
48
+ const [sdkMod, resourceMod, semconvMod] = await Promise.all([
49
+ import(/* webpackIgnore: true */ sdkTracePkg),
50
+ import(/* webpackIgnore: true */ resourcesPkg),
51
+ import(/* webpackIgnore: true */ semconvPkg),
52
+ ]);
53
+ const { NodeTracerProvider, BatchSpanProcessor, SimpleSpanProcessor, ConsoleSpanExporter } = sdkMod;
54
+ const { Resource } = resourceMod;
55
+ const { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } = semconvMod;
56
+ // Build resource
57
+ const resource = Resource.default().merge(new Resource({
58
+ [ATTR_SERVICE_NAME]: config.serviceName,
59
+ [ATTR_SERVICE_VERSION]: config.serviceVersion ?? "0.0.1",
60
+ }));
61
+ // Create the appropriate exporter
62
+ let spanExporter;
63
+ let spanProcessor;
64
+ if (exporterType === "console") {
65
+ spanExporter = new ConsoleSpanExporter();
66
+ spanProcessor = new SimpleSpanProcessor(spanExporter);
67
+ }
68
+ else {
69
+ // OTLP exporter
70
+ const endpoint = config.endpoint ||
71
+ process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT ||
72
+ process.env.OTEL_EXPORTER_OTLP_ENDPOINT ||
73
+ "http://localhost:4318/v1/traces";
74
+ if (protocol === "grpc") {
75
+ const grpcPkg = "@opentelemetry/exporter-trace-otlp-grpc";
76
+ const grpcMod = await import(/* webpackIgnore: true */ grpcPkg);
77
+ spanExporter = new grpcMod.OTLPTraceExporter({
78
+ url: endpoint,
79
+ headers: config.headers,
80
+ });
81
+ }
82
+ else {
83
+ const httpPkg = "@opentelemetry/exporter-trace-otlp-http";
84
+ const httpMod = await import(/* webpackIgnore: true */ httpPkg);
85
+ spanExporter = new httpMod.OTLPTraceExporter({
86
+ url: endpoint,
87
+ headers: config.headers,
88
+ });
89
+ }
90
+ spanProcessor = new BatchSpanProcessor(spanExporter, {
91
+ maxExportBatchSize: config.maxExportBatchSize ?? 512,
92
+ scheduledDelayMillis: config.batchExportDelayMs ?? 5000,
93
+ });
94
+ }
95
+ // Create provider with optional sampling
96
+ const providerConfig = { resource };
97
+ if (config.samplingRatio !== undefined && config.samplingRatio < 1.0) {
98
+ const { TraceIdRatioBasedSampler } = sdkMod;
99
+ providerConfig.sampler = new TraceIdRatioBasedSampler(config.samplingRatio);
100
+ }
101
+ const provider = new NodeTracerProvider(providerConfig);
102
+ provider.addSpanProcessor(spanProcessor);
103
+ // Register globally so `trace.getTracer()` picks up this provider
104
+ provider.register();
105
+ initialized = true;
106
+ return {
107
+ shutdown: async () => {
108
+ await provider.shutdown();
109
+ initialized = false;
110
+ },
111
+ forceFlush: async () => {
112
+ await provider.forceFlush();
113
+ },
114
+ };
115
+ }
116
+ catch {
117
+ // OpenTelemetry SDK packages not installed — this is expected and fine
118
+ return null;
119
+ }
120
+ }
121
+ /**
122
+ * Reset the initialization state. Useful for testing.
123
+ */
124
+ export function resetTracingBootstrap() {
125
+ // Also disable the global tracer provider so a fresh one can be registered
126
+ trace.disable();
127
+ initialized = false;
128
+ }
129
+ //# sourceMappingURL=TracingBootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TracingBootstrap.js","sourceRoot":"","sources":["../../src/monitoring/TracingBootstrap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * TriggerMetricsCollector - Enhanced Metrics for Blok Triggers
3
+ *
4
+ * Centralized metrics collection with latency percentiles,
5
+ * error categorization, throughput tracking, and resource monitoring.
6
+ */
7
+ export interface LatencyStats {
8
+ count: number;
9
+ min: number;
10
+ max: number;
11
+ avg: number;
12
+ p50: number;
13
+ p95: number;
14
+ p99: number;
15
+ }
16
+ export interface ErrorStats {
17
+ total: number;
18
+ byCategory: Record<string, number>;
19
+ recentErrors: Array<{
20
+ message: string;
21
+ category: string;
22
+ timestamp: number;
23
+ }>;
24
+ }
25
+ export interface ThroughputStats {
26
+ totalRequests: number;
27
+ successfulRequests: number;
28
+ failedRequests: number;
29
+ requestsPerSecond: number;
30
+ successRate: number;
31
+ }
32
+ export interface TriggerMetrics {
33
+ triggerType: string;
34
+ triggerName: string;
35
+ startTime: number;
36
+ latency: LatencyStats;
37
+ errors: ErrorStats;
38
+ throughput: ThroughputStats;
39
+ activeConnections: number;
40
+ customMetrics: Record<string, number>;
41
+ }
42
+ export declare class TriggerMetricsCollector {
43
+ private triggerType;
44
+ private triggerName;
45
+ private startTime;
46
+ private latencySamples;
47
+ private errorCount;
48
+ private errorsByCategory;
49
+ private recentErrors;
50
+ private totalRequests;
51
+ private successfulRequests;
52
+ private failedRequests;
53
+ private _activeConnections;
54
+ private customMetrics;
55
+ private requestTimestamps;
56
+ private rpsWindow;
57
+ constructor(triggerType: string, triggerName: string);
58
+ /**
59
+ * Record a successful request with its latency.
60
+ */
61
+ recordSuccess(latencyMs: number): void;
62
+ /**
63
+ * Record a failed request with error details.
64
+ */
65
+ recordFailure(latencyMs: number, error: Error | string, category?: string): void;
66
+ /**
67
+ * Track active connections (for WebSocket, SSE, etc.).
68
+ */
69
+ incrementConnections(): void;
70
+ decrementConnections(): void;
71
+ get activeConnections(): number;
72
+ /**
73
+ * Set a custom metric value.
74
+ */
75
+ setMetric(name: string, value: number): void;
76
+ /**
77
+ * Increment a custom metric.
78
+ */
79
+ incrementMetric(name: string, amount?: number): void;
80
+ /**
81
+ * Get a snapshot of all metrics.
82
+ */
83
+ getMetrics(): TriggerMetrics;
84
+ /**
85
+ * Reset all collected metrics.
86
+ */
87
+ reset(): void;
88
+ private addLatencySample;
89
+ private recordRequestTimestamp;
90
+ private getLatencyStats;
91
+ private getErrorStats;
92
+ private getThroughputStats;
93
+ private percentile;
94
+ }
@@ -0,0 +1,174 @@
1
+ /**
2
+ * TriggerMetricsCollector - Enhanced Metrics for Blok Triggers
3
+ *
4
+ * Centralized metrics collection with latency percentiles,
5
+ * error categorization, throughput tracking, and resource monitoring.
6
+ */
7
+ const MAX_RECENT_ERRORS = 50;
8
+ const MAX_LATENCY_SAMPLES = 10_000;
9
+ export class TriggerMetricsCollector {
10
+ triggerType;
11
+ triggerName;
12
+ startTime;
13
+ latencySamples = [];
14
+ errorCount = 0;
15
+ errorsByCategory = new Map();
16
+ recentErrors = [];
17
+ totalRequests = 0;
18
+ successfulRequests = 0;
19
+ failedRequests = 0;
20
+ _activeConnections = 0;
21
+ customMetrics = new Map();
22
+ requestTimestamps = [];
23
+ rpsWindow = 60_000; // 1 minute window for RPS calculation
24
+ constructor(triggerType, triggerName) {
25
+ this.triggerType = triggerType;
26
+ this.triggerName = triggerName;
27
+ this.startTime = Date.now();
28
+ }
29
+ /**
30
+ * Record a successful request with its latency.
31
+ */
32
+ recordSuccess(latencyMs) {
33
+ this.totalRequests++;
34
+ this.successfulRequests++;
35
+ this.addLatencySample(latencyMs);
36
+ this.recordRequestTimestamp();
37
+ }
38
+ /**
39
+ * Record a failed request with error details.
40
+ */
41
+ recordFailure(latencyMs, error, category = "unknown") {
42
+ this.totalRequests++;
43
+ this.failedRequests++;
44
+ this.errorCount++;
45
+ this.addLatencySample(latencyMs);
46
+ this.recordRequestTimestamp();
47
+ const count = this.errorsByCategory.get(category) || 0;
48
+ this.errorsByCategory.set(category, count + 1);
49
+ this.recentErrors.push({
50
+ message: typeof error === "string" ? error : error.message,
51
+ category,
52
+ timestamp: Date.now(),
53
+ });
54
+ if (this.recentErrors.length > MAX_RECENT_ERRORS) {
55
+ this.recentErrors.shift();
56
+ }
57
+ }
58
+ /**
59
+ * Track active connections (for WebSocket, SSE, etc.).
60
+ */
61
+ incrementConnections() {
62
+ this._activeConnections++;
63
+ }
64
+ decrementConnections() {
65
+ this._activeConnections = Math.max(0, this._activeConnections - 1);
66
+ }
67
+ get activeConnections() {
68
+ return this._activeConnections;
69
+ }
70
+ /**
71
+ * Set a custom metric value.
72
+ */
73
+ setMetric(name, value) {
74
+ this.customMetrics.set(name, value);
75
+ }
76
+ /**
77
+ * Increment a custom metric.
78
+ */
79
+ incrementMetric(name, amount = 1) {
80
+ const current = this.customMetrics.get(name) || 0;
81
+ this.customMetrics.set(name, current + amount);
82
+ }
83
+ /**
84
+ * Get a snapshot of all metrics.
85
+ */
86
+ getMetrics() {
87
+ return {
88
+ triggerType: this.triggerType,
89
+ triggerName: this.triggerName,
90
+ startTime: this.startTime,
91
+ latency: this.getLatencyStats(),
92
+ errors: this.getErrorStats(),
93
+ throughput: this.getThroughputStats(),
94
+ activeConnections: this._activeConnections,
95
+ customMetrics: Object.fromEntries(this.customMetrics),
96
+ };
97
+ }
98
+ /**
99
+ * Reset all collected metrics.
100
+ */
101
+ reset() {
102
+ this.latencySamples = [];
103
+ this.errorCount = 0;
104
+ this.errorsByCategory.clear();
105
+ this.recentErrors = [];
106
+ this.totalRequests = 0;
107
+ this.successfulRequests = 0;
108
+ this.failedRequests = 0;
109
+ this._activeConnections = 0;
110
+ this.customMetrics.clear();
111
+ this.requestTimestamps = [];
112
+ this.startTime = Date.now();
113
+ }
114
+ addLatencySample(ms) {
115
+ this.latencySamples.push(ms);
116
+ if (this.latencySamples.length > MAX_LATENCY_SAMPLES) {
117
+ // Keep only the most recent half
118
+ this.latencySamples = this.latencySamples.slice(-MAX_LATENCY_SAMPLES / 2);
119
+ }
120
+ }
121
+ recordRequestTimestamp() {
122
+ const now = Date.now();
123
+ this.requestTimestamps.push(now);
124
+ // Prune timestamps outside the RPS window
125
+ const cutoff = now - this.rpsWindow;
126
+ while (this.requestTimestamps.length > 0 && this.requestTimestamps[0] < cutoff) {
127
+ this.requestTimestamps.shift();
128
+ }
129
+ }
130
+ getLatencyStats() {
131
+ if (this.latencySamples.length === 0) {
132
+ return { count: 0, min: 0, max: 0, avg: 0, p50: 0, p95: 0, p99: 0 };
133
+ }
134
+ const sorted = [...this.latencySamples].sort((a, b) => a - b);
135
+ const count = sorted.length;
136
+ const sum = sorted.reduce((a, b) => a + b, 0);
137
+ return {
138
+ count,
139
+ min: sorted[0],
140
+ max: sorted[count - 1],
141
+ avg: sum / count,
142
+ p50: this.percentile(sorted, 50),
143
+ p95: this.percentile(sorted, 95),
144
+ p99: this.percentile(sorted, 99),
145
+ };
146
+ }
147
+ getErrorStats() {
148
+ return {
149
+ total: this.errorCount,
150
+ byCategory: Object.fromEntries(this.errorsByCategory),
151
+ recentErrors: [...this.recentErrors],
152
+ };
153
+ }
154
+ getThroughputStats() {
155
+ const now = Date.now();
156
+ const cutoff = now - this.rpsWindow;
157
+ const recentRequests = this.requestTimestamps.filter((t) => t > cutoff).length;
158
+ const windowSeconds = this.rpsWindow / 1000;
159
+ return {
160
+ totalRequests: this.totalRequests,
161
+ successfulRequests: this.successfulRequests,
162
+ failedRequests: this.failedRequests,
163
+ requestsPerSecond: recentRequests / windowSeconds,
164
+ successRate: this.totalRequests > 0 ? this.successfulRequests / this.totalRequests : 1,
165
+ };
166
+ }
167
+ percentile(sorted, p) {
168
+ if (sorted.length === 0)
169
+ return 0;
170
+ const index = Math.ceil((p / 100) * sorted.length) - 1;
171
+ return sorted[Math.max(0, Math.min(index, sorted.length - 1))];
172
+ }
173
+ }
174
+ //# sourceMappingURL=TriggerMetricsCollector.js.map