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

#14: support exporting metrics from Prometheus CollectorRegistry, add… #17

Merged
merged 2 commits into from
Aug 8, 2022
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
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()) {
devromik marked this conversation as resolved.
Show resolved Hide resolved
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