diff --git a/api/all/src/main/java/io/opentelemetry/api/common/Value.java b/api/all/src/main/java/io/opentelemetry/api/common/Value.java index a29be801e27..01b8f994389 100644 --- a/api/all/src/main/java/io/opentelemetry/api/common/Value.java +++ b/api/all/src/main/java/io/opentelemetry/api/common/Value.java @@ -84,6 +84,11 @@ static Value> of(Map> value) { return KeyValueList.createFromMap(value); } + /** Returns a new {@link ValueBuilder} instance for creating an arbitrary {@link Value}. */ + static ValueBuilder builder() { + return new ValueBuilderImpl(); + } + /** Returns the type of this {@link Value}. Useful for building switch statements. */ ValueType getType(); diff --git a/api/all/src/main/java/io/opentelemetry/api/common/ValueBuilder.java b/api/all/src/main/java/io/opentelemetry/api/common/ValueBuilder.java new file mode 100644 index 00000000000..5da6ed477e3 --- /dev/null +++ b/api/all/src/main/java/io/opentelemetry/api/common/ValueBuilder.java @@ -0,0 +1,33 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.api.common; + +public interface ValueBuilder { + + default ValueBuilder put(String key, String value) { + put(key, Value.of(value)); + return this; + } + + default ValueBuilder put(String key, long value) { + put(key, Value.of(value)); + return this; + } + + default ValueBuilder put(String key, double value) { + put(key, Value.of(value)); + return this; + } + + default ValueBuilder put(String key, boolean value) { + put(key, Value.of(value)); + return this; + } + + ValueBuilder put(String key, Value value); + + Value build(); +} diff --git a/api/all/src/main/java/io/opentelemetry/api/common/ValueBuilderImpl.java b/api/all/src/main/java/io/opentelemetry/api/common/ValueBuilderImpl.java new file mode 100644 index 00000000000..0d2e784736b --- /dev/null +++ b/api/all/src/main/java/io/opentelemetry/api/common/ValueBuilderImpl.java @@ -0,0 +1,25 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.api.common; + +import java.util.ArrayList; +import java.util.List; + +class ValueBuilderImpl implements ValueBuilder { + + private final List keyValues = new ArrayList<>(); + + @Override + public ValueBuilder put(String key, Value value) { + keyValues.add(KeyValue.of(key, value)); + return this; + } + + @Override + public Value build() { + return Value.of(keyValues.toArray(new KeyValue[0])); + } +}