From 4a00792f1ed8111c8e6daa277e201c78a01b61b5 Mon Sep 17 00:00:00 2001 From: Mateusz Kwasniewski Date: Thu, 4 Sep 2025 11:51:29 +0200 Subject: [PATCH] feat: rename impact metrics fields to match prometheus and grafana (#10616) --- .../ChartConfigModal/ChartConfigModal.tsx | 12 +-- .../ImpactMetricsControls.tsx | 24 ++--- .../LabelFilter/LabelsFilter.tsx | 12 +-- .../component/impact-metrics/ChartItem.tsx | 12 +-- .../impact-metrics/ImpactMetricsChart.tsx | 40 ++++----- .../impact-metrics/hooks/useChartFormState.ts | 88 +++++++++---------- .../hooks/useImpactMetricsState.test.tsx | 32 +++---- .../src/component/impact-metrics/types.ts | 8 +- .../src/component/impact-metrics/utils.ts | 8 +- .../models/createImpactMetricsConfigSchema.ts | 19 ++-- ...mpactMetricsConfigSchemaLabelSelectors.ts} | 2 +- ...eateImpactMetricsConfigSchemaTimeRange.ts} | 6 +- ...createImpactMetricsConfigSchemaYAxisMin.ts | 17 ++++ .../models/impactMetricsConfigSchema.ts | 17 ++-- ...mpactMetricsConfigSchemaLabelSelectors.ts} | 2 +- ... => impactMetricsConfigSchemaTimeRange.ts} | 6 +- .../impactMetricsConfigSchemaYAxisMin.ts | 17 ++++ frontend/src/openapi/models/index.ts | 12 ++- .../src/openapi/models/unknownFlagSchema.ts | 11 ++- .../models/unknownFlagSchemaReportsItem.ts | 13 +++ ...wnFlagSchemaReportsItemEnvironmentsItem.ts | 12 +++ 21 files changed, 218 insertions(+), 152 deletions(-) rename frontend/src/openapi/models/{createImpactMetricsConfigSchemaSelectedLabels.ts => createImpactMetricsConfigSchemaLabelSelectors.ts} (76%) rename frontend/src/openapi/models/{createImpactMetricsConfigSchemaSelectedRange.ts => createImpactMetricsConfigSchemaTimeRange.ts} (54%) create mode 100644 frontend/src/openapi/models/createImpactMetricsConfigSchemaYAxisMin.ts rename frontend/src/openapi/models/{impactMetricsConfigSchemaSelectedLabels.ts => impactMetricsConfigSchemaLabelSelectors.ts} (78%) rename frontend/src/openapi/models/{impactMetricsConfigSchemaSelectedRange.ts => impactMetricsConfigSchemaTimeRange.ts} (57%) create mode 100644 frontend/src/openapi/models/impactMetricsConfigSchemaYAxisMin.ts create mode 100644 frontend/src/openapi/models/unknownFlagSchemaReportsItem.ts create mode 100644 frontend/src/openapi/models/unknownFlagSchemaReportsItemEnvironmentsItem.ts diff --git a/frontend/src/component/impact-metrics/ChartConfigModal/ChartConfigModal.tsx b/frontend/src/component/impact-metrics/ChartConfigModal/ChartConfigModal.tsx index 04624c60ff..30c8376198 100644 --- a/frontend/src/component/impact-metrics/ChartConfigModal/ChartConfigModal.tsx +++ b/frontend/src/component/impact-metrics/ChartConfigModal/ChartConfigModal.tsx @@ -123,10 +123,10 @@ export const ChartConfigModal: FC = ({ ({ padding: theme.spacing(1) })}> @@ -136,8 +136,8 @@ export const ChartConfigModal: FC = ({ {currentAvailableLabels ? ( ) : null} diff --git a/frontend/src/component/impact-metrics/ChartConfigModal/ImpactMetricsControls/ImpactMetricsControls.tsx b/frontend/src/component/impact-metrics/ChartConfigModal/ImpactMetricsControls/ImpactMetricsControls.tsx index fa9fa09b29..432295cb58 100644 --- a/frontend/src/component/impact-metrics/ChartConfigModal/ImpactMetricsControls/ImpactMetricsControls.tsx +++ b/frontend/src/component/impact-metrics/ChartConfigModal/ImpactMetricsControls/ImpactMetricsControls.tsx @@ -12,9 +12,9 @@ export type ImpactMetricsControlsProps = { actions: Pick< ChartFormState['actions'], | 'handleSeriesChange' - | 'setSelectedRange' - | 'setBeginAtZero' - | 'setSelectedLabels' + | 'setTimeRange' + | 'setYAxisMin' + | 'setLabelSelectors' | 'setAggregationMode' >; metricSeries: (ImpactMetricsSeries & { name: string })[]; @@ -43,34 +43,36 @@ export const ImpactMetricsControls: FC = ({ - {formData.selectedSeries ? ( + {formData.metricName ? ( <> ) : null} - {formData.selectedSeries ? ( + {formData.metricName ? ( ({ margin: theme.spacing(1.5, 0) })} control={ - actions.setBeginAtZero(e.target.checked) + actions.setYAxisMin( + e.target.checked ? 'zero' : 'auto', + ) } /> } diff --git a/frontend/src/component/impact-metrics/ChartConfigModal/LabelFilter/LabelsFilter.tsx b/frontend/src/component/impact-metrics/ChartConfigModal/LabelFilter/LabelsFilter.tsx index 12b3a9b926..6d52087152 100644 --- a/frontend/src/component/impact-metrics/ChartConfigModal/LabelFilter/LabelsFilter.tsx +++ b/frontend/src/component/impact-metrics/ChartConfigModal/LabelFilter/LabelsFilter.tsx @@ -4,18 +4,18 @@ import type { ImpactMetricsLabels } from 'hooks/api/getters/useImpactMetricsData import { LabelFilterItem } from './LabelFilterItem/LabelFilterItem.tsx'; export type LabelsFilterProps = { - selectedLabels: Record; + labelSelectors: Record; onChange: (labels: Record) => void; availableLabels: ImpactMetricsLabels; }; export const LabelsFilter: FC = ({ - selectedLabels, + labelSelectors, onChange, availableLabels, }) => { const handleLabelChange = (labelKey: string, values: string[]) => { - const newLabels = { ...selectedLabels }; + const newLabels = { ...labelSelectors }; if (values.length === 0) { delete newLabels[labelKey]; } else { @@ -25,7 +25,7 @@ export const LabelsFilter: FC = ({ }; const handleAllToggle = (labelKey: string, checked: boolean) => { - const newLabels = { ...selectedLabels }; + const newLabels = { ...labelSelectors }; if (checked) { newLabels[labelKey] = ['*']; } else { @@ -53,7 +53,7 @@ export const LabelsFilter: FC = ({ }} > Filter by labels - {Object.keys(selectedLabels).length > 0 && ( + {Object.keys(labelSelectors).length > 0 && ( = ({ {Object.entries(availableLabels) .sort() .map(([labelKey, values]) => { - const currentSelection = selectedLabels[labelKey] || []; + const currentSelection = labelSelectors[labelKey] || []; return ( { parts.push(`${config.displayName}`); } - parts.push(`last ${config.selectedRange}`); + parts.push(`last ${config.timeRange}`); if (config.aggregationMode === 'rps') { parts.push('rate per second'); @@ -35,7 +35,7 @@ const getConfigDescription = (config: DisplayChartConfig): string => { parts.push('sum'); } - const labelCount = Object.keys(config.selectedLabels).length; + const labelCount = Object.keys(config.labelSelectors).length; if (labelCount > 0) { parts.push(`${labelCount} filter${labelCount > 1 ? 's' : ''}`); } @@ -147,10 +147,10 @@ export const ChartItem: FC = ({ ; - beginAtZero: boolean; + metricName: string; + timeRange: 'hour' | 'day' | 'week' | 'month'; + labelSelectors: Record; + yAxisMin: 'auto' | 'zero'; aggregationMode?: AggregationMode; aspectRatio?: number; overrideOptions?: Record; @@ -27,10 +27,10 @@ type ImpactMetricsChartProps = { }; export const ImpactMetricsChart: FC = ({ - selectedSeries, - selectedRange, - selectedLabels, - beginAtZero, + metricName, + timeRange, + labelSelectors, + yAxisMin, aggregationMode, aspectRatio, overrideOptions = {}, @@ -44,14 +44,14 @@ export const ImpactMetricsChart: FC = ({ loading: dataLoading, error: dataError, } = useImpactMetricsData( - selectedSeries + metricName ? { - series: selectedSeries, - range: selectedRange, + series: metricName, + range: timeRange, aggregationMode, labels: - Object.keys(selectedLabels).length > 0 - ? selectedLabels + Object.keys(labelSelectors).length > 0 + ? labelSelectors : undefined, } : undefined, @@ -66,7 +66,7 @@ export const ImpactMetricsChart: FC = ({ const hasError = !!dataError; const isLoading = dataLoading; - const shouldShowPlaceholder = !selectedSeries || isLoading || hasError; + const shouldShowPlaceholder = !metricName || isLoading || hasError; const notEnoughData = useMemo( () => !isLoading && @@ -81,7 +81,7 @@ export const ImpactMetricsChart: FC = ({ : undefined; const maxTime = end ? fromUnixTime(Number.parseInt(end, 10)) : undefined; - const placeholder = selectedSeries ? ( + const placeholder = metricName ? ( ) : noSeriesPlaceholder ? ( noSeriesPlaceholder @@ -92,7 +92,7 @@ export const ImpactMetricsChart: FC = ({ /> ); - const hasManyLabels = Object.keys(selectedLabels).length > 0; + const hasManyLabels = Object.keys(labelSelectors).length > 0; const cover = notEnoughData ? placeholder : isLoading; @@ -106,10 +106,10 @@ export const ImpactMetricsChart: FC = ({ min: minTime?.getTime(), max: maxTime?.getTime(), time: { - unit: getTimeUnit(selectedRange), + unit: getTimeUnit(timeRange), displayFormats: { - [getTimeUnit(selectedRange)]: - getDisplayFormat(selectedRange), + [getTimeUnit(timeRange)]: + getDisplayFormat(timeRange), }, tooltipFormat: 'PPpp', }, @@ -120,7 +120,7 @@ export const ImpactMetricsChart: FC = ({ }, }, y: { - beginAtZero, + beginAtZero: yAxisMin === 'zero', title: { display: aggregationMode === 'rps', text: diff --git a/frontend/src/component/impact-metrics/hooks/useChartFormState.ts b/frontend/src/component/impact-metrics/hooks/useChartFormState.ts index 93a7854001..ab9c4045cb 100644 --- a/frontend/src/component/impact-metrics/hooks/useChartFormState.ts +++ b/frontend/src/component/impact-metrics/hooks/useChartFormState.ts @@ -12,19 +12,19 @@ type UseChartConfigParams = { export type ChartFormState = { formData: { title: string; - selectedSeries: string; - selectedRange: 'hour' | 'day' | 'week' | 'month'; - beginAtZero: boolean; + metricName: string; + timeRange: 'hour' | 'day' | 'week' | 'month'; + yAxisMin: 'auto' | 'zero'; aggregationMode: AggregationMode; - selectedLabels: Record; + labelSelectors: Record; }; actions: { setTitle: (title: string) => void; - setSelectedSeries: (series: string) => void; - setSelectedRange: (range: 'hour' | 'day' | 'week' | 'month') => void; - setBeginAtZero: (beginAtZero: boolean) => void; + setMetricName: (series: string) => void; + setTimeRange: (range: 'hour' | 'day' | 'week' | 'month') => void; + setYAxisMin: (yAxisMin: 'auto' | 'zero') => void; setAggregationMode: (mode: AggregationMode) => void; - setSelectedLabels: (labels: Record) => void; + setLabelSelectors: (labels: Record) => void; handleSeriesChange: (series: string) => void; getConfigToSave: () => Omit; }; @@ -37,20 +37,18 @@ export const useChartFormState = ({ initialConfig, }: UseChartConfigParams): ChartFormState => { const [title, setTitle] = useState(initialConfig?.title || ''); - const [selectedSeries, setSelectedSeries] = useState( - initialConfig?.selectedSeries || '', + const [metricName, setMetricName] = useState( + initialConfig?.metricName || '', ); - const [selectedRange, setSelectedRange] = useState< + const [timeRange, setTimeRange] = useState< 'hour' | 'day' | 'week' | 'month' - >(initialConfig?.selectedRange || 'day'); - const [beginAtZero, setBeginAtZero] = useState( - initialConfig?.beginAtZero || false, - ); - const [selectedLabels, setSelectedLabels] = useState< + >(initialConfig?.timeRange || 'day'); + const [yAxisMin, setYAxisMin] = useState(initialConfig?.yAxisMin || 'auto'); + const [labelSelectors, setLabelSelectors] = useState< Record - >(initialConfig?.selectedLabels || {}); + >(initialConfig?.labelSelectors || {}); const [aggregationMode, setAggregationMode] = useState( - (initialConfig?.aggregationMode || getMetricType(selectedSeries)) === + (initialConfig?.aggregationMode || getMetricType(metricName)) === 'counter' ? 'count' : 'avg', @@ -59,10 +57,10 @@ export const useChartFormState = ({ const { data: { labels: currentAvailableLabels }, } = useImpactMetricsData( - selectedSeries + metricName ? { - series: selectedSeries, - range: selectedRange, + series: metricName, + range: timeRange, aggregationMode, } : undefined, @@ -71,29 +69,29 @@ export const useChartFormState = ({ useEffect(() => { if (open && initialConfig) { setTitle(initialConfig.title || ''); - setSelectedSeries(initialConfig.selectedSeries); - setSelectedRange(initialConfig.selectedRange); - setBeginAtZero(initialConfig.beginAtZero); - setSelectedLabels(initialConfig.selectedLabels); + setMetricName(initialConfig.metricName); + setTimeRange(initialConfig.timeRange); + setYAxisMin(initialConfig.yAxisMin); + setLabelSelectors(initialConfig.labelSelectors); setAggregationMode( initialConfig.aggregationMode || - (getMetricType(initialConfig.selectedSeries) === 'counter' + (getMetricType(initialConfig.metricName) === 'counter' ? 'count' : 'avg'), ); } else if (open && !initialConfig) { setTitle(''); - setSelectedSeries(''); - setSelectedRange('day'); - setBeginAtZero(false); - setSelectedLabels({}); + setMetricName(''); + setTimeRange('day'); + setYAxisMin('auto'); + setLabelSelectors({}); setAggregationMode('count'); } }, [open, initialConfig]); const handleSeriesChange = (series: string) => { - setSelectedSeries(series); - setSelectedLabels({}); + setMetricName(series); + setLabelSelectors({}); const metric = getMetricType(series); if (metric === 'counter') { setAggregationMode('count'); @@ -104,31 +102,31 @@ export const useChartFormState = ({ const getConfigToSave = (): Omit => ({ title: title || undefined, - selectedSeries, - selectedRange, - beginAtZero, - selectedLabels, + metricName, + timeRange, + yAxisMin, + labelSelectors, aggregationMode, }); - const isValid = selectedSeries.length > 0; + const isValid = metricName.length > 0; return { formData: { title, - selectedSeries, - selectedRange, - beginAtZero, + metricName, + timeRange, + yAxisMin, aggregationMode, - selectedLabels, + labelSelectors, }, actions: { setTitle, - setSelectedSeries, - setSelectedRange, - setBeginAtZero, + setMetricName, + setTimeRange, + setYAxisMin, setAggregationMode, - setSelectedLabels, + setLabelSelectors, handleSeriesChange, getConfigToSave, }, diff --git a/frontend/src/component/impact-metrics/hooks/useImpactMetricsState.test.tsx b/frontend/src/component/impact-metrics/hooks/useImpactMetricsState.test.tsx index 13b936ada3..6f3cd0ca4e 100644 --- a/frontend/src/component/impact-metrics/hooks/useImpactMetricsState.test.tsx +++ b/frontend/src/component/impact-metrics/hooks/useImpactMetricsState.test.tsx @@ -34,11 +34,11 @@ const TestComponent: FC<{ data-testid='add-chart' onClick={() => addChart({ - selectedSeries: 'test-series', - selectedRange: 'day', - beginAtZero: true, + metricName: 'test-series', + timeRange: 'day', + yAxisMin: 'zero', aggregationMode: 'count', - selectedLabels: {}, + labelSelectors: {}, title: 'Test Chart', }) } @@ -76,11 +76,11 @@ const mockSettings: ImpactMetricsState = { charts: [ { id: 'test-chart', - selectedSeries: 'test-series', - selectedRange: 'day' as const, - beginAtZero: true, + metricName: 'test-series', + timeRange: 'day' as const, + yAxisMin: 'zero', aggregationMode: 'count', - selectedLabels: {}, + labelSelectors: {}, title: 'Test Chart', }, ], @@ -179,11 +179,11 @@ describe('useImpactMetricsState', () => { charts: [ { id: 'new-chart-id', - selectedSeries: 'test-series', - selectedRange: 'day', - beginAtZero: true, + metricName: 'test-series', + timeRange: 'day', + yAxisMin: 'zero', mode: 'count', - selectedLabels: {}, + labelSelectors: {}, title: 'Test Chart', }, ], @@ -212,11 +212,11 @@ describe('useImpactMetricsState', () => { charts: [ { id: 'new-chart-id', - selectedSeries: 'test-series', - selectedRange: 'day', - beginAtZero: true, + metricName: 'test-series', + timeRange: 'day', + yAxisMin: 'zero', mode: 'count', - selectedLabels: {}, + labelSelectors: {}, title: 'Test Chart', }, ], diff --git a/frontend/src/component/impact-metrics/types.ts b/frontend/src/component/impact-metrics/types.ts index 23ae51ab63..e9ece23f30 100644 --- a/frontend/src/component/impact-metrics/types.ts +++ b/frontend/src/component/impact-metrics/types.ts @@ -1,10 +1,10 @@ export type ChartConfig = { id: string; - selectedSeries: string; // e.g. unleash_counter_my_metric - selectedRange: 'hour' | 'day' | 'week' | 'month'; - beginAtZero: boolean; + metricName: string; // e.g. unleash_counter_my_metric + timeRange: 'hour' | 'day' | 'week' | 'month'; + yAxisMin: 'auto' | 'zero'; aggregationMode: AggregationMode; - selectedLabels: Record; + labelSelectors: Record; title?: string; }; diff --git a/frontend/src/component/impact-metrics/utils.ts b/frontend/src/component/impact-metrics/utils.ts index db50dfcf15..28ad0a8585 100644 --- a/frontend/src/component/impact-metrics/utils.ts +++ b/frontend/src/component/impact-metrics/utils.ts @@ -1,5 +1,5 @@ -export const getTimeUnit = (selectedRange: string) => { - switch (selectedRange) { +export const getTimeUnit = (timeRange: string) => { + switch (timeRange) { case 'hour': return 'minute'; case 'day': @@ -13,8 +13,8 @@ export const getTimeUnit = (selectedRange: string) => { } }; -export const getDisplayFormat = (selectedRange: string) => { - switch (selectedRange) { +export const getDisplayFormat = (timeRange: string) => { + switch (timeRange) { case 'hour': return 'HH:mm'; case 'day': diff --git a/frontend/src/openapi/models/createImpactMetricsConfigSchema.ts b/frontend/src/openapi/models/createImpactMetricsConfigSchema.ts index 268066879b..51838a2246 100644 --- a/frontend/src/openapi/models/createImpactMetricsConfigSchema.ts +++ b/frontend/src/openapi/models/createImpactMetricsConfigSchema.ts @@ -4,8 +4,9 @@ * See `gen:api` script in package.json */ import type { CreateImpactMetricsConfigSchemaAggregationMode } from './createImpactMetricsConfigSchemaAggregationMode.js'; -import type { CreateImpactMetricsConfigSchemaSelectedLabels } from './createImpactMetricsConfigSchemaSelectedLabels.js'; -import type { CreateImpactMetricsConfigSchemaSelectedRange } from './createImpactMetricsConfigSchemaSelectedRange.js'; +import type { CreateImpactMetricsConfigSchemaLabelSelectors } from './createImpactMetricsConfigSchemaLabelSelectors.js'; +import type { CreateImpactMetricsConfigSchemaTimeRange } from './createImpactMetricsConfigSchemaTimeRange.js'; +import type { CreateImpactMetricsConfigSchemaYAxisMin } from './createImpactMetricsConfigSchemaYAxisMin.js'; /** * Describes the configuration for a single impact metric chart. @@ -13,22 +14,24 @@ import type { CreateImpactMetricsConfigSchemaSelectedRange } from './createImpac export interface CreateImpactMetricsConfigSchema { /** The aggregation mode for the metric data. */ aggregationMode: CreateImpactMetricsConfigSchemaAggregationMode; - /** Whether the chart should begin at zero on the y-axis. */ - beginAtZero: boolean; /** * Optional feature name that this impact metric is associated with. * @nullable */ feature?: string | null; + /** The unique ULID identifier for this impact metric configuration. Generated automatically if not provided. */ + id?: string; /** The selected labels and their values for filtering the metric data. */ - selectedLabels: CreateImpactMetricsConfigSchemaSelectedLabels; - /** The time range for the metric data. */ - selectedRange: CreateImpactMetricsConfigSchemaSelectedRange; + labelSelectors: CreateImpactMetricsConfigSchemaLabelSelectors; /** The Prometheus metric series to display. It includes both unleash prefix and metric type and display name */ - selectedSeries: string; + metricName: string; + /** The time range for the metric data. */ + timeRange: CreateImpactMetricsConfigSchemaTimeRange; /** * Optional title for the impact metric chart. */ title?: string; + /** Whether the chart should begin at zero on the y-axis. */ + yAxisMin: CreateImpactMetricsConfigSchemaYAxisMin; [key: string]: unknown; } diff --git a/frontend/src/openapi/models/createImpactMetricsConfigSchemaSelectedLabels.ts b/frontend/src/openapi/models/createImpactMetricsConfigSchemaLabelSelectors.ts similarity index 76% rename from frontend/src/openapi/models/createImpactMetricsConfigSchemaSelectedLabels.ts rename to frontend/src/openapi/models/createImpactMetricsConfigSchemaLabelSelectors.ts index a021175948..ef07e435fb 100644 --- a/frontend/src/openapi/models/createImpactMetricsConfigSchemaSelectedLabels.ts +++ b/frontend/src/openapi/models/createImpactMetricsConfigSchemaLabelSelectors.ts @@ -7,6 +7,6 @@ /** * The selected labels and their values for filtering the metric data. */ -export type CreateImpactMetricsConfigSchemaSelectedLabels = { +export type CreateImpactMetricsConfigSchemaLabelSelectors = { [key: string]: string[]; }; diff --git a/frontend/src/openapi/models/createImpactMetricsConfigSchemaSelectedRange.ts b/frontend/src/openapi/models/createImpactMetricsConfigSchemaTimeRange.ts similarity index 54% rename from frontend/src/openapi/models/createImpactMetricsConfigSchemaSelectedRange.ts rename to frontend/src/openapi/models/createImpactMetricsConfigSchemaTimeRange.ts index 0cec1e0bc1..bce774f012 100644 --- a/frontend/src/openapi/models/createImpactMetricsConfigSchemaSelectedRange.ts +++ b/frontend/src/openapi/models/createImpactMetricsConfigSchemaTimeRange.ts @@ -7,11 +7,11 @@ /** * The time range for the metric data. */ -export type CreateImpactMetricsConfigSchemaSelectedRange = - (typeof CreateImpactMetricsConfigSchemaSelectedRange)[keyof typeof CreateImpactMetricsConfigSchemaSelectedRange]; +export type CreateImpactMetricsConfigSchemaTimeRange = + (typeof CreateImpactMetricsConfigSchemaTimeRange)[keyof typeof CreateImpactMetricsConfigSchemaTimeRange]; // eslint-disable-next-line @typescript-eslint/no-redeclare -export const CreateImpactMetricsConfigSchemaSelectedRange = { +export const CreateImpactMetricsConfigSchemaTimeRange = { hour: 'hour', day: 'day', week: 'week', diff --git a/frontend/src/openapi/models/createImpactMetricsConfigSchemaYAxisMin.ts b/frontend/src/openapi/models/createImpactMetricsConfigSchemaYAxisMin.ts new file mode 100644 index 0000000000..602850ed70 --- /dev/null +++ b/frontend/src/openapi/models/createImpactMetricsConfigSchemaYAxisMin.ts @@ -0,0 +1,17 @@ +/** + * Generated by Orval + * Do not edit manually. + * See `gen:api` script in package.json + */ + +/** + * Whether the chart should begin at zero on the y-axis. + */ +export type CreateImpactMetricsConfigSchemaYAxisMin = + (typeof CreateImpactMetricsConfigSchemaYAxisMin)[keyof typeof CreateImpactMetricsConfigSchemaYAxisMin]; + +// eslint-disable-next-line @typescript-eslint/no-redeclare +export const CreateImpactMetricsConfigSchemaYAxisMin = { + auto: 'auto', + zero: 'zero', +} as const; diff --git a/frontend/src/openapi/models/impactMetricsConfigSchema.ts b/frontend/src/openapi/models/impactMetricsConfigSchema.ts index e2d53d2f26..03f8fc761d 100644 --- a/frontend/src/openapi/models/impactMetricsConfigSchema.ts +++ b/frontend/src/openapi/models/impactMetricsConfigSchema.ts @@ -4,9 +4,10 @@ * See `gen:api` script in package.json */ import type { ImpactMetricsConfigSchemaAggregationMode } from './impactMetricsConfigSchemaAggregationMode.js'; -import type { ImpactMetricsConfigSchemaSelectedLabels } from './impactMetricsConfigSchemaSelectedLabels.js'; -import type { ImpactMetricsConfigSchemaSelectedRange } from './impactMetricsConfigSchemaSelectedRange.js'; +import type { ImpactMetricsConfigSchemaLabelSelectors } from './impactMetricsConfigSchemaLabelSelectors.js'; +import type { ImpactMetricsConfigSchemaTimeRange } from './impactMetricsConfigSchemaTimeRange.js'; import type { ImpactMetricsConfigSchemaType } from './impactMetricsConfigSchemaType.js'; +import type { ImpactMetricsConfigSchemaYAxisMin } from './impactMetricsConfigSchemaYAxisMin.js'; /** * Describes the configuration for a single impact metric chart. @@ -14,8 +15,6 @@ import type { ImpactMetricsConfigSchemaType } from './impactMetricsConfigSchemaT export interface ImpactMetricsConfigSchema { /** The aggregation mode for the metric data. */ aggregationMode: ImpactMetricsConfigSchemaAggregationMode; - /** Whether the chart should begin at zero on the y-axis. */ - beginAtZero: boolean; /** The human readable display name of the impact metric */ displayName: string; /** @@ -26,15 +25,17 @@ export interface ImpactMetricsConfigSchema { /** The unique ULID identifier for this impact metric configuration. Generated automatically if not provided. */ id: string; /** The selected labels and their values for filtering the metric data. */ - selectedLabels: ImpactMetricsConfigSchemaSelectedLabels; - /** The time range for the metric data. */ - selectedRange: ImpactMetricsConfigSchemaSelectedRange; + labelSelectors: ImpactMetricsConfigSchemaLabelSelectors; /** The Prometheus metric series to display. It includes both unleash prefix and metric type and display name */ - selectedSeries: string; + metricName: string; + /** The time range for the metric data. */ + timeRange: ImpactMetricsConfigSchemaTimeRange; /** * Optional title for the impact metric chart. */ title?: string; /** The type of metric */ type: ImpactMetricsConfigSchemaType; + /** Whether the chart should begin at zero on the y-axis. */ + yAxisMin: ImpactMetricsConfigSchemaYAxisMin; } diff --git a/frontend/src/openapi/models/impactMetricsConfigSchemaSelectedLabels.ts b/frontend/src/openapi/models/impactMetricsConfigSchemaLabelSelectors.ts similarity index 78% rename from frontend/src/openapi/models/impactMetricsConfigSchemaSelectedLabels.ts rename to frontend/src/openapi/models/impactMetricsConfigSchemaLabelSelectors.ts index 34142463f0..f29f2489cc 100644 --- a/frontend/src/openapi/models/impactMetricsConfigSchemaSelectedLabels.ts +++ b/frontend/src/openapi/models/impactMetricsConfigSchemaLabelSelectors.ts @@ -7,6 +7,6 @@ /** * The selected labels and their values for filtering the metric data. */ -export type ImpactMetricsConfigSchemaSelectedLabels = { +export type ImpactMetricsConfigSchemaLabelSelectors = { [key: string]: string[]; }; diff --git a/frontend/src/openapi/models/impactMetricsConfigSchemaSelectedRange.ts b/frontend/src/openapi/models/impactMetricsConfigSchemaTimeRange.ts similarity index 57% rename from frontend/src/openapi/models/impactMetricsConfigSchemaSelectedRange.ts rename to frontend/src/openapi/models/impactMetricsConfigSchemaTimeRange.ts index f110822019..e4ec8ca951 100644 --- a/frontend/src/openapi/models/impactMetricsConfigSchemaSelectedRange.ts +++ b/frontend/src/openapi/models/impactMetricsConfigSchemaTimeRange.ts @@ -7,11 +7,11 @@ /** * The time range for the metric data. */ -export type ImpactMetricsConfigSchemaSelectedRange = - (typeof ImpactMetricsConfigSchemaSelectedRange)[keyof typeof ImpactMetricsConfigSchemaSelectedRange]; +export type ImpactMetricsConfigSchemaTimeRange = + (typeof ImpactMetricsConfigSchemaTimeRange)[keyof typeof ImpactMetricsConfigSchemaTimeRange]; // eslint-disable-next-line @typescript-eslint/no-redeclare -export const ImpactMetricsConfigSchemaSelectedRange = { +export const ImpactMetricsConfigSchemaTimeRange = { hour: 'hour', day: 'day', week: 'week', diff --git a/frontend/src/openapi/models/impactMetricsConfigSchemaYAxisMin.ts b/frontend/src/openapi/models/impactMetricsConfigSchemaYAxisMin.ts new file mode 100644 index 0000000000..40eaa541da --- /dev/null +++ b/frontend/src/openapi/models/impactMetricsConfigSchemaYAxisMin.ts @@ -0,0 +1,17 @@ +/** + * Generated by Orval + * Do not edit manually. + * See `gen:api` script in package.json + */ + +/** + * Whether the chart should begin at zero on the y-axis. + */ +export type ImpactMetricsConfigSchemaYAxisMin = + (typeof ImpactMetricsConfigSchemaYAxisMin)[keyof typeof ImpactMetricsConfigSchemaYAxisMin]; + +// eslint-disable-next-line @typescript-eslint/no-redeclare +export const ImpactMetricsConfigSchemaYAxisMin = { + auto: 'auto', + zero: 'zero', +} as const; diff --git a/frontend/src/openapi/models/index.ts b/frontend/src/openapi/models/index.ts index ba547c2f2b..ad81a0d1bc 100644 --- a/frontend/src/openapi/models/index.ts +++ b/frontend/src/openapi/models/index.ts @@ -428,8 +428,9 @@ export * from './createGroupSchemaUsersItem.js'; export * from './createGroupSchemaUsersItemUser.js'; export * from './createImpactMetricsConfigSchema.js'; export * from './createImpactMetricsConfigSchemaAggregationMode.js'; -export * from './createImpactMetricsConfigSchemaSelectedLabels.js'; -export * from './createImpactMetricsConfigSchemaSelectedRange.js'; +export * from './createImpactMetricsConfigSchemaLabelSelectors.js'; +export * from './createImpactMetricsConfigSchemaTimeRange.js'; +export * from './createImpactMetricsConfigSchemaYAxisMin.js'; export * from './createInvitedUserSchema.js'; export * from './createPat401.js'; export * from './createPat403.js'; @@ -894,9 +895,10 @@ export * from './idsSchema.js'; export * from './impactMetricsConfigListSchema.js'; export * from './impactMetricsConfigSchema.js'; export * from './impactMetricsConfigSchemaAggregationMode.js'; -export * from './impactMetricsConfigSchemaSelectedLabels.js'; -export * from './impactMetricsConfigSchemaSelectedRange.js'; +export * from './impactMetricsConfigSchemaLabelSelectors.js'; +export * from './impactMetricsConfigSchemaTimeRange.js'; export * from './impactMetricsConfigSchemaType.js'; +export * from './impactMetricsConfigSchemaYAxisMin.js'; export * from './impactMetricsSchema.js'; export * from './impactMetricsSchemaSamplesItem.js'; export * from './impactMetricsSchemaSamplesItemLabels.js'; @@ -1374,6 +1376,8 @@ export * from './uncomplete401.js'; export * from './uncomplete403.js'; export * from './uncomplete404.js'; export * from './unknownFlagSchema.js'; +export * from './unknownFlagSchemaReportsItem.js'; +export * from './unknownFlagSchemaReportsItemEnvironmentsItem.js'; export * from './unknownFlagsResponseSchema.js'; export * from './unsubscribeEmailSubscription401.js'; export * from './unsubscribeEmailSubscription404.js'; diff --git a/frontend/src/openapi/models/unknownFlagSchema.ts b/frontend/src/openapi/models/unknownFlagSchema.ts index a68a784ba5..242387c508 100644 --- a/frontend/src/openapi/models/unknownFlagSchema.ts +++ b/frontend/src/openapi/models/unknownFlagSchema.ts @@ -3,22 +3,21 @@ * Do not edit manually. * See `gen:api` script in package.json */ +import type { UnknownFlagSchemaReportsItem } from './unknownFlagSchemaReportsItem.js'; /** * An unknown flag report */ export interface UnknownFlagSchema { - /** The name of the application that reported the unknown flag. */ - appName: string; - /** The environment in which the unknown flag was reported. */ - environment: string; /** * The date and time when the last event for the unknown flag name occurred, if any. * @nullable */ lastEventAt?: string | null; + /** The date and time when the unknown flag was last reported. */ + lastSeenAt: string; /** The name of the unknown flag. */ name: string; - /** The date and time when the unknown flag was reported. */ - seenAt: string; + /** The list of reports for this unknown flag. */ + reports?: UnknownFlagSchemaReportsItem[]; } diff --git a/frontend/src/openapi/models/unknownFlagSchemaReportsItem.ts b/frontend/src/openapi/models/unknownFlagSchemaReportsItem.ts new file mode 100644 index 0000000000..90ee9ad548 --- /dev/null +++ b/frontend/src/openapi/models/unknownFlagSchemaReportsItem.ts @@ -0,0 +1,13 @@ +/** + * Generated by Orval + * Do not edit manually. + * See `gen:api` script in package.json + */ +import type { UnknownFlagSchemaReportsItemEnvironmentsItem } from './unknownFlagSchemaReportsItemEnvironmentsItem.js'; + +export type UnknownFlagSchemaReportsItem = { + /** The name of the application that reported the unknown flag. */ + appName: string; + /** The list of environments where this application reported the unknown flag. */ + environments: UnknownFlagSchemaReportsItemEnvironmentsItem[]; +}; diff --git a/frontend/src/openapi/models/unknownFlagSchemaReportsItemEnvironmentsItem.ts b/frontend/src/openapi/models/unknownFlagSchemaReportsItemEnvironmentsItem.ts new file mode 100644 index 0000000000..227ebffcb9 --- /dev/null +++ b/frontend/src/openapi/models/unknownFlagSchemaReportsItemEnvironmentsItem.ts @@ -0,0 +1,12 @@ +/** + * Generated by Orval + * Do not edit manually. + * See `gen:api` script in package.json + */ + +export type UnknownFlagSchemaReportsItemEnvironmentsItem = { + /** The environment in which the unknown flag was reported. */ + environment: string; + /** The date and time when the unknown flag was last seen in this environment. */ + seenAt: string; +};