Skip to content

Commit 0199c4b

Browse files
authored
StatsHouse UI: add metric shared config (#2025)
1 parent 4e7fc9d commit 0199c4b

File tree

6 files changed

+103
-18
lines changed

6 files changed

+103
-18
lines changed

statshouse-ui/src/admin/api/saveMetric.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ export function mapMetricToEdit({ data: { metric } }: ApiMetric): IMetric {
6767
skip_max_host: !!metric.skip_max_host,
6868
skip_min_host: !!metric.skip_min_host,
6969
skip_sum_square: !!metric.skip_sum_square,
70+
shard_strategy: metric.shard_strategy ?? '',
71+
shard_num: metric.shard_num ?? 0,
7072
};
7173
}
7274

@@ -109,5 +111,7 @@ export function mapEditToMetric(metric: IMetric): MetricMetaValue {
109111
version: metric.version,
110112
group_id: metric.group_id,
111113
fair_key_tag_ids: metric.fair_key_tag_ids,
114+
shard_strategy: metric.shard_strategy,
115+
shard_num: metric.shard_num,
112116
};
113117
}

statshouse-ui/src/admin/models/metric.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
// License, v. 2.0. If a copy of the MPL was not distributed with this
55
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
66

7-
import { MetricMetaTagRawKind } from '@/api/enum';
7+
import { MetricMetaSharedStrategy, MetricMetaTagRawKind } from '@/api/enum';
88

99
export interface ITag {
1010
readonly name: string;
@@ -56,4 +56,6 @@ export interface IMetric {
5656
readonly version?: number;
5757
readonly group_id?: number;
5858
readonly fair_key_tag_ids?: string[];
59+
readonly shard_strategy?: MetricMetaSharedStrategy;
60+
readonly shard_num?: number;
5961
}

statshouse-ui/src/admin/pages/CreatePage.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ export function EditFormCreate() {
4141
return (
4242
<form>
4343
<div className="col-sm-5 mb-3 form-text">
44-
Metric will be created with all {maxTagsSize} keys visible. To hide excess keys, please use <b>Edit</b> button
45-
above plot.
44+
Metric will be created with {tagsSize} of {maxTagsSize} keys visible. To hide excess keys, please use{' '}
45+
<b>Edit</b> button above plot.
4646
</div>
4747
<div className="row mb-3">
4848
<label htmlFor="name" className="col-sm-2 col-form-label">
@@ -77,6 +77,7 @@ export function EditFormCreate() {
7777
value={tagsSize}
7878
onChange={(e) => setSetTagsSize(parseInt(e.target.value))}
7979
/>
80+
<div className="form-text">Set visible tags, you can change this later</div>
8081
</div>
8182
</div>
8283

statshouse-ui/src/admin/pages/FormPage.tsx

Lines changed: 71 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,15 @@ import { MetricFormValuesContext, MetricFormValuesStorage } from '../storages/Me
1111
import { ReactComponent as SVGTrash } from 'bootstrap-icons/icons/trash.svg';
1212
import { IActions } from '../storages/MetricFormValues/reducer';
1313
import {
14+
METRIC_META_SHARED_STRATEGY,
15+
METRIC_META_SHARED_STRATEGY_DESCRIPTION,
1416
METRIC_META_TAG_RAW_KIND,
1517
METRIC_TYPE,
1618
METRIC_TYPE_DESCRIPTION,
19+
MetricMetaSharedStrategy,
1720
type MetricMetaTagRawKind,
1821
type MetricType,
22+
toMetricMetaSharedStrategy,
1923
toMetricMetaTagRawKind,
2024
} from '@/api/enum';
2125
import { maxTagsSize } from '@/common/settings';
@@ -37,6 +41,21 @@ import { useHistoricalMetricVersion } from '@/hooks/useHistoricalMetricVersion';
3741

3842
const METRIC_TYPE_KEYS: MetricType[] = Object.values(METRIC_TYPE);
3943
const METRIC_META_TAG_RAW_KIND_KEYS: MetricMetaTagRawKind[] = Object.values(METRIC_META_TAG_RAW_KIND);
44+
const METRIC_META_SHARED_STRATEGY_KEYS: MetricMetaSharedStrategy[] = Object.values(METRIC_META_SHARED_STRATEGY);
45+
46+
const kindConfig = [
47+
{ label: 'Counter', value: 'counter' },
48+
{ label: 'Value', value: 'value' },
49+
{ label: 'Unique', value: 'unique' },
50+
{ label: 'Mixed', value: 'mixed' },
51+
];
52+
53+
const shardStrategyConfig = METRIC_META_SHARED_STRATEGY_KEYS.map((value) => ({
54+
label: METRIC_META_SHARED_STRATEGY_DESCRIPTION[value],
55+
value: value,
56+
}));
57+
58+
const tagsConfig = new Array(maxTagsSize).fill(0).map((_v, n) => n + 1);
4059

4160
export function FormPage(props: { yAxisSize: number; adminMode: boolean }) {
4261
const { adminMode } = props;
@@ -84,13 +103,6 @@ export function FormPage(props: { yAxisSize: number; adminMode: boolean }) {
84103
);
85104
}
86105

87-
const kindConfig = [
88-
{ label: 'Counter', value: 'counter' },
89-
{ label: 'Value', value: 'value' },
90-
{ label: 'Unique', value: 'unique' },
91-
{ label: 'Mixed', value: 'mixed' },
92-
];
93-
94106
export function EditForm(props: { isReadonly: boolean; adminMode: boolean; isHistoricalMetric: boolean }) {
95107
const { isReadonly, adminMode, isHistoricalMetric } = props;
96108
const { values, dispatch } = useContext(MetricFormValuesContext);
@@ -294,18 +306,20 @@ export function EditForm(props: { isReadonly: boolean; adminMode: boolean; isHis
294306
<div className="col-sm">
295307
<div className="row">
296308
<div className="col-sm-auto">
297-
<input
309+
<select
298310
id="tagsNum"
299311
name="tagsNum"
300-
className="form-control"
301-
type="number"
302-
min="1"
303-
max={maxTagsSize}
304-
step="1"
312+
className="form-select"
305313
value={values.tagsSize}
306314
onChange={(e) => dispatch({ type: 'numTags', num: e.target.value })}
307315
disabled={isReadonly}
308-
/>
316+
>
317+
{tagsConfig.map((n) => (
318+
<option key={n} value={n}>
319+
{n}
320+
</option>
321+
))}
322+
</select>
309323
</div>
310324
</div>
311325
<div id="tagsHelpBlock" className="form-text">
@@ -602,6 +616,49 @@ export function EditForm(props: { isReadonly: boolean; adminMode: boolean; isHis
602616
</div>
603617
<div id="fair_key_tag_idsHelpBlock" className="form-text"></div>
604618
</div>
619+
<div className="row mb-3">
620+
<label htmlFor="shard_strategy" className="col-sm-2 col-form-label">
621+
Shared strategy
622+
</label>
623+
<div className="col-sm-auto">
624+
<select
625+
id="shard_strategy"
626+
className="form-select"
627+
value={values.shard_strategy}
628+
onChange={(e) =>
629+
dispatch({
630+
shard_strategy: toMetricMetaSharedStrategy(e.target.value, METRIC_META_SHARED_STRATEGY.noStrategy),
631+
})
632+
}
633+
disabled={isReadonly || !adminMode}
634+
>
635+
{shardStrategyConfig.map((item) => (
636+
<option key={item.value} value={item.value}>
637+
{item.label}
638+
</option>
639+
))}
640+
</select>
641+
</div>
642+
<div id="shardStrategyHelpBlock" className="form-text"></div>
643+
</div>
644+
<div className="row mb-3">
645+
<label htmlFor="shard_num" className="col-sm-2 col-form-label">
646+
Shared num
647+
</label>
648+
<div className="col-sm-auto">
649+
<input
650+
id="shard_num"
651+
type="number"
652+
min={1}
653+
step={1}
654+
className="form-control"
655+
value={toNumber(values.shard_num, 0) + 1}
656+
onChange={(e) => dispatch({ shard_num: toNumber(e.target.value, 0) - 1 })}
657+
disabled={isReadonly || !adminMode || values.shard_strategy !== 'fixed_shard'}
658+
/>
659+
</div>
660+
<div id="shardNumHelpBlock" className="form-text"></div>
661+
</div>
605662

606663
<div>
607664
{/*<button type="button" disabled={isRunning || isReadonly} className="btn btn-primary me-3" onClick={onSubmit}>*/}

statshouse-ui/src/api/enum.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,25 @@ export type MetricMetaTagRawKind = Enum<typeof METRIC_META_TAG_RAW_KIND>;
243243
export const isMetricMetaTagRawKind = isEnum<MetricMetaTagRawKind>(METRIC_META_TAG_RAW_KIND);
244244
export const toMetricMetaTagRawKind = toEnum(isMetricMetaTagRawKind);
245245

246+
export const METRIC_META_SHARED_STRATEGY = {
247+
noStrategy: '',
248+
tagsHash: 'tags_hash',
249+
fixedShard: 'fixed_shard',
250+
metricId: 'metric_id',
251+
builtin: 'builtin',
252+
};
253+
export type MetricMetaSharedStrategy = Enum<typeof METRIC_META_SHARED_STRATEGY>;
254+
export const isMetricMetaSharedStrategy = isEnum<MetricMetaSharedStrategy>(METRIC_META_SHARED_STRATEGY);
255+
export const toMetricMetaSharedStrategy = toEnum(isMetricMetaSharedStrategy);
256+
257+
export const METRIC_META_SHARED_STRATEGY_DESCRIPTION: Record<MetricMetaSharedStrategy, string> = {
258+
[METRIC_META_SHARED_STRATEGY.noStrategy]: 'no strategy',
259+
[METRIC_META_SHARED_STRATEGY.tagsHash]: 'tags_hash',
260+
[METRIC_META_SHARED_STRATEGY.fixedShard]: 'fixed_shard',
261+
[METRIC_META_SHARED_STRATEGY.metricId]: 'metric_id',
262+
[METRIC_META_SHARED_STRATEGY.builtin]: 'builtin',
263+
};
264+
246265
export const API_FETCH_OPT_METHODS = {
247266
get: 'GET',
248267
post: 'POST',

statshouse-ui/src/api/metric.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
// License, v. 2.0. If a copy of the MPL was not distributed with this
55
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
66

7-
import { GET_PARAMS, type MetricMetaKind, type MetricMetaTagRawKind } from './enum';
7+
import { GET_PARAMS, type MetricMetaKind, MetricMetaSharedStrategy, type MetricMetaTagRawKind } from './enum';
88
import { apiFetch, type ApiFetchResponse, ExtendedError } from './api';
99
import {
1010
type UndefinedInitialDataOptions,
@@ -82,6 +82,8 @@ export type MetricMetaValue = {
8282
metric_type?: string;
8383
group_id?: number;
8484
fair_key_tag_ids?: string[];
85+
shard_strategy?: MetricMetaSharedStrategy;
86+
shard_num?: number;
8587
[key: string]: unknown;
8688
};
8789

0 commit comments

Comments
 (0)