@dollhousemcp/mcp-server 2.0.0-rc.6 → 2.0.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/CHANGELOG.md +52 -61
- package/README.github.md +2 -2
- package/README.md +2 -2
- package/README.md.backup +284 -224
- package/README.npm.md +2 -2
- package/dist/cache/LRUCache.d.ts +3 -0
- package/dist/cache/LRUCache.d.ts.map +1 -1
- package/dist/cache/LRUCache.js +36 -26
- package/dist/config/env.d.ts +14 -4
- package/dist/config/env.d.ts.map +1 -1
- package/dist/config/env.js +20 -6
- package/dist/di/Container.d.ts +21 -0
- package/dist/di/Container.d.ts.map +1 -1
- package/dist/di/Container.js +250 -53
- package/dist/elements/BaseElement.d.ts.map +1 -1
- package/dist/elements/BaseElement.js +5 -10
- package/dist/elements/base/BaseElementManager.d.ts +22 -0
- package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
- package/dist/elements/base/BaseElementManager.js +47 -7
- package/dist/elements/memories/Memory.d.ts +1 -0
- package/dist/elements/memories/Memory.d.ts.map +1 -1
- package/dist/elements/memories/Memory.js +12 -8
- package/dist/elements/memories/MemoryManager.d.ts.map +1 -1
- package/dist/elements/memories/MemoryManager.js +23 -42
- package/dist/elements/memories/MemorySearchIndex.js +2 -2
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.d.ts.map +1 -1
- package/dist/generated/version.js +3 -3
- package/dist/handlers/EnhancedIndexHandler.js +6 -6
- package/dist/handlers/element-crud/listElements.d.ts +2 -0
- package/dist/handlers/element-crud/listElements.d.ts.map +1 -1
- package/dist/handlers/element-crud/listElements.js +3 -1
- package/dist/handlers/mcp-aql/Gatekeeper.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/Gatekeeper.js +23 -17
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +14 -0
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/MCPAQLHandler.js +110 -14
- package/dist/handlers/mcp-aql/OperationRouter.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/OperationRouter.js +13 -1
- package/dist/handlers/mcp-aql/OperationSchema.d.ts +7 -0
- package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/OperationSchema.js +52 -1
- package/dist/handlers/mcp-aql/evaluatePermission.d.ts +53 -0
- package/dist/handlers/mcp-aql/evaluatePermission.d.ts.map +1 -0
- package/dist/handlers/mcp-aql/evaluatePermission.js +132 -0
- package/dist/handlers/mcp-aql/policies/ToolClassification.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/policies/ToolClassification.js +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/logging/LogHooks.js +11 -11
- package/dist/logging/LogManager.d.ts +0 -2
- package/dist/logging/LogManager.d.ts.map +1 -1
- package/dist/logging/LogManager.js +1 -3
- package/dist/logging/sinks/MemoryLogSink.d.ts +2 -0
- package/dist/logging/sinks/MemoryLogSink.d.ts.map +1 -1
- package/dist/logging/sinks/MemoryLogSink.js +12 -3
- package/dist/logging/types.d.ts +0 -2
- package/dist/logging/types.d.ts.map +1 -1
- package/dist/logging/types.js +1 -1
- package/dist/metrics/GatekeeperMetricsTracker.d.ts +32 -0
- package/dist/metrics/GatekeeperMetricsTracker.d.ts.map +1 -0
- package/dist/metrics/GatekeeperMetricsTracker.js +42 -0
- package/dist/metrics/MetricsManager.d.ts +47 -0
- package/dist/metrics/MetricsManager.d.ts.map +1 -0
- package/dist/metrics/MetricsManager.js +232 -0
- package/dist/metrics/OperationMetricsTracker.d.ts +32 -0
- package/dist/metrics/OperationMetricsTracker.d.ts.map +1 -0
- package/dist/metrics/OperationMetricsTracker.js +53 -0
- package/dist/metrics/collectors/DefaultElementProviderCollector.d.ts +27 -0
- package/dist/metrics/collectors/DefaultElementProviderCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/DefaultElementProviderCollector.js +69 -0
- package/dist/metrics/collectors/FileLockManagerCollector.d.ts +16 -0
- package/dist/metrics/collectors/FileLockManagerCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/FileLockManagerCollector.js +51 -0
- package/dist/metrics/collectors/GatekeeperMetricsCollector.d.ts +16 -0
- package/dist/metrics/collectors/GatekeeperMetricsCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/GatekeeperMetricsCollector.js +76 -0
- package/dist/metrics/collectors/LRUCacheCollector.d.ts +18 -0
- package/dist/metrics/collectors/LRUCacheCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/LRUCacheCollector.js +95 -0
- package/dist/metrics/collectors/OperationMetricsCollector.d.ts +16 -0
- package/dist/metrics/collectors/OperationMetricsCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/OperationMetricsCollector.js +80 -0
- package/dist/metrics/collectors/OperationalTelemetryCollector.d.ts +17 -0
- package/dist/metrics/collectors/OperationalTelemetryCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/OperationalTelemetryCollector.js +26 -0
- package/dist/metrics/collectors/PerformanceMonitorCollector.d.ts +14 -0
- package/dist/metrics/collectors/PerformanceMonitorCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/PerformanceMonitorCollector.js +141 -0
- package/dist/metrics/collectors/SecurityMonitorCollector.d.ts +21 -0
- package/dist/metrics/collectors/SecurityMonitorCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/SecurityMonitorCollector.js +56 -0
- package/dist/metrics/collectors/SecurityTelemetryCollector.d.ts +15 -0
- package/dist/metrics/collectors/SecurityTelemetryCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/SecurityTelemetryCollector.js +112 -0
- package/dist/metrics/collectors/TriggerMetricsTrackerCollector.d.ts +16 -0
- package/dist/metrics/collectors/TriggerMetricsTrackerCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/TriggerMetricsTrackerCollector.js +26 -0
- package/dist/metrics/collectors/index.d.ts +11 -0
- package/dist/metrics/collectors/index.d.ts.map +1 -0
- package/dist/metrics/collectors/index.js +11 -0
- package/dist/metrics/sinks/MemoryMetricsSink.d.ts +22 -0
- package/dist/metrics/sinks/MemoryMetricsSink.d.ts.map +1 -0
- package/dist/metrics/sinks/MemoryMetricsSink.js +121 -0
- package/dist/metrics/types.d.ts +98 -0
- package/dist/metrics/types.d.ts.map +1 -0
- package/dist/metrics/types.js +24 -0
- package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
- package/dist/portfolio/DefaultElementProvider.js +1 -7
- package/dist/portfolio/EnhancedIndexManager.d.ts.map +1 -1
- package/dist/portfolio/EnhancedIndexManager.js +18 -18
- package/dist/portfolio/NLPScoringManager.d.ts.map +1 -1
- package/dist/portfolio/NLPScoringManager.js +5 -9
- package/dist/portfolio/PortfolioIndexManager.js +2 -2
- package/dist/portfolio/RelationshipManager.js +2 -2
- package/dist/portfolio/VerbTriggerManager.d.ts.map +1 -1
- package/dist/portfolio/VerbTriggerManager.js +5 -19
- package/dist/portfolio/config/IndexConfig.d.ts.map +1 -1
- package/dist/portfolio/config/IndexConfig.js +1 -12
- package/dist/portfolio/enhanced-index/ElementDefinitionBuilder.d.ts.map +1 -1
- package/dist/portfolio/enhanced-index/ElementDefinitionBuilder.js +3 -15
- package/dist/portfolio/enhanced-index/SemanticRelationshipService.d.ts.map +1 -1
- package/dist/portfolio/enhanced-index/SemanticRelationshipService.js +2 -16
- package/dist/portfolio/types/RelationshipTypes.d.ts.map +1 -1
- package/dist/portfolio/types/RelationshipTypes.js +3 -17
- package/dist/security/audit/config/suppressions.d.ts.map +1 -1
- package/dist/security/audit/config/suppressions.js +36 -8
- package/dist/security/constants.d.ts.map +1 -1
- package/dist/security/constants.js +10 -6
- package/dist/security/fileLockManager.d.ts.map +1 -1
- package/dist/security/fileLockManager.js +8 -6
- package/dist/security/secureYamlParser.d.ts.map +1 -1
- package/dist/security/secureYamlParser.js +1 -13
- package/dist/security/securityMonitor.d.ts +2 -1
- package/dist/security/securityMonitor.d.ts.map +1 -1
- package/dist/security/securityMonitor.js +14 -3
- package/dist/security/telemetry/SecurityTelemetry.d.ts +16 -0
- package/dist/security/telemetry/SecurityTelemetry.d.ts.map +1 -1
- package/dist/security/telemetry/SecurityTelemetry.js +30 -2
- package/dist/security/tokenManager.d.ts +3 -0
- package/dist/security/tokenManager.d.ts.map +1 -1
- package/dist/security/tokenManager.js +13 -5
- package/dist/security/validation/BackgroundValidator.d.ts.map +1 -1
- package/dist/security/validation/BackgroundValidator.js +7 -7
- package/dist/server/startup.d.ts.map +1 -1
- package/dist/server/startup.js +8 -24
- package/dist/server/tools/MCPAQLTools.js +4 -1
- package/dist/services/ActivationStore.d.ts.map +1 -1
- package/dist/services/ActivationStore.js +9 -3
- package/dist/services/FileWatchService.d.ts +1 -0
- package/dist/services/FileWatchService.d.ts.map +1 -1
- package/dist/services/FileWatchService.js +83 -48
- package/dist/services/MetadataService.d.ts.map +1 -1
- package/dist/services/MetadataService.js +7 -2
- package/dist/services/query/ElementQueryService.d.ts.map +1 -1
- package/dist/services/query/ElementQueryService.js +1 -41
- package/dist/services/query/PaginationService.d.ts.map +1 -1
- package/dist/services/query/PaginationService.js +1 -14
- package/dist/services/query/SortService.d.ts.map +1 -1
- package/dist/services/query/SortService.js +1 -6
- package/dist/services/validation/ValidationService.d.ts.map +1 -1
- package/dist/services/validation/ValidationService.js +3 -8
- package/dist/storage/ElementStorageLayer.d.ts.map +1 -1
- package/dist/storage/ElementStorageLayer.js +5 -2
- package/dist/storage/MemoryStorageLayer.d.ts.map +1 -1
- package/dist/storage/MemoryStorageLayer.js +5 -2
- package/dist/telemetry/OperationalTelemetry.js +2 -2
- package/dist/utils/EventDeduplicator.d.ts +44 -0
- package/dist/utils/EventDeduplicator.d.ts.map +1 -0
- package/dist/utils/EventDeduplicator.js +93 -0
- package/dist/utils/FileLock.d.ts.map +1 -1
- package/dist/utils/FileLock.js +1 -9
- package/dist/utils/PerformanceMonitor.d.ts.map +1 -1
- package/dist/utils/PerformanceMonitor.js +5 -5
- package/dist/utils/SlidingWindowRateLimiter.d.ts +13 -0
- package/dist/utils/SlidingWindowRateLimiter.d.ts.map +1 -0
- package/dist/utils/SlidingWindowRateLimiter.js +23 -0
- package/dist/web/console/IngestRoutes.d.ts +84 -0
- package/dist/web/console/IngestRoutes.d.ts.map +1 -0
- package/dist/web/console/IngestRoutes.js +252 -0
- package/dist/web/console/LeaderElection.d.ts +89 -0
- package/dist/web/console/LeaderElection.d.ts.map +1 -0
- package/dist/web/console/LeaderElection.js +205 -0
- package/dist/web/console/LeaderForwardingSink.d.ts +61 -0
- package/dist/web/console/LeaderForwardingSink.d.ts.map +1 -0
- package/dist/web/console/LeaderForwardingSink.js +197 -0
- package/dist/web/console/SessionNames.d.ts +46 -0
- package/dist/web/console/SessionNames.d.ts.map +1 -0
- package/dist/web/console/SessionNames.js +257 -0
- package/dist/web/console/UnifiedConsole.d.ts +64 -0
- package/dist/web/console/UnifiedConsole.d.ts.map +1 -0
- package/dist/web/console/UnifiedConsole.js +119 -0
- package/dist/web/contentPipeline.d.ts +58 -0
- package/dist/web/contentPipeline.d.ts.map +1 -0
- package/dist/web/contentPipeline.js +112 -0
- package/dist/web/portDiscovery.d.ts +58 -0
- package/dist/web/portDiscovery.d.ts.map +1 -0
- package/dist/web/portDiscovery.js +143 -0
- package/dist/web/public/app.js +148 -60
- package/dist/web/public/logs.js +638 -0
- package/dist/web/public/metrics.js +682 -0
- package/dist/web/public/permissions.js +394 -0
- package/dist/web/public/sessions.js +369 -0
- package/dist/web/routes/healthRoutes.d.ts +16 -0
- package/dist/web/routes/healthRoutes.d.ts.map +1 -0
- package/dist/web/routes/healthRoutes.js +29 -0
- package/dist/web/routes/logRoutes.d.ts +18 -0
- package/dist/web/routes/logRoutes.d.ts.map +1 -0
- package/dist/web/routes/logRoutes.js +126 -0
- package/dist/web/routes/metricsRoutes.d.ts +17 -0
- package/dist/web/routes/metricsRoutes.d.ts.map +1 -0
- package/dist/web/routes/metricsRoutes.js +90 -0
- package/dist/web/routes/permissionRoutes.d.ts +16 -0
- package/dist/web/routes/permissionRoutes.d.ts.map +1 -0
- package/dist/web/routes/permissionRoutes.js +133 -0
- package/dist/web/routes.d.ts.map +1 -1
- package/dist/web/routes.js +309 -339
- package/dist/web/server.d.ts +21 -1
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +42 -4
- package/dist/web/sinks/WebSSELogSink.d.ts +15 -0
- package/dist/web/sinks/WebSSELogSink.d.ts.map +1 -0
- package/dist/web/sinks/WebSSELogSink.js +22 -0
- package/dist/web/sinks/WebSSEMetricsSink.d.ts +16 -0
- package/dist/web/sinks/WebSSEMetricsSink.d.ts.map +1 -0
- package/dist/web/sinks/WebSSEMetricsSink.js +23 -0
- package/package.json +2 -2
- package/server.json +2 -2
- package/dist/constants/version.d.ts +0 -3
- package/dist/constants/version.d.ts.map +0 -1
- package/dist/constants/version.js +0 -4
- package/dist/logging/sinks/SSELogSink.d.ts +0 -35
- package/dist/logging/sinks/SSELogSink.d.ts.map +0 -1
- package/dist/logging/sinks/SSELogSink.js +0 -181
- package/dist/logging/viewer/viewerHtml.d.ts +0 -8
- package/dist/logging/viewer/viewerHtml.d.ts.map +0 -1
- package/dist/logging/viewer/viewerHtml.js +0 -204
- package/dist/web/public/public/app.js +0 -1878
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Central coordinator for the Metrics Collection System.
|
|
3
|
+
*
|
|
4
|
+
* Registers collectors and sinks, runs periodic collection cycles,
|
|
5
|
+
* assembles immutable MetricSnapshot objects, and dispatches them
|
|
6
|
+
* to all registered sinks.
|
|
7
|
+
*/
|
|
8
|
+
export class MetricsManager {
|
|
9
|
+
collectors = [];
|
|
10
|
+
sinks = [];
|
|
11
|
+
config;
|
|
12
|
+
logger;
|
|
13
|
+
timer = null;
|
|
14
|
+
snapshotCounter = 0;
|
|
15
|
+
collectionsCompleted = 0;
|
|
16
|
+
collectorErrorsTotal = 0;
|
|
17
|
+
sinkErrorsTotal = 0;
|
|
18
|
+
lastCollectionDurationMs = 0;
|
|
19
|
+
closed = false;
|
|
20
|
+
processStartTime;
|
|
21
|
+
constructor(config, logger) {
|
|
22
|
+
this.config = config;
|
|
23
|
+
this.logger = logger;
|
|
24
|
+
this.processStartTime = new Date().toISOString();
|
|
25
|
+
}
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
// Public API
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
registerCollector(collector) {
|
|
30
|
+
this.assertOpen();
|
|
31
|
+
this.collectors.push({
|
|
32
|
+
collector,
|
|
33
|
+
consecutiveFailures: 0,
|
|
34
|
+
disabled: false,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
registerSink(sink) {
|
|
38
|
+
this.assertOpen();
|
|
39
|
+
this.sinks.push(sink);
|
|
40
|
+
}
|
|
41
|
+
start() {
|
|
42
|
+
this.assertOpen();
|
|
43
|
+
if (this.timer !== null) {
|
|
44
|
+
this.logger.warn('MetricsManager.start() called but timer already running');
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (this.config.collectionIntervalMs > 0) {
|
|
48
|
+
this.timer = setInterval(() => {
|
|
49
|
+
void this.collectNow();
|
|
50
|
+
}, this.config.collectionIntervalMs);
|
|
51
|
+
// Allow the process to exit even if the timer is still running
|
|
52
|
+
if (this.timer && typeof this.timer === 'object' && 'unref' in this.timer) {
|
|
53
|
+
this.timer.unref();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async collectNow() {
|
|
58
|
+
this.assertOpen();
|
|
59
|
+
const startTime = performance.now();
|
|
60
|
+
const { entries, errors } = await this.collectFromCollectors();
|
|
61
|
+
entries.push(...this.buildSelfMonitoringMetrics());
|
|
62
|
+
const durationMs = performance.now() - startTime;
|
|
63
|
+
const snapshot = {
|
|
64
|
+
id: `SNAP-${Date.now()}-${this.snapshotCounter++}`,
|
|
65
|
+
timestamp: new Date().toISOString(),
|
|
66
|
+
metrics: entries,
|
|
67
|
+
errors,
|
|
68
|
+
durationMs,
|
|
69
|
+
};
|
|
70
|
+
this.warnIfOversized(snapshot);
|
|
71
|
+
this.warnIfSlow(snapshot, durationMs);
|
|
72
|
+
this.deepFreezeSnapshot(snapshot);
|
|
73
|
+
this.dispatchToSinks(snapshot);
|
|
74
|
+
this.collectionsCompleted++;
|
|
75
|
+
this.lastCollectionDurationMs = durationMs;
|
|
76
|
+
return snapshot;
|
|
77
|
+
}
|
|
78
|
+
async collectFromCollectors() {
|
|
79
|
+
const entries = [];
|
|
80
|
+
const errors = [];
|
|
81
|
+
for (const record of this.collectors) {
|
|
82
|
+
if (record.disabled)
|
|
83
|
+
continue;
|
|
84
|
+
try {
|
|
85
|
+
const result = await Promise.resolve(record.collector.collect());
|
|
86
|
+
record.consecutiveFailures = 0;
|
|
87
|
+
entries.push(...result);
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
record.consecutiveFailures++;
|
|
91
|
+
this.collectorErrorsTotal++;
|
|
92
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
93
|
+
errors.push(`${record.collector.name}: ${message}`);
|
|
94
|
+
this.logger.warn(`Collector "${record.collector.name}" failed (${record.consecutiveFailures}/${this.config.collectorFailureThreshold})`, { error: message });
|
|
95
|
+
if (record.consecutiveFailures >= this.config.collectorFailureThreshold) {
|
|
96
|
+
record.disabled = true;
|
|
97
|
+
this.logger.error(`Collector "${record.collector.name}" disabled after ${record.consecutiveFailures} consecutive failures`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return { entries, errors };
|
|
102
|
+
}
|
|
103
|
+
warnIfOversized(snapshot) {
|
|
104
|
+
const serializedSize = JSON.stringify(snapshot).length;
|
|
105
|
+
if (serializedSize > this.config.maxSnapshotSize) {
|
|
106
|
+
this.logger.warn(`Snapshot size ${serializedSize} bytes exceeds limit ${this.config.maxSnapshotSize}`, { snapshotId: snapshot.id, size: serializedSize });
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
warnIfSlow(snapshot, durationMs) {
|
|
110
|
+
if (durationMs > this.config.collectionDurationWarnMs && this.collectionsCompleted >= 3) {
|
|
111
|
+
this.logger.warn(`Collection took ${durationMs.toFixed(1)}ms (threshold: ${this.config.collectionDurationWarnMs}ms)`, { snapshotId: snapshot.id });
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
deepFreezeSnapshot(snapshot) {
|
|
115
|
+
Object.freeze(snapshot.metrics);
|
|
116
|
+
for (const entry of snapshot.metrics) {
|
|
117
|
+
if (entry.value !== null && typeof entry.value === 'object') {
|
|
118
|
+
Object.freeze(entry.value);
|
|
119
|
+
}
|
|
120
|
+
Object.freeze(entry);
|
|
121
|
+
}
|
|
122
|
+
Object.freeze(snapshot.errors);
|
|
123
|
+
Object.freeze(snapshot);
|
|
124
|
+
}
|
|
125
|
+
dispatchToSinks(snapshot) {
|
|
126
|
+
for (const sink of this.sinks) {
|
|
127
|
+
try {
|
|
128
|
+
sink.onSnapshot(snapshot);
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
this.sinkErrorsTotal++;
|
|
132
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
133
|
+
this.logger.warn(`Sink "${sink.name}" failed: ${message}`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async close() {
|
|
138
|
+
if (this.closed)
|
|
139
|
+
return;
|
|
140
|
+
// Stop timer
|
|
141
|
+
if (this.timer !== null) {
|
|
142
|
+
clearInterval(this.timer);
|
|
143
|
+
this.timer = null;
|
|
144
|
+
}
|
|
145
|
+
try {
|
|
146
|
+
// Final collection — best-effort, should not prevent cleanup
|
|
147
|
+
await this.collectNow();
|
|
148
|
+
}
|
|
149
|
+
finally {
|
|
150
|
+
this.closed = true;
|
|
151
|
+
// Flush and close all sinks
|
|
152
|
+
await Promise.allSettled(this.sinks.map(s => s.flush()));
|
|
153
|
+
await Promise.allSettled(this.sinks.map(s => s.close()));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
getManagerStats() {
|
|
157
|
+
return {
|
|
158
|
+
collectionsCompleted: this.collectionsCompleted,
|
|
159
|
+
collectorErrorsTotal: this.collectorErrorsTotal,
|
|
160
|
+
sinkErrorsTotal: this.sinkErrorsTotal,
|
|
161
|
+
lastCollectionDurationMs: this.lastCollectionDurationMs,
|
|
162
|
+
collectorsRegistered: this.collectors.length,
|
|
163
|
+
sinksRegistered: this.sinks.length,
|
|
164
|
+
disabledCollectors: this.collectors.filter(r => r.disabled).length,
|
|
165
|
+
processStartTime: this.processStartTime,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
// ---------------------------------------------------------------------------
|
|
169
|
+
// Internals
|
|
170
|
+
// ---------------------------------------------------------------------------
|
|
171
|
+
assertOpen() {
|
|
172
|
+
if (this.closed) {
|
|
173
|
+
throw new Error('MetricsManager is closed');
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
buildSelfMonitoringMetrics() {
|
|
177
|
+
const source = 'MetricsManager';
|
|
178
|
+
const unit = 'count';
|
|
179
|
+
return [
|
|
180
|
+
{
|
|
181
|
+
type: 'gauge',
|
|
182
|
+
name: 'metrics.manager.collectors_registered',
|
|
183
|
+
source,
|
|
184
|
+
unit,
|
|
185
|
+
value: this.collectors.length,
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
type: 'gauge',
|
|
189
|
+
name: 'metrics.manager.sinks_registered',
|
|
190
|
+
source,
|
|
191
|
+
unit,
|
|
192
|
+
value: this.sinks.length,
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
type: 'counter',
|
|
196
|
+
name: 'metrics.manager.collector_errors_total',
|
|
197
|
+
source,
|
|
198
|
+
unit,
|
|
199
|
+
value: this.collectorErrorsTotal,
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
type: 'counter',
|
|
203
|
+
name: 'metrics.manager.sink_errors_total',
|
|
204
|
+
source,
|
|
205
|
+
unit,
|
|
206
|
+
value: this.sinkErrorsTotal,
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
type: 'gauge',
|
|
210
|
+
name: 'metrics.manager.last_collection_duration_ms',
|
|
211
|
+
source,
|
|
212
|
+
unit: 'milliseconds',
|
|
213
|
+
value: this.lastCollectionDurationMs,
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
type: 'counter',
|
|
217
|
+
name: 'metrics.manager.snapshots_taken_total',
|
|
218
|
+
source,
|
|
219
|
+
unit,
|
|
220
|
+
value: this.snapshotCounter,
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
type: 'gauge',
|
|
224
|
+
name: 'metrics.manager.disabled_collectors',
|
|
225
|
+
source,
|
|
226
|
+
unit,
|
|
227
|
+
value: this.collectors.filter(r => r.disabled).length,
|
|
228
|
+
},
|
|
229
|
+
];
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWV0cmljc01hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWV0cmljcy9NZXRyaWNzTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFpQkgsTUFBTSxPQUFPLGNBQWM7SUFDUixVQUFVLEdBQXNCLEVBQUUsQ0FBQztJQUNuQyxLQUFLLEdBQW1CLEVBQUUsQ0FBQztJQUMzQixNQUFNLENBQXVCO0lBQzdCLE1BQU0sQ0FBVTtJQUV6QixLQUFLLEdBQTBDLElBQUksQ0FBQztJQUNwRCxlQUFlLEdBQUcsQ0FBQyxDQUFDO0lBQ3BCLG9CQUFvQixHQUFHLENBQUMsQ0FBQztJQUN6QixvQkFBb0IsR0FBRyxDQUFDLENBQUM7SUFDekIsZUFBZSxHQUFHLENBQUMsQ0FBQztJQUNwQix3QkFBd0IsR0FBRyxDQUFDLENBQUM7SUFDN0IsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUNOLGdCQUFnQixDQUFTO0lBRTFDLFlBQVksTUFBNEIsRUFBRSxNQUFlO1FBQ3ZELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ25ELENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsYUFBYTtJQUNiLDhFQUE4RTtJQUU5RSxpQkFBaUIsQ0FBQyxTQUEyQjtRQUMzQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7WUFDbkIsU0FBUztZQUNULG1CQUFtQixFQUFFLENBQUM7WUFDdEIsUUFBUSxFQUFFLEtBQUs7U0FDaEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFlBQVksQ0FBQyxJQUFrQjtRQUM3QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsSUFBSSxD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RUFBRSxTQUFrQjtnQkFDeEIsSUFBSSxFQUFFLHdDQUF3QztnQkFDOUMsTUFBTTtnQkFDTixJQUFJO2dCQUNKLEtBQUssRUFBRSxJQUFJLENBQUMsb0JBQW9CO2FBQ2pDO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLFNBQWtCO2dCQUN4QixJQUFJLEVBQUUsbUNBQW1DO2dCQUN6QyxNQUFNO2dCQUNOLElBQUk7Z0JBQ0osS0FBSyxFQUFFLElBQUksQ0FBQyxlQUFlO2FBQzVCO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLE9BQWdCO2dCQUN0QixJQUFJLEVBQUUsNkNBQTZDO2dCQUNuRCxNQUFNO2dCQUNOLElBQUksRUFBRSxjQUF1QjtnQkFDN0IsS0FBSyxFQUFFLElBQUksQ0FBQyx3QkFBd0I7YUFDckM7WUFDRDtnQkFDRSxJQUFJLEVBQUUsU0FBa0I7Z0JBQ3hCLElBQUksRUFBRSx1Q0FBdUM7Z0JBQzdDLE1BQU07Z0JBQ04sSUFBSTtnQkFDSixLQUFLLEVBQUUsSUFBSSxDQUFDLGVBQWU7YUFDNUI7WUFDRDtnQkFDRSxJQUFJLEVBQUUsT0FBZ0I7Z0JBQ3RCLElBQUksRUFBRSxxQ0FBcUM7Z0JBQzNDLE1BQU07Z0JBQ04sSUFBSTtnQkFDSixLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTTthQUN0RDtTQUNGLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENlbnRyYWwgY29vcmRpbmF0b3IgZm9yIHRoZSBNZXRyaWNzIENvbGxlY3Rpb24gU3lzdGVtLlxuICpcbiAqIFJlZ2lzdGVycyBjb2xsZWN0b3JzIGFuZCBzaW5rcywgcnVucyBwZXJpb2RpYyBjb2xsZWN0aW9uIGN5Y2xlcyxcbiAqIGFzc2VtYmxlcyBpbW11dGFibGUgTWV0cmljU25hcHNob3Qgb2JqZWN0cywgYW5kIGRpc3BhdGNoZXMgdGhlbVxuICogdG8gYWxsIHJlZ2lzdGVyZWQgc2lua3MuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBJTG9nZ2VyIH0gZnJvbSAnLi4vdHlwZXMvSUxvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIElNZXRyaWNDb2xsZWN0b3IsXG4gIElNZXRyaWNzU2luayxcbiAgTWV0cmljRW50cnksXG4gIE1ldHJpY1NuYXBzaG90LFxuICBNZXRyaWNzTWFuYWdlckNvbmZpZyxcbn0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmludGVyZmFjZSBDb2xsZWN0b3JSZWNvcmQge1xuICBjb2xsZWN0b3I6IElNZXRyaWNDb2xsZWN0b3I7XG4gIGNvbnNlY3V0aXZlRmFpbHVyZXM6IG51bWJlcjtcbiAgZGlzYWJsZWQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBNZXRyaWNzTWFuYWdlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29sbGVjdG9yczogQ29sbGVjdG9yUmVjb3JkW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBzaW5rczogSU1ldHJpY3NTaW5rW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IE1ldHJpY3NNYW5hZ2VyQ29uZmlnO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogSUxvZ2dlcjtcblxuICBwcml2YXRlIHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzbmFwc2hvdENvdW50ZXIgPSAwO1xuICBwcml2YXRlIGNvbGxlY3Rpb25zQ29tcGxldGVkID0gMDtcbiAgcHJpdmF0ZSBjb2xsZWN0b3JFcnJvcnNUb3RhbCA9IDA7XG4gIHByaXZhdGUgc2lua0Vycm9yc1RvdGFsID0gMDtcbiAgcHJpdmF0ZSBsYXN0Q29sbGVjdGlvbkR1cmF0aW9uTXMgPSAwO1xuICBwcml2YXRlIGNsb3NlZCA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IHByb2Nlc3NTdGFydFRpbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IE1ldHJpY3NNYW5hZ2VyQ29uZmlnLCBsb2dnZXI6IElMb2dnZXIpIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjtcbiAgICB0aGlzLnByb2Nlc3NTdGFydFRpbWUgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gUHVibGljIEFQSVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICByZWdpc3RlckNvbGxlY3Rvcihjb2xsZWN0b3I6IElNZXRyaWNDb2xsZWN0b3IpOiB2b2lkIHtcbiAgICB0aGlzLmFzc2VydE9wZW4oKTtcbiAgICB0aGlzLmNvbGxlY3RvcnMucHVzaCh7XG4gICAgICBjb2xsZWN0b3IsXG4gICAgICBjb25zZWN1dGl2ZUZhaWx1cmVzOiAwLFxuICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgIH0pO1xuICB9XG5cbiAgcmVnaXN0ZXJTaW5rKHNpbms6IElNZXRyaWNzU2luayk6IHZvaWQge1xuICAgIHRoaXMuYXNzZXJ0T3BlbigpO1xuICAgIHRoaXMuc2lua3MucHVzaChzaW5rKTtcbiAgfVxuXG4gIHN0YXJ0KCk6IHZvaWQge1xuICAgIHRoaXMuYXNzZXJ0T3BlbigpO1xuICAgIGlmICh0aGlzLnRpbWVyICE9PSBudWxsKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKCdNZXRyaWNzTWFuYWdlci5zdGFydCgpIGNhbGxlZCBidXQgdGltZXIgYWxyZWFkeSBydW5uaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLmNvbGxlY3Rpb25JbnRlcnZhbE1zID4gMCkge1xuICAgICAgdGhpcy50aW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgdm9pZCB0aGlzLmNvbGxlY3ROb3coKTtcbiAgICAgIH0sIHRoaXMuY29uZmlnLmNvbGxlY3Rpb25JbnRlcnZhbE1zKTtcblxuICAgICAgLy8gQWxsb3cgdGhlIHByb2Nlc3MgdG8gZXhpdCBldmVuIGlmIHRoZSB0aW1lciBpcyBzdGlsbCBydW5uaW5nXG4gICAgICBpZiAodGhpcy50aW1lciAmJiB0eXBlb2YgdGhpcy50aW1lciA9PT0gJ29iamVjdCcgJiYgJ3VucmVmJyBpbiB0aGlzLnRpbWVyKSB7XG4gICAgICAgIHRoaXMudGltZXIudW5yZWYoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBjb2xsZWN0Tm93KCk6IFByb21pc2U8TWV0cmljU25hcHNob3Q+IHtcbiAgICB0aGlzLmFzc2VydE9wZW4oKTtcblxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGNvbnN0IHsgZW50cmllcywgZXJyb3JzIH0gPSBhd2FpdCB0aGlzLmNvbGxlY3RGcm9tQ29sbGVjdG9ycygpO1xuICAgIGVudHJpZXMucHVzaCguLi50aGlzLmJ1aWxkU2VsZk1vbml0b3JpbmdNZXRyaWNzKCkpO1xuXG4gICAgY29uc3QgZHVyYXRpb25NcyA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgIGNvbnN0IHNuYXBzaG90OiBNZXRyaWNTbmFwc2hvdCA9IHtcbiAgICAgIGlkOiBgU05BUC0ke0RhdGUubm93KCl9LSR7dGhpcy5zbmFwc2hvdENvdW50ZXIrK31gLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBtZXRyaWNzOiBlbnRyaWVzLFxuICAgICAgZXJyb3JzLFxuICAgICAgZHVyYXRpb25NcyxcbiAgICB9O1xuXG4gICAgdGhpcy53YXJuSWZPdmVyc2l6ZWQoc25hcHNob3QpO1xuICAgIHRoaXMud2FybklmU2xvdyhzbmFwc2hvdCwgZHVyYXRpb25Ncyk7XG4gICAgdGhpcy5kZWVwRnJlZXplU25hcHNob3Qoc25hcHNob3QpO1xuICAgIHRoaXMuZGlzcGF0Y2hUb1NpbmtzKHNuYXBzaG90KTtcblxuICAgIHRoaXMuY29sbGVjdGlvbnNDb21wbGV0ZWQrKztcbiAgICB0aGlzLmxhc3RDb2xsZWN0aW9uRHVyYXRpb25NcyA9IGR1cmF0aW9uTXM7XG5cbiAgICByZXR1cm4gc25hcHNob3Q7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbGxlY3RGcm9tQ29sbGVjdG9ycygpOiBQcm9taXNlPHsgZW50cmllczogTWV0cmljRW50cnlbXTsgZXJyb3JzOiBzdHJpbmdbXSB9PiB7XG4gICAgY29uc3QgZW50cmllczogTWV0cmljRW50cnlbXSA9IFtdO1xuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIHRoaXMuY29sbGVjdG9ycykge1xuICAgICAgaWYgKHJlY29yZC5kaXNhYmxlZCkgY29udGludWU7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShyZWNvcmQuY29sbGVjdG9yLmNvbGxlY3QoKSk7XG4gICAgICAgIHJlY29yZC5jb25zZWN1dGl2ZUZhaWx1cmVzID0gMDtcbiAgICAgICAgZW50cmllcy5wdXNoKC4uLnJlc3VsdCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmVjb3JkLmNvbnNlY3V0aXZlRmFpbHVyZXMrKztcbiAgICAgICAgdGhpcy5jb2xsZWN0b3JFcnJvcnNUb3RhbCsrO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgICBlcnJvcnMucHVzaChgJHtyZWNvcmQuY29sbGVjdG9yLm5hbWV9OiAke21lc3NhZ2V9YCk7XG5cbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICBgQ29sbGVjdG9yIFwiJHtyZWNvcmQuY29sbGVjdG9yLm5hbWV9XCIgZmFpbGVkICgke3JlY29yZC5jb25zZWN1dGl2ZUZhaWx1cmVzfS8ke3RoaXMuY29uZmlnLmNvbGxlY3RvckZhaWx1cmVUaHJlc2hvbGR9KWAsXG4gICAgICAgICAgeyBlcnJvcjogbWVzc2FnZSB9LFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChyZWNvcmQuY29uc2VjdXRpdmVGYWlsdXJlcyA+PSB0aGlzLmNvbmZpZy5jb2xsZWN0b3JGYWlsdXJlVGhyZXNob2xkKSB7XG4gICAgICAgICAgcmVjb3JkLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgIGBDb2xsZWN0b3IgXCIke3JlY29yZC5jb2xsZWN0b3IubmFtZX1cIiBkaXNhYmxlZCBhZnRlciAke3JlY29yZC5jb25zZWN1dGl2ZUZhaWx1cmVzfSBjb25zZWN1dGl2ZSBmYWlsdXJlc2AsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGVudHJpZXMsIGVycm9ycyB9O1xuICB9XG5cbiAgcHJpdmF0ZSB3YXJuSWZPdmVyc2l6ZWQoc25hcHNob3Q6IE1ldHJpY1NuYXBzaG90KTogdm9pZCB7XG4gICAgY29uc3Qgc2VyaWFsaXplZFNpemUgPSBKU09OLnN0cmluZ2lmeShzbmFwc2hvdCkubGVuZ3RoO1xuICAgIGlmIChzZXJpYWxpemVkU2l6ZSA+IHRoaXMuY29uZmlnLm1heFNuYXBzaG90U2l6ZSkge1xuICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgYFNuYXBzaG90IHNpemUgJHtzZXJpYWxpemVkU2l6ZX0gYnl0ZXMgZXhjZWVkcyBsaW1pdCAke3RoaXMuY29uZmlnLm1heFNuYXBzaG90U2l6ZX1gLFxuICAgICAgICB7IHNuYXBzaG90SWQ6IHNuYXBzaG90LmlkLCBzaXplOiBzZXJpYWxpemVkU2l6ZSB9LFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHdhcm5JZlNsb3coc25hcHNob3Q6IE1ldHJpY1NuYXBzaG90LCBkdXJhdGlvbk1zOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoZHVyYXRpb25NcyA+IHRoaXMuY29uZmlnLmNvbGxlY3Rpb25EdXJhdGlvbldhcm5NcyAmJiB0aGlzLmNvbGxlY3Rpb25zQ29tcGxldGVkID49IDMpIHtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgIGBDb2xsZWN0aW9uIHRvb2sgJHtkdXJhdGlvbk1zLnRvRml4ZWQoMSl9bXMgKHRocmVzaG9sZDogJHt0aGlzLmNvbmZpZy5jb2xsZWN0aW9uRHVyYXRpb25XYXJuTXN9bXMpYCxcbiAgICAgICAgeyBzbmFwc2hvdElkOiBzbmFwc2hvdC5pZCB9LFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRlZXBGcmVlemVTbmFwc2hvdChzbmFwc2hvdDogTWV0cmljU25hcHNob3QpOiB2b2lkIHtcbiAgICBPYmplY3QuZnJlZXplKHNuYXBzaG90Lm1ldHJpY3MpO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2Ygc25hcHNob3QubWV0cmljcykge1xuICAgICAgaWYgKGVudHJ5LnZhbHVlICE9PSBudWxsICYmIHR5cGVvZiBlbnRyeS52YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgT2JqZWN0LmZyZWV6ZShlbnRyeS52YWx1ZSk7XG4gICAgICB9XG4gICAgICBPYmplY3QuZnJlZXplKGVudHJ5KTtcbiAgICB9XG4gICAgT2JqZWN0LmZyZWV6ZShzbmFwc2hvdC5lcnJvcnMpO1xuICAgIE9iamVjdC5mcmVlemUoc25hcHNob3QpO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNwYXRjaFRvU2lua3Moc25hcHNob3Q6IE1ldHJpY1NuYXBzaG90KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBzaW5rIG9mIHRoaXMuc2lua3MpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNpbmsub25TbmFwc2hvdChzbmFwc2hvdCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5zaW5rRXJyb3JzVG90YWwrKztcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihgU2luayBcIiR7c2luay5uYW1lfVwiIGZhaWxlZDogJHttZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmNsb3NlZCkgcmV0dXJuO1xuXG4gICAgLy8gU3RvcCB0aW1lclxuICAgIGlmICh0aGlzLnRpbWVyICE9PSBudWxsKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMudGltZXIpO1xuICAgICAgdGhpcy50aW1lciA9IG51bGw7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEZpbmFsIGNvbGxlY3Rpb24g4oCUIGJlc3QtZWZmb3J0LCBzaG91bGQgbm90IHByZXZlbnQgY2xlYW51cFxuICAgICAgYXdhaXQgdGhpcy5jb2xsZWN0Tm93KCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuY2xvc2VkID0gdHJ1ZTtcblxuICAgICAgLy8gRmx1c2ggYW5kIGNsb3NlIGFsbCBzaW5rc1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHRoaXMuc2lua3MubWFwKHMgPT4gcy5mbHVzaCgpKSk7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQodGhpcy5zaW5rcy5tYXAocyA9PiBzLmNsb3NlKCkpKTtcbiAgICB9XG4gIH1cblxuICBnZXRNYW5hZ2VyU3RhdHMoKToge1xuICAgIGNvbGxlY3Rpb25zQ29tcGxldGVkOiBudW1iZXI7XG4gICAgY29sbGVjdG9yRXJyb3JzVG90YWw6IG51bWJlcjtcbiAgICBzaW5rRXJyb3JzVG90YWw6IG51bWJlcjtcbiAgICBsYXN0Q29sbGVjdGlvbkR1cmF0aW9uTXM6IG51bWJlcjtcbiAgICBjb2xsZWN0b3JzUmVnaXN0ZXJlZDogbnVtYmVyO1xuICAgIHNpbmtzUmVnaXN0ZXJlZDogbnVtYmVyO1xuICAgIGRpc2FibGVkQ29sbGVjdG9yczogbnVtYmVyO1xuICAgIHByb2Nlc3NTdGFydFRpbWU6IHN0cmluZztcbiAgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbGxlY3Rpb25zQ29tcGxldGVkOiB0aGlzLmNvbGxlY3Rpb25zQ29tcGxldGVkLFxuICAgICAgY29sbGVjdG9yRXJyb3JzVG90YWw6IHRoaXMuY29sbGVjdG9yRXJyb3JzVG90YWwsXG4gICAgICBzaW5rRXJyb3JzVG90YWw6IHRoaXMuc2lua0Vycm9yc1RvdGFsLFxuICAgICAgbGFzdENvbGxlY3Rpb25EdXJhdGlvbk1zOiB0aGlzLmxhc3RDb2xsZWN0aW9uRHVyYXRpb25NcyxcbiAgICAgIGNvbGxlY3RvcnNSZWdpc3RlcmVkOiB0aGlzLmNvbGxlY3RvcnMubGVuZ3RoLFxuICAgICAgc2lua3NSZWdpc3RlcmVkOiB0aGlzLnNpbmtzLmxlbmd0aCxcbiAgICAgIGRpc2FibGVkQ29sbGVjdG9yczogdGhpcy5jb2xsZWN0b3JzLmZpbHRlcihyID0+IHIuZGlzYWJsZWQpLmxlbmd0aCxcbiAgICAgIHByb2Nlc3NTdGFydFRpbWU6IHRoaXMucHJvY2Vzc1N0YXJ0VGltZSxcbiAgICB9O1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIEludGVybmFsc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcml2YXRlIGFzc2VydE9wZW4oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldHJpY3NNYW5hZ2VyIGlzIGNsb3NlZCcpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRTZWxmTW9uaXRvcmluZ01ldHJpY3MoKTogTWV0cmljRW50cnlbXSB7XG4gICAgY29uc3Qgc291cmNlID0gJ01ldHJpY3NNYW5hZ2VyJztcbiAgICBjb25zdCB1bml0ID0gJ2NvdW50JyBhcyBjb25zdDtcblxuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdnYXVnZScgYXMgY29uc3QsXG4gICAgICAgIG5hbWU6ICdtZXRyaWNzLm1hbmFnZXIuY29sbGVjdG9yc19yZWdpc3RlcmVkJyxcbiAgICAgICAgc291cmNlLFxuICAgICAgICB1bml0LFxuICAgICAgICB2YWx1ZTogdGhpcy5jb2xsZWN0b3JzLmxlbmd0aCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdnYXVnZScgYXMgY29uc3QsXG4gICAgICAgIG5hbWU6ICdtZXRyaWNzLm1hbmFnZXIuc2lua3NfcmVnaXN0ZXJlZCcsXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgdW5pdCxcbiAgICAgICAgdmFsdWU6IHRoaXMuc2lua3MubGVuZ3RoLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ2NvdW50ZXInIGFzIGNvbnN0LFxuICAgICAgICBuYW1lOiAnbWV0cmljcy5tYW5hZ2VyLmNvbGxlY3Rvcl9lcnJvcnNfdG90YWwnLFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIHVuaXQsXG4gICAgICAgIHZhbHVlOiB0aGlzLmNvbGxlY3RvckVycm9yc1RvdGFsLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ2NvdW50ZXInIGFzIGNvbnN0LFxuICAgICAgICBuYW1lOiAnbWV0cmljcy5tYW5hZ2VyLnNpbmtfZXJyb3JzX3RvdGFsJyxcbiAgICAgICAgc291cmNlLFxuICAgICAgICB1bml0LFxuICAgICAgICB2YWx1ZTogdGhpcy5zaW5rRXJyb3JzVG90YWwsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0eXBlOiAnZ2F1Z2UnIGFzIGNvbnN0LFxuICAgICAgICBuYW1lOiAnbWV0cmljcy5tYW5hZ2VyLmxhc3RfY29sbGVjdGlvbl9kdXJhdGlvbl9tcycsXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgdW5pdDogJ21pbGxpc2Vjb25kcycgYXMgY29uc3QsXG4gICAgICAgIHZhbHVlOiB0aGlzLmxhc3RDb2xsZWN0aW9uRHVyYXRpb25NcyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdjb3VudGVyJyBhcyBjb25zdCxcbiAgICAgICAgbmFtZTogJ21ldHJpY3MubWFuYWdlci5zbmFwc2hvdHNfdGFrZW5fdG90YWwnLFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIHVuaXQsXG4gICAgICAgIHZhbHVlOiB0aGlzLnNuYXBzaG90Q291bnRlcixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdnYXVnZScgYXMgY29uc3QsXG4gICAgICAgIG5hbWU6ICdtZXRyaWNzLm1hbmFnZXIuZGlzYWJsZWRfY29sbGVjdG9ycycsXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgdW5pdCxcbiAgICAgICAgdmFsdWU6IHRoaXMuY29sbGVjdG9ycy5maWx0ZXIociA9PiByLmRpc2FibGVkKS5sZW5ndGgsXG4gICAgICB9LFxuICAgIF07XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight in-memory accumulator for MCP-AQL operation metrics.
|
|
3
|
+
*
|
|
4
|
+
* Records operation counts, durations, and error rates. The companion
|
|
5
|
+
* OperationMetricsCollector reads from this tracker each collection cycle.
|
|
6
|
+
*/
|
|
7
|
+
export interface OperationMetrics {
|
|
8
|
+
totalOps: number;
|
|
9
|
+
failedOps: number;
|
|
10
|
+
durations: number[];
|
|
11
|
+
byEndpoint: Map<string, number>;
|
|
12
|
+
byOperation: Map<string, number>;
|
|
13
|
+
}
|
|
14
|
+
export declare class OperationMetricsTracker {
|
|
15
|
+
private totalOps;
|
|
16
|
+
private failedOps;
|
|
17
|
+
private readonly durations;
|
|
18
|
+
private readonly byEndpoint;
|
|
19
|
+
private readonly byOperation;
|
|
20
|
+
record(operation: string, endpoint: string, durationMs: number, success: boolean): void;
|
|
21
|
+
getMetrics(): OperationMetrics;
|
|
22
|
+
/** Compute duration percentiles from the ring buffer. */
|
|
23
|
+
static percentiles(durations: number[]): {
|
|
24
|
+
count: number;
|
|
25
|
+
sum: number;
|
|
26
|
+
avg: number;
|
|
27
|
+
p50: number;
|
|
28
|
+
p95: number;
|
|
29
|
+
p99: number;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=OperationMetricsTracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OperationMetricsTracker.d.ts","sourceRoot":"","sources":["../../src/metrics/OperationMetricsTracker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,qBAAa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;IACxD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IAEzD,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAcvF,UAAU,IAAI,gBAAgB;IAU9B,yDAAyD;IACzD,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG;QACvC,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;KACb;CAgBF"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight in-memory accumulator for MCP-AQL operation metrics.
|
|
3
|
+
*
|
|
4
|
+
* Records operation counts, durations, and error rates. The companion
|
|
5
|
+
* OperationMetricsCollector reads from this tracker each collection cycle.
|
|
6
|
+
*/
|
|
7
|
+
const DURATION_RING_SIZE = 1000;
|
|
8
|
+
export class OperationMetricsTracker {
|
|
9
|
+
totalOps = 0;
|
|
10
|
+
failedOps = 0;
|
|
11
|
+
durations = [];
|
|
12
|
+
byEndpoint = new Map();
|
|
13
|
+
byOperation = new Map();
|
|
14
|
+
record(operation, endpoint, durationMs, success) {
|
|
15
|
+
this.totalOps++;
|
|
16
|
+
if (!success)
|
|
17
|
+
this.failedOps++;
|
|
18
|
+
// Bounded duration history (evicts oldest when full)
|
|
19
|
+
this.durations.push(durationMs);
|
|
20
|
+
if (this.durations.length > DURATION_RING_SIZE) {
|
|
21
|
+
this.durations.shift();
|
|
22
|
+
}
|
|
23
|
+
this.byEndpoint.set(endpoint, (this.byEndpoint.get(endpoint) ?? 0) + 1);
|
|
24
|
+
this.byOperation.set(operation, (this.byOperation.get(operation) ?? 0) + 1);
|
|
25
|
+
}
|
|
26
|
+
getMetrics() {
|
|
27
|
+
return {
|
|
28
|
+
totalOps: this.totalOps,
|
|
29
|
+
failedOps: this.failedOps,
|
|
30
|
+
durations: [...this.durations],
|
|
31
|
+
byEndpoint: new Map(this.byEndpoint),
|
|
32
|
+
byOperation: new Map(this.byOperation),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/** Compute duration percentiles from the ring buffer. */
|
|
36
|
+
static percentiles(durations) {
|
|
37
|
+
if (durations.length === 0) {
|
|
38
|
+
return { count: 0, sum: 0, avg: 0, p50: 0, p95: 0, p99: 0 };
|
|
39
|
+
}
|
|
40
|
+
const sorted = [...durations].sort((a, b) => a - b);
|
|
41
|
+
const sum = sorted.reduce((s, v) => s + v, 0);
|
|
42
|
+
const pct = (p) => sorted[Math.min(Math.ceil(sorted.length * p) - 1, sorted.length - 1)];
|
|
43
|
+
return {
|
|
44
|
+
count: sorted.length,
|
|
45
|
+
sum,
|
|
46
|
+
avg: sum / sorted.length,
|
|
47
|
+
p50: pct(0.5),
|
|
48
|
+
p95: pct(0.95),
|
|
49
|
+
p99: pct(0.99),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3BlcmF0aW9uTWV0cmljc1RyYWNrZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWV0cmljcy9PcGVyYXRpb25NZXRyaWNzVHJhY2tlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0FBVWhDLE1BQU0sT0FBTyx1QkFBdUI7SUFDMUIsUUFBUSxHQUFHLENBQUMsQ0FBQztJQUNiLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDTCxTQUFTLEdBQWEsRUFBRSxDQUFDO0lBQ3pCLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUN2QyxXQUFXLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFFekQsTUFBTSxDQUFDLFNBQWlCLEVBQUUsUUFBZ0IsRUFBRSxVQUFrQixFQUFFLE9BQWdCO1FBQzlFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsT0FBTztZQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUUvQixxREFBcUQ7UUFDckQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxrQkFBa0IsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekIsQ0FBQztRQUVELElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFFRCxVQUFVO1FBQ1IsT0FBTztZQUNMLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDekIsU0FBUyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQzlCLFVBQVUsRUFBRSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ3BDLFdBQVcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO1NBQ3ZDLENBQUM7SUFDSixDQUFDO0lBRUQseURBQXlEO0lBQ3pELE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBbUI7UUFRcEMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzNCLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQzlELENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3BELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRyxPQUFPO1lBQ0wsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNO1lBQ3BCLEdBQUc7WUFDSCxHQUFHLEVBQUUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNO1lBQ3hCLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQ2IsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDZCxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQztTQUNmLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIExpZ2h0d2VpZ2h0IGluLW1lbW9yeSBhY2N1bXVsYXRvciBmb3IgTUNQLUFRTCBvcGVyYXRpb24gbWV0cmljcy5cbiAqXG4gKiBSZWNvcmRzIG9wZXJhdGlvbiBjb3VudHMsIGR1cmF0aW9ucywgYW5kIGVycm9yIHJhdGVzLiBUaGUgY29tcGFuaW9uXG4gKiBPcGVyYXRpb25NZXRyaWNzQ29sbGVjdG9yIHJlYWRzIGZyb20gdGhpcyB0cmFja2VyIGVhY2ggY29sbGVjdGlvbiBjeWNsZS5cbiAqL1xuXG5jb25zdCBEVVJBVElPTl9SSU5HX1NJWkUgPSAxMDAwO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9wZXJhdGlvbk1ldHJpY3Mge1xuICB0b3RhbE9wczogbnVtYmVyO1xuICBmYWlsZWRPcHM6IG51bWJlcjtcbiAgZHVyYXRpb25zOiBudW1iZXJbXTtcbiAgYnlFbmRwb2ludDogTWFwPHN0cmluZywgbnVtYmVyPjtcbiAgYnlPcGVyYXRpb246IE1hcDxzdHJpbmcsIG51bWJlcj47XG59XG5cbmV4cG9ydCBjbGFzcyBPcGVyYXRpb25NZXRyaWNzVHJhY2tlciB7XG4gIHByaXZhdGUgdG90YWxPcHMgPSAwO1xuICBwcml2YXRlIGZhaWxlZE9wcyA9IDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgZHVyYXRpb25zOiBudW1iZXJbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGJ5RW5kcG9pbnQgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGJ5T3BlcmF0aW9uID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuICByZWNvcmQob3BlcmF0aW9uOiBzdHJpbmcsIGVuZHBvaW50OiBzdHJpbmcsIGR1cmF0aW9uTXM6IG51bWJlciwgc3VjY2VzczogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMudG90YWxPcHMrKztcbiAgICBpZiAoIXN1Y2Nlc3MpIHRoaXMuZmFpbGVkT3BzKys7XG5cbiAgICAvLyBCb3VuZGVkIGR1cmF0aW9uIGhpc3RvcnkgKGV2aWN0cyBvbGRlc3Qgd2hlbiBmdWxsKVxuICAgIHRoaXMuZHVyYXRpb25zLnB1c2goZHVyYXRpb25Ncyk7XG4gICAgaWYgKHRoaXMuZHVyYXRpb25zLmxlbmd0aCA+IERVUkFUSU9OX1JJTkdfU0laRSkge1xuICAgICAgdGhpcy5kdXJhdGlvbnMuc2hpZnQoKTtcbiAgICB9XG5cbiAgICB0aGlzLmJ5RW5kcG9pbnQuc2V0KGVuZHBvaW50LCAodGhpcy5ieUVuZHBvaW50LmdldChlbmRwb2ludCkgPz8gMCkgKyAxKTtcbiAgICB0aGlzLmJ5T3BlcmF0aW9uLnNldChvcGVyYXRpb24sICh0aGlzLmJ5T3BlcmF0aW9uLmdldChvcGVyYXRpb24pID8/IDApICsgMSk7XG4gIH1cblxuICBnZXRNZXRyaWNzKCk6IE9wZXJhdGlvbk1ldHJpY3Mge1xuICAgIHJldHVybiB7XG4gICAgICB0b3RhbE9wczogdGhpcy50b3RhbE9wcyxcbiAgICAgIGZhaWxlZE9wczogdGhpcy5mYWlsZWRPcHMsXG4gICAgICBkdXJhdGlvbnM6IFsuLi50aGlzLmR1cmF0aW9uc10sXG4gICAgICBieUVuZHBvaW50OiBuZXcgTWFwKHRoaXMuYnlFbmRwb2ludCksXG4gICAgICBieU9wZXJhdGlvbjogbmV3IE1hcCh0aGlzLmJ5T3BlcmF0aW9uKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIENvbXB1dGUgZHVyYXRpb24gcGVyY2VudGlsZXMgZnJvbSB0aGUgcmluZyBidWZmZXIuICovXG4gIHN0YXRpYyBwZXJjZW50aWxlcyhkdXJhdGlvbnM6IG51bWJlcltdKToge1xuICAgIGNvdW50OiBudW1iZXI7XG4gICAgc3VtOiBudW1iZXI7XG4gICAgYXZnOiBudW1iZXI7XG4gICAgcDUwOiBudW1iZXI7XG4gICAgcDk1OiBudW1iZXI7XG4gICAgcDk5OiBudW1iZXI7XG4gIH0ge1xuICAgIGlmIChkdXJhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4geyBjb3VudDogMCwgc3VtOiAwLCBhdmc6IDAsIHA1MDogMCwgcDk1OiAwLCBwOTk6IDAgfTtcbiAgICB9XG4gICAgY29uc3Qgc29ydGVkID0gWy4uLmR1cmF0aW9uc10uc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICAgIGNvbnN0IHN1bSA9IHNvcnRlZC5yZWR1Y2UoKHMsIHYpID0+IHMgKyB2LCAwKTtcbiAgICBjb25zdCBwY3QgPSAocDogbnVtYmVyKSA9PiBzb3J0ZWRbTWF0aC5taW4oTWF0aC5jZWlsKHNvcnRlZC5sZW5ndGggKiBwKSAtIDEsIHNvcnRlZC5sZW5ndGggLSAxKV07XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvdW50OiBzb3J0ZWQubGVuZ3RoLFxuICAgICAgc3VtLFxuICAgICAgYXZnOiBzdW0gLyBzb3J0ZWQubGVuZ3RoLFxuICAgICAgcDUwOiBwY3QoMC41KSxcbiAgICAgIHA5NTogcGN0KDAuOTUpLFxuICAgICAgcDk5OiBwY3QoMC45OSksXG4gICAgfTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Collector for DefaultElementProvider buffer pool metrics.
|
|
3
|
+
*
|
|
4
|
+
* Reads buffer pool performance stats via a configurable stats function
|
|
5
|
+
* (defaults to `DefaultElementProvider.getPerformanceStats`) and exposes
|
|
6
|
+
* hit/miss/created totals, hit rate, current pool size, and max pool size.
|
|
7
|
+
*/
|
|
8
|
+
import type { IMetricCollector, MetricEntry } from '../types.js';
|
|
9
|
+
interface PerformanceStats {
|
|
10
|
+
bufferPool: {
|
|
11
|
+
hits: number;
|
|
12
|
+
misses: number;
|
|
13
|
+
created: number;
|
|
14
|
+
hitRate: number;
|
|
15
|
+
poolSize: number;
|
|
16
|
+
maxPoolSize: number;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export declare class DefaultElementProviderCollector implements IMetricCollector {
|
|
20
|
+
readonly name = "element-provider";
|
|
21
|
+
readonly description = "Buffer pool metrics from DefaultElementProvider.";
|
|
22
|
+
private readonly statsFn;
|
|
23
|
+
constructor(statsFn?: () => PerformanceStats);
|
|
24
|
+
collect(): MetricEntry[];
|
|
25
|
+
}
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=DefaultElementProviderCollector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DefaultElementProviderCollector.d.ts","sourceRoot":"","sources":["../../../src/metrics/collectors/DefaultElementProviderCollector.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAGjE,UAAU,gBAAgB;IACxB,UAAU,EAAE;QACV,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,qBAAa,+BAAgC,YAAW,gBAAgB;IACtE,QAAQ,CAAC,IAAI,sBAAsB;IACnC,QAAQ,CAAC,WAAW,sDAAsD;IAE1E,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;gBAErC,OAAO,CAAC,EAAE,MAAM,gBAAgB;IAI5C,OAAO,IAAI,WAAW,EAAE;CA2DzB"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { DefaultElementProvider } from '../../portfolio/DefaultElementProvider.js';
|
|
2
|
+
export class DefaultElementProviderCollector {
|
|
3
|
+
name = 'element-provider';
|
|
4
|
+
description = 'Buffer pool metrics from DefaultElementProvider.';
|
|
5
|
+
statsFn;
|
|
6
|
+
constructor(statsFn) {
|
|
7
|
+
this.statsFn = statsFn ?? DefaultElementProvider.getPerformanceStats.bind(DefaultElementProvider);
|
|
8
|
+
}
|
|
9
|
+
collect() {
|
|
10
|
+
try {
|
|
11
|
+
const stats = this.statsFn();
|
|
12
|
+
const bp = stats.bufferPool;
|
|
13
|
+
return [
|
|
14
|
+
{
|
|
15
|
+
type: 'counter',
|
|
16
|
+
name: 'portfolio.buffer_pool.hits_total',
|
|
17
|
+
source: 'DefaultElementProvider',
|
|
18
|
+
unit: 'count',
|
|
19
|
+
description: 'Total number of buffer pool hits.',
|
|
20
|
+
value: bp.hits,
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
type: 'counter',
|
|
24
|
+
name: 'portfolio.buffer_pool.misses_total',
|
|
25
|
+
source: 'DefaultElementProvider',
|
|
26
|
+
unit: 'count',
|
|
27
|
+
description: 'Total number of buffer pool misses.',
|
|
28
|
+
value: bp.misses,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
type: 'counter',
|
|
32
|
+
name: 'portfolio.buffer_pool.created_total',
|
|
33
|
+
source: 'DefaultElementProvider',
|
|
34
|
+
unit: 'count',
|
|
35
|
+
description: 'Total number of buffers created (pool was empty).',
|
|
36
|
+
value: bp.created,
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
type: 'gauge',
|
|
40
|
+
name: 'portfolio.buffer_pool.hit_rate',
|
|
41
|
+
source: 'DefaultElementProvider',
|
|
42
|
+
unit: 'ratio',
|
|
43
|
+
description: 'Buffer pool hit rate (0–1).',
|
|
44
|
+
value: bp.hitRate,
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
type: 'gauge',
|
|
48
|
+
name: 'portfolio.buffer_pool.size_current',
|
|
49
|
+
source: 'DefaultElementProvider',
|
|
50
|
+
unit: 'count',
|
|
51
|
+
description: 'Current number of buffers held in the pool.',
|
|
52
|
+
value: bp.poolSize,
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
type: 'gauge',
|
|
56
|
+
name: 'portfolio.buffer_pool.size_max',
|
|
57
|
+
source: 'DefaultElementProvider',
|
|
58
|
+
unit: 'count',
|
|
59
|
+
description: 'Maximum configured buffer pool size.',
|
|
60
|
+
value: bp.maxPoolSize,
|
|
61
|
+
},
|
|
62
|
+
];
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return [];
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVmYXVsdEVsZW1lbnRQcm92aWRlckNvbGxlY3Rvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZXRyaWNzL2NvbGxlY3RvcnMvRGVmYXVsdEVsZW1lbnRQcm92aWRlckNvbGxlY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFRQSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQWFuRixNQUFNLE9BQU8sK0JBQStCO0lBQ2pDLElBQUksR0FBRyxrQkFBa0IsQ0FBQztJQUMxQixXQUFXLEdBQUcsa0RBQWtELENBQUM7SUFFekQsT0FBTyxDQUF5QjtJQUVqRCxZQUFZLE9BQWdDO1FBQzFDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxJQUFJLHNCQUFzQixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQ3BHLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDO1lBQ0gsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzdCLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7WUFFNUIsT0FBTztnQkFDTDtvQkFDRSxJQUFJLEVBQUUsU0FBa0I7b0JBQ3hCLElBQUksRUFBRSxrQ0FBa0M7b0JBQ3hDLE1BQU0sRUFBRSx3QkFBd0I7b0JBQ2hDLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsV0FBVyxFQUFFLG1DQUFtQztvQkFDaEQsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJO2lCQUNmO2dCQUNEO29CQUNFLElBQUksRUFBRSxTQUFrQjtvQkFDeEIsSUFBSSxFQUFFLG9DQUFvQztvQkFDMUMsTUFBTSxFQUFFLHdCQUF3QjtvQkFDaEMsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixXQUFXLEVBQUUscUNBQXFDO29CQUNsRCxLQUFLLEVBQUUsRUFBRSxDQUFDLE1BQU07aUJBQ2pCO2dCQUNEO29CQUNFLElBQUksRUFBRSxTQUFrQjtvQkFDeEIsSUFBSSxFQUFFLHFDQUFxQztvQkFDM0MsTUFBTSxFQUFFLHdCQUF3QjtvQkFDaEMsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixXQUFXLEVBQUUsbURBQW1EO29CQUNoRSxLQUFLLEVBQUUsRUFBRSxDQUFDLE9BQU87aUJBQ2xCO2dCQUNEO29CQUNFLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsSUFBSSxFQUFFLGdDQUFnQztvQkFDdEMsTUFBTSxFQUFFLHdCQUF3QjtvQkFDaEMsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixXQUFXLEVBQUUsNkJBQTZCO29CQUMxQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE9BQU87aUJBQ2xCO2dCQUNEO29CQUNFLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsSUFBSSxFQUFFLG9DQUFvQztvQkFDMUMsTUFBTSxFQUFFLHdCQUF3QjtvQkFDaEMsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixXQUFXLEVBQUUsNkNBQTZDO29CQUMxRCxLQUFLLEVBQUUsRUFBRSxDQUFDLFFBQVE7aUJBQ25CO2dCQUNEO29CQUNFLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsSUFBSSxFQUFFLGdDQUFnQztvQkFDdEMsTUFBTSxFQUFFLHdCQUF3QjtvQkFDaEMsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixXQUFXLEVBQUUsc0NBQXNDO29CQUNuRCxLQUFLLEVBQUUsRUFBRSxDQUFDLFdBQVc7aUJBQ3RCO2FBQ0YsQ0FBQztRQUNKLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbGxlY3RvciBmb3IgRGVmYXVsdEVsZW1lbnRQcm92aWRlciBidWZmZXIgcG9vbCBtZXRyaWNzLlxuICpcbiAqIFJlYWRzIGJ1ZmZlciBwb29sIHBlcmZvcm1hbmNlIHN0YXRzIHZpYSBhIGNvbmZpZ3VyYWJsZSBzdGF0cyBmdW5jdGlvblxuICogKGRlZmF1bHRzIHRvIGBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmdldFBlcmZvcm1hbmNlU3RhdHNgKSBhbmQgZXhwb3Nlc1xuICogaGl0L21pc3MvY3JlYXRlZCB0b3RhbHMsIGhpdCByYXRlLCBjdXJyZW50IHBvb2wgc2l6ZSwgYW5kIG1heCBwb29sIHNpemUuXG4gKi9cbmltcG9ydCB0eXBlIHsgSU1ldHJpY0NvbGxlY3RvciwgTWV0cmljRW50cnkgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBEZWZhdWx0RWxlbWVudFByb3ZpZGVyIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL0RlZmF1bHRFbGVtZW50UHJvdmlkZXIuanMnO1xuXG5pbnRlcmZhY2UgUGVyZm9ybWFuY2VTdGF0cyB7XG4gIGJ1ZmZlclBvb2w6IHtcbiAgICBoaXRzOiBudW1iZXI7XG4gICAgbWlzc2VzOiBudW1iZXI7XG4gICAgY3JlYXRlZDogbnVtYmVyO1xuICAgIGhpdFJhdGU6IG51bWJlcjtcbiAgICBwb29sU2l6ZTogbnVtYmVyO1xuICAgIG1heFBvb2xTaXplOiBudW1iZXI7XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBEZWZhdWx0RWxlbWVudFByb3ZpZGVyQ29sbGVjdG9yIGltcGxlbWVudHMgSU1ldHJpY0NvbGxlY3RvciB7XG4gIHJlYWRvbmx5IG5hbWUgPSAnZWxlbWVudC1wcm92aWRlcic7XG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uID0gJ0J1ZmZlciBwb29sIG1ldHJpY3MgZnJvbSBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLic7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzdGF0c0ZuOiAoKSA9PiBQZXJmb3JtYW5jZVN0YXRzO1xuXG4gIGNvbnN0cnVjdG9yKHN0YXRzRm4/OiAoKSA9PiBQZXJmb3JtYW5jZVN0YXRzKSB7XG4gICAgdGhpcy5zdGF0c0ZuID0gc3RhdHNGbiA/PyBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmdldFBlcmZvcm1hbmNlU3RhdHMuYmluZChEZWZhdWx0RWxlbWVudFByb3ZpZGVyKTtcbiAgfVxuXG4gIGNvbGxlY3QoKTogTWV0cmljRW50cnlbXSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXRzID0gdGhpcy5zdGF0c0ZuKCk7XG4gICAgICBjb25zdCBicCA9IHN0YXRzLmJ1ZmZlclBvb2w7XG5cbiAgICAgIHJldHVybiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnY291bnRlcicgYXMgY29uc3QsXG4gICAgICAgICAgbmFtZTogJ3BvcnRmb2xpby5idWZmZXJfcG9vbC5oaXRzX3RvdGFsJyxcbiAgICAgICAgICBzb3VyY2U6ICdEZWZhdWx0RWxlbWVudFByb3ZpZGVyJyxcbiAgICAgICAgICB1bml0OiAnY291bnQnIGFzIGNvbnN0LFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIGJ1ZmZlciBwb29sIGhpdHMuJyxcbiAgICAgICAgICB2YWx1ZTogYnAuaGl0cyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdjb3VudGVyJyBhcyBjb25zdCxcbiAgICAgICAgICBuYW1lOiAncG9ydGZvbGlvLmJ1ZmZlcl9wb29sLm1pc3Nlc190b3RhbCcsXG4gICAgICAgICAgc291cmNlOiAnRGVmYXVsdEVsZW1lbnRQcm92aWRlcicsXG4gICAgICAgICAgdW5pdDogJ2NvdW50JyBhcyBjb25zdCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBidWZmZXIgcG9vbCBtaXNzZXMuJyxcbiAgICAgICAgICB2YWx1ZTogYnAubWlzc2VzLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2NvdW50ZXInIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdwb3J0Zm9saW8uYnVmZmVyX3Bvb2wuY3JlYXRlZF90b3RhbCcsXG4gICAgICAgICAgc291cmNlOiAnRGVmYXVsdEVsZW1lbnRQcm92aWRlcicsXG4gICAgICAgICAgdW5pdDogJ2NvdW50JyBhcyBjb25zdCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBidWZmZXJzIGNyZWF0ZWQgKHBvb2wgd2FzIGVtcHR5KS4nLFxuICAgICAgICAgIHZhbHVlOiBicC5jcmVhdGVkLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2dhdWdlJyBhcyBjb25zdCxcbiAgICAgICAgICBuYW1lOiAncG9ydGZvbGlvLmJ1ZmZlcl9wb29sLmhpdF9yYXRlJyxcbiAgICAgICAgICBzb3VyY2U6ICdEZWZhdWx0RWxlbWVudFByb3ZpZGVyJyxcbiAgICAgICAgICB1bml0OiAncmF0aW8nIGFzIGNvbnN0LFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnQnVmZmVyIHBvb2wgaGl0IHJhdGUgKDDigJMxKS4nLFxuICAgICAgICAgIHZhbHVlOiBicC5oaXRSYXRlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2dhdWdlJyBhcyBjb25zdCxcbiAgICAgICAgICBuYW1lOiAncG9ydGZvbGlvLmJ1ZmZlcl9wb29sLnNpemVfY3VycmVudCcsXG4gICAgICAgICAgc291cmNlOiAnRGVmYXVsdEVsZW1lbnRQcm92aWRlcicsXG4gICAgICAgICAgdW5pdDogJ2NvdW50JyBhcyBjb25zdCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ0N1cnJlbnQgbnVtYmVyIG9mIGJ1ZmZlcnMgaGVsZCBpbiB0aGUgcG9vbC4nLFxuICAgICAgICAgIHZhbHVlOiBicC5wb29sU2l6ZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdnYXVnZScgYXMgY29uc3QsXG4gICAgICAgICAgbmFtZTogJ3BvcnRmb2xpby5idWZmZXJfcG9vbC5zaXplX21heCcsXG4gICAgICAgICAgc291cmNlOiAnRGVmYXVsdEVsZW1lbnRQcm92aWRlcicsXG4gICAgICAgICAgdW5pdDogJ2NvdW50JyBhcyBjb25zdCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ01heGltdW0gY29uZmlndXJlZCBidWZmZXIgcG9vbCBzaXplLicsXG4gICAgICAgICAgdmFsdWU6IGJwLm1heFBvb2xTaXplLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Collector for FileLockManager metrics.
|
|
3
|
+
*
|
|
4
|
+
* Exposes lock request totals, active lock count, timeout count, and
|
|
5
|
+
* concurrent-wait count sourced from `FileLockManager.getMetrics()`.
|
|
6
|
+
*/
|
|
7
|
+
import type { IMetricCollector, MetricEntry } from '../types.js';
|
|
8
|
+
import type { FileLockManager } from '../../security/fileLockManager.js';
|
|
9
|
+
export declare class FileLockManagerCollector implements IMetricCollector {
|
|
10
|
+
private readonly lockManager;
|
|
11
|
+
readonly name = "file-lock";
|
|
12
|
+
readonly description = "Metrics from the FileLockManager: requests, active locks, timeouts, and concurrent waits.";
|
|
13
|
+
constructor(lockManager: FileLockManager);
|
|
14
|
+
collect(): MetricEntry[];
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=FileLockManagerCollector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileLockManagerCollector.d.ts","sourceRoot":"","sources":["../../../src/metrics/collectors/FileLockManagerCollector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEzE,qBAAa,wBAAyB,YAAW,gBAAgB;IAInD,OAAO,CAAC,QAAQ,CAAC,WAAW;IAHxC,QAAQ,CAAC,IAAI,eAAe;IAC5B,QAAQ,CAAC,WAAW,+FAA+F;gBAEtF,WAAW,EAAE,eAAe;IAEzD,OAAO,IAAI,WAAW,EAAE;CA0CzB"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export class FileLockManagerCollector {
|
|
2
|
+
lockManager;
|
|
3
|
+
name = 'file-lock';
|
|
4
|
+
description = 'Metrics from the FileLockManager: requests, active locks, timeouts, and concurrent waits.';
|
|
5
|
+
constructor(lockManager) {
|
|
6
|
+
this.lockManager = lockManager;
|
|
7
|
+
}
|
|
8
|
+
collect() {
|
|
9
|
+
try {
|
|
10
|
+
const m = this.lockManager.getMetrics();
|
|
11
|
+
return [
|
|
12
|
+
{
|
|
13
|
+
type: 'counter',
|
|
14
|
+
name: 'lock.file.requests_total',
|
|
15
|
+
source: 'FileLockManager',
|
|
16
|
+
unit: 'count',
|
|
17
|
+
description: 'Total number of file lock requests.',
|
|
18
|
+
value: m.totalRequests,
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
type: 'gauge',
|
|
22
|
+
name: 'lock.file.active_current',
|
|
23
|
+
source: 'FileLockManager',
|
|
24
|
+
unit: 'count',
|
|
25
|
+
description: 'Number of currently active file locks.',
|
|
26
|
+
value: m.activeLocksCount,
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
type: 'counter',
|
|
30
|
+
name: 'lock.file.timeouts_total',
|
|
31
|
+
source: 'FileLockManager',
|
|
32
|
+
unit: 'count',
|
|
33
|
+
description: 'Total number of file lock timeouts.',
|
|
34
|
+
value: m.timeouts,
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
type: 'counter',
|
|
38
|
+
name: 'lock.file.concurrent_waits_total',
|
|
39
|
+
source: 'FileLockManager',
|
|
40
|
+
unit: 'count',
|
|
41
|
+
description: 'Total number of concurrent lock wait events.',
|
|
42
|
+
value: m.concurrentWaits,
|
|
43
|
+
},
|
|
44
|
+
];
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return [];
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlsZUxvY2tNYW5hZ2VyQ29sbGVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21ldHJpY3MvY29sbGVjdG9ycy9GaWxlTG9ja01hbmFnZXJDb2xsZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBU0EsTUFBTSxPQUFPLHdCQUF3QjtJQUlOO0lBSHBCLElBQUksR0FBRyxXQUFXLENBQUM7SUFDbkIsV0FBVyxHQUFHLDJGQUEyRixDQUFDO0lBRW5ILFlBQTZCLFdBQTRCO1FBQTVCLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtJQUFHLENBQUM7SUFFN0QsT0FBTztRQUNMLElBQUksQ0FBQztZQUNILE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUM7WUFFeEMsT0FBTztnQkFDTDtvQkFDRSxJQUFJLEVBQUUsU0FBa0I7b0JBQ3hCLElBQUksRUFBRSwwQkFBMEI7b0JBQ2hDLE1BQU0sRUFBRSxpQkFBaUI7b0JBQ3pCLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsV0FBVyxFQUFFLHFDQUFxQztvQkFDbEQsS0FBSyxFQUFFLENBQUMsQ0FBQyxhQUFhO2lCQUN2QjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLElBQUksRUFBRSwwQkFBMEI7b0JBQ2hDLE1BQU0sRUFBRSxpQkFBaUI7b0JBQ3pCLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsV0FBVyxFQUFFLHdDQUF3QztvQkFDckQsS0FBSyxFQUFFLENBQUMsQ0FBQyxnQkFBZ0I7aUJBQzFCO2dCQUNEO29CQUNFLElBQUksRUFBRSxTQUFrQjtvQkFDeEIsSUFBSSxFQUFFLDBCQUEwQjtvQkFDaEMsTUFBTSxFQUFFLGlCQUFpQjtvQkFDekIsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixXQUFXLEVBQUUscUNBQXFDO29CQUNsRCxLQUFLLEVBQUUsQ0FBQyxDQUFDLFFBQVE7aUJBQ2xCO2dCQUNEO29CQUNFLElBQUksRUFBRSxTQUFrQjtvQkFDeEIsSUFBSSxFQUFFLGtDQUFrQztvQkFDeEMsTUFBTSxFQUFFLGlCQUFpQjtvQkFDekIsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixXQUFXLEVBQUUsOENBQThDO29CQUMzRCxLQUFLLEVBQUUsQ0FBQyxDQUFDLGVBQWU7aUJBQ3pCO2FBQ0YsQ0FBQztRQUNKLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbGxlY3RvciBmb3IgRmlsZUxvY2tNYW5hZ2VyIG1ldHJpY3MuXG4gKlxuICogRXhwb3NlcyBsb2NrIHJlcXVlc3QgdG90YWxzLCBhY3RpdmUgbG9jayBjb3VudCwgdGltZW91dCBjb3VudCwgYW5kXG4gKiBjb25jdXJyZW50LXdhaXQgY291bnQgc291cmNlZCBmcm9tIGBGaWxlTG9ja01hbmFnZXIuZ2V0TWV0cmljcygpYC5cbiAqL1xuaW1wb3J0IHR5cGUgeyBJTWV0cmljQ29sbGVjdG9yLCBNZXRyaWNFbnRyeSB9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgRmlsZUxvY2tNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvZmlsZUxvY2tNYW5hZ2VyLmpzJztcblxuZXhwb3J0IGNsYXNzIEZpbGVMb2NrTWFuYWdlckNvbGxlY3RvciBpbXBsZW1lbnRzIElNZXRyaWNDb2xsZWN0b3Ige1xuICByZWFkb25seSBuYW1lID0gJ2ZpbGUtbG9jayc7XG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uID0gJ01ldHJpY3MgZnJvbSB0aGUgRmlsZUxvY2tNYW5hZ2VyOiByZXF1ZXN0cywgYWN0aXZlIGxvY2tzLCB0aW1lb3V0cywgYW5kIGNvbmN1cnJlbnQgd2FpdHMuJztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGxvY2tNYW5hZ2VyOiBGaWxlTG9ja01hbmFnZXIpIHt9XG5cbiAgY29sbGVjdCgpOiBNZXRyaWNFbnRyeVtdIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbSA9IHRoaXMubG9ja01hbmFnZXIuZ2V0TWV0cmljcygpO1xuXG4gICAgICByZXR1cm4gW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2NvdW50ZXInIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdsb2NrLmZpbGUucmVxdWVzdHNfdG90YWwnLFxuICAgICAgICAgIHNvdXJjZTogJ0ZpbGVMb2NrTWFuYWdlcicsXG4gICAgICAgICAgdW5pdDogJ2NvdW50JyBhcyBjb25zdCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBmaWxlIGxvY2sgcmVxdWVzdHMuJyxcbiAgICAgICAgICB2YWx1ZTogbS50b3RhbFJlcXVlc3RzLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2dhdWdlJyBhcyBjb25zdCxcbiAgICAgICAgICBuYW1lOiAnbG9jay5maWxlLmFjdGl2ZV9jdXJyZW50JyxcbiAgICAgICAgICBzb3VyY2U6ICdGaWxlTG9ja01hbmFnZXInLFxuICAgICAgICAgIHVuaXQ6ICdjb3VudCcgYXMgY29uc3QsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdOdW1iZXIgb2YgY3VycmVudGx5IGFjdGl2ZSBmaWxlIGxvY2tzLicsXG4gICAgICAgICAgdmFsdWU6IG0uYWN0aXZlTG9ja3NDb3VudCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdjb3VudGVyJyBhcyBjb25zdCxcbiAgICAgICAgICBuYW1lOiAnbG9jay5maWxlLnRpbWVvdXRzX3RvdGFsJyxcbiAgICAgICAgICBzb3VyY2U6ICdGaWxlTG9ja01hbmFnZXInLFxuICAgICAgICAgIHVuaXQ6ICdjb3VudCcgYXMgY29uc3QsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgZmlsZSBsb2NrIHRpbWVvdXRzLicsXG4gICAgICAgICAgdmFsdWU6IG0udGltZW91dHMsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnY291bnRlcicgYXMgY29uc3QsXG4gICAgICAgICAgbmFtZTogJ2xvY2suZmlsZS5jb25jdXJyZW50X3dhaXRzX3RvdGFsJyxcbiAgICAgICAgICBzb3VyY2U6ICdGaWxlTG9ja01hbmFnZXInLFxuICAgICAgICAgIHVuaXQ6ICdjb3VudCcgYXMgY29uc3QsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgY29uY3VycmVudCBsb2NrIHdhaXQgZXZlbnRzLicsXG4gICAgICAgICAgdmFsdWU6IG0uY29uY3VycmVudFdhaXRzLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Collector for Gatekeeper policy enforcement metrics.
|
|
3
|
+
*
|
|
4
|
+
* Reads from GatekeeperMetricsTracker and emits counter and gauge
|
|
5
|
+
* metric entries for the MetricsManager pipeline.
|
|
6
|
+
*/
|
|
7
|
+
import type { IMetricCollector, MetricEntry } from '../types.js';
|
|
8
|
+
import type { GatekeeperMetricsTracker } from '../GatekeeperMetricsTracker.js';
|
|
9
|
+
export declare class GatekeeperMetricsCollector implements IMetricCollector {
|
|
10
|
+
private readonly tracker;
|
|
11
|
+
readonly name = "gatekeeper-metrics";
|
|
12
|
+
readonly description = "Gatekeeper policy enforcement: allowed/denied/confirmed, policy sources, permission levels.";
|
|
13
|
+
constructor(tracker: GatekeeperMetricsTracker);
|
|
14
|
+
collect(): MetricEntry[];
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=GatekeeperMetricsCollector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GatekeeperMetricsCollector.d.ts","sourceRoot":"","sources":["../../../src/metrics/collectors/GatekeeperMetricsCollector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAE/E,qBAAa,0BAA2B,YAAW,gBAAgB;IAIrD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,QAAQ,CAAC,IAAI,wBAAwB;IACrC,QAAQ,CAAC,WAAW,iGAAiG;gBAExF,OAAO,EAAE,wBAAwB;IAE9D,OAAO,IAAI,WAAW,EAAE;CAsEzB"}
|