Skip to content

Commit aeb7f57

Browse files
martijnvgjfreden
authored andcommitted
Improve rolling up metrics (#124739)
Remove unneeded Metric abstraction in MetricFieldProducer, which speeds-up rolling up gauges/counters.
1 parent 5882197 commit aeb7f57

File tree

5 files changed

+247
-293
lines changed

5 files changed

+247
-293
lines changed

docs/changelog/124739.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pr: 124739
2+
summary: Improve rolling up metrics
3+
area: Downsampling
4+
type: enhancement
5+
issues: []

x-pack/plugin/downsample/src/main/java/org/elasticsearch/xpack/downsample/AggregateMetricFieldSerializer.java

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import java.io.IOException;
1313
import java.util.Collection;
1414

15-
public class AggregateMetricFieldSerializer implements DownsampleFieldSerializer {
15+
final class AggregateMetricFieldSerializer implements DownsampleFieldSerializer {
1616
private final Collection<AbstractDownsampleFieldProducer> producers;
1717
private final String name;
1818

@@ -22,7 +22,7 @@ public class AggregateMetricFieldSerializer implements DownsampleFieldSerializer
2222
* @param producers a collection of {@link AbstractDownsampleFieldProducer} instances with the subfields
2323
* of the aggregate_metric_double field.
2424
*/
25-
public AggregateMetricFieldSerializer(String name, Collection<AbstractDownsampleFieldProducer> producers) {
25+
AggregateMetricFieldSerializer(String name, Collection<AbstractDownsampleFieldProducer> producers) {
2626
this.name = name;
2727
this.producers = producers;
2828
}
@@ -38,8 +38,22 @@ public void write(XContentBuilder builder) throws IOException {
3838
assert name.equals(fieldProducer.name()) : "producer has a different name";
3939
if (fieldProducer.isEmpty() == false) {
4040
if (fieldProducer instanceof MetricFieldProducer metricFieldProducer) {
41-
for (MetricFieldProducer.Metric metric : metricFieldProducer.metrics()) {
42-
builder.field(metric.name(), metric.get());
41+
if (metricFieldProducer instanceof MetricFieldProducer.GaugeMetricFieldProducer gaugeProducer) {
42+
builder.field("max", gaugeProducer.max);
43+
builder.field("min", gaugeProducer.min);
44+
builder.field("sum", gaugeProducer.sum.value());
45+
builder.field("value_count", gaugeProducer.count);
46+
} else if (metricFieldProducer instanceof MetricFieldProducer.CounterMetricFieldProducer counterProducer) {
47+
builder.field("last_value", counterProducer.lastValue);
48+
} else if (metricFieldProducer instanceof MetricFieldProducer.AggregatedGaugeMetricFieldProducer producer) {
49+
switch (producer.metric) {
50+
case max -> builder.field("max", producer.max);
51+
case min -> builder.field("min", producer.min);
52+
case sum -> builder.field("sum", producer.sum.value());
53+
case value_count -> builder.field("value_count", producer.count);
54+
}
55+
} else {
56+
throw new IllegalStateException();
4357
}
4458
} else if (fieldProducer instanceof LabelFieldProducer labelFieldProducer) {
4559
LabelFieldProducer.Label label = labelFieldProducer.label();

x-pack/plugin/downsample/src/main/java/org/elasticsearch/xpack/downsample/AggregateMetricFieldValueFetcher.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,7 @@ private AbstractDownsampleFieldProducer createFieldProducer() {
4747
if (aggMetricFieldType.getMetricType() != null) {
4848
// If the field is an aggregate_metric_double field, we should use the correct subfields
4949
// for each aggregation. This is a downsample-of-downsample case
50-
MetricFieldProducer.Metric metricOperation = switch (metric) {
51-
case max -> new MetricFieldProducer.Max();
52-
case min -> new MetricFieldProducer.Min();
53-
case sum -> new MetricFieldProducer.Sum();
54-
// To compute value_count summary, we must sum all field values
55-
case value_count -> new MetricFieldProducer.Sum(AggregateMetricDoubleFieldMapper.Metric.value_count.name());
56-
};
57-
return new MetricFieldProducer.GaugeMetricFieldProducer(aggMetricFieldType.name(), metricOperation);
50+
return new MetricFieldProducer.AggregatedGaugeMetricFieldProducer(aggMetricFieldType.name(), metric);
5851
} else {
5952
// If field is not a metric, we downsample it as a label
6053
return new LabelFieldProducer.AggregateMetricFieldProducer.AggregateMetricFieldProducer(aggMetricFieldType.name(), metric);

0 commit comments

Comments
 (0)