Skip to content

Commit eee86d9

Browse files
committed
Update shouldbeopen logic for additional settings
1 parent 66b83c0 commit eee86d9

File tree

9 files changed

+89
-87
lines changed

9 files changed

+89
-87
lines changed

package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,5 @@
8888
"semver": "7.7.3",
8989
"sql-formatter": "^15.6.10",
9090
"tslib": "2.8.1"
91-
},
92-
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
91+
}
9392
}

src/components/configEditor/LogsConfig.test.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { render, fireEvent } from '@testing-library/react';
33
import { LogsConfig } from './LogsConfig';
44
import allLabels from 'labels';
55
import { columnLabelToPlaceholder } from 'data/utils';
6-
import { defaultLogsTable } from 'otel';
6+
import { defaultCHAdditionalSettingsConfig } from 'types/config';
77

88
describe('LogsConfig', () => {
99
it('should render', () => {
@@ -68,7 +68,7 @@ describe('LogsConfig', () => {
6868
);
6969
expect(result.container.firstChild).not.toBeNull();
7070

71-
const input = result.getByPlaceholderText(defaultLogsTable);
71+
const input = result.getByPlaceholderText(defaultCHAdditionalSettingsConfig.logs?.defaultTable!);
7272
expect(input).toBeInTheDocument();
7373
fireEvent.change(input, { target: { value: 'changed' } });
7474
fireEvent.blur(input);

src/components/configEditor/LogsConfig.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ import { ConfigSection, ConfigSubSection } from 'components/experimental/ConfigS
33
import { Input, Field, InlineFormLabel, TagsInput } from '@grafana/ui';
44
import { OtelVersionSelect } from 'components/queryBuilder/OtelVersionSelect';
55
import { ColumnHint } from 'types/queryBuilder';
6-
import otel, { defaultLogsTable } from 'otel';
6+
import otel from 'otel';
77
import { LabeledInput } from './LabeledInput';
8-
import { CHLogsConfig } from 'types/config';
8+
import { CHLogsConfig, defaultCHAdditionalSettingsConfig } from 'types/config';
99
import allLabels from 'labels';
1010
import { columnLabelToPlaceholder } from 'data/utils';
1111
import { Switch } from 'components/queryBuilder/Switch';
@@ -80,7 +80,7 @@ export const LogsConfig = (props: LogsConfigProps) => {
8080
onChange={(e) => onDefaultTableChange(e.currentTarget.value)}
8181
label={labels.defaultTable.label}
8282
aria-label={labels.defaultTable.label}
83-
placeholder={defaultLogsTable}
83+
placeholder={defaultCHAdditionalSettingsConfig.logs?.defaultTable!}
8484
/>
8585
</Field>
8686
<ConfigSubSection title={labels.columns.title} description={labels.columns.description}>

src/components/configEditor/TracesConfig.test.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { render, fireEvent } from '@testing-library/react';
33
import { TracesConfig, TraceConfigProps } from './TracesConfig';
44
import allLabels from 'labels';
55
import { columnLabelToPlaceholder } from 'data/utils';
6-
import { defaultTraceTable } from 'otel';
6+
import { defaultCHAdditionalSettingsConfig } from 'types/config';
77

88
function defaultTraceConfigProps(): TraceConfigProps {
99
return {
@@ -60,7 +60,7 @@ describe('TracesConfig', () => {
6060
const result = render(<TracesConfig {...defaultTraceConfigProps()} onDefaultTableChange={onDefaultTableChange} />);
6161
expect(result.container.firstChild).not.toBeNull();
6262

63-
const input = result.getByPlaceholderText(defaultTraceTable);
63+
const input = result.getByPlaceholderText(defaultCHAdditionalSettingsConfig.traces?.defaultTable!);
6464
expect(input).toBeInTheDocument();
6565
fireEvent.change(input, { target: { value: 'changed' } });
6666
fireEvent.blur(input);

src/components/configEditor/TracesConfig.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ import { ConfigSection, ConfigSubSection } from 'components/experimental/ConfigS
33
import { Input, Field } from '@grafana/ui';
44
import { OtelVersionSelect } from 'components/queryBuilder/OtelVersionSelect';
55
import { ColumnHint, TimeUnit } from 'types/queryBuilder';
6-
import otel, { defaultTraceTable } from 'otel';
6+
import otel from 'otel';
77
import { LabeledInput } from './LabeledInput';
88
import { DurationUnitSelect } from 'components/queryBuilder/DurationUnitSelect';
9-
import { CHTracesConfig } from 'types/config';
9+
import { CHTracesConfig, defaultCHAdditionalSettingsConfig } from 'types/config';
1010
import allLabels from 'labels';
1111
import { columnLabelToPlaceholder } from 'data/utils';
1212
import { Switch } from 'components/queryBuilder/Switch';
@@ -136,7 +136,7 @@ export const TracesConfig = (props: TraceConfigProps) => {
136136
onChange={(e) => onDefaultTableChange(e.currentTarget.value)}
137137
label={labels.defaultTable.label}
138138
aria-label={labels.defaultTable.label}
139-
placeholder={defaultTraceTable}
139+
placeholder={defaultCHAdditionalSettingsConfig.traces?.defaultTable!}
140140
/>
141141
</Field>
142142
<ConfigSubSection title={labels.columns.title} description={labels.columns.description}>
@@ -197,7 +197,7 @@ export const TracesConfig = (props: TraceConfigProps) => {
197197
/>
198198
<DurationUnitSelect
199199
disabled={otelEnabled}
200-
unit={(durationUnit as TimeUnit) || TimeUnit.Nanoseconds}
200+
unit={(durationUnit as TimeUnit) || defaultCHAdditionalSettingsConfig.traces?.durationUnit}
201201
onChange={onDurationUnitChange}
202202
/>
203203
<LabeledInput

src/types/config.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import { DataSourceJsonData, KeyValue } from '@grafana/data';
2+
import otel, { defaultLogsTable, defaultTraceTable } from 'otel';
3+
import { TimeUnit } from './queryBuilder';
24

35
export interface CHConfig extends DataSourceJsonData {
46
/**
@@ -118,3 +120,17 @@ export enum Protocol {
118120
Native = 'native',
119121
Http = 'http',
120122
}
123+
124+
export const defaultCHAdditionalSettingsConfig: Partial<CHConfig> = {
125+
logs: {
126+
defaultTable: defaultLogsTable,
127+
otelVersion: otel.getLatestVersion().version,
128+
selectContextColumns: true,
129+
contextColumns: [],
130+
},
131+
traces: {
132+
defaultTable: defaultTraceTable,
133+
otelVersion: otel.getLatestVersion().version,
134+
durationUnit: TimeUnit.Nanoseconds,
135+
},
136+
};

src/views/CHConfigEditorHooks.test.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import { DataSourceSettings } from '@grafana/data';
22
import { renderHook } from '@testing-library/react';
3-
import { CHConfig, CHHttpHeader, CHSecureConfig, Protocol } from 'types/config';
3+
import { CHConfig, CHHttpHeader, CHSecureConfig, defaultCHAdditionalSettingsConfig, Protocol } from 'types/config';
44
import { onHttpHeadersChange, useConfigDefaults } from './CHConfigEditorHooks';
55
import { pluginVersion } from 'utils/version';
6-
import { defaultLogsTable, defaultTraceTable } from 'otel';
76

87
describe('onHttpHeadersChange', () => {
98
it('should properly sort headers into secure/plain config fields', async () => {
@@ -95,12 +94,12 @@ describe('useConfigDefaults', () => {
9594
version: pluginVersion,
9695
protocol: Protocol.Native,
9796
logs: {
98-
defaultTable: defaultLogsTable,
97+
defaultTable: defaultCHAdditionalSettingsConfig.logs?.defaultTable,
9998
selectContextColumns: true,
10099
contextColumns: [],
101100
},
102101
traces: {
103-
defaultTable: defaultTraceTable,
102+
defaultTable: defaultCHAdditionalSettingsConfig.traces?.defaultTable,
104103
},
105104
};
106105

src/views/CHConfigEditorHooks.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { DataSourceSettings, KeyValue } from '@grafana/data';
2-
import { defaultLogsTable, defaultTraceTable } from 'otel';
32
import { useEffect, useRef } from 'react';
4-
import { CHConfig, CHHttpHeader, CHSecureConfig, Protocol } from 'types/config';
3+
import { CHConfig, CHHttpHeader, CHSecureConfig, defaultCHAdditionalSettingsConfig, Protocol } from 'types/config';
54
import { pluginVersion } from 'utils/version';
65

76
/**
@@ -103,7 +102,7 @@ export const useConfigDefaults = (
103102
if (!jsonData.logs || jsonData.logs.defaultTable === undefined) {
104103
jsonData.logs = {
105104
...jsonData.logs,
106-
defaultTable: defaultLogsTable,
105+
defaultTable: defaultCHAdditionalSettingsConfig.logs?.defaultTable,
107106
selectContextColumns: true,
108107
contextColumns: [],
109108
};
@@ -112,7 +111,7 @@ export const useConfigDefaults = (
112111
if (!jsonData.traces || jsonData.traces.defaultTable === undefined) {
113112
jsonData.traces = {
114113
...jsonData.traces,
115-
defaultTable: defaultTraceTable,
114+
defaultTable: defaultCHAdditionalSettingsConfig.traces?.defaultTable,
116115
};
117116
}
118117

src/views/config-v2/AdditionalSettingsSection.tsx

Lines changed: 55 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
11
import { ConfigSubSection } from 'components/experimental/ConfigSection';
22
import allLabels from './labelsV2';
3-
import React, { ChangeEvent, useState } from 'react';
3+
import React, { ChangeEvent, useMemo, useState } from 'react';
44
import {
55
DataSourcePluginOptionsEditorProps,
66
onUpdateDatasourceJsonDataOption,
77
onUpdateDatasourceJsonDataOptionChecked,
88
} from '@grafana/data';
9-
import { AliasTableEntry, CHConfig, CHCustomSetting, CHLogsConfig, CHSecureConfig, CHTracesConfig } from 'types/config';
9+
import {
10+
AliasTableEntry,
11+
CHConfig,
12+
CHCustomSetting,
13+
CHLogsConfig,
14+
CHSecureConfig,
15+
CHTracesConfig,
16+
defaultCHAdditionalSettingsConfig,
17+
} from 'types/config';
1018
import { AliasTableConfig } from 'components/configEditor/AliasTableConfig';
1119
import { DefaultDatabaseTableConfig } from 'components/configEditor/DefaultDatabaseTableConfig';
1220
import { LogsConfig } from 'components/configEditor/LogsConfig';
@@ -52,69 +60,6 @@ export const AdditionalSettingsSection = (props: Props) => {
5260
useConfigDefaults(options, onOptionsChange);
5361

5462
const [customSettings, setCustomSettings] = useState(jsonData.customSettings || []);
55-
const ADDITIONAL_SETTINGS_DEFAULTS = {
56-
defaultDatabase: jsonData.defaultDatabase,
57-
defaultTable: jsonData.defaultTable,
58-
connMaxLifetime: jsonData.connMaxLifetime,
59-
dialTimeout: jsonData.dialTimeout,
60-
maxIdleConns: jsonData.maxIdleConns,
61-
maxOpenConns: jsonData.maxOpenConns,
62-
queryTimeout: jsonData.queryTimeout,
63-
validateSql: jsonData.validateSql,
64-
logs: {
65-
defaultDatabase: jsonData.logs?.defaultDatabase,
66-
defaultTable: jsonData.logs?.defaultTable !== 'otel_logs' ? jsonData.logs?.defaultTable : undefined,
67-
otelEnabled: jsonData.logs?.otelEnabled,
68-
otelVersion: jsonData.logs?.otelVersion !== 'latest' ? jsonData.logs?.otelVersion : undefined,
69-
timeColumn: jsonData.logs?.timeColumn,
70-
levelColumn: jsonData.logs?.levelColumn,
71-
messageColumn: jsonData.logs?.messageColumn,
72-
selectContextColumns: jsonData.logs?.selectContextColumns,
73-
contextColumns:
74-
jsonData.logs?.contextColumns && jsonData.logs?.contextColumns.length > 0
75-
? jsonData.logs?.contextColumns
76-
: undefined,
77-
},
78-
traces: {
79-
defaultDatabase: jsonData.traces?.defaultDatabase,
80-
defaultTable: jsonData.traces?.defaultTable !== 'otel_traces' ? jsonData.logs?.defaultTable : undefined,
81-
otelEnabled: jsonData.traces?.otelEnabled,
82-
otelVersion: jsonData.traces?.otelVersion !== 'latest' ? jsonData.logs?.otelVersion : undefined,
83-
traceIdColumn: jsonData.traces?.traceIdColumn,
84-
spanIdColumn: jsonData.traces?.spanIdColumn,
85-
operationNameColumn: jsonData.traces?.operationNameColumn,
86-
parentSpanIdColumn: jsonData.traces?.parentSpanIdColumn,
87-
serviceNameColumn: jsonData.traces?.serviceNameColumn,
88-
durationColumn: jsonData.traces?.durationColumn,
89-
startTimeColumn: jsonData.traces?.startTimeColumn,
90-
tagsColumn: jsonData.traces?.tagsColumn,
91-
serviceTagsColumn: jsonData.traces?.serviceTagsColumn,
92-
kindColumn: jsonData.traces?.kindColumn,
93-
statusCodeColumn: jsonData.traces?.statusCodeColumn,
94-
statusMessageColumn: jsonData.traces?.statusMessageColumn,
95-
stateColumn: jsonData.traces?.stateColumn,
96-
instrumentationLibraryNameColumn: jsonData.traces?.instrumentationLibraryNameColumn,
97-
instrumentationLibraryVersionColumn: jsonData.traces?.instrumentationLibraryVersionColumn,
98-
flattenNested: jsonData.traces?.flattenNested,
99-
traceEventsColumnPrefix: jsonData.traces?.traceEventsColumnPrefix,
100-
traceLinksColumnPrefix: jsonData.traces?.traceLinksColumnPrefix,
101-
},
102-
aliasTables: jsonData.aliasTables && jsonData.aliasTables.length > 0 ? jsonData.aliasTables : undefined,
103-
enableRowLimit: jsonData.enableRowLimit,
104-
enableSecureSocksProxy: jsonData.enableSecureSocksProxy,
105-
};
106-
107-
const hasDefinedValue = (obj: any): boolean => {
108-
if (obj == null) {
109-
return false;
110-
}
111-
if (typeof obj !== 'object') {
112-
return obj !== '' && obj !== undefined && obj !== null;
113-
}
114-
return Object.values(obj).some((v) => hasDefinedValue(v));
115-
};
116-
117-
const shouldBeOpen = hasDefinedValue(ADDITIONAL_SETTINGS_DEFAULTS);
11863

11964
const onLogsConfigChange = (key: keyof CHLogsConfig, value: string | boolean | string[]) => {
12065
onOptionsChange({
@@ -173,6 +118,50 @@ export const AdditionalSettingsSection = (props: Props) => {
173118
});
174119
};
175120

121+
const shallowSettingsCompare = (currentSettings: any, defaultSettings: any): boolean => {
122+
// needed for dealing with proxy object from currentSettings
123+
currentSettings = Object.assign({}, currentSettings);
124+
125+
const currentSettingsKeys = Object.keys(currentSettings);
126+
const defaultSettingsKeys = Object.keys(defaultSettings);
127+
128+
if (currentSettingsKeys.length !== defaultSettingsKeys.length) {
129+
return false;
130+
}
131+
132+
for (const key of currentSettingsKeys) {
133+
if (!defaultSettingsKeys.includes(key)) {
134+
return false;
135+
}
136+
if (currentSettings[key].length === 0 && defaultSettings[key].length === 0) {
137+
continue;
138+
}
139+
if (currentSettings[key] !== defaultSettings[key]) {
140+
return false;
141+
}
142+
}
143+
return true;
144+
};
145+
146+
const shouldBeOpen = useMemo(() => {
147+
return (
148+
jsonData.defaultDatabase ||
149+
jsonData.defaultTable ||
150+
jsonData.connMaxLifetime ||
151+
jsonData.dialTimeout ||
152+
jsonData.maxIdleConns ||
153+
jsonData.maxOpenConns ||
154+
jsonData.queryTimeout ||
155+
jsonData.validateSql ||
156+
!shallowSettingsCompare(jsonData.logs, defaultCHAdditionalSettingsConfig.logs) ||
157+
!shallowSettingsCompare(jsonData.traces, defaultCHAdditionalSettingsConfig.traces) ||
158+
(jsonData.aliasTables && jsonData.aliasTables.length > 0) ||
159+
jsonData.enableRowLimit ||
160+
jsonData.enableSecureSocksProxy ||
161+
customSettings.length > 0
162+
);
163+
}, [jsonData, customSettings]);
164+
176165
return (
177166
<Box
178167
borderStyle="solid"
@@ -296,7 +285,7 @@ export const AdditionalSettingsSection = (props: Props) => {
296285
<Field label={labels.secureSocksProxy.label} description={labels.secureSocksProxy.tooltip}>
297286
<Switch
298287
value={jsonData.enableSecureSocksProxy || false}
299-
onChange={(e) => onUpdateDatasourceJsonDataOption(props, 'enableSecureSocksProxy')(e)}
288+
onChange={(e) => onUpdateDatasourceJsonDataOptionChecked(props, 'enableSecureSocksProxy')(e)}
300289
/>
301290
</Field>
302291
)}

0 commit comments

Comments
 (0)