diff --git a/src/main/resources/META-INF/rewrite/opentelemetry.yml b/src/main/resources/META-INF/rewrite/opentelemetry.yml new file mode 100644 index 000000000..a27e9f3f4 --- /dev/null +++ b/src/main/resources/META-INF/rewrite/opentelemetry.yml @@ -0,0 +1,401 @@ +# +# Copyright 2025 the original author or authors. +#
+# Licensed under the Moderne Source Available License (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +#
+# https://docs.moderne.io/licensing/moderne-source-available-license +#
+# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.java.spring.opentelemetry.MigrateToOpenTelemetry +displayName: Complete migration to OpenTelemetry +description: >- + Comprehensive migration to OpenTelemetry including dependencies, configuration properties, + and Java code changes. This recipe handles migration from Spring Cloud Sleuth, Brave/Zipkin, + and OpenTracing to OpenTelemetry. +tags: + - spring + - boot + - opentelemetry + - migration + - observability +recipeList: + - org.openrewrite.java.spring.opentelemetry.MigrateSleuthToOpenTelemetry + - org.openrewrite.java.spring.opentelemetry.MigrateBraveToOpenTelemetry + - org.openrewrite.java.spring.opentelemetry.MigrateFromZipkinToOpenTelemetry + - org.openrewrite.java.spring.opentelemetry.MigrateOpenTracingToOpenTelemetry + - org.openrewrite.java.spring.opentelemetry.MigrateNewRelicToOpenTelemetry + - org.openrewrite.java.spring.opentelemetry.MigrateDatadogToOpenTelemetry + + - org.openrewrite.java.dependencies.AddDependency: + groupId: io.opentelemetry.instrumentation + artifactId: opentelemetry-logback-appender-1.0 + onlyIfUsing: ch.qos.logback.* + acceptTransitive: true + +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.java.spring.opentelemetry.MigrateSleuthToOpenTelemetry +displayName: Migrate from Spring Cloud Sleuth to OpenTelemetry +description: >- + Migrate from Spring Cloud Sleuth to OpenTelemetry. + [Spring Cloud Sleuth has been deprecated](https://github.com/spring-cloud/spring-cloud-sleuth#spring-cloud-sleuth) and + is replaced by Micrometer Tracing with OpenTelemetry as a backend. This recipe removes Sleuth + dependencies and adds OpenTelemetry instrumentation. +tags: + - spring + - boot + - opentelemetry + - sleuth + - migration + - observability +recipeList: + # Remove Spring Cloud Sleuth dependencies + - org.openrewrite.java.dependencies.RemoveDependency: + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-sleuth + - org.openrewrite.java.dependencies.RemoveDependency: + groupId: org.springframework.cloud + artifactId: spring-cloud-sleuth* + # Add Micrometer Tracing with OpenTelemetry + - org.openrewrite.java.dependencies.AddDependency: + groupId: io.micrometer + artifactId: micrometer-tracing-bridge-otel + version: 1.x + onlyIfUsing: org.springframework.cloud.sleuth.* + acceptTransitive: true + # Add OpenTelemetry exporters for common backends + - org.openrewrite.java.dependencies.AddDependency: + groupId: io.opentelemetry + artifactId: opentelemetry-exporter-otlp + version: 1.x + onlyIfUsing: org.springframework.cloud.sleuth.* + acceptTransitive: true + + # Add OpenTelemetry Spring Boot Starter for auto-instrumentation + - org.openrewrite.java.dependencies.AddDependency: + groupId: io.opentelemetry.instrumentation + artifactId: opentelemetry-instrumentation-bom + version: 2.x + scope: import + type: pom + onlyIfUsing: org.springframework.boot.* + acceptTransitive: true + - org.openrewrite.java.dependencies.AddDependency: + groupId: io.opentelemetry.instrumentation + artifactId: opentelemetry-spring-boot-starter + version: 2.x + onlyIfUsing: org.springframework.boot.* + acceptTransitive: true + + # Add OpenTelemetry annotations dependency + - org.openrewrite.java.dependencies.AddDependency: + groupId: io.opentelemetry.instrumentation + artifactId: opentelemetry-instrumentation-annotations + version: 2.x + onlyIfUsing: org.springframework.cloud.sleuth.* + acceptTransitive: true + # Add Spring Boot AOP starter for annotation processing + - org.openrewrite.java.dependencies.AddDependency: + groupId: org.springframework.boot + artifactId: spring-boot-starter-aop + version: 3.x + onlyIfUsing: io.opentelemetry.instrumentation.annotations.* + acceptTransitive: true + + # Migrate Sleuth properties to OpenTelemetry/Micrometer properties + - org.openrewrite.java.spring.ChangeSpringPropertyKey: + oldPropertyKey: spring.sleuth.enabled + newPropertyKey: management.tracing.enabled + - org.openrewrite.java.spring.ChangeSpringPropertyKey: + oldPropertyKey: spring.sleuth.sampler.probability + newPropertyKey: management.tracing.sampling.probability + - org.openrewrite.java.spring.ChangeSpringPropertyKey: + oldPropertyKey: spring.sleuth.propagation.type + newPropertyKey: management.tracing.propagation.type + - org.openrewrite.java.spring.ChangeSpringPropertyKey: + oldPropertyKey: spring.sleuth.baggage.remote-fields + newPropertyKey: management.tracing.baggage.remote-fields + - org.openrewrite.java.spring.ChangeSpringPropertyKey: + oldPropertyKey: spring.sleuth.baggage.correlation-fields + newPropertyKey: management.tracing.baggage.correlation.fields + - org.openrewrite.java.spring.ChangeSpringPropertyKey: + oldPropertyKey: spring.sleuth.otel.exporter.otlp.endpoint + newPropertyKey: management.otlp.tracing.endpoint + - org.openrewrite.java.spring.ChangeSpringPropertyKey: + oldPropertyKey: spring.sleuth.otel.exporter.otlp.headers + newPropertyKey: management.otlp.tracing.headers + - org.openrewrite.java.spring.DeleteSpringProperty: + propertyKey: spring.sleuth.otel.config.trace-id-ratio-based + - org.openrewrite.java.spring.DeleteSpringProperty: + propertyKey: spring.sleuth.otel.resource.enabled + + # API migration to Micrometer Tracing types + # Migrate renamed exporter type before change package + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: org.springframework.cloud.sleuth.exporter.SpanFilter + newFullyQualifiedTypeName: io.micrometer.tracing.exporter.SpanExportingPredicate + + # Annotation migration to OpenTelemetry annotations + # @NewSpan -> @WithSpan + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: org.springframework.cloud.sleuth.annotation.NewSpan + newFullyQualifiedTypeName: io.opentelemetry.instrumentation.annotations.WithSpan + # @SpanTag -> @SpanAttribute + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: org.springframework.cloud.sleuth.annotation.SpanTag + newFullyQualifiedTypeName: io.opentelemetry.instrumentation.annotations.SpanAttribute + # @ContinueSpan -> @WithSpan (note: semantics differ slightly) + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: org.springframework.cloud.sleuth.annotation.ContinueSpan + newFullyQualifiedTypeName: io.opentelemetry.instrumentation.annotations.WithSpan + + # Change Sleuth API imports to Micrometer Tracing + - org.openrewrite.java.ChangePackage: + oldPackageName: org.springframework.cloud.sleuth + newPackageName: io.micrometer.tracing + recursive: true + +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.java.spring.opentelemetry.MigrateFromZipkinToOpenTelemetry +displayName: Migrate from Zipkin to OpenTelemetry OTLP +description: >- + Migrate from Zipkin tracing to OpenTelemetry OTLP. This recipe replaces Zipkin dependencies + with OpenTelemetry OTLP exporter and updates the related configuration properties. +tags: + - spring + - boot + - opentelemetry + - zipkin + - migration +recipeList: + # Remove Zipkin dependencies + - org.openrewrite.java.dependencies.RemoveDependency: + groupId: io.zipkin.reporter2 + artifactId: "*" + # Add OpenTelemetry OTLP exporter + - org.openrewrite.java.dependencies.AddDependency: + groupId: io.opentelemetry + artifactId: opentelemetry-exporter-otlp + onlyIfUsing: org.springframework.boot.* + acceptTransitive: true + # Note: The user will need to manually update their collector configuration + # to accept OTLP instead of Zipkin format + +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.java.spring.opentelemetry.MigrateBraveToOpenTelemetry +displayName: Migrate Brave API to OpenTelemetry API +description: >- + Migrate Java code using Brave (Zipkin) tracing API to OpenTelemetry API. + This recipe handles the migration of Brave Tracer, Span, and related classes to OpenTelemetry equivalents. +tags: + - spring + - boot + - opentelemetry + - brave + - zipkin + - migration +recipeList: + # Remove Brave dependencies + - org.openrewrite.java.dependencies.RemoveDependency: + groupId: io.zipkin.brave + artifactId: "*" + - org.openrewrite.java.dependencies.AddDependency: + groupId: io.opentelemetry + artifactId: opentelemetry-api + version: 1.x + onlyIfUsing: brave.* + acceptTransitive: true + + # Migrate Brave Tracer to OpenTelemetry Tracer + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: brave.Tracer + newFullyQualifiedTypeName: io.opentelemetry.api.trace.Tracer + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: brave.Span + newFullyQualifiedTypeName: io.opentelemetry.api.trace.Span + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: brave.SpanCustomizer + newFullyQualifiedTypeName: io.opentelemetry.api.trace.Span + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: brave.Tracing + newFullyQualifiedTypeName: io.opentelemetry.api.OpenTelemetry + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: brave.propagation.TraceContext + newFullyQualifiedTypeName: io.opentelemetry.api.trace.SpanContext + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: brave.propagation.CurrentTraceContext + newFullyQualifiedTypeName: io.opentelemetry.context.Context + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: brave.baggage.BaggageField + newFullyQualifiedTypeName: io.opentelemetry.api.baggage.Baggage + +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.java.spring.opentelemetry.MigrateOpenTracingToOpenTelemetry +displayName: Migrate OpenTracing API to OpenTelemetry API +description: >- + Migrate Java code using OpenTracing API to OpenTelemetry API. + OpenTracing has been superseded by OpenTelemetry and is no longer actively maintained. +tags: + - spring + - boot + - opentelemetry + - opentracing + - migration +recipeList: + # Remove OpenTracing dependencies + - org.openrewrite.java.dependencies.RemoveDependency: + groupId: io.opentracing + artifactId: "*" + - org.openrewrite.java.dependencies.RemoveDependency: + groupId: io.opentracing.contrib + artifactId: "*" + # Add OpenTelemetry API dependency + - org.openrewrite.java.dependencies.AddDependency: + groupId: io.opentelemetry + artifactId: opentelemetry-api + version: 1.x + onlyIfUsing: io.opentelemetry.api.* + acceptTransitive: true + + # Core types + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: io.opentracing.Tracer + newFullyQualifiedTypeName: io.opentelemetry.api.trace.Tracer + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: io.opentracing.Span + newFullyQualifiedTypeName: io.opentelemetry.api.trace.Span + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: io.opentracing.SpanContext + newFullyQualifiedTypeName: io.opentelemetry.api.trace.SpanContext + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: io.opentracing.Scope + newFullyQualifiedTypeName: io.opentelemetry.context.Scope + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: io.opentracing.ScopeManager + newFullyQualifiedTypeName: io.opentelemetry.context.Context + # Propagation types + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: io.opentracing.propagation.Format + newFullyQualifiedTypeName: io.opentelemetry.context.propagation.TextMapPropagator + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: io.opentracing.propagation.TextMapExtract + newFullyQualifiedTypeName: io.opentelemetry.context.propagation.TextMapGetter + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: io.opentracing.propagation.TextMapInject + newFullyQualifiedTypeName: io.opentelemetry.context.propagation.TextMapSetter + # Change package for contrib utilities + - org.openrewrite.java.ChangePackage: + oldPackageName: io.opentracing.contrib + newPackageName: io.opentelemetry.instrumentation + recursive: true + +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.java.spring.opentelemetry.MigrateNewRelicToOpenTelemetry +displayName: Migrate New Relic Agent to OpenTelemetry +description: >- + Migrate from New Relic Java Agent annotations to OpenTelemetry annotations. + Replace @Trace annotations with @WithSpan annotations. +tags: + - spring + - boot + - opentelemetry + - newrelic + - migration +recipeList: + # Add OpenTelemetry annotations dependency + - org.openrewrite.java.dependencies.AddDependency: + groupId: io.opentelemetry.instrumentation + artifactId: opentelemetry-instrumentation-annotations + version: 2.x + onlyIfUsing: com.newrelic.api.agent.* + acceptTransitive: true + + # Change @Trace annotation to @WithSpan + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: com.newrelic.api.agent.Trace + newFullyQualifiedTypeName: io.opentelemetry.instrumentation.annotations.WithSpan + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: com.newrelic.api.agent.NewRelic + newFullyQualifiedTypeName: io.opentelemetry.api.GlobalOpenTelemetry + +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.java.spring.opentelemetry.MigrateDatadogToOpenTelemetry +displayName: Migrate Datadog tracing to OpenTelemetry +description: >- + Migrate from Datadog Java tracing annotations to OpenTelemetry annotations. + Replace Datadog @Trace annotations with @WithSpan annotations. +tags: + - spring + - boot + - opentelemetry + - datadog + - migration +recipeList: + # Remove Datadog dependencies + - org.openrewrite.java.dependencies.RemoveDependency: + groupId: com.datadoghq + artifactId: dd-trace-api + # Add OpenTelemetry annotations dependency + - org.openrewrite.java.dependencies.AddDependency: + groupId: io.opentelemetry.instrumentation + artifactId: opentelemetry-instrumentation-annotations + version: 2.x + onlyIfUsing: datadog.trace.api.* + acceptTransitive: true + + # Datadog core tracing types to OpenTelemetry + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: datadog.trace.api.Tracer + newFullyQualifiedTypeName: io.opentelemetry.api.trace.Tracer + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: io.opentracing.Tracer + newFullyQualifiedTypeName: io.opentelemetry.api.trace.Tracer + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: datadog.trace.api.DDTracer + newFullyQualifiedTypeName: io.opentelemetry.api.trace.Tracer + # Span types + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: datadog.trace.api.Span + newFullyQualifiedTypeName: io.opentelemetry.api.trace.Span + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: io.opentracing.Span + newFullyQualifiedTypeName: io.opentelemetry.api.trace.Span + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: datadog.trace.api.DDSpan + newFullyQualifiedTypeName: io.opentelemetry.api.trace.Span + # SpanContext + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: datadog.trace.api.SpanContext + newFullyQualifiedTypeName: io.opentelemetry.api.trace.SpanContext + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: io.opentracing.SpanContext + newFullyQualifiedTypeName: io.opentelemetry.api.trace.SpanContext + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: datadog.trace.api.DDSpanContext + newFullyQualifiedTypeName: io.opentelemetry.api.trace.SpanContext + # Scope + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: datadog.trace.context.TraceScope + newFullyQualifiedTypeName: io.opentelemetry.context.Scope + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: io.opentracing.Scope + newFullyQualifiedTypeName: io.opentelemetry.context.Scope + # @Trace annotation to @WithSpan + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: datadog.trace.api.Trace + newFullyQualifiedTypeName: io.opentelemetry.instrumentation.annotations.WithSpan diff --git a/src/main/resources/META-INF/rewrite/recipes.csv b/src/main/resources/META-INF/rewrite/recipes.csv index 4530559c9..632b7797c 100644 --- a/src/main/resources/META-INF/rewrite/recipes.csv +++ b/src/main/resources/META-INF/rewrite/recipes.csv @@ -93,9 +93,9 @@ maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot2.Up maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot2.DatabaseComponentAndBeanInitializationOrdering,Adds `@DependsOnDatabaseInitialization` to Spring Beans and Components depending on `javax.sql.DataSource`,"Beans of certain well-known types, such as `JdbcTemplate`, will be ordered so that they are initialized after the database has been initialized. If you have a bean that works with the `DataSource` directly, annotate its class or `@Bean` method with `@DependsOnDatabaseInitialization` to ensure that it too is initialized after the database has been initialized. See the [release notes](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.5-Release-Notes#initialization-ordering) for more.",5,,,,Spring Boot 2.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot2.MigrateDatabaseCredentials,Migrate flyway and liquibase credentials,"If you currently define a `spring.flyway.url` or `spring.liquibase.url` you may need to provide additional username and password properties. In earlier versions of Spring Boot, these settings were derived from `spring.datasource` properties but this turned out to be problematic for people that provided their own `DataSource` beans.",9,,,,Spring Boot 2.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot2.SpringBootProperties_2_6,Migrate Spring Boot properties to 2.6,Migrate properties found in `application.properties` and `application.yml`.,57,,,,Spring Boot 2.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, -maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot2.UpgradeSpringBoot_2_6,Migrate to Spring Boot 2.6,"Migrate applications to the latest Spring Boot 2.6 release. This recipe will modify an application's build files, make changes to deprecated/preferred APIs, and migrate configuration settings that have changes between versions. This recipe will also chain additional framework migrations (Spring Framework, Spring Data, etc) that are required as part of the migration to Spring Boot 2.6.",2159,,,,Spring Boot 2.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]" +maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot2.UpgradeSpringBoot_2_6,Migrate to Spring Boot 2.6,"Migrate applications to the latest Spring Boot 2.6 release. This recipe will modify an application's build files, make changes to deprecated/preferred APIs, and migrate configuration settings that have changes between versions. This recipe will also chain additional framework migrations (Spring Framework, Spring Data, etc) that are required as part of the migration to Spring Boot 2.6.",2161,,,,Spring Boot 2.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]" maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot2.SpringBootProperties_2_7,Migrate Spring Boot properties to 2.7,Migrate properties found in `application.properties` and `application.yml`.,25,,,,Spring Boot 2.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, -maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot2.UpgradeSpringBoot_2_7,Migrate to Spring Boot 2.7,Upgrade to Spring Boot 2.7.,2263,,,,Spring Boot 2.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]" +maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot2.UpgradeSpringBoot_2_7,Migrate to Spring Boot 2.7,Upgrade to Spring Boot 2.7.,2265,,,,Spring Boot 2.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]" maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot2.search.CustomizingJooqDefaultConfiguration,In Spring Boot 2.5 a `DefaultConfigurationCustomizer` can now be used in favour of defining one or more `*Provider` beans,"To streamline the customization of jOOQ’s `DefaultConfiguration`, a bean that implements `DefaultConfigurationCustomizer` can now be defined. This customizer callback should be used in favour of defining one or more `*Provider` beans, the support for which has now been deprecated. See [Spring Boot 2.5 jOOQ customization](https://docs.spring.io/spring-boot/docs/2.5.x/reference/htmlsingle/#features.sql.jooq.customizing).",1,,,Search,Spring Boot 2.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot2.search.IntegrationSchedulerPoolRecipe,Integration scheduler pool size,"Spring Integration now reuses an available `TaskScheduler` rather than configuring its own. In a typical application setup relying on the auto-configuration, this means that Spring Integration uses the auto-configured task scheduler that has a pool size of 1. To restore Spring Integration’s default of 10 threads, use the `spring.task.scheduling.pool.size` property.",1,,,Search,Spring Boot 2.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot2.search.LoggingShutdownHooks,Applications using logging shutdown hooks,"Spring Boot registers a logging shutdown hook by default for JAR-based applications to ensure that logging resources are released when the JVM exits. If your application is deployed as a WAR then the shutdown hook is not registered since the servlet container usually handles logging concerns. @@ -119,7 +119,7 @@ maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.Re maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.ReplaceRestTemplateBuilderRequestFactoryMethod,Replace `RestTemplateBuilder.requestFactory(Function)` with `requestFactoryBuilder`,"`RestTemplateBuilder.requestFactory(java.util.function.Function)` was deprecated since Spring Boot 3.4, in favor of `requestFactoryBuilder(ClientHttpRequestFactoryBuilder)`.",1,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.MaintainTrailingSlashURLMappings,Maintain trailing slash URL mappings,"This is part of Spring MVC and WebFlux URL Matching Changes, as of Spring Framework 6.0, the trailing slash matching configuration option has been deprecated and its default value set to false. This means that previously, a controller `@GetMapping(""/some/greeting"")` would match both `GET /some/greeting` and `GET /some/greeting/`, but it doesn't match `GET /some/greeting/` anymore by default and will result in an HTTP 404 error. This recipe is to maintain trailing slash in all HTTP url mappings.",1,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.MigrateHooksToReactorContextProperty,Use `spring.reactor.context-propagation` property,Replace `Hooks.enableAutomaticContextPropagation()` with `spring.reactor.context-propagation=true`.,1,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, -maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.SpringBoot33BestPractices,Spring Boot 3.3 best practices,Applies best practices to Spring Boot 3 applications.,7653,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]" +maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.SpringBoot33BestPractices,Spring Boot 3.3 best practices,Applies best practices to Spring Boot 3 applications.,7665,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]" maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.SpringBoot3BestPracticesOnly,Spring Boot 3.3 best practices (only),"Applies best practices to Spring Boot 3 applications, without chaining in upgrades to Spring Boot.",213,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.ReplaceStringLiteralsWithConstants,Replace String literals with Spring constants,Replace String literals with Spring constants where applicable.,193,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.EnableVirtualThreads,Enable Virtual Threads on Java 21,Set `spring.threads.virtual.enabled` to `true` in `application.properties` or `application.yml`.,5,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, @@ -133,7 +133,7 @@ maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.Up maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.UpgradeMyBatisToSpringBoot_2_6,Upgrade MyBatis to Spring Boot 2.6,Upgrade MyBatis Spring modules to a version corresponding to Spring Boot 2.6.,27,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.UpgradeMyBatisToSpringBoot_2_7,Upgrade MyBatis to Spring Boot 2.7,Upgrade MyBatis Spring modules to a version corresponding to Spring Boot 2.7.,31,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.SpringBootProperties_3_0,Migrate Spring Boot properties to 3.0,Migrate properties found in `application.properties` and `application.yml`.,567,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, -maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_0,Migrate to Spring Boot 3.0,"Migrate applications to the latest Spring Boot 3.0 release. This recipe will modify an application's build files, make changes to deprecated/preferred APIs, and migrate configuration settings that have changes between versions. This recipe will also chain additional framework migrations (Spring Framework, Spring Data, etc) that are required as part of the migration to Spring Boot 2.7.",5777,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]" +maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_0,Migrate to Spring Boot 3.0,"Migrate applications to the latest Spring Boot 3.0 release. This recipe will modify an application's build files, make changes to deprecated/preferred APIs, and migrate configuration settings that have changes between versions. This recipe will also chain additional framework migrations (Spring Framework, Spring Data, etc) that are required as part of the migration to Spring Boot 2.7.",5783,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]" maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.ActuatorEndpointSanitization,Remove the deprecated properties `additional-keys-to-sanitize` from the `configprops` and `env` end points,Spring Boot 3.0 removed the key-based sanitization mechanism used in Spring Boot 2.x in favor of a unified approach. See https://github.com/openrewrite/rewrite-spring/issues/228.,5,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.MigrateMaxHttpHeaderSize,Rename `server.max-http-header-size` to `server.max-http-request-header-size`,"Previously, the server.max-http-header-size was treated inconsistently across the four supported embedded web servers. When using Jetty, Netty, or Undertow it would configure the max HTTP request header size. When using Tomcat it would configure the max HTTP request and response header sizes. The renamed property is used to configure the http request header size in Spring Boot 3.0. **To limit the max header size of an HTTP response on Tomcat or Jetty (the only two servers that support such a setting), use a `WebServerFactoryCustomizer`**.",3,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.MigrateThymeleafDependencies,Migrate thymeleaf dependencies to Spring Boot 3.x,"Migrate thymeleaf dependencies to the new artifactId, since these are changed with Spring Boot 3.",7,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, @@ -141,19 +141,19 @@ maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.Mi maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.MigrateSapCfJavaLoggingSupport,Migrate SAP cloud foundry logging support to Spring Boot 3.x,"Migrate SAP cloud foundry logging support from `cf-java-logging-support-servlet` to `cf-java-logging-support-servlet-jakarta`, to use Jakarta with Spring Boot 3.",3,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.UpgradeMyBatisToSpringBoot_3_0,Upgrade MyBatis to Spring Boot 3.0,Upgrade MyBatis Spring modules to a version corresponding to Spring Boot 3.0.,35,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.SpringBootProperties_3_1,Migrate Spring Boot properties to 3.1,Migrate properties found in `application.properties` and `application.yml`.,13,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, -maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_1,Migrate to Spring Boot 3.1,"Migrate applications to the latest Spring Boot 3.1 release. This recipe will modify an application's build files, make changes to deprecated/preferred APIs, and migrate configuration settings that have changes between versions. This recipe will also chain additional framework migrations (Spring Framework, Spring Data, etc) that are required as part of the migration to Spring Boot 3.0.",6213,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]" +maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_1,Migrate to Spring Boot 3.1,"Migrate applications to the latest Spring Boot 3.1 release. This recipe will modify an application's build files, make changes to deprecated/preferred APIs, and migrate configuration settings that have changes between versions. This recipe will also chain additional framework migrations (Spring Framework, Spring Data, etc) that are required as part of the migration to Spring Boot 3.0.",6221,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]" maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.SpringBootProperties_3_2,Migrate Spring Boot properties to 3.2,Migrate properties found in `application.properties` and `application.yml`.,49,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, -maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_2,Migrate to Spring Boot 3.2,"Migrate applications to the latest Spring Boot 3.2 release. This recipe will modify an application's build files, make changes to deprecated/preferred APIs, and migrate configuration settings that have changes between versions. This recipe will also chain additional framework migrations (Spring Framework, Spring Data, etc) that are required as part of the migration to Spring Boot 3.1.",7243,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]" +maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_2,Migrate to Spring Boot 3.2,"Migrate applications to the latest Spring Boot 3.2 release. This recipe will modify an application's build files, make changes to deprecated/preferred APIs, and migrate configuration settings that have changes between versions. This recipe will also chain additional framework migrations (Spring Framework, Spring Data, etc) that are required as part of the migration to Spring Boot 3.1.",7253,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]" maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.RelocateLauncherClasses,Relocate Launcher Classes,Relocate classes that have been moved to different packages in Spring Boot 3.2.,7,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.UpgradeMyBatisToSpringBoot_3_2,Upgrade MyBatis to Spring Boot 3.2,Upgrade MyBatis Spring modules to a version corresponding to Spring Boot 3.2.,39,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.SpringBootProperties_3_3,Migrate Spring Boot properties to 3.3,Migrate properties found in `application.properties` and `application.yml`.,13,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, -maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_3,Migrate to Spring Boot 3.3,"Migrate applications to the latest Spring Boot 3.3 release. This recipe will modify an application's build files, make changes to deprecated/preferred APIs, and migrate configuration settings that have changes between versions. This recipe will also chain additional framework migrations (Spring Framework, Spring Data, etc) that are required as part of the migration to Spring Boot 3.2.",7651,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]" +maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_3,Migrate to Spring Boot 3.3,"Migrate applications to the latest Spring Boot 3.3 release. This recipe will modify an application's build files, make changes to deprecated/preferred APIs, and migrate configuration settings that have changes between versions. This recipe will also chain additional framework migrations (Spring Framework, Spring Data, etc) that are required as part of the migration to Spring Boot 3.2.",7663,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]" maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.ChangeCassandraGroupId,Change `com.datastax.oss` to `org.apache.cassandra`,Change `groupId` from `com.datastax.oss` to `org.apache.cassandra` and adopt the Spring Boot 3.3 managed version.,19,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.SpringBootProperties_3_4,Migrate Spring Boot properties to 3.4,Migrate properties found in `application.properties` and `application.yml`.,173,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.SpringBootProperties_3_4_EnabledToAccess,Migrate Enabled to Access Spring Boot Properties,"Migrate properties found in `application.properties` and `application.yml`, specifically converting 'enabled' to 'access'.",157,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, -maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_4,Migrate to Spring Boot 3.4,"Migrate applications to the latest Spring Boot 3.4 release. This recipe will modify an application's build files, make changes to deprecated/preferred APIs.",8649,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]" +maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_4,Migrate to Spring Boot 3.4,"Migrate applications to the latest Spring Boot 3.4 release. This recipe will modify an application's build files, make changes to deprecated/preferred APIs.",8663,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]" maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.SpringBootProperties_3_5,Migrate Spring Boot properties to 3.5,Migrate properties found in `application.properties` and `application.yml`.,59,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, -maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_5,Migrate to Spring Boot 3.5,"Migrate applications to the latest Spring Boot 3.5 release. This recipe will modify an application's build files, make changes to deprecated/preferred APIs.",8797,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]" +maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_5,Migrate to Spring Boot 3.5,"Migrate applications to the latest Spring Boot 3.5 release. This recipe will modify an application's build files, make changes to deprecated/preferred APIs.",8811,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]" maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot3.UpdatePrometheusPushgateway,Update Prometheus Pushgateway Dependency Coordinates,Update the Prometheus Pushgateway artifact ID for Spring Boot 3.5 compatibility.,3,,,,Spring Boot 3.x,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.cloud2022.MigrateRequestMappingOnFeignClient,Migrate `@RequestMapping` on `FeignClient` to `@FeignClient` path attribute,Support for `@RequestMapping` over a `FeignClient` interface was removed in Spring Cloud OpenFeign 2.2.10.RELEASE.,1,,,,Spring Cloud 2022,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.cloud2022.AddLoggingPatternLevelForSleuth,Add logging.pattern.level for traceId and spanId,"Add `logging.pattern.level` for traceId and spanId which was previously set by default, if not already set.",1,,,,Spring Cloud 2022,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, @@ -266,7 +266,7 @@ Note: Higher-level starters (like data-jpa) include lower-level ones (like jdbc) maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot4.MigrateAutoconfigurePackages,Migrate packages to modular starters,Migrate to new packages used for autoconfiguration by Spring Boot 4.0 modules.,93,,,,Boot4,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot4.AddSpringBootStarterFlyway,Add `spring-boot-starter-flyway` if using Flyway,Adds the necessary Spring Boot 4.0 Flyway starter for autoconfiguration based on dependency usage.,5,,,,Boot4,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot4.SpringBootProperties_4_0,Migrate Spring Boot properties to 4.0,Migrate properties found in `application.properties` and `application.yml`.,277,,,,Boot4,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, -maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot4.UpgradeSpringBoot_4_0,Migrate to Spring Boot 4.0,"Migrate applications to the latest Spring Boot 4.0 release. This recipe will modify an application's build files, make changes to deprecated/preferred APIs.",11005,,,,Boot4,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]" +maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.boot4.UpgradeSpringBoot_4_0,Migrate to Spring Boot 4.0,"Migrate applications to the latest Spring Boot 4.0 release. This recipe will modify an application's build files, make changes to deprecated/preferred APIs.",11021,,,,Boot4,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,,"[{""name"":""org.openrewrite.maven.table.MavenMetadataFailures"",""displayName"":""Maven metadata failures"",""description"":""Attempts to resolve maven metadata that failed."",""columns"":[{""name"":""group"",""type"":""String"",""displayName"":""Group id"",""description"":""The groupId of the artifact for which the metadata download failed.""},{""name"":""artifactId"",""type"":""String"",""displayName"":""Artifact id"",""description"":""The artifactId of the artifact for which the metadata download failed.""},{""name"":""version"",""type"":""String"",""displayName"":""Version"",""description"":""The version of the artifact for which the metadata download failed.""},{""name"":""mavenRepositoryUri"",""type"":""String"",""displayName"":""Maven repository"",""description"":""The URL of the Maven repository that the metadata download failed on.""},{""name"":""snapshots"",""type"":""String"",""displayName"":""Snapshots"",""description"":""Does the repository support snapshots.""},{""name"":""releases"",""type"":""String"",""displayName"":""Releases"",""description"":""Does the repository support releases.""},{""name"":""failure"",""type"":""String"",""displayName"":""Failure"",""description"":""The reason the metadata download failed.""}]}]" maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.cloud2023.UpgradeSpringCloud_2023,Migrate to Spring Cloud 2023,Migrate applications to the latest Spring Cloud 2023 (Leyton) release.,21,,,,Spring Cloud 2023,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.cloud2023.DependencyUpgrades,Upgrade dependencies to Spring Cloud 2023,Upgrade dependencies to Spring Cloud 2023 from prior 2022.x version.,19,,,,Spring Cloud 2023,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.cloud2024.UpgradeSpringCloud_2024,Migrate to Spring Cloud 2024,Migrate applications to the latest Spring Cloud 2024 (Moorgate) release.,21,,,,Spring Cloud 2024,Spring,Java,,,,Recipes for migrating to Spring Cloud 2024.,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, @@ -281,19 +281,26 @@ maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.cloud202 maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.cloud2025.SpringCloudGatewayProxyWebMvcProperties,Migrate Spring Cloud Gateway Proxy WebMvc Properties,Migrate Spring Cloud Gateway Proxy WebMvc properties for Spring Cloud 2025 release.,5,,,,Cloud2025,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.security7.UpgradeSpringSecurity_7_0,Migrate to Spring Security 7.0,"Migrate applications to the latest Spring Security 7.0 release. This recipe will modify an application's build files, make changes to deprecated/preferred APIs, and migrate configuration settings that have changes between versions.",9,,,,Security7,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.security7.SecurityConfigurerRemoveThrowsException,Remove throws exception in `SecurityConfigurer` methods `init` and `configure`,Remove throws exception in `SecurityConfigurer` methods `init` and `configure`.,5,,,,Security7,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.opentelemetry.MigrateToOpenTelemetry,Complete migration to OpenTelemetry,"Comprehensive migration to OpenTelemetry including dependencies, configuration properties, and Java code changes. This recipe handles migration from Spring Cloud Sleuth, Brave/Zipkin, and OpenTracing to OpenTelemetry.",139,,,,Opentelemetry,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.opentelemetry.MigrateSleuthToOpenTelemetry,Migrate from Spring Cloud Sleuth to OpenTelemetry,Migrate from Spring Cloud Sleuth to OpenTelemetry. [Spring Cloud Sleuth has been deprecated](https://github.com/spring-cloud/spring-cloud-sleuth#spring-cloud-sleuth) and is replaced by Micrometer Tracing with OpenTelemetry as a backend. This recipe removes Sleuth dependencies and adds OpenTelemetry instrumentation.,45,,,,Opentelemetry,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.opentelemetry.MigrateFromZipkinToOpenTelemetry,Migrate from Zipkin to OpenTelemetry OTLP,Migrate from Zipkin tracing to OpenTelemetry OTLP. This recipe replaces Zipkin dependencies with OpenTelemetry OTLP exporter and updates the related configuration properties.,7,,,,Opentelemetry,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.opentelemetry.MigrateBraveToOpenTelemetry,Migrate Brave API to OpenTelemetry API,"Migrate Java code using Brave (Zipkin) tracing API to OpenTelemetry API. This recipe handles the migration of Brave Tracer, Span, and related classes to OpenTelemetry equivalents.",19,,,,Opentelemetry,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.opentelemetry.MigrateOpenTracingToOpenTelemetry,Migrate OpenTracing API to OpenTelemetry API,Migrate Java code using OpenTracing API to OpenTelemetry API. OpenTracing has been superseded by OpenTelemetry and is no longer actively maintained.,25,,,,Opentelemetry,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.opentelemetry.MigrateNewRelicToOpenTelemetry,Migrate New Relic Agent to OpenTelemetry,Migrate from New Relic Java Agent annotations to OpenTelemetry annotations. Replace @Trace annotations with @WithSpan annotations.,7,,,,Opentelemetry,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.spring.opentelemetry.MigrateDatadogToOpenTelemetry,Migrate Datadog tracing to OpenTelemetry,Migrate from Datadog Java tracing annotations to OpenTelemetry annotations. Replace Datadog @Trace annotations with @WithSpan annotations.,29,,,,Opentelemetry,Spring,Java,,,,,Recipes for upgrading and patching [Spring](https://spring.io/) applications.,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.flyway.MigrateToFlyway10,Migrate to Flyway 10,Migrate to Flyway 10. See details at [Flyway V10 has landed](https://documentation.red-gate.com/fd/flyway-v10-has-landed-222627771.html).,25,,,,,Flyway,Java,,,,,,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.flyway.AddFlywayModulePostgreSQL,Add missing Flyway module for PostgreSQL,"Database modules for Flyway 10 have been split out in to separate modules for maintainability. Add the `flyway-database-postgresql` dependency if you are using PostgreSQL with Flyway 10, as detailed on https://github.com/flyway/flyway/issues/3780.",5,,,,,Flyway,Java,,,,,,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.flyway.AddFlywayModuleMySQL,Add missing Flyway module for MySQL,"Database modules for Flyway 10 have been split out into separate modules for maintainability. Add the `flyway-mysql` dependency if you are using MySQL with Flyway 10, as detailed on https://github.com/flyway/flyway/issues/3780.",5,,,,,Flyway,Java,,,,,,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.flyway.AddFlywayModuleOracle,Add missing Flyway module for Oracle,"Database modules for Flyway 10 have been split out into separate modules for maintainability. Add the `flyway-database-oracle` dependency if you are using Oracle with Flyway 10, as detailed on https://github.com/flyway/flyway/issues/3780.",5,,,,,Flyway,Java,,,,,,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.flyway.AddFlywayModuleSqlServer,Add missing Flyway module for SQL Server,"Database modules for Flyway 10 have been split out into separate modules for maintainability. Add the `flyway-sqlserver` dependency if you are using SQL Server with Flyway 10, as detailed on https://github.com/flyway/flyway/issues/3780.",5,,,,,Flyway,Java,,,,,,Basic building blocks for transforming Java code.,, -maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.springdoc.SpringFoxToSpringDoc,Migrate from SpringFox Swagger to SpringDoc and OpenAPI,Migrate from SpringFox Swagger to SpringDoc and OpenAPI.,139,,,,,Springdoc,Java,,,,,,Basic building blocks for transforming Java code.,, -maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.springdoc.SwaggerToSpringDoc,Migrate from Swagger to SpringDoc and OpenAPI,Migrate from Swagger to SpringDoc and OpenAPI.,101,,,,,Springdoc,Java,,,,,,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.springdoc.SpringFoxToSpringDoc,Migrate from SpringFox Swagger to SpringDoc and OpenAPI,Migrate from SpringFox Swagger to SpringDoc and OpenAPI.,141,,,,,Springdoc,Java,,,,,,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.springdoc.SwaggerToSpringDoc,Migrate from Swagger to SpringDoc and OpenAPI,Migrate from Swagger to SpringDoc and OpenAPI.,103,,,,,Springdoc,Java,,,,,,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.springdoc.ReplaceSpringFoxDependencies,Replace SpringFox Dependencies,Replace SpringFox Dependencies.,7,,,,,Springdoc,Java,,,,,,Basic building blocks for transforming Java code.,, -maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.springdoc.UpgradeSpringDoc_3_0,Upgrade to SpringDoc 3.0,Upgrade to SpringDoc v3.0.,167,,,,,Springdoc,Java,,,,,,Basic building blocks for transforming Java code.,, -maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.springdoc.UpgradeSpringDoc_2_8,Upgrade to SpringDoc 2.8,Upgrade to SpringDoc v2.8.,163,,,,,Springdoc,Java,,,,,,Basic building blocks for transforming Java code.,, -maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.springdoc.UpgradeSpringDoc_2_6,Upgrade to SpringDoc 2.6,Upgrade to SpringDoc v2.6.,159,,,,,Springdoc,Java,,,,,,Basic building blocks for transforming Java code.,, -maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.springdoc.UpgradeSpringDoc_2_5,Upgrade to SpringDoc 2.5,Upgrade to SpringDoc v2.5.,155,,,,,Springdoc,Java,,,,,,Basic building blocks for transforming Java code.,, -maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.springdoc.UpgradeSpringDoc_2_2,Upgrade to SpringDoc 2.2,Upgrade to SpringDoc v2.2.,151,,,,,Springdoc,Java,,,,,,Basic building blocks for transforming Java code.,, -maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.springdoc.UpgradeSpringDoc_2,Upgrade to SpringDoc 2.1,"Upgrade to SpringDoc v2.1, as described in the [upgrade guide](https://springdoc.org/#migrating-from-springdoc-v1).",147,,,,,Springdoc,Java,,,,,,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.springdoc.UpgradeSpringDoc_3_0,Upgrade to SpringDoc 3.0,Upgrade to SpringDoc v3.0.,169,,,,,Springdoc,Java,,,,,,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.springdoc.UpgradeSpringDoc_2_8,Upgrade to SpringDoc 2.8,Upgrade to SpringDoc v2.8.,165,,,,,Springdoc,Java,,,,,,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.springdoc.UpgradeSpringDoc_2_6,Upgrade to SpringDoc 2.6,Upgrade to SpringDoc v2.6.,161,,,,,Springdoc,Java,,,,,,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.springdoc.UpgradeSpringDoc_2_5,Upgrade to SpringDoc 2.5,Upgrade to SpringDoc v2.5.,157,,,,,Springdoc,Java,,,,,,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.springdoc.UpgradeSpringDoc_2_2,Upgrade to SpringDoc 2.2,Upgrade to SpringDoc v2.2.,153,,,,,Springdoc,Java,,,,,,Basic building blocks for transforming Java code.,, +maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.springdoc.UpgradeSpringDoc_2,Upgrade to SpringDoc 2.1,"Upgrade to SpringDoc v2.1, as described in the [upgrade guide](https://springdoc.org/#migrating-from-springdoc-v1).",149,,,,,Springdoc,Java,,,,,,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.java.springdoc.MigrateSpringdocCommon,Migrate from springdoc-openapi-common to springdoc-openapi-starter-common,Migrate from springdoc-openapi-common to springdoc-openapi-starter-common.,7,,,,,Springdoc,Java,,,,,,Basic building blocks for transforming Java code.,, maven,org.openrewrite.recipe:rewrite-spring,org.openrewrite.maven.spring.UpgradeExplicitSpringBootDependencies,Upgrade Spring dependencies,Upgrades dependencies according to the specified version of spring boot. Spring boot has many direct and transitive dependencies. When a module has an explicit dependency on one of these it may also need to be upgraded to match the version used by spring boot.,1,,,,,Spring,Maven,,,,,,,"[{""name"":""fromVersion"",""type"":""String"",""displayName"":""From Spring version"",""description"":""XRange pattern for spring version used to limit which projects should be updated"",""example"":"" 2.7.+"",""required"":true},{""name"":""toVersion"",""type"":""String"",""displayName"":""To Spring version"",""description"":""Upgrade version of `org.springframework.boot`"",""example"":""3.0.0-M3"",""required"":true}]", diff --git a/src/test/java/org/openrewrite/java/spring/opentelemetry/MigrateDatadogToOpenTelemetryTest.java b/src/test/java/org/openrewrite/java/spring/opentelemetry/MigrateDatadogToOpenTelemetryTest.java new file mode 100644 index 000000000..8dfe59214 --- /dev/null +++ b/src/test/java/org/openrewrite/java/spring/opentelemetry/MigrateDatadogToOpenTelemetryTest.java @@ -0,0 +1,266 @@ +/* + * Copyright 2025 the original author or authors. + *
+ * Licensed under the Moderne Source Available License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *
+ * https://docs.moderne.io/licensing/moderne-source-available-license + *
+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.spring.opentelemetry; + +import org.junit.jupiter.api.Test; +import org.openrewrite.DocumentExample; +import org.openrewrite.java.JavaParser; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +import static org.openrewrite.java.Assertions.java; + +class MigrateDatadogToOpenTelemetryTest implements RewriteTest { + + @Override + public void defaults(RecipeSpec spec) { + spec.recipeFromResources("org.openrewrite.java.spring.opentelemetry.MigrateDatadogToOpenTelemetry") + .parser(JavaParser.fromJavaVersion() + //language=java + .dependsOn( + """ + package datadog.trace.api; + public interface Tracer {} + """, + """ + package datadog.trace.api; + public interface Span {} + """, + """ + package datadog.trace.api; + public interface SpanContext {} + """, + """ + package datadog.trace.api; + public class DDTracer implements Tracer {} + """, + """ + package datadog.trace.api; + public class DDSpan implements Span {} + """, + """ + package datadog.trace.api; + public class DDSpanContext implements SpanContext {} + """, + """ + package datadog.trace.context; + public interface TraceScope extends AutoCloseable {} + """, + """ + package datadog.trace.api; + import java.lang.annotation.*; + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.METHOD) + public @interface Trace { + String operationName() default ""; + String resourceName() default ""; + } + """, + """ + package io.opentelemetry.api.trace; + public interface Tracer {} + """, + """ + package io.opentelemetry.api.trace; + public interface Span {} + """, + """ + package io.opentelemetry.api.trace; + public interface SpanContext {} + """, + """ + package io.opentelemetry.context; + public interface Scope extends AutoCloseable {} + """, + """ + package io.opentelemetry.instrumentation.annotations; + import java.lang.annotation.*; + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.METHOD) + public @interface WithSpan { + String value() default ""; + } + """ + ) + ); + } + + @DocumentExample + @Test + void migrateDatadogTracer() { + rewriteRun( + //language=java + java( + """ + import datadog.trace.api.Tracer; + + class TracingService { + Tracer tracer; + } + """, + """ + import io.opentelemetry.api.trace.Tracer; + + class TracingService { + Tracer tracer; + } + """ + ) + ); + } + + @Test + void migrateDatadogSpan() { + rewriteRun( + //language=java + java( + """ + import datadog.trace.api.Span; + + class SpanService { + Span span; + } + """, + """ + import io.opentelemetry.api.trace.Span; + + class SpanService { + Span span; + } + """ + ) + ); + } + + @Test + void migrateDatadogSpanContext() { + rewriteRun( + //language=java + java( + """ + import datadog.trace.api.SpanContext; + + class ContextService { + SpanContext context; + } + """, + """ + import io.opentelemetry.api.trace.SpanContext; + + class ContextService { + SpanContext context; + } + """ + ) + ); + } + + @Test + void migrateTraceScope() { + rewriteRun( + //language=java + java( + """ + import datadog.trace.context.TraceScope; + + class ScopedService { + TraceScope scope; + } + """, + """ + import io.opentelemetry.context.Scope; + + class ScopedService { + Scope scope; + } + """ + ) + ); + } + + @Test + void migrateTraceAnnotation() { + rewriteRun( + //language=java + java( + """ + import datadog.trace.api.Trace; + + class TracedService { + @Trace + public void tracedMethod() { + } + } + """, + """ + import io.opentelemetry.instrumentation.annotations.WithSpan; + + class TracedService { + @WithSpan + public void tracedMethod() { + } + } + """ + ) + ); + } + + @Test + void migrateDDTracer() { + rewriteRun( + //language=java + java( + """ + import datadog.trace.api.DDTracer; + + class TracerFactory { + DDTracer tracer; + } + """, + """ + import io.opentelemetry.api.trace.Tracer; + + class TracerFactory { + Tracer tracer; + } + """ + ) + ); + } + + @Test + void migrateDDSpan() { + rewriteRun( + //language=java + java( + """ + import datadog.trace.api.DDSpan; + + class SpanFactory { + DDSpan span; + } + """, + """ + import io.opentelemetry.api.trace.Span; + + class SpanFactory { + Span span; + } + """ + ) + ); + } +} diff --git a/src/test/java/org/openrewrite/java/spring/opentelemetry/MigrateOpenTracingToOpenTelemetryTest.java b/src/test/java/org/openrewrite/java/spring/opentelemetry/MigrateOpenTracingToOpenTelemetryTest.java new file mode 100644 index 000000000..d874d4e50 --- /dev/null +++ b/src/test/java/org/openrewrite/java/spring/opentelemetry/MigrateOpenTracingToOpenTelemetryTest.java @@ -0,0 +1,205 @@ +/* + * Copyright 2025 the original author or authors. + *
+ * Licensed under the Moderne Source Available License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *
+ * https://docs.moderne.io/licensing/moderne-source-available-license + *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.openrewrite.java.spring.opentelemetry;
+
+import org.junit.jupiter.api.Test;
+import org.openrewrite.DocumentExample;
+import org.openrewrite.java.JavaParser;
+import org.openrewrite.test.RecipeSpec;
+import org.openrewrite.test.RewriteTest;
+
+import static org.openrewrite.java.Assertions.java;
+
+class MigrateOpenTracingToOpenTelemetryTest implements RewriteTest {
+
+ @Override
+ public void defaults(RecipeSpec spec) {
+ spec.recipeFromResources("org.openrewrite.java.spring.opentelemetry.MigrateOpenTracingToOpenTelemetry")
+ .parser(JavaParser.fromJavaVersion()
+ //language=java
+ .dependsOn(
+ """
+ package io.opentracing;
+ public interface Tracer {}
+ """,
+ """
+ package io.opentracing;
+ public interface Span {}
+ """,
+ """
+ package io.opentracing;
+ public interface SpanContext {}
+ """,
+ """
+ package io.opentracing;
+ public interface Scope extends AutoCloseable {}
+ """,
+ """
+ package io.opentracing.propagation;
+ public interface TextMapExtract {}
+ """,
+ """
+ package io.opentracing.propagation;
+ public interface TextMapInject {}
+ """,
+ """
+ package io.opentelemetry.api.trace;
+ public interface Tracer {}
+ """,
+ """
+ package io.opentelemetry.api.trace;
+ public interface Span {}
+ """,
+ """
+ package io.opentelemetry.api.trace;
+ public interface SpanContext {}
+ """,
+ """
+ package io.opentelemetry.context;
+ public interface Scope extends AutoCloseable {}
+ """,
+ """
+ package io.opentelemetry.context.propagation;
+ public interface TextMapGetter
+ * Licensed under the Moderne Source Available License (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://docs.moderne.io/licensing/moderne-source-available-license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.openrewrite.java.spring.opentelemetry;
+
+import org.junit.jupiter.api.Test;
+import org.openrewrite.DocumentExample;
+import org.openrewrite.java.JavaParser;
+import org.openrewrite.test.RecipeSpec;
+import org.openrewrite.test.RewriteTest;
+
+import static org.openrewrite.java.Assertions.java;
+
+class MigrateSleuthAnnotationsToOpenTelemetryTest implements RewriteTest {
+
+ @Override
+ public void defaults(RecipeSpec spec) {
+ spec.recipeFromResources("org.openrewrite.java.spring.opentelemetry.MigrateSleuthToOpenTelemetry")
+ .parser(JavaParser.fromJavaVersion()
+ //language=java
+ .dependsOn(
+ """
+ package org.springframework.cloud.sleuth.annotation;
+ import java.lang.annotation.*;
+ @Retention(RetentionPolicy.RUNTIME)
+ @Target(ElementType.METHOD)
+ public @interface NewSpan {
+ String value() default "";
+ }
+ """,
+ """
+ package org.springframework.cloud.sleuth.annotation;
+ import java.lang.annotation.*;
+ @Retention(RetentionPolicy.RUNTIME)
+ @Target(ElementType.PARAMETER)
+ public @interface SpanTag {
+ String value() default "";
+ }
+ """,
+ """
+ package org.springframework.cloud.sleuth.annotation;
+ import java.lang.annotation.*;
+ @Retention(RetentionPolicy.RUNTIME)
+ @Target(ElementType.METHOD)
+ public @interface ContinueSpan {}
+ """,
+ """
+ package io.opentelemetry.instrumentation.annotations;
+ import java.lang.annotation.*;
+ @Retention(RetentionPolicy.RUNTIME)
+ @Target(ElementType.METHOD)
+ public @interface WithSpan {
+ String value() default "";
+ }
+ """,
+ """
+ package io.opentelemetry.instrumentation.annotations;
+ import java.lang.annotation.*;
+ @Retention(RetentionPolicy.RUNTIME)
+ @Target(ElementType.PARAMETER)
+ public @interface SpanAttribute {
+ String value() default "";
+ }
+ """
+ )
+ );
+ }
+
+ @DocumentExample
+ @Test
+ void migrateNewSpanToWithSpan() {
+ rewriteRun(
+ //language=java
+ java(
+ """
+ import org.springframework.cloud.sleuth.annotation.NewSpan;
+
+ class TracedService {
+ @NewSpan
+ public void tracedMethod() {
+ }
+ }
+ """,
+ """
+ import io.opentelemetry.instrumentation.annotations.WithSpan;
+
+ class TracedService {
+ @WithSpan
+ public void tracedMethod() {
+ }
+ }
+ """
+ )
+ );
+ }
+
+ @Test
+ void migrateSpanTagToSpanAttribute() {
+ rewriteRun(
+ //language=java
+ java(
+ """
+ import org.springframework.cloud.sleuth.annotation.SpanTag;
+
+ class TaggedService {
+ public void process(@SpanTag String orderId) {
+ }
+ }
+ """,
+ """
+ import io.opentelemetry.instrumentation.annotations.SpanAttribute;
+
+ class TaggedService {
+ public void process(@SpanAttribute String orderId) {
+ }
+ }
+ """
+ )
+ );
+ }
+
+ @Test
+ void migrateContinueSpanToWithSpan() {
+ rewriteRun(
+ //language=java
+ java(
+ """
+ import org.springframework.cloud.sleuth.annotation.ContinueSpan;
+
+ class ContinuedService {
+ @ContinueSpan
+ public void continueProcessing() {
+ }
+ }
+ """,
+ """
+ import io.opentelemetry.instrumentation.annotations.WithSpan;
+
+ class ContinuedService {
+ @WithSpan
+ public void continueProcessing() {
+ }
+ }
+ """
+ )
+ );
+ }
+
+ @Test
+ void migrateMultipleAnnotations() {
+ rewriteRun(
+ //language=java
+ java(
+ """
+ import org.springframework.cloud.sleuth.annotation.NewSpan;
+ import org.springframework.cloud.sleuth.annotation.SpanTag;
+
+ class OrderService {
+ @NewSpan
+ public void createOrder(@SpanTag String customerId) {
+ }
+ }
+ """,
+ """
+ import io.opentelemetry.instrumentation.annotations.SpanAttribute;
+ import io.opentelemetry.instrumentation.annotations.WithSpan;
+
+ class OrderService {
+ @WithSpan
+ public void createOrder(@SpanAttribute String customerId) {
+ }
+ }
+ """
+ )
+ );
+ }
+}
diff --git a/src/test/java/org/openrewrite/java/spring/opentelemetry/MigrateSleuthApiToMicrometerTracingTest.java b/src/test/java/org/openrewrite/java/spring/opentelemetry/MigrateSleuthApiToMicrometerTracingTest.java
new file mode 100644
index 000000000..42cf33e39
--- /dev/null
+++ b/src/test/java/org/openrewrite/java/spring/opentelemetry/MigrateSleuthApiToMicrometerTracingTest.java
@@ -0,0 +1,186 @@
+/*
+ * Copyright 2025 the original author or authors.
+ *
+ * Licensed under the Moderne Source Available License (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://docs.moderne.io/licensing/moderne-source-available-license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.openrewrite.java.spring.opentelemetry;
+
+import org.junit.jupiter.api.Test;
+import org.openrewrite.DocumentExample;
+import org.openrewrite.java.JavaParser;
+import org.openrewrite.test.RecipeSpec;
+import org.openrewrite.test.RewriteTest;
+
+import static org.openrewrite.java.Assertions.java;
+
+class MigrateSleuthApiToMicrometerTracingTest implements RewriteTest {
+
+ @Override
+ public void defaults(RecipeSpec spec) {
+ spec.recipeFromResources("org.openrewrite.java.spring.opentelemetry.MigrateSleuthToOpenTelemetry")
+ .parser(JavaParser.fromJavaVersion()
+ //language=java
+ .dependsOn(
+ """
+ package org.springframework.cloud.sleuth;
+ public interface Tracer {}
+ """,
+ """
+ package org.springframework.cloud.sleuth;
+ public interface Span {}
+ """,
+ """
+ package org.springframework.cloud.sleuth;
+ public interface Baggage {}
+ """,
+ """
+ package org.springframework.cloud.sleuth;
+ public interface BaggageInScope {}
+ """,
+ """
+ package org.springframework.cloud.sleuth;
+ public interface CurrentTraceContext {}
+ """,
+ """
+ package org.springframework.cloud.sleuth;
+ public interface TraceContext {}
+ """,
+ """
+ package io.micrometer.tracing;
+ public interface Tracer {}
+ """,
+ """
+ package io.micrometer.tracing;
+ public interface Span {}
+ """,
+ """
+ package io.micrometer.tracing;
+ public interface Baggage {}
+ """,
+ """
+ package io.micrometer.tracing;
+ public interface BaggageInScope {}
+ """,
+ """
+ package io.micrometer.tracing;
+ public interface CurrentTraceContext {}
+ """,
+ """
+ package io.micrometer.tracing;
+ public interface TraceContext {}
+ """
+ )
+ );
+ }
+
+ @DocumentExample
+ @Test
+ void migrateTracerImport() {
+ rewriteRun(
+ //language=java
+ java(
+ """
+ import org.springframework.cloud.sleuth.Tracer;
+
+ class TracingService {
+ Tracer tracer;
+ }
+ """,
+ """
+ import io.micrometer.tracing.Tracer;
+
+ class TracingService {
+ Tracer tracer;
+ }
+ """
+ )
+ );
+ }
+
+ @Test
+ void migrateSpanImport() {
+ rewriteRun(
+ //language=java
+ java(
+ """
+ import org.springframework.cloud.sleuth.Span;
+
+ class SpanService {
+ Span span;
+ }
+ """,
+ """
+ import io.micrometer.tracing.Span;
+
+ class SpanService {
+ Span span;
+ }
+ """
+ )
+ );
+ }
+
+ @Test
+ void migrateBaggage() {
+ rewriteRun(
+ //language=java
+ java(
+ """
+ import org.springframework.cloud.sleuth.Baggage;
+ import org.springframework.cloud.sleuth.BaggageInScope;
+
+ class BaggageService {
+ Baggage baggage;
+ BaggageInScope scope;
+ }
+ """,
+ """
+ import io.micrometer.tracing.Baggage;
+ import io.micrometer.tracing.BaggageInScope;
+
+ class BaggageService {
+ Baggage baggage;
+ BaggageInScope scope;
+ }
+ """
+ )
+ );
+ }
+
+ @Test
+ void migrateCurrentTraceContext() {
+ rewriteRun(
+ //language=java
+ java(
+ """
+ import org.springframework.cloud.sleuth.CurrentTraceContext;
+ import org.springframework.cloud.sleuth.TraceContext;
+
+ class ContextService {
+ CurrentTraceContext currentContext;
+ TraceContext traceContext;
+ }
+ """,
+ """
+ import io.micrometer.tracing.CurrentTraceContext;
+ import io.micrometer.tracing.TraceContext;
+
+ class ContextService {
+ CurrentTraceContext currentContext;
+ TraceContext traceContext;
+ }
+ """
+ )
+ );
+ }
+}