@skillsmith/core 0.2.0 → 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/README.md +233 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/analysis/__tests__/incremental.test.d.ts +13 -0
- package/dist/src/analysis/__tests__/incremental.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/incremental.test.js +515 -0
- package/dist/src/analysis/__tests__/incremental.test.js.map +1 -0
- package/dist/src/analysis/__tests__/integration.test.d.ts +14 -0
- package/dist/src/analysis/__tests__/integration.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/integration.test.js +1059 -0
- package/dist/src/analysis/__tests__/integration.test.js.map +1 -0
- package/dist/src/analysis/__tests__/metrics.test.d.ts +9 -0
- package/dist/src/analysis/__tests__/metrics.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/metrics.test.js +369 -0
- package/dist/src/analysis/__tests__/metrics.test.js.map +1 -0
- package/dist/src/analysis/__tests__/performance.test.d.ts +15 -0
- package/dist/src/analysis/__tests__/performance.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/performance.test.js +402 -0
- package/dist/src/analysis/__tests__/performance.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/go.test.d.ts +12 -0
- package/dist/src/analysis/adapters/__tests__/go.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/go.test.js +561 -0
- package/dist/src/analysis/adapters/__tests__/go.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/python.test.d.ts +11 -0
- package/dist/src/analysis/adapters/__tests__/python.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/python.test.js +669 -0
- package/dist/src/analysis/adapters/__tests__/python.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.d.ts +12 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.js +676 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.d.ts +14 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.js +381 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.js.map +1 -0
- package/dist/src/analysis/adapters/base.d.ts +83 -0
- package/dist/src/analysis/adapters/base.d.ts.map +1 -0
- package/dist/src/analysis/adapters/base.js +40 -0
- package/dist/src/analysis/adapters/base.js.map +1 -0
- package/dist/src/analysis/adapters/factory.d.ts +150 -0
- package/dist/src/analysis/adapters/factory.d.ts.map +1 -0
- package/dist/src/analysis/adapters/factory.js +244 -0
- package/dist/src/analysis/adapters/factory.js.map +1 -0
- package/dist/src/analysis/adapters/go.d.ts +131 -0
- package/dist/src/analysis/adapters/go.d.ts.map +1 -0
- package/dist/src/analysis/adapters/go.js +414 -0
- package/dist/src/analysis/adapters/go.js.map +1 -0
- package/dist/src/analysis/adapters/index.d.ts +20 -0
- package/dist/src/analysis/adapters/index.d.ts.map +1 -0
- package/dist/src/analysis/adapters/index.js +23 -0
- package/dist/src/analysis/adapters/index.js.map +1 -0
- package/dist/src/analysis/adapters/java.d.ts +154 -0
- package/dist/src/analysis/adapters/java.d.ts.map +1 -0
- package/dist/src/analysis/adapters/java.js +407 -0
- package/dist/src/analysis/adapters/java.js.map +1 -0
- package/dist/src/analysis/adapters/python.d.ts +165 -0
- package/dist/src/analysis/adapters/python.d.ts.map +1 -0
- package/dist/src/analysis/adapters/python.js +475 -0
- package/dist/src/analysis/adapters/python.js.map +1 -0
- package/dist/src/analysis/adapters/rust.d.ts +116 -0
- package/dist/src/analysis/adapters/rust.d.ts.map +1 -0
- package/dist/src/analysis/adapters/rust.js +476 -0
- package/dist/src/analysis/adapters/rust.js.map +1 -0
- package/dist/src/analysis/adapters/typescript.d.ts +68 -0
- package/dist/src/analysis/adapters/typescript.d.ts.map +1 -0
- package/dist/src/analysis/adapters/typescript.js +79 -0
- package/dist/src/analysis/adapters/typescript.js.map +1 -0
- package/dist/src/analysis/aggregator.d.ts +193 -0
- package/dist/src/analysis/aggregator.d.ts.map +1 -0
- package/dist/src/analysis/aggregator.js +283 -0
- package/dist/src/analysis/aggregator.js.map +1 -0
- package/dist/src/analysis/cache.d.ts +180 -0
- package/dist/src/analysis/cache.d.ts.map +1 -0
- package/dist/src/analysis/cache.js +279 -0
- package/dist/src/analysis/cache.js.map +1 -0
- package/dist/src/analysis/file-streamer.d.ts +136 -0
- package/dist/src/analysis/file-streamer.d.ts.map +1 -0
- package/dist/src/analysis/file-streamer.js +291 -0
- package/dist/src/analysis/file-streamer.js.map +1 -0
- package/dist/src/analysis/incremental-parser.d.ts +186 -0
- package/dist/src/analysis/incremental-parser.d.ts.map +1 -0
- package/dist/src/analysis/incremental-parser.js +291 -0
- package/dist/src/analysis/incremental-parser.js.map +1 -0
- package/dist/src/analysis/incremental.d.ts +186 -0
- package/dist/src/analysis/incremental.d.ts.map +1 -0
- package/dist/src/analysis/incremental.js +247 -0
- package/dist/src/analysis/incremental.js.map +1 -0
- package/dist/src/analysis/index.d.ts +25 -3
- package/dist/src/analysis/index.d.ts.map +1 -1
- package/dist/src/analysis/index.js +45 -3
- package/dist/src/analysis/index.js.map +1 -1
- package/dist/src/analysis/language-detector.d.ts +92 -0
- package/dist/src/analysis/language-detector.d.ts.map +1 -0
- package/dist/src/analysis/language-detector.js +602 -0
- package/dist/src/analysis/language-detector.js.map +1 -0
- package/dist/src/analysis/memory-monitor.d.ts +199 -0
- package/dist/src/analysis/memory-monitor.d.ts.map +1 -0
- package/dist/src/analysis/memory-monitor.js +271 -0
- package/dist/src/analysis/memory-monitor.js.map +1 -0
- package/dist/src/analysis/metrics.d.ts +300 -0
- package/dist/src/analysis/metrics.d.ts.map +1 -0
- package/dist/src/analysis/metrics.js +537 -0
- package/dist/src/analysis/metrics.js.map +1 -0
- package/dist/src/analysis/router.d.ts +264 -0
- package/dist/src/analysis/router.d.ts.map +1 -0
- package/dist/src/analysis/router.js +398 -0
- package/dist/src/analysis/router.js.map +1 -0
- package/dist/src/analysis/tree-cache.d.ts +208 -0
- package/dist/src/analysis/tree-cache.d.ts.map +1 -0
- package/dist/src/analysis/tree-cache.js +288 -0
- package/dist/src/analysis/tree-cache.js.map +1 -0
- package/dist/src/analysis/tree-sitter/manager.d.ts +141 -0
- package/dist/src/analysis/tree-sitter/manager.d.ts.map +1 -0
- package/dist/src/analysis/tree-sitter/manager.js +239 -0
- package/dist/src/analysis/tree-sitter/manager.js.map +1 -0
- package/dist/src/analysis/types.d.ts +69 -6
- package/dist/src/analysis/types.d.ts.map +1 -1
- package/dist/src/analysis/types.js +23 -2
- package/dist/src/analysis/types.js.map +1 -1
- package/dist/src/analysis/worker-pool.d.ts +141 -0
- package/dist/src/analysis/worker-pool.d.ts.map +1 -0
- package/dist/src/analysis/worker-pool.js +418 -0
- package/dist/src/analysis/worker-pool.js.map +1 -0
- package/dist/src/analytics/schema.d.ts +1 -1
- package/dist/src/analytics/schema.d.ts.map +1 -1
- package/dist/src/analytics/schema.js +72 -0
- package/dist/src/analytics/schema.js.map +1 -1
- package/dist/src/api/cache.d.ts +24 -1
- package/dist/src/api/cache.d.ts.map +1 -1
- package/dist/src/api/cache.js +50 -2
- package/dist/src/api/cache.js.map +1 -1
- package/dist/src/api/client.d.ts +132 -2
- package/dist/src/api/client.d.ts.map +1 -1
- package/dist/src/api/client.js +214 -18
- package/dist/src/api/client.js.map +1 -1
- package/dist/src/api/index.d.ts +2 -0
- package/dist/src/api/index.d.ts.map +1 -1
- package/dist/src/api/index.js +7 -0
- package/dist/src/api/index.js.map +1 -1
- package/dist/src/api/types.d.ts +251 -0
- package/dist/src/api/types.d.ts.map +1 -0
- package/dist/src/api/types.js +9 -0
- package/dist/src/api/types.js.map +1 -0
- package/dist/src/benchmarks/memory/MemoryProfiler.d.ts.map +1 -1
- package/dist/src/benchmarks/memory/MemoryProfiler.js.map +1 -1
- package/dist/src/embeddings/index.d.ts.map +1 -1
- package/dist/src/embeddings/index.js.map +1 -1
- package/dist/src/errors.d.ts +1 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +1 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/index.d.ts +3 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/repositories/IndexerRepository.d.ts.map +1 -1
- package/dist/src/repositories/IndexerRepository.js +1 -0
- package/dist/src/repositories/IndexerRepository.js.map +1 -1
- package/dist/src/repositories/SkillRepository.d.ts.map +1 -1
- package/dist/src/repositories/SkillRepository.js +1 -0
- package/dist/src/repositories/SkillRepository.js.map +1 -1
- package/dist/src/repositories/quarantine/QuarantineRepository.d.ts.map +1 -1
- package/dist/src/repositories/quarantine/QuarantineRepository.js.map +1 -1
- package/dist/src/repositories/quarantine/query-builder.d.ts.map +1 -1
- package/dist/src/repositories/quarantine/query-builder.js +1 -1
- package/dist/src/repositories/quarantine/query-builder.js.map +1 -1
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js +3 -3
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
- package/dist/src/scripts/github-import/index.js.map +1 -1
- package/dist/src/scripts/import-github-skills.js +1 -1
- package/dist/src/scripts/import-github-skills.js.map +1 -1
- package/dist/src/scripts/skill-scanner/reporter.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/reporter.js.map +1 -1
- package/dist/src/scripts/skill-scanner/scanner.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/scanner.js.map +1 -1
- package/dist/src/scripts/skill-scanner/trust-scorer.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/trust-scorer.js.map +1 -1
- package/dist/src/scripts/validation/index.js +1 -2
- package/dist/src/scripts/validation/index.js.map +1 -1
- package/dist/src/scripts/validation/pipeline.d.ts.map +1 -1
- package/dist/src/scripts/validation/pipeline.js.map +1 -1
- package/dist/src/scripts/validation/types.d.ts +2 -2
- package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
- package/dist/src/services/SearchService.d.ts.map +1 -1
- package/dist/src/services/SearchService.js +1 -0
- package/dist/src/services/SearchService.js.map +1 -1
- package/dist/src/session/SessionHealthMonitor.d.ts +1 -1
- package/dist/src/session/SessionHealthMonitor.d.ts.map +1 -1
- package/dist/src/session/SessionHealthMonitor.js +1 -1
- package/dist/src/session/SessionHealthMonitor.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +1 -1
- package/dist/src/telemetry/index.d.ts.map +1 -1
- package/dist/src/telemetry/index.js +2 -2
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/posthog.d.ts +27 -5
- package/dist/src/telemetry/posthog.d.ts.map +1 -1
- package/dist/src/telemetry/posthog.js +20 -5
- package/dist/src/telemetry/posthog.js.map +1 -1
- package/dist/src/types/skill.d.ts +3 -0
- package/dist/src/types/skill.d.ts.map +1 -1
- package/dist/src/types.d.ts +2 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +2 -2
- package/dist/src/types.js.map +1 -1
- package/dist/tests/adapters-factory.test.d.ts +13 -0
- package/dist/tests/adapters-factory.test.d.ts.map +1 -0
- package/dist/tests/adapters-factory.test.js +308 -0
- package/dist/tests/adapters-factory.test.js.map +1 -0
- package/dist/tests/adapters-java.test.d.ts +13 -0
- package/dist/tests/adapters-java.test.d.ts.map +1 -0
- package/dist/tests/adapters-java.test.js +925 -0
- package/dist/tests/adapters-java.test.js.map +1 -0
- package/dist/tests/api/client.validation.test.d.ts +7 -0
- package/dist/tests/api/client.validation.test.d.ts.map +1 -0
- package/dist/tests/api/client.validation.test.js +183 -0
- package/dist/tests/api/client.validation.test.js.map +1 -0
- package/dist/tests/language-detector.test.d.ts +13 -0
- package/dist/tests/language-detector.test.d.ts.map +1 -0
- package/dist/tests/language-detector.test.js +674 -0
- package/dist/tests/language-detector.test.js.map +1 -0
- package/dist/tests/telemetry/posthog.test.d.ts +13 -0
- package/dist/tests/telemetry/posthog.test.d.ts.map +1 -0
- package/dist/tests/telemetry/posthog.test.js +600 -0
- package/dist/tests/telemetry/posthog.test.js.map +1 -0
- package/package.json +5 -6
- package/dist/src/security/RateLimiter.d.ts +0 -337
- package/dist/src/security/RateLimiter.d.ts.map +0 -1
- package/dist/src/security/RateLimiter.js +0 -782
- package/dist/src/security/RateLimiter.js.map +0 -1
- package/dist/src/security/scanner.d.ts +0 -151
- package/dist/src/security/scanner.d.ts.map +0 -1
- package/dist/src/security/scanner.js +0 -599
- package/dist/src/security/scanner.js.map +0 -1
|
@@ -0,0 +1,537 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1337: Analysis Pipeline Metrics and Telemetry
|
|
3
|
+
*
|
|
4
|
+
* Provides metrics collection for the multi-language analysis pipeline:
|
|
5
|
+
* - Files parsed per language (counter)
|
|
6
|
+
* - Parse duration by language (histogram)
|
|
7
|
+
* - Cache hit/miss rates (gauge)
|
|
8
|
+
* - Worker pool utilization (gauge)
|
|
9
|
+
* - Memory usage (gauge)
|
|
10
|
+
* - Error counts by type (counter)
|
|
11
|
+
*
|
|
12
|
+
* Configuration:
|
|
13
|
+
* - SKILLSMITH_TELEMETRY_ENABLED: Master switch for all telemetry (default: auto)
|
|
14
|
+
* - SKILLSMITH_ANALYSIS_METRICS_ENABLED: Enable/disable analysis metrics (default: true)
|
|
15
|
+
*
|
|
16
|
+
* Graceful Fallback:
|
|
17
|
+
* - If OpenTelemetry packages are not installed, uses in-memory implementations
|
|
18
|
+
* - Metrics APIs remain functional for local statistics
|
|
19
|
+
*
|
|
20
|
+
* @see docs/architecture/multi-language-analysis.md
|
|
21
|
+
* @module analysis/metrics
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* In-memory counter implementation
|
|
25
|
+
*/
|
|
26
|
+
class InMemoryCounter {
|
|
27
|
+
values = new Map();
|
|
28
|
+
add(value, labels) {
|
|
29
|
+
const key = labels ? JSON.stringify(labels) : '';
|
|
30
|
+
const current = this.values.get(key) ?? 0;
|
|
31
|
+
this.values.set(key, current + value);
|
|
32
|
+
}
|
|
33
|
+
increment(labels) {
|
|
34
|
+
this.add(1, labels);
|
|
35
|
+
}
|
|
36
|
+
getValues() {
|
|
37
|
+
return new Map(this.values);
|
|
38
|
+
}
|
|
39
|
+
getTotal() {
|
|
40
|
+
let total = 0;
|
|
41
|
+
for (const count of this.values.values()) {
|
|
42
|
+
total += count;
|
|
43
|
+
}
|
|
44
|
+
return total;
|
|
45
|
+
}
|
|
46
|
+
reset() {
|
|
47
|
+
this.values.clear();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* In-memory histogram implementation
|
|
52
|
+
*/
|
|
53
|
+
class InMemoryHistogram {
|
|
54
|
+
values = [];
|
|
55
|
+
labeledValues = new Map();
|
|
56
|
+
record(value, labels) {
|
|
57
|
+
this.values.push(value);
|
|
58
|
+
if (labels) {
|
|
59
|
+
const key = JSON.stringify(labels);
|
|
60
|
+
const arr = this.labeledValues.get(key) ?? [];
|
|
61
|
+
arr.push(value);
|
|
62
|
+
this.labeledValues.set(key, arr);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
getStats() {
|
|
66
|
+
if (this.values.length === 0) {
|
|
67
|
+
return { count: 0, sum: 0, mean: 0, p50: 0, p95: 0, p99: 0 };
|
|
68
|
+
}
|
|
69
|
+
const sorted = [...this.values].sort((a, b) => a - b);
|
|
70
|
+
const sum = sorted.reduce((acc, v) => acc + v, 0);
|
|
71
|
+
const mean = sum / sorted.length;
|
|
72
|
+
const percentile = (p) => {
|
|
73
|
+
const index = Math.ceil((p / 100) * sorted.length) - 1;
|
|
74
|
+
return sorted[Math.max(0, index)];
|
|
75
|
+
};
|
|
76
|
+
return {
|
|
77
|
+
count: sorted.length,
|
|
78
|
+
sum,
|
|
79
|
+
mean,
|
|
80
|
+
p50: percentile(50),
|
|
81
|
+
p95: percentile(95),
|
|
82
|
+
p99: percentile(99),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
getStatsByLabel(labels) {
|
|
86
|
+
const key = JSON.stringify(labels);
|
|
87
|
+
const values = this.labeledValues.get(key) ?? [];
|
|
88
|
+
if (values.length === 0) {
|
|
89
|
+
return { count: 0, sum: 0, mean: 0, p50: 0, p95: 0, p99: 0 };
|
|
90
|
+
}
|
|
91
|
+
const sorted = [...values].sort((a, b) => a - b);
|
|
92
|
+
const sum = sorted.reduce((acc, v) => acc + v, 0);
|
|
93
|
+
const mean = sum / sorted.length;
|
|
94
|
+
const percentile = (p) => {
|
|
95
|
+
const index = Math.ceil((p / 100) * sorted.length) - 1;
|
|
96
|
+
return sorted[Math.max(0, index)];
|
|
97
|
+
};
|
|
98
|
+
return {
|
|
99
|
+
count: sorted.length,
|
|
100
|
+
sum,
|
|
101
|
+
mean,
|
|
102
|
+
p50: percentile(50),
|
|
103
|
+
p95: percentile(95),
|
|
104
|
+
p99: percentile(99),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
reset() {
|
|
108
|
+
this.values = [];
|
|
109
|
+
this.labeledValues.clear();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* In-memory gauge implementation
|
|
114
|
+
*/
|
|
115
|
+
class InMemoryGauge {
|
|
116
|
+
values = new Map();
|
|
117
|
+
set(value, labels) {
|
|
118
|
+
const key = labels ? JSON.stringify(labels) : '';
|
|
119
|
+
this.values.set(key, value);
|
|
120
|
+
}
|
|
121
|
+
getValue(labels) {
|
|
122
|
+
const key = labels ? JSON.stringify(labels) : '';
|
|
123
|
+
return this.values.get(key) ?? 0;
|
|
124
|
+
}
|
|
125
|
+
getAllValues() {
|
|
126
|
+
return new Map(this.values);
|
|
127
|
+
}
|
|
128
|
+
reset() {
|
|
129
|
+
this.values.clear();
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Analysis Pipeline Metrics Collector
|
|
134
|
+
*
|
|
135
|
+
* Provides comprehensive metrics collection for the multi-language
|
|
136
|
+
* analysis pipeline with graceful fallback when telemetry is unavailable.
|
|
137
|
+
*
|
|
138
|
+
* @example
|
|
139
|
+
* ```typescript
|
|
140
|
+
* const metrics = new AnalysisMetrics()
|
|
141
|
+
*
|
|
142
|
+
* // Record file parse
|
|
143
|
+
* metrics.recordFileParsed('typescript')
|
|
144
|
+
*
|
|
145
|
+
* // Record parse duration
|
|
146
|
+
* metrics.recordParseDuration('typescript', 15.5)
|
|
147
|
+
*
|
|
148
|
+
* // Record cache operations
|
|
149
|
+
* metrics.recordCacheHit()
|
|
150
|
+
* metrics.recordCacheMiss()
|
|
151
|
+
*
|
|
152
|
+
* // Get snapshot
|
|
153
|
+
* const snapshot = metrics.getSnapshot()
|
|
154
|
+
* console.log(`Parse p95: ${snapshot.parseDuration.stats.p95}ms`)
|
|
155
|
+
* ```
|
|
156
|
+
*/
|
|
157
|
+
export class AnalysisMetrics {
|
|
158
|
+
enabled;
|
|
159
|
+
prefix;
|
|
160
|
+
// File parsing metrics
|
|
161
|
+
filesParsed;
|
|
162
|
+
parseDuration;
|
|
163
|
+
// Cache metrics
|
|
164
|
+
cacheHits;
|
|
165
|
+
cacheMisses;
|
|
166
|
+
cacheSize;
|
|
167
|
+
// Worker pool metrics
|
|
168
|
+
workerPoolActive;
|
|
169
|
+
workerPoolQueued;
|
|
170
|
+
workerPoolUtilization;
|
|
171
|
+
// Memory metrics
|
|
172
|
+
memoryHeapUsed;
|
|
173
|
+
memoryHeapTotal;
|
|
174
|
+
memoryRss;
|
|
175
|
+
// Error metrics
|
|
176
|
+
errorCount;
|
|
177
|
+
// Aggregator metrics
|
|
178
|
+
aggregatorFilesProcessed;
|
|
179
|
+
aggregatorImports;
|
|
180
|
+
aggregatorExports;
|
|
181
|
+
aggregatorFunctions;
|
|
182
|
+
constructor(config = {}) {
|
|
183
|
+
// Check master telemetry switch
|
|
184
|
+
const telemetryDisabled = process.env.SKILLSMITH_TELEMETRY_ENABLED === 'false';
|
|
185
|
+
const metricsDisabled = process.env.SKILLSMITH_ANALYSIS_METRICS_ENABLED === 'false';
|
|
186
|
+
this.enabled = config.enabled !== false && !telemetryDisabled && !metricsDisabled;
|
|
187
|
+
this.prefix = config.metricPrefix ?? 'skillsmith.analysis';
|
|
188
|
+
// Initialize all metrics
|
|
189
|
+
this.filesParsed = new InMemoryCounter();
|
|
190
|
+
this.parseDuration = new InMemoryHistogram();
|
|
191
|
+
this.cacheHits = new InMemoryCounter();
|
|
192
|
+
this.cacheMisses = new InMemoryCounter();
|
|
193
|
+
this.cacheSize = new InMemoryGauge();
|
|
194
|
+
this.workerPoolActive = new InMemoryGauge();
|
|
195
|
+
this.workerPoolQueued = new InMemoryGauge();
|
|
196
|
+
this.workerPoolUtilization = new InMemoryGauge();
|
|
197
|
+
this.memoryHeapUsed = new InMemoryGauge();
|
|
198
|
+
this.memoryHeapTotal = new InMemoryGauge();
|
|
199
|
+
this.memoryRss = new InMemoryGauge();
|
|
200
|
+
this.errorCount = new InMemoryCounter();
|
|
201
|
+
this.aggregatorFilesProcessed = new InMemoryGauge();
|
|
202
|
+
this.aggregatorImports = new InMemoryGauge();
|
|
203
|
+
this.aggregatorExports = new InMemoryGauge();
|
|
204
|
+
this.aggregatorFunctions = new InMemoryGauge();
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Check if metrics collection is enabled
|
|
208
|
+
*/
|
|
209
|
+
isEnabled() {
|
|
210
|
+
return this.enabled;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Record a file being parsed
|
|
214
|
+
*
|
|
215
|
+
* @param language - The language of the parsed file
|
|
216
|
+
*/
|
|
217
|
+
recordFileParsed(language) {
|
|
218
|
+
if (!this.enabled)
|
|
219
|
+
return;
|
|
220
|
+
this.filesParsed.increment({ language });
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Record parse duration for a file
|
|
224
|
+
*
|
|
225
|
+
* @param language - The language of the parsed file
|
|
226
|
+
* @param durationMs - Parse duration in milliseconds
|
|
227
|
+
*/
|
|
228
|
+
recordParseDuration(language, durationMs) {
|
|
229
|
+
if (!this.enabled)
|
|
230
|
+
return;
|
|
231
|
+
this.parseDuration.record(durationMs, { language });
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Record a cache hit
|
|
235
|
+
*
|
|
236
|
+
* @param language - Optional language for the cache hit
|
|
237
|
+
*/
|
|
238
|
+
recordCacheHit(language) {
|
|
239
|
+
if (!this.enabled)
|
|
240
|
+
return;
|
|
241
|
+
this.cacheHits.increment(language ? { language } : undefined);
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Record a cache miss
|
|
245
|
+
*
|
|
246
|
+
* @param language - Optional language for the cache miss
|
|
247
|
+
*/
|
|
248
|
+
recordCacheMiss(language) {
|
|
249
|
+
if (!this.enabled)
|
|
250
|
+
return;
|
|
251
|
+
this.cacheMisses.increment(language ? { language } : undefined);
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Update cache size
|
|
255
|
+
*
|
|
256
|
+
* @param size - Current cache size in bytes
|
|
257
|
+
* @param entries - Current number of cache entries
|
|
258
|
+
*/
|
|
259
|
+
updateCacheSize(size, entries) {
|
|
260
|
+
if (!this.enabled)
|
|
261
|
+
return;
|
|
262
|
+
this.cacheSize.set(size);
|
|
263
|
+
if (entries !== undefined) {
|
|
264
|
+
this.cacheSize.set(entries, { metric: 'entries' });
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Update worker pool metrics
|
|
269
|
+
*
|
|
270
|
+
* @param activeWorkers - Number of currently active workers
|
|
271
|
+
* @param queuedTasks - Number of tasks waiting in queue
|
|
272
|
+
* @param poolSize - Total pool size for utilization calculation
|
|
273
|
+
*/
|
|
274
|
+
updateWorkerPool(activeWorkers, queuedTasks, poolSize) {
|
|
275
|
+
if (!this.enabled)
|
|
276
|
+
return;
|
|
277
|
+
this.workerPoolActive.set(activeWorkers);
|
|
278
|
+
this.workerPoolQueued.set(queuedTasks);
|
|
279
|
+
if (poolSize && poolSize > 0) {
|
|
280
|
+
this.workerPoolUtilization.set(activeWorkers / poolSize);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Update memory usage metrics
|
|
285
|
+
*
|
|
286
|
+
* Records current Node.js memory usage stats.
|
|
287
|
+
*/
|
|
288
|
+
updateMemoryUsage() {
|
|
289
|
+
if (!this.enabled)
|
|
290
|
+
return;
|
|
291
|
+
const usage = process.memoryUsage();
|
|
292
|
+
this.memoryHeapUsed.set(usage.heapUsed);
|
|
293
|
+
this.memoryHeapTotal.set(usage.heapTotal);
|
|
294
|
+
this.memoryRss.set(usage.rss);
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Record an error
|
|
298
|
+
*
|
|
299
|
+
* @param errorType - Type/category of the error
|
|
300
|
+
* @param language - Optional language context
|
|
301
|
+
*/
|
|
302
|
+
recordError(errorType, language) {
|
|
303
|
+
if (!this.enabled)
|
|
304
|
+
return;
|
|
305
|
+
const labels = { errorType };
|
|
306
|
+
if (language) {
|
|
307
|
+
labels.language = language;
|
|
308
|
+
}
|
|
309
|
+
this.errorCount.increment(labels);
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Update aggregator metrics
|
|
313
|
+
*
|
|
314
|
+
* @param filesProcessed - Number of files processed
|
|
315
|
+
* @param imports - Total imports found
|
|
316
|
+
* @param exports - Total exports found
|
|
317
|
+
* @param functions - Total functions found
|
|
318
|
+
*/
|
|
319
|
+
updateAggregatorStats(filesProcessed, imports, exports, functions) {
|
|
320
|
+
if (!this.enabled)
|
|
321
|
+
return;
|
|
322
|
+
this.aggregatorFilesProcessed.set(filesProcessed);
|
|
323
|
+
this.aggregatorImports.set(imports);
|
|
324
|
+
this.aggregatorExports.set(exports);
|
|
325
|
+
this.aggregatorFunctions.set(functions);
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Get cache hit rate
|
|
329
|
+
*
|
|
330
|
+
* @returns Cache hit rate as a decimal (0-1)
|
|
331
|
+
*/
|
|
332
|
+
getCacheHitRate() {
|
|
333
|
+
const hits = this.cacheHits.getTotal();
|
|
334
|
+
const misses = this.cacheMisses.getTotal();
|
|
335
|
+
const total = hits + misses;
|
|
336
|
+
return total > 0 ? hits / total : 0;
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Get files parsed by language
|
|
340
|
+
*
|
|
341
|
+
* @returns Map of language to count
|
|
342
|
+
*/
|
|
343
|
+
getFilesByLanguage() {
|
|
344
|
+
const result = {};
|
|
345
|
+
for (const [key, count] of this.filesParsed.getValues()) {
|
|
346
|
+
if (key) {
|
|
347
|
+
try {
|
|
348
|
+
const labels = JSON.parse(key);
|
|
349
|
+
if (labels.language) {
|
|
350
|
+
result[labels.language] = count;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
catch {
|
|
354
|
+
// Invalid key format, skip
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
return result;
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Get parse duration stats by language
|
|
362
|
+
*
|
|
363
|
+
* @param language - Language to get stats for
|
|
364
|
+
* @returns Duration statistics
|
|
365
|
+
*/
|
|
366
|
+
getParseDurationByLanguage(language) {
|
|
367
|
+
return this.parseDuration.getStatsByLabel({ language });
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Get complete metrics snapshot
|
|
371
|
+
*
|
|
372
|
+
* @returns Snapshot of all current metrics
|
|
373
|
+
*/
|
|
374
|
+
getSnapshot() {
|
|
375
|
+
const hits = this.cacheHits.getTotal();
|
|
376
|
+
const misses = this.cacheMisses.getTotal();
|
|
377
|
+
const cacheTotal = hits + misses;
|
|
378
|
+
// Build by-language parse stats
|
|
379
|
+
const byLanguageStats = {};
|
|
380
|
+
const languages = [
|
|
381
|
+
'typescript',
|
|
382
|
+
'javascript',
|
|
383
|
+
'python',
|
|
384
|
+
'go',
|
|
385
|
+
'rust',
|
|
386
|
+
'java',
|
|
387
|
+
];
|
|
388
|
+
for (const lang of languages) {
|
|
389
|
+
const stats = this.getParseDurationByLanguage(lang);
|
|
390
|
+
if (stats.count > 0) {
|
|
391
|
+
byLanguageStats[lang] = stats;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
// Build error counts by type
|
|
395
|
+
const errorsByType = {};
|
|
396
|
+
for (const [key, count] of this.errorCount.getValues()) {
|
|
397
|
+
if (key) {
|
|
398
|
+
try {
|
|
399
|
+
const labels = JSON.parse(key);
|
|
400
|
+
if (labels.errorType) {
|
|
401
|
+
errorsByType[labels.errorType] = (errorsByType[labels.errorType] ?? 0) + count;
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
catch {
|
|
405
|
+
// Invalid key format, skip
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
return {
|
|
410
|
+
timestamp: new Date().toISOString(),
|
|
411
|
+
filesParsed: {
|
|
412
|
+
total: this.filesParsed.getTotal(),
|
|
413
|
+
byLanguage: this.getFilesByLanguage(),
|
|
414
|
+
},
|
|
415
|
+
parseDuration: {
|
|
416
|
+
stats: this.parseDuration.getStats(),
|
|
417
|
+
byLanguage: byLanguageStats,
|
|
418
|
+
},
|
|
419
|
+
cache: {
|
|
420
|
+
hits,
|
|
421
|
+
misses,
|
|
422
|
+
hitRate: cacheTotal > 0 ? hits / cacheTotal : 0,
|
|
423
|
+
size: this.cacheSize.getValue(),
|
|
424
|
+
},
|
|
425
|
+
workerPool: {
|
|
426
|
+
activeWorkers: this.workerPoolActive.getValue(),
|
|
427
|
+
queuedTasks: this.workerPoolQueued.getValue(),
|
|
428
|
+
utilization: this.workerPoolUtilization.getValue(),
|
|
429
|
+
},
|
|
430
|
+
memory: {
|
|
431
|
+
heapUsed: this.memoryHeapUsed.getValue(),
|
|
432
|
+
heapTotal: this.memoryHeapTotal.getValue(),
|
|
433
|
+
rss: this.memoryRss.getValue(),
|
|
434
|
+
},
|
|
435
|
+
errors: {
|
|
436
|
+
total: this.errorCount.getTotal(),
|
|
437
|
+
byType: errorsByType,
|
|
438
|
+
},
|
|
439
|
+
aggregator: {
|
|
440
|
+
filesProcessed: this.aggregatorFilesProcessed.getValue(),
|
|
441
|
+
totalImports: this.aggregatorImports.getValue(),
|
|
442
|
+
totalExports: this.aggregatorExports.getValue(),
|
|
443
|
+
totalFunctions: this.aggregatorFunctions.getValue(),
|
|
444
|
+
},
|
|
445
|
+
};
|
|
446
|
+
}
|
|
447
|
+
/**
|
|
448
|
+
* Reset all metrics
|
|
449
|
+
*/
|
|
450
|
+
reset() {
|
|
451
|
+
this.filesParsed.reset();
|
|
452
|
+
this.parseDuration.reset();
|
|
453
|
+
this.cacheHits.reset();
|
|
454
|
+
this.cacheMisses.reset();
|
|
455
|
+
this.cacheSize.reset();
|
|
456
|
+
this.workerPoolActive.reset();
|
|
457
|
+
this.workerPoolQueued.reset();
|
|
458
|
+
this.workerPoolUtilization.reset();
|
|
459
|
+
this.memoryHeapUsed.reset();
|
|
460
|
+
this.memoryHeapTotal.reset();
|
|
461
|
+
this.memoryRss.reset();
|
|
462
|
+
this.errorCount.reset();
|
|
463
|
+
this.aggregatorFilesProcessed.reset();
|
|
464
|
+
this.aggregatorImports.reset();
|
|
465
|
+
this.aggregatorExports.reset();
|
|
466
|
+
this.aggregatorFunctions.reset();
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
// Default metrics instance
|
|
470
|
+
let defaultAnalysisMetrics = null;
|
|
471
|
+
/**
|
|
472
|
+
* Get the default analysis metrics instance
|
|
473
|
+
*
|
|
474
|
+
* @returns The shared AnalysisMetrics instance
|
|
475
|
+
*/
|
|
476
|
+
export function getAnalysisMetrics() {
|
|
477
|
+
if (!defaultAnalysisMetrics) {
|
|
478
|
+
defaultAnalysisMetrics = new AnalysisMetrics();
|
|
479
|
+
}
|
|
480
|
+
return defaultAnalysisMetrics;
|
|
481
|
+
}
|
|
482
|
+
/**
|
|
483
|
+
* Initialize the default analysis metrics instance
|
|
484
|
+
*
|
|
485
|
+
* @param config - Optional configuration
|
|
486
|
+
* @returns The initialized AnalysisMetrics instance
|
|
487
|
+
*/
|
|
488
|
+
export function initializeAnalysisMetrics(config) {
|
|
489
|
+
if (defaultAnalysisMetrics) {
|
|
490
|
+
defaultAnalysisMetrics.reset();
|
|
491
|
+
}
|
|
492
|
+
defaultAnalysisMetrics = new AnalysisMetrics(config);
|
|
493
|
+
return defaultAnalysisMetrics;
|
|
494
|
+
}
|
|
495
|
+
/**
|
|
496
|
+
* Helper: Time an async operation and record to analysis metrics
|
|
497
|
+
*
|
|
498
|
+
* @param language - Language being parsed
|
|
499
|
+
* @param fn - Async function to time
|
|
500
|
+
* @param metrics - Optional metrics instance (uses default if not provided)
|
|
501
|
+
* @returns Result of the function
|
|
502
|
+
*/
|
|
503
|
+
export async function timeParseAsync(language, fn, metrics) {
|
|
504
|
+
const m = metrics ?? getAnalysisMetrics();
|
|
505
|
+
const start = performance.now();
|
|
506
|
+
try {
|
|
507
|
+
const result = await fn();
|
|
508
|
+
m.recordFileParsed(language);
|
|
509
|
+
return result;
|
|
510
|
+
}
|
|
511
|
+
finally {
|
|
512
|
+
const duration = performance.now() - start;
|
|
513
|
+
m.recordParseDuration(language, duration);
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
/**
|
|
517
|
+
* Helper: Time a sync operation and record to analysis metrics
|
|
518
|
+
*
|
|
519
|
+
* @param language - Language being parsed
|
|
520
|
+
* @param fn - Function to time
|
|
521
|
+
* @param metrics - Optional metrics instance (uses default if not provided)
|
|
522
|
+
* @returns Result of the function
|
|
523
|
+
*/
|
|
524
|
+
export function timeParseSync(language, fn, metrics) {
|
|
525
|
+
const m = metrics ?? getAnalysisMetrics();
|
|
526
|
+
const start = performance.now();
|
|
527
|
+
try {
|
|
528
|
+
const result = fn();
|
|
529
|
+
m.recordFileParsed(language);
|
|
530
|
+
return result;
|
|
531
|
+
}
|
|
532
|
+
finally {
|
|
533
|
+
const duration = performance.now() - start;
|
|
534
|
+
m.recordParseDuration(language, duration);
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../../src/analysis/metrics.ts"],"names":[],"mappings":"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"}
|