Skip to content

Commit 962f5b3

Browse files
authored
[7.x] [TSVB] Fixing memory leak (#64918) (#65058)
1 parent 445d703 commit 962f5b3

22 files changed

+128
-86
lines changed

src/plugins/vis_type_timeseries/server/lib/vis_data/helpers/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ import { getTimerange } from './get_timerange';
2929
import { mapBucket } from './map_bucket';
3030
import { parseSettings } from './parse_settings';
3131

32+
export { overwrite } from './overwrite';
33+
3234
export const helpers = {
3335
bucketTransform,
3436
getAggValue,
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
* Licensed to Elasticsearch B.V. under one or more contributor
3+
* license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright
5+
* ownership. Elasticsearch B.V. licenses this file to you under
6+
* the Apache License, Version 2.0 (the "License"); you may
7+
* not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
20+
import set from 'set-value';
21+
22+
/**
23+
* Set path in obj. Behaves like lodash `set`
24+
* @param obj The object to mutate
25+
* @param path The path of the sub-property to set
26+
* @param val The value to set the sub-property to
27+
*/
28+
export function overwrite(obj, path, val) {
29+
set(obj, path, undefined);
30+
set(obj, path, val);
31+
}

src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/annotations/date_histogram.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
* under the License.
1818
*/
1919

20-
import _ from 'lodash';
20+
import { overwrite } from '../../helpers';
2121
import { getBucketSize } from '../../helpers/get_bucket_size';
2222
import { getTimerange } from '../../helpers/get_timerange';
2323
import { search } from '../../../../../../../plugins/data/server';
@@ -37,7 +37,7 @@ export function dateHistogram(
3737
const { from, to } = getTimerange(req);
3838
const timezone = capabilities.searchTimezone;
3939

40-
_.set(doc, `aggs.${annotation.id}.date_histogram`, {
40+
overwrite(doc, `aggs.${annotation.id}.date_histogram`, {
4141
field: timeField,
4242
min_doc_count: 0,
4343
time_zone: timezone,

src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/annotations/top_hits.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@
1717
* under the License.
1818
*/
1919

20-
import _ from 'lodash';
20+
import { overwrite } from '../../helpers';
2121

2222
export function topHits(req, panel, annotation) {
2323
return next => doc => {
2424
const fields = (annotation.fields && annotation.fields.split(/[,\s]+/)) || [];
2525
const timeField = annotation.time_field;
26-
_.set(doc, `aggs.${annotation.id}.aggs.hits.top_hits`, {
26+
overwrite(doc, `aggs.${annotation.id}.aggs.hits.top_hits`, {
2727
sort: [
2828
{
2929
[timeField]: { order: 'desc' },

src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/date_histogram.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
* under the License.
1818
*/
1919

20-
import { set } from 'lodash';
20+
import { overwrite } from '../../helpers';
2121
import { getBucketSize } from '../../helpers/get_bucket_size';
2222
import { offsetTime } from '../../offset_time';
2323
import { getIntervalAndTimefield } from '../../get_interval_and_timefield';
@@ -34,7 +34,7 @@ export function dateHistogram(req, panel, series, esQueryConfig, indexPatternObj
3434
const { from, to } = offsetTime(req, series.offset_time);
3535
const timezone = capabilities.searchTimezone;
3636

37-
set(doc, `aggs.${series.id}.aggs.timeseries.date_histogram`, {
37+
overwrite(doc, `aggs.${series.id}.aggs.timeseries.date_histogram`, {
3838
field: timeField,
3939
min_doc_count: 0,
4040
time_zone: timezone,
@@ -47,7 +47,7 @@ export function dateHistogram(req, panel, series, esQueryConfig, indexPatternObj
4747
};
4848

4949
const getDateHistogramForEntireTimerangeMode = () =>
50-
set(doc, `aggs.${series.id}.aggs.timeseries.auto_date_histogram`, {
50+
overwrite(doc, `aggs.${series.id}.aggs.timeseries.auto_date_histogram`, {
5151
field: timeField,
5252
buckets: 1,
5353
});
@@ -58,7 +58,7 @@ export function dateHistogram(req, panel, series, esQueryConfig, indexPatternObj
5858

5959
// master
6060

61-
set(doc, `aggs.${series.id}.meta`, {
61+
overwrite(doc, `aggs.${series.id}.meta`, {
6262
timeField,
6363
intervalString,
6464
bucketSize,

src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/filter_ratios.js

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,16 @@
1919

2020
const filter = metric => metric.type === 'filter_ratio';
2121
import { bucketTransform } from '../../helpers/bucket_transform';
22-
import _ from 'lodash';
22+
import { overwrite } from '../../helpers';
2323

2424
export function ratios(req, panel, series) {
2525
return next => doc => {
2626
if (series.metrics.some(filter)) {
2727
series.metrics.filter(filter).forEach(metric => {
28-
_.set(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-numerator.filter`, {
28+
overwrite(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-numerator.filter`, {
2929
query_string: { query: metric.numerator || '*', analyze_wildcard: true },
3030
});
31-
_.set(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-denominator.filter`, {
31+
overwrite(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-denominator.filter`, {
3232
query_string: { query: metric.denominator || '*', analyze_wildcard: true },
3333
});
3434

@@ -46,8 +46,12 @@ export function ratios(req, panel, series) {
4646
metricAgg = {};
4747
}
4848
const aggBody = { metric: metricAgg };
49-
_.set(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-numerator.aggs`, aggBody);
50-
_.set(
49+
overwrite(
50+
doc,
51+
`aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-numerator.aggs`,
52+
aggBody
53+
);
54+
overwrite(
5155
doc,
5256
`aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-denominator.aggs`,
5357
aggBody
@@ -56,7 +60,7 @@ export function ratios(req, panel, series) {
5660
denominatorPath = `${metric.id}-denominator>metric`;
5761
}
5862

59-
_.set(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}`, {
63+
overwrite(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}`, {
6064
bucket_script: {
6165
buckets_path: {
6266
numerator: numeratorPath,

src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/metric_buckets.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@
1616
* specific language governing permissions and limitations
1717
* under the License.
1818
*/
19-
20-
import _ from 'lodash';
19+
import { overwrite } from '../../helpers';
2120
import { getBucketSize } from '../../helpers/get_bucket_size';
2221
import { bucketTransform } from '../../helpers/bucket_transform';
2322
import { getIntervalAndTimefield } from '../../get_interval_and_timefield';
@@ -33,7 +32,7 @@ export function metricBuckets(req, panel, series, esQueryConfig, indexPatternObj
3332
if (fn) {
3433
try {
3534
const bucket = fn(metric, series.metrics, intervalString);
36-
_.set(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}`, bucket);
35+
overwrite(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}`, bucket);
3736
} catch (e) {
3837
// meh
3938
}

src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/normalize_query.js

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,10 @@
1616
* specific language governing permissions and limitations
1717
* under the License.
1818
*/
19-
const { set, get, isEmpty } = require('lodash');
19+
import { overwrite } from '../../helpers';
20+
import _ from 'lodash';
2021

21-
const isEmptyFilter = (filter = {}) => Boolean(filter.match_all) && isEmpty(filter.match_all);
22+
const isEmptyFilter = (filter = {}) => Boolean(filter.match_all) && _.isEmpty(filter.match_all);
2223
const hasSiblingPipelineAggregation = (aggs = {}) => Object.keys(aggs).length > 1;
2324

2425
/* For grouping by the 'Everything', the splitByEverything request processor
@@ -30,12 +31,12 @@ const hasSiblingPipelineAggregation = (aggs = {}) => Object.keys(aggs).length >
3031
*
3132
*/
3233
function removeEmptyTopLevelAggregation(doc, series) {
33-
const filter = get(doc, `aggs.${series.id}.filter`);
34+
const filter = _.get(doc, `aggs.${series.id}.filter`);
3435

3536
if (isEmptyFilter(filter) && !hasSiblingPipelineAggregation(doc.aggs[series.id].aggs)) {
36-
const meta = get(doc, `aggs.${series.id}.meta`);
37-
set(doc, `aggs`, doc.aggs[series.id].aggs);
38-
set(doc, `aggs.timeseries.meta`, meta);
37+
const meta = _.get(doc, `aggs.${series.id}.meta`);
38+
overwrite(doc, `aggs`, doc.aggs[series.id].aggs);
39+
overwrite(doc, `aggs.timeseries.meta`, meta);
3940
}
4041

4142
return doc;

src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/positive_rate.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import { getBucketSize } from '../../helpers/get_bucket_size';
2121
import { getIntervalAndTimefield } from '../../get_interval_and_timefield';
2222
import { bucketTransform } from '../../helpers/bucket_transform';
23-
import { set } from 'lodash';
23+
import { overwrite } from '../../helpers';
2424

2525
export const filter = metric => metric.type === 'positive_rate';
2626

@@ -48,9 +48,13 @@ export const createPositiveRate = (doc, intervalString, aggRoot) => metric => {
4848
const derivativeBucket = derivativeFn(derivativeMetric, fakeSeriesMetrics, intervalString);
4949
const positiveOnlyBucket = positiveOnlyFn(positiveOnlyMetric, fakeSeriesMetrics, intervalString);
5050

51-
set(doc, `${aggRoot}.timeseries.aggs.${metric.id}-positive-rate-max`, maxBucket);
52-
set(doc, `${aggRoot}.timeseries.aggs.${metric.id}-positive-rate-derivative`, derivativeBucket);
53-
set(doc, `${aggRoot}.timeseries.aggs.${metric.id}`, positiveOnlyBucket);
51+
overwrite(doc, `${aggRoot}.timeseries.aggs.${metric.id}-positive-rate-max`, maxBucket);
52+
overwrite(
53+
doc,
54+
`${aggRoot}.timeseries.aggs.${metric.id}-positive-rate-derivative`,
55+
derivativeBucket
56+
);
57+
overwrite(doc, `${aggRoot}.timeseries.aggs.${metric.id}`, positiveOnlyBucket);
5458
};
5559

5660
export function positiveRate(req, panel, series, esQueryConfig, indexPatternObject, capabilities) {

src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/sibling_buckets.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
* under the License.
1818
*/
1919

20-
import _ from 'lodash';
20+
import { overwrite } from '../../helpers';
2121
import { getBucketSize } from '../../helpers/get_bucket_size';
2222
import { bucketTransform } from '../../helpers/bucket_transform';
2323
import { getIntervalAndTimefield } from '../../get_interval_and_timefield';
@@ -40,7 +40,7 @@ export function siblingBuckets(
4040
if (fn) {
4141
try {
4242
const bucket = fn(metric, series.metrics, bucketSize);
43-
_.set(doc, `aggs.${series.id}.aggs.${metric.id}`, bucket);
43+
overwrite(doc, `aggs.${series.id}.aggs.${metric.id}`, bucket);
4444
} catch (e) {
4545
// meh
4646
}

0 commit comments

Comments
 (0)