io.opentelemetry.exporter.prometheus.PrometheusHttpServerBuilder Maven / Gradle / Ivy
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.exporter.prometheus;
import static io.opentelemetry.api.internal.Utils.checkArgument;
import static java.util.Objects.requireNonNull;
import com.sun.net.httpserver.HttpHandler;
import io.opentelemetry.sdk.common.export.MemoryMode;
import io.opentelemetry.sdk.metrics.InstrumentType;
import io.opentelemetry.sdk.metrics.export.DefaultAggregationSelector;
import io.opentelemetry.sdk.metrics.export.MetricExporter;
import io.prometheus.metrics.model.registry.PrometheusRegistry;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.function.Predicate;
import javax.annotation.Nullable;
/** A builder for {@link PrometheusHttpServer}. */
public final class PrometheusHttpServerBuilder {
static final int DEFAULT_PORT = 9464;
private static final String DEFAULT_HOST = "0.0.0.0";
private static final MemoryMode DEFAULT_MEMORY_MODE = MemoryMode.IMMUTABLE_DATA;
private String host = DEFAULT_HOST;
private int port = DEFAULT_PORT;
private PrometheusRegistry prometheusRegistry = new PrometheusRegistry();
private boolean otelScopeEnabled = true;
@Nullable private Predicate allowedResourceAttributesFilter;
@Nullable private ExecutorService executor;
private MemoryMode memoryMode = DEFAULT_MEMORY_MODE;
@Nullable private HttpHandler defaultHandler;
private DefaultAggregationSelector defaultAggregationSelector =
DefaultAggregationSelector.getDefault();
PrometheusHttpServerBuilder() {}
PrometheusHttpServerBuilder(PrometheusHttpServerBuilder builder) {
this.host = builder.host;
this.port = builder.port;
this.prometheusRegistry = builder.prometheusRegistry;
this.otelScopeEnabled = builder.otelScopeEnabled;
this.allowedResourceAttributesFilter = builder.allowedResourceAttributesFilter;
this.executor = builder.executor;
this.defaultAggregationSelector = builder.defaultAggregationSelector;
}
/** Sets the host to bind to. If unset, defaults to {@value #DEFAULT_HOST}. */
public PrometheusHttpServerBuilder setHost(String host) {
requireNonNull(host, "host");
checkArgument(!host.isEmpty(), "host must not be empty");
this.host = host;
return this;
}
/** Sets the port to bind to. If unset, defaults to {@value #DEFAULT_PORT}. */
public PrometheusHttpServerBuilder setPort(int port) {
checkArgument(port >= 0, "port must be positive");
this.port = port;
return this;
}
/** Sets the {@link ExecutorService} to be used for {@link PrometheusHttpServer}. */
public PrometheusHttpServerBuilder setExecutor(ExecutorService executor) {
requireNonNull(executor, "executor");
this.executor = executor;
return this;
}
/** Sets the {@link PrometheusRegistry} to be used for {@link PrometheusHttpServer}. */
@SuppressWarnings("UnusedReturnValue")
public PrometheusHttpServerBuilder setPrometheusRegistry(PrometheusRegistry prometheusRegistry) {
requireNonNull(prometheusRegistry, "prometheusRegistry");
this.prometheusRegistry = prometheusRegistry;
return this;
}
/** Set if the {@code otel_scope_*} attributes are generated. Default is {@code true}. */
@SuppressWarnings("UnusedReturnValue")
public PrometheusHttpServerBuilder setOtelScopeEnabled(boolean otelScopeEnabled) {
this.otelScopeEnabled = otelScopeEnabled;
return this;
}
/**
* Set if the resource attributes should be added as labels on each exported metric.
*
* If set, resource attributes will be added as labels on each exported metric if their key
* tests positive (true) when passed through {@code resourceAttributesFilter}.
*
* @param resourceAttributesFilter a predicate that returns true if the resource attribute should
* be added as a label on each exported metric. The predicates input is the resource attribute
* key.
*/
public PrometheusHttpServerBuilder setAllowedResourceAttributesFilter(
Predicate resourceAttributesFilter) {
this.allowedResourceAttributesFilter = requireNonNull(resourceAttributesFilter);
return this;
}
/**
* Set the {@link MemoryMode}.
*
* If set to {@link MemoryMode#REUSABLE_DATA}, requests are served sequentially which is
* accomplished by overriding {@link #setExecutor(ExecutorService)} to {@link
* Executors#newSingleThreadExecutor()}.
*/
public PrometheusHttpServerBuilder setMemoryMode(MemoryMode memoryMode) {
requireNonNull(memoryMode, "memoryMode");
this.memoryMode = memoryMode;
return this;
}
/**
* Override the default handler for serving the "/", "/**" endpoint.
*
*
This can be used to serve metrics on additional paths besides the default "/metrics". For
* example:
* PrometheusHttpServer.builder()
* .setPrometheusRegistry(prometheusRegistry)
* .setDefaultHandler(new MetricsHandler(prometheusRegistry))
* .build()
*
*/
public PrometheusHttpServerBuilder setDefaultHandler(HttpHandler defaultHandler) {
requireNonNull(defaultHandler, "defaultHandler");
this.defaultHandler = defaultHandler;
return this;
}
/**
* Set the {@link DefaultAggregationSelector} used for {@link
* MetricExporter#getDefaultAggregation(InstrumentType)}.
*
*
If unset, defaults to {@link DefaultAggregationSelector#getDefault()}.
*/
public PrometheusHttpServerBuilder setDefaultAggregationSelector(
DefaultAggregationSelector defaultAggregationSelector) {
requireNonNull(defaultAggregationSelector, "defaultAggregationSelector");
this.defaultAggregationSelector = defaultAggregationSelector;
return this;
}
/**
* Returns a new {@link PrometheusHttpServer} with the configuration of this builder which can be
* registered with a {@link io.opentelemetry.sdk.metrics.SdkMeterProvider}.
*/
public PrometheusHttpServer build() {
return new PrometheusHttpServer(
new PrometheusHttpServerBuilder(this), // copy to prevent modification
host,
port,
executor,
prometheusRegistry,
otelScopeEnabled,
allowedResourceAttributesFilter,
memoryMode,
defaultHandler,
defaultAggregationSelector);
}
}