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.
Files changed (54) hide show
  1. package/README.md +107 -0
  2. package/dist/backends/index.d.ts +72 -0
  3. package/dist/backends/index.d.ts.map +1 -0
  4. package/dist/backends/index.js +5 -0
  5. package/dist/backends/index.js.map +1 -0
  6. package/dist/backends/local-jsonl.d.ts +21 -0
  7. package/dist/backends/local-jsonl.d.ts.map +1 -0
  8. package/dist/backends/local-jsonl.js +281 -0
  9. package/dist/backends/local-jsonl.js.map +1 -0
  10. package/dist/backends/signoz-api.d.ts +28 -0
  11. package/dist/backends/signoz-api.d.ts.map +1 -0
  12. package/dist/backends/signoz-api.js +293 -0
  13. package/dist/backends/signoz-api.js.map +1 -0
  14. package/dist/lib/constants.d.ts +21 -0
  15. package/dist/lib/constants.d.ts.map +1 -0
  16. package/dist/lib/constants.js +30 -0
  17. package/dist/lib/constants.js.map +1 -0
  18. package/dist/lib/file-utils.d.ts +38 -0
  19. package/dist/lib/file-utils.d.ts.map +1 -0
  20. package/dist/lib/file-utils.js +129 -0
  21. package/dist/lib/file-utils.js.map +1 -0
  22. package/dist/server.d.ts +11 -0
  23. package/dist/server.d.ts.map +1 -0
  24. package/dist/server.js +140 -0
  25. package/dist/server.js.map +1 -0
  26. package/dist/tools/context-stats.d.ts +81 -0
  27. package/dist/tools/context-stats.d.ts.map +1 -0
  28. package/dist/tools/context-stats.js +213 -0
  29. package/dist/tools/context-stats.js.map +1 -0
  30. package/dist/tools/get-trace-url.d.ts +36 -0
  31. package/dist/tools/get-trace-url.d.ts.map +1 -0
  32. package/dist/tools/get-trace-url.js +43 -0
  33. package/dist/tools/get-trace-url.js.map +1 -0
  34. package/dist/tools/health-check.d.ts +50 -0
  35. package/dist/tools/health-check.d.ts.map +1 -0
  36. package/dist/tools/health-check.js +109 -0
  37. package/dist/tools/health-check.js.map +1 -0
  38. package/dist/tools/index.d.ts +10 -0
  39. package/dist/tools/index.d.ts.map +1 -0
  40. package/dist/tools/index.js +10 -0
  41. package/dist/tools/index.js.map +1 -0
  42. package/dist/tools/query-logs.d.ts +82 -0
  43. package/dist/tools/query-logs.d.ts.map +1 -0
  44. package/dist/tools/query-logs.js +86 -0
  45. package/dist/tools/query-logs.js.map +1 -0
  46. package/dist/tools/query-metrics.d.ts +96 -0
  47. package/dist/tools/query-metrics.d.ts.map +1 -0
  48. package/dist/tools/query-metrics.js +85 -0
  49. package/dist/tools/query-metrics.js.map +1 -0
  50. package/dist/tools/query-traces.d.ts +95 -0
  51. package/dist/tools/query-traces.d.ts.map +1 -0
  52. package/dist/tools/query-traces.js +83 -0
  53. package/dist/tools/query-traces.js.map +1 -0
  54. package/package.json +43 -0
package/dist/server.js ADDED
@@ -0,0 +1,140 @@
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
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
11
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
12
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
13
+ import { queryTracesTool, queryMetricsTool, queryLogsTool, healthCheckTool, contextStatsTool, getTraceUrlTool, } from './tools/index.js';
14
+ // Tool definitions
15
+ const tools = [
16
+ queryTracesTool,
17
+ queryMetricsTool,
18
+ queryLogsTool,
19
+ healthCheckTool,
20
+ contextStatsTool,
21
+ getTraceUrlTool,
22
+ ];
23
+ // Convert Zod schema to JSON Schema for MCP
24
+ function zodToJsonSchema(zodSchema) {
25
+ const shape = zodSchema.shape || {};
26
+ const properties = {};
27
+ const required = [];
28
+ for (const [key, value] of Object.entries(shape)) {
29
+ const field = value;
30
+ const def = field._def;
31
+ if (!def)
32
+ continue;
33
+ let type = 'string';
34
+ let enumValues;
35
+ // Handle optional/default wrappers
36
+ let innerDef = def;
37
+ let isOptional = false;
38
+ let hasDefault = false;
39
+ while (innerDef.typeName === 'ZodDefault' || innerDef.typeName === 'ZodOptional') {
40
+ if (innerDef.typeName === 'ZodDefault')
41
+ hasDefault = true;
42
+ if (innerDef.typeName === 'ZodOptional')
43
+ isOptional = true;
44
+ innerDef = innerDef.innerType?._def || innerDef;
45
+ }
46
+ // Map Zod types to JSON Schema types
47
+ switch (innerDef.typeName) {
48
+ case 'ZodString':
49
+ type = 'string';
50
+ break;
51
+ case 'ZodNumber':
52
+ type = 'number';
53
+ break;
54
+ case 'ZodBoolean':
55
+ type = 'boolean';
56
+ break;
57
+ case 'ZodEnum':
58
+ type = 'string';
59
+ enumValues = innerDef.values;
60
+ break;
61
+ case 'ZodArray':
62
+ type = 'array';
63
+ break;
64
+ }
65
+ const propSchema = { type };
66
+ if (def.description)
67
+ propSchema.description = def.description;
68
+ if (enumValues)
69
+ propSchema.enum = enumValues;
70
+ if (hasDefault && def.defaultValue) {
71
+ propSchema.default = def.defaultValue();
72
+ }
73
+ properties[key] = propSchema;
74
+ if (!isOptional && !hasDefault) {
75
+ required.push(key);
76
+ }
77
+ }
78
+ return {
79
+ type: 'object',
80
+ properties,
81
+ required: required.length > 0 ? required : undefined,
82
+ };
83
+ }
84
+ async function main() {
85
+ const server = new Server({
86
+ name: 'observability-toolkit',
87
+ version: '1.0.0',
88
+ }, {
89
+ capabilities: {
90
+ tools: {},
91
+ },
92
+ });
93
+ // List available tools
94
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
95
+ return {
96
+ tools: tools.map(tool => ({
97
+ name: tool.name,
98
+ description: tool.description,
99
+ inputSchema: zodToJsonSchema(tool.inputSchema),
100
+ })),
101
+ };
102
+ });
103
+ // Handle tool calls
104
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
105
+ const { name, arguments: args } = request.params;
106
+ const tool = tools.find(t => t.name === name);
107
+ if (!tool) {
108
+ return {
109
+ content: [{ type: 'text', text: `Unknown tool: ${name}` }],
110
+ isError: true,
111
+ };
112
+ }
113
+ try {
114
+ // Parse and validate input
115
+ const input = tool.inputSchema.parse(args || {});
116
+ // Execute handler - use type assertion since we've validated input
117
+ const result = await tool.handler(input);
118
+ return {
119
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
120
+ };
121
+ }
122
+ catch (error) {
123
+ const message = error instanceof Error ? error.message : String(error);
124
+ return {
125
+ content: [{ type: 'text', text: `Error: ${message}` }],
126
+ isError: true,
127
+ };
128
+ }
129
+ });
130
+ // Connect via stdio
131
+ const transport = new StdioServerTransport();
132
+ await server.connect(transport);
133
+ // Log startup to stderr (stdout is for MCP protocol)
134
+ console.error('Observability Toolkit MCP server started');
135
+ }
136
+ main().catch((error) => {
137
+ console.error('Fatal error:', error);
138
+ process.exit(1);
139
+ });
140
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Context window utilization statistics
3
+ */
4
+ import { z } from 'zod';
5
+ export declare const contextStatsSchema: z.ZodObject<{
6
+ sessionId: z.ZodOptional<z.ZodString>;
7
+ includeBreakdown: z.ZodDefault<z.ZodBoolean>;
8
+ includeCost: z.ZodDefault<z.ZodBoolean>;
9
+ }, "strip", z.ZodTypeAny, {
10
+ includeBreakdown: boolean;
11
+ includeCost: boolean;
12
+ sessionId?: string | undefined;
13
+ }, {
14
+ sessionId?: string | undefined;
15
+ includeBreakdown?: boolean | undefined;
16
+ includeCost?: boolean | undefined;
17
+ }>;
18
+ export type ContextStatsInput = z.infer<typeof contextStatsSchema>;
19
+ export declare function contextStats(input: ContextStatsInput): Promise<{
20
+ sessionId: string;
21
+ project: string;
22
+ model?: string;
23
+ context: {
24
+ totalTokens: number;
25
+ utilization: string;
26
+ freeSpace: number;
27
+ freeSpacePercent: string;
28
+ };
29
+ tokens: {
30
+ input: number;
31
+ output: number;
32
+ cacheRead: number;
33
+ cacheCreation: number;
34
+ };
35
+ messages: number;
36
+ cost?: {
37
+ input: string;
38
+ output: string;
39
+ total: string;
40
+ };
41
+ breakdown?: {
42
+ systemPrompt: number;
43
+ systemTools: number;
44
+ messages: number;
45
+ other: number;
46
+ };
47
+ history?: {
48
+ totalSessions: number;
49
+ avgUtilization: number;
50
+ recentDays: Array<{
51
+ date: string;
52
+ avgTokens: number;
53
+ sessionCount: number;
54
+ }>;
55
+ };
56
+ } | {
57
+ error: string;
58
+ sessionId?: undefined;
59
+ } | {
60
+ sessionId: string;
61
+ error: string;
62
+ }>;
63
+ export declare const contextStatsTool: {
64
+ name: string;
65
+ description: string;
66
+ inputSchema: z.ZodObject<{
67
+ sessionId: z.ZodOptional<z.ZodString>;
68
+ includeBreakdown: z.ZodDefault<z.ZodBoolean>;
69
+ includeCost: z.ZodDefault<z.ZodBoolean>;
70
+ }, "strip", z.ZodTypeAny, {
71
+ includeBreakdown: boolean;
72
+ includeCost: boolean;
73
+ sessionId?: string | undefined;
74
+ }, {
75
+ sessionId?: string | undefined;
76
+ includeBreakdown?: boolean | undefined;
77
+ includeCost?: boolean | undefined;
78
+ }>;
79
+ handler: typeof contextStats;
80
+ };
81
+ //# sourceMappingURL=context-stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-stats.d.ts","sourceRoot":"","sources":["../../src/tools/context-stats.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;EAI7B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAsJnE,wBAAsB,YAAY,CAAC,KAAK,EAAE,iBAAiB;eAoC5C,MAAM;aACR,MAAM;YACP,MAAM;aACL;QACP,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,gBAAgB,EAAE,MAAM,CAAC;KAC1B;YACO;QACN,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;KACvB;cACS,MAAM;WACT;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;gBAC3C;QACV,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;KACf;cACS;QACR,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;QACvB,UAAU,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC9E;;;;;;;GA+DJ;AAED,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;CAK5B,CAAC"}
@@ -0,0 +1,213 @@
1
+ /**
2
+ * Context window utilization statistics
3
+ */
4
+ import { z } from 'zod';
5
+ import { existsSync, readFileSync, readdirSync, statSync } from 'fs';
6
+ import { join } from 'path';
7
+ import { CLAUDE_HOME, CONTEXT_WINDOW_SIZE, MODEL_PRICING } from '../lib/constants.js';
8
+ import { loadJsonSafe } from '../lib/file-utils.js';
9
+ export const contextStatsSchema = z.object({
10
+ sessionId: z.string().optional().describe('Specific session ID to analyze (defaults to most recent)'),
11
+ includeBreakdown: z.boolean().default(true).describe('Include token breakdown by category'),
12
+ includeCost: z.boolean().default(true).describe('Include cost estimation'),
13
+ });
14
+ /**
15
+ * Find most recent session file
16
+ */
17
+ function findRecentSession() {
18
+ const projectsDir = join(CLAUDE_HOME, 'projects');
19
+ if (!existsSync(projectsDir))
20
+ return null;
21
+ let mostRecent = null;
22
+ try {
23
+ const projectDirs = readdirSync(projectsDir);
24
+ for (const project of projectDirs) {
25
+ const projectPath = join(projectsDir, project);
26
+ const stat = statSync(projectPath);
27
+ if (!stat.isDirectory())
28
+ continue;
29
+ const sessions = readdirSync(projectPath).filter(f => f.endsWith('.jsonl'));
30
+ for (const session of sessions) {
31
+ const filePath = join(projectPath, session);
32
+ const sessionStat = statSync(filePath);
33
+ if (!mostRecent || sessionStat.mtime.getTime() > mostRecent.mtime) {
34
+ mostRecent = {
35
+ sessionId: session.replace('.jsonl', ''),
36
+ projectDir: project,
37
+ filePath,
38
+ mtime: sessionStat.mtime.getTime(),
39
+ };
40
+ }
41
+ }
42
+ }
43
+ }
44
+ catch {
45
+ return null;
46
+ }
47
+ return mostRecent ? { sessionId: mostRecent.sessionId, projectDir: mostRecent.projectDir, filePath: mostRecent.filePath } : null;
48
+ }
49
+ /**
50
+ * Parse session file for usage data
51
+ */
52
+ function parseSessionUsage(filePath) {
53
+ if (!existsSync(filePath))
54
+ return null;
55
+ try {
56
+ const content = readFileSync(filePath, 'utf-8');
57
+ const lines = content.trim().split('\n');
58
+ let latestUsage = null;
59
+ let messageCount = 0;
60
+ let model;
61
+ for (const line of lines) {
62
+ try {
63
+ const entry = JSON.parse(line);
64
+ if (entry.type === 'user' || entry.type === 'assistant') {
65
+ messageCount++;
66
+ }
67
+ if (entry.message?.model) {
68
+ model = entry.message.model;
69
+ }
70
+ if (entry.message?.usage) {
71
+ const usage = entry.message.usage;
72
+ const inputTokens = usage.input_tokens || 0;
73
+ const outputTokens = usage.output_tokens || 0;
74
+ const cacheReadTokens = usage.cache_read_input_tokens || 0;
75
+ const cacheCreationTokens = usage.cache_creation_input_tokens || 0;
76
+ const totalContextTokens = inputTokens + cacheReadTokens + cacheCreationTokens;
77
+ const utilizationPercent = (totalContextTokens / CONTEXT_WINDOW_SIZE) * 100;
78
+ const freeSpace = Math.max(0, CONTEXT_WINDOW_SIZE - totalContextTokens);
79
+ latestUsage = {
80
+ inputTokens,
81
+ outputTokens,
82
+ cacheReadTokens,
83
+ cacheCreationTokens,
84
+ totalContextTokens,
85
+ utilizationPercent: Math.round(utilizationPercent * 10) / 10,
86
+ freeSpace,
87
+ messageCount,
88
+ model,
89
+ };
90
+ }
91
+ }
92
+ catch {
93
+ // Skip malformed lines
94
+ }
95
+ }
96
+ if (latestUsage) {
97
+ latestUsage.messageCount = messageCount;
98
+ }
99
+ return latestUsage;
100
+ }
101
+ catch {
102
+ return null;
103
+ }
104
+ }
105
+ /**
106
+ * Calculate cost from usage
107
+ */
108
+ function calculateCost(usage) {
109
+ const model = usage.model || 'claude-sonnet-4-20250514';
110
+ const pricing = MODEL_PRICING[model] || { input: 3.0, output: 15.0 };
111
+ const inputCost = (usage.inputTokens * pricing.input) / 1_000_000;
112
+ const outputCost = (usage.outputTokens * pricing.output) / 1_000_000;
113
+ return {
114
+ inputCost: Math.round(inputCost * 10000) / 10000,
115
+ outputCost: Math.round(outputCost * 10000) / 10000,
116
+ totalCost: Math.round((inputCost + outputCost) * 10000) / 10000,
117
+ };
118
+ }
119
+ export async function contextStats(input) {
120
+ // Find session
121
+ let sessionInfo = null;
122
+ if (input.sessionId) {
123
+ // Search for specific session
124
+ const projectsDir = join(CLAUDE_HOME, 'projects');
125
+ if (existsSync(projectsDir)) {
126
+ const projectDirs = readdirSync(projectsDir);
127
+ for (const project of projectDirs) {
128
+ const filePath = join(projectsDir, project, `${input.sessionId}.jsonl`);
129
+ if (existsSync(filePath)) {
130
+ sessionInfo = { sessionId: input.sessionId, projectDir: project, filePath };
131
+ break;
132
+ }
133
+ }
134
+ }
135
+ }
136
+ else {
137
+ sessionInfo = findRecentSession();
138
+ }
139
+ if (!sessionInfo) {
140
+ return {
141
+ error: input.sessionId ? `Session not found: ${input.sessionId}` : 'No sessions found',
142
+ };
143
+ }
144
+ const usage = parseSessionUsage(sessionInfo.filePath);
145
+ if (!usage) {
146
+ return {
147
+ sessionId: sessionInfo.sessionId,
148
+ error: 'Could not parse session usage data',
149
+ };
150
+ }
151
+ const result = {
152
+ sessionId: sessionInfo.sessionId,
153
+ project: sessionInfo.projectDir.replace(/-/g, '/'),
154
+ model: usage.model,
155
+ context: {
156
+ totalTokens: usage.totalContextTokens,
157
+ utilization: `${usage.utilizationPercent}%`,
158
+ freeSpace: usage.freeSpace,
159
+ freeSpacePercent: `${(100 - usage.utilizationPercent).toFixed(1)}%`,
160
+ },
161
+ tokens: {
162
+ input: usage.inputTokens,
163
+ output: usage.outputTokens,
164
+ cacheRead: usage.cacheReadTokens,
165
+ cacheCreation: usage.cacheCreationTokens,
166
+ },
167
+ messages: usage.messageCount,
168
+ };
169
+ if (input.includeCost) {
170
+ const cost = calculateCost(usage);
171
+ result.cost = {
172
+ input: `$${cost.inputCost.toFixed(4)}`,
173
+ output: `$${cost.outputCost.toFixed(4)}`,
174
+ total: `$${cost.totalCost.toFixed(4)}`,
175
+ };
176
+ }
177
+ if (input.includeBreakdown) {
178
+ // Estimate breakdown based on typical overhead
179
+ const systemPrompt = 8000;
180
+ const systemTools = 15000;
181
+ const overhead = systemPrompt + systemTools;
182
+ const messages = Math.max(0, usage.totalContextTokens - overhead);
183
+ result.breakdown = {
184
+ systemPrompt,
185
+ systemTools,
186
+ messages,
187
+ other: Math.max(0, usage.totalContextTokens - systemPrompt - systemTools - messages),
188
+ };
189
+ }
190
+ // Load historical data
191
+ const historyPath = join(CLAUDE_HOME, 'context-history.json');
192
+ const history = loadJsonSafe(historyPath, { version: 1, sessions: [], dailyAverages: [] });
193
+ if (history.sessions.length > 0) {
194
+ const avgUtilization = history.sessions.reduce((sum, s) => sum + s.utilizationPercent, 0) / history.sessions.length;
195
+ result.history = {
196
+ totalSessions: history.sessions.length,
197
+ avgUtilization: Math.round(avgUtilization * 10) / 10,
198
+ recentDays: history.dailyAverages.slice(-7).map(d => ({
199
+ date: d.date,
200
+ avgTokens: Math.round(d.avgTokens),
201
+ sessionCount: d.sessionCount,
202
+ })),
203
+ };
204
+ }
205
+ return result;
206
+ }
207
+ export const contextStatsTool = {
208
+ name: 'obs_context_stats',
209
+ description: 'Get context window utilization statistics for a Claude Code session. Shows token usage, cost estimates, and historical trends.',
210
+ inputSchema: contextStatsSchema,
211
+ handler: contextStats,
212
+ };
213
+ //# sourceMappingURL=context-stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-stats.js","sourceRoot":"","sources":["../../src/tools/context-stats.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Get SigNoz trace viewer URL for a trace ID
3
+ */
4
+ import { z } from 'zod';
5
+ export declare const getTraceUrlSchema: z.ZodObject<{
6
+ traceId: z.ZodString;
7
+ }, "strip", z.ZodTypeAny, {
8
+ traceId: string;
9
+ }, {
10
+ traceId: string;
11
+ }>;
12
+ export type GetTraceUrlInput = z.infer<typeof getTraceUrlSchema>;
13
+ export declare function getTraceUrl(input: GetTraceUrlInput): Promise<{
14
+ error: string;
15
+ traceId?: undefined;
16
+ url?: undefined;
17
+ message?: undefined;
18
+ } | {
19
+ traceId: string;
20
+ url: string;
21
+ message: string;
22
+ error?: undefined;
23
+ }>;
24
+ export declare const getTraceUrlTool: {
25
+ name: string;
26
+ description: string;
27
+ inputSchema: z.ZodObject<{
28
+ traceId: z.ZodString;
29
+ }, "strip", z.ZodTypeAny, {
30
+ traceId: string;
31
+ }, {
32
+ traceId: string;
33
+ }>;
34
+ handler: typeof getTraceUrl;
35
+ };
36
+ //# sourceMappingURL=get-trace-url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-trace-url.d.ts","sourceRoot":"","sources":["../../src/tools/get-trace-url.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,iBAAiB;;;;;;EAE5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEjE,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB;;;;;;;;;;GAgCxD;AAED,eAAO,MAAM,eAAe;;;;;;;;;;;CAK3B,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Get SigNoz trace viewer URL for a trace ID
3
+ */
4
+ import { z } from 'zod';
5
+ import { SIGNOZ_URL } from '../lib/constants.js';
6
+ export const getTraceUrlSchema = z.object({
7
+ traceId: z.string().describe('The trace ID to get the viewer URL for'),
8
+ });
9
+ export async function getTraceUrl(input) {
10
+ if (!SIGNOZ_URL) {
11
+ return {
12
+ error: 'SigNoz URL not configured. Set SIGNOZ_URL or OTEL_EXPORTER_OTLP_ENDPOINT environment variable.',
13
+ };
14
+ }
15
+ // Convert ingest URL to UI URL
16
+ // Example: https://ingest.us.signoz.cloud/v1/traces -> https://us.signoz.cloud
17
+ let baseUrl = SIGNOZ_URL
18
+ .replace('/v1/traces', '')
19
+ .replace('/v1/metrics', '')
20
+ .replace('/v1/logs', '')
21
+ .replace('ingest.', '')
22
+ .replace(':4318', '')
23
+ .replace(':4317', '');
24
+ // Ensure https
25
+ if (!baseUrl.startsWith('http')) {
26
+ baseUrl = `https://${baseUrl}`;
27
+ }
28
+ // Remove trailing slash
29
+ baseUrl = baseUrl.replace(/\/+$/, '');
30
+ const traceUrl = `${baseUrl}/trace/${input.traceId}`;
31
+ return {
32
+ traceId: input.traceId,
33
+ url: traceUrl,
34
+ message: `Open this URL in your browser to view the trace in SigNoz`,
35
+ };
36
+ }
37
+ export const getTraceUrlTool = {
38
+ name: 'obs_get_trace_url',
39
+ description: 'Generate a SigNoz trace viewer URL for a given trace ID. Use this to share or view traces in the SigNoz UI.',
40
+ inputSchema: getTraceUrlSchema,
41
+ handler: getTraceUrl,
42
+ };
43
+ //# sourceMappingURL=get-trace-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-trace-url.js","sourceRoot":"","sources":["../../src/tools/get-trace-url.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;CACvE,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAuB;IACvD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO;YACL,KAAK,EAAE,gGAAgG;SACxG,CAAC;IACJ,CAAC;IAED,+BAA+B;IAC/B,+EAA+E;IAC/E,IAAI,OAAO,GAAG,UAAU;SACrB,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;SACzB,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;SAC1B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;SACtB,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;SACpB,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAExB,eAAe;IACf,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,OAAO,GAAG,WAAW,OAAO,EAAE,CAAC;IACjC,CAAC;IAED,wBAAwB;IACxB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAEtC,MAAM,QAAQ,GAAG,GAAG,OAAO,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC;IAErD,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,GAAG,EAAE,QAAQ;QACb,OAAO,EAAE,2DAA2D;KACrE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,6GAA6G;IAC1H,WAAW,EAAE,iBAAiB;IAC9B,OAAO,EAAE,WAAW;CACrB,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Health check for telemetry system
3
+ */
4
+ import { z } from 'zod';
5
+ export declare const healthCheckSchema: z.ZodObject<{
6
+ verbose: z.ZodDefault<z.ZodBoolean>;
7
+ }, "strip", z.ZodTypeAny, {
8
+ verbose: boolean;
9
+ }, {
10
+ verbose?: boolean | undefined;
11
+ }>;
12
+ export type HealthCheckInput = z.infer<typeof healthCheckSchema>;
13
+ interface FileStats {
14
+ name: string;
15
+ size: number;
16
+ modified: string;
17
+ lines?: number;
18
+ }
19
+ export declare function healthCheck(input: HealthCheckInput): Promise<{
20
+ status: "healthy" | "degraded" | "unhealthy";
21
+ backends: {
22
+ local: {
23
+ status: string;
24
+ message?: string;
25
+ files?: FileStats[];
26
+ };
27
+ signoz: {
28
+ status: string;
29
+ message?: string;
30
+ configured: boolean;
31
+ };
32
+ };
33
+ telemetryDir: string;
34
+ today: string;
35
+ summary?: string;
36
+ }>;
37
+ export declare const healthCheckTool: {
38
+ name: string;
39
+ description: string;
40
+ inputSchema: z.ZodObject<{
41
+ verbose: z.ZodDefault<z.ZodBoolean>;
42
+ }, "strip", z.ZodTypeAny, {
43
+ verbose: boolean;
44
+ }, {
45
+ verbose?: boolean | undefined;
46
+ }>;
47
+ handler: typeof healthCheck;
48
+ };
49
+ export {};
50
+ //# sourceMappingURL=health-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-check.d.ts","sourceRoot":"","sources":["../../src/tools/health-check.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,eAAO,MAAM,iBAAiB;;;;;;EAE5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEjE,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAqBD,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB;YAE7C,SAAS,GAAG,UAAU,GAAG,WAAW;cAClC;QACR,KAAK,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAA;SAAE,CAAC;QACjE,MAAM,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,OAAO,CAAA;SAAE,CAAC;KACnE;kBACa,MAAM;WACb,MAAM;cACH,MAAM;GAyEnB;AAED,eAAO,MAAM,eAAe;;;;;;;;;;;CAK3B,CAAC"}