observability-toolkit 1.0.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 +107 -0
- package/dist/backends/index.d.ts +72 -0
- package/dist/backends/index.d.ts.map +1 -0
- package/dist/backends/index.js +5 -0
- package/dist/backends/index.js.map +1 -0
- package/dist/backends/local-jsonl.d.ts +21 -0
- package/dist/backends/local-jsonl.d.ts.map +1 -0
- package/dist/backends/local-jsonl.js +281 -0
- package/dist/backends/local-jsonl.js.map +1 -0
- package/dist/backends/signoz-api.d.ts +28 -0
- package/dist/backends/signoz-api.d.ts.map +1 -0
- package/dist/backends/signoz-api.js +293 -0
- package/dist/backends/signoz-api.js.map +1 -0
- package/dist/lib/constants.d.ts +21 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +30 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/file-utils.d.ts +38 -0
- package/dist/lib/file-utils.d.ts.map +1 -0
- package/dist/lib/file-utils.js +129 -0
- package/dist/lib/file-utils.js.map +1 -0
- package/dist/server.d.ts +11 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +140 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/context-stats.d.ts +81 -0
- package/dist/tools/context-stats.d.ts.map +1 -0
- package/dist/tools/context-stats.js +213 -0
- package/dist/tools/context-stats.js.map +1 -0
- package/dist/tools/get-trace-url.d.ts +36 -0
- package/dist/tools/get-trace-url.d.ts.map +1 -0
- package/dist/tools/get-trace-url.js +43 -0
- package/dist/tools/get-trace-url.js.map +1 -0
- package/dist/tools/health-check.d.ts +50 -0
- package/dist/tools/health-check.d.ts.map +1 -0
- package/dist/tools/health-check.js +109 -0
- package/dist/tools/health-check.js.map +1 -0
- package/dist/tools/index.d.ts +10 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +10 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/query-logs.d.ts +82 -0
- package/dist/tools/query-logs.d.ts.map +1 -0
- package/dist/tools/query-logs.js +86 -0
- package/dist/tools/query-logs.js.map +1 -0
- package/dist/tools/query-metrics.d.ts +96 -0
- package/dist/tools/query-metrics.d.ts.map +1 -0
- package/dist/tools/query-metrics.js +85 -0
- package/dist/tools/query-metrics.js.map +1 -0
- package/dist/tools/query-traces.d.ts +95 -0
- package/dist/tools/query-traces.d.ts.map +1 -0
- package/dist/tools/query-traces.js +83 -0
- package/dist/tools/query-traces.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SigNoz Cloud API backend for querying traces, metrics, and logs
|
|
3
|
+
*/
|
|
4
|
+
import { SIGNOZ_URL, SIGNOZ_API_KEY, CIRCUIT_BREAKER } from '../lib/constants.js';
|
|
5
|
+
/**
|
|
6
|
+
* Simple circuit breaker for API calls
|
|
7
|
+
*/
|
|
8
|
+
class ApiCircuitBreaker {
|
|
9
|
+
failures = 0;
|
|
10
|
+
lastFailure = 0;
|
|
11
|
+
state = 'closed';
|
|
12
|
+
maxFailures;
|
|
13
|
+
resetMs;
|
|
14
|
+
constructor() {
|
|
15
|
+
this.maxFailures = CIRCUIT_BREAKER.MAX_FAILURES;
|
|
16
|
+
this.resetMs = CIRCUIT_BREAKER.RESET_MS;
|
|
17
|
+
}
|
|
18
|
+
canRequest() {
|
|
19
|
+
if (this.state === 'open') {
|
|
20
|
+
if (Date.now() - this.lastFailure > this.resetMs) {
|
|
21
|
+
this.state = 'half-open';
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
recordSuccess() {
|
|
29
|
+
this.failures = 0;
|
|
30
|
+
this.state = 'closed';
|
|
31
|
+
}
|
|
32
|
+
recordFailure() {
|
|
33
|
+
this.failures++;
|
|
34
|
+
this.lastFailure = Date.now();
|
|
35
|
+
if (this.failures >= this.maxFailures) {
|
|
36
|
+
this.state = 'open';
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
getState() {
|
|
40
|
+
return this.state;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export class SigNozApiBackend {
|
|
44
|
+
name = 'signoz-api';
|
|
45
|
+
baseUrl;
|
|
46
|
+
apiKey;
|
|
47
|
+
circuitBreaker = new ApiCircuitBreaker();
|
|
48
|
+
constructor(baseUrl, apiKey) {
|
|
49
|
+
this.baseUrl = (baseUrl || SIGNOZ_URL).replace(/\/+$/, '');
|
|
50
|
+
this.apiKey = apiKey || SIGNOZ_API_KEY;
|
|
51
|
+
}
|
|
52
|
+
async fetch(path, options) {
|
|
53
|
+
if (!this.baseUrl || !this.apiKey) {
|
|
54
|
+
throw new Error('SigNoz URL or API key not configured');
|
|
55
|
+
}
|
|
56
|
+
if (!this.circuitBreaker.canRequest()) {
|
|
57
|
+
throw new Error('Circuit breaker open - SigNoz API unavailable');
|
|
58
|
+
}
|
|
59
|
+
const url = `${this.baseUrl}${path}`;
|
|
60
|
+
const headers = {
|
|
61
|
+
'signoz-access-token': this.apiKey,
|
|
62
|
+
'Content-Type': 'application/json',
|
|
63
|
+
};
|
|
64
|
+
try {
|
|
65
|
+
const response = await fetch(url, {
|
|
66
|
+
...options,
|
|
67
|
+
headers: { ...headers, ...options?.headers },
|
|
68
|
+
});
|
|
69
|
+
if (!response.ok) {
|
|
70
|
+
const text = await response.text();
|
|
71
|
+
throw new Error(`SigNoz API error: ${response.status} ${text}`);
|
|
72
|
+
}
|
|
73
|
+
this.circuitBreaker.recordSuccess();
|
|
74
|
+
return response.json();
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
this.circuitBreaker.recordFailure();
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get nanosecond timestamp for SigNoz queries
|
|
83
|
+
*/
|
|
84
|
+
getNanoTime(dateStr, defaultHoursAgo = 1) {
|
|
85
|
+
if (dateStr) {
|
|
86
|
+
return String(new Date(dateStr).getTime() * 1_000_000);
|
|
87
|
+
}
|
|
88
|
+
return String((Date.now() - defaultHoursAgo * 60 * 60 * 1000) * 1_000_000);
|
|
89
|
+
}
|
|
90
|
+
async queryTraces(options) {
|
|
91
|
+
const start = this.getNanoTime(options.startDate, 1);
|
|
92
|
+
const end = this.getNanoTime(options.endDate ? options.endDate + 'T23:59:59Z' : undefined, 0);
|
|
93
|
+
const limit = options.limit || 100;
|
|
94
|
+
// Build filter conditions
|
|
95
|
+
const filters = [];
|
|
96
|
+
if (options.traceId) {
|
|
97
|
+
filters.push({
|
|
98
|
+
key: { key: 'traceID', dataType: 'string', type: 'tag' },
|
|
99
|
+
op: '=',
|
|
100
|
+
value: options.traceId,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
if (options.serviceName) {
|
|
104
|
+
filters.push({
|
|
105
|
+
key: { key: 'serviceName', dataType: 'string', type: 'tag' },
|
|
106
|
+
op: '=',
|
|
107
|
+
value: options.serviceName,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
if (options.spanName) {
|
|
111
|
+
filters.push({
|
|
112
|
+
key: { key: 'name', dataType: 'string', type: 'tag' },
|
|
113
|
+
op: 'contains',
|
|
114
|
+
value: options.spanName,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
if (options.minDurationMs) {
|
|
118
|
+
filters.push({
|
|
119
|
+
key: { key: 'durationNano', dataType: 'float64', type: 'tag' },
|
|
120
|
+
op: '>=',
|
|
121
|
+
value: options.minDurationMs * 1_000_000,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
const body = {
|
|
125
|
+
start,
|
|
126
|
+
end,
|
|
127
|
+
step: 60,
|
|
128
|
+
limit,
|
|
129
|
+
filters: { op: 'AND', items: filters },
|
|
130
|
+
aggregateOperator: 'noop',
|
|
131
|
+
};
|
|
132
|
+
try {
|
|
133
|
+
const response = await this.fetch('/api/v3/traces', {
|
|
134
|
+
method: 'POST',
|
|
135
|
+
body: JSON.stringify(body),
|
|
136
|
+
});
|
|
137
|
+
return (response.result || []).map(t => ({
|
|
138
|
+
traceId: t.traceID,
|
|
139
|
+
spanId: t.spanID,
|
|
140
|
+
parentSpanId: t.parentSpanID,
|
|
141
|
+
name: t.operationName,
|
|
142
|
+
kind: t.kind !== undefined ? ['INTERNAL', 'SERVER', 'CLIENT', 'PRODUCER', 'CONSUMER'][t.kind] : undefined,
|
|
143
|
+
startTimeUnixNano: t.startTime * 1_000_000,
|
|
144
|
+
durationMs: t.duration / 1_000_000,
|
|
145
|
+
status: t.statusCode !== undefined ? { code: t.statusCode, message: t.statusMessage } : undefined,
|
|
146
|
+
attributes: t.tags,
|
|
147
|
+
}));
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
if (error instanceof Error && error.message.includes('Circuit breaker')) {
|
|
151
|
+
return [];
|
|
152
|
+
}
|
|
153
|
+
throw error;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
async queryLogs(options) {
|
|
157
|
+
const start = this.getNanoTime(options.startDate, 1);
|
|
158
|
+
const end = this.getNanoTime(options.endDate ? options.endDate + 'T23:59:59Z' : undefined, 0);
|
|
159
|
+
const limit = options.limit || 100;
|
|
160
|
+
const filters = [];
|
|
161
|
+
if (options.severity) {
|
|
162
|
+
filters.push({
|
|
163
|
+
key: { key: 'severity_text', dataType: 'string', type: 'tag' },
|
|
164
|
+
op: '=',
|
|
165
|
+
value: options.severity.toUpperCase(),
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
if (options.traceId) {
|
|
169
|
+
filters.push({
|
|
170
|
+
key: { key: 'trace_id', dataType: 'string', type: 'tag' },
|
|
171
|
+
op: '=',
|
|
172
|
+
value: options.traceId,
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
if (options.search) {
|
|
176
|
+
filters.push({
|
|
177
|
+
key: { key: 'body', dataType: 'string', type: 'tag' },
|
|
178
|
+
op: 'contains',
|
|
179
|
+
value: options.search,
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
const body = {
|
|
183
|
+
start,
|
|
184
|
+
end,
|
|
185
|
+
step: 60,
|
|
186
|
+
limit,
|
|
187
|
+
filters: { op: 'AND', items: filters },
|
|
188
|
+
};
|
|
189
|
+
try {
|
|
190
|
+
const response = await this.fetch('/api/v3/logs', {
|
|
191
|
+
method: 'POST',
|
|
192
|
+
body: JSON.stringify(body),
|
|
193
|
+
});
|
|
194
|
+
return (response.result || []).map(l => ({
|
|
195
|
+
timestamp: l.timestamp,
|
|
196
|
+
severity: l.severity_text || 'INFO',
|
|
197
|
+
body: l.body || '',
|
|
198
|
+
traceId: l.trace_id,
|
|
199
|
+
spanId: l.span_id,
|
|
200
|
+
attributes: l.attributes,
|
|
201
|
+
}));
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
if (error instanceof Error && error.message.includes('Circuit breaker')) {
|
|
205
|
+
return [];
|
|
206
|
+
}
|
|
207
|
+
throw error;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
async queryMetrics(options) {
|
|
211
|
+
const start = this.getNanoTime(options.startDate, 1);
|
|
212
|
+
const end = this.getNanoTime(options.endDate ? options.endDate + 'T23:59:59Z' : undefined, 0);
|
|
213
|
+
if (!options.metricName) {
|
|
214
|
+
throw new Error('metricName is required for SigNoz metric queries');
|
|
215
|
+
}
|
|
216
|
+
const aggregation = options.aggregation || 'avg';
|
|
217
|
+
const body = {
|
|
218
|
+
start,
|
|
219
|
+
end,
|
|
220
|
+
step: 60,
|
|
221
|
+
queries: [{
|
|
222
|
+
name: 'A',
|
|
223
|
+
query: {
|
|
224
|
+
queryName: 'A',
|
|
225
|
+
metricName: options.metricName,
|
|
226
|
+
aggregateOperator: aggregation,
|
|
227
|
+
dataSource: 'metrics',
|
|
228
|
+
groupBy: options.groupBy || [],
|
|
229
|
+
},
|
|
230
|
+
}],
|
|
231
|
+
};
|
|
232
|
+
try {
|
|
233
|
+
const response = await this.fetch('/api/v3/query_range', {
|
|
234
|
+
method: 'POST',
|
|
235
|
+
body: JSON.stringify(body),
|
|
236
|
+
});
|
|
237
|
+
const results = [];
|
|
238
|
+
for (const result of response.result || []) {
|
|
239
|
+
for (const series of result.series || []) {
|
|
240
|
+
for (const point of series.values || []) {
|
|
241
|
+
results.push({
|
|
242
|
+
timestamp: new Date(point.timestamp * 1000).toISOString(),
|
|
243
|
+
name: options.metricName,
|
|
244
|
+
value: point.value,
|
|
245
|
+
attributes: series.labels,
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return results.slice(0, options.limit || 100);
|
|
251
|
+
}
|
|
252
|
+
catch (error) {
|
|
253
|
+
if (error instanceof Error && error.message.includes('Circuit breaker')) {
|
|
254
|
+
return [];
|
|
255
|
+
}
|
|
256
|
+
throw error;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
async healthCheck() {
|
|
260
|
+
if (!this.baseUrl) {
|
|
261
|
+
return { status: 'error', message: 'SigNoz URL not configured' };
|
|
262
|
+
}
|
|
263
|
+
if (!this.apiKey) {
|
|
264
|
+
return { status: 'error', message: 'SigNoz API key not configured' };
|
|
265
|
+
}
|
|
266
|
+
if (this.circuitBreaker.getState() === 'open') {
|
|
267
|
+
return { status: 'error', message: 'Circuit breaker open - API temporarily unavailable' };
|
|
268
|
+
}
|
|
269
|
+
try {
|
|
270
|
+
// Try to list services as a health check
|
|
271
|
+
await this.fetch('/api/v1/services');
|
|
272
|
+
return { status: 'ok', message: `Connected to ${this.baseUrl}` };
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
return {
|
|
276
|
+
status: 'error',
|
|
277
|
+
message: error instanceof Error ? error.message : 'Unknown error',
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Get SigNoz trace viewer URL for a trace ID
|
|
283
|
+
*/
|
|
284
|
+
getTraceUrl(traceId) {
|
|
285
|
+
// Remove /v1/traces from ingest URL if present
|
|
286
|
+
const baseUrl = this.baseUrl
|
|
287
|
+
.replace('/v1/traces', '')
|
|
288
|
+
.replace('ingest.', '')
|
|
289
|
+
.replace(':4318', '');
|
|
290
|
+
return `${baseUrl}/trace/${traceId}`;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=signoz-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signoz-api.js","sourceRoot":"","sources":["../../src/backends/signoz-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constants for observability-toolkit MCP server
|
|
3
|
+
*/
|
|
4
|
+
export declare const CLAUDE_HOME: string;
|
|
5
|
+
export declare const TELEMETRY_DIR: string;
|
|
6
|
+
export declare const SIGNOZ_URL: string;
|
|
7
|
+
export declare const SIGNOZ_API_KEY: string;
|
|
8
|
+
export declare const CIRCUIT_BREAKER: {
|
|
9
|
+
readonly MAX_FAILURES: number;
|
|
10
|
+
readonly RESET_MS: number;
|
|
11
|
+
};
|
|
12
|
+
export declare const CONTEXT_WINDOW_SIZE = 200000;
|
|
13
|
+
export declare const TOKENS_PER_CHAR = 0.25;
|
|
14
|
+
export declare const MODEL_PRICING: Record<string, {
|
|
15
|
+
input: number;
|
|
16
|
+
output: number;
|
|
17
|
+
}>;
|
|
18
|
+
export declare const TRACES_FILE_PATTERN = "traces-*.jsonl";
|
|
19
|
+
export declare const LOGS_FILE_PATTERN = "logs-*.jsonl";
|
|
20
|
+
export declare const METRICS_FILE_PATTERN = "metrics-*.jsonl";
|
|
21
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/lib/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,eAAO,MAAM,WAAW,QAA0C,CAAC;AACnE,eAAO,MAAM,aAAa,QAA8D,CAAC;AAGzF,eAAO,MAAM,UAAU,QAA0E,CAAC;AAClG,eAAO,MAAM,cAAc,QAAmC,CAAC;AAG/D,eAAO,MAAM,eAAe;;;CAGlB,CAAC;AAGX,eAAO,MAAM,mBAAmB,SAAS,CAAC;AAG1C,eAAO,MAAM,eAAe,OAAO,CAAC;AAGpC,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAI3E,CAAC;AAGF,eAAO,MAAM,mBAAmB,mBAAmB,CAAC;AACpD,eAAO,MAAM,iBAAiB,iBAAiB,CAAC;AAChD,eAAO,MAAM,oBAAoB,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constants for observability-toolkit MCP server
|
|
3
|
+
*/
|
|
4
|
+
import { join } from 'path';
|
|
5
|
+
// Paths
|
|
6
|
+
export const CLAUDE_HOME = join(process.env.HOME || '', '.claude');
|
|
7
|
+
export const TELEMETRY_DIR = process.env.TELEMETRY_DIR || join(CLAUDE_HOME, 'telemetry');
|
|
8
|
+
// SigNoz configuration
|
|
9
|
+
export const SIGNOZ_URL = process.env.SIGNOZ_URL || process.env.OTEL_EXPORTER_OTLP_ENDPOINT || '';
|
|
10
|
+
export const SIGNOZ_API_KEY = process.env.SIGNOZ_API_KEY || '';
|
|
11
|
+
// Circuit breaker configuration
|
|
12
|
+
export const CIRCUIT_BREAKER = {
|
|
13
|
+
MAX_FAILURES: parseInt(process.env.CIRCUIT_BREAKER_MAX_FAILURES || '3', 10),
|
|
14
|
+
RESET_MS: parseInt(process.env.CIRCUIT_BREAKER_RESET_MS || '60000', 10),
|
|
15
|
+
};
|
|
16
|
+
// Claude context window size (200K tokens)
|
|
17
|
+
export const CONTEXT_WINDOW_SIZE = 200000;
|
|
18
|
+
// Approximate tokens per character
|
|
19
|
+
export const TOKENS_PER_CHAR = 0.25;
|
|
20
|
+
// Model pricing per 1M tokens (as of Jan 2026)
|
|
21
|
+
export const MODEL_PRICING = {
|
|
22
|
+
'claude-opus-4-5-20251101': { input: 15.0, output: 75.0 },
|
|
23
|
+
'claude-sonnet-4-20250514': { input: 3.0, output: 15.0 },
|
|
24
|
+
'claude-3-5-haiku-20241022': { input: 0.80, output: 4.0 },
|
|
25
|
+
};
|
|
26
|
+
// File patterns
|
|
27
|
+
export const TRACES_FILE_PATTERN = 'traces-*.jsonl';
|
|
28
|
+
export const LOGS_FILE_PATTERN = 'logs-*.jsonl';
|
|
29
|
+
export const METRICS_FILE_PATTERN = 'metrics-*.jsonl';
|
|
30
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/lib/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,QAAQ;AACR,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;AACnE,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;AAEzF,uBAAuB;AACvB,MAAM,CAAC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,EAAE,CAAC;AAClG,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC;AAE/D,gCAAgC;AAChC,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,YAAY,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,GAAG,EAAE,EAAE,CAAC;IAC3E,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,OAAO,EAAE,EAAE,CAAC;CAC/D,CAAC;AAEX,2CAA2C;AAC3C,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAE1C,mCAAmC;AACnC,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;AAEpC,+CAA+C;AAC/C,MAAM,CAAC,MAAM,aAAa,GAAsD;IAC9E,0BAA0B,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IACzD,0BAA0B,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IACxD,2BAA2B,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;CAC1D,CAAC;AAEF,gBAAgB;AAChB,MAAM,CAAC,MAAM,mBAAmB,GAAG,gBAAgB,CAAC;AACpD,MAAM,CAAC,MAAM,iBAAiB,GAAG,cAAc,CAAC;AAChD,MAAM,CAAC,MAAM,oBAAoB,GAAG,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File system utilities for observability-toolkit
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Load and parse JSON file with fallback
|
|
6
|
+
*/
|
|
7
|
+
export declare function loadJson<T>(filePath: string, fallback?: T): T | null;
|
|
8
|
+
/**
|
|
9
|
+
* Load JSON file, returning fallback on error (never null)
|
|
10
|
+
*/
|
|
11
|
+
export declare function loadJsonSafe<T>(filePath: string, fallback: T): T;
|
|
12
|
+
/**
|
|
13
|
+
* Get date string in YYYY-MM-DD format
|
|
14
|
+
*/
|
|
15
|
+
export declare function getDateString(date?: Date): string;
|
|
16
|
+
/**
|
|
17
|
+
* List files in directory matching a pattern
|
|
18
|
+
*/
|
|
19
|
+
export declare function listFiles(dir: string, pattern: RegExp): string[];
|
|
20
|
+
/**
|
|
21
|
+
* Parse date from filename like traces-2026-01-28.jsonl
|
|
22
|
+
*/
|
|
23
|
+
export declare function parseDateFromFilename(filename: string): string | null;
|
|
24
|
+
/**
|
|
25
|
+
* Read JSONL file and parse each line
|
|
26
|
+
*/
|
|
27
|
+
export declare function readJsonlSync<T>(filePath: string, limit?: number): T[];
|
|
28
|
+
/**
|
|
29
|
+
* Stream JSONL file line by line (for large files)
|
|
30
|
+
*/
|
|
31
|
+
export declare function streamJsonl<T>(filePath: string): AsyncGenerator<T>;
|
|
32
|
+
/**
|
|
33
|
+
* Filter items by date range
|
|
34
|
+
*/
|
|
35
|
+
export declare function filterByDateRange<T extends {
|
|
36
|
+
timestamp?: string;
|
|
37
|
+
}>(items: T[], startDate?: string, endDate?: string): T[];
|
|
38
|
+
//# sourceMappingURL=file-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-utils.d.ts","sourceRoot":"","sources":["../../src/lib/file-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CASpE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAEhE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,GAAE,IAAiB,GAAG,MAAM,CAE7D;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAkBhE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGrE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,CAuBtE;AAED;;GAEG;AACH,wBAAuB,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,CAiBzE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAChE,KAAK,EAAE,CAAC,EAAE,EACV,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,CAAC,EAAE,CAQL"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File system utilities for observability-toolkit
|
|
3
|
+
*/
|
|
4
|
+
import { existsSync, readFileSync, readdirSync, statSync, createReadStream } from 'fs';
|
|
5
|
+
import { join, basename } from 'path';
|
|
6
|
+
import { createInterface } from 'readline';
|
|
7
|
+
/**
|
|
8
|
+
* Load and parse JSON file with fallback
|
|
9
|
+
*/
|
|
10
|
+
export function loadJson(filePath, fallback) {
|
|
11
|
+
try {
|
|
12
|
+
if (existsSync(filePath)) {
|
|
13
|
+
return JSON.parse(readFileSync(filePath, 'utf-8'));
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
// Ignore parse/read errors
|
|
18
|
+
}
|
|
19
|
+
return fallback ?? null;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Load JSON file, returning fallback on error (never null)
|
|
23
|
+
*/
|
|
24
|
+
export function loadJsonSafe(filePath, fallback) {
|
|
25
|
+
return loadJson(filePath, fallback) ?? fallback;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Get date string in YYYY-MM-DD format
|
|
29
|
+
*/
|
|
30
|
+
export function getDateString(date = new Date()) {
|
|
31
|
+
return date.toISOString().split('T')[0];
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* List files in directory matching a pattern
|
|
35
|
+
*/
|
|
36
|
+
export function listFiles(dir, pattern) {
|
|
37
|
+
if (!existsSync(dir))
|
|
38
|
+
return [];
|
|
39
|
+
try {
|
|
40
|
+
return readdirSync(dir)
|
|
41
|
+
.filter(f => pattern.test(f))
|
|
42
|
+
.map(f => join(dir, f))
|
|
43
|
+
.sort((a, b) => {
|
|
44
|
+
// Sort by modification time, newest first
|
|
45
|
+
try {
|
|
46
|
+
return statSync(b).mtime.getTime() - statSync(a).mtime.getTime();
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return 0;
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return [];
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Parse date from filename like traces-2026-01-28.jsonl
|
|
59
|
+
*/
|
|
60
|
+
export function parseDateFromFilename(filename) {
|
|
61
|
+
const match = basename(filename).match(/(\d{4}-\d{2}-\d{2})/);
|
|
62
|
+
return match ? match[1] : null;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Read JSONL file and parse each line
|
|
66
|
+
*/
|
|
67
|
+
export function readJsonlSync(filePath, limit) {
|
|
68
|
+
if (!existsSync(filePath))
|
|
69
|
+
return [];
|
|
70
|
+
try {
|
|
71
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
72
|
+
const lines = content.trim().split('\n');
|
|
73
|
+
const results = [];
|
|
74
|
+
for (const line of lines) {
|
|
75
|
+
if (limit && results.length >= limit)
|
|
76
|
+
break;
|
|
77
|
+
if (!line.trim())
|
|
78
|
+
continue;
|
|
79
|
+
try {
|
|
80
|
+
results.push(JSON.parse(line));
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// Skip malformed lines
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return results;
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return [];
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Stream JSONL file line by line (for large files)
|
|
94
|
+
*/
|
|
95
|
+
export async function* streamJsonl(filePath) {
|
|
96
|
+
if (!existsSync(filePath))
|
|
97
|
+
return;
|
|
98
|
+
const fileStream = createReadStream(filePath);
|
|
99
|
+
const rl = createInterface({
|
|
100
|
+
input: fileStream,
|
|
101
|
+
crlfDelay: Infinity,
|
|
102
|
+
});
|
|
103
|
+
for await (const line of rl) {
|
|
104
|
+
if (!line.trim())
|
|
105
|
+
continue;
|
|
106
|
+
try {
|
|
107
|
+
yield JSON.parse(line);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// Skip malformed lines
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Filter items by date range
|
|
116
|
+
*/
|
|
117
|
+
export function filterByDateRange(items, startDate, endDate) {
|
|
118
|
+
return items.filter(item => {
|
|
119
|
+
if (!item.timestamp)
|
|
120
|
+
return true;
|
|
121
|
+
const ts = item.timestamp;
|
|
122
|
+
if (startDate && ts < startDate)
|
|
123
|
+
return false;
|
|
124
|
+
if (endDate && ts > endDate)
|
|
125
|
+
return false;
|
|
126
|
+
return true;
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=file-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../src/lib/file-utils.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Observability Toolkit MCP Server
|
|
4
|
+
*
|
|
5
|
+
* Provides tools for querying traces, metrics, and logs from local JSONL files
|
|
6
|
+
* or SigNoz Cloud for Claude Code sessions.
|
|
7
|
+
*
|
|
8
|
+
* Install: claude mcp add observability-toolkit -- npx -y @alyshia/observability-toolkit
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG"}
|