observability-toolkit 1.8.4 → 1.8.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/backends/local-jsonl-boolean-search.test.js +8 -8
- package/dist/backends/local-jsonl-boolean-search.test.js.map +1 -1
- package/dist/backends/local-jsonl-cache.test.d.ts +2 -0
- package/dist/backends/local-jsonl-cache.test.d.ts.map +1 -0
- package/dist/backends/local-jsonl-cache.test.js +295 -0
- package/dist/backends/local-jsonl-cache.test.js.map +1 -0
- package/dist/backends/local-jsonl-circuit-breaker.test.d.ts +2 -0
- package/dist/backends/local-jsonl-circuit-breaker.test.d.ts.map +1 -0
- package/dist/backends/local-jsonl-circuit-breaker.test.js +180 -0
- package/dist/backends/local-jsonl-circuit-breaker.test.js.map +1 -0
- package/dist/backends/local-jsonl-export.test.d.ts +2 -0
- package/dist/backends/local-jsonl-export.test.d.ts.map +1 -0
- package/dist/backends/local-jsonl-export.test.js +704 -0
- package/dist/backends/local-jsonl-export.test.js.map +1 -0
- package/dist/backends/local-jsonl-index.test.d.ts +2 -0
- package/dist/backends/local-jsonl-index.test.d.ts.map +1 -0
- package/dist/backends/local-jsonl-index.test.js +554 -0
- package/dist/backends/local-jsonl-index.test.js.map +1 -0
- package/dist/backends/local-jsonl-logs.test.js +52 -43
- package/dist/backends/local-jsonl-logs.test.js.map +1 -1
- package/dist/backends/local-jsonl-metrics.test.d.ts +2 -0
- package/dist/backends/local-jsonl-metrics.test.d.ts.map +1 -0
- package/dist/backends/local-jsonl-metrics.test.js +876 -0
- package/dist/backends/local-jsonl-metrics.test.js.map +1 -0
- package/dist/backends/local-jsonl-traces.test.js +89 -83
- package/dist/backends/local-jsonl-traces.test.js.map +1 -1
- package/dist/backends/local-jsonl.d.ts +9 -0
- package/dist/backends/local-jsonl.d.ts.map +1 -1
- package/dist/backends/local-jsonl.js +348 -227
- package/dist/backends/local-jsonl.js.map +1 -1
- package/dist/backends/signoz-api-circuit-breaker.test.d.ts +6 -0
- package/dist/backends/signoz-api-circuit-breaker.test.d.ts.map +1 -0
- package/dist/backends/signoz-api-circuit-breaker.test.js +548 -0
- package/dist/backends/signoz-api-circuit-breaker.test.js.map +1 -0
- package/dist/backends/signoz-api-rate-limiter.test.d.ts +6 -0
- package/dist/backends/signoz-api-rate-limiter.test.d.ts.map +1 -0
- package/dist/backends/signoz-api-rate-limiter.test.js +389 -0
- package/dist/backends/signoz-api-rate-limiter.test.js.map +1 -0
- package/dist/backends/signoz-api-ssrf.test.d.ts +6 -0
- package/dist/backends/signoz-api-ssrf.test.d.ts.map +1 -0
- package/dist/backends/signoz-api-ssrf.test.js +216 -0
- package/dist/backends/signoz-api-ssrf.test.js.map +1 -0
- package/dist/backends/signoz-api-test-helpers.d.ts +80 -0
- package/dist/backends/signoz-api-test-helpers.d.ts.map +1 -0
- package/dist/backends/signoz-api-test-helpers.js +79 -0
- package/dist/backends/signoz-api-test-helpers.js.map +1 -0
- package/dist/backends/signoz-api.d.ts +16 -0
- package/dist/backends/signoz-api.d.ts.map +1 -1
- package/dist/backends/signoz-api.js +71 -9
- package/dist/backends/signoz-api.js.map +1 -1
- package/dist/backends/signoz-api.test.d.ts +9 -0
- package/dist/backends/signoz-api.test.d.ts.map +1 -1
- package/dist/backends/signoz-api.test.js +14 -1027
- package/dist/backends/signoz-api.test.js.map +1 -1
- package/dist/lib/cache.d.ts +47 -1
- package/dist/lib/cache.d.ts.map +1 -1
- package/dist/lib/cache.js +40 -3
- package/dist/lib/cache.js.map +1 -1
- package/dist/lib/circuit-breaker.d.ts +83 -0
- package/dist/lib/circuit-breaker.d.ts.map +1 -0
- package/dist/lib/circuit-breaker.js +125 -0
- package/dist/lib/circuit-breaker.js.map +1 -0
- package/dist/lib/circuit-breaker.test.d.ts +2 -0
- package/dist/lib/circuit-breaker.test.d.ts.map +1 -0
- package/dist/lib/circuit-breaker.test.js +263 -0
- package/dist/lib/circuit-breaker.test.js.map +1 -0
- package/dist/lib/constants-symlink.test.d.ts +12 -0
- package/dist/lib/constants-symlink.test.d.ts.map +1 -0
- package/dist/lib/constants-symlink.test.js +357 -0
- package/dist/lib/constants-symlink.test.js.map +1 -0
- package/dist/lib/edge-cases.test.js +17 -17
- package/dist/lib/edge-cases.test.js.map +1 -1
- package/dist/lib/error-sanitizer.d.ts.map +1 -1
- package/dist/lib/error-sanitizer.js +29 -3
- package/dist/lib/error-sanitizer.js.map +1 -1
- package/dist/lib/error-sanitizer.test.js +159 -0
- package/dist/lib/error-sanitizer.test.js.map +1 -1
- package/dist/lib/error-types.d.ts +54 -0
- package/dist/lib/error-types.d.ts.map +1 -0
- package/dist/lib/error-types.js +154 -0
- package/dist/lib/error-types.js.map +1 -0
- package/dist/lib/error-types.test.d.ts +2 -0
- package/dist/lib/error-types.test.d.ts.map +1 -0
- package/dist/lib/error-types.test.js +196 -0
- package/dist/lib/error-types.test.js.map +1 -0
- package/dist/lib/indexer.test.js +27 -27
- package/dist/lib/indexer.test.js.map +1 -1
- package/dist/lib/input-validator.d.ts +12 -0
- package/dist/lib/input-validator.d.ts.map +1 -1
- package/dist/lib/input-validator.fuzz.test.d.ts +12 -0
- package/dist/lib/input-validator.fuzz.test.d.ts.map +1 -0
- package/dist/lib/input-validator.fuzz.test.js +290 -0
- package/dist/lib/input-validator.fuzz.test.js.map +1 -0
- package/dist/lib/input-validator.js +57 -3
- package/dist/lib/input-validator.js.map +1 -1
- package/dist/lib/input-validator.test.js +129 -1
- package/dist/lib/input-validator.test.js.map +1 -1
- package/dist/lib/logger.d.ts +46 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +81 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/logger.test.d.ts +2 -0
- package/dist/lib/logger.test.d.ts.map +1 -0
- package/dist/lib/logger.test.js +122 -0
- package/dist/lib/logger.test.js.map +1 -0
- package/dist/lib/server-utils.d.ts +8 -0
- package/dist/lib/server-utils.d.ts.map +1 -1
- package/dist/lib/server-utils.js +34 -2
- package/dist/lib/server-utils.js.map +1 -1
- package/dist/lib/shared-schemas.d.ts +22 -0
- package/dist/lib/shared-schemas.d.ts.map +1 -1
- package/dist/lib/shared-schemas.js +22 -0
- package/dist/lib/shared-schemas.js.map +1 -1
- package/dist/lib/toon-encoder.d.ts +7 -2
- package/dist/lib/toon-encoder.d.ts.map +1 -1
- package/dist/lib/toon-encoder.js +21 -6
- package/dist/lib/toon-encoder.js.map +1 -1
- package/dist/lib/toon-encoder.test.d.ts +5 -0
- package/dist/lib/toon-encoder.test.d.ts.map +1 -0
- package/dist/lib/toon-encoder.test.js +85 -0
- package/dist/lib/toon-encoder.test.js.map +1 -0
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -1
- package/dist/server.test.js +30 -0
- package/dist/server.test.js.map +1 -1
- package/dist/test-helpers/env-utils.d.ts +22 -0
- package/dist/test-helpers/env-utils.d.ts.map +1 -1
- package/dist/test-helpers/env-utils.js +38 -0
- package/dist/test-helpers/env-utils.js.map +1 -1
- package/dist/test-helpers/fuzz-generators.d.ts +58 -0
- package/dist/test-helpers/fuzz-generators.d.ts.map +1 -0
- package/dist/test-helpers/fuzz-generators.js +216 -0
- package/dist/test-helpers/fuzz-generators.js.map +1 -0
- package/dist/test-helpers/index.d.ts +1 -0
- package/dist/test-helpers/index.d.ts.map +1 -1
- package/dist/test-helpers/index.js +2 -0
- package/dist/test-helpers/index.js.map +1 -1
- package/dist/test-helpers/memfs-utils.d.ts +181 -0
- package/dist/test-helpers/memfs-utils.d.ts.map +1 -0
- package/dist/test-helpers/memfs-utils.js +292 -0
- package/dist/test-helpers/memfs-utils.js.map +1 -0
- package/dist/test-helpers/memfs-utils.test.d.ts +5 -0
- package/dist/test-helpers/memfs-utils.test.d.ts.map +1 -0
- package/dist/test-helpers/memfs-utils.test.js +338 -0
- package/dist/test-helpers/memfs-utils.test.js.map +1 -0
- package/dist/test-helpers/race-condition-helpers.d.ts +85 -0
- package/dist/test-helpers/race-condition-helpers.d.ts.map +1 -0
- package/dist/test-helpers/race-condition-helpers.js +279 -0
- package/dist/test-helpers/race-condition-helpers.js.map +1 -0
- package/dist/test-helpers/test-data-builders.d.ts +40 -3
- package/dist/test-helpers/test-data-builders.d.ts.map +1 -1
- package/dist/test-helpers/test-data-builders.js +54 -5
- package/dist/test-helpers/test-data-builders.js.map +1 -1
- package/dist/test-helpers/tool-validators.d.ts.map +1 -1
- package/dist/test-helpers/tool-validators.js +16 -1
- package/dist/test-helpers/tool-validators.js.map +1 -1
- package/dist/tools/query-evaluations.d.ts.map +1 -1
- package/dist/tools/query-evaluations.js +16 -2
- package/dist/tools/query-evaluations.js.map +1 -1
- package/dist/tools/query-evaluations.test.js +53 -46
- package/dist/tools/query-evaluations.test.js.map +1 -1
- package/dist/tools/query-llm-events.test.js +6 -3
- package/dist/tools/query-llm-events.test.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-jsonl-export.test.js","sourceRoot":"","sources":["../../src/backends/local-jsonl-export.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-jsonl-index.test.d.ts","sourceRoot":"","sources":["../../src/backends/local-jsonl-index.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,554 @@
|
|
|
1
|
+
import { describe, it, before, after, beforeEach } from 'node:test';
|
|
2
|
+
import * as assert from 'node:assert';
|
|
3
|
+
import * as fs from 'fs';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import { LocalJsonlBackend, MultiDirectoryBackend } from './local-jsonl.js';
|
|
6
|
+
import { createTempDir, removeTempDir, getSharedTempDir, clearTempDir, removeSharedTempDir, writeJsonlFileAsync, getTestDate } from '../test-helpers/file-utils.js';
|
|
7
|
+
describe('LocalJsonlBackend', () => {
|
|
8
|
+
let tempDir;
|
|
9
|
+
let backend;
|
|
10
|
+
before(() => {
|
|
11
|
+
tempDir = getSharedTempDir('LocalJsonlBackend-Index');
|
|
12
|
+
});
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
clearTempDir(tempDir);
|
|
15
|
+
backend = new LocalJsonlBackend(tempDir);
|
|
16
|
+
});
|
|
17
|
+
after(() => {
|
|
18
|
+
removeSharedTempDir('LocalJsonlBackend-Index');
|
|
19
|
+
});
|
|
20
|
+
describe('healthCheck', () => {
|
|
21
|
+
it('should return error when telemetry directory does not exist', async () => {
|
|
22
|
+
const nonExistentBackend = new LocalJsonlBackend('/nonexistent/telemetry');
|
|
23
|
+
const result = await nonExistentBackend.healthCheck();
|
|
24
|
+
assert.strictEqual(result.status, 'error');
|
|
25
|
+
assert.match(result.message || '', /not found/);
|
|
26
|
+
});
|
|
27
|
+
it('should return ok when directory exists with no files', async () => {
|
|
28
|
+
// tempDir exists but has no files
|
|
29
|
+
const result = await backend.healthCheck();
|
|
30
|
+
assert.strictEqual(result.status, 'ok');
|
|
31
|
+
assert.match(result.message || '', /No telemetry files/);
|
|
32
|
+
});
|
|
33
|
+
it('should return ok with found files message', async () => {
|
|
34
|
+
const today = getTestDate();
|
|
35
|
+
// Create both traces and logs files
|
|
36
|
+
await writeJsonlFileAsync(path.join(tempDir, `traces-${today}.jsonl`), []);
|
|
37
|
+
await writeJsonlFileAsync(path.join(tempDir, `logs-${today}.jsonl`), []);
|
|
38
|
+
const result = await backend.healthCheck();
|
|
39
|
+
assert.strictEqual(result.status, 'ok');
|
|
40
|
+
assert.match(result.message || '', /traces.*logs/);
|
|
41
|
+
});
|
|
42
|
+
it('should include llm-events in health check message', async () => {
|
|
43
|
+
const today = getTestDate();
|
|
44
|
+
// Create all three file types
|
|
45
|
+
await writeJsonlFileAsync(path.join(tempDir, `traces-${today}.jsonl`), []);
|
|
46
|
+
await writeJsonlFileAsync(path.join(tempDir, `logs-${today}.jsonl`), []);
|
|
47
|
+
await writeJsonlFileAsync(path.join(tempDir, `llm-events-${today}.jsonl`), []);
|
|
48
|
+
const result = await backend.healthCheck();
|
|
49
|
+
assert.strictEqual(result.status, 'ok');
|
|
50
|
+
assert.match(result.message || '', /llm-events/);
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
describe('date range filtering', () => {
|
|
54
|
+
it('should filter files by startDate and endDate', async () => {
|
|
55
|
+
// Create files for multiple dates
|
|
56
|
+
await writeJsonlFileAsync(path.join(tempDir, 'traces-2026-01-26.jsonl'), [
|
|
57
|
+
{ traceId: 'trace-26', spanId: 'span1', name: 'op1', startTime: [1700000000, 0] },
|
|
58
|
+
]);
|
|
59
|
+
await writeJsonlFileAsync(path.join(tempDir, 'traces-2026-01-27.jsonl'), [
|
|
60
|
+
{ traceId: 'trace-27', spanId: 'span1', name: 'op1', startTime: [1700000000, 0] },
|
|
61
|
+
]);
|
|
62
|
+
await writeJsonlFileAsync(path.join(tempDir, 'traces-2026-01-28.jsonl'), [
|
|
63
|
+
{ traceId: 'trace-28', spanId: 'span1', name: 'op1', startTime: [1700000000, 0] },
|
|
64
|
+
]);
|
|
65
|
+
await writeJsonlFileAsync(path.join(tempDir, 'traces-2026-01-29.jsonl'), [
|
|
66
|
+
{ traceId: 'trace-29', spanId: 'span1', name: 'op1', startTime: [1700000000, 0] },
|
|
67
|
+
]);
|
|
68
|
+
const results = await backend.queryTraces({ startDate: '2026-01-27', endDate: '2026-01-28' });
|
|
69
|
+
assert.strictEqual(results.length, 2);
|
|
70
|
+
const traceIds = results.map(r => r.traceId);
|
|
71
|
+
assert.ok(traceIds.includes('trace-27'));
|
|
72
|
+
assert.ok(traceIds.includes('trace-28'));
|
|
73
|
+
assert.ok(!traceIds.includes('trace-26'));
|
|
74
|
+
assert.ok(!traceIds.includes('trace-29'));
|
|
75
|
+
});
|
|
76
|
+
it('should use today as default when no date range specified', async () => {
|
|
77
|
+
const today = getTestDate();
|
|
78
|
+
const yesterday = new Date(Date.now() - 86400000).toISOString().split('T')[0];
|
|
79
|
+
// Create file for today and yesterday
|
|
80
|
+
await writeJsonlFileAsync(path.join(tempDir, `traces-${today}.jsonl`), [
|
|
81
|
+
{ traceId: 'today-trace', spanId: 'span1', name: 'op1', startTime: [1700000000, 0] },
|
|
82
|
+
]);
|
|
83
|
+
await writeJsonlFileAsync(path.join(tempDir, `traces-${yesterday}.jsonl`), [
|
|
84
|
+
{ traceId: 'yesterday-trace', spanId: 'span1', name: 'op1', startTime: [1700000000, 0] },
|
|
85
|
+
]);
|
|
86
|
+
// Query with no date range should only get today's data
|
|
87
|
+
const results = await backend.queryTraces({});
|
|
88
|
+
assert.strictEqual(results.length, 1);
|
|
89
|
+
assert.strictEqual(results[0].traceId, 'today-trace');
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
describe('error handling', () => {
|
|
93
|
+
it('should handle JSONL parsing errors gracefully', async () => {
|
|
94
|
+
const today = getTestDate();
|
|
95
|
+
const filePath = path.join(tempDir, `traces-${today}.jsonl`);
|
|
96
|
+
// Write malformed JSON
|
|
97
|
+
fs.writeFileSync(filePath, 'not valid json\n{"traceId":"t1","spanId":"s1","name":"op"}\n', 'utf-8');
|
|
98
|
+
const results = await backend.queryTraces({});
|
|
99
|
+
// Should skip the malformed line and parse the valid one
|
|
100
|
+
assert.strictEqual(results.length, 1);
|
|
101
|
+
assert.strictEqual(results[0].traceId, 't1');
|
|
102
|
+
});
|
|
103
|
+
it('should skip spans with invalid time calculations', async () => {
|
|
104
|
+
const today = getTestDate();
|
|
105
|
+
const mockSpans = [
|
|
106
|
+
{
|
|
107
|
+
traceId: 'trace1',
|
|
108
|
+
spanId: 'span1',
|
|
109
|
+
name: 'op1',
|
|
110
|
+
startTime: [1700000000, 0],
|
|
111
|
+
endTime: [1700000000, 0],
|
|
112
|
+
},
|
|
113
|
+
];
|
|
114
|
+
await writeJsonlFileAsync(path.join(tempDir, `traces-${today}.jsonl`), mockSpans);
|
|
115
|
+
const results = await backend.queryTraces({});
|
|
116
|
+
assert.strictEqual(results.length, 1);
|
|
117
|
+
assert.strictEqual(results[0].durationMs, 0);
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
describe('insertSortedBounded helper', () => {
|
|
122
|
+
// Test the insertSortedBounded function by observing its behavior
|
|
123
|
+
// through MultiDirectoryBackend's query methods
|
|
124
|
+
it('should maintain sorted order by timestamp in traces', async () => {
|
|
125
|
+
const projectDir = createTempDir();
|
|
126
|
+
try {
|
|
127
|
+
const today = getTestDate();
|
|
128
|
+
const localTelemetry = path.join(projectDir, 'telemetry');
|
|
129
|
+
fs.mkdirSync(localTelemetry, { recursive: true });
|
|
130
|
+
// Create traces with various timestamps
|
|
131
|
+
await writeJsonlFileAsync(path.join(localTelemetry, `traces-${today}.jsonl`), [
|
|
132
|
+
{ traceId: 'sorted-test-1', spanId: 's1', name: 'SortedTestOp', startTime: [1700000005, 0] },
|
|
133
|
+
{ traceId: 'sorted-test-2', spanId: 's2', name: 'SortedTestOp', startTime: [1700000001, 0] },
|
|
134
|
+
{ traceId: 'sorted-test-3', spanId: 's3', name: 'SortedTestOp', startTime: [1700000009, 0] },
|
|
135
|
+
{ traceId: 'sorted-test-4', spanId: 's4', name: 'SortedTestOp', startTime: [1700000003, 0] },
|
|
136
|
+
{ traceId: 'sorted-test-5', spanId: 's5', name: 'SortedTestOp', startTime: [1700000007, 0] },
|
|
137
|
+
]);
|
|
138
|
+
const backend = new MultiDirectoryBackend(projectDir);
|
|
139
|
+
const results = await backend.queryTraces({ spanName: 'SortedTestOp' });
|
|
140
|
+
// Should be sorted by timestamp descending (most recent first)
|
|
141
|
+
assert.strictEqual(results.length, 5);
|
|
142
|
+
assert.strictEqual(results[0].traceId, 'sorted-test-3'); // 1700000009
|
|
143
|
+
assert.strictEqual(results[1].traceId, 'sorted-test-5'); // 1700000007
|
|
144
|
+
assert.strictEqual(results[2].traceId, 'sorted-test-1'); // 1700000005
|
|
145
|
+
assert.strictEqual(results[3].traceId, 'sorted-test-4'); // 1700000003
|
|
146
|
+
assert.strictEqual(results[4].traceId, 'sorted-test-2'); // 1700000001
|
|
147
|
+
}
|
|
148
|
+
finally {
|
|
149
|
+
removeTempDir(projectDir);
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
it('should limit results to maxSize efficiently', async () => {
|
|
153
|
+
const projectDir = createTempDir();
|
|
154
|
+
try {
|
|
155
|
+
const today = getTestDate();
|
|
156
|
+
const localTelemetry = path.join(projectDir, 'telemetry');
|
|
157
|
+
fs.mkdirSync(localTelemetry, { recursive: true });
|
|
158
|
+
// Create 20 traces
|
|
159
|
+
await writeJsonlFileAsync(path.join(localTelemetry, `traces-${today}.jsonl`), Array.from({ length: 20 }, (_, i) => ({
|
|
160
|
+
traceId: `bounded-test-${i}`,
|
|
161
|
+
spanId: `s${i}`,
|
|
162
|
+
name: 'BoundedTestOp',
|
|
163
|
+
startTime: [1700000000 + i, 0],
|
|
164
|
+
})));
|
|
165
|
+
const backend = new MultiDirectoryBackend(projectDir);
|
|
166
|
+
const results = await backend.queryTraces({ spanName: 'BoundedTestOp', limit: 5 });
|
|
167
|
+
// Should return only 5 results
|
|
168
|
+
assert.strictEqual(results.length, 5);
|
|
169
|
+
// Results should be sorted by timestamp descending
|
|
170
|
+
// LocalJsonlBackend returns first 5 found (0-4), then sorted
|
|
171
|
+
assert.strictEqual(results[0].traceId, 'bounded-test-4'); // highest of 0-4
|
|
172
|
+
assert.strictEqual(results[4].traceId, 'bounded-test-0'); // lowest of 0-4
|
|
173
|
+
}
|
|
174
|
+
finally {
|
|
175
|
+
removeTempDir(projectDir);
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
it('should maintain sorted order in logs', async () => {
|
|
179
|
+
const projectDir = createTempDir();
|
|
180
|
+
try {
|
|
181
|
+
const today = getTestDate();
|
|
182
|
+
const localTelemetry = path.join(projectDir, 'telemetry');
|
|
183
|
+
fs.mkdirSync(localTelemetry, { recursive: true });
|
|
184
|
+
await writeJsonlFileAsync(path.join(localTelemetry, `logs-${today}.jsonl`), [
|
|
185
|
+
{ timestamp: `${today}T10:00:00Z`, body: 'SortedLogTest_A' },
|
|
186
|
+
{ timestamp: `${today}T12:00:00Z`, body: 'SortedLogTest_B' },
|
|
187
|
+
{ timestamp: `${today}T08:00:00Z`, body: 'SortedLogTest_C' },
|
|
188
|
+
{ timestamp: `${today}T14:00:00Z`, body: 'SortedLogTest_D' },
|
|
189
|
+
]);
|
|
190
|
+
const backend = new MultiDirectoryBackend(projectDir);
|
|
191
|
+
const results = await backend.queryLogs({ search: 'SortedLogTest' });
|
|
192
|
+
// Should be sorted by timestamp descending
|
|
193
|
+
assert.strictEqual(results.length, 4);
|
|
194
|
+
assert.strictEqual(results[0].body, 'SortedLogTest_D'); // 14:00
|
|
195
|
+
assert.strictEqual(results[1].body, 'SortedLogTest_B'); // 12:00
|
|
196
|
+
assert.strictEqual(results[2].body, 'SortedLogTest_A'); // 10:00
|
|
197
|
+
assert.strictEqual(results[3].body, 'SortedLogTest_C'); // 08:00
|
|
198
|
+
}
|
|
199
|
+
finally {
|
|
200
|
+
removeTempDir(projectDir);
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
it('should maintain sorted order in LLM events', async () => {
|
|
204
|
+
const projectDir = createTempDir();
|
|
205
|
+
try {
|
|
206
|
+
const today = getTestDate();
|
|
207
|
+
const localTelemetry = path.join(projectDir, 'telemetry');
|
|
208
|
+
fs.mkdirSync(localTelemetry, { recursive: true });
|
|
209
|
+
await writeJsonlFileAsync(path.join(localTelemetry, `llm-events-${today}.jsonl`), [
|
|
210
|
+
{ timestamp: `${today}T09:00:00Z`, name: 'SortedLLMTest.A', attributes: {} },
|
|
211
|
+
{ timestamp: `${today}T15:00:00Z`, name: 'SortedLLMTest.B', attributes: {} },
|
|
212
|
+
{ timestamp: `${today}T11:00:00Z`, name: 'SortedLLMTest.C', attributes: {} },
|
|
213
|
+
]);
|
|
214
|
+
const backend = new MultiDirectoryBackend(projectDir);
|
|
215
|
+
const results = await backend.queryLLMEvents({ eventName: 'SortedLLMTest' });
|
|
216
|
+
// Should be sorted by timestamp descending
|
|
217
|
+
assert.strictEqual(results.length, 3);
|
|
218
|
+
assert.strictEqual(results[0].name, 'SortedLLMTest.B'); // 15:00
|
|
219
|
+
assert.strictEqual(results[1].name, 'SortedLLMTest.C'); // 11:00
|
|
220
|
+
assert.strictEqual(results[2].name, 'SortedLLMTest.A'); // 09:00
|
|
221
|
+
}
|
|
222
|
+
finally {
|
|
223
|
+
removeTempDir(projectDir);
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
describe('streaming JSONL optimization', () => {
|
|
228
|
+
it('should handle large files with streaming', async () => {
|
|
229
|
+
const tempDir = createTempDir();
|
|
230
|
+
try {
|
|
231
|
+
const today = getTestDate();
|
|
232
|
+
// Create a file with many records
|
|
233
|
+
const spans = Array.from({ length: 500 }, (_, i) => ({
|
|
234
|
+
traceId: `stream-test-${i}`,
|
|
235
|
+
spanId: `span-${i}`,
|
|
236
|
+
name: 'StreamTestOp',
|
|
237
|
+
startTime: [1700000000 + i, 0],
|
|
238
|
+
}));
|
|
239
|
+
await writeJsonlFileAsync(path.join(tempDir, `traces-${today}.jsonl`), spans);
|
|
240
|
+
const backend = new LocalJsonlBackend(tempDir);
|
|
241
|
+
const results = await backend.queryTraces({ spanName: 'StreamTestOp', limit: 50 });
|
|
242
|
+
// Should return limited results without loading all into memory
|
|
243
|
+
assert.strictEqual(results.length, 50);
|
|
244
|
+
}
|
|
245
|
+
finally {
|
|
246
|
+
removeTempDir(tempDir);
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
it('should terminate early when limit is reached', async () => {
|
|
250
|
+
const tempDir = createTempDir();
|
|
251
|
+
try {
|
|
252
|
+
const today = getTestDate();
|
|
253
|
+
// Create file with many records
|
|
254
|
+
const logs = Array.from({ length: 1000 }, (_, i) => ({
|
|
255
|
+
timestamp: new Date(Date.now() - i * 1000).toISOString(),
|
|
256
|
+
body: `StreamingLog_${i}`,
|
|
257
|
+
severity: 'INFO',
|
|
258
|
+
}));
|
|
259
|
+
await writeJsonlFileAsync(path.join(tempDir, `logs-${today}.jsonl`), logs);
|
|
260
|
+
const backend = new LocalJsonlBackend(tempDir);
|
|
261
|
+
const start = Date.now();
|
|
262
|
+
const results = await backend.queryLogs({ search: 'StreamingLog', limit: 10 });
|
|
263
|
+
const elapsed = Date.now() - start;
|
|
264
|
+
// Should return quickly with early termination
|
|
265
|
+
assert.strictEqual(results.length, 10);
|
|
266
|
+
// Processing should be fast due to early termination
|
|
267
|
+
assert.ok(elapsed < 1000, `Query took too long: ${elapsed}ms`);
|
|
268
|
+
}
|
|
269
|
+
finally {
|
|
270
|
+
removeTempDir(tempDir);
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
describe('MultiDirectoryBackend', () => {
|
|
275
|
+
let projectDir;
|
|
276
|
+
before(() => {
|
|
277
|
+
projectDir = getSharedTempDir('MultiDirectoryBackend');
|
|
278
|
+
});
|
|
279
|
+
beforeEach(() => {
|
|
280
|
+
// Clear project directory for each test
|
|
281
|
+
clearTempDir(projectDir);
|
|
282
|
+
});
|
|
283
|
+
after(() => {
|
|
284
|
+
removeSharedTempDir('MultiDirectoryBackend');
|
|
285
|
+
});
|
|
286
|
+
describe('constructor and getDirectories', () => {
|
|
287
|
+
it('should return directories when local telemetry dirs exist', () => {
|
|
288
|
+
// Create local telemetry directory
|
|
289
|
+
const localTelemetry = path.join(projectDir, 'telemetry');
|
|
290
|
+
fs.mkdirSync(localTelemetry, { recursive: true });
|
|
291
|
+
const backend = new MultiDirectoryBackend(projectDir);
|
|
292
|
+
const dirs = backend.getDirectories();
|
|
293
|
+
assert.ok(Array.isArray(dirs));
|
|
294
|
+
// Should include the local telemetry directory (resolved path due to symlink protection)
|
|
295
|
+
const resolvedPath = fs.realpathSync(localTelemetry);
|
|
296
|
+
const localDir = dirs.find(d => d.source === 'local' && d.path === resolvedPath);
|
|
297
|
+
assert.ok(localDir);
|
|
298
|
+
});
|
|
299
|
+
it('should have name property set to multi-directory', () => {
|
|
300
|
+
const backend = new MultiDirectoryBackend(projectDir);
|
|
301
|
+
assert.strictEqual(backend.name, 'multi-directory');
|
|
302
|
+
});
|
|
303
|
+
it('should detect .telemetry local directory', () => {
|
|
304
|
+
const localTelemetry = path.join(projectDir, '.telemetry');
|
|
305
|
+
fs.mkdirSync(localTelemetry, { recursive: true });
|
|
306
|
+
const backend = new MultiDirectoryBackend(projectDir);
|
|
307
|
+
const dirs = backend.getDirectories();
|
|
308
|
+
// Compare against resolved path (due to symlink protection)
|
|
309
|
+
const resolvedPath = fs.realpathSync(localTelemetry);
|
|
310
|
+
const localDir = dirs.find(d => d.path === resolvedPath);
|
|
311
|
+
assert.ok(localDir);
|
|
312
|
+
assert.strictEqual(localDir?.source, 'local');
|
|
313
|
+
});
|
|
314
|
+
it('should detect .claude/telemetry local directory', () => {
|
|
315
|
+
const localTelemetry = path.join(projectDir, '.claude', 'telemetry');
|
|
316
|
+
fs.mkdirSync(localTelemetry, { recursive: true });
|
|
317
|
+
const backend = new MultiDirectoryBackend(projectDir);
|
|
318
|
+
const dirs = backend.getDirectories();
|
|
319
|
+
// Compare against resolved path (due to symlink protection)
|
|
320
|
+
const resolvedPath = fs.realpathSync(localTelemetry);
|
|
321
|
+
const localDir = dirs.find(d => d.path === resolvedPath);
|
|
322
|
+
assert.ok(localDir);
|
|
323
|
+
assert.strictEqual(localDir?.source, 'local');
|
|
324
|
+
});
|
|
325
|
+
});
|
|
326
|
+
describe('queryTraces', () => {
|
|
327
|
+
it('should query traces from local telemetry directory', async () => {
|
|
328
|
+
const today = getTestDate();
|
|
329
|
+
const localTelemetry = path.join(projectDir, 'telemetry');
|
|
330
|
+
fs.mkdirSync(localTelemetry, { recursive: true });
|
|
331
|
+
// Create traces in local directory with unique IDs
|
|
332
|
+
await writeJsonlFileAsync(path.join(localTelemetry, `traces-${today}.jsonl`), [
|
|
333
|
+
{ traceId: 'multidir-unique-test-abc123-1', spanId: 'span1', name: 'MultiDirUniqueOp_XYZ', startTime: [1700000000, 0] },
|
|
334
|
+
{ traceId: 'multidir-unique-test-abc123-2', spanId: 'span2', name: 'MultiDirUniqueOp_XYZ', startTime: [1700000002, 0] },
|
|
335
|
+
]);
|
|
336
|
+
const backend = new MultiDirectoryBackend(projectDir);
|
|
337
|
+
// Use spanName filter to find our specific test traces
|
|
338
|
+
const results = await backend.queryTraces({ spanName: 'MultiDirUniqueOp_XYZ' });
|
|
339
|
+
assert.strictEqual(results.length, 2);
|
|
340
|
+
assert.ok(results.some(t => t.traceId === 'multidir-unique-test-abc123-1'), 'Should find test trace 1');
|
|
341
|
+
assert.ok(results.some(t => t.traceId === 'multidir-unique-test-abc123-2'), 'Should find test trace 2');
|
|
342
|
+
});
|
|
343
|
+
it('should merge and sort traces by timestamp', async () => {
|
|
344
|
+
const today = getTestDate();
|
|
345
|
+
// Create two local telemetry directories
|
|
346
|
+
const localTelemetry1 = path.join(projectDir, 'telemetry');
|
|
347
|
+
const localTelemetry2 = path.join(projectDir, '.telemetry');
|
|
348
|
+
fs.mkdirSync(localTelemetry1, { recursive: true });
|
|
349
|
+
fs.mkdirSync(localTelemetry2, { recursive: true });
|
|
350
|
+
// Create traces with different timestamps and unique operation name
|
|
351
|
+
await writeJsonlFileAsync(path.join(localTelemetry1, `traces-${today}.jsonl`), [
|
|
352
|
+
{ traceId: 'multidir-sort-old-xyz789', spanId: 'span1', name: 'MultiDirSortOp_ABC', startTime: [1700000000, 0] },
|
|
353
|
+
]);
|
|
354
|
+
await writeJsonlFileAsync(path.join(localTelemetry2, `traces-${today}.jsonl`), [
|
|
355
|
+
{ traceId: 'multidir-sort-new-xyz789', spanId: 'span2', name: 'MultiDirSortOp_ABC', startTime: [1700000010, 0] },
|
|
356
|
+
]);
|
|
357
|
+
const backend = new MultiDirectoryBackend(projectDir);
|
|
358
|
+
const results = await backend.queryTraces({ spanName: 'MultiDirSortOp_ABC' });
|
|
359
|
+
assert.strictEqual(results.length, 2);
|
|
360
|
+
// Newer trace should be first (sorted by startTimeUnixNano descending)
|
|
361
|
+
assert.strictEqual(results[0].traceId, 'multidir-sort-new-xyz789');
|
|
362
|
+
assert.strictEqual(results[1].traceId, 'multidir-sort-old-xyz789');
|
|
363
|
+
});
|
|
364
|
+
it('should respect limit parameter', async () => {
|
|
365
|
+
const today = getTestDate();
|
|
366
|
+
const localTelemetry = path.join(projectDir, 'telemetry');
|
|
367
|
+
fs.mkdirSync(localTelemetry, { recursive: true });
|
|
368
|
+
// Create many traces with unique prefix
|
|
369
|
+
await writeJsonlFileAsync(path.join(localTelemetry, `traces-${today}.jsonl`), Array.from({ length: 150 }, (_, i) => ({
|
|
370
|
+
traceId: `multidir-limit-trace-${i}`,
|
|
371
|
+
spanId: `span${i}`,
|
|
372
|
+
name: `MultiDirLimitOp_${i}`,
|
|
373
|
+
startTime: [1700000000 + i, 0],
|
|
374
|
+
})));
|
|
375
|
+
const backend = new MultiDirectoryBackend(projectDir);
|
|
376
|
+
const results = await backend.queryTraces({ spanName: 'MultiDirLimitOp', limit: 50 });
|
|
377
|
+
assert.ok(results.length <= 50);
|
|
378
|
+
});
|
|
379
|
+
});
|
|
380
|
+
describe('queryLogs', () => {
|
|
381
|
+
it('should query logs from local telemetry directory', async () => {
|
|
382
|
+
const today = getTestDate();
|
|
383
|
+
const localTelemetry = path.join(projectDir, 'telemetry');
|
|
384
|
+
fs.mkdirSync(localTelemetry, { recursive: true });
|
|
385
|
+
await writeJsonlFileAsync(path.join(localTelemetry, `logs-${today}.jsonl`), [
|
|
386
|
+
{ timestamp: `${today}T10:00:00Z`, body: 'MultiDirUniqueTestLog_ABC123_1', severity: 'INFO' },
|
|
387
|
+
{ timestamp: `${today}T11:00:00Z`, body: 'MultiDirUniqueTestLog_ABC123_2', severity: 'ERROR' },
|
|
388
|
+
]);
|
|
389
|
+
const backend = new MultiDirectoryBackend(projectDir);
|
|
390
|
+
// Use search filter to find our specific test logs
|
|
391
|
+
const results = await backend.queryLogs({ search: 'MultiDirUniqueTestLog_ABC123' });
|
|
392
|
+
assert.strictEqual(results.length, 2);
|
|
393
|
+
assert.ok(results.some(l => l.body === 'MultiDirUniqueTestLog_ABC123_1'), 'Should find test log 1');
|
|
394
|
+
assert.ok(results.some(l => l.body === 'MultiDirUniqueTestLog_ABC123_2'), 'Should find test log 2');
|
|
395
|
+
});
|
|
396
|
+
it('should sort logs by timestamp descending', async () => {
|
|
397
|
+
const today = getTestDate();
|
|
398
|
+
const localTelemetry = path.join(projectDir, 'telemetry');
|
|
399
|
+
fs.mkdirSync(localTelemetry, { recursive: true });
|
|
400
|
+
await writeJsonlFileAsync(path.join(localTelemetry, `logs-${today}.jsonl`), [
|
|
401
|
+
{ timestamp: `${today}T08:00:00Z`, body: 'MultiDirSortTest_Early', severity: 'INFO' },
|
|
402
|
+
{ timestamp: `${today}T12:00:00Z`, body: 'MultiDirSortTest_Late', severity: 'INFO' },
|
|
403
|
+
]);
|
|
404
|
+
const backend = new MultiDirectoryBackend(projectDir);
|
|
405
|
+
const results = await backend.queryLogs({ search: 'MultiDirSortTest' });
|
|
406
|
+
assert.strictEqual(results.length, 2);
|
|
407
|
+
// Later log should come first (sorted descending)
|
|
408
|
+
assert.strictEqual(results[0].body, 'MultiDirSortTest_Late');
|
|
409
|
+
assert.strictEqual(results[1].body, 'MultiDirSortTest_Early');
|
|
410
|
+
});
|
|
411
|
+
});
|
|
412
|
+
describe('queryMetrics', () => {
|
|
413
|
+
it('should query metrics from local telemetry directory', async () => {
|
|
414
|
+
const today = getTestDate();
|
|
415
|
+
const localTelemetry = path.join(projectDir, 'telemetry');
|
|
416
|
+
fs.mkdirSync(localTelemetry, { recursive: true });
|
|
417
|
+
await writeJsonlFileAsync(path.join(localTelemetry, `metrics-${today}.jsonl`), [
|
|
418
|
+
{ timestamp: `${today}T10:00:00Z`, name: 'multidir.unique.xyz789.metric1', value: 100, type: 'gauge' },
|
|
419
|
+
{ timestamp: `${today}T11:00:00Z`, name: 'multidir.unique.xyz789.metric2', value: 200, type: 'gauge' },
|
|
420
|
+
]);
|
|
421
|
+
const backend = new MultiDirectoryBackend(projectDir);
|
|
422
|
+
// Use metricName filter to find our specific test metrics
|
|
423
|
+
const results = await backend.queryMetrics({ metricName: 'multidir.unique.xyz789' });
|
|
424
|
+
assert.strictEqual(results.length, 2);
|
|
425
|
+
assert.ok(results.some(m => m.name === 'multidir.unique.xyz789.metric1'), 'Should find test metric 1');
|
|
426
|
+
assert.ok(results.some(m => m.name === 'multidir.unique.xyz789.metric2'), 'Should find test metric 2');
|
|
427
|
+
});
|
|
428
|
+
it('should respect limit parameter', async () => {
|
|
429
|
+
const today = getTestDate();
|
|
430
|
+
const localTelemetry = path.join(projectDir, 'telemetry');
|
|
431
|
+
fs.mkdirSync(localTelemetry, { recursive: true });
|
|
432
|
+
await writeJsonlFileAsync(path.join(localTelemetry, `metrics-${today}.jsonl`), Array.from({ length: 150 }, (_, i) => ({
|
|
433
|
+
timestamp: `${today}T10:${String(Math.floor(i / 60) % 60).padStart(2, '0')}:${String(i % 60).padStart(2, '0')}Z`,
|
|
434
|
+
name: `multidir.limit.abc123.metric-${i}`,
|
|
435
|
+
value: i * 10,
|
|
436
|
+
type: 'gauge',
|
|
437
|
+
})));
|
|
438
|
+
const backend = new MultiDirectoryBackend(projectDir);
|
|
439
|
+
const results = await backend.queryMetrics({ metricName: 'multidir.limit.abc123', limit: 50 });
|
|
440
|
+
assert.ok(results.length <= 50);
|
|
441
|
+
});
|
|
442
|
+
});
|
|
443
|
+
describe('queryLLMEvents', () => {
|
|
444
|
+
it('should query LLM events from local telemetry directory', async () => {
|
|
445
|
+
const today = getTestDate();
|
|
446
|
+
const localTelemetry = path.join(projectDir, 'telemetry');
|
|
447
|
+
fs.mkdirSync(localTelemetry, { recursive: true });
|
|
448
|
+
await writeJsonlFileAsync(path.join(localTelemetry, `llm-events-${today}.jsonl`), [
|
|
449
|
+
{ timestamp: `${today}T10:00:00Z`, name: 'multidir.unique.xyz456.llm.event1', attributes: { model: 'claude' } },
|
|
450
|
+
{ timestamp: `${today}T11:00:00Z`, name: 'multidir.unique.xyz456.llm.event2', attributes: { model: 'gpt' } },
|
|
451
|
+
]);
|
|
452
|
+
const backend = new MultiDirectoryBackend(projectDir);
|
|
453
|
+
// Use eventName filter to find our specific test events
|
|
454
|
+
const results = await backend.queryLLMEvents({ eventName: 'multidir.unique.xyz456' });
|
|
455
|
+
assert.strictEqual(results.length, 2);
|
|
456
|
+
assert.ok(results.some(e => e.name === 'multidir.unique.xyz456.llm.event1'), 'Should find test event 1');
|
|
457
|
+
assert.ok(results.some(e => e.name === 'multidir.unique.xyz456.llm.event2'), 'Should find test event 2');
|
|
458
|
+
});
|
|
459
|
+
it('should sort LLM events by timestamp descending', async () => {
|
|
460
|
+
const today = getTestDate();
|
|
461
|
+
const localTelemetry = path.join(projectDir, 'telemetry');
|
|
462
|
+
fs.mkdirSync(localTelemetry, { recursive: true });
|
|
463
|
+
await writeJsonlFileAsync(path.join(localTelemetry, `llm-events-${today}.jsonl`), [
|
|
464
|
+
{ timestamp: `${today}T08:00:00Z`, name: 'multidir.sort.abc789.early', attributes: {} },
|
|
465
|
+
{ timestamp: `${today}T12:00:00Z`, name: 'multidir.sort.abc789.late', attributes: {} },
|
|
466
|
+
]);
|
|
467
|
+
const backend = new MultiDirectoryBackend(projectDir);
|
|
468
|
+
const results = await backend.queryLLMEvents({ eventName: 'multidir.sort.abc789' });
|
|
469
|
+
assert.strictEqual(results.length, 2);
|
|
470
|
+
// Later event should be first (sorted descending)
|
|
471
|
+
assert.strictEqual(results[0].name, 'multidir.sort.abc789.late');
|
|
472
|
+
assert.strictEqual(results[1].name, 'multidir.sort.abc789.early');
|
|
473
|
+
});
|
|
474
|
+
});
|
|
475
|
+
describe('healthCheck', () => {
|
|
476
|
+
it('should return error when no directories found', async () => {
|
|
477
|
+
// Create a backend with cwd that has no telemetry directories
|
|
478
|
+
// AND ensure global telemetry doesn't exist for this test
|
|
479
|
+
const emptyProject = createTempDir();
|
|
480
|
+
try {
|
|
481
|
+
const backend = new MultiDirectoryBackend(emptyProject);
|
|
482
|
+
// Only test error condition if we actually have no directories
|
|
483
|
+
if (backend.getDirectories().length === 0) {
|
|
484
|
+
const health = await backend.healthCheck();
|
|
485
|
+
assert.strictEqual(health.status, 'error');
|
|
486
|
+
assert.ok(health.message?.includes('No telemetry directories'));
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
finally {
|
|
490
|
+
removeTempDir(emptyProject);
|
|
491
|
+
}
|
|
492
|
+
});
|
|
493
|
+
it('should return ok when local telemetry directory exists', async () => {
|
|
494
|
+
const today = getTestDate();
|
|
495
|
+
const localTelemetry = path.join(projectDir, 'telemetry');
|
|
496
|
+
fs.mkdirSync(localTelemetry, { recursive: true });
|
|
497
|
+
// Create some telemetry files
|
|
498
|
+
await writeJsonlFileAsync(path.join(localTelemetry, `traces-${today}.jsonl`), []);
|
|
499
|
+
const backend = new MultiDirectoryBackend(projectDir);
|
|
500
|
+
const health = await backend.healthCheck();
|
|
501
|
+
assert.strictEqual(health.status, 'ok');
|
|
502
|
+
assert.ok(health.directories);
|
|
503
|
+
assert.ok(health.directories.length > 0);
|
|
504
|
+
});
|
|
505
|
+
it('should include directory statuses in health response', async () => {
|
|
506
|
+
const localTelemetry = path.join(projectDir, 'telemetry');
|
|
507
|
+
fs.mkdirSync(localTelemetry, { recursive: true });
|
|
508
|
+
const backend = new MultiDirectoryBackend(projectDir);
|
|
509
|
+
const health = await backend.healthCheck();
|
|
510
|
+
if (health.directories) {
|
|
511
|
+
for (const dir of health.directories) {
|
|
512
|
+
assert.ok(dir.path);
|
|
513
|
+
assert.ok(dir.source);
|
|
514
|
+
assert.ok(dir.status);
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
});
|
|
518
|
+
it('should report correct directory count in message', async () => {
|
|
519
|
+
const localTelemetry = path.join(projectDir, 'telemetry');
|
|
520
|
+
fs.mkdirSync(localTelemetry, { recursive: true });
|
|
521
|
+
const backend = new MultiDirectoryBackend(projectDir);
|
|
522
|
+
const health = await backend.healthCheck();
|
|
523
|
+
assert.ok(health.message?.includes('telemetry director'));
|
|
524
|
+
});
|
|
525
|
+
});
|
|
526
|
+
describe('getCacheStats', () => {
|
|
527
|
+
it('should return aggregated cache stats from all backends', () => {
|
|
528
|
+
const localTelemetry = path.join(projectDir, 'telemetry');
|
|
529
|
+
fs.mkdirSync(localTelemetry, { recursive: true });
|
|
530
|
+
const backend = new MultiDirectoryBackend(projectDir);
|
|
531
|
+
const stats = backend.getCacheStats();
|
|
532
|
+
assert.ok(stats.traces, 'Should have traces stats');
|
|
533
|
+
assert.ok(stats.logs, 'Should have logs stats');
|
|
534
|
+
assert.ok(stats.metrics, 'Should have metrics stats');
|
|
535
|
+
assert.ok(stats.llmEvents, 'Should have llmEvents stats');
|
|
536
|
+
});
|
|
537
|
+
it('should have correct structure for aggregated stats', () => {
|
|
538
|
+
const localTelemetry = path.join(projectDir, 'telemetry');
|
|
539
|
+
fs.mkdirSync(localTelemetry, { recursive: true });
|
|
540
|
+
const backend = new MultiDirectoryBackend(projectDir);
|
|
541
|
+
const stats = backend.getCacheStats();
|
|
542
|
+
for (const key of ['traces', 'logs', 'metrics', 'llmEvents']) {
|
|
543
|
+
const stat = stats[key];
|
|
544
|
+
assert.strictEqual(typeof stat.hits, 'number', `${key} should have hits`);
|
|
545
|
+
assert.strictEqual(typeof stat.misses, 'number', `${key} should have misses`);
|
|
546
|
+
assert.strictEqual(typeof stat.evictions, 'number', `${key} should have evictions`);
|
|
547
|
+
assert.strictEqual(typeof stat.size, 'number', `${key} should have size`);
|
|
548
|
+
assert.strictEqual(typeof stat.hitRate, 'number', `${key} should have hitRate`);
|
|
549
|
+
assert.ok(stat.hitRate >= 0 && stat.hitRate <= 1, `${key} hitRate should be between 0 and 1`);
|
|
550
|
+
}
|
|
551
|
+
});
|
|
552
|
+
});
|
|
553
|
+
});
|
|
554
|
+
//# sourceMappingURL=local-jsonl-index.test.js.map
|