Skip to content

Commit

Permalink
Merge pull request #35 from ringcentral/histogram-to-both-prometheus-…
Browse files Browse the repository at this point in the history
…histogram-and-summary

#33: support making both Prometheus.Summary and Prometheus.Histogram for com.ringcentral.platform.metrics.histogram.Histogram
  • Loading branch information
devromik authored Oct 3, 2022
2 parents 0887e3c + 3479516 commit 81f31e7
Show file tree
Hide file tree
Showing 27 changed files with 1,827 additions and 777 deletions.
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -1817,7 +1817,7 @@ miSampleSpecModsProvider.addMod(
(metric, instance, currSpec) ->
instanceSampleSpec().name(currSpec.name().replaceLast(currSpec.name().lastPart() + "_svc")));

PrometheusInstanceSampleMaker miSampleMaker = new PrometheusInstanceSampleMaker(
PrometheusInstanceSamplesProducer miSamplesProducer = new PrometheusInstanceSamplesProducer(
null, // totalInstanceNameSuffix. defaults to null that means no suffix
"all"); // dimensionalTotalInstanceNameSuffix. defaults to "all"

Expand All @@ -1831,15 +1831,15 @@ sampleSpecModsProvider.addMod(
(instanceSampleSpec, instance, measurableValues, measurable, currSpec) ->
measurable instanceof Max ? sampleSpec().disable() : sampleSpec());

PrometheusSampleMaker sampleMaker = new PrometheusSampleMaker();
PrometheusSamplesProducer samplesProducer = new PrometheusSamplesProducer();

PrometheusInstanceSamplesProvider miSamplesProvider = new PrometheusInstanceSamplesProvider(
miSampleSpecProvider,
miSampleSpecModsProvider,
miSampleMaker,
miSamplesProducer,
sampleSpecProvider,
sampleSpecModsProvider,
sampleMaker,
samplesProducer,
registry);

PrometheusMetricsExporter exporter = new PrometheusMetricsExporter(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,33 @@
package com.ringcentral.platform.metrics;

import com.ringcentral.platform.metrics.configs.*;
import com.ringcentral.platform.metrics.dimensions.*;
import com.ringcentral.platform.metrics.measurables.*;
import com.ringcentral.platform.metrics.configs.MeterConfig;
import com.ringcentral.platform.metrics.configs.MeterInstanceConfig;
import com.ringcentral.platform.metrics.configs.MeterSliceConfig;
import com.ringcentral.platform.metrics.dimensions.MetricDimension;
import com.ringcentral.platform.metrics.dimensions.MetricDimensionValue;
import com.ringcentral.platform.metrics.dimensions.MetricDimensionValues;
import com.ringcentral.platform.metrics.dimensions.MetricDimensionValuesPredicate;
import com.ringcentral.platform.metrics.histogram.Histogram;
import com.ringcentral.platform.metrics.measurables.Measurable;
import com.ringcentral.platform.metrics.measurables.MeasurableValues;
import com.ringcentral.platform.metrics.names.MetricName;
import com.ringcentral.platform.metrics.utils.TimeMsProvider;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.slf4j.Logger;

import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Consumer;

import static java.lang.Math.max;
import static java.lang.Math.min;
import static java.util.Collections.*;
import static java.util.concurrent.TimeUnit.*;
import static java.util.stream.Collectors.*;
import static java.util.concurrent.TimeUnit.DAYS;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static java.util.stream.Collectors.toCollection;
import static java.util.stream.Collectors.toMap;
import static org.slf4j.LoggerFactory.getLogger;

public abstract class AbstractMeter<
Expand Down Expand Up @@ -450,6 +460,8 @@ public static abstract class AbstractMeterInstance<MI> implements MeterInstance
private final MeasurableValuesProvider measurableValuesProvider;
private final Map<Measurable, MeasurableValueProvider<MI>> measurableValueProviders;
private final Set<Measurable> measurables;
private final boolean withPercentiles;
private final boolean withBuckets;
private final MI meterImpl;

protected AbstractMeterInstance(
Expand All @@ -476,6 +488,8 @@ protected AbstractMeterInstance(
this.measurableValuesProvider = measurableValuesProvider;
this.measurableValueProviders = measurableValueProviders;
this.measurables = measurableValueProviders.keySet();
this.withPercentiles = measurables().stream().anyMatch(m -> m instanceof Histogram.Percentile);
this.withBuckets = measurables().stream().anyMatch(m -> m instanceof Histogram.Bucket);
this.meterImpl = meterImpl;
}

Expand Down Expand Up @@ -514,6 +528,16 @@ public Set<Measurable> measurables() {
return measurables;
}

@Override
public boolean isWithPercentiles() {
return withPercentiles;
}

@Override
public boolean isWithBuckets() {
return withBuckets;
}

protected MI meterImpl() {
return meterImpl;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.ringcentral.platform.metrics.dimensions.MetricDimension;
import com.ringcentral.platform.metrics.dimensions.MetricDimensionUtils;
import com.ringcentral.platform.metrics.dimensions.MetricDimensionValue;
import com.ringcentral.platform.metrics.histogram.Histogram;
import com.ringcentral.platform.metrics.measurables.Measurable;
import com.ringcentral.platform.metrics.measurables.MeasurableValues;
import com.ringcentral.platform.metrics.names.MetricNamed;
Expand Down Expand Up @@ -39,6 +40,15 @@ default List<MetricDimensionValue> dimensionValuesWithout(MetricDimension dimens
boolean isLevelInstance();

Set<Measurable> measurables();

default boolean isWithPercentiles() {
return measurables().stream().anyMatch(m -> m instanceof Histogram.Percentile);
}

default boolean isWithBuckets() {
return measurables().stream().anyMatch(m -> m instanceof Histogram.Bucket);
}

MeasurableValues measurableValues();
<V> V valueOf(Measurable measurable) throws NotMeasuredException;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -499,6 +499,7 @@ public String toString() {
Bucket SEC_30_BUCKET = Bucket.of(30, SECONDS);

Bucket INF_BUCKET = Bucket.of(Double.POSITIVE_INFINITY);
Bucket NEGATIVE_INF_BUCKET = Bucket.of(Double.NEGATIVE_INFINITY);

class Buckets implements HistogramMeasurable {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package com.ringcentral.platform.metrics.samples;

import java.util.*;
import java.util.ArrayList;
import java.util.List;

import static java.util.Objects.*;
import static java.util.Objects.requireNonNull;

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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,16 @@
import com.ringcentral.platform.metrics.measurables.MeasurableValues;
import com.ringcentral.platform.metrics.var.objectVar.ObjectVar;

import java.util.*;
import java.util.LinkedHashSet;
import java.util.Set;

import static java.util.Objects.requireNonNull;

public abstract class AbstractInstanceSamplesProvider<
S extends Sample,
SS extends SampleSpec,
SSP extends SampleSpecProvider<SS, ISS>,
SM extends SampleMaker<S, SS, ISS>,
SP extends SamplesProducer<S, SS, ISS, IS>,
IS extends InstanceSample<S>,
ISS extends InstanceSampleSpec,
ISSP extends InstanceSampleSpecProvider<ISS>,
Expand All @@ -25,7 +26,7 @@ public abstract class AbstractInstanceSamplesProvider<

private final SSP sampleSpecProvider;
private final PredicativeMetricNamedInfoProvider<SSP> sampleSpecModsProvider;
private final SM sampleMaker;
private final SP samplesProducer;

private final MetricRegistry metricRegistry;

Expand All @@ -35,7 +36,7 @@ public AbstractInstanceSamplesProvider(
ISM instanceSampleMaker,
SSP sampleSpecProvider,
PredicativeMetricNamedInfoProvider<SSP> sampleSpecModsProvider,
SM sampleMaker,
SP samplesProducer,
MetricRegistry metricRegistry) {

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

this.sampleSpecProvider = requireNonNull(sampleSpecProvider);
this.sampleSpecModsProvider = sampleSpecModsProvider;
this.sampleMaker = requireNonNull(sampleMaker);
this.samplesProducer = requireNonNull(samplesProducer);

this.metricRegistry = requireNonNull(metricRegistry);
}
Expand Down Expand Up @@ -100,11 +101,7 @@ public Set<IS> instanceSamples() {
return;
}

S sample = sampleMaker.makeSample(sampleSpec, instanceSampleSpec);

if (sample != null) {
instanceSample.add(sample);
}
samplesProducer.produceSamples(sampleSpec, instanceSampleSpec, instanceSample);
});

if (!instanceSample.isEmpty()) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.ringcentral.platform.metrics.samples;

public abstract class AbstractSamplesProducer<
S extends Sample,
SS extends SampleSpec,
ISS extends InstanceSampleSpec,
IS extends InstanceSample<S>> implements SamplesProducer<S, SS, ISS, IS> {

public void produceSamples(SS spec, ISS instanceSampleSpec, IS instanceSample) {
instanceSample.add(makeSample(spec, instanceSampleSpec, instanceSample));
}

protected abstract S makeSample(SS spec, ISS instanceSampleSpec, IS instanceSample);
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.ringcentral.platform.metrics.samples;

import java.util.*;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.Set;

public class CompositeInstanceSamplesProvider<
S extends Sample,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ public class DefaultInstanceSamplesProvider extends AbstractInstanceSamplesProvi
DefaultSample,
DefaultSampleSpec,
SampleSpecProvider<DefaultSampleSpec, DefaultInstanceSampleSpec>,
SampleMaker<DefaultSample, DefaultSampleSpec, DefaultInstanceSampleSpec>,
SamplesProducer<DefaultSample, DefaultSampleSpec, DefaultInstanceSampleSpec, InstanceSample<DefaultSample>>,
InstanceSample<DefaultSample>,
DefaultInstanceSampleSpec,
InstanceSampleSpecProvider<DefaultInstanceSampleSpec>,
Expand Down Expand Up @@ -66,7 +66,7 @@ public DefaultInstanceSamplesProvider(
new DefaultInstanceSampleMaker(),
sampleSpecProvider,
sampleSpecModsProvider,
new DefaultSampleMaker(),
new DefaultSamplesProducer(),
metricRegistry);
}

Expand All @@ -76,7 +76,7 @@ public DefaultInstanceSamplesProvider(
InstanceSampleMaker<DefaultSample, InstanceSample<DefaultSample>, DefaultInstanceSampleSpec> instanceSampleMaker,
SampleSpecProvider<DefaultSampleSpec, DefaultInstanceSampleSpec> sampleSpecProvider,
PredicativeMetricNamedInfoProvider<SampleSpecProvider<DefaultSampleSpec, DefaultInstanceSampleSpec>> sampleSpecModsProvider,
SampleMaker<DefaultSample, DefaultSampleSpec, DefaultInstanceSampleSpec> sampleMaker,
SamplesProducer<DefaultSample, DefaultSampleSpec, DefaultInstanceSampleSpec, InstanceSample<DefaultSample>> samplesProducer,
MetricRegistry metricRegistry) {

super(
Expand All @@ -85,7 +85,7 @@ public DefaultInstanceSamplesProvider(
instanceSampleMaker,
sampleSpecProvider,
sampleSpecModsProvider,
sampleMaker,
samplesProducer,
metricRegistry);
}
}
Original file line number Diff line number Diff line change
@@ -1,23 +1,28 @@
package com.ringcentral.platform.metrics.samples;

import com.ringcentral.platform.metrics.dimensions.MetricDimensionValue;
import static java.lang.String.*;

public class DefaultSampleMaker implements SampleMaker<DefaultSample, DefaultSampleSpec, DefaultInstanceSampleSpec> {
import static java.lang.String.join;

public class DefaultSamplesProducer extends AbstractSamplesProducer<
DefaultSample,
DefaultSampleSpec,
DefaultInstanceSampleSpec,
InstanceSample<DefaultSample>> {

public static final String DEFAULT_NAME_PARTS_DELIMITER = ".";
public static final String DEFAULT_MEASURABLE_NAME_DELIMITER = ".";

private final String namePartsDelimiter;
private final String measurableNameDelimiter;

public DefaultSampleMaker() {
public DefaultSamplesProducer() {
this(
DEFAULT_NAME_PARTS_DELIMITER,
DEFAULT_MEASURABLE_NAME_DELIMITER);
}

public DefaultSampleMaker(
public DefaultSamplesProducer(
String namePartsDelimiter,
String measurableNameDelimiter) {

Expand All @@ -26,7 +31,11 @@ public DefaultSampleMaker(
}

@Override
public DefaultSample makeSample(DefaultSampleSpec spec, DefaultInstanceSampleSpec instanceSampleSpec) {
protected DefaultSample makeSample(
DefaultSampleSpec spec,
DefaultInstanceSampleSpec instanceSampleSpec,
InstanceSample<DefaultSample> instanceSample) {

StringBuilder nameBuilder = new StringBuilder(join(namePartsDelimiter, spec.name()));

if (spec.hasDimensionValues()) {
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.ringcentral.platform.metrics.samples;

public interface SamplesProducer<
S extends Sample,
SS extends SampleSpec,
ISS extends InstanceSampleSpec,
IS extends InstanceSample<S>> {

void produceSamples(SS spec, ISS instanceSampleSpec, IS instanceSample);
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ public void sortingBuckets() {
assertThat(INF_BUCKET.compareTo(Bucket.of(1.7)), is(1));

assertThat(INF_BUCKET.compareTo(INF_BUCKET), is(0));
assertThat(INF_BUCKET.compareTo(NEGATIVE_INF_BUCKET), is(1));
assertThat(NEGATIVE_INF_BUCKET.compareTo(INF_BUCKET), is(-1));
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ public void add(PrometheusSample sample) {
}
}
} else {
children = new ArrayList<>(2);
children = new ArrayList<>(4);
}

MetricName childName = MetricName.of(name, sample.childInstanceSampleNameSuffix());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,10 +79,7 @@ public PrometheusInstanceSample makeInstanceSample(PrometheusInstanceSampleSpec
if (instance instanceof TimerInstance || instance instanceof HistogramInstance) {
// io.micrometer.prometheus.PrometheusMeterRegistry:
// "Prometheus doesn't balk at a metric being BOTH a histogram and a summary"
type =
instance.measurables().stream().anyMatch(m -> m instanceof Histogram.Bucket) ?
HISTOGRAM :
SUMMARY;
type = instance.isWithBuckets() ? HISTOGRAM : SUMMARY;
} else if (instance instanceof CounterInstance) {
type = GAUGE;
} else if (instance instanceof RateInstance) {
Expand Down
Loading

0 comments on commit 81f31e7

Please sign in to comment.