Skip to content

Commit 6896694

Browse files
authored
[BUGFIX] Logstable: all quries results must be included (perses#533)
Signed-off-by: Mahmoud Shahrokni <seyedmahmoud.shahrokni@amadeus.com>
1 parent 651f73d commit 6896694

4 files changed

Lines changed: 77 additions & 7 deletions

File tree

logstable/src/LogsTableComponent.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,12 @@ import { LogsList } from './components/LogsList';
1919
export function LogsTableComponent(props: LogsTableProps): ReactElement | null {
2020
const { queryResults, spec } = props;
2121

22-
if (queryResults[0]?.data.logs === undefined) {
22+
// all queries results must be included
23+
const logs = queryResults
24+
.flatMap((result) => result?.data.logs?.entries ?? [])
25+
.sort((a, b) => b.timestamp - a.timestamp);
26+
27+
if (!logs.length) {
2328
return (
2429
<Box
2530
sx={{
@@ -33,7 +38,6 @@ export function LogsTableComponent(props: LogsTableProps): ReactElement | null {
3338
</Box>
3439
);
3540
}
36-
const logs = queryResults[0]?.data.logs.entries;
3741

3842
return <LogsList logs={logs} spec={spec} />;
3943
}

logstable/src/LogsTablePanel.test.tsx

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
import { ChartsProvider, SnackbarProvider, testChartsTheme } from '@perses-dev/components';
1515
import { render, screen, fireEvent } from '@testing-library/react';
16-
import { MOCK_LOGS_QUERY_RESULT, MOCK_LOGS_QUERY_DEFINITION } from './test/mock-query-results';
16+
import { MOCK_LOGS_QUERY_RESULT, MOCK_LOGS_QUERY_DEFINITION, MOCK_LOGS_QUERY_RESULTS } from './test/mock-query-results';
1717
import { LogsTablePanel } from './LogsTablePanel';
1818
import { LogsQueryData, LogsTableProps } from './model';
1919

@@ -36,13 +36,17 @@ const TEST_LOGS_TABLE_PROPS: Omit<LogsTableProps, 'queryResults'> = {
3636

3737
describe('LogsTablePanel', () => {
3838
// Helper to render the panel with some context set
39-
const renderPanel = (data: LogsQueryData): void => {
39+
const renderPanel = (data: LogsQueryData | LogsQueryData[]): void => {
4040
render(
4141
<SnackbarProvider>
4242
<ChartsProvider chartsTheme={testChartsTheme}>
4343
<LogsTablePanel
4444
{...TEST_LOGS_TABLE_PROPS}
45-
queryResults={[{ definition: MOCK_LOGS_QUERY_DEFINITION, data }]}
45+
queryResults={
46+
!Array.isArray(data)
47+
? [{ definition: MOCK_LOGS_QUERY_DEFINITION, data }]
48+
: data.map((d) => ({ definition: MOCK_LOGS_QUERY_DEFINITION, data: d }))
49+
}
4650
/>
4751
</ChartsProvider>
4852
</SnackbarProvider>
@@ -62,6 +66,12 @@ describe('LogsTablePanel', () => {
6266
expect(await screen.findAllByText('2022-10-24T15:31:31.000Z')).toHaveLength(1); // second timestamp appear once per line
6367
});
6468

69+
it('should include results from multiple queries', async () => {
70+
renderPanel(MOCK_LOGS_QUERY_RESULTS);
71+
const items = screen.getAllByTestId(/^log-row-container-/);
72+
expect(items.length).toBe(2);
73+
});
74+
6575
it('should select multiple rows with Cmd+Click', () => {
6676
renderPanel(MOCK_LOGS_QUERY_RESULT);
6777
const items = screen.getByTestId('virtuoso-item-list');

logstable/src/components/LogRow/LogRow.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ const DefaultLogRow: React.FC<LogRowProps> = ({
154154
}
155155
}}
156156
data-log-index={index}
157+
data-testid={`log-row-container-${index}`}
157158
>
158159
<LogRowContent
159160
onMouseDown={handleRowMouseDown}

logstable/src/test/mock-query-results.ts

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export const MOCK_LOGS_QUERY_RESULT: LogsQueryData = {
2222
},
2323
entries: [
2424
{
25-
timestamp: 1666625490,
25+
timestamp: 1666625491,
2626
line: 'foo',
2727
labels: {
2828
device: '/dev/vda1',
@@ -34,7 +34,7 @@ export const MOCK_LOGS_QUERY_RESULT: LogsQueryData = {
3434
},
3535
},
3636
{
37-
timestamp: 1666625491,
37+
timestamp: 1666625490,
3838
line: 'bar',
3939
labels: {
4040
device: '/dev/vda15',
@@ -49,6 +49,61 @@ export const MOCK_LOGS_QUERY_RESULT: LogsQueryData = {
4949
},
5050
};
5151

52+
export const MOCK_LOGS_QUERY_RESULTS: LogsQueryData[] = [
53+
{
54+
logs: {
55+
entries: [
56+
{
57+
timestamp: 1769009811.4465687,
58+
line: '{"host":"120.180.160.121", "user-identifier":"-", "datetime":"21/Jan/2026:15:32:31 +0000", "method": "DELETE", "request": "/killer/pixy", "protocol":"HTTP/2.0", "status":200, "bytes":9821, "referer": "http://www.internationalend-to-end.com/e-business/web services"}',
59+
labels: {
60+
app: 'log-generator',
61+
bytes: '9821',
62+
datetime: '21/Jan/2026:15:32:31 +0000',
63+
detected_level: 'unknown',
64+
filename: '/var/log/fake/fake.log',
65+
host: '120.180.160.121',
66+
method: 'DELETE',
67+
protocol: 'HTTP/2.0',
68+
referer: 'http://www.internationalend-to-end.com/e-business/web services',
69+
request: '/killer/pixy',
70+
service_name: 'log-generator',
71+
status: '200',
72+
user_identifier: '-',
73+
},
74+
},
75+
],
76+
totalCount: 1,
77+
},
78+
},
79+
{
80+
logs: {
81+
entries: [
82+
{
83+
timestamp: 1769009890.5294495,
84+
line: '{"host":"18.178.231.77", "user-identifier":"cormier2584", "datetime":"21/Jan/2026:15:33:49 +0000", "method": "POST", "request": "/facilitate/mesh/methodologies/deploy", "protocol":"HTTP/1.1", "status":503, "bytes":9892, "referer": "http://www.direct.com/holistic"}',
85+
labels: {
86+
app: 'log-generator',
87+
bytes: '9892',
88+
datetime: '21/Jan/2026:15:33:49 +0000',
89+
detected_level: 'unknown',
90+
filename: '/var/log/fake/fake.log',
91+
host: '18.178.231.77',
92+
method: 'POST',
93+
protocol: 'HTTP/1.1',
94+
referer: 'http://www.direct.com/holistic',
95+
request: '/facilitate/mesh/methodologies/deploy',
96+
service_name: 'log-generator',
97+
status: '503',
98+
user_identifier: 'cormier2584',
99+
},
100+
},
101+
],
102+
totalCount: 1,
103+
},
104+
},
105+
];
106+
52107
export const MOCK_LOGS_QUERY_DEFINITION = {
53108
kind: 'LogsQuery',
54109
spec: {

0 commit comments

Comments
 (0)