Skip to content

Commit 712dbd5

Browse files
authored
Merge pull request #36 from ringcentral/metric-impls-discovery
#22 Support annotation-based metric implementations discovery + #23 Add methods for setting metric implementation builders that take an appropriate interface as a parameter instead of a java.lang.Object
2 parents 50edcba + 8d2ae1a commit 712dbd5

File tree

67 files changed

+1316
-239
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+1316
-239
lines changed

README.md

Lines changed: 41 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1104,6 +1104,16 @@ Rate fullConfigRate = registry.rate(
11041104
// RATE_UNIT
11051105
// }
11061106
.measurables(COUNT)
1107+
1108+
/**
1109+
* options:
1110+
* - expMovingAverage() == {@link ExpMovingAverageRateImplConfigBuilder#expMovingAverage()},
1111+
* - custom impl, e.g. countAndMean() == {@link CountScalingRateConfigBuilder#countScaling()}.
1112+
* Custom impls must be registered: registry.extendWith(new CountScalingRateConfigBuilder()).
1113+
* default: expMovingAverage()
1114+
*/
1115+
.impl(expMovingAverage())
1116+
// .impl(countScaling().factor(2)) // custom impl
11071117

11081118
// the properties specific to the metrics implementation
11091119
// default: no properties
@@ -1291,17 +1301,20 @@ Histogram fullConfigHistogram = registry.histogram(
12911301
// default: no properties
12921302
.put("key_1", "value_1_1")
12931303

1294-
// options:
1295-
// - hdrImpl() == HdrHistogramImplConfigBuilder.hdrImpl(),
1296-
// - scaleImpl() == ScaleHistogramImplConfigBuilder.scaleImpl()
1297-
// - custom impl, e.g. LastValueHistogramImpl: lastValueImpl().
1298-
// Custom impls must be registered: registry.extendWith(LastValueHistogramImplConfig.class, new LastValueHistogramImplMaker());
1299-
// default: hdrImpl()
1300-
.with(hdrImpl()
1304+
/**
1305+
* options:
1306+
* - hdr() == {@link HdrHistogramImplConfigBuilder#hdr()},
1307+
* - scale() == {@link com.ringcentral.platform.metrics.defaultImpl.histogram.scale.configs.ScaleHistogramImplConfigBuilder#scale()},
1308+
* - custom impl, e.g. countAndTotalSum() == {@link CountAndTotalSumScalingHistogramConfigBuilder#countAndTotalSumScaling()}.
1309+
* Custom impls must be registered: registry.extendWith(new CountAndTotalSumScalingHistogramConfigBuilder()).
1310+
* default: hdr()
1311+
*/
1312+
.impl(hdr()
13011313
.resetByChunks(6, Duration.ofMinutes(2))
13021314
.highestTrackableValue(1000, REDUCE_TO_HIGHEST_TRACKABLE)
13031315
.significantDigits(3)
13041316
.snapshotTtl(30, SECONDS))
1317+
// .impl(countAndTotalSumScaling().factor(2)) // custom impl
13051318

13061319
.allSlice()
13071320
// options: disable(), enabled(boolean)
@@ -1483,23 +1496,32 @@ Timer fullConfigTimer = registry.timer(
14831496
// the properties specific to the metrics implementation
14841497
// default: no properties
14851498
.put("key_1", "value_1_1")
1486-
1487-
// options: expMovingAverageImpl() == ExpMovingAverageRateImplConfigBuilder.expMovingAverageImpl(), custom impl
1488-
// default: expMovingAverageImpl()
1489-
.with(expMovingAverageImpl())
1490-
1491-
// options:
1492-
// - hdrImpl() == HdrHistogramImplConfigBuilder.hdrImpl(),
1493-
// - scaleImpl() == ScaleHistogramImplConfigBuilder.scaleImpl()
1494-
// - custom impl, e.g. LastValueHistogramImpl: lastValueImpl().
1495-
// Custom impls must be registered: registry.extendWith(LastValueHistogramImplConfig.class, new LastValueHistogramImplMaker());
1496-
// default: hdrImpl()
1497-
.with(hdrImpl()
1499+
1500+
/**
1501+
* options:
1502+
* - expMovingAverage() == {@link ExpMovingAverageRateImplConfigBuilder#expMovingAverage()},
1503+
* - custom impl, e.g. countAndMean() == {@link CountScalingRateConfigBuilder#countScaling()}.
1504+
* Custom impls must be registered: registry.extendWith(new CountScalingRateConfigBuilder()).
1505+
* default: expMovingAverage()
1506+
*/
1507+
.impl(expMovingAverage())
1508+
// .impl(countScaling().factor(2)) // custom impl
1509+
1510+
/**
1511+
* options:
1512+
* - hdr() == {@link HdrHistogramImplConfigBuilder#hdr()},
1513+
* - scale() == {@link com.ringcentral.platform.metrics.defaultImpl.histogram.scale.configs.ScaleHistogramImplConfigBuilder#scale()},
1514+
* - custom impl, e.g. countAndTotalSum() == {@link CountAndTotalSumScalingHistogramConfigBuilder#countAndTotalSumScaling()}.
1515+
* Custom impls must be registered: registry.extendWith(new CountAndTotalSumScalingHistogramConfigBuilder()).
1516+
* default: hdr()
1517+
*/
1518+
.impl(hdr()
14981519
.resetByChunks(6, Duration.ofMinutes(2))
14991520
.lowestDiscernibleValue(MILLISECONDS.toNanos(1))
15001521
.highestTrackableValue(DAYS.toNanos(7), REDUCE_TO_HIGHEST_TRACKABLE)
15011522
.significantDigits(2)
15021523
.snapshotTtl(30, SECONDS))
1524+
// .impl(countAndTotalSumScaling().factor(2)) // custom impl
15031525

15041526
.allSlice()
15051527
// options: disable(), enabled(boolean)

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

Lines changed: 49 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
package com.ringcentral.platform.metrics;
22

3-
import com.ringcentral.platform.metrics.configs.builders.*;
3+
import com.ringcentral.platform.metrics.configs.builders.MetricConfigBuilder;
4+
import com.ringcentral.platform.metrics.configs.builders.MetricConfigBuilderProvider;
45
import com.ringcentral.platform.metrics.counter.Counter;
56
import com.ringcentral.platform.metrics.counter.configs.CounterConfig;
67
import com.ringcentral.platform.metrics.counter.configs.builders.CounterConfigBuilder;
78
import com.ringcentral.platform.metrics.dimensions.MetricDimensionValues;
89
import com.ringcentral.platform.metrics.histogram.Histogram;
910
import com.ringcentral.platform.metrics.histogram.configs.HistogramConfig;
1011
import com.ringcentral.platform.metrics.histogram.configs.builders.HistogramConfigBuilder;
11-
import com.ringcentral.platform.metrics.infoProviders.*;
12+
import com.ringcentral.platform.metrics.infoProviders.ConcurrentMaskTreeMetricNamedInfoProvider;
13+
import com.ringcentral.platform.metrics.infoProviders.PredicativeMetricNamedInfoProvider;
1214
import com.ringcentral.platform.metrics.names.MetricName;
1315
import com.ringcentral.platform.metrics.predicates.MetricNamedPredicate;
1416
import com.ringcentral.platform.metrics.rate.Rate;
@@ -17,25 +19,42 @@
1719
import com.ringcentral.platform.metrics.timer.Timer;
1820
import com.ringcentral.platform.metrics.timer.configs.TimerConfig;
1921
import com.ringcentral.platform.metrics.timer.configs.builders.TimerConfigBuilder;
20-
import com.ringcentral.platform.metrics.utils.*;
21-
import com.ringcentral.platform.metrics.var.configs.*;
22-
import com.ringcentral.platform.metrics.var.doubleVar.*;
23-
import com.ringcentral.platform.metrics.var.doubleVar.configs.*;
24-
import com.ringcentral.platform.metrics.var.doubleVar.configs.builders.*;
25-
import com.ringcentral.platform.metrics.var.longVar.*;
26-
import com.ringcentral.platform.metrics.var.longVar.configs.*;
27-
import com.ringcentral.platform.metrics.var.longVar.configs.builders.*;
28-
import com.ringcentral.platform.metrics.var.objectVar.*;
29-
import com.ringcentral.platform.metrics.var.objectVar.configs.*;
30-
import com.ringcentral.platform.metrics.var.objectVar.configs.builders.*;
31-
import com.ringcentral.platform.metrics.var.stringVar.*;
32-
import com.ringcentral.platform.metrics.var.stringVar.configs.*;
33-
import com.ringcentral.platform.metrics.var.stringVar.configs.builders.*;
22+
import com.ringcentral.platform.metrics.utils.SystemTimeMsProvider;
23+
import com.ringcentral.platform.metrics.utils.TimeMsProvider;
24+
import com.ringcentral.platform.metrics.var.configs.CachingVarConfig;
25+
import com.ringcentral.platform.metrics.var.configs.VarConfig;
26+
import com.ringcentral.platform.metrics.var.doubleVar.CachingDoubleVar;
27+
import com.ringcentral.platform.metrics.var.doubleVar.DoubleVar;
28+
import com.ringcentral.platform.metrics.var.doubleVar.configs.CachingDoubleVarConfig;
29+
import com.ringcentral.platform.metrics.var.doubleVar.configs.DoubleVarConfig;
30+
import com.ringcentral.platform.metrics.var.doubleVar.configs.builders.CachingDoubleVarConfigBuilder;
31+
import com.ringcentral.platform.metrics.var.doubleVar.configs.builders.DoubleVarConfigBuilder;
32+
import com.ringcentral.platform.metrics.var.longVar.CachingLongVar;
33+
import com.ringcentral.platform.metrics.var.longVar.LongVar;
34+
import com.ringcentral.platform.metrics.var.longVar.configs.CachingLongVarConfig;
35+
import com.ringcentral.platform.metrics.var.longVar.configs.LongVarConfig;
36+
import com.ringcentral.platform.metrics.var.longVar.configs.builders.CachingLongVarConfigBuilder;
37+
import com.ringcentral.platform.metrics.var.longVar.configs.builders.LongVarConfigBuilder;
38+
import com.ringcentral.platform.metrics.var.objectVar.CachingObjectVar;
39+
import com.ringcentral.platform.metrics.var.objectVar.ObjectVar;
40+
import com.ringcentral.platform.metrics.var.objectVar.configs.CachingObjectVarConfig;
41+
import com.ringcentral.platform.metrics.var.objectVar.configs.ObjectVarConfig;
42+
import com.ringcentral.platform.metrics.var.objectVar.configs.builders.CachingObjectVarConfigBuilder;
43+
import com.ringcentral.platform.metrics.var.objectVar.configs.builders.ObjectVarConfigBuilder;
44+
import com.ringcentral.platform.metrics.var.stringVar.CachingStringVar;
45+
import com.ringcentral.platform.metrics.var.stringVar.StringVar;
46+
import com.ringcentral.platform.metrics.var.stringVar.configs.CachingStringVarConfig;
47+
import com.ringcentral.platform.metrics.var.stringVar.configs.StringVarConfig;
48+
import com.ringcentral.platform.metrics.var.stringVar.configs.builders.CachingStringVarConfigBuilder;
49+
import com.ringcentral.platform.metrics.var.stringVar.configs.builders.StringVarConfigBuilder;
3450
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
3551
import org.slf4j.Logger;
3652

37-
import java.util.*;
38-
import java.util.concurrent.*;
53+
import java.util.List;
54+
import java.util.Map;
55+
import java.util.concurrent.ConcurrentHashMap;
56+
import java.util.concurrent.CopyOnWriteArrayList;
57+
import java.util.concurrent.ScheduledExecutorService;
3958
import java.util.function.Supplier;
4059

4160
import static com.ringcentral.platform.metrics.configs.builders.BaseMetricConfigBuilder.withMetric;
@@ -162,11 +181,7 @@ Timer makeTimer(
162181
private static final Logger logger = getLogger(AbstractMetricRegistry.class);
163182

164183
protected AbstractMetricRegistry(MetricMaker metricMaker) {
165-
this(metricMaker, makeExecutor());
166-
}
167-
168-
private static ScheduledExecutorService makeExecutor() {
169-
return newSingleThreadScheduledExecutor(new BasicThreadFactory.Builder().daemon(true).build());
184+
this(metricMaker, makeDefaultExecutor());
170185
}
171186

172187
/**
@@ -175,8 +190,8 @@ private static ScheduledExecutorService makeExecutor() {
175190
protected AbstractMetricRegistry(MetricMaker metricMaker, ScheduledExecutorService executor) {
176191
this(
177192
metricMaker,
178-
new ConcurrentMaskTreeMetricNamedInfoProvider<>(),
179-
new ConcurrentMaskTreeMetricNamedInfoProvider<>(),
193+
makeDefaultModsProvider(),
194+
makeDefaultModsProvider(),
180195
executor);
181196
}
182197

@@ -189,7 +204,7 @@ protected AbstractMetricRegistry(
189204
metricMaker,
190205
preModsProvider,
191206
postModsProvider,
192-
makeExecutor());
207+
makeDefaultExecutor());
193208
}
194209

195210
/**
@@ -226,6 +241,14 @@ protected AbstractMetricRegistry(
226241
this.executor = requireNonNull(executor);
227242
}
228243

244+
public static ScheduledExecutorService makeDefaultExecutor() {
245+
return newSingleThreadScheduledExecutor(new BasicThreadFactory.Builder().daemon(true).build());
246+
}
247+
248+
public static PredicativeMetricNamedInfoProvider<MetricMod> makeDefaultModsProvider() {
249+
return new ConcurrentMaskTreeMetricNamedInfoProvider<>();
250+
}
251+
229252
@Override
230253
public synchronized void addListener(MetricRegistryListener listener) {
231254
listeners.add(listener);

metrics-facade-base/src/main/java/com/ringcentral/platform/metrics/configs/builders/AbstractMeterConfigBuilder.java

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

3-
import com.ringcentral.platform.metrics.*;
4-
import com.ringcentral.platform.metrics.configs.*;
3+
import com.ringcentral.platform.metrics.MetricContext;
4+
import com.ringcentral.platform.metrics.ModifiableMetricContext;
5+
import com.ringcentral.platform.metrics.configs.MeterConfig;
6+
import com.ringcentral.platform.metrics.configs.MeterInstanceConfig;
7+
import com.ringcentral.platform.metrics.configs.MeterSliceConfig;
58
import com.ringcentral.platform.metrics.configs.MeterSliceConfig.LevelInstanceNameProvider;
6-
import com.ringcentral.platform.metrics.dimensions.*;
9+
import com.ringcentral.platform.metrics.dimensions.MetricDimension;
10+
import com.ringcentral.platform.metrics.dimensions.MetricDimensionValues;
11+
import com.ringcentral.platform.metrics.dimensions.MetricDimensionValuesPredicate;
12+
import com.ringcentral.platform.metrics.impl.MetricImplConfigBuilder;
713
import com.ringcentral.platform.metrics.measurables.Measurable;
814
import com.ringcentral.platform.metrics.names.MetricName;
915

@@ -13,10 +19,13 @@
1319

1420
import static com.ringcentral.platform.metrics.names.MetricName.emptyMetricName;
1521
import static com.ringcentral.platform.metrics.utils.CollectionUtils.containsAllInOrder;
16-
import static com.ringcentral.platform.metrics.utils.Preconditions.*;
17-
import static java.util.Collections.*;
22+
import static com.ringcentral.platform.metrics.utils.Preconditions.checkArgument;
23+
import static com.ringcentral.platform.metrics.utils.Preconditions.checkState;
24+
import static java.util.Collections.emptyMap;
25+
import static java.util.Collections.emptySet;
1826
import static java.util.Objects.requireNonNull;
19-
import static java.util.stream.Collectors.*;
27+
import static java.util.stream.Collectors.toCollection;
28+
import static java.util.stream.Collectors.toMap;
2029

2130
@SuppressWarnings({ "unchecked", "unused", "BooleanMethodIsAlwaysInverted" })
2231
public abstract class AbstractMeterConfigBuilder<
@@ -335,6 +344,10 @@ public Impl levels(
335344
return (Impl)this;
336345
}
337346

347+
public Impl impl(MetricImplConfigBuilder configBuilder) {
348+
return with(configBuilder);
349+
}
350+
338351
public Impl put(Object key, Object value) {
339352
context.put(key, value);
340353
return (Impl)this;
@@ -515,6 +528,10 @@ public ICB measurables(Set<M> measurables) {
515528
return (ICB)this;
516529
}
517530

531+
public ICB impl(MetricImplConfigBuilder configBuilder) {
532+
return with(configBuilder);
533+
}
534+
518535
public ICB put(Object key, Object value) {
519536
context.put(key, value);
520537
return (ICB)this;

metrics-facade-base/src/main/java/com/ringcentral/platform/metrics/configs/builders/AbstractMetricConfigBuilder.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
import com.ringcentral.platform.metrics.ModifiableMetricContext;
44
import com.ringcentral.platform.metrics.configs.MetricConfig;
5-
import com.ringcentral.platform.metrics.dimensions.*;
5+
import com.ringcentral.platform.metrics.dimensions.MetricDimension;
6+
import com.ringcentral.platform.metrics.dimensions.MetricDimensionValues;
7+
import com.ringcentral.platform.metrics.impl.MetricImplConfigBuilder;
68

79
import java.util.List;
810

@@ -105,6 +107,10 @@ protected MetricDimensionValues prefixDimensionValues() {
105107
return prefixDimensionValues;
106108
}
107109

110+
public CB impl(MetricImplConfigBuilder configBuilder) {
111+
return with(configBuilder);
112+
}
113+
108114
public CB put(Object key, Object value) {
109115
context.put(key, value);
110116
return builder();
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package com.ringcentral.platform.metrics.impl;
2+
3+
public interface MetricImplConfig {}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package com.ringcentral.platform.metrics.impl;
2+
3+
public interface MetricImplConfigBuilder {}

metrics-facade-benchmark/src/main/java/com/ringcentral/platform/metrics/benchmark/histogram/HistogramSnapshotBenchmark.java

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,19 @@
99
import com.ringcentral.platform.metrics.histogram.Histogram;
1010
import com.ringcentral.platform.metrics.scale.ScaleBuilder;
1111
import org.openjdk.jmh.annotations.*;
12-
import org.openjdk.jmh.runner.*;
13-
import org.openjdk.jmh.runner.options.*;
12+
import org.openjdk.jmh.runner.Runner;
13+
import org.openjdk.jmh.runner.RunnerException;
14+
import org.openjdk.jmh.runner.options.Options;
15+
import org.openjdk.jmh.runner.options.OptionsBuilder;
1416

1517
import java.time.Duration;
1618
import java.util.Random;
1719
import java.util.concurrent.TimeUnit;
1820

1921
import static com.ringcentral.platform.metrics.counter.Counter.COUNT;
20-
import static com.ringcentral.platform.metrics.defaultImpl.histogram.hdr.configs.HdrHistogramImplConfigBuilder.hdrImpl;
22+
import static com.ringcentral.platform.metrics.defaultImpl.histogram.hdr.configs.HdrHistogramImplConfigBuilder.hdr;
2123
import static com.ringcentral.platform.metrics.defaultImpl.histogram.hdr.configs.OverflowBehavior.REDUCE_TO_HIGHEST_TRACKABLE;
24+
import static com.ringcentral.platform.metrics.defaultImpl.histogram.scale.configs.ScaleHistogramImplConfigBuilder.scale;
2225
import static com.ringcentral.platform.metrics.defaultImpl.histogram.scale.configs.ScaleHistogramImplConfigBuilder.scaleImpl;
2326
import static com.ringcentral.platform.metrics.histogram.Histogram.*;
2427
import static com.ringcentral.platform.metrics.histogram.configs.builders.HistogramConfigBuilder.withHistogram;
@@ -68,7 +71,7 @@ public static class State {
6871
PERCENTILE_75,
6972
PERCENTILE_90,
7073
PERCENTILE_99)
71-
.with(hdrImpl()
74+
.impl(hdr()
7275
.neverReset()
7376
.highestTrackableValue(HOURS.toNanos(3), REDUCE_TO_HIGHEST_TRACKABLE)
7477
.lowestDiscernibleValue(MILLISECONDS.toNanos(1))));
@@ -86,7 +89,7 @@ public static class State {
8689
PERCENTILE_75,
8790
PERCENTILE_90,
8891
PERCENTILE_99)
89-
.with(hdrImpl()
92+
.impl(hdr()
9093
.eventuallyConsistentTotals()
9194
.resetByChunks()
9295
.highestTrackableValue(HOURS.toNanos(3), REDUCE_TO_HIGHEST_TRACKABLE)
@@ -105,7 +108,7 @@ public static class State {
105108
PERCENTILE_75,
106109
PERCENTILE_90,
107110
PERCENTILE_99)
108-
.with(hdrImpl()
111+
.impl(hdr()
109112
.resetByChunks()
110113
.significantDigits(3)
111114
.highestTrackableValue(HOURS.toNanos(3), REDUCE_TO_HIGHEST_TRACKABLE)
@@ -125,7 +128,7 @@ public static class State {
125128
PERCENTILE_75,
126129
PERCENTILE_90,
127130
PERCENTILE_99)
128-
.with(scaleImpl()
131+
.impl(scaleImpl()
129132
.neverReset()
130133
.with(scale_1())));
131134

@@ -142,7 +145,7 @@ public static class State {
142145
PERCENTILE_75,
143146
PERCENTILE_90,
144147
PERCENTILE_99)
145-
.with(scaleImpl()
148+
.impl(scale()
146149
.resetByChunks()
147150
.with(scale_1())));
148151

0 commit comments

Comments
 (0)