From be750eb3066720cf3fdd244713612d0dcb4e1984 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Tue, 10 Feb 2026 09:06:57 +0000 Subject: [PATCH] Adapt to deprecation of support for Dynatrace V1 API See gh-49111 --- .../reference/pages/actuator/metrics.adoc | 10 ++++++--- .../export/dynatrace/DynatraceProperties.java | 10 +++++++++ .../DynatracePropertiesConfigAdapter.java | 19 ++++++++++++----- ...DynatracePropertiesConfigAdapterTests.java | 21 ++++++++++++++++--- .../dynatrace/DynatracePropertiesTests.java | 10 ++++++++- 5 files changed, 58 insertions(+), 12 deletions(-) diff --git a/documentation/spring-boot-docs/src/docs/antora/modules/reference/pages/actuator/metrics.adoc b/documentation/spring-boot-docs/src/docs/antora/modules/reference/pages/actuator/metrics.adoc index 7a1bd819870..84e572bbea1 100644 --- a/documentation/spring-boot-docs/src/docs/antora/modules/reference/pages/actuator/metrics.adoc +++ b/documentation/spring-boot-docs/src/docs/antora/modules/reference/pages/actuator/metrics.adoc @@ -174,9 +174,13 @@ management: Dynatrace offers two metrics ingest APIs, both of which are implemented for {url-micrometer-docs-implementations}/dynatrace[Micrometer]. You can find the Dynatrace documentation on Micrometer metrics ingest {url-dynatrace-docs-shortlink}/micrometer-metrics-ingest[here]. + Configuration properties in the `v1` namespace apply only when exporting to the {url-dynatrace-docs-shortlink}/api-metrics[Timeseries v1 API]. +Support for the V1 API is deprecated. + Configuration properties in the `v2` namespace apply only when exporting to the {url-dynatrace-docs-shortlink}/api-metrics-v2-post-datapoints[Metrics v2 API]. -Note that this integration can export only to either the `v1` or `v2` version of the API at a time, with `v2` being preferred. + +Note that this integration can export only to either the `v1` or `v2` version of the API at a time, with `v2` being strongly recommended due to the deprecation of the v1 API. If the `device-id` (required for v1 but not used in v2) is set in the `v1` namespace, metrics are exported to the `v1` endpoint. Otherwise, `v2` is assumed. @@ -264,13 +268,13 @@ management: [[actuator.metrics.export.dynatrace.v1-api]] -==== v1 API (Legacy) +==== v1 API (Deprecated) The Dynatrace v1 API metrics registry pushes metrics to the configured URI periodically by using the {url-dynatrace-docs-shortlink}/api-metrics[Timeseries v1 API]. For backwards-compatibility with existing setups, when `device-id` is set (required for v1, but not used in v2), metrics are exported to the Timeseries v1 endpoint. To export metrics to {url-micrometer-docs-implementations}/dynatrace[Dynatrace], your API token, device ID, and URI must be provided: -[configprops,yaml] +[configprops%novalidate,yaml] ---- management: dynatrace: diff --git a/module/spring-boot-micrometer-metrics/src/main/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/dynatrace/DynatraceProperties.java b/module/spring-boot-micrometer-metrics/src/main/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/dynatrace/DynatraceProperties.java index 46b070db1b2..33d14914a1d 100644 --- a/module/spring-boot-micrometer-metrics/src/main/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/dynatrace/DynatraceProperties.java +++ b/module/spring-boot-micrometer-metrics/src/main/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/dynatrace/DynatraceProperties.java @@ -21,6 +21,7 @@ import java.util.Map; import org.jspecify.annotations.Nullable; import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.context.properties.DeprecatedConfigurationProperty; import org.springframework.boot.micrometer.metrics.autoconfigure.export.properties.StepRegistryProperties; /** @@ -34,6 +35,7 @@ import org.springframework.boot.micrometer.metrics.autoconfigure.export.properti @ConfigurationProperties("management.dynatrace.metrics.export") public class DynatraceProperties extends StepRegistryProperties { + @Deprecated(since = "4.1.0", forRemoval = true) private final V1 v1 = new V1(); private final V2 v2 = new V2(); @@ -65,6 +67,7 @@ public class DynatraceProperties extends StepRegistryProperties { this.uri = uri; } + @Deprecated(since = "4.1.0", forRemoval = true) public V1 getV1() { return this.v1; } @@ -73,6 +76,7 @@ public class DynatraceProperties extends StepRegistryProperties { return this.v2; } + @Deprecated(since = "4.1.0", forRemoval = true) public static class V1 { /** @@ -92,6 +96,8 @@ public class DynatraceProperties extends StepRegistryProperties { */ private String technologyType = "java"; + @DeprecatedConfigurationProperty(reason = "Dynatrace V1 API is deprecated, use the V2 API instead.", + since = "4.1.0") public @Nullable String getDeviceId() { return this.deviceId; } @@ -100,6 +106,8 @@ public class DynatraceProperties extends StepRegistryProperties { this.deviceId = deviceId; } + @DeprecatedConfigurationProperty(reason = "Dynatrace V1 API is deprecated, use the V2 API instead.", + since = "4.1.0") public @Nullable String getGroup() { return this.group; } @@ -108,6 +116,8 @@ public class DynatraceProperties extends StepRegistryProperties { this.group = group; } + @DeprecatedConfigurationProperty(reason = "Dynatrace V1 API is deprecated, use the V2 API instead.", + since = "4.1.0") public String getTechnologyType() { return this.technologyType; } diff --git a/module/spring-boot-micrometer-metrics/src/main/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/dynatrace/DynatracePropertiesConfigAdapter.java b/module/spring-boot-micrometer-metrics/src/main/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/dynatrace/DynatracePropertiesConfigAdapter.java index bed52c70d53..44838184e11 100644 --- a/module/spring-boot-micrometer-metrics/src/main/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/dynatrace/DynatracePropertiesConfigAdapter.java +++ b/module/spring-boot-micrometer-metrics/src/main/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/dynatrace/DynatracePropertiesConfigAdapter.java @@ -22,7 +22,6 @@ import io.micrometer.dynatrace.DynatraceApiVersion; import io.micrometer.dynatrace.DynatraceConfig; import org.jspecify.annotations.Nullable; -import org.springframework.boot.micrometer.metrics.autoconfigure.export.dynatrace.DynatraceProperties.V1; import org.springframework.boot.micrometer.metrics.autoconfigure.export.dynatrace.DynatraceProperties.V2; import org.springframework.boot.micrometer.metrics.autoconfigure.export.properties.StepRegistryPropertiesConfigAdapter; @@ -45,18 +44,23 @@ class DynatracePropertiesConfigAdapter extends StepRegistryPropertiesConfigAdapt } @Override + @SuppressWarnings("deprecation") public String apiToken() { return obtain(DynatraceProperties::getApiToken, DynatraceConfig.super::apiToken); } @Override + @SuppressWarnings("removal") + @Deprecated(since = "4.1.0", forRemoval = true) public String deviceId() { - return obtain(v1(V1::getDeviceId), DynatraceConfig.super::deviceId); + return obtain(v1(DynatraceProperties.V1::getDeviceId), DynatraceConfig.super::deviceId); } @Override + @SuppressWarnings("removal") + @Deprecated(since = "4.1.0", forRemoval = true) public String technologyType() { - return obtain(v1(V1::getTechnologyType), DynatraceConfig.super::technologyType); + return obtain(v1(DynatraceProperties.V1::getTechnologyType), DynatraceConfig.super::technologyType); } @Override @@ -65,11 +69,14 @@ class DynatracePropertiesConfigAdapter extends StepRegistryPropertiesConfigAdapt } @Override + @SuppressWarnings("removal") + @Deprecated(since = "4.1.0", forRemoval = true) public @Nullable String group() { - return get(v1(V1::getGroup), DynatraceConfig.super::group); + return get(v1(DynatraceProperties.V1::getGroup), DynatraceConfig.super::group); } @Override + @SuppressWarnings({ "deprecation", "removal" }) public DynatraceApiVersion apiVersion() { return obtain((properties) -> (properties.getV1().getDeviceId() != null) ? DynatraceApiVersion.V1 : DynatraceApiVersion.V2, DynatraceConfig.super::apiVersion); @@ -100,7 +107,9 @@ class DynatracePropertiesConfigAdapter extends StepRegistryPropertiesConfigAdapt return obtain(v2(V2::isExportMeterMetadata), DynatraceConfig.super::exportMeterMetadata); } - private Getter v1(Getter getter) { + @SuppressWarnings("removal") + @Deprecated(since = "4.1.0", forRemoval = true) + private Getter v1(Getter getter) { return (properties) -> getter.get(properties.getV1()); } diff --git a/module/spring-boot-micrometer-metrics/src/test/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/dynatrace/DynatracePropertiesConfigAdapterTests.java b/module/spring-boot-micrometer-metrics/src/test/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/dynatrace/DynatracePropertiesConfigAdapterTests.java index 364c7c169c8..9605b078159 100644 --- a/module/spring-boot-micrometer-metrics/src/test/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/dynatrace/DynatracePropertiesConfigAdapterTests.java +++ b/module/spring-boot-micrometer-metrics/src/test/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/dynatrace/DynatracePropertiesConfigAdapterTests.java @@ -53,6 +53,8 @@ class DynatracePropertiesConfigAdapterTests } @Test + @SuppressWarnings("removal") + @Deprecated(since = "4.1.0", forRemoval = true) void whenPropertiesV1DeviceIdIsSetAdapterDeviceIdReturnsIt() { DynatraceProperties properties = new DynatraceProperties(); properties.getV1().setDeviceId("dev-1"); @@ -60,6 +62,8 @@ class DynatracePropertiesConfigAdapterTests } @Test + @SuppressWarnings("removal") + @Deprecated(since = "4.1.0", forRemoval = true) void whenPropertiesV1TechnologyTypeIsSetAdapterTechnologyTypeReturnsIt() { DynatraceProperties properties = new DynatraceProperties(); properties.getV1().setTechnologyType("tech-1"); @@ -67,6 +71,8 @@ class DynatracePropertiesConfigAdapterTests } @Test + @SuppressWarnings("removal") + @Deprecated(since = "4.1.0", forRemoval = true) void whenPropertiesV1GroupIsSetAdapterGroupReturnsIt() { DynatraceProperties properties = new DynatraceProperties(); properties.getV1().setGroup("group-1"); @@ -74,6 +80,8 @@ class DynatracePropertiesConfigAdapterTests } @Test + @SuppressWarnings("removal") + @Deprecated(since = "4.1.0", forRemoval = true) void whenV1DeviceIdIsSetThenAdapterApiVersionIsV1() { DynatraceProperties properties = new DynatraceProperties(); properties.getV1().setDeviceId("dev-1"); @@ -123,13 +131,20 @@ class DynatracePropertiesConfigAdapterTests DynatraceProperties properties = new DynatraceProperties(); assertThat(properties.getApiToken()).isNull(); assertThat(properties.getUri()).isNull(); - assertThat(properties.getV1().getDeviceId()).isNull(); - assertThat(properties.getV1().getTechnologyType()).isEqualTo("java"); - assertThat(properties.getV1().getGroup()).isNull(); assertThat(properties.getV2().getMetricKeyPrefix()).isNull(); assertThat(properties.getV2().isEnrichWithDynatraceMetadata()).isTrue(); assertThat(properties.getV2().getDefaultDimensions()).isNull(); assertThat(properties.getV2().isUseDynatraceSummaryInstruments()).isTrue(); } + @Test + @SuppressWarnings("removal") + @Deprecated(forRemoval = true, since = "4.1.0") + void v1DefaultValues() { + DynatraceProperties properties = new DynatraceProperties(); + assertThat(properties.getV1().getDeviceId()).isNull(); + assertThat(properties.getV1().getTechnologyType()).isEqualTo("java"); + assertThat(properties.getV1().getGroup()).isNull(); + } + } diff --git a/module/spring-boot-micrometer-metrics/src/test/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/dynatrace/DynatracePropertiesTests.java b/module/spring-boot-micrometer-metrics/src/test/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/dynatrace/DynatracePropertiesTests.java index 1fe51b7a6f8..c73aaf0fb11 100644 --- a/module/spring-boot-micrometer-metrics/src/test/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/dynatrace/DynatracePropertiesTests.java +++ b/module/spring-boot-micrometer-metrics/src/test/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/dynatrace/DynatracePropertiesTests.java @@ -35,10 +35,18 @@ class DynatracePropertiesTests extends StepRegistryPropertiesTests { DynatraceProperties properties = new DynatraceProperties(); DynatraceConfig config = (key) -> null; assertStepRegistryDefaultValues(properties, config); - assertThat(properties.getV1().getTechnologyType()).isEqualTo(config.technologyType()); assertThat(properties.getV2().isUseDynatraceSummaryInstruments()) .isEqualTo(config.useDynatraceSummaryInstruments()); assertThat(properties.getV2().isExportMeterMetadata()).isEqualTo(config.exportMeterMetadata()); } + @Test + @SuppressWarnings("removal") + @Deprecated(since = "4.1.0", forRemoval = true) + void v1DefaultValuesAreConsistent() { + DynatraceProperties properties = new DynatraceProperties(); + DynatraceConfig config = (key) -> null; + assertThat(properties.getV1().getTechnologyType()).isEqualTo(config.technologyType()); + } + }