@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,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RuntimeMetricsDashboard - Aggregated Execution Metrics for Blok Runtimes
|
|
3
|
+
*
|
|
4
|
+
* Collects and aggregates execution metrics across all runtimes with
|
|
5
|
+
* latency percentiles, throughput tracking, and resource monitoring
|
|
6
|
+
* following the same patterns as TriggerMetricsCollector.
|
|
7
|
+
*/
|
|
8
|
+
import type { ExecutionResult, RuntimeKind } from "../adapters/RuntimeAdapter";
|
|
9
|
+
export interface LatencyPercentiles {
|
|
10
|
+
count: number;
|
|
11
|
+
min: number;
|
|
12
|
+
max: number;
|
|
13
|
+
avg: number;
|
|
14
|
+
p50: number;
|
|
15
|
+
p95: number;
|
|
16
|
+
p99: number;
|
|
17
|
+
}
|
|
18
|
+
export interface ThroughputMetrics {
|
|
19
|
+
requestsPerSecond: number;
|
|
20
|
+
peakRps: number;
|
|
21
|
+
windowSizeMs: number;
|
|
22
|
+
}
|
|
23
|
+
export interface ResourceMetrics {
|
|
24
|
+
avgCpuMs: number;
|
|
25
|
+
avgMemoryBytes: number;
|
|
26
|
+
peakMemoryBytes: number;
|
|
27
|
+
}
|
|
28
|
+
export interface RuntimeExecutionMetrics {
|
|
29
|
+
runtime: RuntimeKind;
|
|
30
|
+
totalExecutions: number;
|
|
31
|
+
successfulExecutions: number;
|
|
32
|
+
failedExecutions: number;
|
|
33
|
+
successRate: number;
|
|
34
|
+
latency: LatencyPercentiles;
|
|
35
|
+
throughput: ThroughputMetrics;
|
|
36
|
+
resourceUsage: ResourceMetrics;
|
|
37
|
+
lastExecution: number;
|
|
38
|
+
}
|
|
39
|
+
export interface AggregateMetrics {
|
|
40
|
+
totalExecutions: number;
|
|
41
|
+
totalSuccess: number;
|
|
42
|
+
totalFailures: number;
|
|
43
|
+
overallSuccessRate: number;
|
|
44
|
+
avgLatencyMs: number;
|
|
45
|
+
activeRuntimes: number;
|
|
46
|
+
busiestRuntime: RuntimeKind | null;
|
|
47
|
+
slowestRuntime: RuntimeKind | null;
|
|
48
|
+
}
|
|
49
|
+
export interface DashboardSnapshot {
|
|
50
|
+
timestamp: number;
|
|
51
|
+
runtimes: RuntimeExecutionMetrics[];
|
|
52
|
+
aggregate: AggregateMetrics;
|
|
53
|
+
}
|
|
54
|
+
export declare class RuntimeMetricsDashboard {
|
|
55
|
+
private metrics;
|
|
56
|
+
/**
|
|
57
|
+
* Record an execution result for a runtime.
|
|
58
|
+
*/
|
|
59
|
+
recordExecution(runtime: RuntimeKind, result: ExecutionResult): void;
|
|
60
|
+
/**
|
|
61
|
+
* Get computed metrics for a specific runtime.
|
|
62
|
+
*/
|
|
63
|
+
getMetrics(runtime: RuntimeKind): RuntimeExecutionMetrics | undefined;
|
|
64
|
+
/**
|
|
65
|
+
* Get computed metrics for all tracked runtimes.
|
|
66
|
+
*/
|
|
67
|
+
getAllMetrics(): RuntimeExecutionMetrics[];
|
|
68
|
+
/**
|
|
69
|
+
* Get a full dashboard snapshot with per-runtime and aggregate metrics.
|
|
70
|
+
*/
|
|
71
|
+
getSnapshot(): DashboardSnapshot;
|
|
72
|
+
/**
|
|
73
|
+
* Get top runtimes ranked by a specific metric.
|
|
74
|
+
*/
|
|
75
|
+
getTopRuntimes(by: "executions" | "successRate" | "latency", limit?: number): RuntimeExecutionMetrics[];
|
|
76
|
+
/**
|
|
77
|
+
* Get execution count trend over time windows for a specific runtime.
|
|
78
|
+
*
|
|
79
|
+
* @param runtime - The runtime to get trends for
|
|
80
|
+
* @param intervalMs - Size of each time window in ms (default: 60000 = 1 min)
|
|
81
|
+
* @param windowCount - Number of time windows to return (default: 10)
|
|
82
|
+
* @returns Array of execution counts, one per time window (oldest first)
|
|
83
|
+
*/
|
|
84
|
+
getExecutionTrend(runtime: RuntimeKind, intervalMs?: number, windowCount?: number): number[];
|
|
85
|
+
/**
|
|
86
|
+
* Clear all metrics for all runtimes.
|
|
87
|
+
*/
|
|
88
|
+
reset(): void;
|
|
89
|
+
/**
|
|
90
|
+
* Clear metrics for a specific runtime.
|
|
91
|
+
*/
|
|
92
|
+
resetRuntime(runtime: RuntimeKind): void;
|
|
93
|
+
/**
|
|
94
|
+
* Compute RuntimeExecutionMetrics from raw data for a single runtime.
|
|
95
|
+
*/
|
|
96
|
+
private computeMetrics;
|
|
97
|
+
/**
|
|
98
|
+
* Compute latency percentiles from a samples array.
|
|
99
|
+
*/
|
|
100
|
+
private computeLatencyPercentiles;
|
|
101
|
+
/**
|
|
102
|
+
* Compute the p-th percentile from a pre-sorted array.
|
|
103
|
+
*/
|
|
104
|
+
private percentile;
|
|
105
|
+
/**
|
|
106
|
+
* Compute resource usage metrics from raw data.
|
|
107
|
+
*/
|
|
108
|
+
private computeResourceMetrics;
|
|
109
|
+
/**
|
|
110
|
+
* Compute aggregate metrics across all runtimes.
|
|
111
|
+
*/
|
|
112
|
+
private computeAggregate;
|
|
113
|
+
}
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RuntimeMetricsDashboard - Aggregated Execution Metrics for Blok Runtimes
|
|
3
|
+
*
|
|
4
|
+
* Collects and aggregates execution metrics across all runtimes with
|
|
5
|
+
* latency percentiles, throughput tracking, and resource monitoring
|
|
6
|
+
* following the same patterns as TriggerMetricsCollector.
|
|
7
|
+
*/
|
|
8
|
+
const MAX_LATENCY_SAMPLES = 10_000;
|
|
9
|
+
const RPS_WINDOW_MS = 60_000; // 1 minute window for RPS calculation
|
|
10
|
+
function createEmptyMetricsData() {
|
|
11
|
+
return {
|
|
12
|
+
latencySamples: [],
|
|
13
|
+
requestTimestamps: [],
|
|
14
|
+
cpuSamples: [],
|
|
15
|
+
memorySamples: [],
|
|
16
|
+
peakMemoryBytes: 0,
|
|
17
|
+
successCount: 0,
|
|
18
|
+
failureCount: 0,
|
|
19
|
+
peakRps: 0,
|
|
20
|
+
lastExecution: 0,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export class RuntimeMetricsDashboard {
|
|
24
|
+
metrics = new Map();
|
|
25
|
+
/**
|
|
26
|
+
* Record an execution result for a runtime.
|
|
27
|
+
*/
|
|
28
|
+
recordExecution(runtime, result) {
|
|
29
|
+
let data = this.metrics.get(runtime);
|
|
30
|
+
if (!data) {
|
|
31
|
+
data = createEmptyMetricsData();
|
|
32
|
+
this.metrics.set(runtime, data);
|
|
33
|
+
}
|
|
34
|
+
const now = Date.now();
|
|
35
|
+
data.lastExecution = now;
|
|
36
|
+
// Track success/failure
|
|
37
|
+
if (result.success) {
|
|
38
|
+
data.successCount++;
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
data.failureCount++;
|
|
42
|
+
}
|
|
43
|
+
// Record latency sample from execution metrics
|
|
44
|
+
if (result.metrics?.duration_ms !== undefined) {
|
|
45
|
+
data.latencySamples.push(result.metrics.duration_ms);
|
|
46
|
+
if (data.latencySamples.length > MAX_LATENCY_SAMPLES) {
|
|
47
|
+
// Keep only the most recent half
|
|
48
|
+
data.latencySamples = data.latencySamples.slice(-MAX_LATENCY_SAMPLES / 2);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Record resource usage samples
|
|
52
|
+
if (result.metrics?.cpu_ms !== undefined) {
|
|
53
|
+
data.cpuSamples.push(result.metrics.cpu_ms);
|
|
54
|
+
if (data.cpuSamples.length > MAX_LATENCY_SAMPLES) {
|
|
55
|
+
data.cpuSamples = data.cpuSamples.slice(-MAX_LATENCY_SAMPLES / 2);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (result.metrics?.memory_bytes !== undefined) {
|
|
59
|
+
data.memorySamples.push(result.metrics.memory_bytes);
|
|
60
|
+
if (result.metrics.memory_bytes > data.peakMemoryBytes) {
|
|
61
|
+
data.peakMemoryBytes = result.metrics.memory_bytes;
|
|
62
|
+
}
|
|
63
|
+
if (data.memorySamples.length > MAX_LATENCY_SAMPLES) {
|
|
64
|
+
data.memorySamples = data.memorySamples.slice(-MAX_LATENCY_SAMPLES / 2);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Record request timestamp for RPS calculation
|
|
68
|
+
data.requestTimestamps.push(now);
|
|
69
|
+
const cutoff = now - RPS_WINDOW_MS;
|
|
70
|
+
while (data.requestTimestamps.length > 0 && data.requestTimestamps[0] < cutoff) {
|
|
71
|
+
data.requestTimestamps.shift();
|
|
72
|
+
}
|
|
73
|
+
// Update peak RPS
|
|
74
|
+
const currentRps = data.requestTimestamps.length / (RPS_WINDOW_MS / 1000);
|
|
75
|
+
if (currentRps > data.peakRps) {
|
|
76
|
+
data.peakRps = currentRps;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get computed metrics for a specific runtime.
|
|
81
|
+
*/
|
|
82
|
+
getMetrics(runtime) {
|
|
83
|
+
const data = this.metrics.get(runtime);
|
|
84
|
+
if (!data) {
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
return this.computeMetrics(runtime, data);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Get computed metrics for all tracked runtimes.
|
|
91
|
+
*/
|
|
92
|
+
getAllMetrics() {
|
|
93
|
+
const result = [];
|
|
94
|
+
this.metrics.forEach((data, runtime) => {
|
|
95
|
+
result.push(this.computeMetrics(runtime, data));
|
|
96
|
+
});
|
|
97
|
+
return result;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Get a full dashboard snapshot with per-runtime and aggregate metrics.
|
|
101
|
+
*/
|
|
102
|
+
getSnapshot() {
|
|
103
|
+
const runtimes = this.getAllMetrics();
|
|
104
|
+
const aggregate = this.computeAggregate(runtimes);
|
|
105
|
+
return {
|
|
106
|
+
timestamp: Date.now(),
|
|
107
|
+
runtimes,
|
|
108
|
+
aggregate,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get top runtimes ranked by a specific metric.
|
|
113
|
+
*/
|
|
114
|
+
getTopRuntimes(by, limit = 10) {
|
|
115
|
+
const all = this.getAllMetrics();
|
|
116
|
+
switch (by) {
|
|
117
|
+
case "executions":
|
|
118
|
+
all.sort((a, b) => b.totalExecutions - a.totalExecutions);
|
|
119
|
+
break;
|
|
120
|
+
case "successRate":
|
|
121
|
+
all.sort((a, b) => b.successRate - a.successRate);
|
|
122
|
+
break;
|
|
123
|
+
case "latency":
|
|
124
|
+
// Lower latency is better, sort ascending
|
|
125
|
+
all.sort((a, b) => a.latency.avg - b.latency.avg);
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
return all.slice(0, limit);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Get execution count trend over time windows for a specific runtime.
|
|
132
|
+
*
|
|
133
|
+
* @param runtime - The runtime to get trends for
|
|
134
|
+
* @param intervalMs - Size of each time window in ms (default: 60000 = 1 min)
|
|
135
|
+
* @param windowCount - Number of time windows to return (default: 10)
|
|
136
|
+
* @returns Array of execution counts, one per time window (oldest first)
|
|
137
|
+
*/
|
|
138
|
+
getExecutionTrend(runtime, intervalMs = 60_000, windowCount = 10) {
|
|
139
|
+
const data = this.metrics.get(runtime);
|
|
140
|
+
if (!data) {
|
|
141
|
+
return new Array(windowCount).fill(0);
|
|
142
|
+
}
|
|
143
|
+
const now = Date.now();
|
|
144
|
+
const trend = new Array(windowCount).fill(0);
|
|
145
|
+
for (const timestamp of data.requestTimestamps) {
|
|
146
|
+
const age = now - timestamp;
|
|
147
|
+
const windowIndex = windowCount - 1 - Math.floor(age / intervalMs);
|
|
148
|
+
if (windowIndex >= 0 && windowIndex < windowCount) {
|
|
149
|
+
trend[windowIndex]++;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return trend;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Clear all metrics for all runtimes.
|
|
156
|
+
*/
|
|
157
|
+
reset() {
|
|
158
|
+
this.metrics.clear();
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Clear metrics for a specific runtime.
|
|
162
|
+
*/
|
|
163
|
+
resetRuntime(runtime) {
|
|
164
|
+
this.metrics.delete(runtime);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Compute RuntimeExecutionMetrics from raw data for a single runtime.
|
|
168
|
+
*/
|
|
169
|
+
computeMetrics(runtime, data) {
|
|
170
|
+
const totalExecutions = data.successCount + data.failureCount;
|
|
171
|
+
const successRate = totalExecutions > 0 ? data.successCount / totalExecutions : 1;
|
|
172
|
+
// Prune old request timestamps before computing throughput
|
|
173
|
+
const now = Date.now();
|
|
174
|
+
const cutoff = now - RPS_WINDOW_MS;
|
|
175
|
+
while (data.requestTimestamps.length > 0 && data.requestTimestamps[0] < cutoff) {
|
|
176
|
+
data.requestTimestamps.shift();
|
|
177
|
+
}
|
|
178
|
+
const currentRps = data.requestTimestamps.length / (RPS_WINDOW_MS / 1000);
|
|
179
|
+
return {
|
|
180
|
+
runtime,
|
|
181
|
+
totalExecutions,
|
|
182
|
+
successfulExecutions: data.successCount,
|
|
183
|
+
failedExecutions: data.failureCount,
|
|
184
|
+
successRate,
|
|
185
|
+
latency: this.computeLatencyPercentiles(data.latencySamples),
|
|
186
|
+
throughput: {
|
|
187
|
+
requestsPerSecond: currentRps,
|
|
188
|
+
peakRps: data.peakRps,
|
|
189
|
+
windowSizeMs: RPS_WINDOW_MS,
|
|
190
|
+
},
|
|
191
|
+
resourceUsage: this.computeResourceMetrics(data),
|
|
192
|
+
lastExecution: data.lastExecution,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Compute latency percentiles from a samples array.
|
|
197
|
+
*/
|
|
198
|
+
computeLatencyPercentiles(samples) {
|
|
199
|
+
if (samples.length === 0) {
|
|
200
|
+
return { count: 0, min: 0, max: 0, avg: 0, p50: 0, p95: 0, p99: 0 };
|
|
201
|
+
}
|
|
202
|
+
const sorted = [...samples].sort((a, b) => a - b);
|
|
203
|
+
const count = sorted.length;
|
|
204
|
+
const sum = sorted.reduce((a, b) => a + b, 0);
|
|
205
|
+
return {
|
|
206
|
+
count,
|
|
207
|
+
min: sorted[0],
|
|
208
|
+
max: sorted[count - 1],
|
|
209
|
+
avg: sum / count,
|
|
210
|
+
p50: this.percentile(sorted, 50),
|
|
211
|
+
p95: this.percentile(sorted, 95),
|
|
212
|
+
p99: this.percentile(sorted, 99),
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Compute the p-th percentile from a pre-sorted array.
|
|
217
|
+
*/
|
|
218
|
+
percentile(sorted, p) {
|
|
219
|
+
if (sorted.length === 0)
|
|
220
|
+
return 0;
|
|
221
|
+
const index = Math.ceil((p / 100) * sorted.length) - 1;
|
|
222
|
+
return sorted[Math.max(0, Math.min(index, sorted.length - 1))];
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Compute resource usage metrics from raw data.
|
|
226
|
+
*/
|
|
227
|
+
computeResourceMetrics(data) {
|
|
228
|
+
const avgCpuMs = data.cpuSamples.length > 0 ? data.cpuSamples.reduce((a, b) => a + b, 0) / data.cpuSamples.length : 0;
|
|
229
|
+
const avgMemoryBytes = data.memorySamples.length > 0 ? data.memorySamples.reduce((a, b) => a + b, 0) / data.memorySamples.length : 0;
|
|
230
|
+
return {
|
|
231
|
+
avgCpuMs,
|
|
232
|
+
avgMemoryBytes,
|
|
233
|
+
peakMemoryBytes: data.peakMemoryBytes,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Compute aggregate metrics across all runtimes.
|
|
238
|
+
*/
|
|
239
|
+
computeAggregate(runtimes) {
|
|
240
|
+
if (runtimes.length === 0) {
|
|
241
|
+
return {
|
|
242
|
+
totalExecutions: 0,
|
|
243
|
+
totalSuccess: 0,
|
|
244
|
+
totalFailures: 0,
|
|
245
|
+
overallSuccessRate: 1,
|
|
246
|
+
avgLatencyMs: 0,
|
|
247
|
+
activeRuntimes: 0,
|
|
248
|
+
busiestRuntime: null,
|
|
249
|
+
slowestRuntime: null,
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
let totalExecutions = 0;
|
|
253
|
+
let totalSuccess = 0;
|
|
254
|
+
let totalFailures = 0;
|
|
255
|
+
let latencySum = 0;
|
|
256
|
+
let latencyCount = 0;
|
|
257
|
+
let busiestRuntime = null;
|
|
258
|
+
let busiestCount = -1;
|
|
259
|
+
let slowestRuntime = null;
|
|
260
|
+
let slowestLatency = -1;
|
|
261
|
+
for (const m of runtimes) {
|
|
262
|
+
totalExecutions += m.totalExecutions;
|
|
263
|
+
totalSuccess += m.successfulExecutions;
|
|
264
|
+
totalFailures += m.failedExecutions;
|
|
265
|
+
if (m.latency.count > 0) {
|
|
266
|
+
latencySum += m.latency.avg * m.latency.count;
|
|
267
|
+
latencyCount += m.latency.count;
|
|
268
|
+
}
|
|
269
|
+
if (m.totalExecutions > busiestCount) {
|
|
270
|
+
busiestCount = m.totalExecutions;
|
|
271
|
+
busiestRuntime = m.runtime;
|
|
272
|
+
}
|
|
273
|
+
if (m.latency.avg > slowestLatency && m.latency.count > 0) {
|
|
274
|
+
slowestLatency = m.latency.avg;
|
|
275
|
+
slowestRuntime = m.runtime;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
const overallSuccessRate = totalExecutions > 0 ? totalSuccess / totalExecutions : 1;
|
|
279
|
+
const avgLatencyMs = latencyCount > 0 ? latencySum / latencyCount : 0;
|
|
280
|
+
const activeRuntimes = runtimes.filter((m) => m.totalExecutions > 0).length;
|
|
281
|
+
return {
|
|
282
|
+
totalExecutions,
|
|
283
|
+
totalSuccess,
|
|
284
|
+
totalFailures,
|
|
285
|
+
overallSuccessRate,
|
|
286
|
+
avgLatencyMs,
|
|
287
|
+
activeRuntimes,
|
|
288
|
+
busiestRuntime,
|
|
289
|
+
slowestRuntime,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=RuntimeMetricsDashboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RuntimeMetricsDashboard.js","sourceRoot":"","sources":["../../src/marketplace/RuntimeMetricsDashboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Circuit Breaker Pattern for Blok Triggers
|
|
3
|
+
*
|
|
4
|
+
* Prevents cascading failures by detecting repeated errors
|
|
5
|
+
* and temporarily disabling failing operations.
|
|
6
|
+
*
|
|
7
|
+
* States:
|
|
8
|
+
* - CLOSED: Normal operation, requests flow through
|
|
9
|
+
* - OPEN: Failures exceeded threshold, requests are rejected
|
|
10
|
+
* - HALF_OPEN: Testing recovery, limited requests allowed
|
|
11
|
+
*/
|
|
12
|
+
export type CircuitState = "CLOSED" | "OPEN" | "HALF_OPEN";
|
|
13
|
+
export interface CircuitBreakerConfig {
|
|
14
|
+
/** Number of failures before opening the circuit */
|
|
15
|
+
failureThreshold: number;
|
|
16
|
+
/** Time in ms before attempting recovery (OPEN -> HALF_OPEN) */
|
|
17
|
+
resetTimeoutMs: number;
|
|
18
|
+
/** Number of successful requests in HALF_OPEN to close the circuit */
|
|
19
|
+
halfOpenMaxAttempts: number;
|
|
20
|
+
/** Optional: time window for failure counting (rolling window) */
|
|
21
|
+
failureWindowMs?: number;
|
|
22
|
+
}
|
|
23
|
+
export interface CircuitBreakerStats {
|
|
24
|
+
state: CircuitState;
|
|
25
|
+
failures: number;
|
|
26
|
+
successes: number;
|
|
27
|
+
consecutiveFailures: number;
|
|
28
|
+
lastFailure: number | null;
|
|
29
|
+
lastSuccess: number | null;
|
|
30
|
+
lastStateChange: number;
|
|
31
|
+
totalRequests: number;
|
|
32
|
+
totalRejected: number;
|
|
33
|
+
}
|
|
34
|
+
export type CircuitBreakerEventType = "state_change" | "request_rejected" | "failure" | "success";
|
|
35
|
+
export interface CircuitBreakerEvent {
|
|
36
|
+
type: CircuitBreakerEventType;
|
|
37
|
+
state: CircuitState;
|
|
38
|
+
previousState?: CircuitState;
|
|
39
|
+
timestamp: number;
|
|
40
|
+
error?: Error;
|
|
41
|
+
}
|
|
42
|
+
export type CircuitBreakerListener = (event: CircuitBreakerEvent) => void;
|
|
43
|
+
export declare class CircuitBreaker {
|
|
44
|
+
private state;
|
|
45
|
+
private failures;
|
|
46
|
+
private successes;
|
|
47
|
+
private consecutiveFailures;
|
|
48
|
+
private halfOpenAttempts;
|
|
49
|
+
private lastFailure;
|
|
50
|
+
private lastSuccess;
|
|
51
|
+
private lastStateChange;
|
|
52
|
+
private totalRequests;
|
|
53
|
+
private totalRejected;
|
|
54
|
+
private failureTimestamps;
|
|
55
|
+
private config;
|
|
56
|
+
private listeners;
|
|
57
|
+
private resetTimer;
|
|
58
|
+
constructor(config: CircuitBreakerConfig);
|
|
59
|
+
/**
|
|
60
|
+
* Execute a function through the circuit breaker.
|
|
61
|
+
* Throws CircuitOpenError if the circuit is open.
|
|
62
|
+
*/
|
|
63
|
+
execute<T>(fn: () => Promise<T>): Promise<T>;
|
|
64
|
+
/**
|
|
65
|
+
* Check if the circuit allows execution without actually executing.
|
|
66
|
+
*/
|
|
67
|
+
canExecute(): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Get current circuit breaker statistics.
|
|
70
|
+
*/
|
|
71
|
+
getStats(): CircuitBreakerStats;
|
|
72
|
+
/**
|
|
73
|
+
* Get the current circuit state.
|
|
74
|
+
*/
|
|
75
|
+
getState(): CircuitState;
|
|
76
|
+
/**
|
|
77
|
+
* Get estimated time before the circuit will attempt recovery.
|
|
78
|
+
*/
|
|
79
|
+
getRetryAfterMs(): number;
|
|
80
|
+
/**
|
|
81
|
+
* Manually reset the circuit to CLOSED state.
|
|
82
|
+
*/
|
|
83
|
+
reset(): void;
|
|
84
|
+
/**
|
|
85
|
+
* Register an event listener.
|
|
86
|
+
*/
|
|
87
|
+
on(listener: CircuitBreakerListener): void;
|
|
88
|
+
/**
|
|
89
|
+
* Remove an event listener.
|
|
90
|
+
*/
|
|
91
|
+
off(listener: CircuitBreakerListener): void;
|
|
92
|
+
/**
|
|
93
|
+
* Clean up resources. Call when shutting down.
|
|
94
|
+
*/
|
|
95
|
+
destroy(): void;
|
|
96
|
+
private onSuccess;
|
|
97
|
+
private onFailure;
|
|
98
|
+
private transitionTo;
|
|
99
|
+
private pruneOldFailures;
|
|
100
|
+
private scheduleResetTimer;
|
|
101
|
+
private clearResetTimer;
|
|
102
|
+
private emit;
|
|
103
|
+
}
|
|
104
|
+
export declare class CircuitOpenError extends Error {
|
|
105
|
+
retryAfterMs: number;
|
|
106
|
+
constructor(message: string, retryAfterMs: number);
|
|
107
|
+
}
|