2019-11-08 10:02:51 +01:00
|
|
|
import React, { SyntheticEvent } from 'react';
|
2020-04-21 11:42:21 +02:00
|
|
|
import { EventsWithValidation, InlineFormLabel, regexValidation, LegacyForms } from '@grafana/ui';
|
|
|
|
|
const { Select, Input, FormField } = LegacyForms;
|
2019-12-12 11:52:03 +01:00
|
|
|
import { DataSourceSettings, SelectableValue } from '@grafana/data';
|
2019-11-08 10:02:51 +01:00
|
|
|
import { PromOptions } from '../types';
|
|
|
|
|
|
2019-11-19 13:59:39 +00:00
|
|
|
const httpOptions = [
|
|
|
|
|
{ value: 'GET', label: 'GET' },
|
|
|
|
|
{ value: 'POST', label: 'POST' },
|
|
|
|
|
];
|
2019-11-08 10:02:51 +01:00
|
|
|
|
|
|
|
|
type Props = {
|
|
|
|
|
value: DataSourceSettings<PromOptions>;
|
|
|
|
|
onChange: (value: DataSourceSettings<PromOptions>) => void;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const PromSettings = (props: Props) => {
|
|
|
|
|
const { value, onChange } = props;
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<>
|
|
|
|
|
<div className="gf-form-group">
|
|
|
|
|
<div className="gf-form-inline">
|
|
|
|
|
<div className="gf-form">
|
|
|
|
|
<FormField
|
|
|
|
|
label="Scrape interval"
|
|
|
|
|
labelWidth={13}
|
|
|
|
|
inputEl={
|
|
|
|
|
<Input
|
|
|
|
|
className="width-6"
|
|
|
|
|
value={value.jsonData.timeInterval}
|
|
|
|
|
spellCheck={false}
|
2020-04-27 18:29:41 +02:00
|
|
|
placeholder="15s"
|
2019-11-08 10:02:51 +01:00
|
|
|
onChange={onChangeHandler('timeInterval', value, onChange)}
|
2019-12-12 13:26:12 +01:00
|
|
|
validationEvents={promSettingsValidationEvents}
|
2019-11-08 10:02:51 +01:00
|
|
|
/>
|
|
|
|
|
}
|
2019-12-27 09:49:42 +01:00
|
|
|
tooltip="Set this to the typical scrape and evaluation interval configured in Prometheus. Defaults to 15s."
|
2019-11-08 10:02:51 +01:00
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div className="gf-form-inline">
|
|
|
|
|
<div className="gf-form">
|
|
|
|
|
<FormField
|
|
|
|
|
label="Query timeout"
|
|
|
|
|
labelWidth={13}
|
|
|
|
|
inputEl={
|
|
|
|
|
<Input
|
|
|
|
|
className="width-6"
|
|
|
|
|
value={value.jsonData.queryTimeout}
|
|
|
|
|
onChange={onChangeHandler('queryTimeout', value, onChange)}
|
|
|
|
|
spellCheck={false}
|
|
|
|
|
placeholder="60s"
|
2019-12-12 13:26:12 +01:00
|
|
|
validationEvents={promSettingsValidationEvents}
|
2019-11-08 10:02:51 +01:00
|
|
|
/>
|
|
|
|
|
}
|
|
|
|
|
tooltip="Set the Prometheus query timeout."
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div className="gf-form">
|
2020-04-21 11:42:21 +02:00
|
|
|
<InlineFormLabel
|
2019-11-08 10:02:51 +01:00
|
|
|
width={13}
|
|
|
|
|
tooltip="Specify the HTTP Method to query Prometheus. (POST is only available in Prometheus >= v2.1.0)"
|
|
|
|
|
>
|
|
|
|
|
HTTP Method
|
2020-04-21 11:42:21 +02:00
|
|
|
</InlineFormLabel>
|
2019-11-08 10:02:51 +01:00
|
|
|
<Select
|
|
|
|
|
options={httpOptions}
|
|
|
|
|
value={httpOptions.find(o => o.value === value.jsonData.httpMethod)}
|
|
|
|
|
onChange={onChangeHandler('httpMethod', value, onChange)}
|
|
|
|
|
width={7}
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<h3 className="page-heading">Misc</h3>
|
|
|
|
|
<div className="gf-form-group">
|
|
|
|
|
<div className="gf-form-inline">
|
|
|
|
|
<div className="gf-form max-width-30">
|
|
|
|
|
<FormField
|
|
|
|
|
label="Custom query parameters"
|
|
|
|
|
labelWidth={14}
|
|
|
|
|
tooltip="Add Custom parameters to Prometheus or Thanos queries."
|
|
|
|
|
inputEl={
|
|
|
|
|
<Input
|
|
|
|
|
className="width-25"
|
|
|
|
|
value={value.jsonData.customQueryParameters}
|
|
|
|
|
onChange={onChangeHandler('customQueryParameters', value, onChange)}
|
|
|
|
|
spellCheck={false}
|
|
|
|
|
placeholder="Example: max_source_resolution=5m&timeout=10"
|
|
|
|
|
/>
|
|
|
|
|
}
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</>
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
2019-12-12 13:26:12 +01:00
|
|
|
export const promSettingsValidationEvents = {
|
|
|
|
|
[EventsWithValidation.onBlur]: [
|
|
|
|
|
regexValidation(
|
|
|
|
|
/^$|^\d+(ms|[Mwdhmsy])$/,
|
|
|
|
|
'Value is not valid, you can use number with time unit specifier: y, M, w, d, h, m, s'
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
};
|
|
|
|
|
|
2019-12-12 11:52:03 +01:00
|
|
|
export const getValueFromEventItem = (eventItem: SyntheticEvent<HTMLInputElement> | SelectableValue<string>) => {
|
|
|
|
|
if (!eventItem) {
|
|
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (eventItem.hasOwnProperty('currentTarget')) {
|
|
|
|
|
return eventItem.currentTarget.value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return (eventItem as SelectableValue<string>).value;
|
|
|
|
|
};
|
|
|
|
|
|
2019-11-08 10:02:51 +01:00
|
|
|
const onChangeHandler = (key: keyof PromOptions, value: Props['value'], onChange: Props['onChange']) => (
|
2019-12-12 11:52:03 +01:00
|
|
|
eventItem: SyntheticEvent<HTMLInputElement> | SelectableValue<string>
|
2019-11-08 10:02:51 +01:00
|
|
|
) => {
|
|
|
|
|
onChange({
|
|
|
|
|
...value,
|
|
|
|
|
jsonData: {
|
|
|
|
|
...value.jsonData,
|
2019-12-12 11:52:03 +01:00
|
|
|
[key]: getValueFromEventItem(eventItem),
|
2019-11-08 10:02:51 +01:00
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
};
|