Skip to content

Commit

Permalink
[6.8] [TSVB] Fixing memory leak (elastic#64918) (elastic#65076)
Browse files Browse the repository at this point in the history
  • Loading branch information
legrego authored and timroes committed May 7, 2020
1 parent 71cb9af commit 64f3d1f
Show file tree
Hide file tree
Showing 21 changed files with 106 additions and 63 deletions.
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,7 @@
"rxjs": "^6.2.1",
"script-loader": "0.7.2",
"semver": "^5.5.0",
"set-value": "^3.0.2",
"stream-stream": "^1.2.6",
"style-loader": "0.23.1",
"tar": "2.2.0",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ import mapBucket from './map_bucket';
import parseSettings from './parse_settings';
import unitToSeconds from './unit_to_seconds';

export { overwrite } from './overwrite';

export default {
bucketTransform,
getAggValue,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/*
* Licensed to Elasticsearch B.V. under one or more contributor
* license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright
* ownership. Elasticsearch B.V. licenses this file to you under
* the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/

import set from 'set-value';

/**
* Set path in obj. Behaves like lodash `set`
* @param obj The object to mutate
* @param path The path of the sub-property to set
* @param val The value to set the sub-property to
*/
export function overwrite(obj, path, val) {
set(obj, path, undefined);
set(obj, path, val);
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,17 @@
* under the License.
*/

import _ from 'lodash';
import getBucketSize from '../../helpers/get_bucket_size';
import getTimerange from '../../helpers/get_timerange';
import { overwrite } from '../../helpers';

export default function dateHistogram(req, panel, annotation) {
return next => doc => {
const timeField = annotation.time_field;
const { bucketSize, intervalString } = getBucketSize(req, 'auto');
const { from, to } = getTimerange(req);
const { timezone } = req.payload.timerange;
_.set(doc, `aggs.${annotation.id}.date_histogram`, {
overwrite(doc, `aggs.${annotation.id}.date_histogram`, {
field: timeField,
interval: intervalString,
min_doc_count: 0,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,12 @@
* under the License.
*/

import _ from 'lodash';
import { overwrite } from '../../helpers';
export default function topHits(req, panel, annotation) {
return next => doc => {
const fields = annotation.fields && annotation.fields.split(/[,\s]+/) || [];
const timeField = annotation.time_field;
_.set(doc, `aggs.${annotation.id}.aggs.hits.top_hits`, {
overwrite(doc, `aggs.${annotation.id}.aggs.hits.top_hits`, {
sort: [
{
[timeField]: { order: 'desc' }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,15 @@
import getBucketSize from '../../helpers/get_bucket_size';
import offsetTime from '../../offset_time';
import getIntervalAndTimefield from '../../get_interval_and_timefield';
import { set } from 'lodash';
import { overwrite } from '../../helpers';
export default function dateHistogram(req, panel, series) {
return next => doc => {
const { timeField, interval } = getIntervalAndTimefield(panel, series);
const { bucketSize, intervalString } = getBucketSize(req, interval);
const { from, to } = offsetTime(req, series.offset_time);
const { timezone } = req.payload.timerange;

set(doc, `aggs.${series.id}.aggs.timeseries.date_histogram`, {
overwrite(doc, `aggs.${series.id}.aggs.timeseries.date_histogram`, {
field: timeField,
interval: intervalString,
min_doc_count: 0,
Expand All @@ -38,7 +38,7 @@ export default function dateHistogram(req, panel, series) {
max: to.valueOf()
}
});
set(doc, `aggs.${series.id}.meta`, {
overwrite(doc, `aggs.${series.id}.meta`, {
timeField,
intervalString,
bucketSize
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,15 @@
/* eslint max-len:0 */
const filter = metric => metric.type === 'filter_ratio';
import bucketTransform from '../../helpers/bucket_transform';
import _ from 'lodash';
import { overwrite } from '../../helpers';
export default function ratios(req, panel, series) {
return next => doc => {
if (series.metrics.some(filter)) {
series.metrics.filter(filter).forEach(metric => {
_.set(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-numerator.filter`, {
overwrite(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-numerator.filter`, {
query_string: { query: metric.numerator || '*', analyze_wildcard: true }
});
_.set(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-denominator.filter`, {
overwrite(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-denominator.filter`, {
query_string: { query: metric.denominator || '*', analyze_wildcard: true }
});

Expand All @@ -46,13 +46,13 @@ export default function ratios(req, panel, series) {
metricAgg = {};
}
const aggBody = { metric: metricAgg };
_.set(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-numerator.aggs`, aggBody);
_.set(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-denominator.aggs`, aggBody);
overwrite(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-numerator.aggs`, aggBody);
overwrite(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-denominator.aggs`, aggBody);
numeratorPath = `${metric.id}-numerator>metric`;
denominatorPath = `${metric.id}-denominator>metric`;
}

_.set(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}`, {
overwrite(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}`, {
bucket_script: {
buckets_path: {
numerator: numeratorPath,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,11 @@
* under the License.
*/

import _ from 'lodash';
import getBucketSize from '../../helpers/get_bucket_size';
import bucketTransform from '../../helpers/bucket_transform';
import getIntervalAndTimefield from '../../get_interval_and_timefield';
import { overwrite } from '../../helpers';

export default function metricBuckets(req, panel, series) {
return next => doc => {
const {
Expand All @@ -36,7 +37,7 @@ export default function metricBuckets(req, panel, series) {
if (fn) {
try {
const bucket = fn(metric, series.metrics, intervalString);
_.set(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}`, bucket);
overwrite(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}`, bucket);
} catch (e) {
// meh
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
* under the License.
*/

import _ from 'lodash';
import { overwrite } from '../../helpers';
import getBucketSize from '../../helpers/get_bucket_size';
import bucketTransform from '../../helpers/bucket_transform';
import getIntervalAndTimefield from '../../get_interval_and_timefield';
Expand All @@ -36,7 +36,7 @@ export default function siblingBuckets(req, panel, series) {
if (fn) {
try {
const bucket = fn(metric, series.metrics, bucketSize);
_.set(doc, `aggs.${series.id}.aggs.${metric.id}`, bucket);
overwrite(doc, `aggs.${series.id}.aggs.${metric.id}`, bucket);
} catch (e) {
// meh
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,13 @@
* under the License.
*/

import _ from 'lodash';
import { overwrite } from '../../helpers';
export default function splitByEverything(req, panel, series) {
return next => doc => {
if (series.split_mode === 'everything' ||
(series.split_mode === 'terms' &&
!series.terms_field)) {
_.set(doc, `aggs.${series.id}.filter.match_all`, {});
overwrite(doc, `aggs.${series.id}.filter.match_all`, {});
}
return next(doc);
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,12 @@
* under the License.
*/

import _ from 'lodash';
import { overwrite } from '../../helpers';
export default function splitByFilter(req, panel, series) {
return next => doc => {
if (series.split_mode !== 'filter') return next(doc);
_.set(doc, `aggs.${series.id}.filter.query_string.query`, series.filter || '*');
_.set(doc, `aggs.${series.id}.filter.query_string.analyze_wildcard`, true);
overwrite(doc, `aggs.${series.id}.filter.query_string.query`, series.filter || '*');
overwrite(doc, `aggs.${series.id}.filter.query_string.analyze_wildcard`, true);
return next(doc);
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,13 @@
* under the License.
*/

import _ from 'lodash';
import { overwrite } from '../../helpers';
export default function splitByFilter(req, panel, series) {
return next => doc => {
if (series.split_mode === 'filters' && series.split_filters) {
series.split_filters.forEach(filter => {
_.set(doc, `aggs.${series.id}.filters.filters.${filter.id}.query_string.query`, filter.filter || '*');
_.set(doc, `aggs.${series.id}.filters.filters.${filter.id}.query_string.analyze_wildcard`, true);
overwrite(doc, `aggs.${series.id}.filters.filters.${filter.id}.query_string.query`, filter.filter || '*');
overwrite(doc, `aggs.${series.id}.filters.filters.${filter.id}.query_string.analyze_wildcard`, true);
});
}
return next(doc);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
* under the License.
*/

import _ from 'lodash';
import { overwrite } from '../../helpers';
import basicAggs from '../../../../../common/basic_aggs';
import getBucketsPath from '../../helpers/get_buckets_path';
import bucketTransform from '../../helpers/bucket_transform';
Expand All @@ -26,20 +26,20 @@ export default function splitByTerm(req, panel, series) {
return next => doc => {
if (series.split_mode === 'terms' && series.terms_field) {
const direction = series.terms_direction || 'desc';
_.set(doc, `aggs.${series.id}.terms.field`, series.terms_field);
_.set(doc, `aggs.${series.id}.terms.size`, series.terms_size);
overwrite(doc, `aggs.${series.id}.terms.field`, series.terms_field);
overwrite(doc, `aggs.${series.id}.terms.size`, series.terms_size);
const metric = series.metrics.find(item => item.id === series.terms_order_by);
if (metric && metric.type !== 'count' && ~basicAggs.indexOf(metric.type)) {
const sortAggKey = `${series.terms_order_by}-SORT`;
const fn = bucketTransform[metric.type];
const bucketPath = getBucketsPath(series.terms_order_by, series.metrics)
.replace(series.terms_order_by, sortAggKey);
_.set(doc, `aggs.${series.id}.terms.order`, { [bucketPath]: direction });
_.set(doc, `aggs.${series.id}.aggs`, { [sortAggKey]: fn(metric) });
overwrite(doc, `aggs.${series.id}.terms.order`, { [bucketPath]: direction });
overwrite(doc, `aggs.${series.id}.aggs`, { [sortAggKey]: fn(metric) });
} else if (['_term', '_count'].includes(series.terms_order_by)) {
_.set(doc, `aggs.${series.id}.terms.order`, { [series.terms_order_by]: direction });
overwrite(doc, `aggs.${series.id}.terms.order`, { [series.terms_order_by]: direction });
} else {
_.set(doc, `aggs.${series.id}.terms.order`, { _count: direction });
overwrite(doc, `aggs.${series.id}.terms.order`, { _count: direction });
}
}
return next(doc);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
* under the License.
*/

import { set } from 'lodash';
import { overwrite } from '../../helpers';
import getBucketSize from '../../helpers/get_bucket_size';
import getIntervalAndTimefield from '../../get_interval_and_timefield';
import getTimerange from '../../helpers/get_timerange';
Expand All @@ -30,7 +30,7 @@ export default function dateHistogram(req, panel) {
const { from, to } = getTimerange(req);
panel.series.forEach(column => {
const aggRoot = calculateAggRoot(doc, column);
set(doc, `${aggRoot}.timeseries.date_histogram`, {
overwrite(doc, `${aggRoot}.timeseries.date_histogram`, {
field: timeField,
interval: intervalString,
min_doc_count: 0,
Expand All @@ -39,7 +39,7 @@ export default function dateHistogram(req, panel) {
max: to.valueOf()
}
});
set(doc, aggRoot.replace(/\.aggs$/, '.meta'), {
overwrite(doc, aggRoot.replace(/\.aggs$/, '.meta'), {
timeField,
intervalString,
bucketSize
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,18 @@
/* eslint max-len:0 */
const filter = metric => metric.type === 'filter_ratio';
import bucketTransform from '../../helpers/bucket_transform';
import _ from 'lodash';
import { overwrite } from '../../helpers';
import { calculateAggRoot } from './calculate_agg_root';
export default function ratios(req, panel) {
return () => doc => {
panel.series.forEach(column => {
const aggRoot = calculateAggRoot(doc, column);
if (column.metrics.some(filter)) {
column.metrics.filter(filter).forEach(metric => {
_.set(doc, `${aggRoot}.timeseries.aggs.${metric.id}-numerator.filter`, {
overwrite(doc, `${aggRoot}.timeseries.aggs.${metric.id}-numerator.filter`, {
query_string: { query: metric.numerator || '*', analyze_wildcard: true }
});
_.set(doc, `${aggRoot}.timeseries.aggs.${metric.id}-denominator.filter`, {
overwrite(doc, `${aggRoot}.timeseries.aggs.${metric.id}-denominator.filter`, {
query_string: { query: metric.denominator || '*', analyze_wildcard: true }
});

Expand All @@ -45,13 +45,13 @@ export default function ratios(req, panel) {
field: metric.field
})
};
_.set(doc, `${aggRoot}.timeseries.aggs.${metric.id}-numerator.aggs`, aggBody);
_.set(doc, `${aggBody}.timeseries.aggs.${metric.id}-denominator.aggs`, aggBody);
overwrite(doc, `${aggRoot}.timeseries.aggs.${metric.id}-numerator.aggs`, aggBody);
overwrite(doc, `${aggBody}.timeseries.aggs.${metric.id}-denominator.aggs`, aggBody);
numeratorPath = `${metric.id}-numerator>metric`;
denominatorPath = `${metric.id}-denominator>metric`;
}

_.set(doc, `${aggRoot}.timeseries.aggs.${metric.id}`, {
overwrite(doc, `${aggRoot}.timeseries.aggs.${metric.id}`, {
bucket_script: {
buckets_path: {
numerator: numeratorPath,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
* under the License.
*/

import _ from 'lodash';
import { overwrite } from '../../helpers';
import getBucketSize from '../../helpers/get_bucket_size';
import bucketTransform from '../../helpers/bucket_transform';
import getIntervalAndTimefield from '../../get_interval_and_timefield';
Expand All @@ -35,7 +35,7 @@ export default function metricBuckets(req, panel) {
if (fn) {
try {
const bucket = fn(metric, column.metrics, intervalString);
_.set(doc, `${aggRoot}.timeseries.aggs.${metric.id}`, bucket);
overwrite(doc, `${aggRoot}.timeseries.aggs.${metric.id}`, bucket);
} catch (e) {
// meh
}
Expand Down
Loading

0 comments on commit 64f3d1f

Please sign in to comment.