Skip to content

Commit

Permalink
Merge pull request #17 from ringcentral/export_from_prometheus_collec…
Browse files Browse the repository at this point in the history
…torregistry

#14: support exporting metrics from Prometheus CollectorRegistry, add…
  • Loading branch information
devromik authored Aug 8, 2022
2 parents 0af9690 + 1158466 commit ab596d1
Show file tree
Hide file tree
Showing 13 changed files with 551 additions and 33 deletions.
25 changes: 25 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -1724,6 +1724,31 @@ Dependencies:
</dependency>
```

Note that ```metrics-facade-prometheus``` uses
```xml
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient_common</artifactId>
<version>...</version>
</dependency>
```

In case of conflict between the ```simpleclient_common``` version used in ```Metrics Facade``` and the one used in your project, you can resolve it with ```dependency.exclusions``` or any other available means. For example, see ```metrics-facade-samples/pom.xml```:
```xml
<dependency>
<groupId>com.ringcentral.platform.metrics</groupId>
<artifactId>metrics-facade-prometheus</artifactId>
<version>${project.version}</version>

<exclusions>
<exclusion>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient_common</artifactId>
</exclusion>
</exclusions>
</dependency>
```

Example:
```java
MetricRegistry registry = new DefaultMetricRegistry();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,27 @@
import com.ringcentral.platform.metrics.MetricRegistry;
import com.ringcentral.platform.metrics.names.MetricName;
import com.ringcentral.platform.metrics.reporters.MetricsExporter;
import com.ringcentral.platform.metrics.samples.*;
import com.ringcentral.platform.metrics.samples.prometheus.*;
import com.ringcentral.platform.metrics.samples.CompositeInstanceSamplesProvider;
import com.ringcentral.platform.metrics.samples.InstanceSamplesProvider;
import com.ringcentral.platform.metrics.samples.prometheus.PrometheusInstanceSample;
import com.ringcentral.platform.metrics.samples.prometheus.PrometheusInstanceSamplesProvider;
import com.ringcentral.platform.metrics.samples.prometheus.PrometheusSample;
import com.ringcentral.platform.metrics.samples.prometheus.collectorRegistry.SimpleCollectorRegistryPrometheusInstanceSamplesProvider;
import com.ringcentral.platform.metrics.utils.StringBuilderWriter;
import io.prometheus.client.CollectorRegistry;
import io.prometheus.client.exporter.common.TextFormat;
import org.slf4j.Logger;

import java.io.*;
import java.io.IOException;
import java.io.Writer;
import java.util.*;

import static com.ringcentral.platform.metrics.reporters.prometheus.PrometheusMetricsExporter.Format.PROMETHEUS_TEXT_O_O_4;
import static io.prometheus.client.Collector.*;
import static java.lang.String.*;
import static java.util.Collections.*;
import static io.prometheus.client.Collector.MetricFamilySamples;
import static io.prometheus.client.Collector.sanitizeMetricName;
import static java.lang.String.join;
import static java.util.Collections.emptyList;
import static java.util.Collections.enumeration;
import static java.util.stream.Collectors.toList;
import static org.slf4j.LoggerFactory.getLogger;

Expand Down Expand Up @@ -48,6 +56,12 @@ public PrometheusMetricsExporter(MetricRegistry registry) {
this(new PrometheusInstanceSamplesProvider(registry));
}

public PrometheusMetricsExporter(MetricRegistry registry, CollectorRegistry... collectorRegistries) {
this(
new PrometheusInstanceSamplesProvider(registry),
new SimpleCollectorRegistryPrometheusInstanceSamplesProvider(collectorRegistries));
}

public PrometheusMetricsExporter(
MetricRegistry registry,
boolean convertNameToLowercase,
Expand Down Expand Up @@ -200,10 +214,7 @@ private void exportInstanceSample(PrometheusInstanceSample is, Map<MetricName, M
}

private MetricFamilySamples toMetricFamilySamples(PrometheusInstanceSample is) {
String name =
convertNameToLowercase ?
sanitizeMetricName(join(NAME_PARTS_DELIMITER, is.name())).toLowerCase(locale) :
sanitizeMetricName(join(NAME_PARTS_DELIMITER, is.name()));
String name = buildName(is.name());

return new MetricFamilySamples(
name,
Expand All @@ -213,11 +224,10 @@ private MetricFamilySamples toMetricFamilySamples(PrometheusInstanceSample is) {
.map(s -> {
String sampleName = name;

if (s.hasNameSuffix()) {
sampleName +=
convertNameToLowercase ?
sanitizeMetricName(s.nameSuffix()).toLowerCase(locale) :
sanitizeMetricName(s.nameSuffix());
if (s.hasName()) {
sampleName = buildName(s.name());
} else if (s.hasNameSuffix()) {
sampleName += buildNameSuffix(s);
}

return new MetricFamilySamples.Sample(
Expand All @@ -229,6 +239,17 @@ private MetricFamilySamples toMetricFamilySamples(PrometheusInstanceSample is) {
.collect(toList()));
}

private String buildName(MetricName name) {
final var sanitizedName = sanitizeMetricName(join(NAME_PARTS_DELIMITER, name));
return convertNameToLowercase ? sanitizedName.toLowerCase(locale) : sanitizedName;
}

private String buildNameSuffix(PrometheusSample ps) {
final var suffix = ps.nameSuffix();
final var sanitizedSuffix = sanitizeMetricName(suffix);
return convertNameToLowercase ? sanitizedSuffix.toLowerCase(locale) : sanitizedSuffix;
}

private static String helpFor(PrometheusInstanceSample is) {
return
is.hasDescription() ?
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package com.ringcentral.platform.metrics.samples.prometheus;

import com.ringcentral.platform.metrics.MetricRegistry;
import com.ringcentral.platform.metrics.infoProviders.PredicativeMetricNamedInfoProvider;
import com.ringcentral.platform.metrics.samples.InstanceSampleMaker;
import com.ringcentral.platform.metrics.samples.InstanceSampleSpecProvider;
import com.ringcentral.platform.metrics.samples.SampleMaker;
import com.ringcentral.platform.metrics.samples.SampleSpecProvider;

import static java.util.Objects.requireNonNull;

public class PrometheusInstanceSamplesProviderBuilder {

private InstanceSampleSpecProvider<PrometheusInstanceSampleSpec> instanceSampleSpecProvider;
private PredicativeMetricNamedInfoProvider<InstanceSampleSpecProvider<PrometheusInstanceSampleSpec>> instanceSampleSpecModsProvider;
private InstanceSampleMaker<PrometheusSample, PrometheusInstanceSample, PrometheusInstanceSampleSpec> instanceSampleMaker;
private SampleSpecProvider<PrometheusSampleSpec, PrometheusInstanceSampleSpec> sampleSpecProvider;
private PredicativeMetricNamedInfoProvider<SampleSpecProvider<PrometheusSampleSpec, PrometheusInstanceSampleSpec>> sampleSpecModsProvider;
private SampleMaker<PrometheusSample, PrometheusSampleSpec, PrometheusInstanceSampleSpec> sampleMaker;
private final MetricRegistry metricRegistry;

public PrometheusInstanceSamplesProviderBuilder(MetricRegistry metricRegistry) {
this.metricRegistry = requireNonNull(metricRegistry);
this.instanceSampleSpecProvider = new PrometheusInstanceSampleSpecProvider();
this.instanceSampleMaker = new PrometheusInstanceSampleMaker();
this.sampleSpecProvider = new PrometheusSampleSpecProvider();
this.sampleMaker = new PrometheusSampleMaker();
}

public static PrometheusInstanceSamplesProviderBuilder prometheusInstanceSamplesProvider(MetricRegistry metricRegistry) {
return new PrometheusInstanceSamplesProviderBuilder(metricRegistry);
}

public PrometheusInstanceSamplesProviderBuilder instanceSampleSpecProvider(InstanceSampleSpecProvider<PrometheusInstanceSampleSpec> instanceSampleSpecProvider) {
this.instanceSampleSpecProvider = requireNonNull(instanceSampleSpecProvider);
return this;
}

public PrometheusInstanceSamplesProviderBuilder instanceSampleSpecModsProvider(PredicativeMetricNamedInfoProvider<InstanceSampleSpecProvider<PrometheusInstanceSampleSpec>> instanceSampleSpecModsProvider) {
this.instanceSampleSpecModsProvider = instanceSampleSpecModsProvider;
return this;
}

public PrometheusInstanceSamplesProviderBuilder instanceSampleMaker(InstanceSampleMaker<PrometheusSample, PrometheusInstanceSample, PrometheusInstanceSampleSpec> instanceSampleMaker) {
this.instanceSampleMaker = requireNonNull(instanceSampleMaker);
return this;
}

public PrometheusInstanceSamplesProviderBuilder sampleSpecProvider(SampleSpecProvider<PrometheusSampleSpec, PrometheusInstanceSampleSpec> sampleSpecProvider) {
this.sampleSpecProvider = requireNonNull(sampleSpecProvider);
return this;
}

public PrometheusInstanceSamplesProviderBuilder sampleSpecModsProvider(PredicativeMetricNamedInfoProvider<SampleSpecProvider<PrometheusSampleSpec, PrometheusInstanceSampleSpec>> sampleSpecModsProvider) {
this.sampleSpecModsProvider = sampleSpecModsProvider;
return this;
}

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

public PrometheusInstanceSamplesProvider build() {
return new PrometheusInstanceSamplesProvider(
instanceSampleSpecProvider,
instanceSampleSpecModsProvider,
instanceSampleMaker,
sampleSpecProvider,
sampleSpecModsProvider,
sampleMaker,
metricRegistry);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public class PrometheusSample implements Sample {

private final MetricName childInstanceSampleNameSuffix;
private final Collector.Type childInstanceSampleType;

private final MetricName name;
private final String nameSuffix;
private final List<String> labelNames;
private final List<String> labelValues;
Expand All @@ -22,6 +22,7 @@ public class PrometheusSample implements Sample {
public PrometheusSample(
MetricName childInstanceSampleNameSuffix,
Collector.Type childInstanceSampleType,
MetricName name,
String nameSuffix,
List<String> labelNames,
List<String> labelValues,
Expand All @@ -35,6 +36,7 @@ public PrometheusSample(
this.childInstanceSampleNameSuffix = childInstanceSampleNameSuffix;
this.childInstanceSampleType = childInstanceSampleType;

this.name = name;
this.nameSuffix = nameSuffix;
this.labelNames = labelNames != null ? labelNames : emptyList();
this.labelValues = labelValues != null ? labelValues : emptyList();
Expand All @@ -57,12 +59,21 @@ public PrometheusSample notBelongingToChildInstanceSample() {
return new PrometheusSample(
null,
null,
name,
nameSuffix,
labelNames,
labelValues,
value);
}

public boolean hasName() {
return name != null;
}

public MetricName name() {
return name;
}

public boolean hasNameSuffix() {
return nameSuffix != null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ public PrometheusSample makeSample(PrometheusSampleSpec spec, PrometheusInstance
return new PrometheusSample(
childInstanceSampleNameSuffix,
childInstanceSampleType,
null,
nameSuffix,
labelNames,
labelValues,
Expand Down
Loading

0 comments on commit ab596d1

Please sign in to comment.