From f010ae1c76d729972c6e0ee218ae3d737a2d27d8 Mon Sep 17 00:00:00 2001
From: Jack Berg <34418638+jack-berg@users.noreply.github.com>
Date: Mon, 11 May 2026 15:13:14 -0500
Subject: [PATCH] Remove view file config mechanism
---
sdk-extensions/incubator/README.md | 96 ------
sdk-extensions/incubator/build.gradle.kts | 2 -
.../viewconfig/SelectorSpecification.java | 53 ----
.../metric/viewconfig/ViewConfig.java | 286 ------------------
.../viewconfig/ViewConfigCustomizer.java | 79 -----
.../viewconfig/ViewConfigSpecification.java | 29 --
.../metric/viewconfig/ViewSpecification.java | 49 ---
...re.spi.AutoConfigurationCustomizerProvider | 1 -
.../viewconfig/ViewConfigCustomizerTest.java | 131 --------
.../metric/viewconfig/ViewConfigTest.java | 274 -----------------
.../src/test/resources/aggregation-args.yaml | 21 --
.../test/resources/empty-selector-config.yaml | 5 -
.../src/test/resources/empty-view-config.yaml | 8 -
.../src/test/resources/full-config.yaml | 28 --
.../view-config-customizer-test.yaml | 6 -
15 files changed, 1068 deletions(-)
delete mode 100644 sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/metric/viewconfig/SelectorSpecification.java
delete mode 100644 sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/metric/viewconfig/ViewConfig.java
delete mode 100644 sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/metric/viewconfig/ViewConfigCustomizer.java
delete mode 100644 sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/metric/viewconfig/ViewConfigSpecification.java
delete mode 100644 sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/metric/viewconfig/ViewSpecification.java
delete mode 100644 sdk-extensions/incubator/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider
delete mode 100644 sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/metric/viewconfig/ViewConfigCustomizerTest.java
delete mode 100644 sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/metric/viewconfig/ViewConfigTest.java
delete mode 100644 sdk-extensions/incubator/src/test/resources/aggregation-args.yaml
delete mode 100644 sdk-extensions/incubator/src/test/resources/empty-selector-config.yaml
delete mode 100644 sdk-extensions/incubator/src/test/resources/empty-view-config.yaml
delete mode 100644 sdk-extensions/incubator/src/test/resources/full-config.yaml
delete mode 100644 sdk-extensions/incubator/src/test/resources/view-config-customizer-test.yaml
diff --git a/sdk-extensions/incubator/README.md b/sdk-extensions/incubator/README.md
index fbc181470d4..cf5d34fb5d5 100644
--- a/sdk-extensions/incubator/README.md
+++ b/sdk-extensions/incubator/README.md
@@ -6,99 +6,3 @@ This artifact contains experimental code related to the trace and metric SDKs.
> [!WARNING]
> Relocated to [opentelemetry-sdk-extensions-declarative-config](../declarative-config)
-
-## View File Configuration
-
-> [!WARNING]
-> This mechanism is superseded by declarative config, which is now stable (spec and schema at [opentelemetry-configuration](https://github.com/open-telemetry/opentelemetry-configuration)) and will be removed after the 1.62.0 release. Please use [declarative configuration](#declarative-configuration) instead.
-
-Adds support for file based YAML configuration of Metric SDK Views.
-
-For example, suppose `/Users/user123/view.yaml` has the following content:
-
-```yaml
-- selector:
- instrument_name: my-instrument
- instrument_type: COUNTER
- instrument_unit: ms
- meter_name: my-meter
- meter_version: 1.0.0
- meter_schema_url: http://example.com
- view:
- name: new-instrument-name
- description: new-description
- aggregation: explicit_bucket_histogram
- aggregation_args:
- bucket_boundaries: [1.0, 2.0, 5.0]
- attribute_keys:
- - foo
- - bar
-```
-
-The equivalent view configuration would be:
-
-```
-SdkMeterProvider.builder()
- .registerView(
- InstrumentSelector.builder()
- .setName("my-instrument")
- .setType(InstrumentType.COUNTER)
- .setUnit("ms")
- .setMeterName("my-meter")
- .setMeterVersion("1.0.0")
- .setMeterSchemaUrl("http://example.com")
- .build(),
- View.builder()
- .setName("new-instrument")
- .setDescription("new-description")
- .setAggregation(Aggregation.explicitBucketHistogram(Arrays.asList(1.0, 2.0, 5.0))
- .setAttributesFilter(key -> new HashSet<>(Arrays.asList("foo", "bar")).contains(key))
- .build());
-```
-
-If using [autoconfigure](../autoconfigure) with this artifact on your classpath, it will automatically load a list of view config files specified via environment variable or system property:
-
-| System property | Environment variable | Purpose |
-|---------------------------------------|---------------------------------------|------------------------------------------------------|
-| otel.experimental.metrics.view-config | OTEL_EXPERIMENTAL_METRICS_VIEW_CONFIG | List of files containing view configuration YAML [1] |
-
-**[1]** In addition to absolute paths, resources on the classpath packaged with a jar can be loaded.
-For example, `otel.experimental.metrics.view-config=classpath:/my-view.yaml` loads the
-resource `/my-view.yaml`.
-
-If not using autoconfigure, a file can be used to configure views as follows:
-
-```
-SdkMeterProviderBuilder builder = SdkMeterProvider.builder();
-try (FileInputStream fileInputStream = new FileInputStream("/Users/user123/view.yaml")) {
- ViewConfig.registerViews(builder, fileInputStream);
-}
-```
-
-The following table describes the set of recognized aggregations:
-
-| Aggregation | Arguments |
-|----------------------------------|--------------------------------------------------------------------------------------------------------------------------------|
-| [`default`] | - |
-| [`sum`] | - |
-| [`last_value`] | - |
-| [`drop`] | - |
-| [`explicit_bucket_histogram`] | `bucket_boundaries` (optional): List of inclusive upper boundaries for the histogram buckets, in order from lowest to highest. |
-| [`exponential_bucket_histogram`] | `max_buckets` (optional): The maximum number of buckets to use for positive or negative recordings. |
-
-Additional notes on usage:
-
-- Many view configurations can live in one file. The YAML is parsed as an array of view
- configurations.
-- At least one selection field is required, but including all is not necessary. Any omitted fields
- will result in the default from `InstrumentSelector` being used.
-- At least one view field is required, but including all is not required. Any omitted fields will
- result in the default from `View` being used.
-- Instrument name selection supports the following wildcard characters: `*` matches 0 or more instances of any character; `?` matches exactly one instance of any character. No other advanced selection criteria is supported.
-
-[`default`]: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/sdk.md#default-aggregation
-[`sum`]: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/sdk.md#sum-aggregation
-[`last_value`]: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/sdk.md#last-value-aggregation
-[`drop`]: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/sdk.md#drop-aggregation
-[`explicit_bucket_histogram`]: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/sdk.md#explicit-bucket-histogram-aggregation
-[`exponential_bucket_histogram`]: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/sdk.md#base2-exponential-bucket-histogram-aggregation
diff --git a/sdk-extensions/incubator/build.gradle.kts b/sdk-extensions/incubator/build.gradle.kts
index c729f526428..77bd6ef65a3 100644
--- a/sdk-extensions/incubator/build.gradle.kts
+++ b/sdk-extensions/incubator/build.gradle.kts
@@ -17,9 +17,7 @@ dependencies {
compileOnly(project(":api:incubator"))
- // io.opentelemetry.sdk.extension.incubator.metric.viewconfig
implementation(project(":sdk-extensions:autoconfigure-spi"))
- implementation("org.snakeyaml:snakeyaml-engine")
testImplementation(project(":sdk:testing"))
testImplementation(project(":sdk-extensions:autoconfigure"))
diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/metric/viewconfig/SelectorSpecification.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/metric/viewconfig/SelectorSpecification.java
deleted file mode 100644
index 70ea3d91642..00000000000
--- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/metric/viewconfig/SelectorSpecification.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright The OpenTelemetry Authors
- * SPDX-License-Identifier: Apache-2.0
- */
-
-package io.opentelemetry.sdk.extension.incubator.metric.viewconfig;
-
-import com.google.auto.value.AutoValue;
-import io.opentelemetry.sdk.metrics.InstrumentType;
-import javax.annotation.Nullable;
-
-@AutoValue
-abstract class SelectorSpecification {
-
- static AutoValue_SelectorSpecification.Builder builder() {
- return new AutoValue_SelectorSpecification.Builder();
- }
-
- @Nullable
- abstract String getInstrumentName();
-
- @Nullable
- abstract InstrumentType getInstrumentType();
-
- @Nullable
- abstract String getInstrumentUnit();
-
- @Nullable
- abstract String getMeterName();
-
- @Nullable
- abstract String getMeterVersion();
-
- @Nullable
- abstract String getMeterSchemaUrl();
-
- @AutoValue.Builder
- interface Builder {
- Builder instrumentName(@Nullable String instrumentName);
-
- Builder instrumentType(@Nullable InstrumentType instrumentType);
-
- Builder instrumentUnit(@Nullable String instrumentUnit);
-
- Builder meterName(@Nullable String meterName);
-
- Builder meterVersion(@Nullable String meterVersion);
-
- Builder meterSchemaUrl(@Nullable String meterSchemaUrl);
-
- SelectorSpecification build();
- }
-}
diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/metric/viewconfig/ViewConfig.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/metric/viewconfig/ViewConfig.java
deleted file mode 100644
index ec18190df9d..00000000000
--- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/metric/viewconfig/ViewConfig.java
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
- * Copyright The OpenTelemetry Authors
- * SPDX-License-Identifier: Apache-2.0
- */
-
-package io.opentelemetry.sdk.extension.incubator.metric.viewconfig;
-
-import static java.util.Objects.requireNonNull;
-import static java.util.stream.Collectors.toList;
-
-import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
-import io.opentelemetry.sdk.metrics.Aggregation;
-import io.opentelemetry.sdk.metrics.Base2ExponentialHistogramOptions;
-import io.opentelemetry.sdk.metrics.ExplicitBucketHistogramOptions;
-import io.opentelemetry.sdk.metrics.InstrumentSelector;
-import io.opentelemetry.sdk.metrics.InstrumentSelectorBuilder;
-import io.opentelemetry.sdk.metrics.InstrumentType;
-import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder;
-import io.opentelemetry.sdk.metrics.View;
-import io.opentelemetry.sdk.metrics.ViewBuilder;
-import io.opentelemetry.sdk.metrics.internal.aggregator.AggregationUtil;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import javax.annotation.Nullable;
-import org.snakeyaml.engine.v2.api.Load;
-import org.snakeyaml.engine.v2.api.LoadSettings;
-
-/**
- * Enables file based YAML configuration of Metric SDK {@link View}s.
- *
- *
For example, a YAML file with the following content:
- *
- *
- * - selector:
- * instrument_name: my-instrument
- * instrument_type: COUNTER
- * instrument_unit: ms
- * meter_name: my-meter
- * meter_version: 1.0.0
- * meter_schema_url: http://example.com
- * view:
- * name: new-instrument-name
- * description: new-description
- * aggregation: explicit_bucket_histogram
- * attribute_keys:
- * - foo
- * - bar
- *
- *
- * Is equivalent to the following configuration:
- *
- *
{@code
- * SdkMeterProvider.builder()
- * .registerView(
- * InstrumentSelector.builder()
- * .setName("my-instrument")
- * .setType(InstrumentType.COUNTER)
- * .setUnit("ms")
- * .setMeterName("my-meter")
- * .setMeterVersion("1.0.0")
- * .setMeterSchemaUrl("http://example.com")
- * .build(),
- * View.builder()
- * .setName("new-instrument")
- * .setDescription("new-description")
- * .setAggregation(Aggregation.explicitBucketHistogram())
- * .setAttributesFilter(key -> new HashSet<>(Arrays.asList("foo", "bar")).contains(key))
- * .build());
- * }
- *
- * @deprecated this mechanism is superseded by declarative config, which is now stable (spec and
- * schema at opentelemetry-configuration.
- * Please uses {@code
- * io.opentelemetry.sdk.declarativeconfig.DeclarativeConfiguration#parseAndCreate(InputStream)}
- * instead.
- */
-@Deprecated
-public final class ViewConfig {
-
- private ViewConfig() {}
-
- /**
- * Load the view configuration YAML from the {@code inputStream} and apply it to the {@link
- * SdkMeterProviderBuilder}.
- *
- * @throws ConfigurationException if unable to interpret {@code inputStream} contents
- */
- public static void registerViews(
- SdkMeterProviderBuilder meterProviderBuilder, InputStream inputStream) {
- List viewConfigSpecs = loadViewConfig(inputStream);
-
- for (ViewConfigSpecification viewConfigSpec : viewConfigSpecs) {
- meterProviderBuilder.registerView(
- toInstrumentSelector(viewConfigSpec.getSelectorSpecification()),
- toView(viewConfigSpec.getViewSpecification()));
- }
- }
-
- // Visible for testing
- @SuppressWarnings("unchecked")
- static List loadViewConfig(InputStream inputStream) {
- LoadSettings settings = LoadSettings.builder().build();
- Load yaml = new Load(settings);
- try {
- List result = new ArrayList<>();
-
- List