Skip to content

Commit 7e5d651

Browse files
author
Adam Tackett
committed
remove sorting on invalid fields, adjust load more ui
Signed-off-by: Adam Tackett <[email protected]>
1 parent 74ad512 commit 7e5d651

File tree

6 files changed

+93
-59
lines changed

6 files changed

+93
-59
lines changed

public/components/trace_analytics/components/common/shared_components/component_helper_functions.tsx

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ export const useInjectElementsIntoGrid = (
1111
maxDisplayRows: number,
1212
tracesTableMode: string,
1313
loadMoreHandler?: () => void,
14-
maxTraces?: number
14+
maxTraces?: number,
15+
isLastPage?: boolean
1516
) => {
1617
useEffect(() => {
1718
setTimeout(() => {
@@ -51,18 +52,16 @@ export const useInjectElementsIntoGrid = (
5152
}
5253

5354
const pagination = document.querySelector<HTMLElement>('.euiDataGrid__pagination');
55+
const existingLoadMoreButton = pagination?.querySelector('.trace-table-load-more');
5456

55-
if (tracesTableMode !== 'traces') {
56-
if (pagination) {
57-
const existingLoadMoreButton = pagination.querySelector('.trace-table-load-more');
58-
if (existingLoadMoreButton) {
59-
existingLoadMoreButton.remove();
60-
}
57+
if (tracesTableMode !== 'traces' || !pagination || !loadMoreHandler || !isLastPage) {
58+
if (existingLoadMoreButton) {
59+
existingLoadMoreButton.remove();
6160
}
6261
return;
6362
}
6463

65-
if (pagination && loadMoreHandler) {
64+
if (pagination && loadMoreHandler && isLastPage) {
6665
pagination.style.display = 'flex';
6766
pagination.style.alignItems = 'center';
6867
pagination.style.justifyContent = 'space-between';
@@ -72,13 +71,20 @@ export const useInjectElementsIntoGrid = (
7271
loadMoreButton = document.createElement('button');
7372
loadMoreButton.className = 'trace-table-load-more euiButtonEmpty euiButtonEmpty--text';
7473
loadMoreButton.style.marginLeft = '12px';
75-
loadMoreButton.innerText = 'Load more data';
74+
loadMoreButton.innerText = '... Load more';
7675

7776
loadMoreButton.onclick = () => loadMoreHandler();
7877

79-
pagination.appendChild(loadMoreButton);
78+
const paginationList = pagination.querySelector('.euiPagination__list');
79+
80+
if (paginationList) {
81+
const listItem = document.createElement('li');
82+
listItem.className = 'euiPagination__item trace-table-load-more';
83+
listItem.appendChild(loadMoreButton);
84+
paginationList.appendChild(listItem);
85+
}
8086
}
8187
}
8288
}, 100);
83-
}, [rowCount, tracesTableMode, loadMoreHandler, maxTraces, maxDisplayRows]);
89+
}, [rowCount, tracesTableMode, loadMoreHandler, maxTraces, maxDisplayRows, isLastPage]);
8490
};

public/components/trace_analytics/components/common/shared_components/custom_datagrid.tsx

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,14 +137,26 @@ export const RenderCustomDataGrid: React.FC<RenderCustomDataGridParams> = ({
137137
)
138138
: [];
139139

140+
const isLastPage =
141+
tracesTableMode === 'traces' && pagination?.pageSize && maxTraces != null
142+
? (pagination.pageIndex + 1) * pagination.pageSize >= maxTraces &&
143+
rowCount > maxTraces &&
144+
maxTraces < MAX_DISPLAY_ROWS
145+
: false;
146+
140147
useInjectElementsIntoGrid(
141148
rowCount,
142149
MAX_DISPLAY_ROWS,
143150
tracesTableMode ?? '',
144151
() => {
145-
setMaxTraces((prevMax: number) => Math.min(prevMax + 500, MAX_DISPLAY_ROWS));
152+
// Add 500 more traces at a time untill all traces present
153+
const nextIncrement = Math.min(500, rowCount - maxTraces);
154+
if (nextIncrement > 0 && maxTraces < MAX_DISPLAY_ROWS) {
155+
setMaxTraces((prevMax) => Math.min(prevMax + nextIncrement, MAX_DISPLAY_ROWS));
156+
}
146157
},
147-
maxTraces
158+
maxTraces,
159+
isLastPage
148160
);
149161

150162
const disableInteractions = useMemo(() => isFullScreen, [isFullScreen]);

public/components/trace_analytics/components/traces/trace_table_helpers.tsx

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -139,30 +139,30 @@ export const getTableColumns = (
139139
field: 'spanId',
140140
name: 'Span Id',
141141
align: 'left',
142-
sortable: true,
142+
sortable: false,
143143
render: renderIdField,
144144
className: 'span-group-column',
145145
},
146146
{
147147
field: 'traceId',
148148
name: 'Trace Id',
149149
align: 'left',
150-
sortable: true,
150+
sortable: false,
151151
render: renderTraceLinkField,
152152
},
153153
{
154154
field: 'parentSpanId',
155155
name: 'Parent Span Id',
156156
align: 'left',
157-
sortable: true,
157+
sortable: false,
158158
render: renderIdField,
159159
className: 'span-group-column',
160160
},
161161
{
162162
field: 'traceGroup',
163163
name: 'Trace group',
164164
align: 'left',
165-
sortable: true,
165+
sortable: false,
166166
truncateText: true,
167167
},
168168
{
@@ -196,16 +196,16 @@ export const getTableColumns = (
196196
return [
197197
{
198198
field: 'trace_id',
199-
name: 'Trace ID',
199+
name: 'Trace Id',
200200
align: 'left',
201-
sortable: true,
201+
sortable: false,
202202
render: renderTraceLinkField,
203203
},
204204
{
205205
field: 'trace_group',
206206
name: 'Trace group',
207207
align: 'left',
208-
sortable: true,
208+
sortable: false,
209209
truncateText: true,
210210
},
211211
{
@@ -219,7 +219,7 @@ export const getTableColumns = (
219219
field: 'percentile_in_trace_group',
220220
name: 'Percentile in trace group',
221221
align: 'right',
222-
sortable: true,
222+
sortable: false,
223223
render: (item) => (item ? `${round(item, 2)}th` : '-'),
224224
},
225225
{
@@ -243,9 +243,9 @@ export const getTableColumns = (
243243
return [
244244
{
245245
field: 'trace_id',
246-
name: 'Trace ID',
246+
name: 'Trace Id',
247247
align: 'left',
248-
sortable: true,
248+
sortable: false,
249249
render: renderTraceLinkField,
250250
},
251251
{ field: 'latency', name: 'Latency (ms)', align: 'right', sortable: true },

public/components/trace_analytics/components/traces/traces_content.tsx

Lines changed: 16 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -100,36 +100,7 @@ export function TracesContent(props: TracesProps) {
100100

101101
setSortingColumns(sortColumns);
102102

103-
// The columns that can not be used in a query, only rendered on page
104-
const localOnlyFields = ['trace_group', 'percentile_in_trace_group', 'trace_id'];
105-
106103
if (tracesTableMode === 'traces') {
107-
// Client-side sort if field is local-only
108-
if (localOnlyFields.includes(sortField)) {
109-
const sorted = [...tableItems].sort((a, b) => {
110-
let valueA = a[sortField];
111-
let valueB = b[sortField];
112-
113-
if (typeof valueA === 'string' && typeof valueB === 'string') {
114-
valueA = valueA.toLowerCase();
115-
valueB = valueB.toLowerCase();
116-
return sortDirection === 'asc'
117-
? valueA.localeCompare(valueB)
118-
: valueB.localeCompare(valueA);
119-
}
120-
121-
if (typeof valueA === 'number' && typeof valueB === 'number') {
122-
return sortDirection === 'asc' ? valueA - valueB : valueB - valueA;
123-
}
124-
125-
return 0;
126-
});
127-
128-
setTableItems(sorted);
129-
return;
130-
}
131-
132-
// Server-side sort for supported fields
133104
const sort = { field: sortField, direction: sortDirection };
134105
refreshTracesTableData(sort, 0, pageSize);
135106
} else {
@@ -232,9 +203,24 @@ export function TracesContent(props: TracesProps) {
232203
startTime,
233204
endTime,
234205
props.dataSourceMDSId,
235-
maxTraces,
236206
]);
237207

208+
useEffect(() => {
209+
if (tracesTableMode !== 'traces') return;
210+
211+
const currentSort = sortingColumns[0];
212+
213+
const sort = currentSort
214+
? { field: currentSort.id, direction: currentSort.direction }
215+
: undefined;
216+
217+
refreshTracesTableData(sort, pageIndex, pageSize);
218+
}, [maxTraces]);
219+
220+
useEffect(() => {
221+
setPageIndex(0);
222+
}, [tracesTableMode]);
223+
238224
const onToggle = (isOpen: boolean) => {
239225
const newState = isOpen ? 'open' : 'closed';
240226
setTrigger(newState);

public/components/trace_analytics/requests/queries/traces_queries.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ export const getTracesQuery = (
5656
) => {
5757
const field = sort?.field || '_key';
5858
const direction = sort?.direction || 'asc';
59+
// Need aggregation because filtering considers the children
5960
const jaegerQuery: any = {
6061
size: 0,
6162
query: {
@@ -187,7 +188,7 @@ export const getTracesQuery = (
187188
},
188189
},
189190
},
190-
track_total_hits: true,
191+
track_total_hits: false,
191192
};
192193
if (traceId) {
193194
jaegerQuery.query.bool.filter.push({

public/components/trace_analytics/requests/traces_request_handler.ts

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { isArray, isObject } from 'lodash';
88
import get from 'lodash/get';
99
import omitBy from 'lodash/omitBy';
1010
import round from 'lodash/round';
11+
import cloneDeep from 'lodash/cloneDeep';
1112
import moment from 'moment';
1213
import { v1 as uuid } from 'uuid';
1314
import { HttpSetup } from '../../../../../../src/core/public';
@@ -157,8 +158,37 @@ export const handleTracesRequest = async (
157158
})
158159
: Promise.resolve({});
159160

160-
return Promise.allSettled([responsePromise, percentileRangesPromise])
161-
.then(([responseResult, percentileRangesResult]) => {
161+
let rootSpansTotalHitsPromise: Promise<number> | undefined;
162+
163+
if (setTotalHits && (mode === 'data_prepper' || mode === 'custom_data_prepper')) {
164+
const rootSpansDSL = cloneDeep(timeFilterDSL);
165+
rootSpansDSL.query.bool.filter.push({
166+
term: {
167+
parentSpanId: '',
168+
},
169+
});
170+
171+
const rootSpansQuery = {
172+
size: 0,
173+
query: rootSpansDSL.query,
174+
index: getTracesQuery(mode).index,
175+
track_total_hits: true, // Override default 10,000 cap
176+
};
177+
178+
rootSpansTotalHitsPromise = handleDslRequest(
179+
http,
180+
{},
181+
rootSpansQuery,
182+
mode,
183+
dataSourceMDSId
184+
).then((res) => res?.hits?.total?.value ?? 0);
185+
}
186+
187+
const promises = [responsePromise, percentileRangesPromise];
188+
if (rootSpansTotalHitsPromise) promises.push(rootSpansTotalHitsPromise);
189+
190+
return Promise.allSettled(promises)
191+
.then(([responseResult, percentileRangesResult, totalHitsResult]) => {
162192
if (responseResult.status === 'rejected') {
163193
setItems([]);
164194
return;
@@ -168,9 +198,8 @@ export const handleTracesRequest = async (
168198
percentileRangesResult.status === 'fulfilled' ? percentileRangesResult.value : {};
169199
const response = responseResult.value;
170200

171-
if (setTotalHits) {
172-
const totalHits = response?.hits?.total?.value ?? 0;
173-
setTotalHits(totalHits);
201+
if (setTotalHits && totalHitsResult?.status === 'fulfilled') {
202+
setTotalHits(totalHitsResult.value);
174203
}
175204

176205
if (

0 commit comments

Comments
 (0)