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 all 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
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