2023-02-12 04:23:00 +01:00
|
|
|
import { Button, Tabs } from 'antd';
|
2023-05-10 19:40:27 +03:00
|
|
|
import { ALERTS_DATA_SOURCE_MAP } from 'constants/alerts';
|
2023-05-02 17:08:03 +03:00
|
|
|
import { PANEL_TYPES } from 'constants/queryBuilder';
|
2023-05-10 19:40:27 +03:00
|
|
|
import { QueryBuilder } from 'container/QueryBuilder';
|
|
|
|
|
import React from 'react';
|
2022-07-14 13:23:15 +05:30
|
|
|
import { useTranslation } from 'react-i18next';
|
2022-11-24 13:21:46 +05:30
|
|
|
import { AlertTypes } from 'types/api/alerts/alertTypes';
|
2023-05-10 19:40:27 +03:00
|
|
|
import { IChQueries, IPromQueries } from 'types/api/alerts/compositeQuery';
|
|
|
|
|
import { EQueryType } from 'types/common/dashboard';
|
2022-07-14 13:23:15 +05:30
|
|
|
|
2022-11-24 13:21:46 +05:30
|
|
|
import ChQuerySection from './ChQuerySection';
|
2022-07-14 13:23:15 +05:30
|
|
|
import PromqlSection from './PromqlSection';
|
2023-05-10 19:40:27 +03:00
|
|
|
import { FormContainer, StepHeading } from './styles';
|
2022-07-14 13:23:15 +05:30
|
|
|
|
|
|
|
|
function QuerySection({
|
|
|
|
|
queryCategory,
|
|
|
|
|
setQueryCategory,
|
|
|
|
|
promQueries,
|
|
|
|
|
setPromQueries,
|
2022-11-24 13:21:46 +05:30
|
|
|
chQueries,
|
|
|
|
|
setChQueries,
|
|
|
|
|
alertType,
|
|
|
|
|
runQuery,
|
2022-07-14 13:23:15 +05:30
|
|
|
}: QuerySectionProps): JSX.Element {
|
|
|
|
|
// init namespace for translations
|
2022-07-15 21:33:30 +05:30
|
|
|
const { t } = useTranslation('alerts');
|
2022-07-14 13:23:15 +05:30
|
|
|
|
2023-05-10 19:40:27 +03:00
|
|
|
const handleQueryCategoryChange = (queryType: string): void => {
|
2022-07-14 13:23:15 +05:30
|
|
|
if (
|
2023-05-10 19:40:27 +03:00
|
|
|
queryType === EQueryType.PROM &&
|
2022-07-14 13:23:15 +05:30
|
|
|
(!promQueries || Object.keys(promQueries).length === 0)
|
|
|
|
|
) {
|
|
|
|
|
setPromQueries({
|
|
|
|
|
A: {
|
|
|
|
|
query: '',
|
|
|
|
|
stats: '',
|
|
|
|
|
name: 'A',
|
|
|
|
|
legend: '',
|
|
|
|
|
disabled: false,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2022-11-24 13:21:46 +05:30
|
|
|
if (
|
2023-05-10 19:40:27 +03:00
|
|
|
queryType === EQueryType.CLICKHOUSE &&
|
2022-11-24 13:21:46 +05:30
|
|
|
(!chQueries || Object.keys(chQueries).length === 0)
|
|
|
|
|
) {
|
|
|
|
|
setChQueries({
|
|
|
|
|
A: {
|
|
|
|
|
rawQuery: '',
|
|
|
|
|
name: 'A',
|
|
|
|
|
query: '',
|
|
|
|
|
legend: '',
|
|
|
|
|
disabled: false,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
}
|
2023-05-10 19:40:27 +03:00
|
|
|
setQueryCategory(queryType as EQueryType);
|
2022-07-14 13:23:15 +05:30
|
|
|
};
|
|
|
|
|
|
2023-01-24 18:53:04 +05:30
|
|
|
const renderPromqlUI = (): JSX.Element => (
|
|
|
|
|
<PromqlSection promQueries={promQueries} setPromQueries={setPromQueries} />
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const renderChQueryUI = (): JSX.Element => (
|
|
|
|
|
<ChQuerySection chQueries={chQueries} setChQueries={setChQueries} />
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const renderMetricUI = (): JSX.Element => (
|
2023-05-10 19:40:27 +03:00
|
|
|
<QueryBuilder
|
|
|
|
|
panelType={PANEL_TYPES.TIME_SERIES}
|
|
|
|
|
config={{
|
|
|
|
|
queryVariant: 'static',
|
|
|
|
|
initialDataSource: ALERTS_DATA_SOURCE_MAP[alertType],
|
|
|
|
|
}}
|
|
|
|
|
/>
|
2023-01-24 18:53:04 +05:30
|
|
|
);
|
2022-11-24 13:21:46 +05:30
|
|
|
|
|
|
|
|
const handleRunQuery = (): void => {
|
|
|
|
|
runQuery();
|
|
|
|
|
};
|
|
|
|
|
|
2023-03-22 12:01:37 +05:30
|
|
|
const tabs = [
|
|
|
|
|
{
|
|
|
|
|
label: t('tab_qb'),
|
2023-05-10 19:40:27 +03:00
|
|
|
key: EQueryType.QUERY_BUILDER,
|
2023-03-22 12:01:37 +05:30
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
label: t('tab_chquery'),
|
2023-05-10 19:40:27 +03:00
|
|
|
key: EQueryType.CLICKHOUSE,
|
2023-03-22 12:01:37 +05:30
|
|
|
},
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
const items = [
|
2023-05-10 19:40:27 +03:00
|
|
|
{ label: t('tab_qb'), key: EQueryType.QUERY_BUILDER },
|
|
|
|
|
{ label: t('tab_chquery'), key: EQueryType.CLICKHOUSE },
|
|
|
|
|
{ label: t('tab_promql'), key: EQueryType.PROM },
|
2023-03-22 12:01:37 +05:30
|
|
|
];
|
|
|
|
|
|
2022-11-24 13:21:46 +05:30
|
|
|
const renderTabs = (typ: AlertTypes): JSX.Element | null => {
|
|
|
|
|
switch (typ) {
|
|
|
|
|
case AlertTypes.TRACES_BASED_ALERT:
|
|
|
|
|
case AlertTypes.LOGS_BASED_ALERT:
|
2022-11-24 18:00:02 +05:30
|
|
|
case AlertTypes.EXCEPTIONS_BASED_ALERT:
|
2022-11-24 13:21:46 +05:30
|
|
|
return (
|
|
|
|
|
<Tabs
|
|
|
|
|
type="card"
|
|
|
|
|
style={{ width: '100%' }}
|
2023-05-10 19:40:27 +03:00
|
|
|
defaultActiveKey={EQueryType.QUERY_BUILDER}
|
|
|
|
|
activeKey={queryCategory}
|
2022-11-24 13:21:46 +05:30
|
|
|
onChange={handleQueryCategoryChange}
|
|
|
|
|
tabBarExtraContent={
|
|
|
|
|
<span style={{ display: 'flex', gap: '1rem', alignItems: 'center' }}>
|
2023-05-10 19:40:27 +03:00
|
|
|
<Button type="primary" onClick={handleRunQuery}>
|
|
|
|
|
Run Query
|
|
|
|
|
</Button>
|
2022-11-24 13:21:46 +05:30
|
|
|
</span>
|
|
|
|
|
}
|
2023-03-22 12:01:37 +05:30
|
|
|
items={tabs}
|
|
|
|
|
/>
|
2022-11-24 13:21:46 +05:30
|
|
|
);
|
|
|
|
|
case AlertTypes.METRICS_BASED_ALERT:
|
|
|
|
|
default:
|
|
|
|
|
return (
|
2022-07-14 13:23:15 +05:30
|
|
|
<Tabs
|
|
|
|
|
type="card"
|
|
|
|
|
style={{ width: '100%' }}
|
2023-05-10 19:40:27 +03:00
|
|
|
defaultActiveKey={EQueryType.QUERY_BUILDER}
|
|
|
|
|
activeKey={queryCategory}
|
2022-07-14 13:23:15 +05:30
|
|
|
onChange={handleQueryCategoryChange}
|
2022-11-24 13:21:46 +05:30
|
|
|
tabBarExtraContent={
|
|
|
|
|
<span style={{ display: 'flex', gap: '1rem', alignItems: 'center' }}>
|
2023-05-10 19:40:27 +03:00
|
|
|
<Button type="primary" onClick={handleRunQuery}>
|
|
|
|
|
Run Query
|
|
|
|
|
</Button>
|
2022-11-24 13:21:46 +05:30
|
|
|
</span>
|
|
|
|
|
}
|
2023-03-22 12:01:37 +05:30
|
|
|
items={items}
|
|
|
|
|
/>
|
2022-11-24 13:21:46 +05:30
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
const renderQuerySection = (c: EQueryType): JSX.Element | null => {
|
|
|
|
|
switch (c) {
|
|
|
|
|
case EQueryType.PROM:
|
|
|
|
|
return renderPromqlUI();
|
|
|
|
|
case EQueryType.CLICKHOUSE:
|
|
|
|
|
return renderChQueryUI();
|
|
|
|
|
case EQueryType.QUERY_BUILDER:
|
|
|
|
|
return renderMetricUI();
|
|
|
|
|
default:
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
return (
|
|
|
|
|
<>
|
|
|
|
|
<StepHeading> {t('alert_form_step1')}</StepHeading>
|
|
|
|
|
<FormContainer>
|
|
|
|
|
<div style={{ display: 'flex' }}>{renderTabs(alertType)}</div>
|
|
|
|
|
{renderQuerySection(queryCategory)}
|
2022-07-14 13:23:15 +05:30
|
|
|
</FormContainer>
|
|
|
|
|
</>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
interface QuerySectionProps {
|
|
|
|
|
queryCategory: EQueryType;
|
|
|
|
|
setQueryCategory: (n: EQueryType) => void;
|
|
|
|
|
promQueries: IPromQueries;
|
|
|
|
|
setPromQueries: (p: IPromQueries) => void;
|
2022-11-24 13:21:46 +05:30
|
|
|
chQueries: IChQueries;
|
|
|
|
|
setChQueries: (q: IChQueries) => void;
|
|
|
|
|
alertType: AlertTypes;
|
|
|
|
|
runQuery: () => void;
|
2022-07-14 13:23:15 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default QuerySection;
|