generated from grafana/grafana-starter-datasource-backend
-
Notifications
You must be signed in to change notification settings - Fork 88
Config redesign part 2 #1387
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Config redesign part 2 #1387
Changes from all commits
Commits
Show all changes
33 commits
Select commit
Hold shift + click to select a range
9fc45d9
Add credentials section
alyssajoyner 779f2ca
Add tests for credentials section
alyssajoyner f8775c6
Add TLS and additional settings section
alyssajoyner 3a83574
Update design and add tests
alyssajoyner 30581c2
Merge branch 'main' into alyssa/config-redesign-part-2
alyssajoyner b3951a2
Lint/spellcheck
alyssajoyner c9ebbaa
Fix tests
alyssajoyner c6d246a
Fix spacing and change protocol description
alyssajoyner 352264f
Add tracking and run prettier
alyssajoyner cccfdbc
Add optional badge
alyssajoyner 510af44
Add indent to http settings section
alyssajoyner aa8d732
Merge main
alyssajoyner 9b3bc14
Remove merge header
alyssajoyner d7b894d
Merge branch 'main' into alyssa/config-redesign-part-2
alyssajoyner e8323cd
Remove unused file
alyssajoyner c26e47a
Address comments
alyssajoyner a83b3a6
Merge branch 'main' into alyssa/config-redesign-part-2
alyssajoyner 5cc0ee4
Fixing nits
alyssajoyner 86918de
Merge branch 'main' into alyssa/config-redesign-part-2
alyssajoyner 4d055fc
Update src/views/config-v2/HttpHeadersConfigV2.tsx
alyssajoyner 1544380
Update src/views/config-v2/HttpHeadersConfigV2.tsx
alyssajoyner f08a389
Update src/views/config-v2/HttpHeadersConfigV2.tsx
alyssajoyner ef5ebdb
Update src/views/config-v2/HttpHeadersConfigV2.tsx
alyssajoyner 400b1ea
Merge branch 'main' into alyssa/config-redesign-part-2
alyssajoyner 3985a01
Remove deprecated components
alyssajoyner c420900
Add helper func for logs and traces config
alyssajoyner 6ee993b
Refactor func
alyssajoyner 283778b
Merge branch 'main' into alyssa/config-redesign-part-2
alyssajoyner 7c47626
Update test
alyssajoyner 65f756d
Update component and labels
alyssajoyner 6290ca1
update labels
alyssajoyner 7019eff
fix broken stuff
alyssajoyner 6c28875
remove yarn
alyssajoyner File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,290 @@ | ||
import { ConfigSubSection } from 'components/experimental/ConfigSection'; | ||
import allLabels from './labelsV2'; | ||
import React, { ChangeEvent, useState } from 'react'; | ||
import { DataSourcePluginOptionsEditorProps, onUpdateDatasourceJsonDataOption } from '@grafana/data'; | ||
import { AliasTableEntry, CHConfig, CHCustomSetting, CHLogsConfig, CHSecureConfig, CHTracesConfig } from 'types/config'; | ||
import { AliasTableConfig } from 'components/configEditor/AliasTableConfig'; | ||
import { DefaultDatabaseTableConfig } from 'components/configEditor/DefaultDatabaseTableConfig'; | ||
import { LogsConfig } from 'components/configEditor/LogsConfig'; | ||
import { QuerySettingsConfig } from 'components/configEditor/QuerySettingsConfig'; | ||
import { TracesConfig } from 'components/configEditor/TracesConfig'; | ||
import { config } from '@grafana/runtime'; | ||
import { TimeUnit } from 'types/queryBuilder'; | ||
import { useConfigDefaults } from 'views/CHConfigEditorHooks'; | ||
import { gte as versionGte } from 'semver'; | ||
import { | ||
Field, | ||
Divider, | ||
Stack, | ||
Input, | ||
Button, | ||
Switch, | ||
Box, | ||
CollapsableSection, | ||
Text, | ||
Badge, | ||
useStyles2, | ||
} from '@grafana/ui'; | ||
import { CONFIG_SECTION_HEADERS, CONTAINER_MIN_WIDTH } from './constants'; | ||
import { | ||
trackClickhouseConfigV2CustomSettingClicked, | ||
trackClickhouseConfigV2DefaultDbInput, | ||
trackClickhouseConfigV2DefaultTableInput, | ||
trackClickhouseConfigV2EnableRowLimitToggle, | ||
trackClickhouseConfigV2LogsConfig, | ||
trackClickhouseConfigV2QuerySettings, | ||
trackClickhouseConfigV2TracesConfig, | ||
} from './tracking'; | ||
import { css } from '@emotion/css'; | ||
|
||
export interface Props extends DataSourcePluginOptionsEditorProps<CHConfig, CHSecureConfig> {} | ||
|
||
export const AdditionalSettingsSection = (props: Props) => { | ||
const { options, onOptionsChange } = props; | ||
const { jsonData } = options; | ||
const labels = allLabels.components.Config.ConfigEditor; | ||
const styles = useStyles2(getStyles); | ||
|
||
useConfigDefaults(options, onOptionsChange); | ||
|
||
const [customSettings, setCustomSettings] = useState(jsonData.customSettings || []); | ||
|
||
const onLogsConfigChange = (key: keyof CHLogsConfig, value: string | boolean | string[]) => { | ||
onOptionsChange({ | ||
...options, | ||
jsonData: { | ||
...options.jsonData, | ||
logs: { | ||
...options.jsonData.logs, | ||
[key]: value, | ||
}, | ||
}, | ||
}); | ||
}; | ||
|
||
const onUpdateLogsConfig = (key: keyof CHLogsConfig, value: string | boolean | string[]) => { | ||
trackClickhouseConfigV2LogsConfig({ [key]: value }); | ||
onLogsConfigChange(key, value); | ||
}; | ||
|
||
const onTracesConfigChange = (key: keyof CHTracesConfig, value: string | boolean) => { | ||
onOptionsChange({ | ||
...options, | ||
jsonData: { | ||
...options.jsonData, | ||
traces: { | ||
...options.jsonData.traces, | ||
durationUnit: options.jsonData.traces?.durationUnit || TimeUnit.Nanoseconds, | ||
[key]: value, | ||
}, | ||
}, | ||
}); | ||
}; | ||
|
||
const onUpdateTracesConfig = (key: keyof CHTracesConfig, value: string | boolean) => { | ||
trackClickhouseConfigV2TracesConfig({ [key]: value }); | ||
onTracesConfigChange(key, value); | ||
}; | ||
|
||
const onAliasTableConfigChange = (aliasTables: AliasTableEntry[]) => { | ||
onOptionsChange({ | ||
...options, | ||
jsonData: { | ||
...options.jsonData, | ||
aliasTables, | ||
}, | ||
}); | ||
}; | ||
|
||
const onCustomSettingsChange = (customSettings: CHCustomSetting[]) => { | ||
onOptionsChange({ | ||
...options, | ||
jsonData: { | ||
...options.jsonData, | ||
customSettings: customSettings.filter((s) => !!s.setting && !!s.value), | ||
}, | ||
}); | ||
}; | ||
|
||
return ( | ||
<Box | ||
borderStyle="solid" | ||
borderColor="weak" | ||
padding={2} | ||
marginBottom={4} | ||
id={`${CONFIG_SECTION_HEADERS[3].id}`} | ||
minWidth={CONTAINER_MIN_WIDTH} | ||
> | ||
<CollapsableSection | ||
label={ | ||
<> | ||
<Text variant="h3">4. {CONFIG_SECTION_HEADERS[3].label}</Text> | ||
<Badge text="optional" color="blue" className={styles.badge} /> | ||
</> | ||
} | ||
isOpen={!!CONFIG_SECTION_HEADERS[3].isOpen} | ||
> | ||
<DefaultDatabaseTableConfig | ||
defaultDatabase={jsonData.defaultDatabase} | ||
defaultTable={jsonData.defaultTable} | ||
onDefaultDatabaseChange={(e) => { | ||
trackClickhouseConfigV2DefaultDbInput(); | ||
onUpdateDatasourceJsonDataOption(props, 'defaultDatabase')(e); | ||
}} | ||
onDefaultTableChange={(e) => { | ||
trackClickhouseConfigV2DefaultTableInput(); | ||
onUpdateDatasourceJsonDataOption(props, 'defaultTable')(e); | ||
}} | ||
/> | ||
<Divider /> | ||
<QuerySettingsConfig | ||
connMaxLifetime={jsonData.connMaxLifetime} | ||
dialTimeout={jsonData.dialTimeout} | ||
maxIdleConns={jsonData.maxIdleConns} | ||
maxOpenConns={jsonData.maxOpenConns} | ||
queryTimeout={jsonData.queryTimeout} | ||
validateSql={jsonData.validateSql} | ||
onDialTimeoutChange={(e) => { | ||
trackClickhouseConfigV2QuerySettings({ dialTimeout: Number(e.currentTarget.value) }); | ||
onUpdateDatasourceJsonDataOption(props, 'dialTimeout')(e); | ||
}} | ||
onQueryTimeoutChange={(e) => { | ||
trackClickhouseConfigV2QuerySettings({ queryTimeout: Number(e.currentTarget.value) }); | ||
onUpdateDatasourceJsonDataOption(props, 'queryTimeout')(e); | ||
}} | ||
onConnMaxLifetimeChange={(e) => { | ||
trackClickhouseConfigV2QuerySettings({ connMaxLifetime: Number(e.currentTarget.value) }); | ||
onUpdateDatasourceJsonDataOption(props, 'connMaxLifetime')(e); | ||
}} | ||
onConnMaxIdleConnsChange={(e) => { | ||
trackClickhouseConfigV2QuerySettings({ maxIdleConns: Number(e.currentTarget.value) }); | ||
onUpdateDatasourceJsonDataOption(props, 'maxIdleConns')(e); | ||
}} | ||
onConnMaxOpenConnsChange={(e) => { | ||
trackClickhouseConfigV2QuerySettings({ maxOpenConns: Number(e.currentTarget.value) }); | ||
onUpdateDatasourceJsonDataOption(props, 'maxOpenConns')(e); | ||
}} | ||
onValidateSqlChange={(e) => { | ||
trackClickhouseConfigV2QuerySettings({ validateSql: e.currentTarget.checked }); | ||
onUpdateDatasourceJsonDataOption(props, 'validateSql')(e); | ||
}} | ||
/> | ||
<Divider /> | ||
<LogsConfig | ||
logsConfig={jsonData.logs} | ||
onDefaultDatabaseChange={(db) => onUpdateLogsConfig('defaultDatabase', db)} | ||
onDefaultTableChange={(table) => onUpdateLogsConfig('defaultTable', table)} | ||
onOtelEnabledChange={(v) => onUpdateLogsConfig('otelEnabled', v)} | ||
onOtelVersionChange={(v) => onUpdateLogsConfig('otelVersion', v)} | ||
onTimeColumnChange={(c) => onUpdateLogsConfig('timeColumn', c)} | ||
onLevelColumnChange={(c) => onUpdateLogsConfig('levelColumn', c)} | ||
onMessageColumnChange={(c) => onUpdateLogsConfig('messageColumn', c)} | ||
onSelectContextColumnsChange={(c) => onUpdateLogsConfig('selectContextColumns', c)} | ||
onContextColumnsChange={(c) => onUpdateLogsConfig('contextColumns', c)} | ||
/> | ||
|
||
<Divider /> | ||
<TracesConfig | ||
tracesConfig={jsonData.traces} | ||
onDefaultDatabaseChange={(db) => onUpdateTracesConfig('defaultDatabase', db)} | ||
onDefaultTableChange={(table) => onUpdateTracesConfig('defaultTable', table)} | ||
onOtelEnabledChange={(v) => onUpdateTracesConfig('otelEnabled', v)} | ||
onOtelVersionChange={(v) => onUpdateTracesConfig('otelVersion', v)} | ||
onTraceIdColumnChange={(c) => onUpdateTracesConfig('traceIdColumn', c)} | ||
onSpanIdColumnChange={(c) => onUpdateTracesConfig('spanIdColumn', c)} | ||
onOperationNameColumnChange={(c) => onUpdateTracesConfig('operationNameColumn', c)} | ||
onParentSpanIdColumnChange={(c) => onUpdateTracesConfig('parentSpanIdColumn', c)} | ||
onServiceNameColumnChange={(c) => onUpdateTracesConfig('serviceNameColumn', c)} | ||
onDurationColumnChange={(c) => onUpdateTracesConfig('durationColumn', c)} | ||
onDurationUnitChange={(c) => onUpdateTracesConfig('durationUnit', c)} | ||
onStartTimeColumnChange={(c) => onUpdateTracesConfig('startTimeColumn', c)} | ||
onTagsColumnChange={(c) => onUpdateTracesConfig('tagsColumn', c)} | ||
onServiceTagsColumnChange={(c) => onUpdateTracesConfig('serviceTagsColumn', c)} | ||
onKindColumnChange={(c) => onUpdateTracesConfig('kindColumn', c)} | ||
onStatusCodeColumnChange={(c) => onUpdateTracesConfig('statusCodeColumn', c)} | ||
onStatusMessageColumnChange={(c) => onUpdateTracesConfig('statusMessageColumn', c)} | ||
onStateColumnChange={(c) => onUpdateTracesConfig('stateColumn', c)} | ||
onInstrumentationLibraryNameColumnChange={(c) => onUpdateTracesConfig('instrumentationLibraryNameColumn', c)} | ||
onInstrumentationLibraryVersionColumnChange={(c) => | ||
onUpdateTracesConfig('instrumentationLibraryVersionColumn', c) | ||
} | ||
onFlattenNestedChange={(c) => onUpdateTracesConfig('flattenNested', c)} | ||
onEventsColumnPrefixChange={(c) => onUpdateTracesConfig('traceEventsColumnPrefix', c)} | ||
onLinksColumnPrefixChange={(c) => onUpdateTracesConfig('traceLinksColumnPrefix', c)} | ||
/> | ||
<Divider /> | ||
<AliasTableConfig aliasTables={jsonData.aliasTables} onAliasTablesChange={onAliasTableConfigChange} /> | ||
<Divider /> | ||
<Field label={labels.enableRowLimit.label} description={labels.enableRowLimit.tooltip}> | ||
<Switch | ||
value={jsonData.enableRowLimit || false} | ||
data-testid={labels.enableRowLimit.testid} | ||
onChange={(e) => { | ||
trackClickhouseConfigV2EnableRowLimitToggle({ rowLimitEnabled: e.currentTarget.checked }); | ||
onUpdateDatasourceJsonDataOption(props, 'enableRowLimit')(e); | ||
}} | ||
/> | ||
</Field> | ||
{config.secureSocksDSProxyEnabled && versionGte(config.buildInfo.version, '10.0.0') && ( | ||
<Field label={labels.secureSocksProxy.label} description={labels.secureSocksProxy.tooltip}> | ||
<Switch | ||
value={jsonData.enableSecureSocksProxy || false} | ||
onChange={(e) => onUpdateDatasourceJsonDataOption(props, 'enableSecureSocksProxy')(e)} | ||
/> | ||
</Field> | ||
)} | ||
<ConfigSubSection title="Custom Settings"> | ||
{customSettings.map(({ setting, value }, i) => { | ||
return ( | ||
<Stack key={i} direction="row"> | ||
<Field label={`Setting`} aria-label={`Setting`}> | ||
<Input | ||
value={setting} | ||
placeholder={'Setting'} | ||
onChange={(changeEvent: ChangeEvent<HTMLInputElement>) => { | ||
let newSettings = customSettings.concat(); | ||
newSettings[i] = { setting: changeEvent.target.value, value }; | ||
setCustomSettings(newSettings); | ||
}} | ||
onBlur={() => onCustomSettingsChange(customSettings)} | ||
></Input> | ||
</Field> | ||
<Field label={'Value'} aria-label={`Value`}> | ||
<Input | ||
value={value} | ||
placeholder={'Value'} | ||
onChange={(changeEvent: ChangeEvent<HTMLInputElement>) => { | ||
let newSettings = customSettings.concat(); | ||
newSettings[i] = { setting, value: changeEvent.target.value }; | ||
setCustomSettings(newSettings); | ||
}} | ||
onBlur={() => { | ||
onCustomSettingsChange(customSettings); | ||
}} | ||
></Input> | ||
</Field> | ||
</Stack> | ||
); | ||
})} | ||
<Button | ||
variant="secondary" | ||
icon="plus" | ||
type="button" | ||
onClick={() => { | ||
trackClickhouseConfigV2CustomSettingClicked(); | ||
setCustomSettings([...customSettings, { setting: '', value: '' }]); | ||
}} | ||
> | ||
Add custom setting | ||
</Button> | ||
</ConfigSubSection> | ||
</CollapsableSection> | ||
</Box> | ||
); | ||
}; | ||
|
||
const getStyles = () => ({ | ||
badge: css({ | ||
marginLeft: 'auto', | ||
}), | ||
}); |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.