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.
- package/README.md +52 -3
- package/dist/backends/index.d.ts +108 -1
- package/dist/backends/index.d.ts.map +1 -1
- package/dist/backends/local-jsonl-boolean-search.test.d.ts +2 -0
- package/dist/backends/local-jsonl-boolean-search.test.d.ts.map +1 -0
- package/dist/backends/local-jsonl-boolean-search.test.js +154 -0
- package/dist/backends/local-jsonl-boolean-search.test.js.map +1 -0
- package/dist/backends/local-jsonl.d.ts +73 -2
- package/dist/backends/local-jsonl.d.ts.map +1 -1
- package/dist/backends/local-jsonl.js +768 -103
- package/dist/backends/local-jsonl.js.map +1 -1
- package/dist/backends/local-jsonl.test.js +3326 -271
- package/dist/backends/local-jsonl.test.js.map +1 -1
- package/dist/backends/signoz-api.d.ts +13 -1
- package/dist/backends/signoz-api.d.ts.map +1 -1
- package/dist/backends/signoz-api.integration.test.d.ts +8 -0
- package/dist/backends/signoz-api.integration.test.d.ts.map +1 -0
- package/dist/backends/signoz-api.integration.test.js +137 -0
- package/dist/backends/signoz-api.integration.test.js.map +1 -0
- package/dist/backends/signoz-api.js +384 -42
- package/dist/backends/signoz-api.js.map +1 -1
- package/dist/backends/signoz-api.test.js +821 -325
- package/dist/backends/signoz-api.test.js.map +1 -1
- package/dist/lib/cache.d.ts +20 -0
- package/dist/lib/cache.d.ts.map +1 -0
- package/dist/lib/cache.js +63 -0
- package/dist/lib/cache.js.map +1 -0
- package/dist/lib/constants.d.ts +27 -0
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +70 -0
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/constants.test.js +183 -1
- package/dist/lib/constants.test.js.map +1 -1
- package/dist/lib/file-utils.d.ts +53 -1
- package/dist/lib/file-utils.d.ts.map +1 -1
- package/dist/lib/file-utils.js +142 -3
- package/dist/lib/file-utils.js.map +1 -1
- package/dist/lib/file-utils.test.js +228 -1
- package/dist/lib/file-utils.test.js.map +1 -1
- package/dist/lib/indexer.d.ts +78 -0
- package/dist/lib/indexer.d.ts.map +1 -0
- package/dist/lib/indexer.js +277 -0
- package/dist/lib/indexer.js.map +1 -0
- package/dist/lib/indexer.test.d.ts +2 -0
- package/dist/lib/indexer.test.d.ts.map +1 -0
- package/dist/lib/indexer.test.js +392 -0
- package/dist/lib/indexer.test.js.map +1 -0
- package/dist/lib/otlp-export.d.ts +178 -0
- package/dist/lib/otlp-export.d.ts.map +1 -0
- package/dist/lib/otlp-export.js +382 -0
- package/dist/lib/otlp-export.js.map +1 -0
- package/dist/server.js +48 -65
- package/dist/server.js.map +1 -1
- package/dist/server.test.d.ts +5 -0
- package/dist/server.test.d.ts.map +1 -0
- package/dist/server.test.js +547 -0
- package/dist/server.test.js.map +1 -0
- package/dist/tools/context-stats.test.js +126 -0
- package/dist/tools/context-stats.test.js.map +1 -1
- package/dist/tools/get-trace-url.d.ts.map +1 -1
- package/dist/tools/get-trace-url.js +5 -1
- package/dist/tools/get-trace-url.js.map +1 -1
- package/dist/tools/get-trace-url.test.js +12 -6
- package/dist/tools/get-trace-url.test.js.map +1 -1
- package/dist/tools/health-check.d.ts +9 -2
- package/dist/tools/health-check.d.ts.map +1 -1
- package/dist/tools/health-check.js +66 -27
- package/dist/tools/health-check.js.map +1 -1
- package/dist/tools/health-check.test.js +89 -96
- package/dist/tools/health-check.test.js.map +1 -1
- package/dist/tools/query-llm-events.d.ts +2 -2
- package/dist/tools/query-llm-events.js +3 -3
- package/dist/tools/query-llm-events.js.map +1 -1
- package/dist/tools/query-logs.d.ts +12 -10
- package/dist/tools/query-logs.d.ts.map +1 -1
- package/dist/tools/query-logs.js +5 -5
- package/dist/tools/query-logs.js.map +1 -1
- package/dist/tools/query-logs.test.js +22 -2
- package/dist/tools/query-logs.test.js.map +1 -1
- package/dist/tools/query-metrics.d.ts +12 -14
- package/dist/tools/query-metrics.d.ts.map +1 -1
- package/dist/tools/query-metrics.js +11 -13
- package/dist/tools/query-metrics.js.map +1 -1
- package/dist/tools/query-metrics.test.js +134 -96
- package/dist/tools/query-metrics.test.js.map +1 -1
- package/dist/tools/query-traces.d.ts +16 -17
- package/dist/tools/query-traces.d.ts.map +1 -1
- package/dist/tools/query-traces.js +11 -14
- package/dist/tools/query-traces.js.map +1 -1
- package/dist/tools/query-traces.test.js +144 -48
- package/dist/tools/query-traces.test.js.map +1 -1
- package/dist/tools/setup-claudeignore.d.ts +36 -10
- package/dist/tools/setup-claudeignore.d.ts.map +1 -1
- package/dist/tools/setup-claudeignore.js +193 -33
- package/dist/tools/setup-claudeignore.js.map +1 -1
- package/dist/tools/setup-claudeignore.test.js +286 -41
- package/dist/tools/setup-claudeignore.test.js.map +1 -1
- package/dist/tools/signoz.integration.test.d.ts +8 -0
- package/dist/tools/signoz.integration.test.d.ts.map +1 -0
- package/dist/tools/signoz.integration.test.js +141 -0
- package/dist/tools/signoz.integration.test.js.map +1 -0
- 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
|
|
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({
|
|
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
|
-
|
|
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
|
|
package/dist/backends/index.d.ts
CHANGED
|
@@ -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":"AAAA;;GAEG;AAEH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/backends/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
-
|
|
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,
|
|
1
|
+
{"version":3,"file":"local-jsonl.d.ts","sourceRoot":"","sources":["../../src/backends/local-jsonl.ts"],"names":[],"mappings":"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"}
|