Skip to content

Commit dec643f

Browse files
committed
Merge remote-tracking branch 'origin/histogram-to-both-prometheus-histogram-and-summary' into release_2-1
2 parents dd707a7 + 3479516 commit dec643f

27 files changed

+1827
-777
lines changed

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1819,7 +1819,7 @@ miSampleSpecModsProvider.addMod(
18191819
(metric, instance, currSpec) ->
18201820
instanceSampleSpec().name(currSpec.name().replaceLast(currSpec.name().lastPart() + "_svc")));
18211821

1822-
PrometheusInstanceSampleMaker miSampleMaker = new PrometheusInstanceSampleMaker(
1822+
PrometheusInstanceSamplesProducer miSamplesProducer = new PrometheusInstanceSamplesProducer(
18231823
null, // totalInstanceNameSuffix. defaults to null that means no suffix
18241824
"all"); // dimensionalTotalInstanceNameSuffix. defaults to "all"
18251825

@@ -1833,15 +1833,15 @@ sampleSpecModsProvider.addMod(
18331833
(instanceSampleSpec, instance, measurableValues, measurable, currSpec) ->
18341834
measurable instanceof Max ? sampleSpec().disable() : sampleSpec());
18351835

1836-
PrometheusSampleMaker sampleMaker = new PrometheusSampleMaker();
1836+
PrometheusSamplesProducer samplesProducer = new PrometheusSamplesProducer();
18371837

18381838
PrometheusInstanceSamplesProvider miSamplesProvider = new PrometheusInstanceSamplesProvider(
18391839
miSampleSpecProvider,
18401840
miSampleSpecModsProvider,
1841-
miSampleMaker,
1841+
miSamplesProducer,
18421842
sampleSpecProvider,
18431843
sampleSpecModsProvider,
1844-
sampleMaker,
1844+
samplesProducer,
18451845
registry);
18461846

18471847
PrometheusMetricsExporter exporter = new PrometheusMetricsExporter(

metrics-facade-base/src/main/java/com/ringcentral/platform/metrics/AbstractMeter.java

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,33 @@
11
package com.ringcentral.platform.metrics;
22

3-
import com.ringcentral.platform.metrics.configs.*;
4-
import com.ringcentral.platform.metrics.dimensions.*;
5-
import com.ringcentral.platform.metrics.measurables.*;
3+
import com.ringcentral.platform.metrics.configs.MeterConfig;
4+
import com.ringcentral.platform.metrics.configs.MeterInstanceConfig;
5+
import com.ringcentral.platform.metrics.configs.MeterSliceConfig;
6+
import com.ringcentral.platform.metrics.dimensions.MetricDimension;
7+
import com.ringcentral.platform.metrics.dimensions.MetricDimensionValue;
8+
import com.ringcentral.platform.metrics.dimensions.MetricDimensionValues;
9+
import com.ringcentral.platform.metrics.dimensions.MetricDimensionValuesPredicate;
10+
import com.ringcentral.platform.metrics.histogram.Histogram;
11+
import com.ringcentral.platform.metrics.measurables.Measurable;
12+
import com.ringcentral.platform.metrics.measurables.MeasurableValues;
613
import com.ringcentral.platform.metrics.names.MetricName;
714
import com.ringcentral.platform.metrics.utils.TimeMsProvider;
815
import org.apache.commons.lang3.builder.HashCodeBuilder;
916
import org.slf4j.Logger;
1017

1118
import java.util.*;
12-
import java.util.concurrent.*;
19+
import java.util.concurrent.ConcurrentHashMap;
20+
import java.util.concurrent.ScheduledExecutorService;
1321
import java.util.concurrent.atomic.AtomicBoolean;
1422
import java.util.function.Consumer;
1523

1624
import static java.lang.Math.max;
1725
import static java.lang.Math.min;
1826
import static java.util.Collections.*;
19-
import static java.util.concurrent.TimeUnit.*;
20-
import static java.util.stream.Collectors.*;
27+
import static java.util.concurrent.TimeUnit.DAYS;
28+
import static java.util.concurrent.TimeUnit.MILLISECONDS;
29+
import static java.util.stream.Collectors.toCollection;
30+
import static java.util.stream.Collectors.toMap;
2131
import static org.slf4j.LoggerFactory.getLogger;
2232

2333
public abstract class AbstractMeter<
@@ -450,6 +460,8 @@ public static abstract class AbstractMeterInstance<MI> implements MeterInstance
450460
private final MeasurableValuesProvider measurableValuesProvider;
451461
private final Map<Measurable, MeasurableValueProvider<MI>> measurableValueProviders;
452462
private final Set<Measurable> measurables;
463+
private final boolean withPercentiles;
464+
private final boolean withBuckets;
453465
private final MI meterImpl;
454466

455467
protected AbstractMeterInstance(
@@ -476,6 +488,8 @@ protected AbstractMeterInstance(
476488
this.measurableValuesProvider = measurableValuesProvider;
477489
this.measurableValueProviders = measurableValueProviders;
478490
this.measurables = measurableValueProviders.keySet();
491+
this.withPercentiles = measurables().stream().anyMatch(m -> m instanceof Histogram.Percentile);
492+
this.withBuckets = measurables().stream().anyMatch(m -> m instanceof Histogram.Bucket);
479493
this.meterImpl = meterImpl;
480494
}
481495

@@ -514,6 +528,16 @@ public Set<Measurable> measurables() {
514528
return measurables;
515529
}
516530

531+
@Override
532+
public boolean isWithPercentiles() {
533+
return withPercentiles;
534+
}
535+
536+
@Override
537+
public boolean isWithBuckets() {
538+
return withBuckets;
539+
}
540+
517541
protected MI meterImpl() {
518542
return meterImpl;
519543
}

metrics-facade-base/src/main/java/com/ringcentral/platform/metrics/MetricInstance.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.ringcentral.platform.metrics.dimensions.MetricDimension;
44
import com.ringcentral.platform.metrics.dimensions.MetricDimensionUtils;
55
import com.ringcentral.platform.metrics.dimensions.MetricDimensionValue;
6+
import com.ringcentral.platform.metrics.histogram.Histogram;
67
import com.ringcentral.platform.metrics.measurables.Measurable;
78
import com.ringcentral.platform.metrics.measurables.MeasurableValues;
89
import com.ringcentral.platform.metrics.names.MetricNamed;
@@ -39,6 +40,15 @@ default List<MetricDimensionValue> dimensionValuesWithout(MetricDimension dimens
3940
boolean isLevelInstance();
4041

4142
Set<Measurable> measurables();
43+
44+
default boolean isWithPercentiles() {
45+
return measurables().stream().anyMatch(m -> m instanceof Histogram.Percentile);
46+
}
47+
48+
default boolean isWithBuckets() {
49+
return measurables().stream().anyMatch(m -> m instanceof Histogram.Bucket);
50+
}
51+
4252
MeasurableValues measurableValues();
4353
<V> V valueOf(Measurable measurable) throws NotMeasuredException;
4454

metrics-facade-base/src/main/java/com/ringcentral/platform/metrics/histogram/Histogram.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,7 @@ public String toString() {
499499
Bucket SEC_30_BUCKET = Bucket.of(30, SECONDS);
500500

501501
Bucket INF_BUCKET = Bucket.of(Double.POSITIVE_INFINITY);
502+
Bucket NEGATIVE_INF_BUCKET = Bucket.of(Double.NEGATIVE_INFINITY);
502503

503504
class Buckets implements HistogramMeasurable {
504505

metrics-facade-base/src/main/java/com/ringcentral/platform/metrics/samples/AbstractInstanceSample.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
package com.ringcentral.platform.metrics.samples;
22

3-
import java.util.*;
3+
import java.util.ArrayList;
4+
import java.util.List;
45

5-
import static java.util.Objects.*;
6+
import static java.util.Objects.requireNonNull;
67

78
public class AbstractInstanceSample<S extends Sample> implements InstanceSample<S> {
89

metrics-facade-base/src/main/java/com/ringcentral/platform/metrics/samples/AbstractInstanceSamplesProvider.java

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,16 @@
55
import com.ringcentral.platform.metrics.measurables.MeasurableValues;
66
import com.ringcentral.platform.metrics.var.objectVar.ObjectVar;
77

8-
import java.util.*;
8+
import java.util.LinkedHashSet;
9+
import java.util.Set;
910

1011
import static java.util.Objects.requireNonNull;
1112

1213
public abstract class AbstractInstanceSamplesProvider<
1314
S extends Sample,
1415
SS extends SampleSpec,
1516
SSP extends SampleSpecProvider<SS, ISS>,
16-
SM extends SampleMaker<S, SS, ISS>,
17+
SP extends SamplesProducer<S, SS, ISS, IS>,
1718
IS extends InstanceSample<S>,
1819
ISS extends InstanceSampleSpec,
1920
ISSP extends InstanceSampleSpecProvider<ISS>,
@@ -25,7 +26,7 @@ public abstract class AbstractInstanceSamplesProvider<
2526

2627
private final SSP sampleSpecProvider;
2728
private final PredicativeMetricNamedInfoProvider<SSP> sampleSpecModsProvider;
28-
private final SM sampleMaker;
29+
private final SP samplesProducer;
2930

3031
private final MetricRegistry metricRegistry;
3132

@@ -35,7 +36,7 @@ public AbstractInstanceSamplesProvider(
3536
ISM instanceSampleMaker,
3637
SSP sampleSpecProvider,
3738
PredicativeMetricNamedInfoProvider<SSP> sampleSpecModsProvider,
38-
SM sampleMaker,
39+
SP samplesProducer,
3940
MetricRegistry metricRegistry) {
4041

4142
this.instanceSampleSpecProvider = requireNonNull(instanceSampleSpecProvider);
@@ -44,7 +45,7 @@ public AbstractInstanceSamplesProvider(
4445

4546
this.sampleSpecProvider = requireNonNull(sampleSpecProvider);
4647
this.sampleSpecModsProvider = sampleSpecModsProvider;
47-
this.sampleMaker = requireNonNull(sampleMaker);
48+
this.samplesProducer = requireNonNull(samplesProducer);
4849

4950
this.metricRegistry = requireNonNull(metricRegistry);
5051
}
@@ -100,11 +101,7 @@ public Set<IS> instanceSamples() {
100101
return;
101102
}
102103

103-
S sample = sampleMaker.makeSample(sampleSpec, instanceSampleSpec);
104-
105-
if (sample != null) {
106-
instanceSample.add(sample);
107-
}
104+
samplesProducer.produceSamples(sampleSpec, instanceSampleSpec, instanceSample);
108105
});
109106

110107
if (!instanceSample.isEmpty()) {
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.ringcentral.platform.metrics.samples;
2+
3+
public abstract class AbstractSamplesProducer<
4+
S extends Sample,
5+
SS extends SampleSpec,
6+
ISS extends InstanceSampleSpec,
7+
IS extends InstanceSample<S>> implements SamplesProducer<S, SS, ISS, IS> {
8+
9+
public void produceSamples(SS spec, ISS instanceSampleSpec, IS instanceSample) {
10+
instanceSample.add(makeSample(spec, instanceSampleSpec, instanceSample));
11+
}
12+
13+
protected abstract S makeSample(SS spec, ISS instanceSampleSpec, IS instanceSample);
14+
}

metrics-facade-base/src/main/java/com/ringcentral/platform/metrics/samples/CompositeInstanceSamplesProvider.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.ringcentral.platform.metrics.samples;
22

3-
import java.util.*;
3+
import java.util.Collection;
4+
import java.util.LinkedHashSet;
5+
import java.util.Set;
46

57
public class CompositeInstanceSamplesProvider<
68
S extends Sample,

metrics-facade-base/src/main/java/com/ringcentral/platform/metrics/samples/DefaultInstanceSamplesProvider.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ public class DefaultInstanceSamplesProvider extends AbstractInstanceSamplesProvi
77
DefaultSample,
88
DefaultSampleSpec,
99
SampleSpecProvider<DefaultSampleSpec, DefaultInstanceSampleSpec>,
10-
SampleMaker<DefaultSample, DefaultSampleSpec, DefaultInstanceSampleSpec>,
10+
SamplesProducer<DefaultSample, DefaultSampleSpec, DefaultInstanceSampleSpec, InstanceSample<DefaultSample>>,
1111
InstanceSample<DefaultSample>,
1212
DefaultInstanceSampleSpec,
1313
InstanceSampleSpecProvider<DefaultInstanceSampleSpec>,
@@ -66,7 +66,7 @@ public DefaultInstanceSamplesProvider(
6666
new DefaultInstanceSampleMaker(),
6767
sampleSpecProvider,
6868
sampleSpecModsProvider,
69-
new DefaultSampleMaker(),
69+
new DefaultSamplesProducer(),
7070
metricRegistry);
7171
}
7272

@@ -76,7 +76,7 @@ public DefaultInstanceSamplesProvider(
7676
InstanceSampleMaker<DefaultSample, InstanceSample<DefaultSample>, DefaultInstanceSampleSpec> instanceSampleMaker,
7777
SampleSpecProvider<DefaultSampleSpec, DefaultInstanceSampleSpec> sampleSpecProvider,
7878
PredicativeMetricNamedInfoProvider<SampleSpecProvider<DefaultSampleSpec, DefaultInstanceSampleSpec>> sampleSpecModsProvider,
79-
SampleMaker<DefaultSample, DefaultSampleSpec, DefaultInstanceSampleSpec> sampleMaker,
79+
SamplesProducer<DefaultSample, DefaultSampleSpec, DefaultInstanceSampleSpec, InstanceSample<DefaultSample>> samplesProducer,
8080
MetricRegistry metricRegistry) {
8181

8282
super(
@@ -85,7 +85,7 @@ public DefaultInstanceSamplesProvider(
8585
instanceSampleMaker,
8686
sampleSpecProvider,
8787
sampleSpecModsProvider,
88-
sampleMaker,
88+
samplesProducer,
8989
metricRegistry);
9090
}
9191
}

metrics-facade-base/src/main/java/com/ringcentral/platform/metrics/samples/DefaultSampleMaker.java renamed to metrics-facade-base/src/main/java/com/ringcentral/platform/metrics/samples/DefaultSamplesProducer.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,28 @@
11
package com.ringcentral.platform.metrics.samples;
22

33
import com.ringcentral.platform.metrics.dimensions.MetricDimensionValue;
4-
import static java.lang.String.*;
54

6-
public class DefaultSampleMaker implements SampleMaker<DefaultSample, DefaultSampleSpec, DefaultInstanceSampleSpec> {
5+
import static java.lang.String.join;
6+
7+
public class DefaultSamplesProducer extends AbstractSamplesProducer<
8+
DefaultSample,
9+
DefaultSampleSpec,
10+
DefaultInstanceSampleSpec,
11+
InstanceSample<DefaultSample>> {
712

813
public static final String DEFAULT_NAME_PARTS_DELIMITER = ".";
914
public static final String DEFAULT_MEASURABLE_NAME_DELIMITER = ".";
1015

1116
private final String namePartsDelimiter;
1217
private final String measurableNameDelimiter;
1318

14-
public DefaultSampleMaker() {
19+
public DefaultSamplesProducer() {
1520
this(
1621
DEFAULT_NAME_PARTS_DELIMITER,
1722
DEFAULT_MEASURABLE_NAME_DELIMITER);
1823
}
1924

20-
public DefaultSampleMaker(
25+
public DefaultSamplesProducer(
2126
String namePartsDelimiter,
2227
String measurableNameDelimiter) {
2328

@@ -26,7 +31,11 @@ public DefaultSampleMaker(
2631
}
2732

2833
@Override
29-
public DefaultSample makeSample(DefaultSampleSpec spec, DefaultInstanceSampleSpec instanceSampleSpec) {
34+
protected DefaultSample makeSample(
35+
DefaultSampleSpec spec,
36+
DefaultInstanceSampleSpec instanceSampleSpec,
37+
InstanceSample<DefaultSample> instanceSample) {
38+
3039
StringBuilder nameBuilder = new StringBuilder(join(namePartsDelimiter, spec.name()));
3140

3241
if (spec.hasDimensionValues()) {

metrics-facade-base/src/main/java/com/ringcentral/platform/metrics/samples/SampleMaker.java

Lines changed: 0 additions & 5 deletions
This file was deleted.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.ringcentral.platform.metrics.samples;
2+
3+
public interface SamplesProducer<
4+
S extends Sample,
5+
SS extends SampleSpec,
6+
ISS extends InstanceSampleSpec,
7+
IS extends InstanceSample<S>> {
8+
9+
void produceSamples(SS spec, ISS instanceSampleSpec, IS instanceSample);
10+
}

metrics-facade-base/src/test/java/com/ringcentral/platform/metrics/histogram/HistogramTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ public void sortingBuckets() {
2525
assertThat(INF_BUCKET.compareTo(Bucket.of(1.7)), is(1));
2626

2727
assertThat(INF_BUCKET.compareTo(INF_BUCKET), is(0));
28+
assertThat(INF_BUCKET.compareTo(NEGATIVE_INF_BUCKET), is(1));
29+
assertThat(NEGATIVE_INF_BUCKET.compareTo(INF_BUCKET), is(-1));
2830
}
2931

3032
@Test

metrics-facade-prometheus/src/main/java/com/ringcentral/platform/metrics/samples/prometheus/PrometheusInstanceSample.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public void add(PrometheusSample sample) {
7070
}
7171
}
7272
} else {
73-
children = new ArrayList<>(2);
73+
children = new ArrayList<>(4);
7474
}
7575

7676
MetricName childName = MetricName.of(name, sample.childInstanceSampleNameSuffix());

metrics-facade-prometheus/src/main/java/com/ringcentral/platform/metrics/samples/prometheus/PrometheusInstanceSampleMaker.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,7 @@ public PrometheusInstanceSample makeInstanceSample(PrometheusInstanceSampleSpec
7979
if (instance instanceof TimerInstance || instance instanceof HistogramInstance) {
8080
// io.micrometer.prometheus.PrometheusMeterRegistry:
8181
// "Prometheus doesn't balk at a metric being BOTH a histogram and a summary"
82-
type =
83-
instance.measurables().stream().anyMatch(m -> m instanceof Histogram.Bucket) ?
84-
HISTOGRAM :
85-
SUMMARY;
82+
type = instance.isWithBuckets() ? HISTOGRAM : SUMMARY;
8683
} else if (instance instanceof CounterInstance) {
8784
type = GAUGE;
8885
} else if (instance instanceof RateInstance) {

0 commit comments

Comments
 (0)