Skip to content

Commit 4cb2d7f

Browse files
authored
fix: tracing issues (#1555)
1 parent 7e7b3e3 commit 4cb2d7f

File tree

6 files changed

+50
-25
lines changed

6 files changed

+50
-25
lines changed

src/containers/Tenant/Query/ExecuteResult/ExecuteResult.tsx

+3-1
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,9 @@ export function ExecuteResult({
270270
<CancelQueryButton queryId={queryId} tenantName={tenantName} />
271271
</React.Fragment>
272272
) : null}
273-
{data?.traceId ? <TraceButton traceId={data.traceId} /> : null}
273+
{data?.traceId ? (
274+
<TraceButton traceId={data.traceId} isTraceReady={result.isTraceReady} />
275+
) : null}
274276
</div>
275277
<div className={b('controls-left')}>
276278
{renderClipboardButton()}

src/containers/Tenant/Query/ExecuteResult/TraceButton.tsx

+12-17
Original file line numberDiff line numberDiff line change
@@ -5,45 +5,40 @@ import {Button} from '@gravity-ui/uikit';
55

66
import {useClusterBaseInfo} from '../../../../store/reducers/cluster/cluster';
77
import {traceApi} from '../../../../store/reducers/trace';
8-
import {SECOND_IN_MS} from '../../../../utils/constants';
9-
import {useDelayed} from '../../../../utils/hooks/useDelayed';
108
import {replaceParams} from '../utils/replaceParams';
119

1210
import i18n from './i18n';
1311

14-
const TIME_BEFORE_CHECK = 15 * SECOND_IN_MS;
15-
1612
interface TraceUrlButtonProps {
1713
traceId: string;
14+
isTraceReady?: true;
1815
}
1916

20-
export function TraceButton({traceId}: TraceUrlButtonProps) {
17+
export function TraceButton({traceId, isTraceReady}: TraceUrlButtonProps) {
2118
const {traceCheck, traceView} = useClusterBaseInfo();
2219

2320
const checkTraceUrl = traceCheck?.url ? replaceParams(traceCheck.url, {traceId}) : '';
2421
const traceUrl = traceView?.url ? replaceParams(traceView.url, {traceId}) : '';
2522

26-
// We won't get any trace data at first 15 seconds for sure
27-
const [readyToFetch, resetDelay] = useDelayed(TIME_BEFORE_CHECK);
23+
const [checkTrace, {isLoading, isUninitialized}] = traceApi.useCheckTraceMutation();
2824

2925
React.useEffect(() => {
30-
resetDelay();
31-
}, [traceId, resetDelay]);
26+
let checkTraceMutation: {abort: () => void} | null;
27+
if (checkTraceUrl && !isTraceReady) {
28+
checkTraceMutation = checkTrace({url: checkTraceUrl});
29+
}
3230

33-
const {isFetching} = traceApi.useCheckTraceQuery(
34-
{url: checkTraceUrl},
35-
{skip: !checkTraceUrl || !readyToFetch},
36-
);
31+
return () => checkTraceMutation?.abort();
32+
}, [checkTrace, checkTraceUrl, isTraceReady]);
3733

38-
if (!traceUrl) {
34+
if (!traceUrl || (isUninitialized && !isTraceReady)) {
3935
return null;
4036
}
4137

42-
const loading = !readyToFetch || isFetching;
4338
return (
4439
<Button
45-
view={loading ? 'flat-secondary' : 'flat-info'}
46-
loading={loading}
40+
view={isLoading ? 'flat-secondary' : 'flat-info'}
41+
loading={isLoading}
4742
href={traceUrl}
4843
target="_blank"
4944
>

src/services/api.ts

+5-4
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,9 @@ import {parseMetaCluster} from './parsers/parseMetaCluster';
6666
import {parseMetaTenants} from './parsers/parseMetaTenants';
6767
import {settingsManager} from './settings';
6868

69-
const TRACE_CHECK_TIMEOUT = 2 * SECOND_IN_MS;
70-
const TRACE_API_ERROR_TIMEOUT = 10 * SECOND_IN_MS;
69+
const TRACE_RETRY_DELAY = 4 * SECOND_IN_MS;
70+
const TRACE_CHECK_TIMEOUT = 10 * SECOND_IN_MS;
71+
const TRACE_API_ERROR_RETRY_DELAY = 10 * SECOND_IN_MS;
7172
const MAX_TRACE_CHECK_RETRIES = 30;
7273

7374
export type AxiosOptions = {
@@ -604,10 +605,10 @@ export class YdbEmbeddedAPI extends AxiosWrapper {
604605
(error?.response?.status === 404 || error.code === 'ERR_NETWORK');
605606

606607
if (isTracingError) {
607-
return TRACE_CHECK_TIMEOUT;
608+
return TRACE_RETRY_DELAY;
608609
}
609610

610-
return TRACE_API_ERROR_TIMEOUT;
611+
return TRACE_API_ERROR_RETRY_DELAY;
611612
},
612613
shouldResetTimeout: true,
613614
retryCondition: () => true,

src/store/reducers/executeQuery.ts

+21
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ const MAXIMUM_QUERIES_IN_HISTORY = 20;
2222

2323
const CHANGE_USER_INPUT = 'query/CHANGE_USER_INPUT';
2424
const SET_QUERY_RESULT = 'query/SET_QUERY_RESULT';
25+
const SET_QUERY_TRACE_READY = 'query/SET_QUERY_TRACE_READY';
2526
const SAVE_QUERY_TO_HISTORY = 'query/SAVE_QUERY_TO_HISTORY';
2627
const UPDATE_QUERY_IN_HISTORY = 'query/UPDATE_QUERY_IN_HISTORY';
2728
const SET_QUERY_HISTORY_FILTER = 'query/SET_QUERY_HISTORY_FILTER';
@@ -63,6 +64,20 @@ const executeQuery: Reducer<ExecuteQueryState, ExecuteQueryAction> = (
6364
};
6465
}
6566

67+
case SET_QUERY_TRACE_READY: {
68+
if (state.result) {
69+
return {
70+
...state,
71+
result: {
72+
...state.result,
73+
isTraceReady: true,
74+
},
75+
};
76+
}
77+
78+
return state;
79+
}
80+
6681
case SET_QUERY_RESULT: {
6782
return {
6883
...state,
@@ -313,6 +328,12 @@ export function setQueryResult(data?: QueryResult) {
313328
} as const;
314329
}
315330

331+
export function setQueryTraceReady() {
332+
return {
333+
type: SET_QUERY_TRACE_READY,
334+
} as const;
335+
}
336+
316337
export const goToPreviousQuery = () => {
317338
return {
318339
type: GO_TO_PREVIOUS_QUERY,

src/store/reducers/trace.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
import {api} from './api';
2+
import {setQueryTraceReady} from './executeQuery';
23

34
interface CheckTraceParams {
45
url: string;
56
}
67

78
export const traceApi = api.injectEndpoints({
89
endpoints: (build) => ({
9-
checkTrace: build.query({
10-
queryFn: async ({url}: CheckTraceParams, {signal}) => {
10+
checkTrace: build.mutation({
11+
queryFn: async ({url}: CheckTraceParams, {signal, dispatch}) => {
1112
try {
1213
const response = await window.api.checkTrace({url}, {signal});
14+
15+
dispatch(setQueryTraceReady());
1316
return {data: response};
1417
} catch (error) {
1518
return {error: error};

src/types/store/executeQuery.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import type {
55
saveQueryToHistory,
66
setQueryHistoryFilter,
77
setQueryResult,
8+
setQueryTraceReady,
89
setTenantPath,
910
updateQueryInHistory,
1011
} from '../../store/reducers/executeQuery';
@@ -34,6 +35,7 @@ export type ExecuteQueryResult = {
3435
type: ResultType.EXECUTE;
3536
data?: IQueryResult;
3637
error?: unknown;
38+
isTraceReady?: true;
3739
} & CommonResultParams;
3840

3941
export type ExplainQueryResult = {
@@ -64,7 +66,8 @@ export type ExecuteQueryAction =
6466
| ReturnType<typeof saveQueryToHistory>
6567
| ReturnType<typeof updateQueryInHistory>
6668
| ReturnType<typeof setTenantPath>
67-
| ReturnType<typeof setQueryHistoryFilter>;
69+
| ReturnType<typeof setQueryHistoryFilter>
70+
| ReturnType<typeof setQueryTraceReady>;
6871

6972
export interface ExecuteQueryStateSlice {
7073
executeQuery: ExecuteQueryState;

0 commit comments

Comments
 (0)