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