Move view builders to top level (#4202)

This commit is contained in:
Anuraag Agrawal 2022-02-24 09:08:05 +09:00 committed by GitHub
parent f4be86124a
commit d868eff3e1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 317 additions and 181 deletions

View File

@ -13,7 +13,9 @@ import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder;
import io.opentelemetry.sdk.metrics.common.InstrumentType; import io.opentelemetry.sdk.metrics.common.InstrumentType;
import io.opentelemetry.sdk.metrics.view.Aggregation; import io.opentelemetry.sdk.metrics.view.Aggregation;
import io.opentelemetry.sdk.metrics.view.InstrumentSelector; import io.opentelemetry.sdk.metrics.view.InstrumentSelector;
import io.opentelemetry.sdk.metrics.view.InstrumentSelectorBuilder;
import io.opentelemetry.sdk.metrics.view.MeterSelector; import io.opentelemetry.sdk.metrics.view.MeterSelector;
import io.opentelemetry.sdk.metrics.view.MeterSelectorBuilder;
import io.opentelemetry.sdk.metrics.view.View; import io.opentelemetry.sdk.metrics.view.View;
import io.opentelemetry.sdk.metrics.view.ViewBuilder; import io.opentelemetry.sdk.metrics.view.ViewBuilder;
import java.io.InputStream; import java.io.InputStream;
@ -198,7 +200,7 @@ public final class ViewConfig {
// Visible for testing // Visible for testing
static InstrumentSelector toInstrumentSelector(SelectorSpecification selectorSpec) { static InstrumentSelector toInstrumentSelector(SelectorSpecification selectorSpec) {
InstrumentSelector.Builder builder = InstrumentSelector.builder(); InstrumentSelectorBuilder builder = InstrumentSelector.builder();
String instrumentName = selectorSpec.getInstrumentName(); String instrumentName = selectorSpec.getInstrumentName();
if (instrumentName != null) { if (instrumentName != null) {
builder.setInstrumentName(instrumentName); builder.setInstrumentName(instrumentName);
@ -208,7 +210,7 @@ public final class ViewConfig {
builder.setInstrumentType(instrumentType); builder.setInstrumentType(instrumentType);
} }
MeterSelector.Builder meterBuilder = MeterSelector.builder(); MeterSelectorBuilder meterBuilder = MeterSelector.builder();
String meterName = selectorSpec.getMeterName(); String meterName = selectorSpec.getMeterName();
if (meterName != null) { if (meterName != null) {
meterBuilder.setName(meterName); meterBuilder.setName(meterName);

View File

@ -7,10 +7,7 @@ package io.opentelemetry.sdk.metrics.view;
import com.google.auto.value.AutoValue; import com.google.auto.value.AutoValue;
import io.opentelemetry.sdk.metrics.common.InstrumentType; import io.opentelemetry.sdk.metrics.common.InstrumentType;
import io.opentelemetry.sdk.metrics.internal.view.StringPredicates;
import java.util.Objects;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.regex.Pattern;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@ -22,15 +19,16 @@ import javax.annotation.concurrent.Immutable;
@Immutable @Immutable
public abstract class InstrumentSelector { public abstract class InstrumentSelector {
/** /** Returns a new {@link InstrumentSelectorBuilder} for {@link InstrumentSelector}. */
* Returns a new {@link Builder} for {@link InstrumentSelector}. public static InstrumentSelectorBuilder builder() {
* return new InstrumentSelectorBuilder();
* @return a new {@link Builder} for {@link InstrumentSelector}. }
*/
public static Builder builder() { static InstrumentSelector create(
return new AutoValue_InstrumentSelector.Builder() @Nullable InstrumentType instrumentType,
.setInstrumentNameFilter(StringPredicates.ALL) Predicate<String> instrumentNameFilter,
.setMeterSelector(MeterSelector.builder().build()); MeterSelector meterSelector) {
return new AutoValue_InstrumentSelector(instrumentType, instrumentNameFilter, meterSelector);
} }
/** /**
@ -47,62 +45,4 @@ public abstract class InstrumentSelector {
/** Returns the selections criteria for {@link io.opentelemetry.api.metrics.Meter}s. */ /** Returns the selections criteria for {@link io.opentelemetry.api.metrics.Meter}s. */
public abstract MeterSelector getMeterSelector(); public abstract MeterSelector getMeterSelector();
/** Builder for {@link InstrumentSelector} instances. */
@AutoValue.Builder
public abstract static class Builder {
/** Sets a specifier for {@link InstrumentType}. */
public abstract Builder setInstrumentType(InstrumentType instrumentType);
/**
* Sets the {@link Pattern} for instrument names that will be selected.
*
* <p>Note: The last provided of {@link #setInstrumentNameFilter}, {@link
* #setInstrumentNamePattern} {@link #setInstrumentNameRegex} and {@link #setInstrumentName} is
* used.
*/
public abstract Builder setInstrumentNameFilter(Predicate<String> instrumentNameFilter);
/**
* Sets the {@link Pattern} for instrument names that will be selected.
*
* <p>Note: The last provided of {@link #setInstrumentNameFilter}, {@link
* #setInstrumentNamePattern} {@link #setInstrumentNameRegex} and {@link #setInstrumentName} is
* used.
*/
public final Builder setInstrumentNamePattern(Pattern instrumentNamePattern) {
return setInstrumentNameFilter(StringPredicates.regex(instrumentNamePattern));
}
/**
* Sets the exact instrument name that will be selected.
*
* <p>Note: The last provided of {@link #setInstrumentNameFilter}, {@link
* #setInstrumentNamePattern} {@link #setInstrumentNameRegex} and {@link #setInstrumentName} is
* used.
*/
public final Builder setInstrumentName(String instrumentName) {
return setInstrumentNameFilter(StringPredicates.exact(instrumentName));
}
/**
* Sets a specifier for selecting Instruments by name.
*
* <p>Note: The last provided of {@link #setInstrumentNameFilter}, {@link
* #setInstrumentNamePattern} {@link #setInstrumentNameRegex} and {@link #setInstrumentName} is
* used.
*/
public final Builder setInstrumentNameRegex(String regex) {
return setInstrumentNamePattern(Pattern.compile(Objects.requireNonNull(regex, "regex")));
}
/**
* Sets the {@link MeterSelector} for which {@link io.opentelemetry.api.metrics.Meter}s will be
* included.
*/
public abstract Builder setMeterSelector(MeterSelector meterSelector);
/** Returns an InstrumentSelector instance with the content of this builder. */
public abstract InstrumentSelector build();
}
} }

View File

@ -0,0 +1,93 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.sdk.metrics.view;
import static java.util.Objects.requireNonNull;
import io.opentelemetry.sdk.metrics.common.InstrumentType;
import io.opentelemetry.sdk.metrics.internal.view.StringPredicates;
import java.util.function.Predicate;
import java.util.regex.Pattern;
import javax.annotation.Nullable;
/** Builder for {@link InstrumentSelector}. */
public final class InstrumentSelectorBuilder {
@Nullable private InstrumentType instrumentType;
private Predicate<String> instrumentNameFilter = StringPredicates.ALL;
private MeterSelector meterSelector = MeterSelector.builder().build();
/** Sets a specifier for {@link InstrumentType}. */
public InstrumentSelectorBuilder setInstrumentType(InstrumentType instrumentType) {
requireNonNull(instrumentType, "instrumentType");
this.instrumentType = instrumentType;
return this;
}
/**
* Sets the {@link Pattern} for instrument names that will be selected.
*
* <p>Note: The last provided of {@link #setInstrumentNameFilter}, {@link
* #setInstrumentNamePattern} {@link #setInstrumentNameRegex} and {@link #setInstrumentName} is
* used.
*/
public InstrumentSelectorBuilder setInstrumentNameFilter(Predicate<String> instrumentNameFilter) {
requireNonNull(instrumentNameFilter, "instrumentNameFilter");
this.instrumentNameFilter = instrumentNameFilter;
return this;
}
/**
* Sets the {@link Pattern} for instrument names that will be selected.
*
* <p>Note: The last provided of {@link #setInstrumentNameFilter}, {@link
* #setInstrumentNamePattern} {@link #setInstrumentNameRegex} and {@link #setInstrumentName} is
* used.
*/
public InstrumentSelectorBuilder setInstrumentNamePattern(Pattern instrumentNamePattern) {
requireNonNull(instrumentNamePattern, "instrumentNamePattern");
return setInstrumentNameFilter(StringPredicates.regex(instrumentNamePattern));
}
/**
* Sets the exact instrument name that will be selected.
*
* <p>Note: The last provided of {@link #setInstrumentNameFilter}, {@link
* #setInstrumentNamePattern} {@link #setInstrumentNameRegex} and {@link #setInstrumentName} is
* used.
*/
public InstrumentSelectorBuilder setInstrumentName(String instrumentName) {
requireNonNull(instrumentName, "instrumentName");
return setInstrumentNameFilter(StringPredicates.exact(instrumentName));
}
/**
* Sets a specifier for selecting Instruments by name.
*
* <p>Note: The last provided of {@link #setInstrumentNameFilter}, {@link
* #setInstrumentNamePattern} {@link #setInstrumentNameRegex} and {@link #setInstrumentName} is
* used.
*/
public InstrumentSelectorBuilder setInstrumentNameRegex(String instrumentNameRegex) {
requireNonNull(instrumentNameRegex, "instrumentNameRegex");
return setInstrumentNamePattern(Pattern.compile(instrumentNameRegex));
}
/**
* Sets the {@link MeterSelector} for which {@link io.opentelemetry.api.metrics.Meter}s will be
* included.
*/
public InstrumentSelectorBuilder setMeterSelector(MeterSelector meterSelector) {
requireNonNull(meterSelector, "meterSelector");
this.meterSelector = meterSelector;
return this;
}
/** Returns an InstrumentSelector instance with the content of this builder. */
public InstrumentSelector build() {
return InstrumentSelector.create(instrumentType, instrumentNameFilter, meterSelector);
}
}

View File

@ -6,7 +6,6 @@
package io.opentelemetry.sdk.metrics.view; package io.opentelemetry.sdk.metrics.view;
import com.google.auto.value.AutoValue; import com.google.auto.value.AutoValue;
import io.opentelemetry.sdk.metrics.internal.view.StringPredicates;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@ -19,125 +18,33 @@ import javax.annotation.concurrent.Immutable;
@Immutable @Immutable
public abstract class MeterSelector { public abstract class MeterSelector {
/** /** Returns a new {@link MeterSelectorBuilder} for {@link InstrumentSelector}. */
* Returns a new {@link Builder} for {@link InstrumentSelector}. public static MeterSelectorBuilder builder() {
* return new MeterSelectorBuilder();
* @return a new {@link Builder} for {@link InstrumentSelector}. }
*/
public static Builder builder() { static MeterSelector create(
return new AutoValue_MeterSelector.Builder() Predicate<String> nameFilter,
.setNameFilter(StringPredicates.ALL) Predicate<String> versionFilter,
.setVersionFilter(StringPredicates.ALL) Predicate<String> schemaUrlFilter) {
.setSchemaUrlFilter(StringPredicates.ALL); return new AutoValue_MeterSelector(nameFilter, versionFilter, schemaUrlFilter);
} }
/** /**
* Returns the {@link Pattern} generated by the provided {@code regex} in the {@link Builder}, or * Returns the {@link Pattern} generated by the provided {@code regex} in the {@link
* {@code Pattern.compile(".*")} if none was specified. * MeterSelectorBuilder}, or {@code Pattern.compile(".*")} if none was specified.
*/ */
public abstract Predicate<String> getNameFilter(); public abstract Predicate<String> getNameFilter();
/** /**
* Returns the {@link Pattern} generated by the provided {@code regex} in the {@link Builder}, or * Returns the {@link Pattern} generated by the provided {@code regex} in the {@link
* {@code Pattern.compile(".*")} if none was specified. * MeterSelectorBuilder}, or {@code Pattern.compile(".*")} if none was specified.
*/ */
public abstract Predicate<String> getVersionFilter(); public abstract Predicate<String> getVersionFilter();
/** /**
* Returns the {@link Pattern} generated by the provided {@code regex} in the {@link Builder}, or * Returns the {@link Pattern} generated by the provided {@code regex} in the {@link
* {@code Pattern.compile(".*")} if none was specified. * MeterSelectorBuilder}, or {@code Pattern.compile(".*")} if none was specified.
*/ */
public abstract Predicate<String> getSchemaUrlFilter(); public abstract Predicate<String> getSchemaUrlFilter();
/** Builder for {@link InstrumentSelector} instances. */
@AutoValue.Builder
public abstract static class Builder {
/**
* Sets the {@link Predicate} for matching name.
*
* <p>Note: The last provided of {@link #setNameFilter}, {@link #setNamePattern} and {@link
* #setName} is used.
*/
public abstract Builder setNameFilter(Predicate<String> filter);
/**
* Sets the {@link Pattern} for matching name.
*
* <p>Note: The last provided of {@link #setNameFilter}, {@link #setNamePattern} and {@link
* #setName} is used.
*/
public final Builder setNamePattern(Pattern pattern) {
return setNameFilter(StringPredicates.regex(pattern));
}
/**
* Sets a specifier for selecting Instruments by name.
*
* <p>Note: The last provided of {@link #setNameFilter}, {@link #setNamePattern} and {@link
* #setName} is used.
*/
public final Builder setName(String name) {
return setNameFilter(StringPredicates.exact(name));
}
/**
* Sets the {@link Predicate} for matching versions.
*
* <p>Note: The last provided of {@link #setVersionFilter}, {@link #setVersionPattern} and
* {@link #setVersion} is used.
*/
public abstract Builder setVersionFilter(Predicate<String> filter);
/**
* Sets the {@link Pattern} for matching versions.
*
* <p>Note: The last provided of {@link #setVersionFilter}, {@link #setVersionPattern} and
* {@link #setVersion} is used.
*/
public final Builder setVersionPattern(Pattern pattern) {
return setVersionFilter(StringPredicates.regex(pattern));
}
/**
* Sets a specifier for selecting Meters by version.
*
* <p>Note: The last provided of {@link #setVersionFilter}, {@link #setVersionPattern} and
* {@link #setVersion} is used.
*/
public final Builder setVersion(String version) {
return setVersionFilter(StringPredicates.exact(version));
}
/**
* Sets the {@link Predicate} for matching schema urls.
*
* <p>Note: The last provided of {@link #setSchemaUrlFilter}, {@link #setSchemaUrlPattern} and
* {@link #setSchemaUrl} is used.
*/
abstract Builder setSchemaUrlFilter(Predicate<String> filter);
/**
* Sets the {@link Pattern} for matching schema urls.
*
* <p>Note: The last provided of {@link #setSchemaUrlFilter}, {@link #setSchemaUrlPattern} and
* {@link #setSchemaUrl} is used.
*/
public final Builder setSchemaUrlPattern(Pattern pattern) {
return setSchemaUrlFilter(StringPredicates.regex(pattern));
}
/**
* Sets the schema url to match.
*
* <p>Note: The last provided of {@link #setSchemaUrlFilter}, {@link #setSchemaUrlPattern} and
* {@link #setSchemaUrl} is used.
*/
public final Builder setSchemaUrl(String url) {
return setSchemaUrlFilter(StringPredicates.exact(url));
}
/** Returns an InstrumentSelector instance with the content of this builder. */
public abstract MeterSelector build();
}
} }

View File

@ -0,0 +1,127 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.sdk.metrics.view;
import static java.util.Objects.requireNonNull;
import io.opentelemetry.sdk.metrics.internal.view.StringPredicates;
import java.util.function.Predicate;
import java.util.regex.Pattern;
/** Builder for {@link MeterSelector}. */
public final class MeterSelectorBuilder {
private Predicate<String> nameFilter = StringPredicates.ALL;
private Predicate<String> versionFilter = StringPredicates.ALL;
private Predicate<String> schemaUrlFilter = StringPredicates.ALL;
/**
* Sets the {@link Predicate} for matching name.
*
* <p>Note: The last provided of {@link #setNameFilter}, {@link #setNamePattern} and {@link
* #setName} is used.
*/
public MeterSelectorBuilder setNameFilter(Predicate<String> nameFilter) {
requireNonNull(nameFilter, "nameFilter");
this.nameFilter = nameFilter;
return this;
}
/**
* Sets the {@link Pattern} for matching name.
*
* <p>Note: The last provided of {@link #setNameFilter}, {@link #setNamePattern} and {@link
* #setName} is used.
*/
public MeterSelectorBuilder setNamePattern(Pattern pattern) {
requireNonNull(pattern, "pattern");
return setNameFilter(StringPredicates.regex(pattern));
}
/**
* Sets a specifier for selecting Instruments by name.
*
* <p>Note: The last provided of {@link #setNameFilter}, {@link #setNamePattern} and {@link
* #setName} is used.
*/
public MeterSelectorBuilder setName(String name) {
requireNonNull(name, "name");
return setNameFilter(StringPredicates.exact(name));
}
/**
* Sets the {@link Predicate} for matching versions.
*
* <p>Note: The last provided of {@link #setVersionFilter}, {@link #setVersionPattern} and {@link
* #setVersion} is used.
*/
public MeterSelectorBuilder setVersionFilter(Predicate<String> versionFilter) {
requireNonNull(versionFilter, "versionFilter");
this.versionFilter = versionFilter;
return this;
}
/**
* Sets the {@link Pattern} for matching versions.
*
* <p>Note: The last provided of {@link #setVersionFilter}, {@link #setVersionPattern} and {@link
* #setVersion} is used.
*/
public MeterSelectorBuilder setVersionPattern(Pattern pattern) {
requireNonNull(pattern, "pattern");
return setVersionFilter(StringPredicates.regex(pattern));
}
/**
* Sets a specifier for selecting Meters by version.
*
* <p>Note: The last provided of {@link #setVersionFilter}, {@link #setVersionPattern} and {@link
* #setVersion} is used.
*/
public MeterSelectorBuilder setVersion(String version) {
requireNonNull(version, "version");
return setVersionFilter(StringPredicates.exact(version));
}
/**
* Sets the {@link Predicate} for matching schema urls.
*
* <p>Note: The last provided of {@link #setSchemaUrlFilter}, {@link #setSchemaUrlPattern} and
* {@link #setSchemaUrl} is used.
*/
public MeterSelectorBuilder setSchemaUrlFilter(Predicate<String> schemaUrlFilter) {
requireNonNull(schemaUrlFilter, "schemaUrlFilter");
this.schemaUrlFilter = schemaUrlFilter;
return this;
}
/**
* Sets the {@link Pattern} for matching schema urls.
*
* <p>Note: The last provided of {@link #setSchemaUrlFilter}, {@link #setSchemaUrlPattern} and
* {@link #setSchemaUrl} is used.
*/
public MeterSelectorBuilder setSchemaUrlPattern(Pattern pattern) {
requireNonNull(pattern, "pattern");
return setSchemaUrlFilter(StringPredicates.regex(pattern));
}
/**
* Sets the schema url to match.
*
* <p>Note: The last provided of {@link #setSchemaUrlFilter}, {@link #setSchemaUrlPattern} and
* {@link #setSchemaUrl} is used.
*/
public MeterSelectorBuilder setSchemaUrl(String schemaUrl) {
requireNonNull(schemaUrl, "schemaUrl");
return setSchemaUrlFilter(StringPredicates.exact(schemaUrl));
}
/** Returns an InstrumentSelector instance with the content of this builder. */
public MeterSelector build() {
return MeterSelector.create(nameFilter, versionFilter, schemaUrlFilter);
}
}

View File

@ -0,0 +1,35 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.sdk.metrics.view;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import org.junit.jupiter.api.Test;
class InstrumentSelectorTest {
@Test
void invalidArgs() {
assertThatThrownBy(() -> InstrumentSelector.builder().setInstrumentType(null))
.isInstanceOf(NullPointerException.class)
.hasMessage("instrumentType");
assertThatThrownBy(() -> InstrumentSelector.builder().setInstrumentNameFilter(null))
.isInstanceOf(NullPointerException.class)
.hasMessage("instrumentNameFilter");
assertThatThrownBy(() -> InstrumentSelector.builder().setInstrumentNamePattern(null))
.isInstanceOf(NullPointerException.class)
.hasMessage("instrumentNamePattern");
assertThatThrownBy(() -> InstrumentSelector.builder().setInstrumentName(null))
.isInstanceOf(NullPointerException.class)
.hasMessage("instrumentName");
assertThatThrownBy(() -> InstrumentSelector.builder().setInstrumentNameRegex(null))
.isInstanceOf(NullPointerException.class)
.hasMessage("instrumentNameRegex");
assertThatThrownBy(() -> InstrumentSelector.builder().setMeterSelector(null))
.isInstanceOf(NullPointerException.class)
.hasMessage("meterSelector");
}
}

View File

@ -6,6 +6,7 @@
package io.opentelemetry.sdk.metrics.view; package io.opentelemetry.sdk.metrics.view;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -106,4 +107,35 @@ public class MeterSelectorTest {
assertThat(schemaUrl.getSchemaUrlFilter().test("1.0")).isFalse(); assertThat(schemaUrl.getSchemaUrlFilter().test("1.0")).isFalse();
assertThat(schemaUrl.getSchemaUrlFilter().test("1.2")).isFalse(); assertThat(schemaUrl.getSchemaUrlFilter().test("1.2")).isFalse();
} }
@Test
void invalidArgs() {
assertThatThrownBy(() -> MeterSelector.builder().setNameFilter(null))
.isInstanceOf(NullPointerException.class)
.hasMessage("nameFilter");
assertThatThrownBy(() -> MeterSelector.builder().setNamePattern(null))
.isInstanceOf(NullPointerException.class)
.hasMessage("pattern");
assertThatThrownBy(() -> MeterSelector.builder().setName(null))
.isInstanceOf(NullPointerException.class)
.hasMessage("name");
assertThatThrownBy(() -> MeterSelector.builder().setVersionFilter(null))
.isInstanceOf(NullPointerException.class)
.hasMessage("versionFilter");
assertThatThrownBy(() -> MeterSelector.builder().setVersionPattern(null))
.isInstanceOf(NullPointerException.class)
.hasMessage("pattern");
assertThatThrownBy(() -> MeterSelector.builder().setVersion(null))
.isInstanceOf(NullPointerException.class)
.hasMessage("version");
assertThatThrownBy(() -> MeterSelector.builder().setSchemaUrlFilter(null))
.isInstanceOf(NullPointerException.class)
.hasMessage("schemaUrlFilter");
assertThatThrownBy(() -> MeterSelector.builder().setSchemaUrlPattern(null))
.isInstanceOf(NullPointerException.class)
.hasMessage("pattern");
assertThatThrownBy(() -> MeterSelector.builder().setSchemaUrl(null))
.isInstanceOf(NullPointerException.class)
.hasMessage("schemaUrl");
}
} }