Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#33: support making both Prometheus.Summary and Prometheus.Histogram for com.ringcentral.platform.metrics.histogram.Histogram #35

Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Expand Up @@ -4,7 +4,7 @@

import static java.util.Objects.*;

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

protected final List<S> samples;

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,
S extends Sample<S>,
SS extends SampleSpec,
SSP extends SampleSpecProvider<SS, ISS>,
SM extends SampleMaker<S, SS, ISS>,
SM extends SampleMaker<S, SS, ISS, IS>,
IS extends InstanceSample<S>,
ISS extends InstanceSampleSpec,
ISSP extends InstanceSampleSpecProvider<ISS>,
Expand Down Expand Up @@ -100,7 +101,7 @@ public Set<IS> instanceSamples() {
return;
}

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

if (sample != null) {
instanceSample.add(sample);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
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,
S extends Sample<S>,
IS extends InstanceSample<S>,
ISP extends InstanceSamplesProvider<? extends S, ? extends IS>> implements InstanceSamplesProvider<S, IS> {

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>,
SampleMaker<DefaultSample, DefaultSampleSpec, DefaultInstanceSampleSpec, InstanceSample<DefaultSample>>,
InstanceSample<DefaultSample>,
DefaultInstanceSampleSpec,
InstanceSampleSpecProvider<DefaultInstanceSampleSpec>,
Expand Down Expand Up @@ -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,
SampleMaker<DefaultSample, DefaultSampleSpec, DefaultInstanceSampleSpec, InstanceSample<DefaultSample>> sampleMaker,
MetricRegistry metricRegistry) {

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

public class DefaultSample implements Sample {
public class DefaultSample implements Sample<DefaultSample> {

private final String name;
private final Object value;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@
import com.ringcentral.platform.metrics.dimensions.MetricDimensionValue;
import static java.lang.String.*;

public class DefaultSampleMaker implements SampleMaker<DefaultSample, DefaultSampleSpec, DefaultInstanceSampleSpec> {
public class DefaultSampleMaker implements SampleMaker<
DefaultSample,
DefaultSampleSpec,
DefaultInstanceSampleSpec,
InstanceSample<DefaultSample>> {

public static final String DEFAULT_NAME_PARTS_DELIMITER = ".";
public static final String DEFAULT_MEASURABLE_NAME_DELIMITER = ".";
Expand All @@ -26,7 +30,11 @@ public DefaultSampleMaker(
}

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

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

if (spec.hasDimensionValues()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import java.util.List;

public interface InstanceSample<S extends Sample> {
public interface InstanceSample<S extends Sample<S>> {
void add(S sample);
List<S> samples();

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

public interface InstanceSampleMaker<
S extends Sample,
S extends Sample<S>,
IS extends InstanceSample<S>,
ISS extends InstanceSampleSpec> {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@

import java.util.Set;

public interface InstanceSamplesProvider<S extends Sample, IS extends InstanceSample<S>> {
public interface InstanceSamplesProvider<S extends Sample<S>, IS extends InstanceSample<S>> {
Set<IS> instanceSamples();
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,15 @@
package com.ringcentral.platform.metrics.samples;

public interface Sample {}
import java.util.List;

import static java.util.Collections.emptyList;

public interface Sample<S extends Sample<S>> {
default boolean hasChildren() {
return !children().isEmpty();
}

default List<S> children() {
return emptyList();
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
package com.ringcentral.platform.metrics.samples;

public interface SampleMaker<S extends Sample, SS extends SampleSpec, ISS extends InstanceSampleSpec> {
S makeSample(SS spec, ISS instanceSampleSpec);
public interface SampleMaker<
S extends Sample<S>,
SS extends SampleSpec,
ISS extends InstanceSampleSpec,
IS extends InstanceSample<S>> {

S makeSample(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 All @@ -86,6 +86,12 @@ public void add(PrometheusSample sample) {
} else {
super.add(sample);
}

if (sample.hasChildren()) {
for (PrometheusSample childSample : sample.children()) {
add(childSample);
}
}
}

@Override
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
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ public class PrometheusInstanceSamplesProvider extends AbstractInstanceSamplesPr
PrometheusSample,
PrometheusSampleSpec,
SampleSpecProvider<PrometheusSampleSpec, PrometheusInstanceSampleSpec>,
SampleMaker<PrometheusSample, PrometheusSampleSpec, PrometheusInstanceSampleSpec>,
SampleMaker<PrometheusSample, PrometheusSampleSpec, PrometheusInstanceSampleSpec, PrometheusInstanceSample>,
PrometheusInstanceSample,
PrometheusInstanceSampleSpec,
InstanceSampleSpecProvider<PrometheusInstanceSampleSpec>,
Expand Down Expand Up @@ -91,7 +91,7 @@ public PrometheusInstanceSamplesProvider(
InstanceSampleMaker<PrometheusSample, PrometheusInstanceSample, PrometheusInstanceSampleSpec> instanceSampleMaker,
SampleSpecProvider<PrometheusSampleSpec, PrometheusInstanceSampleSpec> sampleSpecProvider,
PredicativeMetricNamedInfoProvider<SampleSpecProvider<PrometheusSampleSpec, PrometheusInstanceSampleSpec>> sampleSpecModsProvider,
SampleMaker<PrometheusSample, PrometheusSampleSpec, PrometheusInstanceSampleSpec> sampleMaker,
SampleMaker<PrometheusSample, PrometheusSampleSpec, PrometheusInstanceSampleSpec, PrometheusInstanceSample> sampleMaker,
MetricRegistry metricRegistry) {

super(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public class PrometheusInstanceSamplesProviderBuilder {
private InstanceSampleMaker<PrometheusSample, PrometheusInstanceSample, PrometheusInstanceSampleSpec> instanceSampleMaker;
private SampleSpecProvider<PrometheusSampleSpec, PrometheusInstanceSampleSpec> sampleSpecProvider;
private PredicativeMetricNamedInfoProvider<SampleSpecProvider<PrometheusSampleSpec, PrometheusInstanceSampleSpec>> sampleSpecModsProvider;
private SampleMaker<PrometheusSample, PrometheusSampleSpec, PrometheusInstanceSampleSpec> sampleMaker;
private SampleMaker<PrometheusSample, PrometheusSampleSpec, PrometheusInstanceSampleSpec, PrometheusInstanceSample> sampleMaker;
private final MetricRegistry metricRegistry;

public PrometheusInstanceSamplesProviderBuilder(MetricRegistry metricRegistry) {
Expand Down Expand Up @@ -56,7 +56,7 @@ public PrometheusInstanceSamplesProviderBuilder sampleSpecModsProvider(Predicati
return this;
}

public PrometheusInstanceSamplesProviderBuilder sampleMaker(SampleMaker<PrometheusSample, PrometheusSampleSpec, PrometheusInstanceSampleSpec> sampleMaker) {
public PrometheusInstanceSamplesProviderBuilder sampleMaker(SampleMaker<PrometheusSample, PrometheusSampleSpec, PrometheusInstanceSampleSpec, PrometheusInstanceSample> sampleMaker) {
this.sampleMaker = requireNonNull(sampleMaker);
return this;
}
Expand Down
Loading