Compare commits

...

1 Commits

Author SHA1 Message Date
ahmadshaheer
9a580d4f28 fix: show loading spinner in SpanLogs until trace-only logs query completes 2025-12-23 11:23:20 +04:30
4 changed files with 35 additions and 3 deletions

View File

@@ -46,6 +46,7 @@ interface SpanLogsProps {
isLogSpanRelated: (logId: string) => boolean;
handleExplorerPageRedirect: () => void;
emptyStateConfig?: EmptyLogsListConfig;
isTraceOnlyLoading: boolean;
}
function SpanLogs({
@@ -59,6 +60,7 @@ function SpanLogs({
isLogSpanRelated,
handleExplorerPageRedirect,
emptyStateConfig,
isTraceOnlyLoading,
}: SpanLogsProps): JSX.Element {
const { updateAllQueriesOperators } = useQueryBuilder();
@@ -254,7 +256,7 @@ function SpanLogs({
);
const renderSpanLogsContent = (): JSX.Element | null => {
if (isLoading || isFetching) {
if (isLoading || isFetching || isTraceOnlyLoading) {
return <LogsLoading />;
}
@@ -263,7 +265,8 @@ function SpanLogs({
}
if (logs.length === 0) {
if (emptyStateConfig) {
// Only show enhanced empty state if not loading trace-only logs
if (emptyStateConfig && !isTraceOnlyLoading) {
return (
<EmptyLogsSearch
dataSource={DataSource.LOGS}

View File

@@ -117,6 +117,7 @@ const defaultProps = {
startTime: 1640995200000,
endTime: 1640995260000,
},
isTraceOnlyLoading: false,
logs: [],
isLoading: false,
isError: false,
@@ -141,6 +142,7 @@ describe('SpanLogs', () => {
// Should show simple empty state (no emptyStateConfig provided)
expect(
// eslint-disable-next-line sonarjs/no-duplicate-string
screen.getByText('No logs found for selected span.'),
).toBeInTheDocument();
expect(
@@ -211,4 +213,27 @@ describe('SpanLogs', () => {
expect(mockHandleExplorerPageRedirect).toHaveBeenCalledTimes(1);
});
it('should show loading state when isTraceOnlyLoading is true', () => {
// Render with isTraceOnlyLoading true and emptyStateConfig present
render(
<SpanLogs
// eslint-disable-next-line react/jsx-props-no-spreading
{...defaultProps}
isTraceOnlyLoading
emptyStateConfig={getEmptyLogsListConfig(jest.fn())}
/>,
);
// Should show loading spinner
expect(screen.getByTestId('logs-loading')).toBeInTheDocument();
// Should NOT show enhanced empty state
expect(screen.queryByTestId('empty-logs-search')).not.toBeInTheDocument();
// Should NOT show simple empty state
expect(
screen.queryByText('No logs found for selected span.'),
).not.toBeInTheDocument();
});
});

View File

@@ -31,6 +31,7 @@ interface UseSpanContextLogsReturn {
spanLogIds: Set<string>;
isLogSpanRelated: (logId: string) => boolean;
hasTraceIdLogs: boolean;
isTraceOnlyLoading: boolean;
}
const traceIdKey = {
@@ -284,7 +285,7 @@ export const useSpanContextLogs = ({
);
}, [timeRange.startTime, timeRange.endTime, traceOnlyFilter]);
const { data: traceOnlyData } = useQuery({
const { data: traceOnlyData, isLoading: isTraceOnlyLoading } = useQuery({
queryKey: [
REACT_QUERY_KEY.TRACE_ONLY_LOGS,
traceId,
@@ -318,5 +319,6 @@ export const useSpanContextLogs = ({
spanLogIds,
isLogSpanRelated,
hasTraceIdLogs,
isTraceOnlyLoading,
};
};

View File

@@ -72,6 +72,7 @@ function SpanRelatedSignals({
isFetching,
isLogSpanRelated,
hasTraceIdLogs,
isTraceOnlyLoading,
} = useSpanContextLogs({
traceId: selectedSpan.traceId,
spanId: selectedSpan.spanId,
@@ -233,6 +234,7 @@ function SpanRelatedSignals({
isLogSpanRelated={isLogSpanRelated}
handleExplorerPageRedirect={handleExplorerPageRedirect}
emptyStateConfig={!hasTraceIdLogs ? emptyStateConfig : undefined}
isTraceOnlyLoading={isTraceOnlyLoading}
/>
)}