observability-toolkit 1.8.0 → 1.8.4

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 (186) hide show
  1. package/README.md +81 -3
  2. package/dist/backends/index.d.ts +119 -0
  3. package/dist/backends/index.d.ts.map +1 -1
  4. package/dist/backends/index.js +57 -0
  5. package/dist/backends/index.js.map +1 -1
  6. package/dist/backends/index.test.d.ts +5 -0
  7. package/dist/backends/index.test.d.ts.map +1 -0
  8. package/dist/backends/index.test.js +156 -0
  9. package/dist/backends/index.test.js.map +1 -0
  10. package/dist/backends/local-jsonl-boolean-search.test.js +8 -27
  11. package/dist/backends/local-jsonl-boolean-search.test.js.map +1 -1
  12. package/dist/backends/local-jsonl-logs.test.d.ts +2 -0
  13. package/dist/backends/local-jsonl-logs.test.d.ts.map +1 -0
  14. package/dist/backends/local-jsonl-logs.test.js +603 -0
  15. package/dist/backends/local-jsonl-logs.test.js.map +1 -0
  16. package/dist/backends/local-jsonl-traces.test.d.ts +2 -0
  17. package/dist/backends/local-jsonl-traces.test.d.ts.map +1 -0
  18. package/dist/backends/local-jsonl-traces.test.js +1723 -0
  19. package/dist/backends/local-jsonl-traces.test.js.map +1 -0
  20. package/dist/backends/local-jsonl.d.ts +4 -1
  21. package/dist/backends/local-jsonl.d.ts.map +1 -1
  22. package/dist/backends/local-jsonl.js +185 -1
  23. package/dist/backends/local-jsonl.js.map +1 -1
  24. package/dist/backends/local-jsonl.test.js +723 -46
  25. package/dist/backends/local-jsonl.test.js.map +1 -1
  26. package/dist/backends/signoz-api.d.ts +32 -0
  27. package/dist/backends/signoz-api.d.ts.map +1 -1
  28. package/dist/backends/signoz-api.js +231 -33
  29. package/dist/backends/signoz-api.js.map +1 -1
  30. package/dist/backends/signoz-api.test.js +410 -63
  31. package/dist/backends/signoz-api.test.js.map +1 -1
  32. package/dist/lib/constants.d.ts +59 -0
  33. package/dist/lib/constants.d.ts.map +1 -1
  34. package/dist/lib/constants.js +252 -6
  35. package/dist/lib/constants.js.map +1 -1
  36. package/dist/lib/constants.test.js +357 -21
  37. package/dist/lib/constants.test.js.map +1 -1
  38. package/dist/lib/edge-cases.test.d.ts +11 -0
  39. package/dist/lib/edge-cases.test.d.ts.map +1 -0
  40. package/dist/lib/edge-cases.test.js +634 -0
  41. package/dist/lib/edge-cases.test.js.map +1 -0
  42. package/dist/lib/error-sanitizer.d.ts +57 -0
  43. package/dist/lib/error-sanitizer.d.ts.map +1 -0
  44. package/dist/lib/error-sanitizer.js +207 -0
  45. package/dist/lib/error-sanitizer.js.map +1 -0
  46. package/dist/lib/error-sanitizer.test.d.ts +8 -0
  47. package/dist/lib/error-sanitizer.test.d.ts.map +1 -0
  48. package/dist/lib/error-sanitizer.test.js +369 -0
  49. package/dist/lib/error-sanitizer.test.js.map +1 -0
  50. package/dist/lib/file-utils.d.ts +134 -0
  51. package/dist/lib/file-utils.d.ts.map +1 -1
  52. package/dist/lib/file-utils.js +395 -9
  53. package/dist/lib/file-utils.js.map +1 -1
  54. package/dist/lib/file-utils.test.js +444 -3
  55. package/dist/lib/file-utils.test.js.map +1 -1
  56. package/dist/lib/indexer.d.ts +9 -1
  57. package/dist/lib/indexer.d.ts.map +1 -1
  58. package/dist/lib/indexer.js +51 -2
  59. package/dist/lib/indexer.js.map +1 -1
  60. package/dist/lib/indexer.test.js +138 -20
  61. package/dist/lib/indexer.test.js.map +1 -1
  62. package/dist/lib/input-validator.d.ts +103 -0
  63. package/dist/lib/input-validator.d.ts.map +1 -0
  64. package/dist/lib/input-validator.js +250 -0
  65. package/dist/lib/input-validator.js.map +1 -0
  66. package/dist/lib/input-validator.test.d.ts +2 -0
  67. package/dist/lib/input-validator.test.d.ts.map +1 -0
  68. package/dist/lib/input-validator.test.js +287 -0
  69. package/dist/lib/input-validator.test.js.map +1 -0
  70. package/dist/lib/query-sanitizer.d.ts +143 -0
  71. package/dist/lib/query-sanitizer.d.ts.map +1 -0
  72. package/dist/lib/query-sanitizer.js +261 -0
  73. package/dist/lib/query-sanitizer.js.map +1 -0
  74. package/dist/lib/query-sanitizer.test.d.ts +5 -0
  75. package/dist/lib/query-sanitizer.test.d.ts.map +1 -0
  76. package/dist/lib/query-sanitizer.test.js +400 -0
  77. package/dist/lib/query-sanitizer.test.js.map +1 -0
  78. package/dist/lib/server-utils.d.ts +80 -0
  79. package/dist/lib/server-utils.d.ts.map +1 -0
  80. package/dist/lib/server-utils.js +141 -0
  81. package/dist/lib/server-utils.js.map +1 -0
  82. package/dist/lib/shared-schemas.d.ts +59 -0
  83. package/dist/lib/shared-schemas.d.ts.map +1 -0
  84. package/dist/lib/shared-schemas.js +58 -0
  85. package/dist/lib/shared-schemas.js.map +1 -0
  86. package/dist/lib/shared-schemas.test.d.ts +5 -0
  87. package/dist/lib/shared-schemas.test.d.ts.map +1 -0
  88. package/dist/lib/shared-schemas.test.js +106 -0
  89. package/dist/lib/shared-schemas.test.js.map +1 -0
  90. package/dist/lib/toon-encoder.d.ts +21 -0
  91. package/dist/lib/toon-encoder.d.ts.map +1 -0
  92. package/dist/lib/toon-encoder.js +46 -0
  93. package/dist/lib/toon-encoder.js.map +1 -0
  94. package/dist/server.d.ts +1 -1
  95. package/dist/server.d.ts.map +1 -1
  96. package/dist/server.js +155 -81
  97. package/dist/server.js.map +1 -1
  98. package/dist/server.test.js +363 -0
  99. package/dist/server.test.js.map +1 -1
  100. package/dist/test-helpers/env-utils.d.ts +65 -0
  101. package/dist/test-helpers/env-utils.d.ts.map +1 -0
  102. package/dist/test-helpers/env-utils.js +94 -0
  103. package/dist/test-helpers/env-utils.js.map +1 -0
  104. package/dist/test-helpers/file-utils.d.ts +93 -0
  105. package/dist/test-helpers/file-utils.d.ts.map +1 -0
  106. package/dist/test-helpers/file-utils.js +206 -0
  107. package/dist/test-helpers/file-utils.js.map +1 -0
  108. package/dist/test-helpers/index.d.ts +10 -0
  109. package/dist/test-helpers/index.d.ts.map +1 -0
  110. package/dist/test-helpers/index.js +28 -0
  111. package/dist/test-helpers/index.js.map +1 -0
  112. package/dist/test-helpers/mock-backends.d.ts +139 -0
  113. package/dist/test-helpers/mock-backends.d.ts.map +1 -0
  114. package/dist/test-helpers/mock-backends.js +227 -0
  115. package/dist/test-helpers/mock-backends.js.map +1 -0
  116. package/dist/test-helpers/mock-backends.test.d.ts +5 -0
  117. package/dist/test-helpers/mock-backends.test.d.ts.map +1 -0
  118. package/dist/test-helpers/mock-backends.test.js +368 -0
  119. package/dist/test-helpers/mock-backends.test.js.map +1 -0
  120. package/dist/test-helpers/schema-validators.d.ts +32 -0
  121. package/dist/test-helpers/schema-validators.d.ts.map +1 -0
  122. package/dist/test-helpers/schema-validators.js +125 -0
  123. package/dist/test-helpers/schema-validators.js.map +1 -0
  124. package/dist/test-helpers/test-data-builders.d.ts +223 -0
  125. package/dist/test-helpers/test-data-builders.d.ts.map +1 -0
  126. package/dist/test-helpers/test-data-builders.js +288 -0
  127. package/dist/test-helpers/test-data-builders.js.map +1 -0
  128. package/dist/test-helpers/test-data-builders.test.d.ts +2 -0
  129. package/dist/test-helpers/test-data-builders.test.d.ts.map +1 -0
  130. package/dist/test-helpers/test-data-builders.test.js +306 -0
  131. package/dist/test-helpers/test-data-builders.test.js.map +1 -0
  132. package/dist/test-helpers/tool-validators.d.ts +28 -0
  133. package/dist/test-helpers/tool-validators.d.ts.map +1 -0
  134. package/dist/test-helpers/tool-validators.js +56 -0
  135. package/dist/test-helpers/tool-validators.js.map +1 -0
  136. package/dist/tools/context-stats.d.ts +1 -0
  137. package/dist/tools/context-stats.d.ts.map +1 -1
  138. package/dist/tools/context-stats.js +9 -5
  139. package/dist/tools/context-stats.js.map +1 -1
  140. package/dist/tools/context-stats.test.js +24 -10
  141. package/dist/tools/context-stats.test.js.map +1 -1
  142. package/dist/tools/get-trace-url.js +2 -2
  143. package/dist/tools/get-trace-url.js.map +1 -1
  144. package/dist/tools/health-check.js +2 -2
  145. package/dist/tools/health-check.js.map +1 -1
  146. package/dist/tools/index.d.ts +1 -0
  147. package/dist/tools/index.d.ts.map +1 -1
  148. package/dist/tools/index.js +1 -0
  149. package/dist/tools/index.js.map +1 -1
  150. package/dist/tools/query-evaluations.d.ts +186 -0
  151. package/dist/tools/query-evaluations.d.ts.map +1 -0
  152. package/dist/tools/query-evaluations.js +351 -0
  153. package/dist/tools/query-evaluations.js.map +1 -0
  154. package/dist/tools/query-evaluations.test.d.ts +5 -0
  155. package/dist/tools/query-evaluations.test.d.ts.map +1 -0
  156. package/dist/tools/query-evaluations.test.js +733 -0
  157. package/dist/tools/query-evaluations.test.js.map +1 -0
  158. package/dist/tools/query-llm-events.d.ts +24 -18
  159. package/dist/tools/query-llm-events.d.ts.map +1 -1
  160. package/dist/tools/query-llm-events.js +103 -60
  161. package/dist/tools/query-llm-events.js.map +1 -1
  162. package/dist/tools/query-llm-events.test.js +271 -9
  163. package/dist/tools/query-llm-events.test.js.map +1 -1
  164. package/dist/tools/query-logs.d.ts +28 -20
  165. package/dist/tools/query-logs.d.ts.map +1 -1
  166. package/dist/tools/query-logs.js +85 -61
  167. package/dist/tools/query-logs.js.map +1 -1
  168. package/dist/tools/query-logs.test.js +74 -145
  169. package/dist/tools/query-logs.test.js.map +1 -1
  170. package/dist/tools/query-metrics.d.ts +20 -20
  171. package/dist/tools/query-metrics.d.ts.map +1 -1
  172. package/dist/tools/query-metrics.js +109 -61
  173. package/dist/tools/query-metrics.js.map +1 -1
  174. package/dist/tools/query-metrics.test.js +26 -61
  175. package/dist/tools/query-metrics.test.js.map +1 -1
  176. package/dist/tools/query-traces.d.ts +24 -22
  177. package/dist/tools/query-traces.d.ts.map +1 -1
  178. package/dist/tools/query-traces.js +95 -70
  179. package/dist/tools/query-traces.js.map +1 -1
  180. package/dist/tools/query-traces.test.js +294 -90
  181. package/dist/tools/query-traces.test.js.map +1 -1
  182. package/dist/tools/setup-claudeignore.js +7 -7
  183. package/dist/tools/setup-claudeignore.js.map +1 -1
  184. package/dist/tools/setup-claudeignore.test.js +4 -25
  185. package/dist/tools/setup-claudeignore.test.js.map +1 -1
  186. package/package.json +3 -4
@@ -4,23 +4,23 @@
4
4
  import { z } from 'zod';
5
5
  import type { TelemetryBackend } from '../backends/index.js';
6
6
  export declare const queryTracesSchema: z.ZodObject<{
7
- backend: z.ZodDefault<z.ZodEnum<["local", "signoz", "auto"]>>;
8
- sessionId: z.ZodOptional<z.ZodString>;
9
- traceId: z.ZodOptional<z.ZodString>;
7
+ limit: z.ZodDefault<z.ZodNumber>;
8
+ startDate: z.ZodOptional<z.ZodString>;
9
+ endDate: z.ZodOptional<z.ZodString>;
10
+ operationName: z.ZodOptional<z.ZodEnum<["chat", "embeddings", "invoke_agent", "execute_tool"]>>;
10
11
  serviceName: z.ZodOptional<z.ZodString>;
11
12
  spanName: z.ZodOptional<z.ZodString>;
12
13
  minDurationMs: z.ZodOptional<z.ZodNumber>;
13
14
  maxDurationMs: z.ZodOptional<z.ZodNumber>;
14
- attributeFilter: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
15
+ attributeFilter: z.ZodEffects<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>>>, Record<string, string | number | boolean> | undefined, Record<string, string | number | boolean> | undefined>;
15
16
  agentId: z.ZodOptional<z.ZodString>;
16
17
  agentName: z.ZodOptional<z.ZodString>;
17
18
  toolName: z.ZodOptional<z.ZodString>;
18
19
  toolCallId: z.ZodOptional<z.ZodString>;
19
20
  toolType: z.ZodOptional<z.ZodString>;
20
- operationName: z.ZodOptional<z.ZodEnum<["chat", "embeddings", "invoke_agent", "execute_tool"]>>;
21
- startDate: z.ZodOptional<z.ZodString>;
22
- endDate: z.ZodOptional<z.ZodString>;
23
- limit: z.ZodDefault<z.ZodNumber>;
21
+ traceId: z.ZodOptional<z.ZodString>;
22
+ sessionId: z.ZodOptional<z.ZodString>;
23
+ backend: z.ZodDefault<z.ZodEnum<["local", "signoz", "auto"]>>;
24
24
  }, "strip", z.ZodTypeAny, {
25
25
  limit: number;
26
26
  backend: "local" | "signoz" | "auto";
@@ -37,8 +37,8 @@ export declare const queryTracesSchema: z.ZodObject<{
37
37
  toolType?: string | undefined;
38
38
  operationName?: "chat" | "embeddings" | "invoke_agent" | "execute_tool" | undefined;
39
39
  sessionId?: string | undefined;
40
- startDate?: string | undefined;
41
40
  endDate?: string | undefined;
41
+ startDate?: string | undefined;
42
42
  }, {
43
43
  limit?: number | undefined;
44
44
  backend?: "local" | "signoz" | "auto" | undefined;
@@ -55,8 +55,8 @@ export declare const queryTracesSchema: z.ZodObject<{
55
55
  toolType?: string | undefined;
56
56
  operationName?: "chat" | "embeddings" | "invoke_agent" | "execute_tool" | undefined;
57
57
  sessionId?: string | undefined;
58
- startDate?: string | undefined;
59
58
  endDate?: string | undefined;
59
+ startDate?: string | undefined;
60
60
  }>;
61
61
  export type QueryTracesInput = z.input<typeof queryTracesSchema>;
62
62
  export interface QueryTracesOptions {
@@ -64,8 +64,6 @@ export interface QueryTracesOptions {
64
64
  signozBackend?: TelemetryBackend;
65
65
  }
66
66
  export declare function queryTraces(rawInput: QueryTracesInput, options?: QueryTracesOptions): Promise<{
67
- backend: string;
68
- count: number;
69
67
  traces: {
70
68
  traceId: string;
71
69
  spanId: string;
@@ -78,28 +76,32 @@ export declare function queryTraces(rawInput: QueryTracesInput, options?: QueryT
78
76
  } | undefined;
79
77
  attributes: Record<string, unknown> | undefined;
80
78
  }[];
79
+ truncated?: boolean | undefined;
80
+ originalCount?: number | undefined;
81
+ backend: string;
82
+ count: number;
81
83
  }>;
82
84
  export declare const queryTracesTool: {
83
85
  name: string;
84
86
  description: string;
85
87
  inputSchema: z.ZodObject<{
86
- backend: z.ZodDefault<z.ZodEnum<["local", "signoz", "auto"]>>;
87
- sessionId: z.ZodOptional<z.ZodString>;
88
- traceId: z.ZodOptional<z.ZodString>;
88
+ limit: z.ZodDefault<z.ZodNumber>;
89
+ startDate: z.ZodOptional<z.ZodString>;
90
+ endDate: z.ZodOptional<z.ZodString>;
91
+ operationName: z.ZodOptional<z.ZodEnum<["chat", "embeddings", "invoke_agent", "execute_tool"]>>;
89
92
  serviceName: z.ZodOptional<z.ZodString>;
90
93
  spanName: z.ZodOptional<z.ZodString>;
91
94
  minDurationMs: z.ZodOptional<z.ZodNumber>;
92
95
  maxDurationMs: z.ZodOptional<z.ZodNumber>;
93
- attributeFilter: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
96
+ attributeFilter: z.ZodEffects<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>>>, Record<string, string | number | boolean> | undefined, Record<string, string | number | boolean> | undefined>;
94
97
  agentId: z.ZodOptional<z.ZodString>;
95
98
  agentName: z.ZodOptional<z.ZodString>;
96
99
  toolName: z.ZodOptional<z.ZodString>;
97
100
  toolCallId: z.ZodOptional<z.ZodString>;
98
101
  toolType: z.ZodOptional<z.ZodString>;
99
- operationName: z.ZodOptional<z.ZodEnum<["chat", "embeddings", "invoke_agent", "execute_tool"]>>;
100
- startDate: z.ZodOptional<z.ZodString>;
101
- endDate: z.ZodOptional<z.ZodString>;
102
- limit: z.ZodDefault<z.ZodNumber>;
102
+ traceId: z.ZodOptional<z.ZodString>;
103
+ sessionId: z.ZodOptional<z.ZodString>;
104
+ backend: z.ZodDefault<z.ZodEnum<["local", "signoz", "auto"]>>;
103
105
  }, "strip", z.ZodTypeAny, {
104
106
  limit: number;
105
107
  backend: "local" | "signoz" | "auto";
@@ -116,8 +118,8 @@ export declare const queryTracesTool: {
116
118
  toolType?: string | undefined;
117
119
  operationName?: "chat" | "embeddings" | "invoke_agent" | "execute_tool" | undefined;
118
120
  sessionId?: string | undefined;
119
- startDate?: string | undefined;
120
121
  endDate?: string | undefined;
122
+ startDate?: string | undefined;
121
123
  }, {
122
124
  limit?: number | undefined;
123
125
  backend?: "local" | "signoz" | "auto" | undefined;
@@ -134,8 +136,8 @@ export declare const queryTracesTool: {
134
136
  toolType?: string | undefined;
135
137
  operationName?: "chat" | "embeddings" | "invoke_agent" | "execute_tool" | undefined;
136
138
  sessionId?: string | undefined;
137
- startDate?: string | undefined;
138
139
  endDate?: string | undefined;
140
+ startDate?: string | undefined;
139
141
  }>;
140
142
  handler: typeof queryTraces;
141
143
  };
@@ -1 +1 @@
1
- {"version":3,"file":"query-traces.d.ts","sourceRoot":"","sources":["../../src/tools/query-traces.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmB5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAGjE,MAAM,WAAW,kBAAkB;IACjC,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,aAAa,CAAC,EAAE,gBAAgB,CAAC;CAClC;AAED,wBAAsB,WAAW,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,kBAAkB;;;;;;;;;;;;;;;GA2EzF;AAED,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAK3B,CAAC"}
1
+ {"version":3,"file":"query-traces.d.ts","sourceRoot":"","sources":["../../src/tools/query-traces.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAiB7D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwB5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAGjE,MAAM,WAAW,kBAAkB;IACjC,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,aAAa,CAAC,EAAE,gBAAgB,CAAC;CAClC;AAED,wBAAsB,WAAW,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,kBAAkB;;;;;;;;;;;;;;;;;GAqGzF;AAED,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAK3B,CAAC"}
@@ -4,61 +4,97 @@
4
4
  import { z } from 'zod';
5
5
  import { MultiDirectoryBackend } from '../backends/local-jsonl.js';
6
6
  import { SigNozApiBackend } from '../backends/signoz-api.js';
7
- import { SIGNOZ_URL, SIGNOZ_API_KEY } from '../lib/constants.js';
7
+ import { SIGNOZ_URL, SIGNOZ_API_KEY, MAX_RESULTS_IN_MEMORY } from '../lib/constants.js';
8
+ import { enforceMemoryLimit } from '../lib/file-utils.js';
9
+ import { validateLimit, validateDuration, validateDateRange, validateRegexPattern, InputValidationError, } from '../lib/input-validator.js';
10
+ import { backendSchema, sessionSchema, traceIdSchema, dateRangeSchema, paginationSchema, operationNameSchema, } from '../lib/shared-schemas.js';
8
11
  export const queryTracesSchema = z.object({
9
- backend: z.enum(['local', 'signoz', 'auto']).default('auto').describe('Backend to query: local (JSONL files), signoz (API), or auto (tries both)'),
10
- sessionId: z.string().optional().describe('Filter by Claude Code session ID'),
11
- traceId: z.string().optional().describe('Filter by specific trace ID'),
12
- serviceName: z.string().optional().describe('Filter by service name'),
13
- spanName: z.string().optional().describe('Filter by span name (substring match)'),
14
- minDurationMs: z.number().optional().describe('Minimum span duration in milliseconds'),
15
- maxDurationMs: z.number().optional().describe('Maximum span duration in milliseconds'),
16
- attributeFilter: z.record(z.union([z.string(), z.number(), z.boolean()])).optional().describe('Filter by span attributes (e.g., {"hook.name": "session-start", "mcp.server": "signoz"})'),
12
+ ...backendSchema,
13
+ ...sessionSchema,
14
+ ...traceIdSchema,
15
+ serviceName: z.string().max(256).optional().describe('Service name'),
16
+ spanName: z.string().max(512).optional().describe('Span name (substring)'),
17
+ minDurationMs: z.number().optional().describe('Min duration (ms)'),
18
+ maxDurationMs: z.number().optional().describe('Max duration (ms)'),
19
+ attributeFilter: z.record(z.string().max(100).regex(/^[a-zA-Z0-9_.]+$/, 'Invalid attribute name'), z.union([z.string().max(500), z.number().finite(), z.boolean()])).optional().refine(filter => !filter || Object.keys(filter).length <= 20, 'Maximum 20 attribute filters allowed').describe('Attribute filters (max 20)'),
17
20
  // OTel GenAI agent/tool filters
18
- agentId: z.string().optional().describe('Filter by agent ID (gen_ai.agent.id)'),
19
- agentName: z.string().optional().describe('Filter by agent name (gen_ai.agent.name)'),
20
- toolName: z.string().optional().describe('Filter by tool name (gen_ai.tool.name)'),
21
- toolCallId: z.string().optional().describe('Filter by tool call ID (gen_ai.tool.call.id)'),
22
- toolType: z.string().optional().describe('Filter by tool type (gen_ai.tool.type)'),
23
- operationName: z.enum(['chat', 'embeddings', 'invoke_agent', 'execute_tool']).optional().describe('Filter by OTel GenAI operation name'),
24
- startDate: z.string().optional().describe('Start date (YYYY-MM-DD)'),
25
- endDate: z.string().optional().describe('End date (YYYY-MM-DD)'),
26
- limit: z.number().max(1000).default(50).describe('Maximum number of results'),
21
+ agentId: z.string().max(128).optional().describe('Agent ID (gen_ai.agent.id)'),
22
+ agentName: z.string().max(256).optional().describe('Agent name (gen_ai.agent.name)'),
23
+ toolName: z.string().max(256).optional().describe('Tool name (gen_ai.tool.name)'),
24
+ toolCallId: z.string().max(128).optional().describe('Tool call ID'),
25
+ toolType: z.string().max(128).optional().describe('Tool type'),
26
+ ...operationNameSchema,
27
+ ...dateRangeSchema,
28
+ ...paginationSchema,
27
29
  });
28
30
  export async function queryTraces(rawInput, options) {
29
- const input = queryTracesSchema.parse(rawInput);
30
- // Merge sessionId into attributeFilter if provided
31
- const attributeFilter = input.sessionId
32
- ? { ...input.attributeFilter, 'session.id': input.sessionId }
33
- : input.attributeFilter;
34
- const queryOptions = {
35
- traceId: input.traceId,
36
- serviceName: input.serviceName,
37
- spanName: input.spanName,
38
- minDurationMs: input.minDurationMs,
39
- maxDurationMs: input.maxDurationMs,
40
- attributeFilter,
41
- // OTel GenAI agent/tool filters
42
- agentId: input.agentId,
43
- agentName: input.agentName,
44
- toolName: input.toolName,
45
- toolCallId: input.toolCallId,
46
- toolType: input.toolType,
47
- operationName: input.operationName,
48
- startDate: input.startDate,
49
- endDate: input.endDate,
50
- limit: input.limit,
51
- };
52
- const hasSigNozConfig = SIGNOZ_URL && SIGNOZ_API_KEY;
53
- const backend = input.backend === 'auto'
54
- ? (hasSigNozConfig ? 'signoz' : 'local')
55
- : input.backend;
56
- if (backend === 'local' || input.backend === 'auto') {
57
- const local = options?.localBackend ?? new MultiDirectoryBackend();
58
- const traces = await local.queryTraces(queryOptions);
59
- if (traces.length > 0 || backend === 'local') {
31
+ try {
32
+ const input = queryTracesSchema.parse(rawInput);
33
+ // Validate inputs
34
+ const validatedLimit = validateLimit(input.limit);
35
+ const validatedMinDuration = validateDuration(input.minDurationMs, 'minDurationMs');
36
+ const validatedMaxDuration = validateDuration(input.maxDurationMs, 'maxDurationMs');
37
+ // Validate date range if provided
38
+ if (input.startDate || input.endDate) {
39
+ validateDateRange(input.startDate, input.endDate);
40
+ }
41
+ // Validate spanName as regex pattern if provided
42
+ if (input.spanName) {
43
+ validateRegexPattern(input.spanName);
44
+ }
45
+ // Merge sessionId into attributeFilter if provided
46
+ const attributeFilter = input.sessionId
47
+ ? { ...input.attributeFilter, 'session.id': input.sessionId }
48
+ : input.attributeFilter;
49
+ const queryOptions = {
50
+ traceId: input.traceId,
51
+ serviceName: input.serviceName,
52
+ spanName: input.spanName,
53
+ minDurationMs: validatedMinDuration,
54
+ maxDurationMs: validatedMaxDuration,
55
+ attributeFilter,
56
+ // OTel GenAI agent/tool filters
57
+ agentId: input.agentId,
58
+ agentName: input.agentName,
59
+ toolName: input.toolName,
60
+ toolCallId: input.toolCallId,
61
+ toolType: input.toolType,
62
+ operationName: input.operationName,
63
+ startDate: input.startDate,
64
+ endDate: input.endDate,
65
+ limit: validatedLimit,
66
+ };
67
+ const hasSigNozConfig = SIGNOZ_URL && SIGNOZ_API_KEY;
68
+ const backend = input.backend === 'auto'
69
+ ? (hasSigNozConfig ? 'signoz' : 'local')
70
+ : input.backend;
71
+ if (backend === 'local' || input.backend === 'auto') {
72
+ const local = options?.localBackend ?? new MultiDirectoryBackend();
73
+ const rawTraces = await local.queryTraces(queryOptions);
74
+ // Enforce memory limit
75
+ const { results: traces, truncated, originalCount } = enforceMemoryLimit(rawTraces, MAX_RESULTS_IN_MEMORY);
76
+ if (traces.length > 0 || backend === 'local') {
77
+ return {
78
+ backend: 'local',
79
+ count: traces.length,
80
+ ...(truncated && { truncated: true, originalCount }),
81
+ traces: traces.map(t => ({
82
+ traceId: t.traceId,
83
+ spanId: t.spanId,
84
+ name: t.name,
85
+ kind: t.kind,
86
+ durationMs: t.durationMs,
87
+ status: t.status,
88
+ attributes: t.attributes,
89
+ })),
90
+ };
91
+ }
92
+ }
93
+ if (backend === 'signoz' || (input.backend === 'auto' && hasSigNozConfig)) {
94
+ const signoz = options?.signozBackend ?? new SigNozApiBackend();
95
+ const traces = await signoz.queryTraces(queryOptions);
60
96
  return {
61
- backend: 'local',
97
+ backend: 'signoz',
62
98
  count: traces.length,
63
99
  traces: traces.map(t => ({
64
100
  traceId: t.traceId,
@@ -71,31 +107,20 @@ export async function queryTraces(rawInput, options) {
71
107
  })),
72
108
  };
73
109
  }
110
+ // Exhaustive check - TypeScript will error if a new backend is added but not handled
111
+ const _exhaustiveCheck = backend;
112
+ throw new Error(`Unhandled backend: ${_exhaustiveCheck}`);
74
113
  }
75
- if (backend === 'signoz' || (input.backend === 'auto' && hasSigNozConfig)) {
76
- const signoz = options?.signozBackend ?? new SigNozApiBackend();
77
- const traces = await signoz.queryTraces(queryOptions);
78
- return {
79
- backend: 'signoz',
80
- count: traces.length,
81
- traces: traces.map(t => ({
82
- traceId: t.traceId,
83
- spanId: t.spanId,
84
- name: t.name,
85
- kind: t.kind,
86
- durationMs: t.durationMs,
87
- status: t.status,
88
- attributes: t.attributes,
89
- })),
90
- };
114
+ catch (error) {
115
+ if (error instanceof InputValidationError) {
116
+ throw new Error(`Validation error (${error.field}): ${error.message}`);
117
+ }
118
+ throw error;
91
119
  }
92
- // Exhaustive check - TypeScript will error if a new backend is added but not handled
93
- const _exhaustiveCheck = backend;
94
- throw new Error(`Unhandled backend: ${_exhaustiveCheck}`);
95
120
  }
96
121
  export const queryTracesTool = {
97
122
  name: 'obs_query_traces',
98
- description: 'Query traces from local JSONL files or SigNoz Cloud. Filter by trace ID, service name, span name, duration, and date range.',
123
+ description: 'Query traces from local JSONL or SigNoz. Filter by trace/service/span/duration/date.',
99
124
  inputSchema: queryTracesSchema,
100
125
  handler: queryTraces,
101
126
  };
@@ -1 +1 @@
1
- {"version":3,"file":"query-traces.js","sourceRoot":"","sources":["../../src/tools/query-traces.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query-traces.js","sourceRoot":"","sources":["../../src/tools/query-traces.ts"],"names":[],"mappings":"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"}