TSVB wrong default date field on default index-pattern (#36519) (#36981)

Fix: #36264
This commit is contained in:
Alexey Antonov 2019-05-23 20:36:13 +03:00 committed by GitHub
parent 013235b03a
commit 4f7fc12f6b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 51 additions and 32 deletions

View file

@ -37,6 +37,7 @@ function FieldSelectUi({
onChange,
disabled,
restrict,
placeholder,
uiRestrictions,
...rest
}) {
@ -76,9 +77,7 @@ function FieldSelectUi({
return (
<EuiComboBox
placeholder={i18n.translate('tsvb.fieldSelect.selectFieldPlaceholder', {
defaultMessage: 'Select field...',
})}
placeholder={placeholder}
isDisabled={disabled}
options={options}
selectedOptions={selectedOptions}
@ -93,6 +92,9 @@ FieldSelectUi.defaultProps = {
indexPattern: '*',
disabled: false,
restrict: [],
placeholder: i18n.translate('tsvb.fieldSelect.selectFieldPlaceholder', {
defaultMessage: 'Select field...',
})
};
FieldSelectUi.propTypes = {
@ -105,6 +107,7 @@ FieldSelectUi.propTypes = {
type: PropTypes.string,
value: PropTypes.string,
uiRestrictions: PropTypes.object,
placeholder: PropTypes.string,
};
const FieldSelect = injectI18n(FieldSelectUi);

View file

@ -54,8 +54,9 @@ export const IndexPattern = props => {
};
const htmlId = htmlIdGenerator();
const model = { ...defaults, ...props.model };
const isDefaultIndexPatternUsed = model.default_index_pattern && !model[indexPatternName];
return (
<div className={props.className}>
<EuiFlexGroup responsive={false} wrap={true}>
@ -66,10 +67,10 @@ export const IndexPattern = props => {
id="tsvb.indexPatternLabel"
defaultMessage="Index pattern"
/>)}
helpText={(model.default_index_pattern && !model[indexPatternName] && <FormattedMessage
helpText={isDefaultIndexPatternUsed && <FormattedMessage
id="tsvb.indexPattern.searchByDefaultIndex"
defaultMessage="Default index pattern is used. To query all indexes use *"
/>)}
/>}
fullWidth
>
<EuiFieldText
@ -99,6 +100,7 @@ export const IndexPattern = props => {
onChange={handleSelectChange(timeFieldName)}
indexPattern={model[indexPatternName]}
fields={fields}
placeholder={isDefaultIndexPatternUsed ? model.default_timefield : undefined}
fullWidth
/>
</EuiFormRow>

View file

@ -39,11 +39,17 @@ function ReactEditorControllerProvider(Private, config) {
const savedObjectsClient = chrome.getSavedObjectsClient();
const indexPattern = await savedObjectsClient.get('index-pattern', config.get('defaultIndex'));
return indexPattern.attributes.title;
return indexPattern.attributes;
};
fetchDefaultParams = async () => {
this.state.vis.params.default_index_pattern = await this.fetchDefaultIndexPattern();
const {
title,
timeFieldName,
} = await this.fetchDefaultIndexPattern();
this.state.vis.params.default_index_pattern = title;
this.state.vis.params.default_timefield = timeFieldName;
this.state.vis.fields = await fetchIndexPatternFields(this.state.vis);
this.state.isLoaded = true;

View file

@ -64,7 +64,7 @@ export default function MetricsVisProvider(Private) {
fill: 0.5,
stacked: 'none'
}],
time_field: '@timestamp',
time_field: '',
index_pattern: '',
interval: 'auto',
axis_position: 'left',

View file

@ -17,8 +17,18 @@
* under the License.
*/
export default function getIntervalAndTimefield(panel, series = {}) {
const timeField = series.override_index_pattern && series.series_time_field || panel.time_field;
import { get } from 'lodash';
const DEFAULT_TIME_FIELD = '@timestamp';
export default function getIntervalAndTimefield(panel, series = {}, indexPatternObject) {
const getDefaultTimeField = () => get(indexPatternObject, 'timeFieldName', DEFAULT_TIME_FIELD);
const timeField = (series.override_index_pattern && series.series_time_field || panel.time_field) || getDefaultTimeField();
const interval = series.override_index_pattern && series.series_interval || panel.interval;
return { timeField, interval };
return {
timeField,
interval,
};
}

View file

@ -29,7 +29,7 @@ export async function getIndexPatternObject(req, indexPatternString) {
const savedObjectClient = req.getSavedObjectsClient();
const indexPatternObjects = await savedObjectClient.find({
type: 'index-pattern',
fields: ['title', 'fields'],
fields: ['title', 'fields', 'timeFieldName'],
search: indexPatternString ? `"${indexPatternString}"` : null,
search_fields: ['title'],
});
@ -38,9 +38,10 @@ export async function getIndexPatternObject(req, indexPatternString) {
const indexPatterns = indexPatternObjects.saved_objects
.filter(obj => obj.attributes.title === indexPatternString || (defaultIndex && obj.id === defaultIndex))
.map(indexPattern => {
const { title, fields } = indexPattern.attributes;
const { title, fields, timeFieldName } = indexPattern.attributes;
return {
title,
timeFieldName,
fields: JSON.parse(fields),
};
});

View file

@ -23,7 +23,7 @@ import getIntervalAndTimefield from '../../get_interval_and_timefield';
import { set } from 'lodash';
export default function dateHistogram(req, panel, series, esQueryConfig, indexPatternObject, capabilities) {
return next => doc => {
const { timeField, interval } = getIntervalAndTimefield(panel, series);
const { timeField, interval } = getIntervalAndTimefield(panel, series, indexPatternObject);
const { bucketSize, intervalString } = getBucketSize(req, interval, capabilities);
const { from, to } = offsetTime(req, series.offset_time);
const timezone = capabilities.searchTimezone;

View file

@ -23,9 +23,7 @@ import bucketTransform from '../../helpers/bucket_transform';
import getIntervalAndTimefield from '../../get_interval_and_timefield';
export default function metricBuckets(req, panel, series, esQueryConfig, indexPatternObject, capabilities) {
return next => doc => {
const {
interval
} = getIntervalAndTimefield(panel, series);
const { interval } = getIntervalAndTimefield(panel, series, indexPatternObject);
const {
intervalString
} = getBucketSize(req, interval, capabilities);

View file

@ -21,15 +21,15 @@ import offsetTime from '../../offset_time';
import getIntervalAndTimefield from '../../get_interval_and_timefield';
import { buildEsQuery } from '@kbn/es-query';
export default function query(req, panel, series, esQueryConfig, indexPattern) {
export default function query(req, panel, series, esQueryConfig, indexPatternObject) {
return next => doc => {
const { timeField } = getIntervalAndTimefield(panel, series);
const { timeField } = getIntervalAndTimefield(panel, series, indexPatternObject);
const { from, to } = offsetTime(req, series.offset_time);
doc.size = 0;
const queries = !panel.ignore_global_filter ? req.payload.query : [];
const filters = !panel.ignore_global_filter ? req.payload.filters : [];
doc.query = buildEsQuery(indexPattern, queries, filters, esQueryConfig);
doc.query = buildEsQuery(indexPatternObject, queries, filters, esQueryConfig);
const timerange = {
range: {

View file

@ -23,9 +23,7 @@ import bucketTransform from '../../helpers/bucket_transform';
import getIntervalAndTimefield from '../../get_interval_and_timefield';
export default function siblingBuckets(req, panel, series, esQueryConfig, indexPatternObject, capabilities) {
return next => doc => {
const {
interval
} = getIntervalAndTimefield(panel, series);
const { interval } = getIntervalAndTimefield(panel, series, indexPatternObject);
const {
bucketSize
} = getBucketSize(req, interval, capabilities);

View file

@ -25,7 +25,7 @@ import { calculateAggRoot } from './calculate_agg_root';
export default function dateHistogram(req, panel, esQueryConfig, indexPatternObject, capabilities) {
return next => doc => {
const { timeField, interval } = getIntervalAndTimefield(panel);
const { timeField, interval } = getIntervalAndTimefield(panel, {}, indexPatternObject);
const { bucketSize, intervalString } = getBucketSize(req, interval, capabilities);
const { from, to } = getTimerange(req);
const timezone = capabilities.searchTimezone;

View file

@ -22,9 +22,10 @@ import getBucketSize from '../../helpers/get_bucket_size';
import bucketTransform from '../../helpers/bucket_transform';
import getIntervalAndTimefield from '../../get_interval_and_timefield';
import { calculateAggRoot } from './calculate_agg_root';
export default function metricBuckets(req, panel) {
export default function metricBuckets(req, panel, esQueryConfig, indexPatternObject) {
return next => doc => {
const { interval } = getIntervalAndTimefield(panel);
const { interval } = getIntervalAndTimefield(panel, {}, indexPatternObject);
const { intervalString } = getBucketSize(req, interval);
panel.series.forEach(column => {
const aggRoot = calculateAggRoot(doc, column);

View file

@ -20,16 +20,16 @@ import { buildEsQuery } from '@kbn/es-query';
import getTimerange from '../../helpers/get_timerange';
import getIntervalAndTimefield from '../../get_interval_and_timefield';
export default function query(req, panel, esQueryConfig, indexPattern) {
export default function query(req, panel, esQueryConfig, indexPatternObject) {
return next => doc => {
const { timeField } = getIntervalAndTimefield(panel);
const { timeField } = getIntervalAndTimefield(panel, {}, indexPatternObject);
const { from, to } = getTimerange(req);
doc.size = 0;
const queries = !panel.ignore_global_filter ? req.payload.query : [];
const filters = !panel.ignore_global_filter ? req.payload.filters : [];
doc.query = buildEsQuery(indexPattern, queries, filters, esQueryConfig);
doc.query = buildEsQuery(indexPatternObject, queries, filters, esQueryConfig);
const timerange = {
range: {

View file

@ -22,9 +22,9 @@ import getBucketSize from '../../helpers/get_bucket_size';
import bucketTransform from '../../helpers/bucket_transform';
import getIntervalAndTimefield from '../../get_interval_and_timefield';
import { calculateAggRoot } from './calculate_agg_root';
export default function siblingBuckets(req, panel) {
export default function siblingBuckets(req, panel, esQueryConfig, indexPatternObject) {
return next => doc => {
const { interval } = getIntervalAndTimefield(panel);
const { interval } = getIntervalAndTimefield(panel, {}, indexPatternObject);
const { bucketSize } = getBucketSize(req, interval);
panel.series.forEach(column => {
const aggRoot = calculateAggRoot(doc, column);