mirror of
https://github.com/SigNoz/signoz.git
synced 2026-09-19 01:40:41 +01:00
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
#### Description
- `queryBuilderFields` on a panel definition had no effect.
`QueryBuilderV2` discarded the prop for list panels (the only kind that
declared anything), nothing downstream read `isHidden`/`isDisabled`, and
the `filters` / `whereClauseConfig` entry had no consumer anywhere in
the repo. The behaviour it appeared to configure came entirely from
`isListViewPanel`.
- Replaces it with a config in the builder's own vocabulary — a
per-field `hidden` / `disabled` / `pinned` rule over
`QueryBuilderField`, covering per-query controls plus `Formula` and
`AdditionalQueries`. A config can only narrow what the builder already
supports for the current data source and panel type, so definitions
never restate the builder's rules. `reason` is required on `disabled` so
an inert control always explains itself.
- `isListViewPanel` becomes `isRawQuery`: it was named for a dashboard
panel type but lives in a component three explorers use. It supplies the
defaults for `fieldsConfig` and the new `allowedDataSources`, which
callers override per field. On the dashboards side it is read from the
`requestType` a kind already declares, replacing a hardcoded
`signoz/ListPanel` check.
- Deletes the dead plumbing this uncovered:
`FilterConfigs`/`WhereClauseConfig`, the
`queryComponents`/`renderOrderBy` prop, Formula's
`isAdditionalFilterEnable` block and the four modules only it reached.
Net -900 lines. No behaviour change intended.
#### Additional Information
- Reviewing by commit is easier than by file; the four are split by
concern.
- **Formula-level HAVING is gone for real.** It only rendered behind
`isAdditionalFilterEnable`, whose sole call site passed `false`, and
QBv2 never reimplemented it — so this removes the only implementation
rather than one of two. Shout if that was on someone's roadmap.
- **`renderOrderBy` was already dead**, which means Logs and Traces
Explorer silently lost their `ExplorerOrderBy` control when QBv2 landed.
I removed the prop but left the component on disk, since that looks like
an unintended regression rather than intended cleanup.
- **Known gap:** the metrics aggregation section is outside the config.
`MetricsAggregateSection` renders its own group-by, space aggregation
and step interval, so `{ groupBy: { state: 'hidden' } }` looks like it
works on a metrics query and does not. Worth closing separately.
- `disabled` is implemented, not just declared — greyed control,
`reason` in the tooltip, refuses activation — but nothing declares it
yet; ListPanel still hides. Switching any field over is a one-key edit.
129 lines
3.4 KiB
TypeScript
129 lines
3.4 KiB
TypeScript
import { useMemo } from 'react';
|
|
import { Tooltip } from 'antd';
|
|
import InputWithLabel from 'components/InputWithLabel/InputWithLabel';
|
|
import { PANEL_TYPES } from 'constants/queryBuilder';
|
|
import {
|
|
IBuilderQuery,
|
|
IBuilderTraceOperator,
|
|
} from 'types/api/queryBuilder/queryBuilderData';
|
|
import { DataSource } from 'types/common/queryBuilder';
|
|
|
|
import {
|
|
QueryBuilderField,
|
|
QueryBuilderFieldsConfig,
|
|
} from '../../queryBuilderFields.types';
|
|
import { resolveQueryBuilderField } from '../../queryBuilderFields.utils';
|
|
|
|
import QueryAggregationSelect from './QueryAggregationSelect';
|
|
|
|
import './QueryAggregation.styles.scss';
|
|
|
|
function QueryAggregationOptions({
|
|
dataSource,
|
|
panelType,
|
|
onAggregationIntervalChange,
|
|
onChange,
|
|
queryData,
|
|
fieldsConfig,
|
|
}: {
|
|
dataSource: DataSource;
|
|
panelType?: string;
|
|
onAggregationIntervalChange: (value: number) => void;
|
|
onChange?: (value: string) => void;
|
|
queryData: IBuilderQuery | IBuilderTraceOperator;
|
|
fieldsConfig?: QueryBuilderFieldsConfig;
|
|
}): JSX.Element {
|
|
const stepInterval = useMemo(() => {
|
|
if (panelType === PANEL_TYPES.VALUE) {
|
|
return { hidden: true, disabled: false, reason: undefined };
|
|
}
|
|
|
|
const isNonMetricSource =
|
|
dataSource === DataSource.TRACES || dataSource === DataSource.LOGS;
|
|
|
|
if (
|
|
isNonMetricSource &&
|
|
(panelType === PANEL_TYPES.TABLE || panelType === PANEL_TYPES.PIE)
|
|
) {
|
|
return { hidden: true, disabled: false, reason: undefined };
|
|
}
|
|
|
|
return resolveQueryBuilderField(QueryBuilderField.StepInterval, fieldsConfig);
|
|
}, [dataSource, panelType, fieldsConfig]);
|
|
|
|
const handleAggregationIntervalChange = (value: string): void => {
|
|
onAggregationIntervalChange(Number(value));
|
|
};
|
|
|
|
return (
|
|
<div
|
|
className="query-aggregation-container"
|
|
data-testid="query-aggregation-container"
|
|
>
|
|
<div className="aggregation-container">
|
|
<QueryAggregationSelect
|
|
onChange={onChange}
|
|
queryData={queryData}
|
|
maxAggregations={
|
|
panelType === PANEL_TYPES.VALUE || panelType === PANEL_TYPES.PIE
|
|
? 1
|
|
: undefined
|
|
}
|
|
/>
|
|
|
|
{!stepInterval.hidden && (
|
|
<div className="query-aggregation-interval">
|
|
<Tooltip
|
|
title={
|
|
stepInterval.reason ?? (
|
|
<div>
|
|
Set the time interval for aggregation
|
|
<br />
|
|
<a
|
|
href="https://signoz.io/docs/userguide/query-builder-v5/#temporal-aggregation-within-each-time-series"
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
style={{ color: '#1890ff', textDecoration: 'underline' }}
|
|
>
|
|
Learn about step intervals
|
|
</a>
|
|
</div>
|
|
)
|
|
}
|
|
placement="top"
|
|
>
|
|
<div
|
|
className="metrics-aggregation-section-content-item-label"
|
|
style={{ cursor: 'help' }}
|
|
>
|
|
every
|
|
</div>
|
|
</Tooltip>
|
|
|
|
<div className="query-aggregation-interval-input-container">
|
|
<InputWithLabel
|
|
initialValue={queryData?.stepInterval ? queryData?.stepInterval : null}
|
|
className="query-aggregation-interval-input"
|
|
label="Seconds"
|
|
placeholder="Auto"
|
|
type="number"
|
|
onChange={handleAggregationIntervalChange}
|
|
disabled={stepInterval.disabled}
|
|
labelAfter
|
|
/>
|
|
</div>
|
|
</div>
|
|
)}
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
QueryAggregationOptions.defaultProps = {
|
|
panelType: null,
|
|
onChange: undefined,
|
|
fieldsConfig: undefined,
|
|
};
|
|
|
|
export default QueryAggregationOptions;
|