@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.
- package/dist/Blok.d.ts +19 -0
- package/dist/Blok.js +184 -0
- package/dist/Blok.js.map +1 -0
- package/dist/BlokResponse.d.ts +16 -0
- package/dist/BlokResponse.js +28 -0
- package/dist/BlokResponse.js.map +1 -0
- package/dist/Configuration.d.ts +37 -0
- package/dist/Configuration.js +248 -0
- package/dist/Configuration.js.map +1 -0
- package/dist/ConfigurationResolver.d.ts +7 -0
- package/dist/ConfigurationResolver.js +15 -0
- package/dist/ConfigurationResolver.js.map +1 -0
- package/dist/DefaultLogger.d.ts +65 -0
- package/dist/DefaultLogger.js +101 -0
- package/dist/DefaultLogger.js.map +1 -0
- package/dist/LocalStorage.d.ts +7 -0
- package/dist/LocalStorage.js +56 -0
- package/dist/LocalStorage.js.map +1 -0
- package/dist/MemoryUsage.d.ts +22 -0
- package/dist/MemoryUsage.js +83 -0
- package/dist/MemoryUsage.js.map +1 -0
- package/dist/NodeMap.d.ts +7 -0
- package/dist/NodeMap.js +13 -0
- package/dist/NodeMap.js.map +1 -0
- package/dist/ResolverBase.d.ts +8 -0
- package/dist/ResolverBase.js +18 -0
- package/dist/ResolverBase.js.map +1 -0
- package/dist/Runner.d.ts +25 -0
- package/dist/Runner.js +32 -0
- package/dist/Runner.js.map +1 -0
- package/dist/RunnerNode.d.ts +9 -0
- package/dist/RunnerNode.js +8 -0
- package/dist/RunnerNode.js.map +1 -0
- package/dist/RunnerNodeBase.d.ts +4 -0
- package/dist/RunnerNodeBase.js +3 -0
- package/dist/RunnerNodeBase.js.map +1 -0
- package/dist/RunnerSteps.d.ts +14 -0
- package/dist/RunnerSteps.js +110 -0
- package/dist/RunnerSteps.js.map +1 -0
- package/dist/RuntimeAdapterNode.d.ts +19 -0
- package/dist/RuntimeAdapterNode.js +87 -0
- package/dist/RuntimeAdapterNode.js.map +1 -0
- package/dist/RuntimeRegistry.d.ts +61 -0
- package/dist/RuntimeRegistry.js +87 -0
- package/dist/RuntimeRegistry.js.map +1 -0
- package/dist/TriggerBase.d.ts +119 -0
- package/dist/TriggerBase.js +413 -0
- package/dist/TriggerBase.js.map +1 -0
- package/dist/adapters/BunRuntimeAdapter.d.ts +38 -0
- package/dist/adapters/BunRuntimeAdapter.js +169 -0
- package/dist/adapters/BunRuntimeAdapter.js.map +1 -0
- package/dist/adapters/DockerRuntimeAdapter.d.ts +85 -0
- package/dist/adapters/DockerRuntimeAdapter.js +298 -0
- package/dist/adapters/DockerRuntimeAdapter.js.map +1 -0
- package/dist/adapters/HttpRuntimeAdapter.d.ts +58 -0
- package/dist/adapters/HttpRuntimeAdapter.js +152 -0
- package/dist/adapters/HttpRuntimeAdapter.js.map +1 -0
- package/dist/adapters/NodeJsRuntimeAdapter.d.ts +23 -0
- package/dist/adapters/NodeJsRuntimeAdapter.js +67 -0
- package/dist/adapters/NodeJsRuntimeAdapter.js.map +1 -0
- package/dist/adapters/RuntimeAdapter.d.ts +42 -0
- package/dist/adapters/RuntimeAdapter.js +2 -0
- package/dist/adapters/RuntimeAdapter.js.map +1 -0
- package/dist/adapters/WasmRuntimeAdapter.d.ts +69 -0
- package/dist/adapters/WasmRuntimeAdapter.js +279 -0
- package/dist/adapters/WasmRuntimeAdapter.js.map +1 -0
- package/dist/cache/NodeResultCache.d.ts +286 -0
- package/dist/cache/NodeResultCache.js +499 -0
- package/dist/cache/NodeResultCache.js.map +1 -0
- package/dist/cache/index.d.ts +1 -0
- package/dist/cache/index.js +2 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cost/CostEstimator.d.ts +57 -0
- package/dist/cost/CostEstimator.js +171 -0
- package/dist/cost/CostEstimator.js.map +1 -0
- package/dist/cost/index.d.ts +4 -0
- package/dist/cost/index.js +3 -0
- package/dist/cost/index.js.map +1 -0
- package/dist/cost/pricing.d.ts +24 -0
- package/dist/cost/pricing.js +169 -0
- package/dist/cost/pricing.js.map +1 -0
- package/dist/defineNode.d.ts +155 -0
- package/dist/defineNode.js +191 -0
- package/dist/defineNode.js.map +1 -0
- package/dist/graphql/GraphQLSchemaGenerator.d.ts +129 -0
- package/dist/graphql/GraphQLSchemaGenerator.js +425 -0
- package/dist/graphql/GraphQLSchemaGenerator.js.map +1 -0
- package/dist/hmr/FileWatcher.d.ts +62 -0
- package/dist/hmr/FileWatcher.js +185 -0
- package/dist/hmr/FileWatcher.js.map +1 -0
- package/dist/hmr/HmrDevConsole.d.ts +13 -0
- package/dist/hmr/HmrDevConsole.js +46 -0
- package/dist/hmr/HmrDevConsole.js.map +1 -0
- package/dist/hmr/HotReloadManager.d.ts +84 -0
- package/dist/hmr/HotReloadManager.js +195 -0
- package/dist/hmr/HotReloadManager.js.map +1 -0
- package/dist/hmr/index.d.ts +39 -0
- package/dist/hmr/index.js +38 -0
- package/dist/hmr/index.js.map +1 -0
- package/dist/index.d.ts +107 -0
- package/dist/index.js +107 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/APMIntegration.d.ts +141 -0
- package/dist/integrations/APMIntegration.js +212 -0
- package/dist/integrations/APMIntegration.js.map +1 -0
- package/dist/integrations/AzureMonitorIntegration.d.ts +118 -0
- package/dist/integrations/AzureMonitorIntegration.js +254 -0
- package/dist/integrations/AzureMonitorIntegration.js.map +1 -0
- package/dist/integrations/CloudWatchIntegration.d.ts +135 -0
- package/dist/integrations/CloudWatchIntegration.js +293 -0
- package/dist/integrations/CloudWatchIntegration.js.map +1 -0
- package/dist/integrations/SentryIntegration.d.ts +153 -0
- package/dist/integrations/SentryIntegration.js +200 -0
- package/dist/integrations/SentryIntegration.js.map +1 -0
- package/dist/integrations/index.d.ts +19 -0
- package/dist/integrations/index.js +16 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/marketplace/RuntimeAutoScaler.d.ts +148 -0
- package/dist/marketplace/RuntimeAutoScaler.js +366 -0
- package/dist/marketplace/RuntimeAutoScaler.js.map +1 -0
- package/dist/marketplace/RuntimeCatalog.d.ts +174 -0
- package/dist/marketplace/RuntimeCatalog.js +339 -0
- package/dist/marketplace/RuntimeCatalog.js.map +1 -0
- package/dist/marketplace/RuntimeDiscovery.d.ts +86 -0
- package/dist/marketplace/RuntimeDiscovery.js +219 -0
- package/dist/marketplace/RuntimeDiscovery.js.map +1 -0
- package/dist/marketplace/RuntimeHealthMonitor.d.ts +100 -0
- package/dist/marketplace/RuntimeHealthMonitor.js +241 -0
- package/dist/marketplace/RuntimeHealthMonitor.js.map +1 -0
- package/dist/marketplace/RuntimeMetricsDashboard.d.ts +113 -0
- package/dist/marketplace/RuntimeMetricsDashboard.js +293 -0
- package/dist/marketplace/RuntimeMetricsDashboard.js.map +1 -0
- package/dist/monitoring/CircuitBreaker.d.ts +107 -0
- package/dist/monitoring/CircuitBreaker.js +238 -0
- package/dist/monitoring/CircuitBreaker.js.map +1 -0
- package/dist/monitoring/DistributedTracer.d.ts +125 -0
- package/dist/monitoring/DistributedTracer.js +230 -0
- package/dist/monitoring/DistributedTracer.js.map +1 -0
- package/dist/monitoring/HealthCheck.d.ts +54 -0
- package/dist/monitoring/HealthCheck.js +102 -0
- package/dist/monitoring/HealthCheck.js.map +1 -0
- package/dist/monitoring/PerformanceProfiler.d.ts +63 -0
- package/dist/monitoring/PerformanceProfiler.js +229 -0
- package/dist/monitoring/PerformanceProfiler.js.map +1 -0
- package/dist/monitoring/PrometheusBootstrap.d.ts +30 -0
- package/dist/monitoring/PrometheusBootstrap.js +71 -0
- package/dist/monitoring/PrometheusBootstrap.js.map +1 -0
- package/dist/monitoring/PrometheusMetricsBridge.d.ts +60 -0
- package/dist/monitoring/PrometheusMetricsBridge.js +216 -0
- package/dist/monitoring/PrometheusMetricsBridge.js.map +1 -0
- package/dist/monitoring/RateLimiter.d.ts +58 -0
- package/dist/monitoring/RateLimiter.js +128 -0
- package/dist/monitoring/RateLimiter.js.map +1 -0
- package/dist/monitoring/StructuredLogger.d.ts +131 -0
- package/dist/monitoring/StructuredLogger.js +207 -0
- package/dist/monitoring/StructuredLogger.js.map +1 -0
- package/dist/monitoring/TracingBootstrap.d.ts +69 -0
- package/dist/monitoring/TracingBootstrap.js +129 -0
- package/dist/monitoring/TracingBootstrap.js.map +1 -0
- package/dist/monitoring/TriggerMetricsCollector.d.ts +94 -0
- package/dist/monitoring/TriggerMetricsCollector.js +174 -0
- package/dist/monitoring/TriggerMetricsCollector.js.map +1 -0
- package/dist/monitoring/index.d.ts +9 -0
- package/dist/monitoring/index.js +10 -0
- package/dist/monitoring/index.js.map +1 -0
- package/dist/openapi/OpenAPIGenerator.d.ts +192 -0
- package/dist/openapi/OpenAPIGenerator.js +373 -0
- package/dist/openapi/OpenAPIGenerator.js.map +1 -0
- package/dist/openapi/index.d.ts +20 -0
- package/dist/openapi/index.js +20 -0
- package/dist/openapi/index.js.map +1 -0
- package/dist/security/ABAC.d.ts +224 -0
- package/dist/security/ABAC.js +380 -0
- package/dist/security/ABAC.js.map +1 -0
- package/dist/security/AuditLogger.d.ts +242 -0
- package/dist/security/AuditLogger.js +317 -0
- package/dist/security/AuditLogger.js.map +1 -0
- package/dist/security/AuthMiddleware.d.ts +163 -0
- package/dist/security/AuthMiddleware.js +274 -0
- package/dist/security/AuthMiddleware.js.map +1 -0
- package/dist/security/EncryptionAtRest.d.ts +206 -0
- package/dist/security/EncryptionAtRest.js +236 -0
- package/dist/security/EncryptionAtRest.js.map +1 -0
- package/dist/security/OAuthProvider.d.ts +334 -0
- package/dist/security/OAuthProvider.js +719 -0
- package/dist/security/OAuthProvider.js.map +1 -0
- package/dist/security/PIIDetector.d.ts +233 -0
- package/dist/security/PIIDetector.js +354 -0
- package/dist/security/PIIDetector.js.map +1 -0
- package/dist/security/RBAC.d.ts +143 -0
- package/dist/security/RBAC.js +285 -0
- package/dist/security/RBAC.js.map +1 -0
- package/dist/security/SecretManager.d.ts +652 -0
- package/dist/security/SecretManager.js +1146 -0
- package/dist/security/SecretManager.js.map +1 -0
- package/dist/security/TLSConfig.d.ts +305 -0
- package/dist/security/TLSConfig.js +550 -0
- package/dist/security/TLSConfig.js.map +1 -0
- package/dist/security/index.d.ts +79 -0
- package/dist/security/index.js +80 -0
- package/dist/security/index.js.map +1 -0
- package/dist/testing/TestHarness.d.ts +189 -0
- package/dist/testing/TestHarness.js +272 -0
- package/dist/testing/TestHarness.js.map +1 -0
- package/dist/testing/TestLogger.d.ts +103 -0
- package/dist/testing/TestLogger.js +153 -0
- package/dist/testing/TestLogger.js.map +1 -0
- package/dist/testing/WorkflowTestRunner.d.ts +172 -0
- package/dist/testing/WorkflowTestRunner.js +355 -0
- package/dist/testing/WorkflowTestRunner.js.map +1 -0
- package/dist/testing/index.d.ts +21 -0
- package/dist/testing/index.js +22 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/tracing/InMemoryRunStore.d.ts +44 -0
- package/dist/tracing/InMemoryRunStore.js +341 -0
- package/dist/tracing/InMemoryRunStore.js.map +1 -0
- package/dist/tracing/PostgresRunStore.d.ts +82 -0
- package/dist/tracing/PostgresRunStore.js +640 -0
- package/dist/tracing/PostgresRunStore.js.map +1 -0
- package/dist/tracing/RunStore.d.ts +38 -0
- package/dist/tracing/RunStore.js +2 -0
- package/dist/tracing/RunStore.js.map +1 -0
- package/dist/tracing/RunTracker.d.ts +75 -0
- package/dist/tracing/RunTracker.js +374 -0
- package/dist/tracing/RunTracker.js.map +1 -0
- package/dist/tracing/SqliteRunStore.d.ts +53 -0
- package/dist/tracing/SqliteRunStore.js +703 -0
- package/dist/tracing/SqliteRunStore.js.map +1 -0
- package/dist/tracing/TraceRouter.d.ts +47 -0
- package/dist/tracing/TraceRouter.js +904 -0
- package/dist/tracing/TraceRouter.js.map +1 -0
- package/dist/tracing/TracingLogger.d.ts +21 -0
- package/dist/tracing/TracingLogger.js +62 -0
- package/dist/tracing/TracingLogger.js.map +1 -0
- package/dist/tracing/createStore.d.ts +30 -0
- package/dist/tracing/createStore.js +75 -0
- package/dist/tracing/createStore.js.map +1 -0
- package/dist/tracing/index.d.ts +13 -0
- package/dist/tracing/index.js +9 -0
- package/dist/tracing/index.js.map +1 -0
- package/dist/tracing/sanitize.d.ts +7 -0
- package/dist/tracing/sanitize.js +95 -0
- package/dist/tracing/sanitize.js.map +1 -0
- package/dist/tracing/types.d.ts +178 -0
- package/dist/tracing/types.js +3 -0
- package/dist/tracing/types.js.map +1 -0
- package/dist/types/Average.d.ts +11 -0
- package/dist/types/Average.js +2 -0
- package/dist/types/Average.js.map +1 -0
- package/dist/types/Condition.d.ts +8 -0
- package/dist/types/Condition.js +2 -0
- package/dist/types/Condition.js.map +1 -0
- package/dist/types/Conditions.d.ts +5 -0
- package/dist/types/Conditions.js +2 -0
- package/dist/types/Conditions.js.map +1 -0
- package/dist/types/Config.d.ts +12 -0
- package/dist/types/Config.js +2 -0
- package/dist/types/Config.js.map +1 -0
- package/dist/types/Flow.d.ts +5 -0
- package/dist/types/Flow.js +2 -0
- package/dist/types/Flow.js.map +1 -0
- package/dist/types/GlobalOptions.d.ts +11 -0
- package/dist/types/GlobalOptions.js +2 -0
- package/dist/types/GlobalOptions.js.map +1 -0
- package/dist/types/Inputs.d.ts +5 -0
- package/dist/types/Inputs.js +2 -0
- package/dist/types/Inputs.js.map +1 -0
- package/dist/types/JsonLikeObject.d.ts +3 -0
- package/dist/types/JsonLikeObject.js +2 -0
- package/dist/types/JsonLikeObject.js.map +1 -0
- package/dist/types/Mapper.d.ts +5 -0
- package/dist/types/Mapper.js +2 -0
- package/dist/types/Mapper.js.map +1 -0
- package/dist/types/Node.d.ts +10 -0
- package/dist/types/Node.js +2 -0
- package/dist/types/Node.js.map +1 -0
- package/dist/types/ParamsDictionary.d.ts +3 -0
- package/dist/types/ParamsDictionary.js +2 -0
- package/dist/types/ParamsDictionary.js.map +1 -0
- package/dist/types/Properties.d.ts +5 -0
- package/dist/types/Properties.js +2 -0
- package/dist/types/Properties.js.map +1 -0
- package/dist/types/Targets.d.ts +5 -0
- package/dist/types/Targets.js +2 -0
- package/dist/types/Targets.js.map +1 -0
- package/dist/types/Trigger.d.ts +5 -0
- package/dist/types/Trigger.js +2 -0
- package/dist/types/Trigger.js.map +1 -0
- package/dist/types/TriggerHttp.d.ts +7 -0
- package/dist/types/TriggerHttp.js +2 -0
- package/dist/types/TriggerHttp.js.map +1 -0
- package/dist/types/TriggerResponse.d.ts +6 -0
- package/dist/types/TriggerResponse.js +2 -0
- package/dist/types/TriggerResponse.js.map +1 -0
- package/dist/types/Triggers.d.ts +5 -0
- package/dist/types/Triggers.js +2 -0
- package/dist/types/Triggers.js.map +1 -0
- package/dist/types/TryCatch.d.ts +6 -0
- package/dist/types/TryCatch.js +2 -0
- package/dist/types/TryCatch.js.map +1 -0
- package/dist/visualization/NodeDependencyGraph.d.ts +76 -0
- package/dist/visualization/NodeDependencyGraph.js +418 -0
- package/dist/visualization/NodeDependencyGraph.js.map +1 -0
- package/dist/visualization/WorkflowVisualizer.d.ts +144 -0
- package/dist/visualization/WorkflowVisualizer.js +446 -0
- package/dist/visualization/WorkflowVisualizer.js.map +1 -0
- 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
|