@inkeep/agents-manage-ui 0.1.1 → 0.1.2
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/{.env.sample → .env.example} +6 -1
- package/.turbo/turbo-build.log +27 -33
- package/.turbo/turbo-test.log +43 -10
- package/LICENSE.md +22 -17
- package/package.json +5 -5
- package/src/app/api/signoz/conversations/[conversationId]/route.ts +43 -4
- package/src/app/api/signoz/route.ts +8 -6
- package/src/components/api-keys/form/api-key-form.tsx +2 -0
- package/src/components/api-keys/form/validation.ts +1 -1
- package/src/components/artifact-components/form/artifact-component-form.tsx +5 -0
- package/src/components/artifact-components/form/validation.ts +3 -3
- package/src/components/credentials/views/credential-form-validation.ts +1 -1
- package/src/components/credentials/views/credential-form.tsx +2 -0
- package/src/components/credentials/views/edit-credential-form.tsx +1 -1
- package/src/components/credentials/views/generic-auth-form.tsx +1 -1
- package/src/components/data-components/form/data-component-form.tsx +10 -1
- package/src/components/data-components/form/validation.ts +3 -2
- package/src/components/form/expandable-field.tsx +6 -1
- package/src/components/form/form-field-wrapper.tsx +3 -1
- package/src/components/form/generic-combo-box.tsx +3 -1
- package/src/components/form/generic-input.tsx +9 -1
- package/src/components/form/generic-select.tsx +3 -1
- package/src/components/form/generic-textarea.tsx +3 -1
- package/src/components/form/json-schema-input.tsx +9 -1
- package/src/components/graph/playground/chat-widget.tsx +30 -1
- package/src/components/graph/playground/playground.tsx +7 -1
- package/src/components/graph/sidepane/metadata/metadata-editor.tsx +38 -38
- package/src/components/graph/sidepane/nodes/agent-node-editor.tsx +22 -8
- package/src/components/graph/sidepane/nodes/expandable-text-area.tsx +3 -1
- package/src/components/graph/sidepane/nodes/form-fields.tsx +10 -1
- package/src/components/mcp-servers/form/mcp-server-form.tsx +8 -1
- package/src/components/mcp-servers/form/validation.ts +1 -1
- package/src/components/projects/edit-project-dialog.tsx +1 -1
- package/src/components/projects/form/project-form.tsx +3 -0
- package/src/components/projects/form/validation.ts +14 -10
- package/src/components/projects/new-project-dialog.tsx +1 -1
- package/src/components/traces/timeline/timeline-wrapper.tsx +117 -28
- package/src/components/ui/alert.tsx +66 -0
- package/src/components/ui/form.tsx +11 -4
- package/src/hooks/use-chat-activities-polling.ts +44 -11
- package/src/lib/api/signoz-stats.ts +958 -304
- package/src/lib/types/graph-full.ts +1 -1
- package/src/lib/validation.ts +1 -1
|
@@ -1,12 +1,26 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { SPAN_KEYS, AI_OPERATIONS, SPAN_NAMES, QUERY_FIELD_CONFIGS, UNKNOWN_VALUE, AI_TOOL_TYPES, OPERATORS, QUERY_EXPRESSIONS, REDUCE_OPERATIONS, ORDER_DIRECTIONS, QUERY_DEFAULTS, DATA_SOURCES, AGGREGATE_OPERATORS, QUERY_TYPES, PANEL_TYPES } from '@/constants/signoz';
|
|
3
1
|
import axios from 'axios';
|
|
4
2
|
import axiosRetry from 'axios-retry';
|
|
3
|
+
import { z } from 'zod/v4';
|
|
4
|
+
import {
|
|
5
|
+
AGGREGATE_OPERATORS,
|
|
6
|
+
AI_OPERATIONS,
|
|
7
|
+
AI_TOOL_TYPES,
|
|
8
|
+
DATA_SOURCES,
|
|
9
|
+
OPERATORS,
|
|
10
|
+
ORDER_DIRECTIONS,
|
|
11
|
+
PANEL_TYPES,
|
|
12
|
+
QUERY_DEFAULTS,
|
|
13
|
+
QUERY_EXPRESSIONS,
|
|
14
|
+
QUERY_FIELD_CONFIGS,
|
|
15
|
+
QUERY_TYPES,
|
|
16
|
+
REDUCE_OPERATIONS,
|
|
17
|
+
SPAN_KEYS,
|
|
18
|
+
SPAN_NAMES,
|
|
19
|
+
UNKNOWN_VALUE,
|
|
20
|
+
} from '@/constants/signoz';
|
|
5
21
|
|
|
6
22
|
// ---------- String Constants for Type Safety
|
|
7
23
|
|
|
8
|
-
|
|
9
|
-
|
|
10
24
|
export interface ConversationStats {
|
|
11
25
|
conversationId: string;
|
|
12
26
|
tenantId: string;
|
|
@@ -22,7 +36,7 @@ export interface ConversationStats {
|
|
|
22
36
|
totalErrors: number;
|
|
23
37
|
hasErrors: boolean;
|
|
24
38
|
firstUserMessage?: string;
|
|
25
|
-
startTime?: number;
|
|
39
|
+
startTime?: number;
|
|
26
40
|
}
|
|
27
41
|
|
|
28
42
|
export interface PaginatedConversationStats {
|
|
@@ -43,12 +57,22 @@ export interface SpanFilterOptions {
|
|
|
43
57
|
key: string;
|
|
44
58
|
value: string;
|
|
45
59
|
operator?:
|
|
46
|
-
| '='
|
|
47
|
-
| '
|
|
48
|
-
| '
|
|
49
|
-
| '
|
|
50
|
-
| '
|
|
51
|
-
| '
|
|
60
|
+
| '='
|
|
61
|
+
| '!='
|
|
62
|
+
| '<'
|
|
63
|
+
| '>'
|
|
64
|
+
| '<='
|
|
65
|
+
| '>='
|
|
66
|
+
| 'in'
|
|
67
|
+
| 'nin'
|
|
68
|
+
| 'contains'
|
|
69
|
+
| 'ncontains'
|
|
70
|
+
| 'regex'
|
|
71
|
+
| 'nregex'
|
|
72
|
+
| 'like'
|
|
73
|
+
| 'nlike'
|
|
74
|
+
| 'exists'
|
|
75
|
+
| 'nexists';
|
|
52
76
|
}[];
|
|
53
77
|
}
|
|
54
78
|
|
|
@@ -56,15 +80,10 @@ export interface SpanFilterOptions {
|
|
|
56
80
|
|
|
57
81
|
const nsToMs = (ns: number) => Math.floor(ns / 1_000_000);
|
|
58
82
|
|
|
59
|
-
const asNumberIfNumeric = (v: string) =>
|
|
60
|
-
/^-?\d+(\.\d+)?$/.test(v) ? Number(v) : v;
|
|
83
|
+
const asNumberIfNumeric = (v: string) => (/^-?\d+(\.\d+)?$/.test(v) ? Number(v) : v);
|
|
61
84
|
|
|
62
85
|
// Type-safe filter value schema and parser
|
|
63
|
-
const FilterValueSchema = z.union([
|
|
64
|
-
z.string(),
|
|
65
|
-
z.number(),
|
|
66
|
-
z.boolean(),
|
|
67
|
-
]);
|
|
86
|
+
const FilterValueSchema = z.union([z.string(), z.number(), z.boolean()]);
|
|
68
87
|
|
|
69
88
|
type FilterValue = z.infer<typeof FilterValueSchema>;
|
|
70
89
|
|
|
@@ -77,13 +96,13 @@ const asTypedFilterValue = (v: string): FilterValue => {
|
|
|
77
96
|
if (v === 'false') {
|
|
78
97
|
return FilterValueSchema.parse(false);
|
|
79
98
|
}
|
|
80
|
-
|
|
99
|
+
|
|
81
100
|
// Handle numeric values with validation
|
|
82
101
|
const numericValue = asNumberIfNumeric(v);
|
|
83
102
|
if (typeof numericValue === 'number') {
|
|
84
103
|
return FilterValueSchema.parse(numericValue);
|
|
85
104
|
}
|
|
86
|
-
|
|
105
|
+
|
|
87
106
|
// Return as validated string
|
|
88
107
|
return FilterValueSchema.parse(v);
|
|
89
108
|
} catch (error) {
|
|
@@ -101,26 +120,30 @@ const countFromSeries = (s: Series) => parseInt(s.values?.[0]?.value ?? '0', 10)
|
|
|
101
120
|
const numberFromSeries = (s: Series) => Number(s.values?.[0]?.value ?? 0) || 0;
|
|
102
121
|
|
|
103
122
|
const datesRange = (startMs: number, endMs: number) => {
|
|
104
|
-
const start = new Date(startMs);
|
|
105
|
-
|
|
123
|
+
const start = new Date(startMs);
|
|
124
|
+
start.setHours(0, 0, 0, 0);
|
|
125
|
+
const end = new Date(endMs);
|
|
126
|
+
end.setHours(0, 0, 0, 0);
|
|
106
127
|
const out: string[] = [];
|
|
107
128
|
for (let d = new Date(start); d <= end; d.setDate(d.getDate() + 1)) {
|
|
108
|
-
out.push(
|
|
129
|
+
out.push(
|
|
130
|
+
`${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`
|
|
131
|
+
);
|
|
109
132
|
}
|
|
110
133
|
return out;
|
|
111
134
|
};
|
|
112
135
|
|
|
113
136
|
// ---------- Client
|
|
114
137
|
|
|
115
|
-
axiosRetry(axios, {
|
|
138
|
+
axiosRetry(axios, {
|
|
116
139
|
retries: 3,
|
|
117
|
-
retryDelay: axiosRetry.exponentialDelay
|
|
140
|
+
retryDelay: axiosRetry.exponentialDelay,
|
|
118
141
|
});
|
|
119
142
|
|
|
120
143
|
class SigNozStatsAPI {
|
|
121
144
|
private async makeRequest<T = any>(payload: any): Promise<T> {
|
|
122
145
|
const response = await axios.post<T>('/api/signoz', payload, {
|
|
123
|
-
timeout: 30000,
|
|
146
|
+
timeout: 30000,
|
|
124
147
|
headers: {
|
|
125
148
|
'Content-Type': 'application/json',
|
|
126
149
|
},
|
|
@@ -141,30 +164,36 @@ class SigNozStatsAPI {
|
|
|
141
164
|
filters?: SpanFilterOptions,
|
|
142
165
|
projectId?: string,
|
|
143
166
|
pagination?: { page: number; limit: number },
|
|
144
|
-
searchQuery?: string
|
|
167
|
+
searchQuery?: string
|
|
145
168
|
): Promise<ConversationStats[] | PaginatedConversationStats> {
|
|
146
169
|
try {
|
|
147
170
|
const payload = this.buildCombinedPayload(startTime, endTime, filters, projectId);
|
|
148
171
|
const resp = await this.makeRequest(payload);
|
|
149
172
|
|
|
150
|
-
const toolsSeries
|
|
151
|
-
const transfersSeries
|
|
152
|
-
const delegationsSeries
|
|
153
|
-
const aiCallsSeries
|
|
154
|
-
const lastActivitySeries
|
|
155
|
-
const metadataSeries
|
|
156
|
-
const contextErrorsSeries
|
|
157
|
-
const agentGenerationErrorsSeries = this.extractSeries(
|
|
158
|
-
|
|
173
|
+
const toolsSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.TOOLS);
|
|
174
|
+
const transfersSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.TRANSFERS);
|
|
175
|
+
const delegationsSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.DELEGATIONS);
|
|
176
|
+
const aiCallsSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.AI_CALLS);
|
|
177
|
+
const lastActivitySeries = this.extractSeries(resp, QUERY_EXPRESSIONS.LAST_ACTIVITY);
|
|
178
|
+
const metadataSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.CONVERSATION_METADATA);
|
|
179
|
+
const contextErrorsSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.CONTEXT_ERRORS);
|
|
180
|
+
const agentGenerationErrorsSeries = this.extractSeries(
|
|
181
|
+
resp,
|
|
182
|
+
QUERY_EXPRESSIONS.AGENT_GENERATION_ERRORS
|
|
183
|
+
);
|
|
184
|
+
const userMessagesSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.USER_MESSAGES);
|
|
159
185
|
|
|
160
186
|
// metadata map
|
|
161
|
-
const metaByConv = new Map<
|
|
187
|
+
const metaByConv = new Map<
|
|
188
|
+
string,
|
|
189
|
+
{ tenantId: string; graphId: string; graphName: string }
|
|
190
|
+
>();
|
|
162
191
|
for (const s of metadataSeries) {
|
|
163
192
|
const id = s.labels?.[SPAN_KEYS.CONVERSATION_ID];
|
|
164
193
|
if (!id) continue;
|
|
165
194
|
metaByConv.set(id, {
|
|
166
195
|
tenantId: s.labels?.[SPAN_KEYS.TENANT_ID] ?? UNKNOWN_VALUE,
|
|
167
|
-
graphId:
|
|
196
|
+
graphId: s.labels?.[SPAN_KEYS.GRAPH_ID] ?? UNKNOWN_VALUE,
|
|
168
197
|
graphName: s.labels?.[SPAN_KEYS.GRAPH_NAME] ?? UNKNOWN_VALUE,
|
|
169
198
|
});
|
|
170
199
|
}
|
|
@@ -185,7 +214,7 @@ class SigNozStatsAPI {
|
|
|
185
214
|
const content = s.labels?.[SPAN_KEYS.MESSAGE_CONTENT];
|
|
186
215
|
const t = numberFromSeries(s);
|
|
187
216
|
if (!id || !content) continue;
|
|
188
|
-
(msgsByConv.get(id) ?? msgsByConv.set(id, []).get(id)!)
|
|
217
|
+
(msgsByConv.get(id) ?? msgsByConv.set(id, []).get(id)!).push({ t, c: content });
|
|
189
218
|
}
|
|
190
219
|
for (const [id, arr] of msgsByConv) {
|
|
191
220
|
arr.sort((a, b) => a.t - b.t);
|
|
@@ -198,8 +227,14 @@ class SigNozStatsAPI {
|
|
|
198
227
|
|
|
199
228
|
// build stats
|
|
200
229
|
let stats = this.toConversationStats(
|
|
201
|
-
toolsSeries,
|
|
202
|
-
|
|
230
|
+
toolsSeries,
|
|
231
|
+
transfersSeries,
|
|
232
|
+
delegationsSeries,
|
|
233
|
+
aiCallsSeries,
|
|
234
|
+
metaByConv,
|
|
235
|
+
contextErrorsSeries,
|
|
236
|
+
agentGenerationErrorsSeries,
|
|
237
|
+
firstMsgByConv
|
|
203
238
|
);
|
|
204
239
|
|
|
205
240
|
// optional secondary filter pass via span filters
|
|
@@ -210,15 +245,18 @@ class SigNozStatsAPI {
|
|
|
210
245
|
// search filter
|
|
211
246
|
if (searchQuery?.trim()) {
|
|
212
247
|
const q = searchQuery.toLowerCase().trim();
|
|
213
|
-
stats = stats.filter(
|
|
214
|
-
s
|
|
215
|
-
|
|
216
|
-
|
|
248
|
+
stats = stats.filter(
|
|
249
|
+
(s) =>
|
|
250
|
+
s.firstUserMessage?.toLowerCase().includes(q) ||
|
|
251
|
+
s.conversationId.toLowerCase().includes(q) ||
|
|
252
|
+
s.graphId.toLowerCase().includes(q)
|
|
217
253
|
);
|
|
218
254
|
}
|
|
219
255
|
|
|
220
256
|
// sort by last activity
|
|
221
|
-
stats.sort((a, b) =>
|
|
257
|
+
stats.sort((a, b) =>
|
|
258
|
+
byMostRecent(lastSeen.get(a.conversationId), lastSeen.get(b.conversationId))
|
|
259
|
+
);
|
|
222
260
|
|
|
223
261
|
if (!pagination) return stats;
|
|
224
262
|
|
|
@@ -231,7 +269,10 @@ class SigNozStatsAPI {
|
|
|
231
269
|
return {
|
|
232
270
|
data,
|
|
233
271
|
pagination: {
|
|
234
|
-
page,
|
|
272
|
+
page,
|
|
273
|
+
limit,
|
|
274
|
+
total,
|
|
275
|
+
totalPages,
|
|
235
276
|
hasNextPage: page < totalPages,
|
|
236
277
|
hasPreviousPage: page > 1,
|
|
237
278
|
},
|
|
@@ -244,7 +285,9 @@ class SigNozStatsAPI {
|
|
|
244
285
|
|
|
245
286
|
async getAICallsByGraph(startTime: number, endTime: number, projectId?: string) {
|
|
246
287
|
try {
|
|
247
|
-
const resp = await this.makeRequest(
|
|
288
|
+
const resp = await this.makeRequest(
|
|
289
|
+
this.buildCombinedPayload(startTime, endTime, undefined, projectId)
|
|
290
|
+
);
|
|
248
291
|
const series = this.extractSeries(resp, QUERY_EXPRESSIONS.AI_CALLS);
|
|
249
292
|
const totals = new Map<string, number>();
|
|
250
293
|
for (const s of series) {
|
|
@@ -252,24 +295,36 @@ class SigNozStatsAPI {
|
|
|
252
295
|
const count = countFromSeries(s);
|
|
253
296
|
if (count) totals.set(graphId, (totals.get(graphId) || 0) + count);
|
|
254
297
|
}
|
|
255
|
-
return [...totals]
|
|
256
|
-
|
|
298
|
+
return [...totals]
|
|
299
|
+
.map(([graphId, totalCalls]) => ({ graphId, totalCalls }))
|
|
300
|
+
.sort((a, b) => b.totalCalls - a.totalCalls);
|
|
257
301
|
} catch (e) {
|
|
258
302
|
console.error('getAICallsByGraph error:', e);
|
|
259
303
|
return [];
|
|
260
304
|
}
|
|
261
305
|
}
|
|
262
306
|
|
|
263
|
-
async getAICallsByAgent(
|
|
307
|
+
async getAICallsByAgent(
|
|
308
|
+
startTime: number,
|
|
309
|
+
endTime: number,
|
|
310
|
+
graphId?: string,
|
|
311
|
+
modelId?: string,
|
|
312
|
+
projectId?: string
|
|
313
|
+
) {
|
|
264
314
|
try {
|
|
265
|
-
const resp = await this.makeRequest(
|
|
315
|
+
const resp = await this.makeRequest(
|
|
316
|
+
this.buildAgentModelBreakdownPayload(startTime, endTime, projectId)
|
|
317
|
+
);
|
|
266
318
|
const series = this.extractSeries(resp, 'agentModelCalls');
|
|
267
|
-
const acc = new Map<
|
|
319
|
+
const acc = new Map<
|
|
320
|
+
string,
|
|
321
|
+
{ agentId: string; graphId: string; modelId: string; totalCalls: number }
|
|
322
|
+
>();
|
|
268
323
|
|
|
269
324
|
for (const s of series) {
|
|
270
325
|
const agent = s.labels?.[SPAN_KEYS.AI_TELEMETRY_FUNCTION_ID] || UNKNOWN_VALUE;
|
|
271
|
-
const gId
|
|
272
|
-
const mId
|
|
326
|
+
const gId = s.labels?.[SPAN_KEYS.GRAPH_ID] || UNKNOWN_VALUE;
|
|
327
|
+
const mId = s.labels?.[SPAN_KEYS.AI_MODEL_ID] || UNKNOWN_VALUE;
|
|
273
328
|
const count = countFromSeries(s);
|
|
274
329
|
|
|
275
330
|
if (!count) continue;
|
|
@@ -288,9 +343,16 @@ class SigNozStatsAPI {
|
|
|
288
343
|
}
|
|
289
344
|
}
|
|
290
345
|
|
|
291
|
-
async getAICallsByModel(
|
|
346
|
+
async getAICallsByModel(
|
|
347
|
+
startTime: number,
|
|
348
|
+
endTime: number,
|
|
349
|
+
graphId?: string,
|
|
350
|
+
projectId?: string
|
|
351
|
+
) {
|
|
292
352
|
try {
|
|
293
|
-
const resp = await this.makeRequest(
|
|
353
|
+
const resp = await this.makeRequest(
|
|
354
|
+
this.buildModelBreakdownPayload(startTime, endTime, projectId)
|
|
355
|
+
);
|
|
294
356
|
const series = this.extractSeries(resp, 'modelCalls');
|
|
295
357
|
const totals = new Map<string, number>();
|
|
296
358
|
|
|
@@ -303,8 +365,9 @@ class SigNozStatsAPI {
|
|
|
303
365
|
totals.set(mId, (totals.get(mId) || 0) + count);
|
|
304
366
|
}
|
|
305
367
|
|
|
306
|
-
return [...totals]
|
|
307
|
-
|
|
368
|
+
return [...totals]
|
|
369
|
+
.map(([modelId, totalCalls]) => ({ modelId, totalCalls }))
|
|
370
|
+
.sort((a, b) => b.totalCalls - a.totalCalls);
|
|
308
371
|
} catch (e) {
|
|
309
372
|
console.error('getAICallsByModel error:', e);
|
|
310
373
|
return [];
|
|
@@ -313,13 +376,15 @@ class SigNozStatsAPI {
|
|
|
313
376
|
|
|
314
377
|
async getUniqueGraphs(startTime: number, endTime: number, projectId?: string) {
|
|
315
378
|
try {
|
|
316
|
-
const resp = await this.makeRequest(
|
|
379
|
+
const resp = await this.makeRequest(
|
|
380
|
+
this.buildUniqueGraphsPayload(startTime, endTime, projectId)
|
|
381
|
+
);
|
|
317
382
|
const series = this.extractSeries(resp, 'uniqueGraphs');
|
|
318
383
|
const graphs = series
|
|
319
|
-
.map(s => s.labels?.[SPAN_KEYS.GRAPH_ID])
|
|
384
|
+
.map((s) => s.labels?.[SPAN_KEYS.GRAPH_ID])
|
|
320
385
|
.filter((id): id is string => Boolean(id) && id !== UNKNOWN_VALUE)
|
|
321
386
|
.sort();
|
|
322
|
-
return [...new Set(graphs)];
|
|
387
|
+
return [...new Set(graphs)];
|
|
323
388
|
} catch (e) {
|
|
324
389
|
console.error('getUniqueGraphs error:', e);
|
|
325
390
|
return [];
|
|
@@ -328,28 +393,42 @@ class SigNozStatsAPI {
|
|
|
328
393
|
|
|
329
394
|
async getUniqueModels(startTime: number, endTime: number, projectId?: string) {
|
|
330
395
|
try {
|
|
331
|
-
const resp = await this.makeRequest(
|
|
396
|
+
const resp = await this.makeRequest(
|
|
397
|
+
this.buildUniqueModelsPayload(startTime, endTime, projectId)
|
|
398
|
+
);
|
|
332
399
|
const series = this.extractSeries(resp, 'uniqueModels');
|
|
333
400
|
const models = series
|
|
334
|
-
.map(s => s.labels?.[SPAN_KEYS.AI_MODEL_ID])
|
|
401
|
+
.map((s) => s.labels?.[SPAN_KEYS.AI_MODEL_ID])
|
|
335
402
|
.filter((id): id is string => Boolean(id) && id !== UNKNOWN_VALUE)
|
|
336
403
|
.sort();
|
|
337
|
-
return [...new Set(models)];
|
|
404
|
+
return [...new Set(models)];
|
|
338
405
|
} catch (e) {
|
|
339
406
|
console.error('getUniqueModels error:', e);
|
|
340
407
|
return [];
|
|
341
408
|
}
|
|
342
409
|
}
|
|
343
410
|
|
|
344
|
-
async getConversationsPerDay(
|
|
411
|
+
async getConversationsPerDay(
|
|
412
|
+
startTime: number,
|
|
413
|
+
endTime: number,
|
|
414
|
+
graphId?: string,
|
|
415
|
+
projectId?: string
|
|
416
|
+
) {
|
|
345
417
|
try {
|
|
346
418
|
// 1) which conversations exist?
|
|
347
|
-
const metaResp = await this.makeRequest(
|
|
419
|
+
const metaResp = await this.makeRequest(
|
|
420
|
+
this.buildConversationMetadataPayload(startTime, endTime, graphId, projectId)
|
|
421
|
+
);
|
|
348
422
|
const metaSeries = this.extractSeries(metaResp, 'conversationMetadata');
|
|
349
423
|
|
|
350
424
|
// 2) if any, fetch their last activity
|
|
351
425
|
const activitySeries = metaSeries.length
|
|
352
|
-
? this.extractSeries(
|
|
426
|
+
? this.extractSeries(
|
|
427
|
+
await this.makeRequest(
|
|
428
|
+
this.buildConversationActivityPayload(startTime, endTime, graphId, projectId)
|
|
429
|
+
),
|
|
430
|
+
'lastActivity'
|
|
431
|
+
)
|
|
353
432
|
: [];
|
|
354
433
|
|
|
355
434
|
const buckets = new Map<string, number>();
|
|
@@ -361,35 +440,58 @@ class SigNozStatsAPI {
|
|
|
361
440
|
buckets.set(key, (buckets.get(key) || 0) + 1);
|
|
362
441
|
}
|
|
363
442
|
|
|
364
|
-
return datesRange(startTime, endTime).map(date => ({
|
|
443
|
+
return datesRange(startTime, endTime).map((date) => ({
|
|
444
|
+
date,
|
|
445
|
+
count: buckets.get(date) || 0,
|
|
446
|
+
}));
|
|
365
447
|
} catch (e) {
|
|
366
448
|
console.error('getConversationsPerDay error:', e);
|
|
367
|
-
return datesRange(startTime, endTime).map(date => ({ date, count: 0 }));
|
|
449
|
+
return datesRange(startTime, endTime).map((date) => ({ date, count: 0 }));
|
|
368
450
|
}
|
|
369
451
|
}
|
|
370
452
|
|
|
371
|
-
async getAggregateStats(
|
|
453
|
+
async getAggregateStats(
|
|
454
|
+
startTime: number,
|
|
455
|
+
endTime: number,
|
|
456
|
+
filters?: SpanFilterOptions,
|
|
457
|
+
projectId?: string
|
|
458
|
+
) {
|
|
372
459
|
try {
|
|
373
|
-
const resp = await this.makeRequest(
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
const transfersSeries = this.extractSeries(resp, 'transfers');
|
|
377
|
-
const delegationsSeries = this.extractSeries(resp, 'delegations');
|
|
378
|
-
const aiCallsSeries = this.extractSeries(resp, 'aiCalls');
|
|
379
|
-
const metadataSeries = this.extractSeries(resp, 'conversationMetadata');
|
|
380
|
-
const contextErrSeries = this.extractSeries(resp, 'contextErrors');
|
|
381
|
-
const agentGenErrSeries = this.extractSeries(resp, 'agentGenerationErrors');
|
|
460
|
+
const resp = await this.makeRequest(
|
|
461
|
+
this.buildCombinedPayload(startTime, endTime, filters, projectId)
|
|
462
|
+
);
|
|
382
463
|
|
|
383
|
-
const
|
|
464
|
+
const toolsSeries = this.extractSeries(resp, 'tools');
|
|
465
|
+
const transfersSeries = this.extractSeries(resp, 'transfers');
|
|
466
|
+
const delegationsSeries = this.extractSeries(resp, 'delegations');
|
|
467
|
+
const aiCallsSeries = this.extractSeries(resp, 'aiCalls');
|
|
468
|
+
const metadataSeries = this.extractSeries(resp, 'conversationMetadata');
|
|
469
|
+
const contextErrSeries = this.extractSeries(resp, 'contextErrors');
|
|
470
|
+
const agentGenErrSeries = this.extractSeries(resp, 'agentGenerationErrors');
|
|
471
|
+
|
|
472
|
+
const metaByConv = new Map<
|
|
473
|
+
string,
|
|
474
|
+
{ tenantId: string; graphId: string; graphName: string }
|
|
475
|
+
>();
|
|
384
476
|
for (const s of metadataSeries) {
|
|
385
477
|
const id = s.labels?.[SPAN_KEYS.CONVERSATION_ID];
|
|
386
478
|
if (!id) continue;
|
|
387
|
-
metaByConv.set(id, {
|
|
479
|
+
metaByConv.set(id, {
|
|
480
|
+
tenantId: s.labels?.[SPAN_KEYS.TENANT_ID] ?? UNKNOWN_VALUE,
|
|
481
|
+
graphId: s.labels?.[SPAN_KEYS.GRAPH_ID] ?? UNKNOWN_VALUE,
|
|
482
|
+
graphName: s.labels?.[SPAN_KEYS.GRAPH_NAME] ?? UNKNOWN_VALUE,
|
|
483
|
+
});
|
|
388
484
|
}
|
|
389
485
|
|
|
390
486
|
let stats = this.toConversationStats(
|
|
391
|
-
toolsSeries,
|
|
392
|
-
|
|
487
|
+
toolsSeries,
|
|
488
|
+
transfersSeries,
|
|
489
|
+
delegationsSeries,
|
|
490
|
+
aiCallsSeries,
|
|
491
|
+
metaByConv,
|
|
492
|
+
contextErrSeries,
|
|
493
|
+
agentGenErrSeries,
|
|
494
|
+
new Map<string, { content: string; timestamp: number }>()
|
|
393
495
|
);
|
|
394
496
|
|
|
395
497
|
if (filters?.spanName || filters?.attributes?.length) {
|
|
@@ -397,46 +499,82 @@ class SigNozStatsAPI {
|
|
|
397
499
|
}
|
|
398
500
|
|
|
399
501
|
return {
|
|
400
|
-
totalToolCalls:
|
|
401
|
-
totalTransfers:
|
|
502
|
+
totalToolCalls: stats.reduce((s, r) => s + r.totalToolCalls, 0),
|
|
503
|
+
totalTransfers: stats.reduce((s, r) => s + r.totalTransfers, 0),
|
|
402
504
|
totalDelegations: stats.reduce((s, r) => s + r.totalDelegations, 0),
|
|
403
505
|
totalConversations: stats.length,
|
|
404
|
-
totalAICalls:
|
|
506
|
+
totalAICalls: stats.reduce((s, r) => s + r.totalAICalls, 0),
|
|
405
507
|
};
|
|
406
508
|
} catch (e) {
|
|
407
509
|
console.error('getAggregateStats error:', e);
|
|
408
|
-
return {
|
|
510
|
+
return {
|
|
511
|
+
totalToolCalls: 0,
|
|
512
|
+
totalTransfers: 0,
|
|
513
|
+
totalDelegations: 0,
|
|
514
|
+
totalConversations: 0,
|
|
515
|
+
totalAICalls: 0,
|
|
516
|
+
};
|
|
409
517
|
}
|
|
410
518
|
}
|
|
411
519
|
|
|
412
|
-
async getAvailableSpanNames(
|
|
520
|
+
async getAvailableSpanNames(
|
|
521
|
+
startTime: number,
|
|
522
|
+
endTime: number,
|
|
523
|
+
graphId?: string,
|
|
524
|
+
projectId?: string
|
|
525
|
+
) {
|
|
413
526
|
try {
|
|
414
527
|
const filterItems: any[] = [
|
|
415
|
-
{
|
|
528
|
+
{
|
|
529
|
+
key: { key: SPAN_KEYS.NAME, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
|
|
530
|
+
op: OPERATORS.EXISTS,
|
|
531
|
+
value: '',
|
|
532
|
+
},
|
|
416
533
|
];
|
|
417
534
|
if (graphId && graphId !== 'all') {
|
|
418
|
-
filterItems.push({
|
|
535
|
+
filterItems.push({
|
|
536
|
+
key: { key: SPAN_KEYS.GRAPH_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
537
|
+
op: OPERATORS.EQUALS,
|
|
538
|
+
value: graphId,
|
|
539
|
+
});
|
|
419
540
|
}
|
|
420
541
|
if (projectId) {
|
|
421
|
-
filterItems.push({
|
|
542
|
+
filterItems.push({
|
|
543
|
+
key: { key: SPAN_KEYS.PROJECT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
544
|
+
op: OPERATORS.EQUALS,
|
|
545
|
+
value: projectId,
|
|
546
|
+
});
|
|
422
547
|
}
|
|
423
548
|
|
|
424
549
|
const payload = {
|
|
425
|
-
start: startTime,
|
|
550
|
+
start: startTime,
|
|
551
|
+
end: endTime,
|
|
552
|
+
step: QUERY_DEFAULTS.STEP,
|
|
553
|
+
variables: {},
|
|
426
554
|
compositeQuery: {
|
|
427
|
-
queryType: QUERY_TYPES.BUILDER,
|
|
555
|
+
queryType: QUERY_TYPES.BUILDER,
|
|
556
|
+
panelType: PANEL_TYPES.LIST,
|
|
428
557
|
builderQueries: {
|
|
429
558
|
spanNames: {
|
|
430
|
-
dataSource: DATA_SOURCES.TRACES,
|
|
431
|
-
|
|
559
|
+
dataSource: DATA_SOURCES.TRACES,
|
|
560
|
+
queryName: QUERY_EXPRESSIONS.SPAN_NAMES,
|
|
561
|
+
aggregateOperator: AGGREGATE_OPERATORS.NOOP,
|
|
562
|
+
aggregateAttribute: {},
|
|
432
563
|
filters: { op: OPERATORS.AND, items: filterItems },
|
|
433
564
|
selectColumns: [{ key: SPAN_KEYS.NAME, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN }],
|
|
434
|
-
expression: QUERY_EXPRESSIONS.SPAN_NAMES,
|
|
435
|
-
|
|
565
|
+
expression: QUERY_EXPRESSIONS.SPAN_NAMES,
|
|
566
|
+
disabled: QUERY_DEFAULTS.DISABLED,
|
|
567
|
+
having: QUERY_DEFAULTS.HAVING,
|
|
568
|
+
stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
|
|
569
|
+
limit: QUERY_DEFAULTS.LIMIT_1000,
|
|
570
|
+
orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }],
|
|
571
|
+
groupBy: QUERY_DEFAULTS.EMPTY_GROUP_BY,
|
|
572
|
+
offset: QUERY_DEFAULTS.OFFSET,
|
|
436
573
|
},
|
|
437
574
|
},
|
|
438
575
|
},
|
|
439
|
-
dataSource: DATA_SOURCES.TRACES,
|
|
576
|
+
dataSource: DATA_SOURCES.TRACES,
|
|
577
|
+
projectId,
|
|
440
578
|
};
|
|
441
579
|
|
|
442
580
|
const resp = await this.makeRequest(payload);
|
|
@@ -463,7 +601,7 @@ class SigNozStatsAPI {
|
|
|
463
601
|
metaByConv: Map<string, { tenantId: string; graphId: string; graphName: string }>,
|
|
464
602
|
contextErrSeries: Series[],
|
|
465
603
|
agentGenErrSeries: Series[],
|
|
466
|
-
firstMsgByConv: Map<string, { content: string; timestamp: number }
|
|
604
|
+
firstMsgByConv: Map<string, { content: string; timestamp: number }>
|
|
467
605
|
): ConversationStats[] {
|
|
468
606
|
type Acc = {
|
|
469
607
|
totalToolCalls: number;
|
|
@@ -497,51 +635,67 @@ class SigNozStatsAPI {
|
|
|
497
635
|
|
|
498
636
|
// tools
|
|
499
637
|
for (const s of toolCallsSeries) {
|
|
500
|
-
const id = s.labels?.[SPAN_KEYS.CONVERSATION_ID];
|
|
501
|
-
|
|
502
|
-
const
|
|
638
|
+
const id = s.labels?.[SPAN_KEYS.CONVERSATION_ID];
|
|
639
|
+
if (!id) continue;
|
|
640
|
+
const name = s.labels?.[SPAN_KEYS.AI_TOOL_CALL_NAME];
|
|
641
|
+
if (!name) continue;
|
|
642
|
+
const calls = countFromSeries(s);
|
|
643
|
+
if (!calls) continue;
|
|
503
644
|
const desc = s.labels?.[SPAN_KEYS.MCP_TOOL_DESCRIPTION] || '';
|
|
504
645
|
const acc = ensure(id);
|
|
505
646
|
acc.totalToolCalls += calls;
|
|
506
647
|
const t = acc.toolsUsed.get(name) || { name, calls: 0, description: desc };
|
|
507
|
-
t.calls += calls;
|
|
648
|
+
t.calls += calls;
|
|
649
|
+
acc.toolsUsed.set(name, t);
|
|
508
650
|
}
|
|
509
651
|
|
|
510
652
|
// transfers
|
|
511
653
|
for (const s of transferSeries) {
|
|
512
|
-
const id = s.labels?.[SPAN_KEYS.CONVERSATION_ID];
|
|
513
|
-
|
|
654
|
+
const id = s.labels?.[SPAN_KEYS.CONVERSATION_ID];
|
|
655
|
+
if (!id) continue;
|
|
656
|
+
const from = s.labels?.[SPAN_KEYS.TRANSFER_FROM_AGENT_ID];
|
|
657
|
+
const to = s.labels?.[SPAN_KEYS.TRANSFER_TO_AGENT_ID];
|
|
514
658
|
const count = countFromSeries(s);
|
|
515
659
|
if (!from || !to || !count) continue;
|
|
516
|
-
const acc = ensure(id);
|
|
660
|
+
const acc = ensure(id);
|
|
661
|
+
acc.totalTransfers += count;
|
|
517
662
|
const key = `${from}→${to}`;
|
|
518
663
|
const h = acc.transfers.get(key) || { from, to, count: 0 };
|
|
519
|
-
h.count += count;
|
|
664
|
+
h.count += count;
|
|
665
|
+
acc.transfers.set(key, h);
|
|
520
666
|
}
|
|
521
667
|
|
|
522
668
|
// delegations
|
|
523
669
|
for (const s of delegationSeries) {
|
|
524
|
-
const id = s.labels?.[SPAN_KEYS.CONVERSATION_ID];
|
|
525
|
-
|
|
670
|
+
const id = s.labels?.[SPAN_KEYS.CONVERSATION_ID];
|
|
671
|
+
if (!id) continue;
|
|
672
|
+
const from = s.labels?.[SPAN_KEYS.DELEGATION_FROM_AGENT_ID];
|
|
673
|
+
const to = s.labels?.[SPAN_KEYS.DELEGATION_TO_AGENT_ID];
|
|
526
674
|
const count = countFromSeries(s);
|
|
527
675
|
if (!from || !to || !count) continue;
|
|
528
|
-
const acc = ensure(id);
|
|
676
|
+
const acc = ensure(id);
|
|
677
|
+
acc.totalDelegations += count;
|
|
529
678
|
const key = `${from}→${to}`;
|
|
530
679
|
const d = acc.delegations.get(key) || { from, to, count: 0 };
|
|
531
|
-
d.count += count;
|
|
680
|
+
d.count += count;
|
|
681
|
+
acc.delegations.set(key, d);
|
|
532
682
|
}
|
|
533
683
|
|
|
534
684
|
// AI calls
|
|
535
685
|
for (const s of aiCallsSeries) {
|
|
536
|
-
const id = s.labels?.[SPAN_KEYS.CONVERSATION_ID];
|
|
537
|
-
|
|
686
|
+
const id = s.labels?.[SPAN_KEYS.CONVERSATION_ID];
|
|
687
|
+
if (!id) continue;
|
|
688
|
+
const count = countFromSeries(s);
|
|
689
|
+
if (!count) continue;
|
|
538
690
|
ensure(id).totalAICalls += count;
|
|
539
691
|
}
|
|
540
692
|
|
|
541
693
|
// errors
|
|
542
694
|
for (const s of [...contextErrSeries, ...agentGenErrSeries]) {
|
|
543
|
-
const id = s.labels?.[SPAN_KEYS.CONVERSATION_ID];
|
|
544
|
-
|
|
695
|
+
const id = s.labels?.[SPAN_KEYS.CONVERSATION_ID];
|
|
696
|
+
if (!id) continue;
|
|
697
|
+
const count = countFromSeries(s);
|
|
698
|
+
if (!count) continue;
|
|
545
699
|
ensure(id).totalErrors += count;
|
|
546
700
|
}
|
|
547
701
|
|
|
@@ -550,7 +704,11 @@ class SigNozStatsAPI {
|
|
|
550
704
|
const allConvIds = new Set<string>([...byConv.keys(), ...metaByConv.keys()]);
|
|
551
705
|
for (const id of allConvIds) {
|
|
552
706
|
const acc = byConv.get(id) || ensure(id);
|
|
553
|
-
const meta = metaByConv.get(id) || {
|
|
707
|
+
const meta = metaByConv.get(id) || {
|
|
708
|
+
tenantId: UNKNOWN_VALUE,
|
|
709
|
+
graphId: UNKNOWN_VALUE,
|
|
710
|
+
graphName: UNKNOWN_VALUE,
|
|
711
|
+
};
|
|
554
712
|
out.push({
|
|
555
713
|
conversationId: id,
|
|
556
714
|
tenantId: meta.tenantId,
|
|
@@ -572,12 +730,22 @@ class SigNozStatsAPI {
|
|
|
572
730
|
return out;
|
|
573
731
|
}
|
|
574
732
|
|
|
575
|
-
private async applySpanFilters(
|
|
733
|
+
private async applySpanFilters(
|
|
734
|
+
stats: ConversationStats[],
|
|
735
|
+
startTime: number,
|
|
736
|
+
endTime: number,
|
|
737
|
+
filters: SpanFilterOptions,
|
|
738
|
+
projectId?: string
|
|
739
|
+
) {
|
|
576
740
|
try {
|
|
577
|
-
const resp = await this.makeRequest(
|
|
741
|
+
const resp = await this.makeRequest(
|
|
742
|
+
this.buildFilteredConversationsPayload(startTime, endTime, filters, projectId)
|
|
743
|
+
);
|
|
578
744
|
const series = this.extractSeries(resp, 'filteredConversations');
|
|
579
|
-
const allowed = new Set<string>(
|
|
580
|
-
|
|
745
|
+
const allowed = new Set<string>(
|
|
746
|
+
series.map((s) => s.labels?.[SPAN_KEYS.CONVERSATION_ID]).filter(Boolean) as string[]
|
|
747
|
+
);
|
|
748
|
+
return stats.filter((s) => allowed.has(s.conversationId));
|
|
581
749
|
} catch (e) {
|
|
582
750
|
console.error('applySpanFilters error:', e);
|
|
583
751
|
return stats;
|
|
@@ -588,19 +756,44 @@ class SigNozStatsAPI {
|
|
|
588
756
|
|
|
589
757
|
private buildAgentModelBreakdownPayload(start: number, end: number, projectId?: string) {
|
|
590
758
|
return {
|
|
591
|
-
start,
|
|
759
|
+
start,
|
|
760
|
+
end,
|
|
761
|
+
step: QUERY_DEFAULTS.STEP,
|
|
762
|
+
variables: {},
|
|
592
763
|
compositeQuery: {
|
|
593
|
-
queryType: QUERY_TYPES.BUILDER,
|
|
764
|
+
queryType: QUERY_TYPES.BUILDER,
|
|
765
|
+
panelType: PANEL_TYPES.TABLE,
|
|
594
766
|
builderQueries: {
|
|
595
767
|
agentModelCalls: {
|
|
596
|
-
dataSource: DATA_SOURCES.TRACES,
|
|
768
|
+
dataSource: DATA_SOURCES.TRACES,
|
|
769
|
+
queryName: QUERY_EXPRESSIONS.AGENT_MODEL_CALLS,
|
|
597
770
|
aggregateOperator: AGGREGATE_OPERATORS.COUNT,
|
|
598
|
-
aggregateAttribute: {
|
|
771
|
+
aggregateAttribute: {
|
|
772
|
+
key: SPAN_KEYS.SPAN_ID,
|
|
773
|
+
...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
|
|
774
|
+
},
|
|
599
775
|
filters: {
|
|
600
|
-
op: OPERATORS.AND,
|
|
601
|
-
|
|
602
|
-
{
|
|
603
|
-
|
|
776
|
+
op: OPERATORS.AND,
|
|
777
|
+
items: [
|
|
778
|
+
{
|
|
779
|
+
key: { key: SPAN_KEYS.AI_OPERATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
|
|
780
|
+
op: OPERATORS.EQUALS,
|
|
781
|
+
value: AI_OPERATIONS.GENERATE_TEXT,
|
|
782
|
+
},
|
|
783
|
+
{
|
|
784
|
+
key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
785
|
+
op: OPERATORS.EXISTS,
|
|
786
|
+
value: '',
|
|
787
|
+
},
|
|
788
|
+
...(projectId
|
|
789
|
+
? [
|
|
790
|
+
{
|
|
791
|
+
key: { key: SPAN_KEYS.PROJECT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
792
|
+
op: OPERATORS.EQUALS,
|
|
793
|
+
value: projectId,
|
|
794
|
+
},
|
|
795
|
+
]
|
|
796
|
+
: []),
|
|
604
797
|
],
|
|
605
798
|
},
|
|
606
799
|
groupBy: [
|
|
@@ -609,31 +802,63 @@ class SigNozStatsAPI {
|
|
|
609
802
|
{ key: SPAN_KEYS.GRAPH_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
610
803
|
{ key: SPAN_KEYS.AI_MODEL_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
|
|
611
804
|
],
|
|
612
|
-
expression: QUERY_EXPRESSIONS.AGENT_MODEL_CALLS,
|
|
613
|
-
|
|
614
|
-
|
|
805
|
+
expression: QUERY_EXPRESSIONS.AGENT_MODEL_CALLS,
|
|
806
|
+
reduceTo: REDUCE_OPERATIONS.SUM,
|
|
807
|
+
stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
|
|
808
|
+
orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }],
|
|
809
|
+
offset: QUERY_DEFAULTS.OFFSET,
|
|
810
|
+
disabled: QUERY_DEFAULTS.DISABLED,
|
|
811
|
+
having: QUERY_DEFAULTS.HAVING,
|
|
812
|
+
legend: QUERY_DEFAULTS.LEGEND,
|
|
813
|
+
limit: QUERY_DEFAULTS.LIMIT_NULL,
|
|
615
814
|
},
|
|
616
815
|
},
|
|
617
816
|
},
|
|
618
|
-
dataSource: DATA_SOURCES.TRACES,
|
|
817
|
+
dataSource: DATA_SOURCES.TRACES,
|
|
818
|
+
projectId,
|
|
619
819
|
};
|
|
620
820
|
}
|
|
621
821
|
|
|
622
822
|
private buildModelBreakdownPayload(start: number, end: number, projectId?: string) {
|
|
623
823
|
return {
|
|
624
|
-
start,
|
|
824
|
+
start,
|
|
825
|
+
end,
|
|
826
|
+
step: QUERY_DEFAULTS.STEP,
|
|
827
|
+
variables: {},
|
|
625
828
|
compositeQuery: {
|
|
626
|
-
queryType: QUERY_TYPES.BUILDER,
|
|
829
|
+
queryType: QUERY_TYPES.BUILDER,
|
|
830
|
+
panelType: PANEL_TYPES.TABLE,
|
|
627
831
|
builderQueries: {
|
|
628
832
|
modelCalls: {
|
|
629
|
-
dataSource: DATA_SOURCES.TRACES,
|
|
833
|
+
dataSource: DATA_SOURCES.TRACES,
|
|
834
|
+
queryName: QUERY_EXPRESSIONS.MODEL_CALLS,
|
|
630
835
|
aggregateOperator: AGGREGATE_OPERATORS.COUNT,
|
|
631
|
-
aggregateAttribute: {
|
|
836
|
+
aggregateAttribute: {
|
|
837
|
+
key: SPAN_KEYS.SPAN_ID,
|
|
838
|
+
...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
|
|
839
|
+
},
|
|
632
840
|
filters: {
|
|
633
|
-
op: OPERATORS.AND,
|
|
634
|
-
|
|
635
|
-
{
|
|
636
|
-
|
|
841
|
+
op: OPERATORS.AND,
|
|
842
|
+
items: [
|
|
843
|
+
{
|
|
844
|
+
key: { key: SPAN_KEYS.AI_OPERATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
|
|
845
|
+
op: OPERATORS.EQUALS,
|
|
846
|
+
value: AI_OPERATIONS.GENERATE_TEXT,
|
|
847
|
+
},
|
|
848
|
+
{
|
|
849
|
+
key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
850
|
+
op: OPERATORS.EXISTS,
|
|
851
|
+
value: '',
|
|
852
|
+
},
|
|
853
|
+
...(projectId
|
|
854
|
+
? [
|
|
855
|
+
{
|
|
856
|
+
key: { key: SPAN_KEYS.PROJECT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
857
|
+
op: OPERATORS.EQUALS,
|
|
858
|
+
value: projectId,
|
|
859
|
+
},
|
|
860
|
+
]
|
|
861
|
+
: []),
|
|
637
862
|
],
|
|
638
863
|
},
|
|
639
864
|
groupBy: [
|
|
@@ -641,62 +866,150 @@ class SigNozStatsAPI {
|
|
|
641
866
|
{ key: SPAN_KEYS.AI_MODEL_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
|
|
642
867
|
{ key: SPAN_KEYS.GRAPH_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
643
868
|
],
|
|
644
|
-
expression: QUERY_EXPRESSIONS.MODEL_CALLS,
|
|
645
|
-
|
|
646
|
-
|
|
869
|
+
expression: QUERY_EXPRESSIONS.MODEL_CALLS,
|
|
870
|
+
reduceTo: REDUCE_OPERATIONS.SUM,
|
|
871
|
+
stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
|
|
872
|
+
orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }],
|
|
873
|
+
offset: QUERY_DEFAULTS.OFFSET,
|
|
874
|
+
disabled: QUERY_DEFAULTS.DISABLED,
|
|
875
|
+
having: QUERY_DEFAULTS.HAVING,
|
|
876
|
+
legend: QUERY_DEFAULTS.LEGEND,
|
|
877
|
+
limit: QUERY_DEFAULTS.LIMIT_ZERO,
|
|
647
878
|
},
|
|
648
879
|
},
|
|
649
880
|
},
|
|
650
|
-
dataSource: DATA_SOURCES.TRACES,
|
|
881
|
+
dataSource: DATA_SOURCES.TRACES,
|
|
882
|
+
projectId,
|
|
651
883
|
};
|
|
652
884
|
}
|
|
653
885
|
|
|
654
|
-
private buildConversationActivityPayload(
|
|
886
|
+
private buildConversationActivityPayload(
|
|
887
|
+
start: number,
|
|
888
|
+
end: number,
|
|
889
|
+
graphId?: string,
|
|
890
|
+
projectId?: string
|
|
891
|
+
) {
|
|
655
892
|
const items: any[] = [
|
|
656
|
-
{
|
|
657
|
-
|
|
658
|
-
|
|
893
|
+
{
|
|
894
|
+
key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
895
|
+
op: OPERATORS.EXISTS,
|
|
896
|
+
value: '',
|
|
897
|
+
},
|
|
898
|
+
...(graphId && graphId !== 'all'
|
|
899
|
+
? [
|
|
900
|
+
{
|
|
901
|
+
key: { key: SPAN_KEYS.GRAPH_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
902
|
+
op: OPERATORS.EQUALS,
|
|
903
|
+
value: graphId,
|
|
904
|
+
},
|
|
905
|
+
]
|
|
906
|
+
: []),
|
|
907
|
+
...(projectId
|
|
908
|
+
? [
|
|
909
|
+
{
|
|
910
|
+
key: { key: SPAN_KEYS.PROJECT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
911
|
+
op: OPERATORS.EQUALS,
|
|
912
|
+
value: projectId,
|
|
913
|
+
},
|
|
914
|
+
]
|
|
915
|
+
: []),
|
|
659
916
|
];
|
|
660
917
|
|
|
661
918
|
return {
|
|
662
|
-
start,
|
|
919
|
+
start,
|
|
920
|
+
end,
|
|
921
|
+
step: QUERY_DEFAULTS.STEP,
|
|
922
|
+
variables: {},
|
|
663
923
|
compositeQuery: {
|
|
664
|
-
queryType: QUERY_TYPES.BUILDER,
|
|
924
|
+
queryType: QUERY_TYPES.BUILDER,
|
|
925
|
+
panelType: PANEL_TYPES.TABLE,
|
|
665
926
|
builderQueries: {
|
|
666
927
|
lastActivity: {
|
|
667
|
-
dataSource: DATA_SOURCES.TRACES,
|
|
928
|
+
dataSource: DATA_SOURCES.TRACES,
|
|
929
|
+
queryName: QUERY_EXPRESSIONS.LAST_ACTIVITY,
|
|
668
930
|
aggregateOperator: AGGREGATE_OPERATORS.MAX,
|
|
669
|
-
aggregateAttribute: {
|
|
931
|
+
aggregateAttribute: {
|
|
932
|
+
key: SPAN_KEYS.TIMESTAMP,
|
|
933
|
+
...QUERY_FIELD_CONFIGS.INT64_TAG_COLUMN,
|
|
934
|
+
},
|
|
670
935
|
filters: { op: OPERATORS.AND, items },
|
|
671
936
|
groupBy: [{ key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }],
|
|
672
|
-
expression: QUERY_EXPRESSIONS.LAST_ACTIVITY,
|
|
673
|
-
|
|
674
|
-
|
|
937
|
+
expression: QUERY_EXPRESSIONS.LAST_ACTIVITY,
|
|
938
|
+
reduceTo: REDUCE_OPERATIONS.MAX,
|
|
939
|
+
stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
|
|
940
|
+
orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }],
|
|
941
|
+
offset: QUERY_DEFAULTS.OFFSET,
|
|
942
|
+
disabled: QUERY_DEFAULTS.DISABLED,
|
|
943
|
+
having: QUERY_DEFAULTS.HAVING,
|
|
944
|
+
legend: QUERY_DEFAULTS.LEGEND,
|
|
945
|
+
limit: QUERY_DEFAULTS.LIMIT_NULL,
|
|
675
946
|
},
|
|
676
947
|
},
|
|
677
948
|
},
|
|
678
|
-
dataSource: DATA_SOURCES.TRACES,
|
|
949
|
+
dataSource: DATA_SOURCES.TRACES,
|
|
950
|
+
projectId,
|
|
679
951
|
};
|
|
680
952
|
}
|
|
681
953
|
|
|
682
|
-
private buildConversationMetadataPayload(
|
|
954
|
+
private buildConversationMetadataPayload(
|
|
955
|
+
start: number,
|
|
956
|
+
end: number,
|
|
957
|
+
graphId?: string,
|
|
958
|
+
projectId?: string
|
|
959
|
+
) {
|
|
683
960
|
const items: any[] = [
|
|
684
|
-
{
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
961
|
+
{
|
|
962
|
+
key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
963
|
+
op: OPERATORS.EXISTS,
|
|
964
|
+
value: '',
|
|
965
|
+
},
|
|
966
|
+
{
|
|
967
|
+
key: { key: SPAN_KEYS.TENANT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
968
|
+
op: OPERATORS.EXISTS,
|
|
969
|
+
value: '',
|
|
970
|
+
},
|
|
971
|
+
{
|
|
972
|
+
key: { key: SPAN_KEYS.GRAPH_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
973
|
+
op: OPERATORS.EXISTS,
|
|
974
|
+
value: '',
|
|
975
|
+
},
|
|
976
|
+
...(graphId && graphId !== 'all'
|
|
977
|
+
? [
|
|
978
|
+
{
|
|
979
|
+
key: { key: SPAN_KEYS.GRAPH_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
980
|
+
op: OPERATORS.EQUALS,
|
|
981
|
+
value: graphId,
|
|
982
|
+
},
|
|
983
|
+
]
|
|
984
|
+
: []),
|
|
985
|
+
...(projectId
|
|
986
|
+
? [
|
|
987
|
+
{
|
|
988
|
+
key: { key: SPAN_KEYS.PROJECT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
989
|
+
op: OPERATORS.EQUALS,
|
|
990
|
+
value: projectId,
|
|
991
|
+
},
|
|
992
|
+
]
|
|
993
|
+
: []),
|
|
689
994
|
];
|
|
690
995
|
|
|
691
996
|
return {
|
|
692
|
-
start,
|
|
997
|
+
start,
|
|
998
|
+
end,
|
|
999
|
+
step: QUERY_DEFAULTS.STEP,
|
|
1000
|
+
variables: {},
|
|
693
1001
|
compositeQuery: {
|
|
694
|
-
queryType: QUERY_TYPES.BUILDER,
|
|
1002
|
+
queryType: QUERY_TYPES.BUILDER,
|
|
1003
|
+
panelType: PANEL_TYPES.TABLE,
|
|
695
1004
|
builderQueries: {
|
|
696
1005
|
conversationMetadata: {
|
|
697
|
-
dataSource: DATA_SOURCES.TRACES,
|
|
1006
|
+
dataSource: DATA_SOURCES.TRACES,
|
|
1007
|
+
queryName: QUERY_EXPRESSIONS.CONVERSATION_METADATA,
|
|
698
1008
|
aggregateOperator: AGGREGATE_OPERATORS.COUNT,
|
|
699
|
-
aggregateAttribute: {
|
|
1009
|
+
aggregateAttribute: {
|
|
1010
|
+
key: SPAN_KEYS.SPAN_ID,
|
|
1011
|
+
...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
|
|
1012
|
+
},
|
|
700
1013
|
filters: { op: OPERATORS.AND, items },
|
|
701
1014
|
groupBy: [
|
|
702
1015
|
{ key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
@@ -704,23 +1017,43 @@ class SigNozStatsAPI {
|
|
|
704
1017
|
{ key: SPAN_KEYS.GRAPH_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
705
1018
|
{ key: SPAN_KEYS.GRAPH_NAME, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
706
1019
|
],
|
|
707
|
-
expression: QUERY_EXPRESSIONS.CONVERSATION_METADATA,
|
|
708
|
-
|
|
709
|
-
|
|
1020
|
+
expression: QUERY_EXPRESSIONS.CONVERSATION_METADATA,
|
|
1021
|
+
reduceTo: REDUCE_OPERATIONS.SUM,
|
|
1022
|
+
stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
|
|
1023
|
+
orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }],
|
|
1024
|
+
offset: QUERY_DEFAULTS.OFFSET,
|
|
1025
|
+
disabled: QUERY_DEFAULTS.DISABLED,
|
|
1026
|
+
having: QUERY_DEFAULTS.HAVING,
|
|
1027
|
+
legend: QUERY_DEFAULTS.LEGEND,
|
|
1028
|
+
limit: QUERY_DEFAULTS.LIMIT_NULL,
|
|
710
1029
|
},
|
|
711
1030
|
},
|
|
712
1031
|
},
|
|
713
|
-
dataSource: DATA_SOURCES.TRACES,
|
|
1032
|
+
dataSource: DATA_SOURCES.TRACES,
|
|
1033
|
+
projectId,
|
|
714
1034
|
};
|
|
715
1035
|
}
|
|
716
1036
|
|
|
717
|
-
private buildFilteredConversationsPayload(
|
|
1037
|
+
private buildFilteredConversationsPayload(
|
|
1038
|
+
start: number,
|
|
1039
|
+
end: number,
|
|
1040
|
+
filters: SpanFilterOptions,
|
|
1041
|
+
projectId?: string
|
|
1042
|
+
) {
|
|
718
1043
|
const items: any[] = [
|
|
719
|
-
{
|
|
1044
|
+
{
|
|
1045
|
+
key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
1046
|
+
op: OPERATORS.EXISTS,
|
|
1047
|
+
value: '',
|
|
1048
|
+
},
|
|
720
1049
|
];
|
|
721
1050
|
|
|
722
1051
|
if (filters.spanName) {
|
|
723
|
-
items.push({
|
|
1052
|
+
items.push({
|
|
1053
|
+
key: { key: SPAN_KEYS.NAME, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
|
|
1054
|
+
op: OPERATORS.EQUALS,
|
|
1055
|
+
value: filters.spanName,
|
|
1056
|
+
});
|
|
724
1057
|
}
|
|
725
1058
|
|
|
726
1059
|
// Attribute filters — pass typed booleans/numbers where possible
|
|
@@ -738,271 +1071,592 @@ class SigNozStatsAPI {
|
|
|
738
1071
|
}
|
|
739
1072
|
|
|
740
1073
|
// LIKE operators add wildcards if absent
|
|
741
|
-
if (
|
|
1074
|
+
if (
|
|
1075
|
+
(op === OPERATORS.LIKE || op === OPERATORS.NOT_LIKE) &&
|
|
1076
|
+
typeof value === 'string' &&
|
|
1077
|
+
!value.includes('%')
|
|
1078
|
+
) {
|
|
742
1079
|
value = `%${value}%`;
|
|
743
1080
|
}
|
|
744
1081
|
|
|
745
1082
|
// For numeric equality, keep exact-match pair (>= & <=) for robustness
|
|
746
1083
|
if ((dataType === 'int64' || dataType === 'float64') && op === OPERATORS.EQUALS) {
|
|
747
|
-
const config =
|
|
748
|
-
|
|
1084
|
+
const config =
|
|
1085
|
+
dataType === 'int64' ? QUERY_FIELD_CONFIGS.INT64_TAG : QUERY_FIELD_CONFIGS.FLOAT64_TAG;
|
|
1086
|
+
items.push({
|
|
1087
|
+
key: { key: attr.key, ...config },
|
|
1088
|
+
op: OPERATORS.GREATER_THAN_OR_EQUAL,
|
|
1089
|
+
value,
|
|
1090
|
+
});
|
|
749
1091
|
items.push({ key: { key: attr.key, ...config }, op: OPERATORS.LESS_THAN_OR_EQUAL, value });
|
|
750
1092
|
} else {
|
|
751
|
-
const config =
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
1093
|
+
const config =
|
|
1094
|
+
dataType === 'string'
|
|
1095
|
+
? QUERY_FIELD_CONFIGS.STRING_TAG
|
|
1096
|
+
: dataType === 'int64'
|
|
1097
|
+
? QUERY_FIELD_CONFIGS.INT64_TAG
|
|
1098
|
+
: dataType === 'float64'
|
|
1099
|
+
? QUERY_FIELD_CONFIGS.FLOAT64_TAG
|
|
1100
|
+
: QUERY_FIELD_CONFIGS.BOOL_TAG;
|
|
755
1101
|
items.push({ key: { key: attr.key, ...config }, op, value });
|
|
756
1102
|
}
|
|
757
1103
|
}
|
|
758
1104
|
|
|
759
1105
|
if (projectId) {
|
|
760
|
-
items.push({
|
|
1106
|
+
items.push({
|
|
1107
|
+
key: { key: SPAN_KEYS.PROJECT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
1108
|
+
op: OPERATORS.EQUALS,
|
|
1109
|
+
value: projectId,
|
|
1110
|
+
});
|
|
761
1111
|
}
|
|
762
1112
|
|
|
763
1113
|
return {
|
|
764
|
-
start,
|
|
1114
|
+
start,
|
|
1115
|
+
end,
|
|
1116
|
+
step: QUERY_DEFAULTS.STEP,
|
|
1117
|
+
variables: {},
|
|
765
1118
|
compositeQuery: {
|
|
766
|
-
queryType: QUERY_TYPES.BUILDER,
|
|
1119
|
+
queryType: QUERY_TYPES.BUILDER,
|
|
1120
|
+
panelType: PANEL_TYPES.TABLE,
|
|
767
1121
|
builderQueries: {
|
|
768
1122
|
filteredConversations: {
|
|
769
|
-
dataSource: DATA_SOURCES.TRACES,
|
|
1123
|
+
dataSource: DATA_SOURCES.TRACES,
|
|
1124
|
+
queryName: QUERY_EXPRESSIONS.FILTERED_CONVERSATIONS,
|
|
770
1125
|
aggregateOperator: AGGREGATE_OPERATORS.COUNT,
|
|
771
|
-
aggregateAttribute: {
|
|
1126
|
+
aggregateAttribute: {
|
|
1127
|
+
key: SPAN_KEYS.SPAN_ID,
|
|
1128
|
+
...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
|
|
1129
|
+
},
|
|
772
1130
|
filters: { op: OPERATORS.AND, items },
|
|
773
1131
|
groupBy: [{ key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }],
|
|
774
|
-
expression: QUERY_EXPRESSIONS.FILTERED_CONVERSATIONS,
|
|
775
|
-
|
|
776
|
-
|
|
1132
|
+
expression: QUERY_EXPRESSIONS.FILTERED_CONVERSATIONS,
|
|
1133
|
+
reduceTo: REDUCE_OPERATIONS.SUM,
|
|
1134
|
+
stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
|
|
1135
|
+
orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }],
|
|
1136
|
+
offset: QUERY_DEFAULTS.OFFSET,
|
|
1137
|
+
disabled: QUERY_DEFAULTS.DISABLED,
|
|
1138
|
+
having: QUERY_DEFAULTS.HAVING,
|
|
1139
|
+
legend: QUERY_DEFAULTS.LEGEND,
|
|
1140
|
+
limit: QUERY_DEFAULTS.LIMIT_NULL,
|
|
777
1141
|
},
|
|
778
1142
|
},
|
|
779
1143
|
},
|
|
780
|
-
dataSource: DATA_SOURCES.TRACES,
|
|
1144
|
+
dataSource: DATA_SOURCES.TRACES,
|
|
1145
|
+
projectId,
|
|
781
1146
|
};
|
|
782
1147
|
}
|
|
783
1148
|
|
|
784
|
-
private buildCombinedPayload(
|
|
1149
|
+
private buildCombinedPayload(
|
|
1150
|
+
start: number,
|
|
1151
|
+
end: number,
|
|
1152
|
+
_filters?: SpanFilterOptions,
|
|
1153
|
+
projectId?: string
|
|
1154
|
+
) {
|
|
785
1155
|
const withProject = (items: any[]) =>
|
|
786
|
-
projectId
|
|
1156
|
+
projectId
|
|
1157
|
+
? [
|
|
1158
|
+
...items,
|
|
1159
|
+
{
|
|
1160
|
+
key: { key: SPAN_KEYS.PROJECT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
1161
|
+
op: OPERATORS.EQUALS,
|
|
1162
|
+
value: projectId,
|
|
1163
|
+
},
|
|
1164
|
+
]
|
|
1165
|
+
: items;
|
|
787
1166
|
|
|
788
1167
|
return {
|
|
789
|
-
start,
|
|
1168
|
+
start,
|
|
1169
|
+
end,
|
|
1170
|
+
step: QUERY_DEFAULTS.STEP,
|
|
1171
|
+
variables: {},
|
|
790
1172
|
compositeQuery: {
|
|
791
|
-
queryType: QUERY_TYPES.BUILDER,
|
|
1173
|
+
queryType: QUERY_TYPES.BUILDER,
|
|
1174
|
+
panelType: PANEL_TYPES.TABLE,
|
|
792
1175
|
builderQueries: {
|
|
793
1176
|
tools: {
|
|
794
|
-
dataSource: DATA_SOURCES.TRACES,
|
|
1177
|
+
dataSource: DATA_SOURCES.TRACES,
|
|
1178
|
+
queryName: QUERY_EXPRESSIONS.TOOLS,
|
|
795
1179
|
aggregateOperator: AGGREGATE_OPERATORS.COUNT,
|
|
796
|
-
aggregateAttribute: {
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
1180
|
+
aggregateAttribute: {
|
|
1181
|
+
key: SPAN_KEYS.SPAN_ID,
|
|
1182
|
+
...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
|
|
1183
|
+
},
|
|
1184
|
+
filters: {
|
|
1185
|
+
op: OPERATORS.AND,
|
|
1186
|
+
items: withProject([
|
|
1187
|
+
{
|
|
1188
|
+
key: { key: SPAN_KEYS.NAME, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
|
|
1189
|
+
op: OPERATORS.EQUALS,
|
|
1190
|
+
value: SPAN_NAMES.AI_TOOL_CALL,
|
|
1191
|
+
},
|
|
1192
|
+
{
|
|
1193
|
+
key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
1194
|
+
op: OPERATORS.EXISTS,
|
|
1195
|
+
value: '',
|
|
1196
|
+
},
|
|
1197
|
+
{
|
|
1198
|
+
key: { key: SPAN_KEYS.AI_TOOL_TYPE, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
1199
|
+
op: OPERATORS.EQUALS,
|
|
1200
|
+
value: AI_TOOL_TYPES.MCP,
|
|
1201
|
+
},
|
|
1202
|
+
]),
|
|
1203
|
+
},
|
|
802
1204
|
groupBy: [
|
|
803
1205
|
{ key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
804
1206
|
{ key: SPAN_KEYS.AI_TOOL_CALL_NAME, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
805
1207
|
],
|
|
806
|
-
expression: QUERY_EXPRESSIONS.TOOLS,
|
|
807
|
-
|
|
808
|
-
|
|
1208
|
+
expression: QUERY_EXPRESSIONS.TOOLS,
|
|
1209
|
+
reduceTo: REDUCE_OPERATIONS.SUM,
|
|
1210
|
+
stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
|
|
1211
|
+
orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }],
|
|
1212
|
+
offset: QUERY_DEFAULTS.OFFSET,
|
|
1213
|
+
disabled: QUERY_DEFAULTS.DISABLED,
|
|
1214
|
+
having: QUERY_DEFAULTS.HAVING,
|
|
1215
|
+
legend: QUERY_DEFAULTS.LEGEND,
|
|
1216
|
+
limit: QUERY_DEFAULTS.LIMIT_NULL,
|
|
809
1217
|
},
|
|
810
1218
|
|
|
811
1219
|
transfers: {
|
|
812
|
-
dataSource: DATA_SOURCES.TRACES,
|
|
1220
|
+
dataSource: DATA_SOURCES.TRACES,
|
|
1221
|
+
queryName: QUERY_EXPRESSIONS.TRANSFERS,
|
|
813
1222
|
aggregateOperator: AGGREGATE_OPERATORS.COUNT,
|
|
814
|
-
aggregateAttribute: {
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
1223
|
+
aggregateAttribute: {
|
|
1224
|
+
key: SPAN_KEYS.SPAN_ID,
|
|
1225
|
+
...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
|
|
1226
|
+
},
|
|
1227
|
+
filters: {
|
|
1228
|
+
op: OPERATORS.AND,
|
|
1229
|
+
items: withProject([
|
|
1230
|
+
{
|
|
1231
|
+
key: { key: SPAN_KEYS.NAME, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
|
|
1232
|
+
op: OPERATORS.EQUALS,
|
|
1233
|
+
value: SPAN_NAMES.AI_TOOL_CALL,
|
|
1234
|
+
},
|
|
1235
|
+
{
|
|
1236
|
+
key: { key: SPAN_KEYS.AI_TOOL_TYPE, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
1237
|
+
op: OPERATORS.EQUALS,
|
|
1238
|
+
value: AI_TOOL_TYPES.TRANSFER,
|
|
1239
|
+
},
|
|
1240
|
+
{
|
|
1241
|
+
key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
1242
|
+
op: OPERATORS.EXISTS,
|
|
1243
|
+
value: '',
|
|
1244
|
+
},
|
|
1245
|
+
]),
|
|
1246
|
+
},
|
|
820
1247
|
groupBy: [
|
|
821
1248
|
{ key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
822
1249
|
{ key: SPAN_KEYS.TRANSFER_FROM_AGENT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
823
1250
|
{ key: SPAN_KEYS.TRANSFER_TO_AGENT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
824
1251
|
],
|
|
825
|
-
expression: QUERY_EXPRESSIONS.TRANSFERS,
|
|
826
|
-
|
|
827
|
-
|
|
1252
|
+
expression: QUERY_EXPRESSIONS.TRANSFERS,
|
|
1253
|
+
reduceTo: REDUCE_OPERATIONS.SUM,
|
|
1254
|
+
stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
|
|
1255
|
+
orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }],
|
|
1256
|
+
offset: QUERY_DEFAULTS.OFFSET,
|
|
1257
|
+
disabled: QUERY_DEFAULTS.DISABLED,
|
|
1258
|
+
having: QUERY_DEFAULTS.HAVING,
|
|
1259
|
+
legend: QUERY_DEFAULTS.LEGEND,
|
|
1260
|
+
limit: QUERY_DEFAULTS.LIMIT_NULL,
|
|
828
1261
|
},
|
|
829
1262
|
|
|
830
1263
|
delegations: {
|
|
831
|
-
dataSource: DATA_SOURCES.TRACES,
|
|
1264
|
+
dataSource: DATA_SOURCES.TRACES,
|
|
1265
|
+
queryName: QUERY_EXPRESSIONS.DELEGATIONS,
|
|
832
1266
|
aggregateOperator: AGGREGATE_OPERATORS.COUNT,
|
|
833
|
-
aggregateAttribute: {
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
1267
|
+
aggregateAttribute: {
|
|
1268
|
+
key: SPAN_KEYS.SPAN_ID,
|
|
1269
|
+
...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
|
|
1270
|
+
},
|
|
1271
|
+
filters: {
|
|
1272
|
+
op: OPERATORS.AND,
|
|
1273
|
+
items: withProject([
|
|
1274
|
+
{
|
|
1275
|
+
key: { key: SPAN_KEYS.NAME, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
|
|
1276
|
+
op: OPERATORS.EQUALS,
|
|
1277
|
+
value: SPAN_NAMES.AI_TOOL_CALL,
|
|
1278
|
+
},
|
|
1279
|
+
{
|
|
1280
|
+
key: { key: SPAN_KEYS.AI_TOOL_TYPE, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
1281
|
+
op: OPERATORS.EQUALS,
|
|
1282
|
+
value: AI_TOOL_TYPES.DELEGATION,
|
|
1283
|
+
},
|
|
1284
|
+
{
|
|
1285
|
+
key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
1286
|
+
op: OPERATORS.EXISTS,
|
|
1287
|
+
value: '',
|
|
1288
|
+
},
|
|
1289
|
+
]),
|
|
1290
|
+
},
|
|
839
1291
|
groupBy: [
|
|
840
1292
|
{ key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
841
1293
|
{ key: SPAN_KEYS.DELEGATION_FROM_AGENT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
842
1294
|
{ key: SPAN_KEYS.DELEGATION_TO_AGENT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
843
1295
|
],
|
|
844
|
-
expression: QUERY_EXPRESSIONS.DELEGATIONS,
|
|
845
|
-
|
|
846
|
-
|
|
1296
|
+
expression: QUERY_EXPRESSIONS.DELEGATIONS,
|
|
1297
|
+
reduceTo: REDUCE_OPERATIONS.SUM,
|
|
1298
|
+
stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
|
|
1299
|
+
orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }],
|
|
1300
|
+
offset: QUERY_DEFAULTS.OFFSET,
|
|
1301
|
+
disabled: QUERY_DEFAULTS.DISABLED,
|
|
1302
|
+
having: QUERY_DEFAULTS.HAVING,
|
|
1303
|
+
legend: QUERY_DEFAULTS.LEGEND,
|
|
1304
|
+
limit: QUERY_DEFAULTS.LIMIT_NULL,
|
|
847
1305
|
},
|
|
848
1306
|
|
|
849
1307
|
conversationMetadata: {
|
|
850
|
-
dataSource: DATA_SOURCES.TRACES,
|
|
1308
|
+
dataSource: DATA_SOURCES.TRACES,
|
|
1309
|
+
queryName: QUERY_EXPRESSIONS.CONVERSATION_METADATA,
|
|
851
1310
|
aggregateOperator: AGGREGATE_OPERATORS.COUNT,
|
|
852
|
-
aggregateAttribute: {
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
1311
|
+
aggregateAttribute: {
|
|
1312
|
+
key: SPAN_KEYS.SPAN_ID,
|
|
1313
|
+
...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
|
|
1314
|
+
},
|
|
1315
|
+
filters: {
|
|
1316
|
+
op: OPERATORS.AND,
|
|
1317
|
+
items: withProject([
|
|
1318
|
+
{
|
|
1319
|
+
key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
1320
|
+
op: OPERATORS.EXISTS,
|
|
1321
|
+
value: '',
|
|
1322
|
+
},
|
|
1323
|
+
{
|
|
1324
|
+
key: { key: SPAN_KEYS.TENANT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
1325
|
+
op: OPERATORS.EXISTS,
|
|
1326
|
+
value: '',
|
|
1327
|
+
},
|
|
1328
|
+
{
|
|
1329
|
+
key: { key: SPAN_KEYS.GRAPH_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
1330
|
+
op: OPERATORS.EXISTS,
|
|
1331
|
+
value: '',
|
|
1332
|
+
},
|
|
1333
|
+
]),
|
|
1334
|
+
},
|
|
858
1335
|
groupBy: [
|
|
859
1336
|
{ key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
860
1337
|
{ key: SPAN_KEYS.TENANT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
861
1338
|
{ key: SPAN_KEYS.GRAPH_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
862
1339
|
{ key: SPAN_KEYS.GRAPH_NAME, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
863
1340
|
],
|
|
864
|
-
expression: QUERY_EXPRESSIONS.CONVERSATION_METADATA,
|
|
865
|
-
|
|
866
|
-
|
|
1341
|
+
expression: QUERY_EXPRESSIONS.CONVERSATION_METADATA,
|
|
1342
|
+
reduceTo: REDUCE_OPERATIONS.SUM,
|
|
1343
|
+
stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
|
|
1344
|
+
orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }],
|
|
1345
|
+
offset: QUERY_DEFAULTS.OFFSET,
|
|
1346
|
+
disabled: QUERY_DEFAULTS.DISABLED,
|
|
1347
|
+
having: QUERY_DEFAULTS.HAVING,
|
|
1348
|
+
legend: QUERY_DEFAULTS.LEGEND,
|
|
1349
|
+
limit: QUERY_DEFAULTS.LIMIT_NULL,
|
|
867
1350
|
},
|
|
868
1351
|
|
|
869
1352
|
aiCalls: {
|
|
870
|
-
dataSource: DATA_SOURCES.TRACES,
|
|
1353
|
+
dataSource: DATA_SOURCES.TRACES,
|
|
1354
|
+
queryName: QUERY_EXPRESSIONS.AI_CALLS,
|
|
871
1355
|
aggregateOperator: AGGREGATE_OPERATORS.COUNT,
|
|
872
|
-
aggregateAttribute: {
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
1356
|
+
aggregateAttribute: {
|
|
1357
|
+
key: SPAN_KEYS.SPAN_ID,
|
|
1358
|
+
...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
|
|
1359
|
+
},
|
|
1360
|
+
filters: {
|
|
1361
|
+
op: OPERATORS.AND,
|
|
1362
|
+
items: withProject([
|
|
1363
|
+
{
|
|
1364
|
+
key: { key: SPAN_KEYS.AI_OPERATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
|
|
1365
|
+
op: OPERATORS.EQUALS,
|
|
1366
|
+
value: AI_OPERATIONS.GENERATE_TEXT,
|
|
1367
|
+
},
|
|
1368
|
+
{
|
|
1369
|
+
key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
1370
|
+
op: OPERATORS.EXISTS,
|
|
1371
|
+
value: '',
|
|
1372
|
+
},
|
|
1373
|
+
]),
|
|
1374
|
+
},
|
|
877
1375
|
groupBy: [
|
|
878
1376
|
{ key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
879
1377
|
{ key: SPAN_KEYS.GRAPH_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
880
1378
|
{ key: 'ai.telemetry.functionId', ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
|
|
881
1379
|
],
|
|
882
|
-
expression: QUERY_EXPRESSIONS.AI_CALLS,
|
|
883
|
-
|
|
884
|
-
|
|
1380
|
+
expression: QUERY_EXPRESSIONS.AI_CALLS,
|
|
1381
|
+
reduceTo: REDUCE_OPERATIONS.SUM,
|
|
1382
|
+
stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
|
|
1383
|
+
orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }],
|
|
1384
|
+
offset: QUERY_DEFAULTS.OFFSET,
|
|
1385
|
+
disabled: QUERY_DEFAULTS.DISABLED,
|
|
1386
|
+
having: QUERY_DEFAULTS.HAVING,
|
|
1387
|
+
legend: QUERY_DEFAULTS.LEGEND,
|
|
1388
|
+
limit: QUERY_DEFAULTS.LIMIT_NULL,
|
|
885
1389
|
},
|
|
886
1390
|
|
|
887
1391
|
lastActivity: {
|
|
888
|
-
dataSource: DATA_SOURCES.TRACES,
|
|
1392
|
+
dataSource: DATA_SOURCES.TRACES,
|
|
1393
|
+
queryName: QUERY_EXPRESSIONS.LAST_ACTIVITY,
|
|
889
1394
|
aggregateOperator: AGGREGATE_OPERATORS.MAX,
|
|
890
|
-
aggregateAttribute: {
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
1395
|
+
aggregateAttribute: {
|
|
1396
|
+
key: SPAN_KEYS.TIMESTAMP,
|
|
1397
|
+
...QUERY_FIELD_CONFIGS.INT64_TAG_COLUMN,
|
|
1398
|
+
},
|
|
1399
|
+
filters: {
|
|
1400
|
+
op: OPERATORS.AND,
|
|
1401
|
+
items: withProject([
|
|
1402
|
+
{
|
|
1403
|
+
key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
1404
|
+
op: OPERATORS.EXISTS,
|
|
1405
|
+
value: '',
|
|
1406
|
+
},
|
|
1407
|
+
]),
|
|
1408
|
+
},
|
|
894
1409
|
groupBy: [{ key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }],
|
|
895
|
-
expression: QUERY_EXPRESSIONS.LAST_ACTIVITY,
|
|
896
|
-
|
|
897
|
-
|
|
1410
|
+
expression: QUERY_EXPRESSIONS.LAST_ACTIVITY,
|
|
1411
|
+
reduceTo: REDUCE_OPERATIONS.MAX,
|
|
1412
|
+
stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
|
|
1413
|
+
orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }],
|
|
1414
|
+
offset: QUERY_DEFAULTS.OFFSET,
|
|
1415
|
+
disabled: QUERY_DEFAULTS.DISABLED,
|
|
1416
|
+
having: QUERY_DEFAULTS.HAVING,
|
|
1417
|
+
legend: QUERY_DEFAULTS.LEGEND,
|
|
1418
|
+
limit: QUERY_DEFAULTS.LIMIT_NULL,
|
|
898
1419
|
},
|
|
899
1420
|
|
|
900
1421
|
contextErrors: {
|
|
901
|
-
dataSource: DATA_SOURCES.TRACES,
|
|
1422
|
+
dataSource: DATA_SOURCES.TRACES,
|
|
1423
|
+
queryName: QUERY_EXPRESSIONS.CONTEXT_ERRORS,
|
|
902
1424
|
aggregateOperator: AGGREGATE_OPERATORS.COUNT,
|
|
903
|
-
aggregateAttribute: {
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
1425
|
+
aggregateAttribute: {
|
|
1426
|
+
key: SPAN_KEYS.SPAN_ID,
|
|
1427
|
+
...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
|
|
1428
|
+
},
|
|
1429
|
+
filters: {
|
|
1430
|
+
op: OPERATORS.AND,
|
|
1431
|
+
items: withProject([
|
|
1432
|
+
{
|
|
1433
|
+
key: { key: SPAN_KEYS.NAME, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
|
|
1434
|
+
op: OPERATORS.EQUALS,
|
|
1435
|
+
value: SPAN_NAMES.CONTEXT_HANDLE,
|
|
1436
|
+
},
|
|
1437
|
+
{
|
|
1438
|
+
key: { key: SPAN_KEYS.HAS_ERROR, ...QUERY_FIELD_CONFIGS.BOOL_TAG_COLUMN },
|
|
1439
|
+
op: OPERATORS.EQUALS,
|
|
1440
|
+
value: true,
|
|
1441
|
+
}, // real boolean
|
|
1442
|
+
{
|
|
1443
|
+
key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
1444
|
+
op: OPERATORS.EXISTS,
|
|
1445
|
+
value: '',
|
|
1446
|
+
},
|
|
1447
|
+
]),
|
|
1448
|
+
},
|
|
909
1449
|
groupBy: [{ key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }],
|
|
910
|
-
expression: QUERY_EXPRESSIONS.CONTEXT_ERRORS,
|
|
911
|
-
|
|
912
|
-
|
|
1450
|
+
expression: QUERY_EXPRESSIONS.CONTEXT_ERRORS,
|
|
1451
|
+
reduceTo: REDUCE_OPERATIONS.SUM,
|
|
1452
|
+
stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
|
|
1453
|
+
orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }],
|
|
1454
|
+
offset: QUERY_DEFAULTS.OFFSET,
|
|
1455
|
+
disabled: QUERY_DEFAULTS.DISABLED,
|
|
1456
|
+
having: QUERY_DEFAULTS.HAVING,
|
|
1457
|
+
legend: QUERY_DEFAULTS.LEGEND,
|
|
1458
|
+
limit: QUERY_DEFAULTS.LIMIT_NULL,
|
|
913
1459
|
},
|
|
914
1460
|
|
|
915
1461
|
agentGenerationErrors: {
|
|
916
|
-
dataSource: DATA_SOURCES.TRACES,
|
|
1462
|
+
dataSource: DATA_SOURCES.TRACES,
|
|
1463
|
+
queryName: QUERY_EXPRESSIONS.AGENT_GENERATION_ERRORS,
|
|
917
1464
|
aggregateOperator: AGGREGATE_OPERATORS.COUNT,
|
|
918
|
-
aggregateAttribute: {
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
1465
|
+
aggregateAttribute: {
|
|
1466
|
+
key: SPAN_KEYS.SPAN_ID,
|
|
1467
|
+
...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
|
|
1468
|
+
},
|
|
1469
|
+
filters: {
|
|
1470
|
+
op: OPERATORS.AND,
|
|
1471
|
+
items: withProject([
|
|
1472
|
+
{
|
|
1473
|
+
key: { key: SPAN_KEYS.NAME, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
|
|
1474
|
+
op: OPERATORS.EQUALS,
|
|
1475
|
+
value: SPAN_NAMES.AGENT_GENERATION,
|
|
1476
|
+
},
|
|
1477
|
+
{
|
|
1478
|
+
key: { key: SPAN_KEYS.HAS_ERROR, ...QUERY_FIELD_CONFIGS.BOOL_TAG_COLUMN },
|
|
1479
|
+
op: OPERATORS.EQUALS,
|
|
1480
|
+
value: true,
|
|
1481
|
+
}, // real boolean
|
|
1482
|
+
{
|
|
1483
|
+
key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
1484
|
+
op: OPERATORS.EXISTS,
|
|
1485
|
+
value: '',
|
|
1486
|
+
},
|
|
1487
|
+
]),
|
|
1488
|
+
},
|
|
924
1489
|
groupBy: [{ key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }],
|
|
925
|
-
expression: QUERY_EXPRESSIONS.AGENT_GENERATION_ERRORS,
|
|
926
|
-
|
|
927
|
-
|
|
1490
|
+
expression: QUERY_EXPRESSIONS.AGENT_GENERATION_ERRORS,
|
|
1491
|
+
reduceTo: REDUCE_OPERATIONS.SUM,
|
|
1492
|
+
stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
|
|
1493
|
+
orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }],
|
|
1494
|
+
offset: QUERY_DEFAULTS.OFFSET,
|
|
1495
|
+
disabled: QUERY_DEFAULTS.DISABLED,
|
|
1496
|
+
having: QUERY_DEFAULTS.HAVING,
|
|
1497
|
+
legend: QUERY_DEFAULTS.LEGEND,
|
|
1498
|
+
limit: QUERY_DEFAULTS.LIMIT_NULL,
|
|
928
1499
|
},
|
|
929
1500
|
|
|
930
1501
|
userMessages: {
|
|
931
|
-
dataSource: DATA_SOURCES.TRACES,
|
|
1502
|
+
dataSource: DATA_SOURCES.TRACES,
|
|
1503
|
+
queryName: QUERY_EXPRESSIONS.USER_MESSAGES,
|
|
932
1504
|
aggregateOperator: AGGREGATE_OPERATORS.MIN,
|
|
933
|
-
aggregateAttribute: {
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
1505
|
+
aggregateAttribute: {
|
|
1506
|
+
key: SPAN_KEYS.TIMESTAMP,
|
|
1507
|
+
...QUERY_FIELD_CONFIGS.INT64_TAG_COLUMN,
|
|
1508
|
+
},
|
|
1509
|
+
filters: {
|
|
1510
|
+
op: OPERATORS.AND,
|
|
1511
|
+
items: withProject([
|
|
1512
|
+
{
|
|
1513
|
+
key: { key: SPAN_KEYS.MESSAGE_CONTENT, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
1514
|
+
op: OPERATORS.EXISTS,
|
|
1515
|
+
value: '',
|
|
1516
|
+
},
|
|
1517
|
+
{
|
|
1518
|
+
key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
1519
|
+
op: OPERATORS.EXISTS,
|
|
1520
|
+
value: '',
|
|
1521
|
+
},
|
|
1522
|
+
]),
|
|
1523
|
+
},
|
|
939
1524
|
groupBy: [
|
|
940
1525
|
{ key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
941
1526
|
{ key: SPAN_KEYS.MESSAGE_CONTENT, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
942
1527
|
],
|
|
943
|
-
expression: QUERY_EXPRESSIONS.USER_MESSAGES,
|
|
944
|
-
|
|
945
|
-
|
|
1528
|
+
expression: QUERY_EXPRESSIONS.USER_MESSAGES,
|
|
1529
|
+
reduceTo: REDUCE_OPERATIONS.MIN,
|
|
1530
|
+
stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
|
|
1531
|
+
orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.ASC }],
|
|
1532
|
+
offset: QUERY_DEFAULTS.OFFSET,
|
|
1533
|
+
disabled: QUERY_DEFAULTS.DISABLED,
|
|
1534
|
+
having: QUERY_DEFAULTS.HAVING,
|
|
1535
|
+
legend: QUERY_DEFAULTS.LEGEND,
|
|
1536
|
+
limit: QUERY_DEFAULTS.LIMIT_NULL,
|
|
946
1537
|
},
|
|
947
1538
|
},
|
|
948
1539
|
},
|
|
949
|
-
dataSource: DATA_SOURCES.TRACES,
|
|
1540
|
+
dataSource: DATA_SOURCES.TRACES,
|
|
1541
|
+
projectId,
|
|
950
1542
|
};
|
|
951
1543
|
}
|
|
952
1544
|
|
|
953
1545
|
private buildUniqueGraphsPayload(start: number, end: number, projectId?: string) {
|
|
954
1546
|
const items: any[] = [
|
|
955
|
-
{
|
|
956
|
-
|
|
957
|
-
|
|
1547
|
+
{
|
|
1548
|
+
key: { key: SPAN_KEYS.GRAPH_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
1549
|
+
op: OPERATORS.EXISTS,
|
|
1550
|
+
value: '',
|
|
1551
|
+
},
|
|
1552
|
+
{
|
|
1553
|
+
key: { key: SPAN_KEYS.GRAPH_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
1554
|
+
op: OPERATORS.NOT_EQUALS,
|
|
1555
|
+
value: UNKNOWN_VALUE,
|
|
1556
|
+
},
|
|
1557
|
+
...(projectId
|
|
1558
|
+
? [
|
|
1559
|
+
{
|
|
1560
|
+
key: { key: SPAN_KEYS.PROJECT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
1561
|
+
op: OPERATORS.EQUALS,
|
|
1562
|
+
value: projectId,
|
|
1563
|
+
},
|
|
1564
|
+
]
|
|
1565
|
+
: []),
|
|
958
1566
|
];
|
|
959
1567
|
|
|
960
1568
|
return {
|
|
961
|
-
start,
|
|
1569
|
+
start,
|
|
1570
|
+
end,
|
|
1571
|
+
step: QUERY_DEFAULTS.STEP,
|
|
1572
|
+
variables: {},
|
|
962
1573
|
compositeQuery: {
|
|
963
|
-
queryType: QUERY_TYPES.BUILDER,
|
|
1574
|
+
queryType: QUERY_TYPES.BUILDER,
|
|
1575
|
+
panelType: PANEL_TYPES.TABLE,
|
|
964
1576
|
builderQueries: {
|
|
965
1577
|
uniqueGraphs: {
|
|
966
|
-
dataSource: DATA_SOURCES.TRACES,
|
|
1578
|
+
dataSource: DATA_SOURCES.TRACES,
|
|
1579
|
+
queryName: QUERY_EXPRESSIONS.UNIQUE_GRAPHS,
|
|
967
1580
|
aggregateOperator: AGGREGATE_OPERATORS.COUNT,
|
|
968
|
-
aggregateAttribute: {
|
|
1581
|
+
aggregateAttribute: {
|
|
1582
|
+
key: SPAN_KEYS.SPAN_ID,
|
|
1583
|
+
...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
|
|
1584
|
+
},
|
|
969
1585
|
filters: { op: OPERATORS.AND, items },
|
|
970
1586
|
groupBy: [{ key: SPAN_KEYS.GRAPH_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }],
|
|
971
|
-
expression: QUERY_EXPRESSIONS.UNIQUE_GRAPHS,
|
|
972
|
-
|
|
973
|
-
|
|
1587
|
+
expression: QUERY_EXPRESSIONS.UNIQUE_GRAPHS,
|
|
1588
|
+
reduceTo: REDUCE_OPERATIONS.SUM,
|
|
1589
|
+
stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
|
|
1590
|
+
orderBy: [{ columnName: SPAN_KEYS.GRAPH_ID, order: ORDER_DIRECTIONS.ASC }],
|
|
1591
|
+
offset: QUERY_DEFAULTS.OFFSET,
|
|
1592
|
+
disabled: QUERY_DEFAULTS.DISABLED,
|
|
1593
|
+
having: QUERY_DEFAULTS.HAVING,
|
|
1594
|
+
legend: QUERY_DEFAULTS.LEGEND,
|
|
1595
|
+
limit: QUERY_DEFAULTS.LIMIT_NULL,
|
|
974
1596
|
},
|
|
975
1597
|
},
|
|
976
1598
|
},
|
|
977
|
-
dataSource: DATA_SOURCES.TRACES,
|
|
1599
|
+
dataSource: DATA_SOURCES.TRACES,
|
|
1600
|
+
projectId,
|
|
978
1601
|
};
|
|
979
1602
|
}
|
|
980
1603
|
|
|
981
1604
|
private buildUniqueModelsPayload(start: number, end: number, projectId?: string) {
|
|
982
1605
|
const items: any[] = [
|
|
983
|
-
{
|
|
984
|
-
|
|
985
|
-
|
|
1606
|
+
{
|
|
1607
|
+
key: { key: SPAN_KEYS.AI_MODEL_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
|
|
1608
|
+
op: OPERATORS.EXISTS,
|
|
1609
|
+
value: '',
|
|
1610
|
+
},
|
|
1611
|
+
{
|
|
1612
|
+
key: { key: SPAN_KEYS.AI_MODEL_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
|
|
1613
|
+
op: OPERATORS.NOT_EQUALS,
|
|
1614
|
+
value: UNKNOWN_VALUE,
|
|
1615
|
+
},
|
|
1616
|
+
...(projectId
|
|
1617
|
+
? [
|
|
1618
|
+
{
|
|
1619
|
+
key: { key: SPAN_KEYS.PROJECT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
|
|
1620
|
+
op: OPERATORS.EQUALS,
|
|
1621
|
+
value: projectId,
|
|
1622
|
+
},
|
|
1623
|
+
]
|
|
1624
|
+
: []),
|
|
986
1625
|
];
|
|
987
1626
|
|
|
988
1627
|
return {
|
|
989
|
-
start,
|
|
1628
|
+
start,
|
|
1629
|
+
end,
|
|
1630
|
+
step: QUERY_DEFAULTS.STEP,
|
|
1631
|
+
variables: {},
|
|
990
1632
|
compositeQuery: {
|
|
991
|
-
queryType: QUERY_TYPES.BUILDER,
|
|
1633
|
+
queryType: QUERY_TYPES.BUILDER,
|
|
1634
|
+
panelType: PANEL_TYPES.TABLE,
|
|
992
1635
|
builderQueries: {
|
|
993
1636
|
uniqueModels: {
|
|
994
|
-
dataSource: DATA_SOURCES.TRACES,
|
|
1637
|
+
dataSource: DATA_SOURCES.TRACES,
|
|
1638
|
+
queryName: QUERY_EXPRESSIONS.UNIQUE_MODELS,
|
|
995
1639
|
aggregateOperator: AGGREGATE_OPERATORS.COUNT,
|
|
996
|
-
aggregateAttribute: {
|
|
1640
|
+
aggregateAttribute: {
|
|
1641
|
+
key: SPAN_KEYS.SPAN_ID,
|
|
1642
|
+
...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
|
|
1643
|
+
},
|
|
997
1644
|
filters: { op: OPERATORS.AND, items },
|
|
998
1645
|
groupBy: [{ key: SPAN_KEYS.AI_MODEL_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN }],
|
|
999
|
-
expression: QUERY_EXPRESSIONS.UNIQUE_MODELS,
|
|
1000
|
-
|
|
1001
|
-
|
|
1646
|
+
expression: QUERY_EXPRESSIONS.UNIQUE_MODELS,
|
|
1647
|
+
reduceTo: REDUCE_OPERATIONS.SUM,
|
|
1648
|
+
stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
|
|
1649
|
+
orderBy: [{ columnName: SPAN_KEYS.AI_MODEL_ID, order: ORDER_DIRECTIONS.ASC }],
|
|
1650
|
+
offset: QUERY_DEFAULTS.OFFSET,
|
|
1651
|
+
disabled: QUERY_DEFAULTS.DISABLED,
|
|
1652
|
+
having: QUERY_DEFAULTS.HAVING,
|
|
1653
|
+
legend: QUERY_DEFAULTS.LEGEND,
|
|
1654
|
+
limit: QUERY_DEFAULTS.LIMIT_NULL,
|
|
1002
1655
|
},
|
|
1003
1656
|
},
|
|
1004
1657
|
},
|
|
1005
|
-
dataSource: DATA_SOURCES.TRACES,
|
|
1658
|
+
dataSource: DATA_SOURCES.TRACES,
|
|
1659
|
+
projectId,
|
|
1006
1660
|
};
|
|
1007
1661
|
}
|
|
1008
1662
|
}
|