vesper-memory 0.3.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/.env.example +28 -0
- package/CHANGELOG.md +137 -0
- package/LICENSE +21 -0
- package/README.md +665 -0
- package/config/sqlite-schema.sql +413 -0
- package/dist/benchmark/index.d.ts +18 -0
- package/dist/benchmark/index.d.ts.map +1 -0
- package/dist/benchmark/index.js +19 -0
- package/dist/benchmark/index.js.map +1 -0
- package/dist/benchmark/metrics-collector.d.ts +90 -0
- package/dist/benchmark/metrics-collector.d.ts.map +1 -0
- package/dist/benchmark/metrics-collector.js +196 -0
- package/dist/benchmark/metrics-collector.js.map +1 -0
- package/dist/benchmark/report-generator.d.ts +35 -0
- package/dist/benchmark/report-generator.d.ts.map +1 -0
- package/dist/benchmark/report-generator.js +221 -0
- package/dist/benchmark/report-generator.js.map +1 -0
- package/dist/benchmark/runner.d.ts +30 -0
- package/dist/benchmark/runner.d.ts.map +1 -0
- package/dist/benchmark/runner.js +308 -0
- package/dist/benchmark/runner.js.map +1 -0
- package/dist/benchmark/scenarios/context-recall.d.ts +65 -0
- package/dist/benchmark/scenarios/context-recall.d.ts.map +1 -0
- package/dist/benchmark/scenarios/context-recall.js +180 -0
- package/dist/benchmark/scenarios/context-recall.js.map +1 -0
- package/dist/benchmark/scenarios/index.d.ts +34 -0
- package/dist/benchmark/scenarios/index.d.ts.map +1 -0
- package/dist/benchmark/scenarios/index.js +230 -0
- package/dist/benchmark/scenarios/index.js.map +1 -0
- package/dist/benchmark/statistics.d.ts +125 -0
- package/dist/benchmark/statistics.d.ts.map +1 -0
- package/dist/benchmark/statistics.js +520 -0
- package/dist/benchmark/statistics.js.map +1 -0
- package/dist/benchmark/types.d.ts +458 -0
- package/dist/benchmark/types.d.ts.map +1 -0
- package/dist/benchmark/types.js +297 -0
- package/dist/benchmark/types.js.map +1 -0
- package/dist/cli 2.js +583 -0
- package/dist/cli.d 2.ts +8 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts 2.map +1 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +583 -0
- package/dist/cli.js 2.map +1 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/rate-limits.d.ts +76 -0
- package/dist/config/rate-limits.d.ts.map +1 -0
- package/dist/config/rate-limits.js +161 -0
- package/dist/config/rate-limits.js.map +1 -0
- package/dist/config 2/rate-limits.d.ts +76 -0
- package/dist/config 2/rate-limits.d.ts.map +1 -0
- package/dist/config 2/rate-limits.js +161 -0
- package/dist/config 2/rate-limits.js.map +1 -0
- package/dist/consolidation/pipeline.d.ts +52 -0
- package/dist/consolidation/pipeline.d.ts.map +1 -0
- package/dist/consolidation/pipeline.js +193 -0
- package/dist/consolidation/pipeline.js.map +1 -0
- package/dist/consolidation 2/pipeline.d.ts +52 -0
- package/dist/consolidation 2/pipeline.d.ts.map +1 -0
- package/dist/consolidation 2/pipeline.js +193 -0
- package/dist/consolidation 2/pipeline.js.map +1 -0
- package/dist/embeddings/client.d.ts +95 -0
- package/dist/embeddings/client.d.ts.map +1 -0
- package/dist/embeddings/client.js +162 -0
- package/dist/embeddings/client.js.map +1 -0
- package/dist/embeddings 2/client.d.ts +94 -0
- package/dist/embeddings 2/client.d.ts.map +1 -0
- package/dist/embeddings 2/client.js +144 -0
- package/dist/embeddings 2/client.js.map +1 -0
- package/dist/memory-layers/semantic-memory.d.ts +76 -0
- package/dist/memory-layers/semantic-memory.d.ts.map +1 -0
- package/dist/memory-layers/semantic-memory.js +231 -0
- package/dist/memory-layers/semantic-memory.js.map +1 -0
- package/dist/memory-layers/skill-library.d.ts +25 -0
- package/dist/memory-layers/skill-library.d.ts.map +1 -0
- package/dist/memory-layers/skill-library.js +54 -0
- package/dist/memory-layers/skill-library.js.map +1 -0
- package/dist/memory-layers/working-memory.d.ts +57 -0
- package/dist/memory-layers/working-memory.d.ts.map +1 -0
- package/dist/memory-layers/working-memory.js +153 -0
- package/dist/memory-layers/working-memory.js.map +1 -0
- package/dist/memory-layers 2/semantic-memory.d.ts +33 -0
- package/dist/memory-layers 2/semantic-memory.d.ts.map +1 -0
- package/dist/memory-layers 2/semantic-memory.js +114 -0
- package/dist/memory-layers 2/semantic-memory.js.map +1 -0
- package/dist/memory-layers 2/skill-library.d.ts +25 -0
- package/dist/memory-layers 2/skill-library.d.ts.map +1 -0
- package/dist/memory-layers 2/skill-library.js +54 -0
- package/dist/memory-layers 2/skill-library.js.map +1 -0
- package/dist/memory-layers 2/working-memory.d.ts +57 -0
- package/dist/memory-layers 2/working-memory.d.ts.map +1 -0
- package/dist/memory-layers 2/working-memory.js +153 -0
- package/dist/memory-layers 2/working-memory.js.map +1 -0
- package/dist/middleware/auth.d.ts +287 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +610 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware 2/auth.d.ts +287 -0
- package/dist/middleware 2/auth.d.ts.map +1 -0
- package/dist/middleware 2/auth.js +610 -0
- package/dist/middleware 2/auth.js.map +1 -0
- package/dist/monitoring/health.d.ts +241 -0
- package/dist/monitoring/health.d.ts.map +1 -0
- package/dist/monitoring/health.js +649 -0
- package/dist/monitoring/health.js.map +1 -0
- package/dist/monitoring/metrics.d.ts +153 -0
- package/dist/monitoring/metrics.d.ts.map +1 -0
- package/dist/monitoring/metrics.js +349 -0
- package/dist/monitoring/metrics.js.map +1 -0
- package/dist/monitoring 2/health.d.ts +241 -0
- package/dist/monitoring 2/health.d.ts.map +1 -0
- package/dist/monitoring 2/health.js +649 -0
- package/dist/monitoring 2/health.js.map +1 -0
- package/dist/monitoring 2/metrics.d.ts +153 -0
- package/dist/monitoring 2/metrics.d.ts.map +1 -0
- package/dist/monitoring 2/metrics.js +349 -0
- package/dist/monitoring 2/metrics.js.map +1 -0
- package/dist/retrieval/hybrid-search.d.ts +186 -0
- package/dist/retrieval/hybrid-search.d.ts.map +1 -0
- package/dist/retrieval/hybrid-search.js +330 -0
- package/dist/retrieval/hybrid-search.js.map +1 -0
- package/dist/retrieval 2/hybrid-search.d.ts +186 -0
- package/dist/retrieval 2/hybrid-search.d.ts.map +1 -0
- package/dist/retrieval 2/hybrid-search.js +327 -0
- package/dist/retrieval 2/hybrid-search.js.map +1 -0
- package/dist/router/smart-router.d.ts +157 -0
- package/dist/router/smart-router.d.ts.map +1 -0
- package/dist/router/smart-router.js +524 -0
- package/dist/router/smart-router.js.map +1 -0
- package/dist/router 2/smart-router.d.ts +111 -0
- package/dist/router 2/smart-router.d.ts.map +1 -0
- package/dist/router 2/smart-router.js +383 -0
- package/dist/router 2/smart-router.js.map +1 -0
- package/dist/security/rate-limit-middleware.d.ts +119 -0
- package/dist/security/rate-limit-middleware.d.ts.map +1 -0
- package/dist/security/rate-limit-middleware.js +193 -0
- package/dist/security/rate-limit-middleware.js.map +1 -0
- package/dist/security 2/rate-limit-middleware.d.ts +119 -0
- package/dist/security 2/rate-limit-middleware.d.ts.map +1 -0
- package/dist/security 2/rate-limit-middleware.js +193 -0
- package/dist/security 2/rate-limit-middleware.js.map +1 -0
- package/dist/server 2.js +861 -0
- package/dist/server-wrapper 2.js +170 -0
- package/dist/server-wrapper.d 2.ts +12 -0
- package/dist/server-wrapper.d.ts +12 -0
- package/dist/server-wrapper.d.ts 2.map +1 -0
- package/dist/server-wrapper.d.ts.map +1 -0
- package/dist/server-wrapper.js +170 -0
- package/dist/server-wrapper.js 2.map +1 -0
- package/dist/server-wrapper.js.map +1 -0
- package/dist/server.d 2.ts +14 -0
- package/dist/server.d.ts +14 -0
- package/dist/server.d.ts 2.map +1 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +656 -0
- package/dist/server.js 2.map +1 -0
- package/dist/server.js.map +1 -0
- package/dist/synthesis/conflict-detector.d.ts +43 -0
- package/dist/synthesis/conflict-detector.d.ts.map +1 -0
- package/dist/synthesis/conflict-detector.js +125 -0
- package/dist/synthesis/conflict-detector.js.map +1 -0
- package/dist/synthesis 2/conflict-detector.d.ts +43 -0
- package/dist/synthesis 2/conflict-detector.d.ts.map +1 -0
- package/dist/synthesis 2/conflict-detector.js +125 -0
- package/dist/synthesis 2/conflict-detector.js.map +1 -0
- package/dist/utils/monitoring.d.ts +25 -0
- package/dist/utils/monitoring.d.ts.map +1 -0
- package/dist/utils/monitoring.js +41 -0
- package/dist/utils/monitoring.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +97 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +166 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/dist/utils/validation.d.ts +139 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +195 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/utils 2/monitoring.d.ts +25 -0
- package/dist/utils 2/monitoring.d.ts.map +1 -0
- package/dist/utils 2/monitoring.js +41 -0
- package/dist/utils 2/monitoring.js.map +1 -0
- package/dist/utils 2/rate-limiter.d.ts +97 -0
- package/dist/utils 2/rate-limiter.d.ts.map +1 -0
- package/dist/utils 2/rate-limiter.js +166 -0
- package/dist/utils 2/rate-limiter.js.map +1 -0
- package/dist/utils 2/validation.d.ts +139 -0
- package/dist/utils 2/validation.d.ts.map +1 -0
- package/dist/utils 2/validation.js +195 -0
- package/dist/utils 2/validation.js.map +1 -0
- package/docker-compose.yml +65 -0
- package/embedding-service/Dockerfile +29 -0
- package/embedding-service/README.md +68 -0
- package/embedding-service/requirements.txt +6 -0
- package/embedding-service/server.py +110 -0
- package/package.json +92 -0
- package/scripts/FRESH_INSTALL.md +280 -0
- package/scripts/README.md +101 -0
- package/scripts/ensure-infrastructure.sh +38 -0
- package/scripts/fresh-install-auto.sh +96 -0
- package/scripts/fresh-install.sh +167 -0
- package/scripts/health-check.sh +72 -0
- package/scripts/init-qdrant.ts +201 -0
- package/scripts/postinstall.js +94 -0
- package/scripts/run-accuracy-benchmark.ts +1237 -0
- package/scripts/run-real-benchmark.ts +581 -0
- package/scripts/test-mcp-server.sh +38 -0
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prometheus Metrics Collector
|
|
3
|
+
*
|
|
4
|
+
* Provides comprehensive metrics collection for the Vesper server:
|
|
5
|
+
* - Request counters (per tool, per status)
|
|
6
|
+
* - Latency histograms (P50, P95, P99)
|
|
7
|
+
* - Error rate gauges
|
|
8
|
+
* - Active connections gauge
|
|
9
|
+
* - Auth success/failure counters
|
|
10
|
+
* - Cache hit rate tracking
|
|
11
|
+
*
|
|
12
|
+
* Performance target: <5ms overhead per metric collection
|
|
13
|
+
*/
|
|
14
|
+
import { Registry } from "prom-client";
|
|
15
|
+
/**
|
|
16
|
+
* Configuration for the metrics collector
|
|
17
|
+
*/
|
|
18
|
+
export interface MetricsConfig {
|
|
19
|
+
/** Prefix for all metric names (default: "mcp") */
|
|
20
|
+
prefix?: string;
|
|
21
|
+
/** Default labels applied to all metrics */
|
|
22
|
+
defaultLabels?: Record<string, string>;
|
|
23
|
+
/** Whether to collect default Node.js metrics */
|
|
24
|
+
collectDefaultMetrics?: boolean;
|
|
25
|
+
/** Whether authentication is required for metrics endpoint */
|
|
26
|
+
requireAuth?: boolean;
|
|
27
|
+
/** Authentication token for metrics endpoint (when requireAuth is true) */
|
|
28
|
+
authToken?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Options for retrieving metrics
|
|
32
|
+
*/
|
|
33
|
+
export interface GetMetricsOptions {
|
|
34
|
+
/** Authentication token (required when requireAuth is true) */
|
|
35
|
+
authToken?: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* MetricsCollector class for Prometheus metrics
|
|
39
|
+
*/
|
|
40
|
+
export declare class MetricsCollector {
|
|
41
|
+
private registry;
|
|
42
|
+
private config;
|
|
43
|
+
private requestsTotal;
|
|
44
|
+
private errorsTotal;
|
|
45
|
+
private authAttemptsTotal;
|
|
46
|
+
private rateLimitHitsTotal;
|
|
47
|
+
private consolidationFailuresTotal;
|
|
48
|
+
private requestDuration;
|
|
49
|
+
private dbQueryDuration;
|
|
50
|
+
private activeConnections;
|
|
51
|
+
private cacheHitRate;
|
|
52
|
+
private certExpiryDays;
|
|
53
|
+
constructor(config?: MetricsConfig);
|
|
54
|
+
/**
|
|
55
|
+
* Get the Prometheus registry
|
|
56
|
+
*/
|
|
57
|
+
getRegistry(): Registry;
|
|
58
|
+
/**
|
|
59
|
+
* Increment request counter
|
|
60
|
+
*/
|
|
61
|
+
incrementRequests(tool: string, status: "success" | "error"): void;
|
|
62
|
+
/**
|
|
63
|
+
* Increment error counter
|
|
64
|
+
*/
|
|
65
|
+
incrementErrors(type: string): void;
|
|
66
|
+
/**
|
|
67
|
+
* Increment authentication attempts counter
|
|
68
|
+
*/
|
|
69
|
+
incrementAuthAttempts(status: "success" | "failed"): void;
|
|
70
|
+
/**
|
|
71
|
+
* Increment rate limit hits counter
|
|
72
|
+
*/
|
|
73
|
+
incrementRateLimitHits(userId: string, operation: string): void;
|
|
74
|
+
/**
|
|
75
|
+
* Increment consolidation failures counter
|
|
76
|
+
*/
|
|
77
|
+
incrementConsolidationFailures(): void;
|
|
78
|
+
/**
|
|
79
|
+
* Record request latency
|
|
80
|
+
*/
|
|
81
|
+
recordLatency(tool: string, durationSeconds: number): void;
|
|
82
|
+
/**
|
|
83
|
+
* Record database query latency
|
|
84
|
+
*/
|
|
85
|
+
recordDbLatency(db: string, operation: string, durationSeconds: number): void;
|
|
86
|
+
/**
|
|
87
|
+
* Set active connections gauge
|
|
88
|
+
*/
|
|
89
|
+
setActiveConnections(count: number): void;
|
|
90
|
+
/**
|
|
91
|
+
* Set cache hit rate gauge
|
|
92
|
+
*/
|
|
93
|
+
setCacheHitRate(rate: number): void;
|
|
94
|
+
/**
|
|
95
|
+
* Set certificate expiry days gauge
|
|
96
|
+
*/
|
|
97
|
+
setCertExpiryDays(days: number): void;
|
|
98
|
+
/**
|
|
99
|
+
* Get metrics in Prometheus text format
|
|
100
|
+
*/
|
|
101
|
+
getMetricsText(options?: GetMetricsOptions): Promise<string>;
|
|
102
|
+
/**
|
|
103
|
+
* Get metrics as JSON array
|
|
104
|
+
*/
|
|
105
|
+
getMetricsJson(options?: GetMetricsOptions): Promise<unknown[]>;
|
|
106
|
+
/**
|
|
107
|
+
* Get current error rate (errors / total requests)
|
|
108
|
+
*/
|
|
109
|
+
getErrorRate(): Promise<number>;
|
|
110
|
+
/**
|
|
111
|
+
* Get authentication failure count
|
|
112
|
+
*/
|
|
113
|
+
getAuthFailureCount(): Promise<number>;
|
|
114
|
+
/**
|
|
115
|
+
* Get P95 latency for a specific tool
|
|
116
|
+
* Note: This is an approximation based on histogram buckets
|
|
117
|
+
*/
|
|
118
|
+
getP95Latency(tool: string): Promise<number>;
|
|
119
|
+
/**
|
|
120
|
+
* Reset all metrics (useful for testing)
|
|
121
|
+
*/
|
|
122
|
+
reset(): Promise<void>;
|
|
123
|
+
/**
|
|
124
|
+
* Validate authentication for metrics access
|
|
125
|
+
*/
|
|
126
|
+
private validateAuth;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Create a new MetricsCollector instance
|
|
130
|
+
*/
|
|
131
|
+
export declare function createMetricsCollector(config?: MetricsConfig): MetricsCollector;
|
|
132
|
+
/**
|
|
133
|
+
* Get or create the global metrics collector
|
|
134
|
+
*/
|
|
135
|
+
export declare function getGlobalMetrics(config?: MetricsConfig): MetricsCollector;
|
|
136
|
+
/**
|
|
137
|
+
* Timer helper for measuring operation duration
|
|
138
|
+
*/
|
|
139
|
+
export declare class MetricsTimer {
|
|
140
|
+
private startTime;
|
|
141
|
+
private collector;
|
|
142
|
+
private tool;
|
|
143
|
+
constructor(collector: MetricsCollector, tool: string);
|
|
144
|
+
/**
|
|
145
|
+
* End the timer and record the duration
|
|
146
|
+
*/
|
|
147
|
+
end(status?: "success" | "error"): number;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Create a timer for measuring operation duration
|
|
151
|
+
*/
|
|
152
|
+
export declare function startTimer(collector: MetricsCollector, tool: string): MetricsTimer;
|
|
153
|
+
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/monitoring/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prometheus Metrics Collector
|
|
3
|
+
*
|
|
4
|
+
* Provides comprehensive metrics collection for the Vesper server:
|
|
5
|
+
* - Request counters (per tool, per status)
|
|
6
|
+
* - Latency histograms (P50, P95, P99)
|
|
7
|
+
* - Error rate gauges
|
|
8
|
+
* - Active connections gauge
|
|
9
|
+
* - Auth success/failure counters
|
|
10
|
+
* - Cache hit rate tracking
|
|
11
|
+
*
|
|
12
|
+
* Performance target: <5ms overhead per metric collection
|
|
13
|
+
*/
|
|
14
|
+
import { Counter, Histogram, Gauge, Registry, collectDefaultMetrics, } from "prom-client";
|
|
15
|
+
/**
|
|
16
|
+
* MetricsCollector class for Prometheus metrics
|
|
17
|
+
*/
|
|
18
|
+
export class MetricsCollector {
|
|
19
|
+
registry;
|
|
20
|
+
config;
|
|
21
|
+
// Counter metrics
|
|
22
|
+
requestsTotal;
|
|
23
|
+
errorsTotal;
|
|
24
|
+
authAttemptsTotal;
|
|
25
|
+
rateLimitHitsTotal;
|
|
26
|
+
consolidationFailuresTotal;
|
|
27
|
+
// Histogram metrics
|
|
28
|
+
requestDuration;
|
|
29
|
+
dbQueryDuration;
|
|
30
|
+
// Gauge metrics
|
|
31
|
+
activeConnections;
|
|
32
|
+
cacheHitRate;
|
|
33
|
+
certExpiryDays;
|
|
34
|
+
constructor(config = {}) {
|
|
35
|
+
this.config = {
|
|
36
|
+
prefix: config.prefix || "mcp",
|
|
37
|
+
defaultLabels: config.defaultLabels || {},
|
|
38
|
+
collectDefaultMetrics: config.collectDefaultMetrics ?? false,
|
|
39
|
+
requireAuth: config.requireAuth ?? false,
|
|
40
|
+
authToken: config.authToken,
|
|
41
|
+
};
|
|
42
|
+
// Create a new registry for this collector
|
|
43
|
+
this.registry = new Registry();
|
|
44
|
+
// Set default labels
|
|
45
|
+
if (Object.keys(this.config.defaultLabels).length > 0) {
|
|
46
|
+
this.registry.setDefaultLabels(this.config.defaultLabels);
|
|
47
|
+
}
|
|
48
|
+
// Initialize counter metrics
|
|
49
|
+
this.requestsTotal = new Counter({
|
|
50
|
+
name: `${this.config.prefix}_requests_total`,
|
|
51
|
+
help: "Total number of MCP tool requests",
|
|
52
|
+
labelNames: ["tool", "status"],
|
|
53
|
+
registers: [this.registry],
|
|
54
|
+
});
|
|
55
|
+
this.errorsTotal = new Counter({
|
|
56
|
+
name: `${this.config.prefix}_errors_total`,
|
|
57
|
+
help: "Total number of errors by type",
|
|
58
|
+
labelNames: ["type"],
|
|
59
|
+
registers: [this.registry],
|
|
60
|
+
});
|
|
61
|
+
this.authAttemptsTotal = new Counter({
|
|
62
|
+
name: `${this.config.prefix}_auth_attempts_total`,
|
|
63
|
+
help: "Total authentication attempts",
|
|
64
|
+
labelNames: ["status"],
|
|
65
|
+
registers: [this.registry],
|
|
66
|
+
});
|
|
67
|
+
this.rateLimitHitsTotal = new Counter({
|
|
68
|
+
name: `${this.config.prefix}_rate_limit_hits_total`,
|
|
69
|
+
help: "Total rate limit violations",
|
|
70
|
+
labelNames: ["user_id", "operation"],
|
|
71
|
+
registers: [this.registry],
|
|
72
|
+
});
|
|
73
|
+
this.consolidationFailuresTotal = new Counter({
|
|
74
|
+
name: `${this.config.prefix}_consolidation_failures_total`,
|
|
75
|
+
help: "Total consolidation pipeline failures",
|
|
76
|
+
registers: [this.registry],
|
|
77
|
+
});
|
|
78
|
+
// Initialize histogram metrics with appropriate buckets
|
|
79
|
+
this.requestDuration = new Histogram({
|
|
80
|
+
name: `${this.config.prefix}_request_duration_seconds`,
|
|
81
|
+
help: "Request duration in seconds",
|
|
82
|
+
labelNames: ["tool"],
|
|
83
|
+
// Buckets optimized for <200ms P95 latency target
|
|
84
|
+
buckets: [0.01, 0.02, 0.05, 0.1, 0.15, 0.2, 0.3, 0.5, 1, 2, 5],
|
|
85
|
+
registers: [this.registry],
|
|
86
|
+
});
|
|
87
|
+
this.dbQueryDuration = new Histogram({
|
|
88
|
+
name: `${this.config.prefix}_db_query_duration_seconds`,
|
|
89
|
+
help: "Database query duration in seconds",
|
|
90
|
+
labelNames: ["db", "operation"],
|
|
91
|
+
buckets: [0.001, 0.002, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.5],
|
|
92
|
+
registers: [this.registry],
|
|
93
|
+
});
|
|
94
|
+
// Initialize gauge metrics
|
|
95
|
+
this.activeConnections = new Gauge({
|
|
96
|
+
name: `${this.config.prefix}_active_connections`,
|
|
97
|
+
help: "Number of active connections",
|
|
98
|
+
registers: [this.registry],
|
|
99
|
+
});
|
|
100
|
+
this.cacheHitRate = new Gauge({
|
|
101
|
+
name: `${this.config.prefix}_cache_hit_rate`,
|
|
102
|
+
help: "Cache hit rate (0.0 to 1.0)",
|
|
103
|
+
registers: [this.registry],
|
|
104
|
+
});
|
|
105
|
+
this.certExpiryDays = new Gauge({
|
|
106
|
+
name: `${this.config.prefix}_cert_expiry_days`,
|
|
107
|
+
help: "Days until certificate expiration",
|
|
108
|
+
registers: [this.registry],
|
|
109
|
+
});
|
|
110
|
+
// Optionally collect default Node.js metrics
|
|
111
|
+
if (this.config.collectDefaultMetrics) {
|
|
112
|
+
collectDefaultMetrics({ register: this.registry });
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Get the Prometheus registry
|
|
117
|
+
*/
|
|
118
|
+
getRegistry() {
|
|
119
|
+
return this.registry;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Increment request counter
|
|
123
|
+
*/
|
|
124
|
+
incrementRequests(tool, status) {
|
|
125
|
+
this.requestsTotal.inc({ tool, status });
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Increment error counter
|
|
129
|
+
*/
|
|
130
|
+
incrementErrors(type) {
|
|
131
|
+
this.errorsTotal.inc({ type });
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Increment authentication attempts counter
|
|
135
|
+
*/
|
|
136
|
+
incrementAuthAttempts(status) {
|
|
137
|
+
this.authAttemptsTotal.inc({ status });
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Increment rate limit hits counter
|
|
141
|
+
*/
|
|
142
|
+
incrementRateLimitHits(userId, operation) {
|
|
143
|
+
// Sanitize user_id to avoid high cardinality issues
|
|
144
|
+
const sanitizedUserId = userId.substring(0, 32);
|
|
145
|
+
this.rateLimitHitsTotal.inc({ user_id: sanitizedUserId, operation });
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Increment consolidation failures counter
|
|
149
|
+
*/
|
|
150
|
+
incrementConsolidationFailures() {
|
|
151
|
+
this.consolidationFailuresTotal.inc();
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Record request latency
|
|
155
|
+
*/
|
|
156
|
+
recordLatency(tool, durationSeconds) {
|
|
157
|
+
this.requestDuration.observe({ tool }, durationSeconds);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Record database query latency
|
|
161
|
+
*/
|
|
162
|
+
recordDbLatency(db, operation, durationSeconds) {
|
|
163
|
+
this.dbQueryDuration.observe({ db, operation }, durationSeconds);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Set active connections gauge
|
|
167
|
+
*/
|
|
168
|
+
setActiveConnections(count) {
|
|
169
|
+
this.activeConnections.set(count);
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Set cache hit rate gauge
|
|
173
|
+
*/
|
|
174
|
+
setCacheHitRate(rate) {
|
|
175
|
+
this.cacheHitRate.set(rate);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Set certificate expiry days gauge
|
|
179
|
+
*/
|
|
180
|
+
setCertExpiryDays(days) {
|
|
181
|
+
this.certExpiryDays.set(days);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Get metrics in Prometheus text format
|
|
185
|
+
*/
|
|
186
|
+
async getMetricsText(options = {}) {
|
|
187
|
+
this.validateAuth(options.authToken);
|
|
188
|
+
return await this.registry.metrics();
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Get metrics as JSON array
|
|
192
|
+
*/
|
|
193
|
+
async getMetricsJson(options = {}) {
|
|
194
|
+
this.validateAuth(options.authToken);
|
|
195
|
+
return await this.registry.getMetricsAsJSON();
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Get current error rate (errors / total requests)
|
|
199
|
+
*/
|
|
200
|
+
async getErrorRate() {
|
|
201
|
+
const metrics = await this.registry.getMetricsAsJSON();
|
|
202
|
+
// Find request metrics
|
|
203
|
+
const requestMetric = metrics.find((m) => m.name === `${this.config.prefix}_requests_total`);
|
|
204
|
+
if (!requestMetric || !("values" in requestMetric)) {
|
|
205
|
+
return 0;
|
|
206
|
+
}
|
|
207
|
+
const values = requestMetric.values;
|
|
208
|
+
let successCount = 0;
|
|
209
|
+
let errorCount = 0;
|
|
210
|
+
for (const v of values) {
|
|
211
|
+
if (v.labels.status === "success") {
|
|
212
|
+
successCount += v.value;
|
|
213
|
+
}
|
|
214
|
+
else if (v.labels.status === "error") {
|
|
215
|
+
errorCount += v.value;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
const total = successCount + errorCount;
|
|
219
|
+
return total > 0 ? errorCount / total : 0;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Get authentication failure count
|
|
223
|
+
*/
|
|
224
|
+
async getAuthFailureCount() {
|
|
225
|
+
const metrics = await this.registry.getMetricsAsJSON();
|
|
226
|
+
const authMetric = metrics.find((m) => m.name === `${this.config.prefix}_auth_attempts_total`);
|
|
227
|
+
if (!authMetric || !("values" in authMetric)) {
|
|
228
|
+
return 0;
|
|
229
|
+
}
|
|
230
|
+
const values = authMetric.values;
|
|
231
|
+
let failureCount = 0;
|
|
232
|
+
for (const v of values) {
|
|
233
|
+
if (v.labels.status === "failed") {
|
|
234
|
+
failureCount += v.value;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return failureCount;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Get P95 latency for a specific tool
|
|
241
|
+
* Note: This is an approximation based on histogram buckets
|
|
242
|
+
*/
|
|
243
|
+
async getP95Latency(tool) {
|
|
244
|
+
const metrics = await this.registry.getMetricsAsJSON();
|
|
245
|
+
const durationMetric = metrics.find((m) => m.name === `${this.config.prefix}_request_duration_seconds`);
|
|
246
|
+
if (!durationMetric || !("values" in durationMetric)) {
|
|
247
|
+
return 0;
|
|
248
|
+
}
|
|
249
|
+
const values = durationMetric.values;
|
|
250
|
+
// Filter to this tool's histogram buckets (buckets have 'le' label)
|
|
251
|
+
const toolBuckets = values.filter((v) => v.labels.tool === tool && v.labels.le !== undefined);
|
|
252
|
+
if (toolBuckets.length === 0) {
|
|
253
|
+
return 0;
|
|
254
|
+
}
|
|
255
|
+
// Get total count from +Inf bucket (contains all observations)
|
|
256
|
+
const infBucket = toolBuckets.find((b) => b.labels.le === "+Inf");
|
|
257
|
+
const totalCount = infBucket?.value || 0;
|
|
258
|
+
if (totalCount === 0) {
|
|
259
|
+
return 0;
|
|
260
|
+
}
|
|
261
|
+
// Find P95 bucket (95th percentile)
|
|
262
|
+
const p95Target = totalCount * 0.95;
|
|
263
|
+
// Sort buckets by le (upper bound), excluding +Inf
|
|
264
|
+
const sortedBuckets = toolBuckets
|
|
265
|
+
.filter((b) => b.labels.le !== "+Inf")
|
|
266
|
+
.sort((a, b) => parseFloat(a.labels.le) - parseFloat(b.labels.le));
|
|
267
|
+
for (const bucket of sortedBuckets) {
|
|
268
|
+
if (bucket.value >= p95Target) {
|
|
269
|
+
return parseFloat(bucket.labels.le);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// If no bucket found, return the highest bucket boundary
|
|
273
|
+
if (sortedBuckets.length > 0) {
|
|
274
|
+
return parseFloat(sortedBuckets[sortedBuckets.length - 1].labels.le);
|
|
275
|
+
}
|
|
276
|
+
return 0;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Reset all metrics (useful for testing)
|
|
280
|
+
*/
|
|
281
|
+
async reset() {
|
|
282
|
+
this.registry.resetMetrics();
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Validate authentication for metrics access
|
|
286
|
+
*/
|
|
287
|
+
validateAuth(providedToken) {
|
|
288
|
+
if (!this.config.requireAuth) {
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
if (!providedToken) {
|
|
292
|
+
throw new Error("Authentication required for metrics endpoint");
|
|
293
|
+
}
|
|
294
|
+
if (!this.config.authToken) {
|
|
295
|
+
throw new Error("Metrics authentication not configured");
|
|
296
|
+
}
|
|
297
|
+
if (providedToken !== this.config.authToken) {
|
|
298
|
+
throw new Error("Invalid authentication token");
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Create a new MetricsCollector instance
|
|
304
|
+
*/
|
|
305
|
+
export function createMetricsCollector(config = {}) {
|
|
306
|
+
return new MetricsCollector(config);
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Singleton instance for global metrics collection
|
|
310
|
+
*/
|
|
311
|
+
let globalCollector = null;
|
|
312
|
+
/**
|
|
313
|
+
* Get or create the global metrics collector
|
|
314
|
+
*/
|
|
315
|
+
export function getGlobalMetrics(config) {
|
|
316
|
+
if (!globalCollector) {
|
|
317
|
+
globalCollector = createMetricsCollector(config);
|
|
318
|
+
}
|
|
319
|
+
return globalCollector;
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Timer helper for measuring operation duration
|
|
323
|
+
*/
|
|
324
|
+
export class MetricsTimer {
|
|
325
|
+
startTime;
|
|
326
|
+
collector;
|
|
327
|
+
tool;
|
|
328
|
+
constructor(collector, tool) {
|
|
329
|
+
this.collector = collector;
|
|
330
|
+
this.tool = tool;
|
|
331
|
+
this.startTime = performance.now();
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* End the timer and record the duration
|
|
335
|
+
*/
|
|
336
|
+
end(status = "success") {
|
|
337
|
+
const duration = (performance.now() - this.startTime) / 1000;
|
|
338
|
+
this.collector.recordLatency(this.tool, duration);
|
|
339
|
+
this.collector.incrementRequests(this.tool, status);
|
|
340
|
+
return duration;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Create a timer for measuring operation duration
|
|
345
|
+
*/
|
|
346
|
+
export function startTimer(collector, tool) {
|
|
347
|
+
return new MetricsTimer(collector, tool);
|
|
348
|
+
}
|
|
349
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/monitoring/metrics.ts"],"names":[],"mappings":"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"}
|