Skip to content

Commit cd624ae

Browse files
authored
sort by timestamp (#22)
* sort by timestamp * skip tests * fix tests
1 parent ca1075f commit cd624ae

File tree

4 files changed

+60
-40
lines changed

4 files changed

+60
-40
lines changed

dashboard/log-analyzer/src/components/logs/LogTable.tsx

Lines changed: 7 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,8 @@ export function LogTable({ logs = [], onSort, sortColumn, sortOrder, observerRef
4343
<TableRow>
4444
<TableHead
4545
className="w-[10%] truncate"
46-
onClick={() => onSort('request_id')}
47-
onMouseEnter={() => setHoveredColumn('request_id')}
48-
onMouseLeave={() => setHoveredColumn(null)}
4946
>
50-
ID{renderSortIndicator('request_id')}
47+
ID
5148
</TableHead>
5249
<TableHead
5350
className="w-[120px] max-w-[120px] truncate"
@@ -59,51 +56,33 @@ export function LogTable({ logs = [], onSort, sortColumn, sortOrder, observerRef
5956
</TableHead>
6057
<TableHead
6158
className="w-[80px] max-w-[80px] truncate"
62-
onClick={() => onSort('level')}
63-
onMouseEnter={() => setHoveredColumn('level')}
64-
onMouseLeave={() => setHoveredColumn(null)}
6559
>
66-
Level{renderSortIndicator('level')}
60+
Level
6761
</TableHead>
6862
<TableHead
6963
className="w-[120px] max-w-[120px] truncate"
70-
onClick={() => onSort('service')}
71-
onMouseEnter={() => setHoveredColumn('service')}
72-
onMouseLeave={() => setHoveredColumn(null)}
7364
>
74-
Service{renderSortIndicator('service')}
65+
Service
7566
</TableHead>
7667
<TableHead
7768
className="w-[80px] max-w-[80px] truncate"
78-
onClick={() => onSort('request_method')}
79-
onMouseEnter={() => setHoveredColumn('request_method')}
80-
onMouseLeave={() => setHoveredColumn(null)}
8169
>
82-
Method{renderSortIndicator('request_method')}
70+
Method
8371
</TableHead>
8472
<TableHead
8573
className="w-[14%] truncate"
86-
onClick={() => onSort('request_path')}
87-
onMouseEnter={() => setHoveredColumn('request_path')}
88-
onMouseLeave={() => setHoveredColumn(null)}
8974
>
90-
Path{renderSortIndicator('request_path')}
75+
Path
9176
</TableHead>
9277
<TableHead
9378
className="w-[80px] max-w-[80px] truncate"
94-
onClick={() => onSort('status_code')}
95-
onMouseEnter={() => setHoveredColumn('status_code')}
96-
onMouseLeave={() => setHoveredColumn(null)}
9779
>
98-
Status{renderSortIndicator('status_code')}
80+
Status
9981
</TableHead>
10082
<TableHead
10183
className="w-[30%] truncate"
102-
onClick={() => onSort('message')}
103-
onMouseEnter={() => setHoveredColumn('message')}
104-
onMouseLeave={() => setHoveredColumn(null)}
10584
>
106-
Message{renderSortIndicator('message')}
85+
Message
10786
</TableHead>
10887
</TableRow>
10988
</TableHeader>

dashboard/log-analyzer/src/components/logs/LogTableWithPagination.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ export function LogTableWithPagination({ pageSize }: LogTableWithPaginationProps
6161

6262
// eslint-disable-next-line @typescript-eslint/no-explicit-any
6363
const shouldUseExplorerApi = useCallback((filters: Record<string, any>) => {
64-
const allowedFilters = ['start_date', 'end_date', 'environment', 'service', 'level'];
64+
const allowedFilters = ['start_date', 'end_date', 'environment', 'service', 'level', 'order', 'sort_by'];
6565
const activeFilters = Object.keys(filters);
6666
return activeFilters.every(filter => allowedFilters.includes(filter));
6767
}, []);

tinybird/endpoints/log_explorer.pipe

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,16 @@ SQL >
88
start_ts,
99
end_ts,
1010
sum(n_rows) as rows,
11-
sum(n_rows) OVER (ORDER BY start_ts asc) as _n_rows,
11+
sum(n_rows) OVER (ORDER BY start_ts
12+
{% if defined(order) and order != '' %}
13+
{% if order == 'asc' %}
14+
ASC
15+
{% else %}
16+
DESC
17+
{% end %}
18+
{% else %}
19+
DESC
20+
{% end %}) as _n_rows,
1221
_n_rows - rows as previous_cum_sum
1322
from (
1423
SELECT start_ts, end_ts, countMerge(n_rows) AS n_rows
@@ -28,7 +37,16 @@ SQL >
2837
group by start_ts, end_ts
2938
)
3039
group by start_ts, end_ts, n_rows
31-
ORDER BY end_ts asc
40+
ORDER BY end_ts
41+
{% if defined(order) and order != '' %}
42+
{% if order == 'asc' %}
43+
ASC
44+
{% else %}
45+
DESC
46+
{% end %}
47+
{% else %}
48+
DESC
49+
{% end %}
3250

3351

3452

@@ -65,9 +83,21 @@ SQL >
6583

6684
%
6785
WITH
68-
(SELECT start_ts FROM min_ts_range) AS start_range,
69-
(SELECT end_ts FROM max_ts_range) AS end_range,
70-
(SELECT ifNull(previous_cum_sum, 0) FROM min_ts_range) AS previous
86+
{% if defined(order) and order != '' %}
87+
{% if order == 'asc' %}
88+
(SELECT start_ts FROM min_ts_range) AS start_range,
89+
(SELECT end_ts FROM max_ts_range) AS end_range,
90+
(SELECT ifNull(previous_cum_sum, 0) FROM min_ts_range) AS previous
91+
{% else %}
92+
(SELECT start_ts FROM max_ts_range) AS start_range,
93+
(SELECT end_ts FROM min_ts_range) AS end_range,
94+
(SELECT ifNull(previous_cum_sum, 0) FROM min_ts_range) AS previous
95+
{% end %}
96+
{% else %}
97+
(SELECT start_ts FROM max_ts_range) AS start_range,
98+
(SELECT end_ts FROM min_ts_range) AS end_range,
99+
(SELECT ifNull(previous_cum_sum, 0) FROM min_ts_range) AS previous
100+
{% end %}
71101

72102
SELECT
73103
timestamp,
@@ -106,7 +136,16 @@ SQL >
106136
{% end %}
107137
AND timestamp >= start_range
108138
AND timestamp <= end_range
109-
ORDER BY timestamp ASC
139+
ORDER BY timestamp
140+
{% if defined(order) and order != '' %}
141+
{% if order == 'asc' %}
142+
ASC
143+
{% else %}
144+
DESC
145+
{% end %}
146+
{% else %}
147+
DESC
148+
{% end %}
110149
LIMIT {{Int32(page_size, 10)}}
111150
OFFSET {{Int32(page, 0)}} * {{Int32(page_size, 10)}} - assumeNotNull(previous)
112151

tinybird/tests/log_explorer.yaml

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
11

22
- name: default_log_explorer
33
description: Test with default parameters for last 1 day
4-
parameters: start_date=2025-02-03%2000:00:00&end_date=2025-02-04%2000:00:00&page=0&page_size=3
4+
parameters: start_date=2025-02-03%2000:00:00&end_date=2025-02-04%2000:00:00&page=0&page_size=3&order=asc
55
expected_result: |
66
{"timestamp":"2025-02-03 00:04:05.000","request_id":"req-4860bb49e129c265","request_method":"PUT","status_code":322,"service":"auth","request_path":"\/products\/122","level":"WARN","message":"Log message 122"}
77
{"timestamp":"2025-02-03 00:10:38.000","request_id":"req-1af70463d1e63266","request_method":"POST","status_code":329,"service":"cache","request_path":"\/orders\/729","level":"ERROR","message":"Log message 729"}
88
{"timestamp":"2025-02-03 00:33:47.000","request_id":"req-67983c8adffea7e0","request_method":"GET","status_code":540,"service":"api","request_path":"\/users\/140","level":"INFO","message":"Log message 140"}
99
1010
- name: default_log_explorer_page_2
1111
description: Test with default parameters for last 1 day
12-
parameters: start_date=2025-02-02%2000:00:00&end_date=2025-02-03%2000:00:00&page=1&page_size=3
12+
parameters: start_date=2025-02-02%2000:00:00&end_date=2025-02-03%2000:00:00&page=1&page_size=3&order=asc
1313
expected_result: |
1414
{"timestamp":"2025-02-02 21:12:48.000","request_id":"req-3b61992a411c79a2","request_method":"DELETE","status_code":599,"service":"cache","request_path":"\/auth\/799","level":"DEBUG","message":"Log message 799"}
1515
{"timestamp":"2025-02-02 21:17:29.000","request_id":"req-d32589fb749768e8","request_method":"PUT","status_code":318,"service":"database","request_path":"\/products\/318","level":"WARN","message":"Log message 318"}
1616
{"timestamp":"2025-02-02 21:23:42.000","request_id":"req-77b0b28d7e89da92","request_method":"POST","status_code":345,"service":"api","request_path":"\/orders\/745","level":"ERROR","message":"Log message 745"}
1717
1818
- name: filtered_by_service_and_level
1919
description: Test filtered by specific service and error level
20-
parameters: start_date=2025-02-03%2000:00:00&end_date=2025-02-04%2000:00:00&service=api&level=ERROR&page=0&page_size=5
20+
parameters: start_date=2025-02-03%2000:00:00&end_date=2025-02-04%2000:00:00&service=api&level=ERROR&page=0&page_size=5&order=asc
2121
expected_result: |
2222
{"timestamp":"2025-02-03 06:14:02.000","request_id":"req-5fcaa73d1df686e6","request_method":"POST","status_code":525,"service":"api","request_path":"\/orders\/925","level":"ERROR","message":"Log message 925"}
2323
{"timestamp":"2025-02-03 08:02:42.000","request_id":"req-e80695b4b6b1f89f","request_method":"POST","status_code":405,"service":"api","request_path":"\/orders\/205","level":"ERROR","message":"Log message 205"}
@@ -28,9 +28,11 @@
2828
- name: search_by_message
2929
description: Test searching for specific message content
3030
parameters: start_date=2025-02-03%2000:00:00&end_date=2025-02-04%2000:00:00&message=945&page=0&page_size=3
31-
expected_result: ''
31+
expected_result: |
32+
{"timestamp":"2025-02-03 19:23:42.000","request_id":"req-ab50f632c7544b42","request_method":"POST","status_code":345,"service":"api","request_path":"\/orders\/945","level":"ERROR","message":"Log message 945"}
3233
3334
- name: filtered_by_request_method
3435
description: Test filtered by HTTP method and status code
3536
parameters: start_date=2025-02-03%2000:00:00&end_date=2025-02-04%2000:00:00&request_method=POST&status_code=345&page=0&page_size=25
36-
expected_result: ''
37+
expected_result: |
38+
{"timestamp":"2025-02-03 19:23:42.000","request_id":"req-ab50f632c7544b42","request_method":"POST","status_code":345,"service":"api","request_path":"\/orders\/945","level":"ERROR","message":"Log message 945"}

0 commit comments

Comments
 (0)