observability-toolkit 1.3.0 → 1.5.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 (102) hide show
  1. package/README.md +52 -3
  2. package/dist/backends/index.d.ts +108 -1
  3. package/dist/backends/index.d.ts.map +1 -1
  4. package/dist/backends/local-jsonl-boolean-search.test.d.ts +2 -0
  5. package/dist/backends/local-jsonl-boolean-search.test.d.ts.map +1 -0
  6. package/dist/backends/local-jsonl-boolean-search.test.js +154 -0
  7. package/dist/backends/local-jsonl-boolean-search.test.js.map +1 -0
  8. package/dist/backends/local-jsonl.d.ts +73 -2
  9. package/dist/backends/local-jsonl.d.ts.map +1 -1
  10. package/dist/backends/local-jsonl.js +768 -103
  11. package/dist/backends/local-jsonl.js.map +1 -1
  12. package/dist/backends/local-jsonl.test.js +3326 -271
  13. package/dist/backends/local-jsonl.test.js.map +1 -1
  14. package/dist/backends/signoz-api.d.ts +13 -1
  15. package/dist/backends/signoz-api.d.ts.map +1 -1
  16. package/dist/backends/signoz-api.integration.test.d.ts +8 -0
  17. package/dist/backends/signoz-api.integration.test.d.ts.map +1 -0
  18. package/dist/backends/signoz-api.integration.test.js +137 -0
  19. package/dist/backends/signoz-api.integration.test.js.map +1 -0
  20. package/dist/backends/signoz-api.js +384 -42
  21. package/dist/backends/signoz-api.js.map +1 -1
  22. package/dist/backends/signoz-api.test.js +821 -325
  23. package/dist/backends/signoz-api.test.js.map +1 -1
  24. package/dist/lib/cache.d.ts +20 -0
  25. package/dist/lib/cache.d.ts.map +1 -0
  26. package/dist/lib/cache.js +63 -0
  27. package/dist/lib/cache.js.map +1 -0
  28. package/dist/lib/constants.d.ts +27 -0
  29. package/dist/lib/constants.d.ts.map +1 -1
  30. package/dist/lib/constants.js +70 -0
  31. package/dist/lib/constants.js.map +1 -1
  32. package/dist/lib/constants.test.js +183 -1
  33. package/dist/lib/constants.test.js.map +1 -1
  34. package/dist/lib/file-utils.d.ts +53 -1
  35. package/dist/lib/file-utils.d.ts.map +1 -1
  36. package/dist/lib/file-utils.js +142 -3
  37. package/dist/lib/file-utils.js.map +1 -1
  38. package/dist/lib/file-utils.test.js +228 -1
  39. package/dist/lib/file-utils.test.js.map +1 -1
  40. package/dist/lib/indexer.d.ts +78 -0
  41. package/dist/lib/indexer.d.ts.map +1 -0
  42. package/dist/lib/indexer.js +277 -0
  43. package/dist/lib/indexer.js.map +1 -0
  44. package/dist/lib/indexer.test.d.ts +2 -0
  45. package/dist/lib/indexer.test.d.ts.map +1 -0
  46. package/dist/lib/indexer.test.js +392 -0
  47. package/dist/lib/indexer.test.js.map +1 -0
  48. package/dist/lib/otlp-export.d.ts +178 -0
  49. package/dist/lib/otlp-export.d.ts.map +1 -0
  50. package/dist/lib/otlp-export.js +382 -0
  51. package/dist/lib/otlp-export.js.map +1 -0
  52. package/dist/server.js +48 -65
  53. package/dist/server.js.map +1 -1
  54. package/dist/server.test.d.ts +5 -0
  55. package/dist/server.test.d.ts.map +1 -0
  56. package/dist/server.test.js +547 -0
  57. package/dist/server.test.js.map +1 -0
  58. package/dist/tools/context-stats.test.js +126 -0
  59. package/dist/tools/context-stats.test.js.map +1 -1
  60. package/dist/tools/get-trace-url.d.ts.map +1 -1
  61. package/dist/tools/get-trace-url.js +5 -1
  62. package/dist/tools/get-trace-url.js.map +1 -1
  63. package/dist/tools/get-trace-url.test.js +12 -6
  64. package/dist/tools/get-trace-url.test.js.map +1 -1
  65. package/dist/tools/health-check.d.ts +9 -2
  66. package/dist/tools/health-check.d.ts.map +1 -1
  67. package/dist/tools/health-check.js +66 -27
  68. package/dist/tools/health-check.js.map +1 -1
  69. package/dist/tools/health-check.test.js +89 -96
  70. package/dist/tools/health-check.test.js.map +1 -1
  71. package/dist/tools/query-llm-events.d.ts +2 -2
  72. package/dist/tools/query-llm-events.js +3 -3
  73. package/dist/tools/query-llm-events.js.map +1 -1
  74. package/dist/tools/query-logs.d.ts +12 -10
  75. package/dist/tools/query-logs.d.ts.map +1 -1
  76. package/dist/tools/query-logs.js +5 -5
  77. package/dist/tools/query-logs.js.map +1 -1
  78. package/dist/tools/query-logs.test.js +22 -2
  79. package/dist/tools/query-logs.test.js.map +1 -1
  80. package/dist/tools/query-metrics.d.ts +12 -14
  81. package/dist/tools/query-metrics.d.ts.map +1 -1
  82. package/dist/tools/query-metrics.js +11 -13
  83. package/dist/tools/query-metrics.js.map +1 -1
  84. package/dist/tools/query-metrics.test.js +134 -96
  85. package/dist/tools/query-metrics.test.js.map +1 -1
  86. package/dist/tools/query-traces.d.ts +16 -17
  87. package/dist/tools/query-traces.d.ts.map +1 -1
  88. package/dist/tools/query-traces.js +11 -14
  89. package/dist/tools/query-traces.js.map +1 -1
  90. package/dist/tools/query-traces.test.js +144 -48
  91. package/dist/tools/query-traces.test.js.map +1 -1
  92. package/dist/tools/setup-claudeignore.d.ts +36 -10
  93. package/dist/tools/setup-claudeignore.d.ts.map +1 -1
  94. package/dist/tools/setup-claudeignore.js +193 -33
  95. package/dist/tools/setup-claudeignore.js.map +1 -1
  96. package/dist/tools/setup-claudeignore.test.js +286 -41
  97. package/dist/tools/setup-claudeignore.test.js.map +1 -1
  98. package/dist/tools/signoz.integration.test.d.ts +8 -0
  99. package/dist/tools/signoz.integration.test.d.ts.map +1 -0
  100. package/dist/tools/signoz.integration.test.js +141 -0
  101. package/dist/tools/signoz.integration.test.js.map +1 -0
  102. package/package.json +6 -3
package/README.md CHANGED
@@ -21,10 +21,11 @@ claude mcp add observability-toolkit -- node ~/.claude/mcp-servers/observability
21
21
  | `obs_query_traces` | Query traces from local JSONL or SigNoz |
22
22
  | `obs_query_metrics` | Query metrics with aggregation support |
23
23
  | `obs_query_logs` | Query logs by severity, search text, trace ID |
24
+ | `obs_query_llm_events` | Query LLM events with token usage and duration metrics |
24
25
  | `obs_health_check` | Check telemetry system health |
25
26
  | `obs_context_stats` | Get context window utilization stats |
26
27
  | `obs_get_trace_url` | Get SigNoz trace viewer URL (requires SigNoz) |
27
- | `obs_setup_claudeignore` | Add telemetry/ to .claudeignore |
28
+ | `obs_setup_claudeignore` | Add entries to .claudeignore (telemetry, test files, coverage) |
28
29
 
29
30
  ## Configuration
30
31
 
@@ -44,8 +45,26 @@ The server works standalone with local JSONL files. SigNoz integration is option
44
45
  obs_query_traces({ backend: "local", limit: 10 })
45
46
  obs_query_traces({ traceId: "abc123..." })
46
47
  obs_query_traces({ serviceName: "claude-code", minDurationMs: 100 })
48
+ obs_query_traces({ attributeFilter: { "agent.source_type": "lazy" } })
47
49
  ```
48
50
 
51
+ ### Filterable Attributes
52
+
53
+ Use `attributeFilter` to query by span attributes:
54
+
55
+ | Attribute | Values | Description |
56
+ |-----------|--------|-------------|
57
+ | `agent.type` | string | Agent name (e.g., "Explore", "auto-error-resolver") |
58
+ | `agent.source_type` | `active`, `lazy`, `builtin`, `settings` | Where agent is defined |
59
+ | `agent.category` | string | Agent category (e.g., "error-handling", "code") |
60
+ | `plugin.name` | string | Skill/plugin name |
61
+ | `plugin.source_type` | `active`, `lazy`, `settings` | Where skill is defined |
62
+ | `plugin.category` | string | Skill category |
63
+ | `mcp.server` | string | MCP server name |
64
+ | `mcp.tool` | string | MCP tool name |
65
+ | `builtin.tool` | string | Built-in tool name (Read, Write, Bash, etc.) |
66
+ | `hook.type` | `agent`, `plugin`, `mcp`, `builtin` | Hook handler type |
67
+
49
68
  ### Query logs
50
69
 
51
70
  ```
@@ -61,6 +80,14 @@ obs_query_metrics({ metricName: "session.context.size" })
61
80
  obs_query_metrics({ metricName: "gen_ai.client.token.usage", aggregation: "sum" })
62
81
  ```
63
82
 
83
+ ### Query LLM events
84
+
85
+ ```
86
+ obs_query_llm_events({})
87
+ obs_query_llm_events({ model: "claude-opus-4-5", limit: 10 })
88
+ obs_query_llm_events({ provider: "anthropic", startDate: "2026-01-28" })
89
+ ```
90
+
64
91
  ### Health check
65
92
 
66
93
  ```
@@ -85,17 +112,31 @@ obs_get_trace_url({ traceId: "abc123..." })
85
112
  ```
86
113
  obs_setup_claudeignore({})
87
114
  obs_setup_claudeignore({ dryRun: true })
88
- obs_setup_claudeignore({ entry: "telemetry/", path: "/path/to/.claudeignore" })
115
+ obs_setup_claudeignore({ includeDefaults: false, entry: "custom/" })
116
+ obs_setup_claudeignore({ entries: ["logs/", "tmp/", "*.bak"] })
89
117
  ```
90
118
 
119
+ Default entries added when `includeDefaults: true` (default):
120
+ - `telemetry/` - telemetry data
121
+ - `*.test.ts` - TypeScript test files
122
+ - `*.test.js` - JavaScript test files
123
+ - `coverage/` - coverage reports
124
+
91
125
  ## Data Sources
92
126
 
93
127
  ### Local JSONL (Default)
94
128
 
95
- Reads telemetry data from `~/.claude/telemetry/`:
129
+ Automatically scans multiple telemetry directories:
130
+ - **Global**: `~/.claude/telemetry/` (always checked)
131
+ - **Project-local**: `.claude/telemetry/`, `telemetry/`, `.telemetry/` (checked if they exist in cwd)
132
+
133
+ This allows querying both global Claude Code telemetry and project-specific telemetry.
134
+
135
+ File patterns:
96
136
  - `traces-YYYY-MM-DD.jsonl` - Trace spans
97
137
  - `logs-YYYY-MM-DD.jsonl` - Log records
98
138
  - `metrics-YYYY-MM-DD.jsonl` - Metric data points
139
+ - `llm-events-YYYY-MM-DD.jsonl` - LLM events
99
140
 
100
141
  ### SigNoz Cloud (Optional)
101
142
 
@@ -112,7 +153,15 @@ Use `backend: "signoz"` in queries to explicitly use SigNoz, or `backend: "auto"
112
153
  cd ~/.claude/mcp-servers/observability-toolkit
113
154
  npm install
114
155
  npm run build
156
+ npm test # 617 tests
115
157
  npm run start
116
158
  ```
117
159
 
160
+ ## Documentation
161
+
162
+ - [ROADMAP.md](docs/ROADMAP.md) - Improvement roadmap with priorities
163
+ - [code-review.md](docs/code-review.md) - Code review findings
164
+ - [security-audit.md](docs/security-audit.md) - Security audit report
165
+ - [observability-audit.md](docs/observability-audit.md) - Observability best practices audit
166
+
118
167
 
@@ -1,6 +1,25 @@
1
1
  /**
2
2
  * Backend interface for telemetry data sources
3
3
  */
4
+ /**
5
+ * InstrumentationScope identifies the library/module that produced the telemetry
6
+ * https://opentelemetry.io/docs/specs/otel/common/
7
+ */
8
+ export interface InstrumentationScope {
9
+ name: string;
10
+ version?: string;
11
+ schemaUrl?: string;
12
+ }
13
+ /**
14
+ * SpanLink connects a span to another span in the same or different trace.
15
+ * Used for batch processing, fan-out operations, or causal relationships.
16
+ * https://opentelemetry.io/docs/concepts/signals/traces/#span-links
17
+ */
18
+ export interface SpanLink {
19
+ traceId: string;
20
+ spanId: string;
21
+ attributes?: Record<string, unknown>;
22
+ }
4
23
  export interface TraceSpan {
5
24
  traceId: string;
6
25
  spanId: string;
@@ -14,51 +33,135 @@ export interface TraceSpan {
14
33
  code: number;
15
34
  message?: string;
16
35
  };
36
+ /** Human-readable status code: 'UNSET' (0), 'OK' (1), 'ERROR' (2) */
37
+ statusCode?: 'UNSET' | 'OK' | 'ERROR';
17
38
  attributes?: Record<string, unknown>;
18
39
  events?: Array<{
19
40
  name: string;
20
41
  timestamp: number;
21
42
  attributes?: Record<string, unknown>;
22
43
  }>;
44
+ /** SpanLinks connect this span to other spans in the same or different traces */
45
+ links?: SpanLink[];
46
+ /** InstrumentationScope identifies the library/module that produced this span */
47
+ instrumentationScope?: InstrumentationScope;
23
48
  }
24
49
  export interface LogRecord {
25
50
  timestamp: string;
26
51
  severity: string;
52
+ severityNumber?: number;
27
53
  body: string;
28
54
  traceId?: string;
29
55
  spanId?: string;
30
56
  attributes?: Record<string, unknown>;
57
+ /** InstrumentationScope identifies the library/module that produced this log */
58
+ instrumentationScope?: InstrumentationScope;
59
+ /** Extracted field values from JSON log body */
60
+ extractedFields?: Record<string, unknown>;
61
+ }
62
+ export interface HistogramBucket {
63
+ le: number;
64
+ count: number;
31
65
  }
66
+ export interface HistogramData {
67
+ buckets: HistogramBucket[];
68
+ sum: number;
69
+ count: number;
70
+ }
71
+ /**
72
+ * Exemplar links a metric data point to a specific trace span.
73
+ * Useful for debugging high latency, errors, or other notable measurements.
74
+ * https://opentelemetry.io/docs/specs/otel/metrics/data-model/#exemplars
75
+ */
76
+ export interface Exemplar {
77
+ timestamp: string;
78
+ value: number;
79
+ traceId?: string;
80
+ spanId?: string;
81
+ attributes?: Record<string, unknown>;
82
+ }
83
+ /**
84
+ * Aggregation temporality for metrics
85
+ * https://opentelemetry.io/docs/specs/otel/metrics/data-model/#temporality
86
+ *
87
+ * - UNSPECIFIED: Temporality is unknown or not applicable
88
+ * - DELTA: Values represent change since last report (e.g., requests in the last minute)
89
+ * - CUMULATIVE: Values represent total since start (e.g., total requests since process start)
90
+ */
91
+ export type AggregationTemporality = 'UNSPECIFIED' | 'DELTA' | 'CUMULATIVE';
32
92
  export interface MetricDataPoint {
33
93
  timestamp: string;
34
94
  name: string;
35
95
  value: number;
36
96
  unit?: string;
37
97
  attributes?: Record<string, unknown>;
98
+ histogram?: HistogramData;
99
+ exemplars?: Exemplar[];
100
+ aggregationTemporality?: AggregationTemporality;
38
101
  }
39
102
  export interface QueryOptions {
40
103
  startDate?: string;
41
104
  endDate?: string;
42
105
  limit?: number;
43
106
  offset?: number;
107
+ cursor?: string;
108
+ }
109
+ /**
110
+ * Paginated result wrapper for cursor-based pagination
111
+ */
112
+ export interface PaginatedResult<T> {
113
+ data: T[];
114
+ nextCursor?: string;
115
+ hasMore: boolean;
116
+ }
117
+ export interface NumericFilterCondition {
118
+ attribute: string;
119
+ operator: 'gt' | 'gte' | 'lt' | 'lte' | 'eq';
120
+ value: number;
44
121
  }
45
122
  export interface TraceQueryOptions extends QueryOptions {
46
123
  traceId?: string;
47
124
  serviceName?: string;
48
125
  spanName?: string;
126
+ /** Filter spans by name using regex pattern */
127
+ spanNameRegex?: string;
49
128
  minDurationMs?: number;
50
129
  maxDurationMs?: number;
51
130
  attributeFilter?: Record<string, string | number | boolean>;
131
+ /** Exclude spans matching this name (substring match) */
132
+ excludeSpanName?: string;
133
+ /** Only include spans where these attributes exist */
134
+ attributeExists?: string[];
135
+ /** Exclude spans where these attributes exist */
136
+ attributeNotExists?: string[];
137
+ /** Numeric comparison filters for attributes */
138
+ numericFilter?: NumericFilterCondition[];
52
139
  }
53
140
  export interface LogQueryOptions extends QueryOptions {
54
141
  severity?: string;
55
142
  search?: string;
56
143
  traceId?: string;
144
+ /** Exclude logs containing this text (case-insensitive) */
145
+ excludeSearch?: string;
146
+ /** Only include logs where these attributes exist */
147
+ attributeExists?: string[];
148
+ /** Exclude logs where these attributes exist */
149
+ attributeNotExists?: string[];
150
+ /** Numeric comparison filters for attributes */
151
+ numericFilter?: NumericFilterCondition[];
152
+ /** Multiple search terms for boolean search */
153
+ searchTerms?: string[];
154
+ /** Boolean operator for searchTerms: 'AND' (all must match) or 'OR' (any can match). Defaults to 'AND' */
155
+ searchOperator?: 'AND' | 'OR';
156
+ /** JSON paths to extract from log body (e.g., ['user.id', 'request.method']) */
157
+ extractFields?: string[];
57
158
  }
58
159
  export interface MetricQueryOptions extends QueryOptions {
59
160
  metricName?: string;
60
- aggregation?: 'sum' | 'avg' | 'min' | 'max' | 'count';
161
+ aggregation?: 'sum' | 'avg' | 'min' | 'max' | 'count' | 'p50' | 'p95' | 'p99' | 'rate';
61
162
  groupBy?: string[];
163
+ /** Time bucket size for grouping (e.g., '1m', '5m', '1h', '1d') */
164
+ timeBucket?: string;
62
165
  }
63
166
  export interface LLMEvent {
64
167
  timestamp: string;
@@ -71,6 +174,7 @@ export interface LLMEventQueryOptions extends QueryOptions {
71
174
  provider?: string;
72
175
  search?: string;
73
176
  }
177
+ export type { OTLPTraceExport, OTLPLogExport, OTLPMetricExport, } from '../lib/otlp-export.js';
74
178
  export interface TelemetryBackend {
75
179
  name: string;
76
180
  queryTraces(options: TraceQueryOptions): Promise<TraceSpan[]>;
@@ -81,5 +185,8 @@ export interface TelemetryBackend {
81
185
  status: 'ok' | 'error';
82
186
  message?: string;
83
187
  }>;
188
+ exportTracesOTLP?(options: TraceQueryOptions): Promise<import('../lib/otlp-export.js').OTLPTraceExport>;
189
+ exportLogsOTLP?(options: LogQueryOptions): Promise<import('../lib/otlp-export.js').OTLPLogExport>;
190
+ exportMetricsOTLP?(options: MetricQueryOptions): Promise<import('../lib/otlp-export.js').OTLPMetricExport>;
84
191
  }
85
192
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/backends/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/backends/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=local-jsonl-boolean-search.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-jsonl-boolean-search.test.d.ts","sourceRoot":"","sources":["../../src/backends/local-jsonl-boolean-search.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,154 @@
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-boolean-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 Boolean Search', () => {
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('queryLogs with searchTerms', () => {
39
+ it('should filter logs with searchTerms AND operator (all terms must match)', async () => {
40
+ const today = getTestDate();
41
+ const mockLogs = [
42
+ { timestamp: '2026-01-28T10:00:00Z', body: 'Connection timeout error' },
43
+ { timestamp: '2026-01-28T10:01:00Z', body: 'Database query failed' },
44
+ { timestamp: '2026-01-28T10:02:00Z', body: 'Connection reset by peer' },
45
+ { timestamp: '2026-01-28T10:03:00Z', body: 'Timeout occurred during connection' },
46
+ ];
47
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
48
+ const results = await backend.queryLogs({
49
+ searchTerms: ['connection', 'timeout'],
50
+ searchOperator: 'AND',
51
+ });
52
+ assert.strictEqual(results.length, 2);
53
+ assert.ok(results.every(l => l.body.toLowerCase().includes('connection') &&
54
+ l.body.toLowerCase().includes('timeout')));
55
+ });
56
+ it('should filter logs with searchTerms OR operator (any term can match)', async () => {
57
+ const today = getTestDate();
58
+ const mockLogs = [
59
+ { timestamp: '2026-01-28T10:00:00Z', body: 'Connection timeout error' },
60
+ { timestamp: '2026-01-28T10:01:00Z', body: 'Database query failed' },
61
+ { timestamp: '2026-01-28T10:02:00Z', body: 'Authentication error' },
62
+ { timestamp: '2026-01-28T10:03:00Z', body: 'Timeout occurred' },
63
+ ];
64
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
65
+ const results = await backend.queryLogs({
66
+ searchTerms: ['connection', 'timeout'],
67
+ searchOperator: 'OR',
68
+ });
69
+ assert.strictEqual(results.length, 2);
70
+ assert.ok(results.every(l => l.body.toLowerCase().includes('connection') ||
71
+ l.body.toLowerCase().includes('timeout')));
72
+ });
73
+ it('should default to AND operator when searchOperator is not specified', async () => {
74
+ const today = getTestDate();
75
+ const mockLogs = [
76
+ { timestamp: '2026-01-28T10:00:00Z', body: 'Error during database connection' },
77
+ { timestamp: '2026-01-28T10:01:00Z', body: 'Error occurred' },
78
+ { timestamp: '2026-01-28T10:02:00Z', body: 'Database query successful' },
79
+ { timestamp: '2026-01-28T10:03:00Z', body: 'Connection error in database' },
80
+ ];
81
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
82
+ // searchOperator defaults to 'AND'
83
+ const results = await backend.queryLogs({
84
+ searchTerms: ['error', 'database'],
85
+ });
86
+ assert.strictEqual(results.length, 2);
87
+ assert.ok(results.every(l => l.body.toLowerCase().includes('error') &&
88
+ l.body.toLowerCase().includes('database')));
89
+ });
90
+ it('should handle searchTerms with case-insensitive matching', async () => {
91
+ const today = getTestDate();
92
+ const mockLogs = [
93
+ { timestamp: '2026-01-28T10:00:00Z', body: 'ERROR: Connection FAILED' },
94
+ { timestamp: '2026-01-28T10:01:00Z', body: 'Warning: Process started' },
95
+ { timestamp: '2026-01-28T10:02:00Z', body: 'connection failed with error' },
96
+ ];
97
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
98
+ const results = await backend.queryLogs({
99
+ searchTerms: ['ERROR', 'FAILED'],
100
+ searchOperator: 'AND',
101
+ });
102
+ assert.strictEqual(results.length, 2);
103
+ });
104
+ it('should handle empty searchTerms array', async () => {
105
+ const today = getTestDate();
106
+ const mockLogs = [
107
+ { timestamp: '2026-01-28T10:00:00Z', body: 'Log message 1' },
108
+ { timestamp: '2026-01-28T10:01:00Z', body: 'Log message 2' },
109
+ ];
110
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
111
+ // Empty array should not filter anything
112
+ const results = await backend.queryLogs({
113
+ searchTerms: [],
114
+ });
115
+ assert.strictEqual(results.length, 2);
116
+ });
117
+ it('should combine search and searchTerms filters', async () => {
118
+ const today = getTestDate();
119
+ const mockLogs = [
120
+ { timestamp: '2026-01-28T10:00:00Z', body: 'Connection error timeout' },
121
+ { timestamp: '2026-01-28T10:01:00Z', body: 'Connection timeout' },
122
+ { timestamp: '2026-01-28T10:02:00Z', body: 'Database error timeout' },
123
+ { timestamp: '2026-01-28T10:03:00Z', body: 'Connection established' },
124
+ ];
125
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
126
+ // Both single search and searchTerms should apply
127
+ const results = await backend.queryLogs({
128
+ search: 'connection',
129
+ searchTerms: ['error', 'timeout'],
130
+ searchOperator: 'OR',
131
+ });
132
+ // Must contain 'connection' AND (contain 'error' OR 'timeout')
133
+ assert.strictEqual(results.length, 2);
134
+ assert.ok(results.every(l => l.body.toLowerCase().includes('connection') &&
135
+ (l.body.toLowerCase().includes('error') || l.body.toLowerCase().includes('timeout'))));
136
+ });
137
+ it('should handle single searchTerm as AND operator', async () => {
138
+ const today = getTestDate();
139
+ const mockLogs = [
140
+ { timestamp: '2026-01-28T10:00:00Z', body: 'Error occurred' },
141
+ { timestamp: '2026-01-28T10:01:00Z', body: 'Warning: Process started' },
142
+ { timestamp: '2026-01-28T10:02:00Z', body: 'Error: Connection failed' },
143
+ ];
144
+ writeJsonlFile(path.join(tempDir, `logs-${today}.jsonl`), mockLogs);
145
+ const results = await backend.queryLogs({
146
+ searchTerms: ['error'],
147
+ searchOperator: 'AND',
148
+ });
149
+ assert.strictEqual(results.length, 2);
150
+ assert.ok(results.every(l => l.body.toLowerCase().includes('error')));
151
+ });
152
+ });
153
+ });
154
+ //# sourceMappingURL=local-jsonl-boolean-search.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-jsonl-boolean-search.test.js","sourceRoot":"","sources":["../../src/backends/local-jsonl-boolean-search.test.ts"],"names":[],"mappings":"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"}
@@ -4,19 +4,90 @@
4
4
  * The local telemetry files use a flat JSONL format where each line is a complete
5
5
  * span or log record, not the batched OpenTelemetry export format.
6
6
  */
7
- import { TelemetryBackend, TraceSpan, LogRecord, MetricDataPoint, LLMEvent, TraceQueryOptions, LogQueryOptions, MetricQueryOptions, LLMEventQueryOptions } from './index.js';
7
+ import { TelemetryBackend, TraceSpan, LogRecord, MetricDataPoint, LLMEvent, TraceQueryOptions, LogQueryOptions, MetricQueryOptions, LLMEventQueryOptions, OTLPTraceExport, OTLPLogExport, OTLPMetricExport } from './index.js';
8
8
  export declare class LocalJsonlBackend implements TelemetryBackend {
9
9
  name: string;
10
10
  private telemetryDir;
11
- constructor(telemetryDir?: string);
11
+ private traceCache;
12
+ private logCache;
13
+ private metricCache;
14
+ private llmEventCache;
15
+ private useIndexes;
16
+ constructor(telemetryDir?: string, useIndexes?: boolean);
17
+ /**
18
+ * Clear all query caches
19
+ */
20
+ clearCache(): void;
21
+ /**
22
+ * Try to use an index for a file, returning matching line numbers or null if full scan needed
23
+ */
24
+ private tryUseIndex;
12
25
  queryTraces(options: TraceQueryOptions): Promise<TraceSpan[]>;
13
26
  queryLogs(options: LogQueryOptions): Promise<LogRecord[]>;
14
27
  queryMetrics(options: MetricQueryOptions): Promise<MetricDataPoint[]>;
15
28
  private aggregate;
29
+ private calculatePercentile;
30
+ /**
31
+ * Calculate rate of change per second.
32
+ * Rate = (last_value - first_value) / duration_in_seconds
33
+ * Edge cases: single value returns 0, same timestamp returns 0
34
+ */
35
+ private calculateRate;
16
36
  queryLLMEvents(options: LLMEventQueryOptions): Promise<LLMEvent[]>;
17
37
  healthCheck(): Promise<{
18
38
  status: 'ok' | 'error';
19
39
  message?: string;
20
40
  }>;
41
+ /**
42
+ * Export traces in OTLP JSON format
43
+ */
44
+ exportTracesOTLP(options: TraceQueryOptions): Promise<OTLPTraceExport>;
45
+ /**
46
+ * Export logs in OTLP JSON format
47
+ */
48
+ exportLogsOTLP(options: LogQueryOptions): Promise<OTLPLogExport>;
49
+ /**
50
+ * Export metrics in OTLP JSON format
51
+ */
52
+ exportMetricsOTLP(options: MetricQueryOptions): Promise<OTLPMetricExport>;
53
+ }
54
+ /**
55
+ * Multi-directory backend that queries all telemetry directories
56
+ * (global ~/.claude/telemetry + local project directories)
57
+ */
58
+ export declare class MultiDirectoryBackend implements TelemetryBackend {
59
+ name: string;
60
+ private backends;
61
+ private directories;
62
+ constructor(cwd?: string, useIndexes?: boolean);
63
+ getDirectories(): Array<{
64
+ path: string;
65
+ source: 'global' | 'local';
66
+ }>;
67
+ queryTraces(options: TraceQueryOptions): Promise<TraceSpan[]>;
68
+ queryLogs(options: LogQueryOptions): Promise<LogRecord[]>;
69
+ queryMetrics(options: MetricQueryOptions): Promise<MetricDataPoint[]>;
70
+ queryLLMEvents(options: LLMEventQueryOptions): Promise<LLMEvent[]>;
71
+ healthCheck(): Promise<{
72
+ status: 'ok' | 'error';
73
+ message?: string;
74
+ directories?: Array<{
75
+ path: string;
76
+ source: string;
77
+ status: string;
78
+ }>;
79
+ }>;
80
+ /**
81
+ * Export traces in OTLP JSON format
82
+ */
83
+ exportTracesOTLP(options: TraceQueryOptions): Promise<OTLPTraceExport>;
84
+ /**
85
+ * Export logs in OTLP JSON format
86
+ */
87
+ exportLogsOTLP(options: LogQueryOptions): Promise<OTLPLogExport>;
88
+ /**
89
+ * Export metrics in OTLP JSON format
90
+ */
91
+ exportMetricsOTLP(options: MetricQueryOptions): Promise<OTLPMetricExport>;
21
92
  }
22
93
  //# sourceMappingURL=local-jsonl.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"local-jsonl.d.ts","sourceRoot":"","sources":["../../src/backends/local-jsonl.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,SAAS,EACT,eAAe,EACf,QAAQ,EACR,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AA8KpB,qBAAa,iBAAkB,YAAW,gBAAgB;IACxD,IAAI,SAAiB;IACrB,OAAO,CAAC,YAAY,CAAS;gBAEjB,YAAY,CAAC,EAAE,MAAM;IAI3B,WAAW,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAoD7D,SAAS,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAoCzD,YAAY,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAyC3E,OAAO,CAAC,SAAS;IAyDX,cAAc,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAiDlE,WAAW,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CA6B3E"}
1
+ {"version":3,"file":"local-jsonl.d.ts","sourceRoot":"","sources":["../../src/backends/local-jsonl.ts"],"names":[],"mappings":"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"}