observability-toolkit 1.0.0 → 1.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.
Files changed (98) hide show
  1. package/README.md +24 -13
  2. package/dist/backends/index.d.ts +13 -0
  3. package/dist/backends/index.d.ts.map +1 -1
  4. package/dist/backends/local-jsonl.d.ts +2 -1
  5. package/dist/backends/local-jsonl.d.ts.map +1 -1
  6. package/dist/backends/local-jsonl.js +62 -2
  7. package/dist/backends/local-jsonl.js.map +1 -1
  8. package/dist/backends/local-jsonl.test.d.ts +2 -0
  9. package/dist/backends/local-jsonl.test.d.ts.map +1 -0
  10. package/dist/backends/local-jsonl.test.js +558 -0
  11. package/dist/backends/local-jsonl.test.js.map +1 -0
  12. package/dist/backends/signoz-api.d.ts +9 -2
  13. package/dist/backends/signoz-api.d.ts.map +1 -1
  14. package/dist/backends/signoz-api.js +181 -106
  15. package/dist/backends/signoz-api.js.map +1 -1
  16. package/dist/backends/signoz-api.test.d.ts +2 -0
  17. package/dist/backends/signoz-api.test.d.ts.map +1 -0
  18. package/dist/backends/signoz-api.test.js +904 -0
  19. package/dist/backends/signoz-api.test.js.map +1 -0
  20. package/dist/lib/constants.d.ts +1 -0
  21. package/dist/lib/constants.d.ts.map +1 -1
  22. package/dist/lib/constants.js +6 -2
  23. package/dist/lib/constants.js.map +1 -1
  24. package/dist/lib/constants.test.d.ts +5 -0
  25. package/dist/lib/constants.test.d.ts.map +1 -0
  26. package/dist/lib/constants.test.js +199 -0
  27. package/dist/lib/constants.test.js.map +1 -0
  28. package/dist/lib/file-utils.d.ts +5 -0
  29. package/dist/lib/file-utils.d.ts.map +1 -1
  30. package/dist/lib/file-utils.js +14 -0
  31. package/dist/lib/file-utils.js.map +1 -1
  32. package/dist/lib/file-utils.test.d.ts +2 -0
  33. package/dist/lib/file-utils.test.d.ts.map +1 -0
  34. package/dist/lib/file-utils.test.js +422 -0
  35. package/dist/lib/file-utils.test.js.map +1 -0
  36. package/dist/server.js +6 -1
  37. package/dist/server.js.map +1 -1
  38. package/dist/tools/context-stats.d.ts +2 -2
  39. package/dist/tools/context-stats.d.ts.map +1 -1
  40. package/dist/tools/context-stats.js +2 -1
  41. package/dist/tools/context-stats.js.map +1 -1
  42. package/dist/tools/context-stats.test.d.ts +5 -0
  43. package/dist/tools/context-stats.test.d.ts.map +1 -0
  44. package/dist/tools/context-stats.test.js +339 -0
  45. package/dist/tools/context-stats.test.js.map +1 -0
  46. package/dist/tools/get-trace-url.test.d.ts +5 -0
  47. package/dist/tools/get-trace-url.test.d.ts.map +1 -0
  48. package/dist/tools/get-trace-url.test.js +423 -0
  49. package/dist/tools/get-trace-url.test.js.map +1 -0
  50. package/dist/tools/health-check.test.d.ts +5 -0
  51. package/dist/tools/health-check.test.d.ts.map +1 -0
  52. package/dist/tools/health-check.test.js +393 -0
  53. package/dist/tools/health-check.test.js.map +1 -0
  54. package/dist/tools/index.d.ts +2 -0
  55. package/dist/tools/index.d.ts.map +1 -1
  56. package/dist/tools/index.js +2 -0
  57. package/dist/tools/index.js.map +1 -1
  58. package/dist/tools/query-llm-events.d.ts +82 -0
  59. package/dist/tools/query-llm-events.d.ts.map +1 -0
  60. package/dist/tools/query-llm-events.js +60 -0
  61. package/dist/tools/query-llm-events.js.map +1 -0
  62. package/dist/tools/query-llm-events.test.d.ts +5 -0
  63. package/dist/tools/query-llm-events.test.d.ts.map +1 -0
  64. package/dist/tools/query-llm-events.test.js +111 -0
  65. package/dist/tools/query-llm-events.test.js.map +1 -0
  66. package/dist/tools/query-logs.d.ts +7 -2
  67. package/dist/tools/query-logs.d.ts.map +1 -1
  68. package/dist/tools/query-logs.js +7 -6
  69. package/dist/tools/query-logs.js.map +1 -1
  70. package/dist/tools/query-logs.test.d.ts +5 -0
  71. package/dist/tools/query-logs.test.d.ts.map +1 -0
  72. package/dist/tools/query-logs.test.js +668 -0
  73. package/dist/tools/query-logs.test.js.map +1 -0
  74. package/dist/tools/query-metrics.d.ts +2 -2
  75. package/dist/tools/query-metrics.d.ts.map +1 -1
  76. package/dist/tools/query-metrics.js +2 -1
  77. package/dist/tools/query-metrics.js.map +1 -1
  78. package/dist/tools/query-metrics.test.d.ts +5 -0
  79. package/dist/tools/query-metrics.test.d.ts.map +1 -0
  80. package/dist/tools/query-metrics.test.js +559 -0
  81. package/dist/tools/query-metrics.test.js.map +1 -0
  82. package/dist/tools/query-traces.d.ts +8 -2
  83. package/dist/tools/query-traces.d.ts.map +1 -1
  84. package/dist/tools/query-traces.js +4 -1
  85. package/dist/tools/query-traces.js.map +1 -1
  86. package/dist/tools/query-traces.test.d.ts +5 -0
  87. package/dist/tools/query-traces.test.d.ts.map +1 -0
  88. package/dist/tools/query-traces.test.js +547 -0
  89. package/dist/tools/query-traces.test.js.map +1 -0
  90. package/dist/tools/setup-claudeignore.d.ts +45 -0
  91. package/dist/tools/setup-claudeignore.d.ts.map +1 -0
  92. package/dist/tools/setup-claudeignore.js +72 -0
  93. package/dist/tools/setup-claudeignore.js.map +1 -0
  94. package/dist/tools/setup-claudeignore.test.d.ts +2 -0
  95. package/dist/tools/setup-claudeignore.test.d.ts.map +1 -0
  96. package/dist/tools/setup-claudeignore.test.js +236 -0
  97. package/dist/tools/setup-claudeignore.test.js.map +1 -0
  98. package/package.json +1 -1
@@ -0,0 +1,558 @@
1
+ import { describe, it, beforeEach, afterEach } from 'node:test';
2
+ import * as assert from 'node:assert';
3
+ import * as fs from 'fs';
4
+ import * as path from 'path';
5
+ import * as os from 'os';
6
+ import { LocalJsonlBackend } from './local-jsonl.js';
7
+ /**
8
+ * Test utilities for creating temp test fixtures
9
+ */
10
+ function createTempDir() {
11
+ return fs.mkdtempSync(path.join(os.tmpdir(), 'local-jsonl-test-'));
12
+ }
13
+ function removeTempDir(dir) {
14
+ try {
15
+ fs.rmSync(dir, { recursive: true, force: true });
16
+ }
17
+ catch {
18
+ // Ignore cleanup errors
19
+ }
20
+ }
21
+ function writeJsonlFile(filePath, data) {
22
+ const content = data.map(item => JSON.stringify(item)).join('\n');
23
+ fs.writeFileSync(filePath, content, 'utf-8');
24
+ }
25
+ function getTestDate() {
26
+ return new Date().toISOString().split('T')[0];
27
+ }
28
+ describe('LocalJsonlBackend', () => {
29
+ let tempDir;
30
+ let backend;
31
+ beforeEach(() => {
32
+ tempDir = createTempDir();
33
+ backend = new LocalJsonlBackend(tempDir);
34
+ });
35
+ afterEach(() => {
36
+ removeTempDir(tempDir);
37
+ });
38
+ describe('queryTraces', () => {
39
+ it('should read and normalize trace spans from JSONL files', async () => {
40
+ const today = getTestDate();
41
+ const mockSpans = [
42
+ {
43
+ traceId: 'trace1',
44
+ spanId: 'span1',
45
+ name: 'test-operation',
46
+ startTime: [1700000000, 0],
47
+ endTime: [1700000001, 500000000],
48
+ resource: { serviceName: 'test-service', serviceVersion: '1.0.0' },
49
+ attributes: { 'custom.attr': 'value1' },
50
+ },
51
+ ];
52
+ writeJsonlFile(path.join(tempDir, `traces-${today}.jsonl`), mockSpans);
53
+ const results = await backend.queryTraces({});
54
+ assert.strictEqual(results.length, 1);
55
+ assert.strictEqual(results[0].traceId, 'trace1');
56
+ assert.strictEqual(results[0].spanId, 'span1');
57
+ assert.strictEqual(results[0].name, 'test-operation');
58
+ assert.strictEqual(results[0].attributes?.['service.name'], 'test-service');
59
+ assert.strictEqual(results[0].attributes?.['service.version'], '1.0.0');
60
+ assert.strictEqual(results[0].attributes?.['custom.attr'], 'value1');
61
+ });
62
+ it('should filter spans by traceId', async () => {
63
+ const today = getTestDate();
64
+ const mockSpans = [
65
+ { traceId: 'trace1', spanId: 'span1', name: 'op1', startTime: [1700000000, 0] },
66
+ { traceId: 'trace2', spanId: 'span2', name: 'op2', startTime: [1700000000, 0] },
67
+ { traceId: 'trace1', spanId: 'span3', name: 'op3', startTime: [1700000000, 0] },
68
+ ];
69
+ writeJsonlFile(path.join(tempDir, `traces-${today}.jsonl`), mockSpans);
70
+ const results = await backend.queryTraces({ traceId: 'trace1' });
71
+ assert.strictEqual(results.length, 2);
72
+ assert.ok(results.every(s => s.traceId === 'trace1'));
73
+ });
74
+ it('should filter spans by spanName substring', async () => {
75
+ const today = getTestDate();
76
+ const mockSpans = [
77
+ { traceId: 'trace1', spanId: 'span1', name: 'user-create', startTime: [1700000000, 0] },
78
+ { traceId: 'trace1', spanId: 'span2', name: 'user-update', startTime: [1700000000, 0] },
79
+ { traceId: 'trace1', spanId: 'span3', name: 'db-query', startTime: [1700000000, 0] },
80
+ ];
81
+ writeJsonlFile(path.join(tempDir, `traces-${today}.jsonl`), mockSpans);
82
+ const results = await backend.queryTraces({ spanName: 'user' });
83
+ assert.strictEqual(results.length, 2);
84
+ assert.ok(results.every(s => s.name.includes('user')));
85
+ });
86
+ it('should filter spans by duration range', async () => {
87
+ const today = getTestDate();
88
+ const mockSpans = [
89
+ {
90
+ traceId: 'trace1',
91
+ spanId: 'span1',
92
+ name: 'fast-op',
93
+ startTime: [1700000000, 0],
94
+ endTime: [1700000000, 500000000], // 0.5s
95
+ },
96
+ {
97
+ traceId: 'trace1',
98
+ spanId: 'span2',
99
+ name: 'medium-op',
100
+ startTime: [1700000000, 0],
101
+ endTime: [1700000002, 0], // 2s
102
+ },
103
+ {
104
+ traceId: 'trace1',
105
+ spanId: 'span3',
106
+ name: 'slow-op',
107
+ startTime: [1700000000, 0],
108
+ endTime: [1700000010, 0], // 10s
109
+ },
110
+ ];
111
+ writeJsonlFile(path.join(tempDir, `traces-${today}.jsonl`), mockSpans);
112
+ const results = await backend.queryTraces({ minDurationMs: 1000, maxDurationMs: 5000 });
113
+ assert.strictEqual(results.length, 1);
114
+ assert.strictEqual(results[0].name, 'medium-op');
115
+ });
116
+ it('should filter spans by serviceName', async () => {
117
+ const today = getTestDate();
118
+ const mockSpans = [
119
+ {
120
+ traceId: 'trace1',
121
+ spanId: 'span1',
122
+ name: 'op1',
123
+ startTime: [1700000000, 0],
124
+ resource: { serviceName: 'service-a' },
125
+ },
126
+ {
127
+ traceId: 'trace1',
128
+ spanId: 'span2',
129
+ name: 'op2',
130
+ startTime: [1700000000, 0],
131
+ resource: { serviceName: 'service-b' },
132
+ },
133
+ ];
134
+ writeJsonlFile(path.join(tempDir, `traces-${today}.jsonl`), mockSpans);
135
+ const results = await backend.queryTraces({ serviceName: 'service-a' });
136
+ assert.strictEqual(results.length, 1);
137
+ assert.strictEqual(results[0].attributes?.['service.name'], 'service-a');
138
+ });
139
+ it('should apply limit and offset to results', async () => {
140
+ const today = getTestDate();
141
+ const mockSpans = Array.from({ length: 150 }, (_, i) => ({
142
+ traceId: `trace${i}`,
143
+ spanId: `span${i}`,
144
+ name: `op${i}`,
145
+ startTime: [1700000000, 0],
146
+ }));
147
+ writeJsonlFile(path.join(tempDir, `traces-${today}.jsonl`), mockSpans);
148
+ const results = await backend.queryTraces({ limit: 50, offset: 25 });
149
+ assert.strictEqual(results.length, 50);
150
+ assert.strictEqual(results[0].traceId, 'trace25');
151
+ });
152
+ it('should skip invalid spans (missing required fields)', async () => {
153
+ const today = getTestDate();
154
+ const mockSpans = [
155
+ { traceId: 'trace1', spanId: 'span1', name: 'op1', startTime: [1700000000, 0] },
156
+ { traceId: 'trace2', spanId: 'span2', startTime: [1700000000, 0] }, // missing name
157
+ { spanId: 'span3', name: 'op3', startTime: [1700000000, 0] }, // missing traceId
158
+ { traceId: 'trace4', name: 'op4', startTime: [1700000000, 0] }, // missing spanId
159
+ ];
160
+ writeJsonlFile(path.join(tempDir, `traces-${today}.jsonl`), mockSpans);
161
+ const results = await backend.queryTraces({});
162
+ assert.strictEqual(results.length, 1);
163
+ assert.strictEqual(results[0].traceId, 'trace1');
164
+ });
165
+ it('should convert duration from [seconds, nanoseconds] array', async () => {
166
+ const today = getTestDate();
167
+ const mockSpans = [
168
+ {
169
+ traceId: 'trace1',
170
+ spanId: 'span1',
171
+ name: 'op1',
172
+ startTime: [1700000000, 0],
173
+ duration: [2, 500000000], // 2.5 seconds
174
+ },
175
+ ];
176
+ writeJsonlFile(path.join(tempDir, `traces-${today}.jsonl`), mockSpans);
177
+ const results = await backend.queryTraces({});
178
+ assert.strictEqual(results.length, 1);
179
+ assert.strictEqual(results[0].durationMs, 2500);
180
+ });
181
+ it('should convert span kind number to string', async () => {
182
+ const today = getTestDate();
183
+ const mockSpans = [
184
+ { traceId: 'trace1', spanId: 'span1', name: 'op1', kind: 0, startTime: [1700000000, 0] },
185
+ { traceId: 'trace2', spanId: 'span2', name: 'op2', kind: 1, startTime: [1700000000, 0] },
186
+ { traceId: 'trace3', spanId: 'span3', name: 'op3', kind: 2, startTime: [1700000000, 0] },
187
+ ];
188
+ writeJsonlFile(path.join(tempDir, `traces-${today}.jsonl`), mockSpans);
189
+ const results = await backend.queryTraces({});
190
+ assert.strictEqual(results[0].kind, 'INTERNAL');
191
+ assert.strictEqual(results[1].kind, 'SERVER');
192
+ assert.strictEqual(results[2].kind, 'CLIENT');
193
+ });
194
+ it('should return empty array when no files found', async () => {
195
+ // No files created - tempDir is empty
196
+ const results = await backend.queryTraces({});
197
+ assert.strictEqual(results.length, 0);
198
+ });
199
+ });
200
+ describe('queryLogs', () => {
201
+ it('should read and normalize log records from JSONL files', async () => {
202
+ const today = getTestDate();
203
+ const mockLogs = [
204
+ {
205
+ timestamp: '2026-01-28T10:00:00.000Z',
206
+ severityText: 'ERROR',
207
+ body: 'Connection failed',
208
+ traceId: 'trace1',
209
+ spanId: 'span1',
210
+ resource: { serviceName: 'api-service' },
211
+ attributes: { 'error.type': 'timeout' },
212
+ },
213
+ ];
214
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
215
+ const results = await backend.queryLogs({});
216
+ assert.strictEqual(results.length, 1);
217
+ assert.strictEqual(results[0].severity, 'ERROR');
218
+ assert.strictEqual(results[0].body, 'Connection failed');
219
+ assert.strictEqual(results[0].attributes?.['service.name'], 'api-service');
220
+ assert.strictEqual(results[0].attributes?.['error.type'], 'timeout');
221
+ });
222
+ it('should handle timestamp as ISO string', async () => {
223
+ const today = getTestDate();
224
+ const mockLogs = [
225
+ {
226
+ timestamp: '2026-01-28T10:00:00.123Z',
227
+ body: 'Test log',
228
+ },
229
+ ];
230
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
231
+ const results = await backend.queryLogs({});
232
+ assert.strictEqual(results[0].timestamp, '2026-01-28T10:00:00.123Z');
233
+ });
234
+ it('should convert timestamp from [seconds, nanoseconds] array', async () => {
235
+ const today = getTestDate();
236
+ const mockLogs = [
237
+ {
238
+ timestamp: [1700000000, 123456789], // seconds + nanoseconds
239
+ body: 'Test log',
240
+ },
241
+ ];
242
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
243
+ const results = await backend.queryLogs({});
244
+ // Verify it's a valid ISO string
245
+ assert.match(results[0].timestamp, /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/);
246
+ });
247
+ it('should filter logs by severity (case-insensitive)', async () => {
248
+ const today = getTestDate();
249
+ const mockLogs = [
250
+ { timestamp: '2026-01-28T10:00:00Z', severityText: 'ERROR', body: 'Error 1' },
251
+ { timestamp: '2026-01-28T10:01:00Z', severity: 'WARN', body: 'Warning 1' },
252
+ { timestamp: '2026-01-28T10:02:00Z', severity: 'error', body: 'Error 2' },
253
+ { timestamp: '2026-01-28T10:03:00Z', severity: 'INFO', body: 'Info 1' },
254
+ ];
255
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
256
+ const results = await backend.queryLogs({ severity: 'ERROR' });
257
+ assert.strictEqual(results.length, 2);
258
+ assert.ok(results.every(l => l.severity.toUpperCase() === 'ERROR'));
259
+ });
260
+ it('should filter logs by traceId', async () => {
261
+ const today = getTestDate();
262
+ const mockLogs = [
263
+ { timestamp: '2026-01-28T10:00:00Z', body: 'Log 1', traceId: 'trace1' },
264
+ { timestamp: '2026-01-28T10:01:00Z', body: 'Log 2', traceId: 'trace2' },
265
+ { timestamp: '2026-01-28T10:02:00Z', body: 'Log 3', traceId: 'trace1' },
266
+ ];
267
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
268
+ const results = await backend.queryLogs({ traceId: 'trace1' });
269
+ assert.strictEqual(results.length, 2);
270
+ assert.ok(results.every(l => l.traceId === 'trace1'));
271
+ });
272
+ it('should filter logs by search text (case-insensitive substring)', async () => {
273
+ const today = getTestDate();
274
+ const mockLogs = [
275
+ { timestamp: '2026-01-28T10:00:00Z', body: 'Connection timeout' },
276
+ { timestamp: '2026-01-28T10:01:00Z', body: 'Database query failed' },
277
+ { timestamp: '2026-01-28T10:02:00Z', body: 'Connection reset by peer' },
278
+ ];
279
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
280
+ const results = await backend.queryLogs({ search: 'CONNECTION' });
281
+ assert.strictEqual(results.length, 2);
282
+ assert.ok(results.every(l => l.body.toLowerCase().includes('connection')));
283
+ });
284
+ it('should use severityText if available, fallback to severity', async () => {
285
+ const today = getTestDate();
286
+ const mockLogs = [
287
+ { timestamp: '2026-01-28T10:00:00Z', body: 'Log 1', severityText: 'CUSTOM' },
288
+ { timestamp: '2026-01-28T10:01:00Z', body: 'Log 2', severity: 'WARN' },
289
+ { timestamp: '2026-01-28T10:02:00Z', body: 'Log 3' }, // no severity
290
+ ];
291
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
292
+ const results = await backend.queryLogs({});
293
+ assert.strictEqual(results[0].severity, 'CUSTOM');
294
+ assert.strictEqual(results[1].severity, 'WARN');
295
+ assert.strictEqual(results[2].severity, 'INFO'); // default
296
+ });
297
+ it('should apply limit and offset to log results', async () => {
298
+ const today = getTestDate();
299
+ const mockLogs = Array.from({ length: 200 }, (_, i) => ({
300
+ timestamp: new Date(Date.now() + i * 1000).toISOString(),
301
+ body: `Log ${i}`,
302
+ }));
303
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
304
+ const results = await backend.queryLogs({ limit: 50, offset: 75 });
305
+ assert.strictEqual(results.length, 50);
306
+ assert.strictEqual(results[0].body, 'Log 75');
307
+ });
308
+ it('should handle empty body field', async () => {
309
+ const today = getTestDate();
310
+ const mockLogs = [
311
+ { timestamp: '2026-01-28T10:00:00Z', body: 'Normal log' },
312
+ { timestamp: '2026-01-28T10:01:00Z' }, // missing body
313
+ ];
314
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
315
+ const results = await backend.queryLogs({});
316
+ assert.strictEqual(results.length, 2);
317
+ assert.strictEqual(results[1].body, '');
318
+ });
319
+ });
320
+ describe('queryMetrics', () => {
321
+ it('should read and normalize metric data points from JSONL files', async () => {
322
+ const today = getTestDate();
323
+ const mockMetrics = [
324
+ {
325
+ timestamp: '2026-01-28T10:00:00Z',
326
+ name: 'http.requests.total',
327
+ value: 100,
328
+ type: 'counter',
329
+ unit: 'requests',
330
+ resource: { serviceName: 'api-gateway' },
331
+ attributes: { 'http.method': 'GET', 'http.status_code': 200 },
332
+ },
333
+ ];
334
+ writeJsonlFile(path.join(tempDir, `metrics-${today}.jsonl`), mockMetrics);
335
+ const results = await backend.queryMetrics({});
336
+ assert.strictEqual(results.length, 1);
337
+ assert.strictEqual(results[0].name, 'http.requests.total');
338
+ assert.strictEqual(results[0].value, 100);
339
+ assert.strictEqual(results[0].unit, 'requests');
340
+ assert.strictEqual(results[0].attributes?.['service.name'], 'api-gateway');
341
+ assert.strictEqual(results[0].attributes?.['http.method'], 'GET');
342
+ });
343
+ it('should filter metrics by name substring', async () => {
344
+ const today = getTestDate();
345
+ const mockMetrics = [
346
+ { timestamp: '2026-01-28T10:00:00Z', name: 'http.requests.total', value: 100, type: 'counter' },
347
+ { timestamp: '2026-01-28T10:01:00Z', name: 'http.request.duration', value: 150, type: 'histogram' },
348
+ { timestamp: '2026-01-28T10:02:00Z', name: 'memory.usage', value: 512, type: 'gauge' },
349
+ ];
350
+ writeJsonlFile(path.join(tempDir, `metrics-${today}.jsonl`), mockMetrics);
351
+ const results = await backend.queryMetrics({ metricName: 'http' });
352
+ assert.strictEqual(results.length, 2);
353
+ assert.ok(results.every(m => m.name.includes('http')));
354
+ });
355
+ it('should apply limit and offset to metric results', async () => {
356
+ const today = getTestDate();
357
+ const mockMetrics = Array.from({ length: 150 }, (_, i) => ({
358
+ timestamp: new Date(Date.now() + i * 1000).toISOString(),
359
+ name: `metric.${i}`,
360
+ value: i * 10,
361
+ type: 'gauge',
362
+ }));
363
+ writeJsonlFile(path.join(tempDir, `metrics-${today}.jsonl`), mockMetrics);
364
+ const results = await backend.queryMetrics({ limit: 50, offset: 30 });
365
+ assert.strictEqual(results.length, 50);
366
+ assert.strictEqual(results[0].name, 'metric.30');
367
+ });
368
+ it('should aggregate metrics with sum function', async () => {
369
+ const today = getTestDate();
370
+ const mockMetrics = [
371
+ { timestamp: '2026-01-28T10:00:00Z', name: 'requests', value: 100, type: 'counter' },
372
+ { timestamp: '2026-01-28T10:01:00Z', name: 'requests', value: 150, type: 'counter' },
373
+ { timestamp: '2026-01-28T10:02:00Z', name: 'requests', value: 200, type: 'counter' },
374
+ ];
375
+ writeJsonlFile(path.join(tempDir, `metrics-${today}.jsonl`), mockMetrics);
376
+ const results = await backend.queryMetrics({ aggregation: 'sum' });
377
+ assert.strictEqual(results.length, 1);
378
+ assert.strictEqual(results[0].value, 450);
379
+ });
380
+ it('should aggregate metrics with avg function', async () => {
381
+ const today = getTestDate();
382
+ const mockMetrics = [
383
+ { timestamp: '2026-01-28T10:00:00Z', name: 'latency', value: 100, type: 'histogram' },
384
+ { timestamp: '2026-01-28T10:01:00Z', name: 'latency', value: 200, type: 'histogram' },
385
+ { timestamp: '2026-01-28T10:02:00Z', name: 'latency', value: 300, type: 'histogram' },
386
+ ];
387
+ writeJsonlFile(path.join(tempDir, `metrics-${today}.jsonl`), mockMetrics);
388
+ const results = await backend.queryMetrics({ aggregation: 'avg' });
389
+ assert.strictEqual(results.length, 1);
390
+ assert.strictEqual(results[0].value, 200);
391
+ });
392
+ it('should aggregate metrics with min function', async () => {
393
+ const today = getTestDate();
394
+ const mockMetrics = [
395
+ { timestamp: '2026-01-28T10:00:00Z', name: 'response_time', value: 150, type: 'gauge' },
396
+ { timestamp: '2026-01-28T10:01:00Z', name: 'response_time', value: 50, type: 'gauge' },
397
+ { timestamp: '2026-01-28T10:02:00Z', name: 'response_time', value: 200, type: 'gauge' },
398
+ ];
399
+ writeJsonlFile(path.join(tempDir, `metrics-${today}.jsonl`), mockMetrics);
400
+ const results = await backend.queryMetrics({ aggregation: 'min' });
401
+ assert.strictEqual(results.length, 1);
402
+ assert.strictEqual(results[0].value, 50);
403
+ });
404
+ it('should aggregate metrics with max function', async () => {
405
+ const today = getTestDate();
406
+ const mockMetrics = [
407
+ { timestamp: '2026-01-28T10:00:00Z', name: 'memory', value: 512, type: 'gauge' },
408
+ { timestamp: '2026-01-28T10:01:00Z', name: 'memory', value: 256, type: 'gauge' },
409
+ { timestamp: '2026-01-28T10:02:00Z', name: 'memory', value: 1024, type: 'gauge' },
410
+ ];
411
+ writeJsonlFile(path.join(tempDir, `metrics-${today}.jsonl`), mockMetrics);
412
+ const results = await backend.queryMetrics({ aggregation: 'max' });
413
+ assert.strictEqual(results.length, 1);
414
+ assert.strictEqual(results[0].value, 1024);
415
+ });
416
+ it('should aggregate metrics with count function', async () => {
417
+ const today = getTestDate();
418
+ const mockMetrics = [
419
+ { timestamp: '2026-01-28T10:00:00Z', name: 'events', value: 10, type: 'counter' },
420
+ { timestamp: '2026-01-28T10:01:00Z', name: 'events', value: 20, type: 'counter' },
421
+ { timestamp: '2026-01-28T10:02:00Z', name: 'events', value: 30, type: 'counter' },
422
+ ];
423
+ writeJsonlFile(path.join(tempDir, `metrics-${today}.jsonl`), mockMetrics);
424
+ const results = await backend.queryMetrics({ aggregation: 'count' });
425
+ assert.strictEqual(results.length, 1);
426
+ assert.strictEqual(results[0].value, 3);
427
+ });
428
+ it('should aggregate metrics grouped by attributes', async () => {
429
+ const today = getTestDate();
430
+ const mockMetrics = [
431
+ {
432
+ timestamp: '2026-01-28T10:00:00Z',
433
+ name: 'http.requests',
434
+ value: 100,
435
+ type: 'counter',
436
+ attributes: { method: 'GET' },
437
+ },
438
+ {
439
+ timestamp: '2026-01-28T10:01:00Z',
440
+ name: 'http.requests',
441
+ value: 50,
442
+ type: 'counter',
443
+ attributes: { method: 'POST' },
444
+ },
445
+ {
446
+ timestamp: '2026-01-28T10:02:00Z',
447
+ name: 'http.requests',
448
+ value: 200,
449
+ type: 'counter',
450
+ attributes: { method: 'GET' },
451
+ },
452
+ ];
453
+ writeJsonlFile(path.join(tempDir, `metrics-${today}.jsonl`), mockMetrics);
454
+ const results = await backend.queryMetrics({ aggregation: 'sum', groupBy: ['method'] });
455
+ assert.strictEqual(results.length, 2);
456
+ const getMetric = results.find(m => m.attributes?.method === 'GET');
457
+ const postMetric = results.find(m => m.attributes?.method === 'POST');
458
+ assert.strictEqual(getMetric?.value, 300);
459
+ assert.strictEqual(postMetric?.value, 50);
460
+ });
461
+ it('should return empty array when no metrics found', async () => {
462
+ // No files created
463
+ const results = await backend.queryMetrics({});
464
+ assert.strictEqual(results.length, 0);
465
+ });
466
+ });
467
+ describe('healthCheck', () => {
468
+ it('should return error when telemetry directory does not exist', async () => {
469
+ const nonExistentBackend = new LocalJsonlBackend('/nonexistent/telemetry');
470
+ const result = await nonExistentBackend.healthCheck();
471
+ assert.strictEqual(result.status, 'error');
472
+ assert.match(result.message || '', /not found/);
473
+ });
474
+ it('should return ok when directory exists with no files', async () => {
475
+ // tempDir exists but has no files
476
+ const result = await backend.healthCheck();
477
+ assert.strictEqual(result.status, 'ok');
478
+ assert.match(result.message || '', /No telemetry files/);
479
+ });
480
+ it('should return ok with found files message', async () => {
481
+ const today = getTestDate();
482
+ // Create both traces and logs files
483
+ writeJsonlFile(path.join(tempDir, `traces-${today}.jsonl`), []);
484
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), []);
485
+ const result = await backend.healthCheck();
486
+ assert.strictEqual(result.status, 'ok');
487
+ assert.match(result.message || '', /traces.*logs/);
488
+ });
489
+ });
490
+ describe('date range filtering', () => {
491
+ it('should filter files by startDate and endDate', async () => {
492
+ // Create files for multiple dates
493
+ writeJsonlFile(path.join(tempDir, 'traces-2026-01-26.jsonl'), [
494
+ { traceId: 'trace-26', spanId: 'span1', name: 'op1', startTime: [1700000000, 0] },
495
+ ]);
496
+ writeJsonlFile(path.join(tempDir, 'traces-2026-01-27.jsonl'), [
497
+ { traceId: 'trace-27', spanId: 'span1', name: 'op1', startTime: [1700000000, 0] },
498
+ ]);
499
+ writeJsonlFile(path.join(tempDir, 'traces-2026-01-28.jsonl'), [
500
+ { traceId: 'trace-28', spanId: 'span1', name: 'op1', startTime: [1700000000, 0] },
501
+ ]);
502
+ writeJsonlFile(path.join(tempDir, 'traces-2026-01-29.jsonl'), [
503
+ { traceId: 'trace-29', spanId: 'span1', name: 'op1', startTime: [1700000000, 0] },
504
+ ]);
505
+ const results = await backend.queryTraces({ startDate: '2026-01-27', endDate: '2026-01-28' });
506
+ assert.strictEqual(results.length, 2);
507
+ const traceIds = results.map(r => r.traceId);
508
+ assert.ok(traceIds.includes('trace-27'));
509
+ assert.ok(traceIds.includes('trace-28'));
510
+ assert.ok(!traceIds.includes('trace-26'));
511
+ assert.ok(!traceIds.includes('trace-29'));
512
+ });
513
+ it('should use today as default when no date range specified', async () => {
514
+ const today = getTestDate();
515
+ const yesterday = new Date(Date.now() - 86400000).toISOString().split('T')[0];
516
+ // Create file for today and yesterday
517
+ writeJsonlFile(path.join(tempDir, `traces-${today}.jsonl`), [
518
+ { traceId: 'today-trace', spanId: 'span1', name: 'op1', startTime: [1700000000, 0] },
519
+ ]);
520
+ writeJsonlFile(path.join(tempDir, `traces-${yesterday}.jsonl`), [
521
+ { traceId: 'yesterday-trace', spanId: 'span1', name: 'op1', startTime: [1700000000, 0] },
522
+ ]);
523
+ // Query with no date range should only get today's data
524
+ const results = await backend.queryTraces({});
525
+ assert.strictEqual(results.length, 1);
526
+ assert.strictEqual(results[0].traceId, 'today-trace');
527
+ });
528
+ });
529
+ describe('error handling', () => {
530
+ it('should handle JSONL parsing errors gracefully', async () => {
531
+ const today = getTestDate();
532
+ const filePath = path.join(tempDir, `traces-${today}.jsonl`);
533
+ // Write malformed JSON
534
+ fs.writeFileSync(filePath, 'not valid json\n{"traceId":"t1","spanId":"s1","name":"op"}\n', 'utf-8');
535
+ const results = await backend.queryTraces({});
536
+ // Should skip the malformed line and parse the valid one
537
+ assert.strictEqual(results.length, 1);
538
+ assert.strictEqual(results[0].traceId, 't1');
539
+ });
540
+ it('should skip spans with invalid time calculations', async () => {
541
+ const today = getTestDate();
542
+ const mockSpans = [
543
+ {
544
+ traceId: 'trace1',
545
+ spanId: 'span1',
546
+ name: 'op1',
547
+ startTime: [1700000000, 0],
548
+ endTime: [1700000000, 0],
549
+ },
550
+ ];
551
+ writeJsonlFile(path.join(tempDir, `traces-${today}.jsonl`), mockSpans);
552
+ const results = await backend.queryTraces({});
553
+ assert.strictEqual(results.length, 1);
554
+ assert.strictEqual(results[0].durationMs, 0);
555
+ });
556
+ });
557
+ });
558
+ //# sourceMappingURL=local-jsonl.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-jsonl.test.js","sourceRoot":"","sources":["../../src/backends/local-jsonl.test.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,11 @@
1
1
  /**
2
2
  * SigNoz Cloud API backend for querying traces, metrics, and logs
3
+ *
4
+ * SigNoz has two separate endpoints:
5
+ * - Ingest: https://ingest.{region}.signoz.cloud (OTLP for sending data)
6
+ * - Query API: https://{tenant}.signoz.io or SIGNOZ_QUERY_URL (for reading data)
7
+ *
8
+ * This backend uses the Query API (v5) for reading telemetry data.
3
9
  */
4
10
  import { TelemetryBackend, TraceSpan, LogRecord, MetricDataPoint, TraceQueryOptions, LogQueryOptions, MetricQueryOptions } from './index.js';
5
11
  export declare class SigNozApiBackend implements TelemetryBackend {
@@ -10,15 +16,16 @@ export declare class SigNozApiBackend implements TelemetryBackend {
10
16
  constructor(baseUrl?: string, apiKey?: string);
11
17
  private fetch;
12
18
  /**
13
- * Get nanosecond timestamp for SigNoz queries
19
+ * Get millisecond timestamp for SigNoz v5 API queries
14
20
  */
15
- private getNanoTime;
21
+ private getMillisTime;
16
22
  queryTraces(options: TraceQueryOptions): Promise<TraceSpan[]>;
17
23
  queryLogs(options: LogQueryOptions): Promise<LogRecord[]>;
18
24
  queryMetrics(options: MetricQueryOptions): Promise<MetricDataPoint[]>;
19
25
  healthCheck(): Promise<{
20
26
  status: 'ok' | 'error';
21
27
  message?: string;
28
+ configured?: boolean;
22
29
  }>;
23
30
  /**
24
31
  * Get SigNoz trace viewer URL for a trace ID
@@ -1 +1 @@
1
- {"version":3,"file":"signoz-api.d.ts","sourceRoot":"","sources":["../../src/backends/signoz-api.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAkDpB,qBAAa,gBAAiB,YAAW,gBAAgB;IACvD,IAAI,SAAgB;IACpB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,cAAc,CAA2B;gBAErC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;YAK/B,KAAK;IAkCnB;;OAEG;IACH,OAAO,CAAC,WAAW;IAOb,WAAW,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAuF7D,SAAS,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAsEzD,YAAY,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IA+DrE,WAAW,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAyB1E;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;CASrC"}
1
+ {"version":3,"file":"signoz-api.d.ts","sourceRoot":"","sources":["../../src/backends/signoz-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAqDpB,qBAAa,gBAAiB,YAAW,gBAAgB;IACvD,IAAI,SAAgB;IACpB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,cAAc,CAA2B;gBAErC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;YAS/B,KAAK;IAkCnB;;OAEG;IACH,OAAO,CAAC,aAAa;IAOf,WAAW,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAqG7D,SAAS,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IA0FzD,YAAY,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IA6ErE,WAAW,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAiDhG;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;CAIrC"}