Skip to content
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

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

Merged
merged 2 commits into from
May 23, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ function FieldSelectUi({
onChange,
disabled,
restrict,
placeholder,
uiRestrictions,
...rest
}) {
Expand Down Expand Up @@ -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}
Expand All @@ -93,6 +92,9 @@ FieldSelectUi.defaultProps = {
indexPattern: '*',
disabled: false,
restrict: [],
placeholder: i18n.translate('tsvb.fieldSelect.selectFieldPlaceholder', {
defaultMessage: 'Select field...',
})
};

FieldSelectUi.propTypes = {
Expand All @@ -105,6 +107,7 @@ FieldSelectUi.propTypes = {
type: PropTypes.string,
value: PropTypes.string,
uiRestrictions: PropTypes.object,
placeholder: PropTypes.string,
};

const FieldSelect = injectI18n(FieldSelectUi);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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}>
Expand All @@ -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
Expand Down Expand Up @@ -99,6 +100,7 @@ export const IndexPattern = props => {
onChange={handleSelectChange(timeFieldName)}
indexPattern={model[indexPatternName]}
fields={fields}
placeholder={isDefaultIndexPatternUsed ? model.default_timefield : undefined}
fullWidth
/>
</EuiFormRow>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -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'],
});
Expand All @@ -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),
};
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down