observability-toolkit 1.8.0 → 1.8.4

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 (186) hide show
  1. package/README.md +81 -3
  2. package/dist/backends/index.d.ts +119 -0
  3. package/dist/backends/index.d.ts.map +1 -1
  4. package/dist/backends/index.js +57 -0
  5. package/dist/backends/index.js.map +1 -1
  6. package/dist/backends/index.test.d.ts +5 -0
  7. package/dist/backends/index.test.d.ts.map +1 -0
  8. package/dist/backends/index.test.js +156 -0
  9. package/dist/backends/index.test.js.map +1 -0
  10. package/dist/backends/local-jsonl-boolean-search.test.js +8 -27
  11. package/dist/backends/local-jsonl-boolean-search.test.js.map +1 -1
  12. package/dist/backends/local-jsonl-logs.test.d.ts +2 -0
  13. package/dist/backends/local-jsonl-logs.test.d.ts.map +1 -0
  14. package/dist/backends/local-jsonl-logs.test.js +603 -0
  15. package/dist/backends/local-jsonl-logs.test.js.map +1 -0
  16. package/dist/backends/local-jsonl-traces.test.d.ts +2 -0
  17. package/dist/backends/local-jsonl-traces.test.d.ts.map +1 -0
  18. package/dist/backends/local-jsonl-traces.test.js +1723 -0
  19. package/dist/backends/local-jsonl-traces.test.js.map +1 -0
  20. package/dist/backends/local-jsonl.d.ts +4 -1
  21. package/dist/backends/local-jsonl.d.ts.map +1 -1
  22. package/dist/backends/local-jsonl.js +185 -1
  23. package/dist/backends/local-jsonl.js.map +1 -1
  24. package/dist/backends/local-jsonl.test.js +723 -46
  25. package/dist/backends/local-jsonl.test.js.map +1 -1
  26. package/dist/backends/signoz-api.d.ts +32 -0
  27. package/dist/backends/signoz-api.d.ts.map +1 -1
  28. package/dist/backends/signoz-api.js +231 -33
  29. package/dist/backends/signoz-api.js.map +1 -1
  30. package/dist/backends/signoz-api.test.js +410 -63
  31. package/dist/backends/signoz-api.test.js.map +1 -1
  32. package/dist/lib/constants.d.ts +59 -0
  33. package/dist/lib/constants.d.ts.map +1 -1
  34. package/dist/lib/constants.js +252 -6
  35. package/dist/lib/constants.js.map +1 -1
  36. package/dist/lib/constants.test.js +357 -21
  37. package/dist/lib/constants.test.js.map +1 -1
  38. package/dist/lib/edge-cases.test.d.ts +11 -0
  39. package/dist/lib/edge-cases.test.d.ts.map +1 -0
  40. package/dist/lib/edge-cases.test.js +634 -0
  41. package/dist/lib/edge-cases.test.js.map +1 -0
  42. package/dist/lib/error-sanitizer.d.ts +57 -0
  43. package/dist/lib/error-sanitizer.d.ts.map +1 -0
  44. package/dist/lib/error-sanitizer.js +207 -0
  45. package/dist/lib/error-sanitizer.js.map +1 -0
  46. package/dist/lib/error-sanitizer.test.d.ts +8 -0
  47. package/dist/lib/error-sanitizer.test.d.ts.map +1 -0
  48. package/dist/lib/error-sanitizer.test.js +369 -0
  49. package/dist/lib/error-sanitizer.test.js.map +1 -0
  50. package/dist/lib/file-utils.d.ts +134 -0
  51. package/dist/lib/file-utils.d.ts.map +1 -1
  52. package/dist/lib/file-utils.js +395 -9
  53. package/dist/lib/file-utils.js.map +1 -1
  54. package/dist/lib/file-utils.test.js +444 -3
  55. package/dist/lib/file-utils.test.js.map +1 -1
  56. package/dist/lib/indexer.d.ts +9 -1
  57. package/dist/lib/indexer.d.ts.map +1 -1
  58. package/dist/lib/indexer.js +51 -2
  59. package/dist/lib/indexer.js.map +1 -1
  60. package/dist/lib/indexer.test.js +138 -20
  61. package/dist/lib/indexer.test.js.map +1 -1
  62. package/dist/lib/input-validator.d.ts +103 -0
  63. package/dist/lib/input-validator.d.ts.map +1 -0
  64. package/dist/lib/input-validator.js +250 -0
  65. package/dist/lib/input-validator.js.map +1 -0
  66. package/dist/lib/input-validator.test.d.ts +2 -0
  67. package/dist/lib/input-validator.test.d.ts.map +1 -0
  68. package/dist/lib/input-validator.test.js +287 -0
  69. package/dist/lib/input-validator.test.js.map +1 -0
  70. package/dist/lib/query-sanitizer.d.ts +143 -0
  71. package/dist/lib/query-sanitizer.d.ts.map +1 -0
  72. package/dist/lib/query-sanitizer.js +261 -0
  73. package/dist/lib/query-sanitizer.js.map +1 -0
  74. package/dist/lib/query-sanitizer.test.d.ts +5 -0
  75. package/dist/lib/query-sanitizer.test.d.ts.map +1 -0
  76. package/dist/lib/query-sanitizer.test.js +400 -0
  77. package/dist/lib/query-sanitizer.test.js.map +1 -0
  78. package/dist/lib/server-utils.d.ts +80 -0
  79. package/dist/lib/server-utils.d.ts.map +1 -0
  80. package/dist/lib/server-utils.js +141 -0
  81. package/dist/lib/server-utils.js.map +1 -0
  82. package/dist/lib/shared-schemas.d.ts +59 -0
  83. package/dist/lib/shared-schemas.d.ts.map +1 -0
  84. package/dist/lib/shared-schemas.js +58 -0
  85. package/dist/lib/shared-schemas.js.map +1 -0
  86. package/dist/lib/shared-schemas.test.d.ts +5 -0
  87. package/dist/lib/shared-schemas.test.d.ts.map +1 -0
  88. package/dist/lib/shared-schemas.test.js +106 -0
  89. package/dist/lib/shared-schemas.test.js.map +1 -0
  90. package/dist/lib/toon-encoder.d.ts +21 -0
  91. package/dist/lib/toon-encoder.d.ts.map +1 -0
  92. package/dist/lib/toon-encoder.js +46 -0
  93. package/dist/lib/toon-encoder.js.map +1 -0
  94. package/dist/server.d.ts +1 -1
  95. package/dist/server.d.ts.map +1 -1
  96. package/dist/server.js +155 -81
  97. package/dist/server.js.map +1 -1
  98. package/dist/server.test.js +363 -0
  99. package/dist/server.test.js.map +1 -1
  100. package/dist/test-helpers/env-utils.d.ts +65 -0
  101. package/dist/test-helpers/env-utils.d.ts.map +1 -0
  102. package/dist/test-helpers/env-utils.js +94 -0
  103. package/dist/test-helpers/env-utils.js.map +1 -0
  104. package/dist/test-helpers/file-utils.d.ts +93 -0
  105. package/dist/test-helpers/file-utils.d.ts.map +1 -0
  106. package/dist/test-helpers/file-utils.js +206 -0
  107. package/dist/test-helpers/file-utils.js.map +1 -0
  108. package/dist/test-helpers/index.d.ts +10 -0
  109. package/dist/test-helpers/index.d.ts.map +1 -0
  110. package/dist/test-helpers/index.js +28 -0
  111. package/dist/test-helpers/index.js.map +1 -0
  112. package/dist/test-helpers/mock-backends.d.ts +139 -0
  113. package/dist/test-helpers/mock-backends.d.ts.map +1 -0
  114. package/dist/test-helpers/mock-backends.js +227 -0
  115. package/dist/test-helpers/mock-backends.js.map +1 -0
  116. package/dist/test-helpers/mock-backends.test.d.ts +5 -0
  117. package/dist/test-helpers/mock-backends.test.d.ts.map +1 -0
  118. package/dist/test-helpers/mock-backends.test.js +368 -0
  119. package/dist/test-helpers/mock-backends.test.js.map +1 -0
  120. package/dist/test-helpers/schema-validators.d.ts +32 -0
  121. package/dist/test-helpers/schema-validators.d.ts.map +1 -0
  122. package/dist/test-helpers/schema-validators.js +125 -0
  123. package/dist/test-helpers/schema-validators.js.map +1 -0
  124. package/dist/test-helpers/test-data-builders.d.ts +223 -0
  125. package/dist/test-helpers/test-data-builders.d.ts.map +1 -0
  126. package/dist/test-helpers/test-data-builders.js +288 -0
  127. package/dist/test-helpers/test-data-builders.js.map +1 -0
  128. package/dist/test-helpers/test-data-builders.test.d.ts +2 -0
  129. package/dist/test-helpers/test-data-builders.test.d.ts.map +1 -0
  130. package/dist/test-helpers/test-data-builders.test.js +306 -0
  131. package/dist/test-helpers/test-data-builders.test.js.map +1 -0
  132. package/dist/test-helpers/tool-validators.d.ts +28 -0
  133. package/dist/test-helpers/tool-validators.d.ts.map +1 -0
  134. package/dist/test-helpers/tool-validators.js +56 -0
  135. package/dist/test-helpers/tool-validators.js.map +1 -0
  136. package/dist/tools/context-stats.d.ts +1 -0
  137. package/dist/tools/context-stats.d.ts.map +1 -1
  138. package/dist/tools/context-stats.js +9 -5
  139. package/dist/tools/context-stats.js.map +1 -1
  140. package/dist/tools/context-stats.test.js +24 -10
  141. package/dist/tools/context-stats.test.js.map +1 -1
  142. package/dist/tools/get-trace-url.js +2 -2
  143. package/dist/tools/get-trace-url.js.map +1 -1
  144. package/dist/tools/health-check.js +2 -2
  145. package/dist/tools/health-check.js.map +1 -1
  146. package/dist/tools/index.d.ts +1 -0
  147. package/dist/tools/index.d.ts.map +1 -1
  148. package/dist/tools/index.js +1 -0
  149. package/dist/tools/index.js.map +1 -1
  150. package/dist/tools/query-evaluations.d.ts +186 -0
  151. package/dist/tools/query-evaluations.d.ts.map +1 -0
  152. package/dist/tools/query-evaluations.js +351 -0
  153. package/dist/tools/query-evaluations.js.map +1 -0
  154. package/dist/tools/query-evaluations.test.d.ts +5 -0
  155. package/dist/tools/query-evaluations.test.d.ts.map +1 -0
  156. package/dist/tools/query-evaluations.test.js +733 -0
  157. package/dist/tools/query-evaluations.test.js.map +1 -0
  158. package/dist/tools/query-llm-events.d.ts +24 -18
  159. package/dist/tools/query-llm-events.d.ts.map +1 -1
  160. package/dist/tools/query-llm-events.js +103 -60
  161. package/dist/tools/query-llm-events.js.map +1 -1
  162. package/dist/tools/query-llm-events.test.js +271 -9
  163. package/dist/tools/query-llm-events.test.js.map +1 -1
  164. package/dist/tools/query-logs.d.ts +28 -20
  165. package/dist/tools/query-logs.d.ts.map +1 -1
  166. package/dist/tools/query-logs.js +85 -61
  167. package/dist/tools/query-logs.js.map +1 -1
  168. package/dist/tools/query-logs.test.js +74 -145
  169. package/dist/tools/query-logs.test.js.map +1 -1
  170. package/dist/tools/query-metrics.d.ts +20 -20
  171. package/dist/tools/query-metrics.d.ts.map +1 -1
  172. package/dist/tools/query-metrics.js +109 -61
  173. package/dist/tools/query-metrics.js.map +1 -1
  174. package/dist/tools/query-metrics.test.js +26 -61
  175. package/dist/tools/query-metrics.test.js.map +1 -1
  176. package/dist/tools/query-traces.d.ts +24 -22
  177. package/dist/tools/query-traces.d.ts.map +1 -1
  178. package/dist/tools/query-traces.js +95 -70
  179. package/dist/tools/query-traces.js.map +1 -1
  180. package/dist/tools/query-traces.test.js +294 -90
  181. package/dist/tools/query-traces.test.js.map +1 -1
  182. package/dist/tools/setup-claudeignore.js +7 -7
  183. package/dist/tools/setup-claudeignore.js.map +1 -1
  184. package/dist/tools/setup-claudeignore.test.js +4 -25
  185. package/dist/tools/setup-claudeignore.test.js.map +1 -1
  186. package/package.json +3 -4
@@ -0,0 +1,603 @@
1
+ import { describe, it, before, after, beforeEach } from 'node:test';
2
+ import * as assert from 'node:assert';
3
+ import * as path from 'path';
4
+ import { LocalJsonlBackend } from './local-jsonl.js';
5
+ import { getSharedTempDir, clearTempDir, removeSharedTempDir, writeJsonlFile, getTestDate } from '../test-helpers/file-utils.js';
6
+ describe('LocalJsonlBackend', () => {
7
+ let tempDir;
8
+ let backend;
9
+ before(() => {
10
+ tempDir = getSharedTempDir('LocalJsonlBackend-Logs');
11
+ });
12
+ beforeEach(() => {
13
+ clearTempDir(tempDir);
14
+ backend = new LocalJsonlBackend(tempDir);
15
+ });
16
+ after(() => {
17
+ removeSharedTempDir('LocalJsonlBackend-Logs');
18
+ });
19
+ describe('queryLogs', () => {
20
+ it('should read and normalize log records from JSONL files', async () => {
21
+ const today = getTestDate();
22
+ const mockLogs = [
23
+ {
24
+ timestamp: '2026-01-28T10:00:00.000Z',
25
+ severityText: 'ERROR',
26
+ body: 'Connection failed',
27
+ traceId: 'trace1',
28
+ spanId: 'span1',
29
+ resource: { serviceName: 'api-service' },
30
+ attributes: { 'error.type': 'timeout' },
31
+ },
32
+ ];
33
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
34
+ const results = await backend.queryLogs({});
35
+ assert.strictEqual(results.length, 1);
36
+ assert.strictEqual(results[0].severity, 'ERROR');
37
+ assert.strictEqual(results[0].body, 'Connection failed');
38
+ assert.strictEqual(results[0].attributes?.['service.name'], 'api-service');
39
+ assert.strictEqual(results[0].attributes?.['error.type'], 'timeout');
40
+ });
41
+ it('should handle timestamp as ISO string', async () => {
42
+ const today = getTestDate();
43
+ const mockLogs = [
44
+ {
45
+ timestamp: '2026-01-28T10:00:00.123Z',
46
+ body: 'Test log',
47
+ },
48
+ ];
49
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
50
+ const results = await backend.queryLogs({});
51
+ assert.strictEqual(results[0].timestamp, '2026-01-28T10:00:00.123Z');
52
+ });
53
+ it('should convert timestamp from [seconds, nanoseconds] array', async () => {
54
+ const today = getTestDate();
55
+ const mockLogs = [
56
+ {
57
+ timestamp: [1700000000, 123456789], // seconds + nanoseconds
58
+ body: 'Test log',
59
+ },
60
+ ];
61
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
62
+ const results = await backend.queryLogs({});
63
+ // Verify it's a valid ISO string
64
+ assert.match(results[0].timestamp, /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/);
65
+ });
66
+ it('should filter logs by severity (case-insensitive)', async () => {
67
+ const today = getTestDate();
68
+ const mockLogs = [
69
+ { timestamp: '2026-01-28T10:00:00Z', severityText: 'ERROR', body: 'Error 1' },
70
+ { timestamp: '2026-01-28T10:01:00Z', severity: 'WARN', body: 'Warning 1' },
71
+ { timestamp: '2026-01-28T10:02:00Z', severity: 'error', body: 'Error 2' },
72
+ { timestamp: '2026-01-28T10:03:00Z', severity: 'INFO', body: 'Info 1' },
73
+ ];
74
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
75
+ const results = await backend.queryLogs({ severity: 'ERROR' });
76
+ assert.strictEqual(results.length, 2);
77
+ assert.ok(results.every(l => l.severity.toUpperCase() === 'ERROR'));
78
+ });
79
+ it('should filter logs by traceId', async () => {
80
+ const today = getTestDate();
81
+ const mockLogs = [
82
+ { timestamp: '2026-01-28T10:00:00Z', body: 'Log 1', traceId: 'trace1' },
83
+ { timestamp: '2026-01-28T10:01:00Z', body: 'Log 2', traceId: 'trace2' },
84
+ { timestamp: '2026-01-28T10:02:00Z', body: 'Log 3', traceId: 'trace1' },
85
+ ];
86
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
87
+ const results = await backend.queryLogs({ traceId: 'trace1' });
88
+ assert.strictEqual(results.length, 2);
89
+ assert.ok(results.every(l => l.traceId === 'trace1'));
90
+ });
91
+ it('should filter logs by search text (case-insensitive substring)', async () => {
92
+ const today = getTestDate();
93
+ const mockLogs = [
94
+ { timestamp: '2026-01-28T10:00:00Z', body: 'Connection timeout' },
95
+ { timestamp: '2026-01-28T10:01:00Z', body: 'Database query failed' },
96
+ { timestamp: '2026-01-28T10:02:00Z', body: 'Connection reset by peer' },
97
+ ];
98
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
99
+ const results = await backend.queryLogs({ search: 'CONNECTION' });
100
+ assert.strictEqual(results.length, 2);
101
+ assert.ok(results.every(l => l.body.toLowerCase().includes('connection')));
102
+ });
103
+ it('should use severityText if available, fallback to severity', async () => {
104
+ const today = getTestDate();
105
+ const mockLogs = [
106
+ { timestamp: '2026-01-28T10:00:00Z', body: 'Log 1', severityText: 'CUSTOM' },
107
+ { timestamp: '2026-01-28T10:01:00Z', body: 'Log 2', severity: 'WARN' },
108
+ { timestamp: '2026-01-28T10:02:00Z', body: 'Log 3' }, // no severity
109
+ ];
110
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
111
+ const results = await backend.queryLogs({});
112
+ assert.strictEqual(results[0].severity, 'CUSTOM');
113
+ assert.strictEqual(results[1].severity, 'WARN');
114
+ assert.strictEqual(results[2].severity, 'INFO'); // default
115
+ });
116
+ it('should extract instrumentationScope from logs', async () => {
117
+ const today = getTestDate();
118
+ const mockLogs = [
119
+ {
120
+ timestamp: '2026-01-28T10:00:00Z',
121
+ body: 'HTTP request received',
122
+ instrumentationScope: {
123
+ name: '@opentelemetry/instrumentation-http',
124
+ version: '0.48.0',
125
+ schemaUrl: 'https://opentelemetry.io/schemas/1.21.0',
126
+ },
127
+ },
128
+ {
129
+ timestamp: '2026-01-28T10:01:00Z',
130
+ body: 'Custom log from hooks',
131
+ instrumentationScope: {
132
+ name: 'custom-hooks',
133
+ },
134
+ },
135
+ {
136
+ timestamp: '2026-01-28T10:02:00Z',
137
+ body: 'Log without scope',
138
+ },
139
+ ];
140
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
141
+ const results = await backend.queryLogs({});
142
+ assert.strictEqual(results.length, 3);
143
+ // First log: full scope
144
+ assert.strictEqual(results[0].instrumentationScope?.name, '@opentelemetry/instrumentation-http');
145
+ assert.strictEqual(results[0].instrumentationScope?.version, '0.48.0');
146
+ assert.strictEqual(results[0].instrumentationScope?.schemaUrl, 'https://opentelemetry.io/schemas/1.21.0');
147
+ // Second log: name only
148
+ assert.strictEqual(results[1].instrumentationScope?.name, 'custom-hooks');
149
+ assert.strictEqual(results[1].instrumentationScope?.version, undefined);
150
+ // Third log: no scope
151
+ assert.strictEqual(results[2].instrumentationScope, undefined);
152
+ });
153
+ it('should apply limit and offset to log results', async () => {
154
+ const today = getTestDate();
155
+ const mockLogs = Array.from({ length: 200 }, (_, i) => ({
156
+ timestamp: new Date(Date.now() + i * 1000).toISOString(),
157
+ body: `Log ${i}`,
158
+ }));
159
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
160
+ const results = await backend.queryLogs({ limit: 50, offset: 75 });
161
+ assert.strictEqual(results.length, 50);
162
+ assert.strictEqual(results[0].body, 'Log 75');
163
+ });
164
+ it('should handle empty body field', async () => {
165
+ const today = getTestDate();
166
+ const mockLogs = [
167
+ { timestamp: '2026-01-28T10:00:00Z', body: 'Normal log' },
168
+ { timestamp: '2026-01-28T10:01:00Z' }, // missing body
169
+ ];
170
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
171
+ const results = await backend.queryLogs({});
172
+ assert.strictEqual(results.length, 2);
173
+ assert.strictEqual(results[1].body, '');
174
+ });
175
+ it('should set severityNumber based on severity text', async () => {
176
+ const today = getTestDate();
177
+ const mockLogs = [
178
+ { timestamp: '2026-01-28T10:00:00Z', severityText: 'TRACE', body: 'Trace log' },
179
+ { timestamp: '2026-01-28T10:01:00Z', severityText: 'DEBUG', body: 'Debug log' },
180
+ { timestamp: '2026-01-28T10:02:00Z', severityText: 'INFO', body: 'Info log' },
181
+ { timestamp: '2026-01-28T10:03:00Z', severityText: 'WARN', body: 'Warn log' },
182
+ { timestamp: '2026-01-28T10:04:00Z', severityText: 'ERROR', body: 'Error log' },
183
+ { timestamp: '2026-01-28T10:05:00Z', severityText: 'FATAL', body: 'Fatal log' },
184
+ ];
185
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
186
+ const results = await backend.queryLogs({});
187
+ assert.strictEqual(results.length, 6);
188
+ assert.strictEqual(results[0].severityNumber, 1); // TRACE
189
+ assert.strictEqual(results[1].severityNumber, 5); // DEBUG
190
+ assert.strictEqual(results[2].severityNumber, 9); // INFO
191
+ assert.strictEqual(results[3].severityNumber, 13); // WARN
192
+ assert.strictEqual(results[4].severityNumber, 17); // ERROR
193
+ assert.strictEqual(results[5].severityNumber, 21); // FATAL
194
+ });
195
+ it('should handle lowercase severity when setting severityNumber', async () => {
196
+ const today = getTestDate();
197
+ const mockLogs = [
198
+ { timestamp: '2026-01-28T10:00:00Z', severity: 'error', body: 'Lowercase error' },
199
+ { timestamp: '2026-01-28T10:01:00Z', severity: 'warn', body: 'Lowercase warn' },
200
+ { timestamp: '2026-01-28T10:02:00Z', severity: 'info', body: 'Lowercase info' },
201
+ ];
202
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
203
+ const results = await backend.queryLogs({});
204
+ assert.strictEqual(results.length, 3);
205
+ assert.strictEqual(results[0].severityNumber, 17); // error -> ERROR -> 17
206
+ assert.strictEqual(results[1].severityNumber, 13); // warn -> WARN -> 13
207
+ assert.strictEqual(results[2].severityNumber, 9); // info -> INFO -> 9
208
+ });
209
+ it('should set severityNumber to undefined for unknown severity levels', async () => {
210
+ const today = getTestDate();
211
+ const mockLogs = [
212
+ { timestamp: '2026-01-28T10:00:00Z', severityText: 'CUSTOM', body: 'Custom severity' },
213
+ { timestamp: '2026-01-28T10:01:00Z', severityText: 'VERBOSE', body: 'Verbose severity' },
214
+ ];
215
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
216
+ const results = await backend.queryLogs({});
217
+ assert.strictEqual(results.length, 2);
218
+ assert.strictEqual(results[0].severityNumber, undefined);
219
+ assert.strictEqual(results[1].severityNumber, undefined);
220
+ });
221
+ it('should set severityNumber to 9 (INFO) when severity defaults', async () => {
222
+ const today = getTestDate();
223
+ const mockLogs = [
224
+ { timestamp: '2026-01-28T10:00:00Z', body: 'No severity specified' },
225
+ ];
226
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
227
+ const results = await backend.queryLogs({});
228
+ assert.strictEqual(results.length, 1);
229
+ assert.strictEqual(results[0].severity, 'INFO');
230
+ assert.strictEqual(results[0].severityNumber, 9);
231
+ });
232
+ it('should exclude logs matching excludeSearch', async () => {
233
+ const today = getTestDate();
234
+ const mockLogs = [
235
+ { timestamp: '2026-01-28T10:00:00Z', body: 'Connection failed' },
236
+ { timestamp: '2026-01-28T10:01:00Z', body: 'Request successful' },
237
+ { timestamp: '2026-01-28T10:02:00Z', body: 'Connection timeout' },
238
+ ];
239
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
240
+ const results = await backend.queryLogs({ excludeSearch: 'connection' });
241
+ assert.strictEqual(results.length, 1);
242
+ assert.strictEqual(results[0].body, 'Request successful');
243
+ });
244
+ it('should combine search with excludeSearch', async () => {
245
+ const today = getTestDate();
246
+ const mockLogs = [
247
+ { timestamp: '2026-01-28T10:00:00Z', body: 'User login successful' },
248
+ { timestamp: '2026-01-28T10:01:00Z', body: 'User login failed' },
249
+ { timestamp: '2026-01-28T10:02:00Z', body: 'System startup' },
250
+ { timestamp: '2026-01-28T10:03:00Z', body: 'User logout' },
251
+ ];
252
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
253
+ const results = await backend.queryLogs({
254
+ search: 'user',
255
+ excludeSearch: 'failed',
256
+ });
257
+ assert.strictEqual(results.length, 2);
258
+ assert.ok(results.some(l => l.body === 'User login successful'));
259
+ assert.ok(results.some(l => l.body === 'User logout'));
260
+ });
261
+ it('should filter logs by attributeExists - all must exist', async () => {
262
+ const today = getTestDate();
263
+ const mockLogs = [
264
+ {
265
+ timestamp: '2026-01-28T10:00:00Z',
266
+ body: 'Log 1',
267
+ attributes: { 'request.id': 'abc', 'user.id': '123' },
268
+ },
269
+ {
270
+ timestamp: '2026-01-28T10:01:00Z',
271
+ body: 'Log 2',
272
+ attributes: { 'request.id': 'def' }, // missing user.id
273
+ },
274
+ {
275
+ timestamp: '2026-01-28T10:02:00Z',
276
+ body: 'Log 3',
277
+ attributes: { 'other.attr': 'value' }, // missing both
278
+ },
279
+ ];
280
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
281
+ const results = await backend.queryLogs({
282
+ attributeExists: ['request.id', 'user.id'],
283
+ });
284
+ assert.strictEqual(results.length, 1);
285
+ assert.strictEqual(results[0].body, 'Log 1');
286
+ });
287
+ it('should filter logs by attributeNotExists - exclude if any exist', async () => {
288
+ const today = getTestDate();
289
+ const mockLogs = [
290
+ {
291
+ timestamp: '2026-01-28T10:00:00Z',
292
+ body: 'Log with error',
293
+ attributes: { 'request.id': 'abc', 'error.message': 'timeout' },
294
+ },
295
+ {
296
+ timestamp: '2026-01-28T10:01:00Z',
297
+ body: 'Clean log',
298
+ attributes: { 'request.id': 'def' },
299
+ },
300
+ {
301
+ timestamp: '2026-01-28T10:02:00Z',
302
+ body: 'Log with exception',
303
+ attributes: { 'request.id': 'ghi', 'exception.type': 'NullPointer' },
304
+ },
305
+ ];
306
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
307
+ const results = await backend.queryLogs({
308
+ attributeNotExists: ['error.message', 'exception.type'],
309
+ });
310
+ assert.strictEqual(results.length, 1);
311
+ assert.strictEqual(results[0].body, 'Clean log');
312
+ });
313
+ it('should combine search with attribute filters', async () => {
314
+ const today = getTestDate();
315
+ const mockLogs = [
316
+ {
317
+ timestamp: '2026-01-28T10:00:00Z',
318
+ body: 'API request completed',
319
+ attributes: { 'request.id': 'abc', 'http.status_code': 200 },
320
+ },
321
+ {
322
+ timestamp: '2026-01-28T10:01:00Z',
323
+ body: 'API request failed',
324
+ attributes: { 'request.id': 'def' }, // missing status_code
325
+ },
326
+ {
327
+ timestamp: '2026-01-28T10:02:00Z',
328
+ body: 'Database query completed',
329
+ attributes: { 'request.id': 'ghi', 'http.status_code': 200 },
330
+ },
331
+ ];
332
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
333
+ const results = await backend.queryLogs({
334
+ search: 'API',
335
+ attributeExists: ['http.status_code'],
336
+ });
337
+ assert.strictEqual(results.length, 1);
338
+ assert.strictEqual(results[0].body, 'API request completed');
339
+ });
340
+ it('should filter logs by numericFilter with gt operator', async () => {
341
+ const today = getTestDate();
342
+ const mockLogs = [
343
+ {
344
+ timestamp: '2026-01-28T10:00:00Z',
345
+ body: 'Request completed',
346
+ attributes: { 'http.status_code': 200 },
347
+ },
348
+ {
349
+ timestamp: '2026-01-28T10:01:00Z',
350
+ body: 'Request failed',
351
+ attributes: { 'http.status_code': 500 },
352
+ },
353
+ {
354
+ timestamp: '2026-01-28T10:02:00Z',
355
+ body: 'Request redirected',
356
+ attributes: { 'http.status_code': 302 },
357
+ },
358
+ ];
359
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
360
+ const results = await backend.queryLogs({
361
+ numericFilter: [{ attribute: 'http.status_code', operator: 'gt', value: 299 }],
362
+ });
363
+ assert.strictEqual(results.length, 2);
364
+ assert.ok(results.some(l => l.body === 'Request failed'));
365
+ assert.ok(results.some(l => l.body === 'Request redirected'));
366
+ });
367
+ it('should filter logs by numericFilter with lt operator', async () => {
368
+ const today = getTestDate();
369
+ const mockLogs = [
370
+ {
371
+ timestamp: '2026-01-28T10:00:00Z',
372
+ body: 'Small response',
373
+ attributes: { 'response.size': 100 },
374
+ },
375
+ {
376
+ timestamp: '2026-01-28T10:01:00Z',
377
+ body: 'Large response',
378
+ attributes: { 'response.size': 5000 },
379
+ },
380
+ ];
381
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
382
+ const results = await backend.queryLogs({
383
+ numericFilter: [{ attribute: 'response.size', operator: 'lt', value: 1000 }],
384
+ });
385
+ assert.strictEqual(results.length, 1);
386
+ assert.strictEqual(results[0].body, 'Small response');
387
+ });
388
+ it('should filter logs by multiple numericFilter conditions', async () => {
389
+ const today = getTestDate();
390
+ const mockLogs = [
391
+ {
392
+ timestamp: '2026-01-28T10:00:00Z',
393
+ body: 'Fast small response',
394
+ attributes: { 'response.size': 100, 'response.time_ms': 50 },
395
+ },
396
+ {
397
+ timestamp: '2026-01-28T10:01:00Z',
398
+ body: 'Slow large response',
399
+ attributes: { 'response.size': 5000, 'response.time_ms': 2000 },
400
+ },
401
+ {
402
+ timestamp: '2026-01-28T10:02:00Z',
403
+ body: 'Fast large response',
404
+ attributes: { 'response.size': 5000, 'response.time_ms': 100 },
405
+ },
406
+ ];
407
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
408
+ const results = await backend.queryLogs({
409
+ numericFilter: [
410
+ { attribute: 'response.size', operator: 'gte', value: 1000 },
411
+ { attribute: 'response.time_ms', operator: 'lte', value: 500 },
412
+ ],
413
+ });
414
+ assert.strictEqual(results.length, 1);
415
+ assert.strictEqual(results[0].body, 'Fast large response');
416
+ });
417
+ it('should skip logs when numericFilter attribute is missing or not a number', async () => {
418
+ const today = getTestDate();
419
+ const mockLogs = [
420
+ {
421
+ timestamp: '2026-01-28T10:00:00Z',
422
+ body: 'Log with numeric',
423
+ attributes: { 'count': 100 },
424
+ },
425
+ {
426
+ timestamp: '2026-01-28T10:01:00Z',
427
+ body: 'Log with string',
428
+ attributes: { 'count': 'one hundred' },
429
+ },
430
+ {
431
+ timestamp: '2026-01-28T10:02:00Z',
432
+ body: 'Log without count',
433
+ attributes: { 'other': 'value' },
434
+ },
435
+ ];
436
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
437
+ const results = await backend.queryLogs({
438
+ numericFilter: [{ attribute: 'count', operator: 'gte', value: 50 }],
439
+ });
440
+ assert.strictEqual(results.length, 1);
441
+ assert.strictEqual(results[0].body, 'Log with numeric');
442
+ });
443
+ it('should combine numericFilter with search and severity', async () => {
444
+ const today = getTestDate();
445
+ const mockLogs = [
446
+ {
447
+ timestamp: '2026-01-28T10:00:00Z',
448
+ body: 'API Error: rate limit',
449
+ severity: 'ERROR',
450
+ attributes: { 'http.status_code': 429, 'retry_count': 3 },
451
+ },
452
+ {
453
+ timestamp: '2026-01-28T10:01:00Z',
454
+ body: 'API Error: server error',
455
+ severity: 'ERROR',
456
+ attributes: { 'http.status_code': 500, 'retry_count': 1 },
457
+ },
458
+ {
459
+ timestamp: '2026-01-28T10:02:00Z',
460
+ body: 'API Error: timeout',
461
+ severity: 'WARN',
462
+ attributes: { 'http.status_code': 408, 'retry_count': 5 },
463
+ },
464
+ ];
465
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
466
+ const results = await backend.queryLogs({
467
+ search: 'API Error',
468
+ severity: 'ERROR',
469
+ numericFilter: [{ attribute: 'retry_count', operator: 'gt', value: 2 }],
470
+ });
471
+ assert.strictEqual(results.length, 1);
472
+ assert.strictEqual(results[0].body, 'API Error: rate limit');
473
+ });
474
+ it('should extract fields from JSON log body using dot notation', async () => {
475
+ const today = getTestDate();
476
+ const mockLogs = [
477
+ {
478
+ timestamp: '2026-01-28T10:00:00Z',
479
+ body: '{"user":{"id":"user123","name":"Alice"},"request":{"method":"POST","path":"/api/v1/users"}}',
480
+ },
481
+ {
482
+ timestamp: '2026-01-28T10:01:00Z',
483
+ body: '{"user":{"id":"user456"},"request":{"method":"GET"}}',
484
+ },
485
+ ];
486
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
487
+ const results = await backend.queryLogs({
488
+ extractFields: ['user.id', 'request.method'],
489
+ });
490
+ assert.strictEqual(results.length, 2);
491
+ assert.deepStrictEqual(results[0].extractedFields, {
492
+ 'user.id': 'user123',
493
+ 'request.method': 'POST',
494
+ });
495
+ assert.deepStrictEqual(results[1].extractedFields, {
496
+ 'user.id': 'user456',
497
+ 'request.method': 'GET',
498
+ });
499
+ });
500
+ it('should handle missing fields gracefully during extraction', async () => {
501
+ const today = getTestDate();
502
+ const mockLogs = [
503
+ {
504
+ timestamp: '2026-01-28T10:00:00Z',
505
+ body: '{"user":{"id":"user123"},"status":"ok"}',
506
+ },
507
+ ];
508
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
509
+ const results = await backend.queryLogs({
510
+ extractFields: ['user.id', 'user.name', 'nonexistent.path'],
511
+ });
512
+ assert.strictEqual(results.length, 1);
513
+ // Only user.id exists, user.name and nonexistent.path are undefined
514
+ assert.deepStrictEqual(results[0].extractedFields, {
515
+ 'user.id': 'user123',
516
+ });
517
+ });
518
+ it('should not extract fields from non-JSON log bodies', async () => {
519
+ const today = getTestDate();
520
+ const mockLogs = [
521
+ {
522
+ timestamp: '2026-01-28T10:00:00Z',
523
+ body: 'Plain text log message',
524
+ },
525
+ {
526
+ timestamp: '2026-01-28T10:01:00Z',
527
+ body: '[2026-01-28] INFO: Starting service',
528
+ },
529
+ ];
530
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
531
+ const results = await backend.queryLogs({
532
+ extractFields: ['user.id', 'message'],
533
+ });
534
+ assert.strictEqual(results.length, 2);
535
+ assert.strictEqual(results[0].extractedFields, undefined);
536
+ assert.strictEqual(results[1].extractedFields, undefined);
537
+ });
538
+ it('should not extract fields when extractFields is empty', async () => {
539
+ const today = getTestDate();
540
+ const mockLogs = [
541
+ {
542
+ timestamp: '2026-01-28T10:00:00Z',
543
+ body: '{"user":{"id":"user123"}}',
544
+ },
545
+ ];
546
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
547
+ const results = await backend.queryLogs({
548
+ extractFields: [],
549
+ });
550
+ assert.strictEqual(results.length, 1);
551
+ assert.strictEqual(results[0].extractedFields, undefined);
552
+ });
553
+ it('should extract deeply nested fields', async () => {
554
+ const today = getTestDate();
555
+ const mockLogs = [
556
+ {
557
+ timestamp: '2026-01-28T10:00:00Z',
558
+ body: '{"response":{"data":{"items":[1,2,3],"meta":{"count":3}}}}',
559
+ },
560
+ ];
561
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
562
+ const results = await backend.queryLogs({
563
+ extractFields: ['response.data.meta.count', 'response.data.items'],
564
+ });
565
+ assert.strictEqual(results.length, 1);
566
+ assert.deepStrictEqual(results[0].extractedFields, {
567
+ 'response.data.meta.count': 3,
568
+ 'response.data.items': [1, 2, 3],
569
+ });
570
+ });
571
+ it('should handle invalid JSON gracefully during extraction', async () => {
572
+ const today = getTestDate();
573
+ const mockLogs = [
574
+ {
575
+ timestamp: '2026-01-28T10:00:00Z',
576
+ body: '{invalid json',
577
+ },
578
+ ];
579
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
580
+ const results = await backend.queryLogs({
581
+ extractFields: ['user.id'],
582
+ });
583
+ assert.strictEqual(results.length, 1);
584
+ assert.strictEqual(results[0].extractedFields, undefined);
585
+ });
586
+ it('should return undefined extractedFields when no fields match', async () => {
587
+ const today = getTestDate();
588
+ const mockLogs = [
589
+ {
590
+ timestamp: '2026-01-28T10:00:00Z',
591
+ body: '{"foo":"bar"}',
592
+ },
593
+ ];
594
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
595
+ const results = await backend.queryLogs({
596
+ extractFields: ['nonexistent.field', 'another.missing'],
597
+ });
598
+ assert.strictEqual(results.length, 1);
599
+ assert.strictEqual(results[0].extractedFields, undefined);
600
+ });
601
+ });
602
+ });
603
+ //# sourceMappingURL=local-jsonl-logs.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-jsonl-logs.test.js","sourceRoot":"","sources":["../../src/backends/local-jsonl-logs.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=local-jsonl-traces.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-jsonl-traces.test.d.ts","sourceRoot":"","sources":["../../src/backends/local-jsonl-traces.test.ts"],"names":[],"mappings":""}