From 03c53fad8d137838b7b8625c066c52f1c67144d9 Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Wed, 1 Nov 2023 12:36:12 +0100 Subject: [PATCH 01/11] PMM-12608 Add auto discovery limit for PG --- .../AddRemoteInstance.types.ts | 1 + .../AdditionalOptions.constants.ts | 13 +++- .../AdditionalOptions.messages.ts | 4 ++ .../AdditionalOptions/AdditionalOptions.tsx | 70 +++++++++++++++---- .../AdditionalOptions.types.ts | 5 ++ .../FormParts/FormParts.messages.ts | 5 ++ .../FormParts/FormParts.test.tsx | 4 +- .../FormParts/FormParts.types.ts | 1 + 8 files changed, 87 insertions(+), 16 deletions(-) diff --git a/public/app/percona/add-instance/components/AddRemoteInstance/AddRemoteInstance.types.ts b/public/app/percona/add-instance/components/AddRemoteInstance/AddRemoteInstance.types.ts index e52ffca89d730..9fb2d218dbb97 100644 --- a/public/app/percona/add-instance/components/AddRemoteInstance/AddRemoteInstance.types.ts +++ b/public/app/percona/add-instance/components/AddRemoteInstance/AddRemoteInstance.types.ts @@ -102,6 +102,7 @@ export interface PostgreSQLPayload extends RemoteCommonPayload, TLSCommon { tls_key: string; agent_password: string; max_query_length: number; + auto_discovery_limit: number; } export interface MySQLPayload extends RemoteCommonPayload, TLSCommon { diff --git a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.constants.ts b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.constants.ts index 535ff0d3fd8ef..6390ffb6b85c5 100644 --- a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.constants.ts +++ b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.constants.ts @@ -1,5 +1,5 @@ import { Messages } from './AdditionalOptions.messages'; -import { TablestatOptionsInterface } from './AdditionalOptions.types'; +import { AutoDiscoveryOptionsInterface, TablestatOptionsInterface } from './AdditionalOptions.types'; export const tablestatOptions = [ { @@ -15,3 +15,14 @@ export const tablestatOptions = [ label: Messages.form.tablestatOptions.custom, }, ]; + +export const autoDiscoveryOptions = [ + { + value: AutoDiscoveryOptionsInterface.disabled, + label: Messages.form.autoDiscoveryOptions.disabled, + }, + { + value: AutoDiscoveryOptionsInterface.custom, + label: Messages.form.autoDiscoveryOptions.custom, + }, +]; diff --git a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.messages.ts b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.messages.ts index 4e89563764044..588798237fe7b 100644 --- a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.messages.ts +++ b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.messages.ts @@ -5,5 +5,9 @@ export const Messages = { default: 'Default', custom: 'Custom', }, + autoDiscoveryOptions: { + disabled: 'Disabled', + custom: 'Custom', + }, }, }; diff --git a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx index 58a5fcf3986d7..4a853f8492ca9 100644 --- a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx +++ b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx @@ -1,5 +1,5 @@ import { FormApi } from 'final-form'; -import React, { FC, useEffect, useState } from 'react'; +import React, { FC, useEffect, useMemo, useState } from 'react'; import { useStyles2 } from '@grafana/ui'; import { InstanceAvailableType, RemoteInstanceCredentials } from 'app/percona/add-instance/panel.types'; @@ -7,6 +7,7 @@ import { CheckboxField } from 'app/percona/shared/components/Elements/Checkbox'; import { NumberInputField } from 'app/percona/shared/components/Form/NumberInput'; import { RadioButtonGroupField } from 'app/percona/shared/components/Form/RadioButtonGroup'; import { Databases } from 'app/percona/shared/core'; +import validators from 'app/percona/shared/helpers/validators'; import { validators as platformCoreValidators } from 'app/percona/shared/helpers/validatorsForm'; import { rdsTrackingOptions, trackingOptions } from '../FormParts.constants'; @@ -14,8 +15,8 @@ import { Messages } from '../FormParts.messages'; import { getStyles } from '../FormParts.styles'; import { AdditionalOptionsFormPartProps, PostgreSQLAdditionalOptionsProps } from '../FormParts.types'; -import { tablestatOptions } from './AdditionalOptions.constants'; -import { TablestatOptionsInterface } from './AdditionalOptions.types'; +import { autoDiscoveryOptions, tablestatOptions } from './AdditionalOptions.constants'; +import { AutoDiscoveryOptionsInterface, TablestatOptionsInterface } from './AdditionalOptions.types'; import { MongodbTLSCertificate } from './MongodbTLSCertificate'; import { MysqlTLSCertificate } from './MysqlTLSCertificate'; import { PostgreTLSCertificate } from './PostgreTLSCertificate'; @@ -41,16 +42,58 @@ export const AdditionalOptionsFormPart: FC = ({ ); }; -export const PostgreSQLAdditionalOptions: FC = ({ isRDS, isAzure }) => ( - <> -

{Messages.form.labels.trackingOptions}

- - -); +export const PostgreSQLAdditionalOptions: FC = ({ form, isRDS, isAzure }) => { + const selectedOption = form.getState().values && form.getState().values.autoDiscoveryOptions; + const [selectedValue, setSelectedValue] = useState(selectedOption || AutoDiscoveryOptionsInterface.disabled); + const autoDiscoveryValidators = useMemo(() => [validators.min(0)], []); + const styles = useStyles2(getStyles); + + const getAutoDiscoveryLimitValue = (type: AutoDiscoveryOptionsInterface) => { + switch (type) { + case AutoDiscoveryOptionsInterface.disabled: + return 0; + default: + return 1000; + } + }; + + useEffect(() => { + setSelectedValue(selectedOption); + form.change('autoDiscoveryLimit', getAutoDiscoveryLimitValue(selectedOption)); + }, [selectedOption, form]); + + return ( + <> +

{Messages.form.labels.trackingOptions}

+ +

{Messages.form.labels.postgresqlDetails.autoDiscovery}

+
+ + +
+ + ); +}; const getTablestatValues = (type: TablestatOptionsInterface) => { switch (type) { @@ -115,6 +158,7 @@ export const getAdditionalOptions = ( /> diff --git a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.types.ts b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.types.ts index f58a325d28110..bdb0b2594ec95 100644 --- a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.types.ts +++ b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.types.ts @@ -3,3 +3,8 @@ export enum TablestatOptionsInterface { default = 'default', custom = 'custom', } + +export enum AutoDiscoveryOptionsInterface { + disabled = 'disabled', + custom = 'custom', +} diff --git a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.messages.ts b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.messages.ts index 980c17caf44ba..efb50c11d35d6 100644 --- a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.messages.ts +++ b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.messages.ts @@ -29,6 +29,9 @@ export const Messages = { postgresqlDetails: { database: 'Database', maxQueryLength: 'Max query length', + autoDiscovery: 'Auto discovery', + autoDiscoveryLimit: 'Auto discovery limit', + autoDiscoveryLimitOptions: 'State', }, mysqlDetails: { maxQueryLength: 'Max query length', @@ -87,6 +90,7 @@ export const Messages = { postgresqlDetails: { database: 'Database (default: postgres)', maxQueryLength: 'Max query length', + autoDiscoveryLimit: 'Auto discovery limit', }, mysqlDetails: { maxQueryLength: 'Max query length', @@ -126,6 +130,7 @@ export const Messages = { postgresqlDetails: { database: 'Database name', maxQueryLength: 'Full Example (Fingerprint) storage is not allowed by default to have the best performance', + autoDiscoveryLimit: 'TODO', }, mysqlDetails: { maxQueryLength: 'Full Example (Fingerprint) storage is not allowed by default to have the best performance', diff --git a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.test.tsx b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.test.tsx index 66280c9174a44..fd64cdadada58 100644 --- a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.test.tsx +++ b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.test.tsx @@ -181,7 +181,7 @@ describe('getAdditionalOptions ::', () => { const fields = container.querySelectorAll('input'); const trakingFields = screen.getAllByTestId('tracking-radio-button'); expect(trakingFields.length).toBe(trackingOptions.length); - expect(fields.length).toBe(7); + expect(fields.length).toBe(11); }); it('should render correct for RDS PostgreSQL', async () => { const type = Databases.postgresql; @@ -198,6 +198,6 @@ describe('getAdditionalOptions ::', () => { const fields = container.querySelectorAll('input'); const trakingFields = screen.getAllByTestId('tracking-radio-button'); expect(trakingFields.length).toBe(rdsTrackingOptions.length); - expect(fields.length).toBe(8); + expect(fields.length).toBe(12); }); }); diff --git a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.types.ts b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.types.ts index 6328066594280..ad0f700338361 100644 --- a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.types.ts +++ b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.types.ts @@ -21,6 +21,7 @@ export interface AdditionalOptionsFormPartProps { export interface PostgreSQLAdditionalOptionsProps { isRDS?: boolean; isAzure?: boolean; + form: FormApi; } export enum Schema { From ba04daad77b2b0f74c3fc5a0fb5cd4c0fbf5f233 Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Wed, 1 Nov 2023 12:45:47 +0100 Subject: [PATCH 02/11] PMM-12608 Adjust stat tracking styling --- .../FormParts/AdditionalOptions/AdditionalOptions.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx index 4a853f8492ca9..22df956de1337 100644 --- a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx +++ b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx @@ -69,6 +69,8 @@ export const PostgreSQLAdditionalOptions: FC = name="tracking" data-testid="tracking-options-radio-button-group" options={isRDS || isAzure ? rdsTrackingOptions : trackingOptions} + className={styles.radioField} + fullWidth />

{Messages.form.labels.postgresqlDetails.autoDiscovery}

From 8b9bd3a550cb0fbf14bcddaf50f43a43429d4022 Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Wed, 1 Nov 2023 12:53:41 +0100 Subject: [PATCH 03/11] PMM-12608 Fix custom value setting --- .../FormParts/AdditionalOptions/AdditionalOptions.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx index 22df956de1337..f87e914ac70bb 100644 --- a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx +++ b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx @@ -60,7 +60,8 @@ export const PostgreSQLAdditionalOptions: FC = useEffect(() => { setSelectedValue(selectedOption); form.change('autoDiscoveryLimit', getAutoDiscoveryLimitValue(selectedOption)); - }, [selectedOption, form]); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [selectedOption]); return ( <> From 185440713b829a841732a452be7b8976a4e17d71 Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Thu, 2 Nov 2023 12:53:26 +0100 Subject: [PATCH 04/11] PMM-12608 Remove tooltip from autodiscovery --- .../FormParts/AdditionalOptions/AdditionalOptions.tsx | 1 - .../components/AddRemoteInstance/FormParts/FormParts.messages.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx index f87e914ac70bb..d8e2b9e978903 100644 --- a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx +++ b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx @@ -91,7 +91,6 @@ export const PostgreSQLAdditionalOptions: FC = disabled={selectedValue !== AutoDiscoveryOptionsInterface.custom} validators={autoDiscoveryValidators} label={Messages.form.labels.postgresqlDetails.autoDiscoveryLimit} - tooltipText={Messages.form.tooltips.postgresqlDetails.autoDiscoveryLimit} />
diff --git a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.messages.ts b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.messages.ts index efb50c11d35d6..692ba5a750997 100644 --- a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.messages.ts +++ b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.messages.ts @@ -130,7 +130,6 @@ export const Messages = { postgresqlDetails: { database: 'Database name', maxQueryLength: 'Full Example (Fingerprint) storage is not allowed by default to have the best performance', - autoDiscoveryLimit: 'TODO', }, mysqlDetails: { maxQueryLength: 'Full Example (Fingerprint) storage is not allowed by default to have the best performance', From d0594178779c61580b857e38b546142b971c9433 Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Mon, 6 Nov 2023 12:11:04 +0100 Subject: [PATCH 05/11] PMM-12608 Address comments --- .../AdditionalOptions/AdditionalOptions.tsx | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx index d8e2b9e978903..2d9e828875625 100644 --- a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx +++ b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx @@ -43,19 +43,13 @@ export const AdditionalOptionsFormPart: FC = ({ }; export const PostgreSQLAdditionalOptions: FC = ({ form, isRDS, isAzure }) => { - const selectedOption = form.getState().values && form.getState().values.autoDiscoveryOptions; + const selectedOption = form.getState()?.values?.autoDiscoveryOptions; const [selectedValue, setSelectedValue] = useState(selectedOption || AutoDiscoveryOptionsInterface.disabled); const autoDiscoveryValidators = useMemo(() => [validators.min(0)], []); const styles = useStyles2(getStyles); - const getAutoDiscoveryLimitValue = (type: AutoDiscoveryOptionsInterface) => { - switch (type) { - case AutoDiscoveryOptionsInterface.disabled: - return 0; - default: - return 1000; - } - }; + const getAutoDiscoveryLimitValue = (type: AutoDiscoveryOptionsInterface) => + type === AutoDiscoveryOptionsInterface.disabled ? 0 : 1000; useEffect(() => { setSelectedValue(selectedOption); From 11d3cfa37908c3b20e2d48d41d37c40a2032e818 Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Mon, 6 Nov 2023 15:46:56 +0100 Subject: [PATCH 06/11] PMM-12608 Use enabled instead of disabled & tooltips --- .../AdditionalOptions/AdditionalOptions.constants.ts | 4 ++-- .../AdditionalOptions/AdditionalOptions.messages.ts | 2 +- .../FormParts/AdditionalOptions/AdditionalOptions.tsx | 5 +++-- .../FormParts/AdditionalOptions/AdditionalOptions.types.ts | 2 +- .../AddRemoteInstance/FormParts/FormParts.messages.ts | 7 ++++--- 5 files changed, 11 insertions(+), 9 deletions(-) diff --git a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.constants.ts b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.constants.ts index 6390ffb6b85c5..9d4690201e494 100644 --- a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.constants.ts +++ b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.constants.ts @@ -18,8 +18,8 @@ export const tablestatOptions = [ export const autoDiscoveryOptions = [ { - value: AutoDiscoveryOptionsInterface.disabled, - label: Messages.form.autoDiscoveryOptions.disabled, + value: AutoDiscoveryOptionsInterface.enabled, + label: Messages.form.autoDiscoveryOptions.enabled, }, { value: AutoDiscoveryOptionsInterface.custom, diff --git a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.messages.ts b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.messages.ts index 588798237fe7b..74c4c5b718f7a 100644 --- a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.messages.ts +++ b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.messages.ts @@ -6,7 +6,7 @@ export const Messages = { custom: 'Custom', }, autoDiscoveryOptions: { - disabled: 'Disabled', + enabled: 'Enabled', custom: 'Custom', }, }, diff --git a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx index 2d9e828875625..b3568784d84d4 100644 --- a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx +++ b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx @@ -44,12 +44,12 @@ export const AdditionalOptionsFormPart: FC = ({ export const PostgreSQLAdditionalOptions: FC = ({ form, isRDS, isAzure }) => { const selectedOption = form.getState()?.values?.autoDiscoveryOptions; - const [selectedValue, setSelectedValue] = useState(selectedOption || AutoDiscoveryOptionsInterface.disabled); + const [selectedValue, setSelectedValue] = useState(selectedOption || AutoDiscoveryOptionsInterface.enabled); const autoDiscoveryValidators = useMemo(() => [validators.min(0)], []); const styles = useStyles2(getStyles); const getAutoDiscoveryLimitValue = (type: AutoDiscoveryOptionsInterface) => - type === AutoDiscoveryOptionsInterface.disabled ? 0 : 1000; + type === AutoDiscoveryOptionsInterface.enabled ? 0 : 1000; useEffect(() => { setSelectedValue(selectedOption); @@ -85,6 +85,7 @@ export const PostgreSQLAdditionalOptions: FC = disabled={selectedValue !== AutoDiscoveryOptionsInterface.custom} validators={autoDiscoveryValidators} label={Messages.form.labels.postgresqlDetails.autoDiscoveryLimit} + tooltipText={Messages.form.tooltips.postgresqlDetails.autoDiscoveryLimit} /> diff --git a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.types.ts b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.types.ts index bdb0b2594ec95..0616d8556a462 100644 --- a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.types.ts +++ b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.types.ts @@ -5,6 +5,6 @@ export enum TablestatOptionsInterface { } export enum AutoDiscoveryOptionsInterface { - disabled = 'disabled', + enabled = 'enabled', custom = 'custom', } diff --git a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.messages.ts b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.messages.ts index 692ba5a750997..9fcee1d47cdc2 100644 --- a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.messages.ts +++ b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.messages.ts @@ -29,8 +29,8 @@ export const Messages = { postgresqlDetails: { database: 'Database', maxQueryLength: 'Max query length', - autoDiscovery: 'Auto discovery', - autoDiscoveryLimit: 'Auto discovery limit', + autoDiscovery: 'Auto-discovery', + autoDiscoveryLimit: 'Auto-discovery limit', autoDiscoveryLimitOptions: 'State', }, mysqlDetails: { @@ -90,7 +90,7 @@ export const Messages = { postgresqlDetails: { database: 'Database (default: postgres)', maxQueryLength: 'Max query length', - autoDiscoveryLimit: 'Auto discovery limit', + autoDiscoveryLimit: 'Auto-discovery limit', }, mysqlDetails: { maxQueryLength: 'Max query length', @@ -130,6 +130,7 @@ export const Messages = { postgresqlDetails: { database: 'Database name', maxQueryLength: 'Full Example (Fingerprint) storage is not allowed by default to have the best performance', + autoDiscoveryLimit: 'Turn off auto-discovery when the total count of databases exceeds the limit.', }, mysqlDetails: { maxQueryLength: 'Full Example (Fingerprint) storage is not allowed by default to have the best performance', From b8ff0a94577699936df172a2bc81ebadf6e5c73d Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Mon, 13 Nov 2023 12:03:12 +0100 Subject: [PATCH 07/11] PMM-12608 Match validation to table stats + fix table stats --- .../FormParts/AdditionalOptions/AdditionalOptions.tsx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx index b3568784d84d4..92adff9459a86 100644 --- a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx +++ b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx @@ -1,5 +1,5 @@ import { FormApi } from 'final-form'; -import React, { FC, useEffect, useMemo, useState } from 'react'; +import React, { FC, useEffect, useState } from 'react'; import { useStyles2 } from '@grafana/ui'; import { InstanceAvailableType, RemoteInstanceCredentials } from 'app/percona/add-instance/panel.types'; @@ -7,7 +7,6 @@ import { CheckboxField } from 'app/percona/shared/components/Elements/Checkbox'; import { NumberInputField } from 'app/percona/shared/components/Form/NumberInput'; import { RadioButtonGroupField } from 'app/percona/shared/components/Form/RadioButtonGroup'; import { Databases } from 'app/percona/shared/core'; -import validators from 'app/percona/shared/helpers/validators'; import { validators as platformCoreValidators } from 'app/percona/shared/helpers/validatorsForm'; import { rdsTrackingOptions, trackingOptions } from '../FormParts.constants'; @@ -45,7 +44,6 @@ export const AdditionalOptionsFormPart: FC = ({ export const PostgreSQLAdditionalOptions: FC = ({ form, isRDS, isAzure }) => { const selectedOption = form.getState()?.values?.autoDiscoveryOptions; const [selectedValue, setSelectedValue] = useState(selectedOption || AutoDiscoveryOptionsInterface.enabled); - const autoDiscoveryValidators = useMemo(() => [validators.min(0)], []); const styles = useStyles2(getStyles); const getAutoDiscoveryLimitValue = (type: AutoDiscoveryOptionsInterface) => @@ -83,7 +81,7 @@ export const PostgreSQLAdditionalOptions: FC = name="autoDiscoveryLimit" defaultValue={0} disabled={selectedValue !== AutoDiscoveryOptionsInterface.custom} - validators={autoDiscoveryValidators} + validate={platformCoreValidators.containsNumber} label={Messages.form.labels.postgresqlDetails.autoDiscoveryLimit} tooltipText={Messages.form.tooltips.postgresqlDetails.autoDiscoveryLimit} /> @@ -109,7 +107,8 @@ const MySQLOptions = ({ form }: { form: FormApi }) => { useEffect(() => { setSelectedValue(selectedOption); form.change('tablestats_group_table_limit', getTablestatValues(selectedOption)); - }, [selectedOption, form]); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [selectedOption]); return ( <> From 2bdf87861bff79e0c45975108e02ed83092907d5 Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Mon, 13 Nov 2023 12:53:23 +0100 Subject: [PATCH 08/11] PMM-12608 Set default custom autodiscovery limit to 10 --- .../FormParts/AdditionalOptions/AdditionalOptions.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx index 92adff9459a86..7d9c92d2fdff6 100644 --- a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx +++ b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx @@ -47,7 +47,7 @@ export const PostgreSQLAdditionalOptions: FC = const styles = useStyles2(getStyles); const getAutoDiscoveryLimitValue = (type: AutoDiscoveryOptionsInterface) => - type === AutoDiscoveryOptionsInterface.enabled ? 0 : 1000; + type === AutoDiscoveryOptionsInterface.enabled ? 0 : 10; useEffect(() => { setSelectedValue(selectedOption); From c4be97e6cd6f800d745f26feef971d1f30c4ea55 Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Wed, 15 Nov 2023 10:17:04 +0100 Subject: [PATCH 09/11] PMM-12608 Add integer validation --- .../FormParts/AdditionalOptions/AdditionalOptions.tsx | 3 ++- public/app/percona/shared/core/constants.ts | 5 +++++ public/app/percona/shared/helpers/validatorsForm/index.ts | 1 + public/app/percona/shared/helpers/validatorsForm/int32.ts | 5 +++++ 4 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 public/app/percona/shared/helpers/validatorsForm/int32.ts diff --git a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx index 7d9c92d2fdff6..776a6022989c1 100644 --- a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx +++ b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx @@ -45,6 +45,7 @@ export const PostgreSQLAdditionalOptions: FC = const selectedOption = form.getState()?.values?.autoDiscoveryOptions; const [selectedValue, setSelectedValue] = useState(selectedOption || AutoDiscoveryOptionsInterface.enabled); const styles = useStyles2(getStyles); + const validators = [platformCoreValidators.containsNumber, ...platformCoreValidators.int32]; const getAutoDiscoveryLimitValue = (type: AutoDiscoveryOptionsInterface) => type === AutoDiscoveryOptionsInterface.enabled ? 0 : 10; @@ -81,7 +82,7 @@ export const PostgreSQLAdditionalOptions: FC = name="autoDiscoveryLimit" defaultValue={0} disabled={selectedValue !== AutoDiscoveryOptionsInterface.custom} - validate={platformCoreValidators.containsNumber} + validators={validators} label={Messages.form.labels.postgresqlDetails.autoDiscoveryLimit} tooltipText={Messages.form.tooltips.postgresqlDetails.autoDiscoveryLimit} /> diff --git a/public/app/percona/shared/core/constants.ts b/public/app/percona/shared/core/constants.ts index a59ca235a56b2..b51997143a92e 100644 --- a/public/app/percona/shared/core/constants.ts +++ b/public/app/percona/shared/core/constants.ts @@ -55,3 +55,8 @@ export const DATABASE_ICONS: Record = { [Databases.mariadb]: 'percona-database-mysql', [Databases.haproxy]: 'percona-database-haproxy', }; + +export const INT_32 = { + min: -2147483648, + max: 2147483647, +}; diff --git a/public/app/percona/shared/helpers/validatorsForm/index.ts b/public/app/percona/shared/helpers/validatorsForm/index.ts index 2508cedbae101..fea82f05fbf75 100644 --- a/public/app/percona/shared/helpers/validatorsForm/index.ts +++ b/public/app/percona/shared/helpers/validatorsForm/index.ts @@ -10,5 +10,6 @@ export { maxLength } from './maxLength'; export { required } from './required'; export { requiredTrue } from './requiredTrue'; export { minTags } from './minTags'; +export { int32 } from './int32'; export * from './validator.types'; export * as validators from '.'; diff --git a/public/app/percona/shared/helpers/validatorsForm/int32.ts b/public/app/percona/shared/helpers/validatorsForm/int32.ts new file mode 100644 index 0000000000000..b499466da4dbe --- /dev/null +++ b/public/app/percona/shared/helpers/validatorsForm/int32.ts @@ -0,0 +1,5 @@ +import { INT_32 } from '../../core'; + +import { lessThan, greaterThan } from '.'; + +export const int32 = [greaterThan(INT_32.min - 1), lessThan(INT_32.max + 1)]; From 7b22fc477532c8db15f07f6222e79ae6f9984262 Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Wed, 15 Nov 2023 11:54:33 +0100 Subject: [PATCH 10/11] PMM-12608 Add option to disable autodiscovery --- .../AdditionalOptions/AdditionalOptions.constants.ts | 4 ++++ .../FormParts/AdditionalOptions/AdditionalOptions.messages.ts | 1 + .../FormParts/AdditionalOptions/AdditionalOptions.tsx | 2 +- .../FormParts/AdditionalOptions/AdditionalOptions.types.ts | 1 + 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.constants.ts b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.constants.ts index 9d4690201e494..9db946b11a8eb 100644 --- a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.constants.ts +++ b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.constants.ts @@ -21,6 +21,10 @@ export const autoDiscoveryOptions = [ value: AutoDiscoveryOptionsInterface.enabled, label: Messages.form.autoDiscoveryOptions.enabled, }, + { + value: AutoDiscoveryOptionsInterface.disabled, + label: Messages.form.autoDiscoveryOptions.disabled, + }, { value: AutoDiscoveryOptionsInterface.custom, label: Messages.form.autoDiscoveryOptions.custom, diff --git a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.messages.ts b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.messages.ts index 74c4c5b718f7a..76fd288d8892a 100644 --- a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.messages.ts +++ b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.messages.ts @@ -7,6 +7,7 @@ export const Messages = { }, autoDiscoveryOptions: { enabled: 'Enabled', + disabled: 'Disabled', custom: 'Custom', }, }, diff --git a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx index 776a6022989c1..865b0865e8fa6 100644 --- a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx +++ b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx @@ -48,7 +48,7 @@ export const PostgreSQLAdditionalOptions: FC = const validators = [platformCoreValidators.containsNumber, ...platformCoreValidators.int32]; const getAutoDiscoveryLimitValue = (type: AutoDiscoveryOptionsInterface) => - type === AutoDiscoveryOptionsInterface.enabled ? 0 : 10; + type === AutoDiscoveryOptionsInterface.enabled ? 0 : type === AutoDiscoveryOptionsInterface.disabled ? -1 : 10; useEffect(() => { setSelectedValue(selectedOption); diff --git a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.types.ts b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.types.ts index 0616d8556a462..ad4d29f414076 100644 --- a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.types.ts +++ b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.types.ts @@ -6,5 +6,6 @@ export enum TablestatOptionsInterface { export enum AutoDiscoveryOptionsInterface { enabled = 'enabled', + disabled = 'disabled', custom = 'custom', } From 7b70e0e39ee738deff1bceabf367b967180c518a Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Wed, 15 Nov 2023 12:20:43 +0100 Subject: [PATCH 11/11] PMM-12608 Fix unit tests --- .../components/AddRemoteInstance/FormParts/FormParts.test.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.test.tsx b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.test.tsx index fd64cdadada58..7af1b758c480e 100644 --- a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.test.tsx +++ b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.test.tsx @@ -181,7 +181,7 @@ describe('getAdditionalOptions ::', () => { const fields = container.querySelectorAll('input'); const trakingFields = screen.getAllByTestId('tracking-radio-button'); expect(trakingFields.length).toBe(trackingOptions.length); - expect(fields.length).toBe(11); + expect(fields.length).toBe(12); }); it('should render correct for RDS PostgreSQL', async () => { const type = Databases.postgresql; @@ -198,6 +198,6 @@ describe('getAdditionalOptions ::', () => { const fields = container.querySelectorAll('input'); const trakingFields = screen.getAllByTestId('tracking-radio-button'); expect(trakingFields.length).toBe(rdsTrackingOptions.length); - expect(fields.length).toBe(12); + expect(fields.length).toBe(13); }); });