From 60437f27e33b003856e704f8e264ed370809a8e0 Mon Sep 17 00:00:00 2001 From: Guillaume LADORME Date: Thu, 26 Feb 2026 17:48:35 +0100 Subject: [PATCH] [FEATURE/BREAKINGCHANGE] DataQueriesProvider: use full queryDefinitions + remove QueryCountProvider + add edit query name in QueryEditorContainer Signed-off-by: Guillaume LADORME --- components/package.json | 4 +- dashboards/package.json | 7 +- .../components/GridLayout/GridItemContent.tsx | 12 +-- .../PanelQueriesSharedControls.tsx | 16 +-- explore/package.json | 5 +- package-lock.json | 68 ++++-------- plugin-system/package.json | 4 +- .../MultiQueryEditor/QueryEditorContainer.tsx | 85 +++++++++++++-- .../src/components/MultiQueryEditor/index.tsx | 1 + .../src/components/MultiQueryEditor/utils.tsx | 17 +++ .../PanelSpecEditor/PanelSpecEditor.test.tsx | 1 + .../PanelSpecEditor/PanelSpecEditor.tsx | 8 +- .../DataQueriesProvider.test.tsx | 43 ++------ .../DataQueriesProvider.tsx | 44 +++----- .../src/runtime/DataQueriesProvider/model.ts | 100 +----------------- .../src/runtime/QueryCountProvider.tsx | 29 ----- plugin-system/src/runtime/index.ts | 1 - 17 files changed, 166 insertions(+), 279 deletions(-) create mode 100644 plugin-system/src/components/MultiQueryEditor/utils.tsx delete mode 100644 plugin-system/src/runtime/QueryCountProvider.tsx diff --git a/components/package.json b/components/package.json index 2030e74..80e06b7 100644 --- a/components/package.json +++ b/components/package.json @@ -33,7 +33,7 @@ "@codemirror/lang-json": "^6.0.1", "@fontsource/lato": "^4.5.10", "@mui/x-date-pickers": "^7.23.1", - "@perses-dev/core": "0.53.0-rc.0", + "@perses-dev/core": "file:../../perses/ui/core", "@tanstack/react-table": "^8.20.5", "@uiw/react-codemirror": "^4.19.1", "date-fns": "^4.1.0", @@ -61,4 +61,4 @@ "files": [ "dist" ] -} \ No newline at end of file +} diff --git a/dashboards/package.json b/dashboards/package.json index 32a0ff6..bf5b024 100644 --- a/dashboards/package.json +++ b/dashboards/package.json @@ -30,7 +30,7 @@ }, "dependencies": { "@perses-dev/components": "0.53.0-rc.2", - "@perses-dev/core": "0.53.0-rc.0", + "@perses-dev/core": "file:../../perses/ui/core", "@perses-dev/plugin-system": "0.53.0-rc.2", "@types/react-grid-layout": "^1.3.2", "date-fns": "^4.1.0", @@ -46,8 +46,7 @@ "zustand": "^4.3.3" }, "devDependencies": { - "history": "^5.3.0", - "intersection-observer": "^0.12.2" + "history": "^5.3.0" }, "peerDependencies": { "@mui/material": "^6.1.10", @@ -58,4 +57,4 @@ "files": [ "dist" ] -} \ No newline at end of file +} diff --git a/dashboards/src/components/GridLayout/GridItemContent.tsx b/dashboards/src/components/GridLayout/GridItemContent.tsx index 86d5a5d..71786fc 100644 --- a/dashboards/src/components/GridLayout/GridItemContent.tsx +++ b/dashboards/src/components/GridLayout/GridItemContent.tsx @@ -84,14 +84,6 @@ export function GridItemContent(props: GridItemContentProps): ReactElement { const { data: plugin } = usePlugin('Panel', panelDefinition.spec.plugin.kind); - const queryDefinitions = queries ?? []; - const definitions = queryDefinitions.map((query) => { - return { - kind: query.spec.plugin.kind, - spec: query.spec.plugin.spec, - }; - }); - const pluginQueryOptions = typeof plugin?.queryOptions === 'function' ? plugin?.queryOptions(panelDefinition.spec.plugin.spec) @@ -106,7 +98,7 @@ export function GridItemContent(props: GridItemContentProps): ReactElement { }} > @@ -123,7 +115,7 @@ export function GridItemContent(props: GridItemContentProps): ReactElement { setOpenQueryViewer(false)} /> diff --git a/dashboards/src/components/PanelDrawer/PanelQueriesSharedControls.tsx b/dashboards/src/components/PanelDrawer/PanelQueriesSharedControls.tsx index c1a0ecc..38a1930 100644 --- a/dashboards/src/components/PanelDrawer/PanelQueriesSharedControls.tsx +++ b/dashboards/src/components/PanelDrawer/PanelQueriesSharedControls.tsx @@ -51,23 +51,13 @@ export function PanelQueriesSharedControls({ [panelDefinition.spec.plugin.spec, pluginPreview] ); - const [previewDefinition, setPreviewDefinition] = useState( - () => - panelDefinition.spec.queries?.map((query) => { - return { - kind: query.spec.plugin.kind, - spec: query.spec.plugin.spec, - }; - }) ?? [] - ); + const [previewDefinition, setPreviewDefinition] = useState(panelDefinition.spec.queries ?? []); const handleRunQuery = useCallback((index: number, newDef: QueryDefinition) => { setPreviewDefinition((prev) => { const newDefinitions = [...prev]; - newDefinitions[index] = { - kind: newDef.spec.plugin.kind, - spec: newDef.spec.plugin.spec, - }; + newDefinitions[index] = newDef; + return newDefinitions; }); }, []); diff --git a/explore/package.json b/explore/package.json index 00057ae..4ad3f45 100644 --- a/explore/package.json +++ b/explore/package.json @@ -29,7 +29,7 @@ "dependencies": { "@nexucis/fuzzy": "^0.5.1", "@perses-dev/components": "0.53.0-rc.2", - "@perses-dev/core": "0.53.0-rc.0", + "@perses-dev/core": "file:../../perses/ui/core", "@perses-dev/dashboards": "0.53.0-rc.2", "@perses-dev/plugin-system": "0.53.0-rc.2", "@types/react-grid-layout": "^1.3.2", @@ -50,7 +50,6 @@ "devDependencies": { "@types/qs": "^6.14.0", "history": "^5.3.0", - "intersection-observer": "^0.12.2", "react-router-dom": "^6.30.1" }, "peerDependencies": { @@ -62,4 +61,4 @@ "files": [ "dist" ] -} \ No newline at end of file +} diff --git a/package-lock.json b/package-lock.json index b8d1d0c..ebdd119 100644 --- a/package-lock.json +++ b/package-lock.json @@ -55,6 +55,21 @@ "wait-on": "^7.0.1" } }, + "../perses/ui/core": { + "name": "@perses-dev/core", + "version": "0.53.0-rc.1", + "license": "Apache-2.0", + "dependencies": { + "date-fns": "^4.1.0", + "lodash": "^4.17.21", + "mathjs": "^10.6.4", + "numbro": "^2.3.6", + "zod": "^3.21.4" + }, + "devDependencies": { + "@types/lodash": "^4.17.16" + } + }, "components": { "name": "@perses-dev/components", "version": "0.53.0-rc.2", @@ -65,7 +80,7 @@ "@codemirror/lang-json": "^6.0.1", "@fontsource/lato": "^4.5.10", "@mui/x-date-pickers": "^7.23.1", - "@perses-dev/core": "0.53.0-rc.0", + "@perses-dev/core": "file:../../perses/ui/core", "@tanstack/react-table": "^8.20.5", "@uiw/react-codemirror": "^4.19.1", "date-fns": "^4.1.0", @@ -97,7 +112,7 @@ "license": "Apache-2.0", "dependencies": { "@perses-dev/components": "0.53.0-rc.2", - "@perses-dev/core": "0.53.0-rc.0", + "@perses-dev/core": "file:../../perses/ui/core", "@perses-dev/plugin-system": "0.53.0-rc.2", "@types/react-grid-layout": "^1.3.2", "date-fns": "^4.1.0", @@ -113,8 +128,7 @@ "zustand": "^4.3.3" }, "devDependencies": { - "history": "^5.3.0", - "intersection-observer": "^0.12.2" + "history": "^5.3.0" }, "peerDependencies": { "@mui/material": "^6.1.10", @@ -140,7 +154,7 @@ "dependencies": { "@nexucis/fuzzy": "^0.5.1", "@perses-dev/components": "0.53.0-rc.2", - "@perses-dev/core": "0.53.0-rc.0", + "@perses-dev/core": "file:../../perses/ui/core", "@perses-dev/dashboards": "0.53.0-rc.2", "@perses-dev/plugin-system": "0.53.0-rc.2", "@types/react-grid-layout": "^1.3.2", @@ -161,7 +175,6 @@ "devDependencies": { "@types/qs": "^6.14.0", "history": "^5.3.0", - "intersection-observer": "^0.12.2", "react-router-dom": "^6.30.1" }, "peerDependencies": { @@ -3965,17 +3978,8 @@ "link": true }, "node_modules/@perses-dev/core": { - "version": "0.53.0-rc.0", - "resolved": "https://registry.npmjs.org/@perses-dev/core/-/core-0.53.0-rc.0.tgz", - "integrity": "sha512-hcFY/l7PlQZ9lz/uAh0J8Txw0l+W2mkalNcDu+CGvusc2sgQznrCyn7hh/UppSN7ls1JgwaCqjjVeqBEHEjsrQ==", - "license": "Apache-2.0", - "dependencies": { - "date-fns": "^4.1.0", - "lodash": "^4.17.21", - "mathjs": "^10.6.4", - "numbro": "^2.3.6", - "zod": "^3.21.4" - } + "resolved": "../perses/ui/core", + "link": true }, "node_modules/@perses-dev/dashboards": { "resolved": "dashboards", @@ -6619,15 +6623,6 @@ "node": "*" } }, - "node_modules/bignumber.js": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", - "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/bin-version": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-6.0.0.tgz", @@ -10073,13 +10068,6 @@ "node": ">= 0.4" } }, - "node_modules/intersection-observer": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.12.2.tgz", - "integrity": "sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", @@ -13181,18 +13169,6 @@ "node": ">=8" } }, - "node_modules/numbro": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/numbro/-/numbro-2.5.0.tgz", - "integrity": "sha512-xDcctDimhzko/e+y+Q2/8i3qNC9Svw1QgOkSkQoO0kIPI473tR9QRbo2KP88Ty9p8WbPy+3OpTaAIzehtuHq+A==", - "license": "MIT", - "dependencies": { - "bignumber.js": "^8 || ^9" - }, - "engines": { - "node": "*" - } - }, "node_modules/nwsapi": { "version": "2.2.22", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.22.tgz", @@ -16929,7 +16905,7 @@ "dependencies": { "@module-federation/enhanced": "^0.21.4", "@perses-dev/components": "0.53.0-rc.2", - "@perses-dev/core": "0.53.0-rc.0", + "@perses-dev/core": "file:../../perses/ui/core", "date-fns": "^4.1.0", "date-fns-tz": "^3.2.0", "immer": "^10.1.1", diff --git a/plugin-system/package.json b/plugin-system/package.json index eb557c6..1ced6df 100644 --- a/plugin-system/package.json +++ b/plugin-system/package.json @@ -30,7 +30,7 @@ "dependencies": { "@module-federation/enhanced": "^0.21.4", "@perses-dev/components": "0.53.0-rc.2", - "@perses-dev/core": "0.53.0-rc.0", + "@perses-dev/core": "file:../../perses/ui/core", "date-fns": "^4.1.0", "date-fns-tz": "^3.2.0", "immer": "^10.1.1", @@ -49,4 +49,4 @@ "files": [ "dist" ] -} \ No newline at end of file +} diff --git a/plugin-system/src/components/MultiQueryEditor/QueryEditorContainer.tsx b/plugin-system/src/components/MultiQueryEditor/QueryEditorContainer.tsx index 013d875..c39022f 100644 --- a/plugin-system/src/components/MultiQueryEditor/QueryEditorContainer.tsx +++ b/plugin-system/src/components/MultiQueryEditor/QueryEditorContainer.tsx @@ -13,15 +13,28 @@ import { produce } from 'immer'; import { QueryDefinition, QueryPluginType } from '@perses-dev/core'; -import { Stack, IconButton, Typography, BoxProps, Box, CircularProgress } from '@mui/material'; +import { + Stack, + IconButton, + Typography, + BoxProps, + Box, + CircularProgress, + TextField, + Button, + InputAdornment, +} from '@mui/material'; import DeleteIcon from 'mdi-material-ui/DeleteOutline'; import ChevronDown from 'mdi-material-ui/ChevronDown'; import ChevronRight from 'mdi-material-ui/ChevronRight'; -import { forwardRef, ReactElement } from 'react'; +import { forwardRef, ReactElement, useState } from 'react'; import AlertIcon from 'mdi-material-ui/Alert'; import { InfoTooltip } from '@perses-dev/components'; +import PencilIcon from 'mdi-material-ui/Pencil'; +import CheckIcon from 'mdi-material-ui/Check'; import { QueryData } from '../../runtime'; import { PluginEditor, PluginEditorProps, PluginEditorRef } from '../PluginEditor'; +import { defaultQueryName } from './utils'; /** * Properties for {@link QueryEditorContainer} @@ -66,6 +79,20 @@ export const QueryEditorContainer = forwardRef { + draft.spec.name = name; + }) + ); + } + return ( theme.palette.divider} > - - onCollapseExpand(index)}> + + onCollapseExpand(index)} + > {isCollapsed ? : } - - Query #{index + 1} - + + {isEditingName ? ( + setName(e.target.value)} + InputProps={{ + endAdornment: ( + + + + + + ), + }} + /> + ) : ( + <> + + {name} + + + + )} + {queryResult?.isFetching && } diff --git a/plugin-system/src/components/MultiQueryEditor/index.tsx b/plugin-system/src/components/MultiQueryEditor/index.tsx index 1e2c4cd..7390db8 100644 --- a/plugin-system/src/components/MultiQueryEditor/index.tsx +++ b/plugin-system/src/components/MultiQueryEditor/index.tsx @@ -12,3 +12,4 @@ // limitations under the License. export * from './MultiQueryEditor'; +export * from './utils'; diff --git a/plugin-system/src/components/MultiQueryEditor/utils.tsx b/plugin-system/src/components/MultiQueryEditor/utils.tsx new file mode 100644 index 0000000..1c336a3 --- /dev/null +++ b/plugin-system/src/components/MultiQueryEditor/utils.tsx @@ -0,0 +1,17 @@ +import { QueryDefinition } from '@perses-dev/core'; + +export function defaultQueryName(index: number): string { + return `Query #${index + 1}`; +} + +export function getQueryName(definitions: QueryDefinition[], query: QueryDefinition): string { + if (query.spec.name) { + return query.spec.name; + } + const index = definitions.findIndex((definition) => definition === query); + return defaultQueryName(index); +} + +export function generateQueryNames(definitions: QueryDefinition[]): string[] { + return definitions.map((queryDef: QueryDefinition, index: number) => queryDef.spec.name ?? defaultQueryName(index)); +} diff --git a/plugin-system/src/components/PanelSpecEditor/PanelSpecEditor.test.tsx b/plugin-system/src/components/PanelSpecEditor/PanelSpecEditor.test.tsx index f72192f..c60ae8d 100644 --- a/plugin-system/src/components/PanelSpecEditor/PanelSpecEditor.test.tsx +++ b/plugin-system/src/components/PanelSpecEditor/PanelSpecEditor.test.tsx @@ -23,6 +23,7 @@ describe('PanelSpecEditor', () => { const renderComponent = (props: Omit): void => { const DataQueriesProviderMock = (childProps: { children: ReactElement }): ReactElement => { const ctx = { + queryDefinitions: [], queryResults: [], refetchAll: (): void => {}, isFetching: false, diff --git a/plugin-system/src/components/PanelSpecEditor/PanelSpecEditor.tsx b/plugin-system/src/components/PanelSpecEditor/PanelSpecEditor.tsx index 5f45616..a1cde5f 100644 --- a/plugin-system/src/components/PanelSpecEditor/PanelSpecEditor.tsx +++ b/plugin-system/src/components/PanelSpecEditor/PanelSpecEditor.tsx @@ -15,7 +15,7 @@ import { ErrorAlert, JSONEditor, LinksEditor } from '@perses-dev/components'; import { PanelDefinition, PanelEditorValues, QueryDefinition, UnknownSpec } from '@perses-dev/core'; import { Control, Controller } from 'react-hook-form'; import { forwardRef, ReactElement } from 'react'; -import { QueryCountProvider, useDataQueriesContext, usePlugin } from '../../runtime'; +import { useDataQueriesContext, usePlugin } from '../../runtime'; import { PanelPlugin } from '../../model'; import { OptionsEditorTabsProps, OptionsEditorTabs } from '../OptionsEditorTabs'; import { MultiQueryEditor } from '../MultiQueryEditor'; @@ -131,11 +131,7 @@ export const PanelSpecEditor = forwardRef ), }); - return ( - - - - ); + return ; }); PanelSpecEditor.displayName = 'PanelSpecEditor'; diff --git a/plugin-system/src/runtime/DataQueriesProvider/DataQueriesProvider.test.tsx b/plugin-system/src/runtime/DataQueriesProvider/DataQueriesProvider.test.tsx index 3af305c..bf79344 100644 --- a/plugin-system/src/runtime/DataQueriesProvider/DataQueriesProvider.test.tsx +++ b/plugin-system/src/runtime/DataQueriesProvider/DataQueriesProvider.test.tsx @@ -14,9 +14,7 @@ import React, { ReactElement } from 'react'; import { renderHook } from '@testing-library/react'; import { MOCK_TIME_SERIES_DATA, MOCK_TRACE_DATA, MOCK_PROFILE_DATA, MOCK_LOG_DATA } from '../../test'; -import { useListPluginMetadata } from '../plugin-registry'; import { DataQueriesProvider, useDataQueries } from './DataQueriesProvider'; -import { useQueryType } from './model'; jest.mock('../time-series-queries', () => ({ useTimeSeriesQueries: jest.fn().mockImplementation(() => [{ data: MOCK_TIME_SERIES_DATA }]), @@ -64,9 +62,12 @@ describe('useDataQueries', (): void => { it('should return the correct data for TimeSeriesQuery', () => { const definitions = [ { - kind: 'PrometheusTimeSeriesQuery', + kind: 'TimeSeriesQuery', spec: { - query: 'up', + kind: 'PrometheusTimeSeriesQuery', + spec: { + query: 'up', + }, }, }, ]; @@ -84,9 +85,12 @@ describe('useDataQueries', (): void => { it('should return the correct data for TraceQuery', () => { const definitions = [ { - kind: 'TempoTraceQuery', + kind: 'TraceQuery', spec: { - query: '{ duration > 1000ms }', + kind: 'TempoTraceQuery', + spec: { + query: '{ duration > 1000ms }', + }, }, }, ]; @@ -101,30 +105,3 @@ describe('useDataQueries', (): void => { expect(traceResult.current.queryResults[0]?.data).toEqual(MOCK_TRACE_DATA); }); }); - -describe('useQueryType', () => { - it('should return the correct query type for a given plugin kind', () => { - const { result } = renderHook(() => useQueryType()); - - const getQueryType = result.current; - expect(getQueryType('PrometheusTimeSeriesQuery')).toBe('TimeSeriesQuery'); - expect(getQueryType('TempoTraceQuery')).toBe('TraceQuery'); - }); - - it('should throw an error if query type is not found ', () => { - const { result } = renderHook(() => useQueryType()); - - const getQueryType = result.current; - expect(() => getQueryType('UnknownQuery')).toThrowError(`Unable to determine the query type: UnknownQuery`); - }); - - it('should return undefined if useListPluginMetadata is still loading', () => { - (useListPluginMetadata as jest.Mock).mockReturnValue({ isLoading: true }); - const { result } = renderHook(() => useQueryType()); - - const getQueryType = result.current; - expect(getQueryType('PrometheusTimeSeriesQuery')).toBeUndefined(); - expect(getQueryType('TempoTraceQuery')).toBeUndefined(); - expect(getQueryType('UnknownQuery')).toBeUndefined(); - }); -}); diff --git a/plugin-system/src/runtime/DataQueriesProvider/DataQueriesProvider.tsx b/plugin-system/src/runtime/DataQueriesProvider/DataQueriesProvider.tsx index 97a5ed2..36a7037 100644 --- a/plugin-system/src/runtime/DataQueriesProvider/DataQueriesProvider.tsx +++ b/plugin-system/src/runtime/DataQueriesProvider/DataQueriesProvider.tsx @@ -25,7 +25,6 @@ import { transformQueryResults, DataQueriesContextType, QueryData, - useQueryType, } from './model'; export const DataQueriesContext = createContext(undefined); @@ -41,6 +40,9 @@ export function useDataQueriesContext(): DataQueriesContextType { export function useDataQueries(queryType: T): UseDataQueryResults { const ctx = useDataQueriesContext(); + // Filter query definitions based on the specified query type + const filteredQueryDefinitions = ctx.queryDefinitions.filter((definition) => definition.kind === queryType); + // Filter the query results based on the specified query type const filteredQueryResults = ctx.queryResults.filter( (queryResult) => queryResult?.definition?.kind === queryType @@ -50,52 +52,36 @@ export function useDataQueries(queryType: T): UseData const filteredErrors = ctx.errors.filter((errors, index) => ctx.queryResults[index]?.definition?.kind === queryType); // Create a new context object with the filtered results and errors - const filteredCtx = { + return { + queryDefinitions: filteredQueryDefinitions, queryResults: filteredQueryResults, isFetching: filteredQueryResults.some((result) => result.isFetching), isLoading: filteredQueryResults.some((result) => result.isLoading), refetchAll: ctx.refetchAll, errors: filteredErrors, }; - - return filteredCtx; } export function DataQueriesProvider(props: DataQueriesProviderProps): ReactElement { const { definitions, options, children, queryOptions } = props; - // Returns a query kind, for example "TimeSeriesQuery" = getQueryType("PrometheusTimeSeriesQuery") - const getQueryType = useQueryType(); - - const queryDefinitions = definitions.map((definition) => { - const type = getQueryType(definition.kind); - return { - kind: type, - spec: { - plugin: definition, - }, - }; - }); - const usageMetrics = useUsageMetrics(); // Filter definitions for time series query and other future query plugins - const timeSeriesQueries = queryDefinitions.filter( + const timeSeriesQueries = definitions.filter( (definition) => definition.kind === 'TimeSeriesQuery' ) as TimeSeriesQueryDefinition[]; const timeSeriesResults = useTimeSeriesQueries(timeSeriesQueries, options, queryOptions); - const traceQueries = queryDefinitions.filter( - (definition) => definition.kind === 'TraceQuery' - ) as TraceQueryDefinition[]; + const traceQueries = definitions.filter((definition) => definition.kind === 'TraceQuery') as TraceQueryDefinition[]; const traceResults = useTraceQueries(traceQueries); - const profileQueries = queryDefinitions.filter( + const profileQueries = definitions.filter( (definition) => definition.kind === 'ProfileQuery' ) as ProfileQueryDefinition[]; const profileResults = useProfileQueries(profileQueries); - const logQueries = queryDefinitions.filter((definition) => definition.kind === 'LogQuery') as LogQueryDefinition[]; + const logQueries = definitions.filter((definition) => definition.kind === 'LogQuery') as LogQueryDefinition[]; const logResults = useLogQueries(logQueries); const refetchAll = useCallback(() => { @@ -126,6 +112,7 @@ export function DataQueriesProvider(props: DataQueriesProviderProps): ReactEleme } return { + queryDefinitions: definitions, queryResults: mergedQueryResults, isFetching: mergedQueryResults.some((result) => result.isFetching), isLoading: mergedQueryResults.some((result) => result.isLoading), @@ -133,16 +120,17 @@ export function DataQueriesProvider(props: DataQueriesProviderProps): ReactEleme errors: mergedQueryResults.map((result) => result.error), }; }, [ - timeSeriesQueries, timeSeriesResults, - traceQueries, + timeSeriesQueries, traceResults, - profileQueries, + traceQueries, profileResults, - logQueries, + profileQueries, logResults, - refetchAll, + logQueries, queryOptions?.enabled, + definitions, + refetchAll, usageMetrics, ]); diff --git a/plugin-system/src/runtime/DataQueriesProvider/model.ts b/plugin-system/src/runtime/DataQueriesProvider/model.ts index 8e94759..53194b1 100644 --- a/plugin-system/src/runtime/DataQueriesProvider/model.ts +++ b/plugin-system/src/runtime/DataQueriesProvider/model.ts @@ -11,20 +11,20 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { Definition, QueryDefinition, UnknownSpec, QueryDataType } from '@perses-dev/core'; +import { QueryDefinition, UnknownSpec, QueryDataType } from '@perses-dev/core'; import { QueryObserverOptions, UseQueryResult } from '@tanstack/react-query'; -import { ReactNode, useCallback, useMemo } from 'react'; -import { useListPluginMetadata } from '../plugin-registry'; +import { ReactNode } from 'react'; export type QueryOptions = Record; -export interface DataQueriesProviderProps { - definitions: Array>; +export interface DataQueriesProviderProps { + definitions: Array>; children?: ReactNode; options?: QueryOptions; queryOptions?: Omit; } export interface DataQueriesContextType { + queryDefinitions: QueryDefinition[]; queryResults: QueryData[]; refetchAll: () => void; isFetching: boolean; @@ -57,93 +57,3 @@ export function transformQueryResults(results: UseQueryResult[], definitions: Qu } as QueryData; }); } - -export function useQueryType(): (pluginKind: string) => string | undefined { - const { data: timeSeriesQueryPlugins, isLoading: isTimeSeriesQueryLoading } = useListPluginMetadata([ - 'TimeSeriesQuery', - ]); - const { data: traceQueryPlugins, isLoading: isTraceQueryPluginLoading } = useListPluginMetadata(['TraceQuery']); - const { data: profileQueryPlugins, isLoading: isProfileQueryPluginLoading } = useListPluginMetadata(['ProfileQuery']); - const { data: logQueries, isLoading: isLogQueryPluginLoading } = useListPluginMetadata(['LogQuery']); - - // For example, `map: {"TimeSeriesQuery":["PrometheusTimeSeriesQuery"],"TraceQuery":["TempoTraceQuery"]}` - const queryTypeMap = useMemo(() => { - const map: Record = { - TimeSeriesQuery: [], - TraceQuery: [], - ProfileQuery: [], - LogQuery: [], - }; - - if (timeSeriesQueryPlugins) { - timeSeriesQueryPlugins.forEach((plugin) => { - map[plugin.kind]?.push(plugin.spec.name); - }); - } - - if (traceQueryPlugins) { - traceQueryPlugins.forEach((plugin) => { - map[plugin.kind]?.push(plugin.spec.name); - }); - } - - if (profileQueryPlugins) { - profileQueryPlugins.forEach((plugin) => { - map[plugin.kind]?.push(plugin.spec.name); - }); - } - - if (logQueries) { - logQueries.forEach((plugin) => { - map[plugin.kind]?.push(plugin.spec.name); - }); - } - - return map; - }, [timeSeriesQueryPlugins, traceQueryPlugins, profileQueryPlugins, logQueries]); - - const getQueryType = useCallback( - (pluginKind: string) => { - const isLoading = (pluginKind: string): boolean => { - switch (pluginKind) { - case 'PrometheusTimeSeriesQuery': - return isTimeSeriesQueryLoading; - case 'TempoTraceQuery': - return isTraceQueryPluginLoading; - case 'PyroscopeProfileQuery': - return isProfileQueryPluginLoading; - case 'LokiLogQuery': - return isLogQueryPluginLoading; - } - - return ( - isTraceQueryPluginLoading || - isTimeSeriesQueryLoading || - isProfileQueryPluginLoading || - isLogQueryPluginLoading - ); - }; - - if (isLoading(pluginKind)) { - return undefined; - } - - for (const queryType in queryTypeMap) { - if (queryTypeMap[queryType]?.includes(pluginKind)) { - return queryType; - } - } - - throw new Error(`Unable to determine the query type: ${pluginKind}`); - }, - [ - queryTypeMap, - isTimeSeriesQueryLoading, - isTraceQueryPluginLoading, - isProfileQueryPluginLoading, - isLogQueryPluginLoading, - ] - ); - - return getQueryType; -} diff --git a/plugin-system/src/runtime/QueryCountProvider.tsx b/plugin-system/src/runtime/QueryCountProvider.tsx deleted file mode 100644 index 7769152..0000000 --- a/plugin-system/src/runtime/QueryCountProvider.tsx +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright The Perses Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import React, { createContext, useContext, ReactNode } from 'react'; - -interface QueryCountProviderProps { - queryCount: number; - children: ReactNode; -} - -const QueryCountContext = createContext(0); - -export const QueryCountProvider: React.FC = ({ queryCount, children }) => { - return {children}; -}; - -export const useQueryCountContext = (): number => { - return useContext(QueryCountContext); -}; diff --git a/plugin-system/src/runtime/index.ts b/plugin-system/src/runtime/index.ts index 72c8679..f8bdf87 100644 --- a/plugin-system/src/runtime/index.ts +++ b/plugin-system/src/runtime/index.ts @@ -21,6 +21,5 @@ export * from './trace-queries'; export * from './profile-queries'; export * from './item-actions'; export * from './DataQueriesProvider'; -export * from './QueryCountProvider'; export * from './RouterProvider'; export * from './UsageMetricsProvider';