Skip to content

Commit 967f102

Browse files
feat(QueryEditor): display query duration
1 parent 62af153 commit 967f102

File tree

6 files changed

+60
-24
lines changed

6 files changed

+60
-24
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
.ydb-query-duration {
2+
display: flex;
3+
align-items: center;
4+
5+
margin-left: 10px;
6+
7+
color: var(--yc-color-text-complementary);
8+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import block from 'bem-cn-lite';
2+
3+
import {formatDurationToShortTimeFormat, parseUsToMs} from '../../../../utils/timeParsers';
4+
5+
import './QueryDuration.scss';
6+
7+
interface QueryDurationProps {
8+
duration?: string;
9+
}
10+
11+
const b = block('ydb-query-duration');
12+
13+
export const QueryDuration = ({duration}: QueryDurationProps) => {
14+
if (!duration) {
15+
return null;
16+
}
17+
18+
const parsedDuration = formatDurationToShortTimeFormat(parseUsToMs(duration), 1);
19+
20+
return <span className={b()}>{parsedDuration}</span>;
21+
};

src/containers/Tenant/QueryEditor/QueryResult/QueryResult.js

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import {prepareQueryError} from '../../../../utils/query';
1818
import {PaneVisibilityToggleButtons} from '../../utils/paneVisibilityToggleHelpers';
1919

2020
import ResultIssues from '../Issues/Issues';
21+
import {QueryDuration} from '../QueryDuration/QueryDuration';
2122

2223
import './QueryResult.scss';
2324

@@ -116,15 +117,11 @@ function QueryResult(props) {
116117
</Fullscreen>
117118
)}
118119
</React.Fragment>
119-
)
120+
);
120121
}
121122

122123
if (error) {
123-
return (
124-
<div className={b('error')}>
125-
{prepareQueryError(error)}
126-
</div>
127-
);
124+
return <div className={b('error')}>{prepareQueryError(error)}</div>;
128125
}
129126
};
130127

@@ -136,6 +133,7 @@ function QueryResult(props) {
136133

137134
{props.stats && !props.error && (
138135
<React.Fragment>
136+
<QueryDuration duration={props.stats?.DurationUs} />
139137
<Divider />
140138
<RadioButton
141139
options={resultOptions}

src/utils/timeParsers/i18n/en.json

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
{
2-
"daysHours": "{{days}}d {{hours}}h",
3-
"hoursMin": "{{hours}}h {{minutes}}m",
4-
"minSec": "{{minutes}}m {{seconds}}s",
5-
"secMs": "{{seconds}}s {{ms}}ms",
6-
"days": "{{days}}d",
7-
"hours": "{{hours}}h",
8-
"min": "{{minutes}}m",
9-
"sec": "{{seconds}}s",
10-
"ms": "{{ms}}ms"
2+
"daysHours": "{{days}}\u00a0d\u00a0{{hours}}\u00a0h",
3+
"hoursMin": "{{hours}}\u00a0h\u00a0{{minutes}}\u00a0m",
4+
"minSec": "{{minutes}}\u00a0m\u00a0{{seconds}}\u00a0s",
5+
"secMs": "{{seconds}}\u00a0s\u00a0{{ms}}\u00a0ms",
6+
"days": "{{days}}\u00a0d",
7+
"hours": "{{hours}}\u00a0h",
8+
"min": "{{minutes}}\u00a0m",
9+
"sec": "{{seconds}}\u00a0s",
10+
"ms": "{{ms}}\u00a0ms"
1111
}

src/utils/timeParsers/i18n/ru.json

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
{
2-
"daysHours": "{{days}}д {{hours}}ч",
3-
"hoursMin": "{{hours}}ч {{minutes}}м",
4-
"minSec": "{{minutes}}м {{seconds}}с",
5-
"secMs": "{{seconds}}с {{ms}}мс",
6-
"days": "{{days}}д",
7-
"hours": "{{hours}}ч",
8-
"min": "{{minutes}}м",
9-
"sec": "{{seconds}}с",
10-
"ms": "{{ms}}мс"
2+
"daysHours": "{{days}}\u00a0д\u00a0{{hours}}\u00a0ч",
3+
"hoursMin": "{{hours}}\u00a0ч\u00a0{{minutes}}\u00a0м",
4+
"minSec": "{{minutes}}\u00a0м\u00a0{{seconds}}\u00a0с",
5+
"secMs": "{{seconds}}\u00a0с\u00a0{{ms}}\u00a0мс",
6+
"days": "{{days}}\u00a0д",
7+
"hours": "{{hours}}\u00a0ч",
8+
"min": "{{minutes}}\u00a0м",
9+
"sec": "{{seconds}}\u00a0с",
10+
"ms": "{{ms}}\u00a0мс"
1111
}

src/utils/timeParsers/parsers.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type {IProtobufTimeObject} from '../../types/api/common';
22

3+
import {isNumeric} from '../utils';
34
import {parseProtobufDurationToMs, parseProtobufTimestampToMs} from '.';
45

56
export const parseLag = (value: string | IProtobufTimeObject | undefined) =>
@@ -16,3 +17,11 @@ export const parseTimestampToIdleTime = (value: string | IProtobufTimeObject | u
1617
// Usually it below 100ms, so it could be omitted
1718
return duration < 0 ? 0 : duration;
1819
};
20+
21+
export const parseUsToMs = (value: string | number | undefined) => {
22+
if (!value || !isNumeric(value)) {
23+
return 0;
24+
}
25+
26+
return Math.round(Number(value) / 1000);
27+
};

0 commit comments

Comments
 (0)