Skip to content

Commit 019dbd8

Browse files
committed
refactor(opengemini): move database config to datasource
1 parent 3df4246 commit 019dbd8

9 files changed

Lines changed: 55 additions & 47 deletions

File tree

opengemini/schemas/datasources/opengemini-datasource/opengemini-datasource.cue

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ import (
1919
)
2020

2121
kind: #kind
22-
spec: commonProxy.#baseHTTPDatasourceSpec
22+
spec: commonProxy.#baseHTTPDatasourceSpec & {
23+
// Database name to query
24+
database: strings.MinRunes(1)
25+
}
2326

2427
#kind: "OpenGeminiDatasource"
2528

opengemini/schemas/queries/opengemini-time-series-query/query.cue

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,4 @@ spec: close({
2323
datasource?: ds.#selector
2424
// InfluxQL query string
2525
query: strings.MinRunes(1)
26-
// Database name to query
27-
database: strings.MinRunes(1)
2826
})

opengemini/src/datasources/opengemini-datasource/OpenGeminiDatasource.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import { OpenGeminiDatasourceEditor } from './OpenGeminiDatasourceEditor';
2626
* OpenGemini is InfluxDB v1.x compatible, so we use the standard /query endpoint.
2727
*/
2828
const createClient: DatasourcePlugin<OpenGeminiDatasourceSpec, OpenGeminiClient>['createClient'] = (spec, options) => {
29-
const { directUrl, proxy } = spec;
29+
const { directUrl, proxy, database } = spec;
3030
const { proxyUrl } = options;
3131

3232
// Use the direct URL if specified, but fallback to the proxyUrl by default if not specified
@@ -40,6 +40,7 @@ const createClient: DatasourcePlugin<OpenGeminiDatasourceSpec, OpenGeminiClient>
4040
return {
4141
options: {
4242
datasourceUrl,
43+
database,
4344
},
4445
query: async (params: OpenGeminiQueryParams, headers): Promise<OpenGeminiQueryResponse> => {
4546
// Build the query URL with parameters

opengemini/src/datasources/opengemini-datasource/OpenGeminiDatasourceEditor.tsx

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,12 @@
1111
// See the License for the specific language governing permissions and
1212
// limitations under the License.
1313

14-
import { HTTPSettingsEditor } from '@perses-dev/plugin-system';
15-
import React, { ReactElement } from 'react';
14+
import { HTTPSettingsEditor, OptionsEditorProps } from '@perses-dev/plugin-system';
15+
import React, { ReactElement, ChangeEvent } from 'react';
16+
import { Stack, TextField } from '@mui/material';
1617
import { OpenGeminiDatasourceSpec } from './opengemini-datasource-types';
1718

18-
export interface OpenGeminiDatasourceEditorProps {
19-
value: OpenGeminiDatasourceSpec;
20-
onChange: (next: OpenGeminiDatasourceSpec) => void;
21-
isReadonly?: boolean;
22-
}
19+
export type OpenGeminiDatasourceEditorProps = OptionsEditorProps<OpenGeminiDatasourceSpec>;
2320

2421
/**
2522
* Editor component for OpenGemini datasource configuration.
@@ -51,13 +48,32 @@ export function OpenGeminiDatasourceEditor(props: OpenGeminiDatasourceEditorProp
5148
},
5249
};
5350

51+
const handleDatabaseChange = (event: ChangeEvent<HTMLInputElement>) => {
52+
onChange({
53+
...value,
54+
database: event.target.value,
55+
});
56+
};
57+
5458
return (
55-
<HTTPSettingsEditor
56-
value={value}
57-
onChange={onChange}
58-
isReadonly={isReadonly}
59-
initialSpecDirect={initialSpecDirect}
60-
initialSpecProxy={initialSpecProxy}
61-
/>
59+
<Stack spacing={2}>
60+
<HTTPSettingsEditor
61+
value={value}
62+
onChange={onChange}
63+
isReadonly={isReadonly}
64+
initialSpecDirect={initialSpecDirect}
65+
initialSpecProxy={initialSpecProxy}
66+
/>
67+
<TextField
68+
label="Database"
69+
value={value.database ?? ''}
70+
onChange={handleDatabaseChange}
71+
disabled={isReadonly}
72+
placeholder="Enter database name"
73+
fullWidth
74+
required
75+
helperText="The OpenGemini database to query."
76+
/>
77+
</Stack>
6278
);
6379
}

opengemini/src/datasources/opengemini-datasource/opengemini-datasource-types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import { DatasourceClient } from '@perses-dev/plugin-system';
2121
export interface OpenGeminiDatasourceSpec {
2222
directUrl?: string;
2323
proxy?: HTTPProxy;
24+
database?: string;
2425
}
2526

2627
/**
@@ -37,6 +38,7 @@ export interface OpenGeminiQueryParams {
3738
*/
3839
export interface OpenGeminiClientOptions {
3940
datasourceUrl: string;
41+
database?: string;
4042
headers?: RequestHeaders;
4143
}
4244

opengemini/src/queries/opengemini-time-series-query/OpenGeminiTimeSeriesQuery.tsx

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,12 @@ export const OpenGeminiTimeSeriesQuery: TimeSeriesQueryPlugin<OpenGeminiTimeSeri
2525
OptionsEditorComponent: OpenGeminiTimeSeriesQueryEditor,
2626
createInitialOptions: () => ({
2727
query: '',
28-
database: '',
2928
}),
3029
dependsOn: (spec) => {
3130
// Parse variables from the query string
3231
const queryVariables = parseVariables(spec.query);
33-
const databaseVariables = parseVariables(spec.database);
34-
const allVariables = [...new Set([...queryVariables, ...databaseVariables])];
3532
return {
36-
variables: allVariables,
33+
variables: queryVariables,
3734
};
3835
},
3936
};

opengemini/src/queries/opengemini-time-series-query/OpenGeminiTimeSeriesQueryEditor.tsx

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,6 @@ export type OpenGeminiTimeSeriesQueryEditorProps = OptionsEditorProps<OpenGemini
2525
export function OpenGeminiTimeSeriesQueryEditor(props: OpenGeminiTimeSeriesQueryEditorProps): ReactElement {
2626
const { value, onChange, isReadonly } = props;
2727

28-
const handleDatabaseChange = (event: ChangeEvent<HTMLInputElement>) => {
29-
onChange({
30-
...value,
31-
database: event.target.value,
32-
});
33-
};
34-
3528
const handleQueryChange = (event: ChangeEvent<HTMLInputElement>) => {
3629
onChange({
3730
...value,
@@ -41,16 +34,6 @@ export function OpenGeminiTimeSeriesQueryEditor(props: OpenGeminiTimeSeriesQuery
4134

4235
return (
4336
<Stack spacing={2}>
44-
<TextField
45-
label="Database"
46-
value={value.database}
47-
onChange={handleDatabaseChange}
48-
disabled={isReadonly}
49-
placeholder="Enter database name"
50-
fullWidth
51-
size="small"
52-
helperText="The OpenGemini database to query"
53-
/>
5437
<div>
5538
<Typography variant="subtitle2" gutterBottom>
5639
InfluxQL Query

opengemini/src/queries/opengemini-time-series-query/get-time-series-data.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,22 +89,35 @@ export const getTimeSeriesData: TimeSeriesQueryPlugin<OpenGeminiTimeSeriesQueryS
8989
context
9090
) => {
9191
// Return empty data if the query is empty
92-
if (!spec.query || !spec.database) {
92+
if (!spec.query) {
9393
return { series: [] };
9494
}
9595

9696
// Replace variables in the query
9797
const query = replaceVariables(spec.query, context.variableState);
98-
const database = replaceVariables(spec.database, context.variableState);
9998

10099
// Get the OpenGemini client
101100
const client = (await context.datasourceStore.getDatasourceClient(
102101
spec.datasource ?? DEFAULT_OPENGEMINI_DATASOURCE
103102
)) as OpenGeminiClient;
104103

104+
// Get the database from the datasource options
105+
let database = client.options.database;
106+
107+
// Allow variable replacement in the database name if it was set in the datasource
108+
if (database) {
109+
database = replaceVariables(database, context.variableState);
110+
} else {
111+
// Fallback or error handling if database is not set?
112+
// OpenGemini usually requires a database.
113+
// However, if the query includes the database (e.g. SELECT ... FROM "db"."retention"."measurement"), it might work without `db` param?
114+
// But standardization implies we should probably enforce it or warn.
115+
// For now, let's proceed. If it's missing, the query might fail or rely on a default.
116+
}
117+
105118
// Execute the query with epoch=ms for millisecond timestamps
106119
const response = await client.query({
107-
db: database,
120+
db: database ?? '',
108121
q: query,
109122
epoch: 'ms',
110123
});

opengemini/src/queries/opengemini-time-series-query/opengemini-time-series-query-types.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,4 @@ export interface OpenGeminiTimeSeriesQuerySpec {
2727
* Example: SELECT mean("value") FROM "cpu" WHERE time > now() - 1h GROUP BY time(1m)
2828
*/
2929
query: string;
30-
31-
/**
32-
* Database name to query against.
33-
*/
34-
database: string;
3530
}

0 commit comments

Comments
 (0)