The open and composable observability and data visualization platform. Visualize metrics, logs, and traces from multiple sources like Prometheus, Loki, Elasticsearch, InfluxDB, Postgres and many more.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
grafana/public/app/features/plugins/sql/components/configuration/ConnectionLimits.tsx

147 lines
4.9 KiB

import React from 'react';
import { DataSourceSettings } from '@grafana/data';
import { config } from '@grafana/runtime';
import { FieldSet, InlineField, InlineFieldRow, InlineSwitch } from '@grafana/ui';
import { NumberInput } from 'app/core/components/OptionsUI/NumberInput';
import { SQLConnectionLimits, SQLOptions } from '../../types';
interface Props<T> {
onOptionsChange: Function;
options: DataSourceSettings<SQLOptions>;
labelWidth: number;
}
export const ConnectionLimits = <T extends SQLConnectionLimits>(props: Props<T>) => {
const { onOptionsChange, options, labelWidth } = props;
const jsonData = options.jsonData;
const autoIdle = jsonData.maxIdleConnsAuto !== undefined ? jsonData.maxIdleConnsAuto : false;
// Update JSON data with new values
const updateJsonData = (values: {}) => {
const newOpts = {
...options,
jsonData: {
...jsonData,
...values,
},
};
return onOptionsChange(newOpts);
};
// For the case of idle connections and connection lifetime
// use a shared function to update respective properties
const onJSONDataNumberChanged = (property: keyof SQLConnectionLimits) => {
return (number?: number) => {
updateJsonData({ [property]: number });
};
};
// When the maximum number of connections is changed
// see if we have the automatic idle option enabled
const onMaxConnectionsChanged = (number?: number) => {
if (autoIdle && number) {
updateJsonData({
maxOpenConns: number,
maxIdleConns: number,
});
} else {
updateJsonData({
maxOpenConns: number,
});
}
};
// Update auto idle setting when control is toggled
// and set minimum idle connections if automatic
// is selected
const onConnectionIdleAutoChanged = () => {
let idleConns = undefined;
let maxConns = undefined;
// If the maximum number of open connections is undefined
// and we're setting auto idle then set the default amount
// otherwise take the numeric amount and get the value from that
if (!autoIdle) {
if (jsonData.maxOpenConns !== undefined) {
maxConns = jsonData.maxOpenConns;
idleConns = jsonData.maxOpenConns;
}
} else {
maxConns = jsonData.maxOpenConns;
idleConns = jsonData.maxIdleConns;
}
updateJsonData({
maxIdleConnsAuto: !autoIdle,
maxIdleConns: idleConns,
maxOpenConns: maxConns,
});
};
return (
<FieldSet label="Connection limits">
<InlineField
tooltip={
<span>
The maximum number of open connections to the database.If <i>Max idle connections</i> is greater than 0 and
the <i>Max open connections</i> is less than <i>Max idle connections</i>, then
<i>Max idle connections</i> will be reduced to match the <i>Max open connections</i> limit. If set to 0,
there is no limit on the number of open connections.
</span>
}
labelWidth={labelWidth}
label="Max open"
>
<NumberInput placeholder="unlimited" value={jsonData.maxOpenConns} onChange={onMaxConnectionsChanged} />
</InlineField>
<InlineFieldRow>
<InlineField
tooltip={
<span>
The maximum number of connections in the idle connection pool.If <i>Max open connections</i> is greater
than 0 but less than the <i>Max idle connections</i>, then the <i>Max idle connections</i> will be reduced
to match the <i>Max open connections</i> limit. If set to 0, no idle connections are retained.
</span>
}
labelWidth={labelWidth}
label="Max idle"
>
<NumberInput
placeholder="2"
value={jsonData.maxIdleConns}
onChange={onJSONDataNumberChanged('maxIdleConns')}
width={8}
fieldDisabled={autoIdle}
/>
</InlineField>
<InlineField
label="Auto"
labelWidth={8}
tooltip={
<span>
If enabled, automatically set the number of <i>Maximum idle connections</i> to the same value as
<i> Max open connections</i>. If the number of maximum open connections is not set it will be set to the
default ({config.sqlConnectionLimits.maxIdleConns}).
</span>
}
>
<InlineSwitch value={autoIdle} onChange={onConnectionIdleAutoChanged} />
</InlineField>
</InlineFieldRow>
<InlineField
tooltip="The maximum amount of time in seconds a connection may be reused. If set to 0, connections are reused forever."
labelWidth={labelWidth}
label="Max lifetime"
>
<NumberInput
placeholder="14400"
value={jsonData.connMaxLifetime}
onChange={onJSONDataNumberChanged('connMaxLifetime')}
></NumberInput>
</InlineField>
</FieldSet>
);
};