From 27c7c3c0cddeab23c84e939cf477bed433853dd8 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Mon, 24 Nov 2025 14:09:31 +0100 Subject: [PATCH 1/9] make test fail --- .../src/main/resources/application.yaml | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 smoke-tests-otel-starter/spring-boot-3.2/src/main/resources/application.yaml diff --git a/smoke-tests-otel-starter/spring-boot-3.2/src/main/resources/application.yaml b/smoke-tests-otel-starter/spring-boot-3.2/src/main/resources/application.yaml new file mode 100644 index 000000000000..0533d63c9b88 --- /dev/null +++ b/smoke-tests-otel-starter/spring-boot-3.2/src/main/resources/application.yaml @@ -0,0 +1,47 @@ +otel: + # "file_format" serves as opt-in to the new file format + file_format: "1.0-rc.1" + resource: + detection/development: + detectors: + - service: + attributes: + - name: service.name + value: declarative-config-spring-boot-3 + + tracer_provider: + processors: + - simple: + exporter: + test: + - simple: + exporter: + console: + + logger_provider: + processors: + - simple: + exporter: + test: + + meter_provider: + readers: + - periodic: + # Set really long interval. We'll call forceFlush when we need the metrics + # instead of collecting them periodically. + interval: 1000000 + exporter: + test: + + propagator: + composite: + - tracecontext: + - baggage: + + instrumentation/development: + java: + runtime-telemetry: + emit_experimental_telemetry: true + http: + client: + emit_experimental_telemetry: true From e609c6e0b67330324c0b52ee61d9f3785f401457 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Mon, 24 Nov 2025 15:23:21 +0100 Subject: [PATCH 2/9] single class --- .../opentelemetry-spring-boot/reflect-config.json | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/native-image/io.opentelemetry.instrumentation/opentelemetry-spring-boot/reflect-config.json diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/native-image/io.opentelemetry.instrumentation/opentelemetry-spring-boot/reflect-config.json b/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/native-image/io.opentelemetry.instrumentation/opentelemetry-spring-boot/reflect-config.json new file mode 100644 index 000000000000..4b8c8657a9bb --- /dev/null +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/native-image/io.opentelemetry.instrumentation/opentelemetry-spring-boot/reflect-config.json @@ -0,0 +1,8 @@ +[ + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + } +] From 97a26c90bd31d82724fb7d9de7f172d4ef668580 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Mon, 24 Nov 2025 15:48:33 +0100 Subject: [PATCH 3/9] wip --- .../build.gradle.kts | 99 +++- .../reflect-config.json | 504 ++++++++++++++++++ 2 files changed, 597 insertions(+), 6 deletions(-) diff --git a/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts b/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts index 2e71d2a2100d..4bff600e92dc 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts +++ b/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts @@ -6,7 +6,8 @@ plugins { base.archivesName.set("opentelemetry-spring-boot-autoconfigure") group = "io.opentelemetry.instrumentation" -val springBootVersion = "2.7.18" // AutoConfiguration is added in 2.7.0, but can be used with older versions +val springBootVersion = + "2.7.18" // AutoConfiguration is added in 2.7.0, but can be used with older versions // r2dbc-proxy is shadowed to prevent org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration // from being loaded by Spring Boot (by the presence of META-INF/services/io.r2dbc.spi.ConnectionFactoryProvider) - even if the user doesn't want to use R2DBC. @@ -49,7 +50,12 @@ dependencies { implementation(project(":instrumentation-annotations-support")) implementation(project(":instrumentation:kafka:kafka-clients:kafka-clients-2.6:library")) implementation(project(":instrumentation:mongo:mongo-3.1:library")) - compileOnly(project(path = ":instrumentation:r2dbc-1.0:library-instrumentation-shaded", configuration = "shadow")) + compileOnly( + project( + path = ":instrumentation:r2dbc-1.0:library-instrumentation-shaded", + configuration = "shadow" + ) + ) implementation(project(":instrumentation:spring:spring-kafka-2.7:library")) implementation(project(":instrumentation:spring:spring-web:spring-web-3.1:library")) implementation(project(":instrumentation:spring:spring-webmvc:spring-webmvc-5.3:library")) @@ -118,8 +124,14 @@ dependencies { add("javaSpring3CompileOnly", files(sourceSets.main.get().output.classesDirs)) add("javaSpring3CompileOnly", "org.springframework.boot:spring-boot-starter-web:3.2.4") add("javaSpring3CompileOnly", "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure") - add("javaSpring3CompileOnly", project(":instrumentation:spring:spring-web:spring-web-3.1:library")) - add("javaSpring3CompileOnly", project(":instrumentation:spring:spring-webmvc:spring-webmvc-6.0:library")) + add( + "javaSpring3CompileOnly", + project(":instrumentation:spring:spring-web:spring-web-3.1:library") + ) + add( + "javaSpring3CompileOnly", + project(":instrumentation:spring:spring-webmvc:spring-webmvc-6.0:library") + ) // Spring Boot 4 add("javaSpring4CompileOnly", files(sourceSets.main.get().output.classesDirs)) @@ -145,8 +157,10 @@ if (latestDepTest) { } } -val testJavaVersion = gradle.startParameter.projectProperties["testJavaVersion"]?.let(JavaVersion::toVersion) -val testSpring3 = (testJavaVersion == null || testJavaVersion.compareTo(JavaVersion.VERSION_17) >= 0) +val testJavaVersion = + gradle.startParameter.projectProperties["testJavaVersion"]?.let(JavaVersion::toVersion) +val testSpring3 = + (testJavaVersion == null || testJavaVersion.compareTo(JavaVersion.VERSION_17) >= 0) testing { suites { @@ -266,7 +280,80 @@ configurations.configureEach { } } +val buildGraalVmReflectionJson = tasks.register("buildGraalVmReflectionJson") { + val targetFile = File( + projectDir, + "src/main/resources/META-INF/native-image/io.opentelemetry.instrumentation/opentelemetry-spring-boot/reflect-config.json" + ) + + onlyIf { !targetFile.exists() } + + doLast { + val sourcePackage = + "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model" + val sourcePackagePath = sourcePackage.replace(".", "/") + + val cp = configurations.compileClasspath.get() + + println("Scanning classpath for OpenTelemetry Incubator SDK extension jar...") + println(cp.asPath) + + val incubatorJar = cp + .filter { it.name.contains("opentelemetry-sdk-extension-incubator") && it.name.endsWith(".jar") } + .singleFile + + println("Found incubator jar: $incubatorJar") + + val classes = mutableListOf() + + // list contents of incubatorJar in gradle cache + + zipTree(incubatorJar).matching { + include("$sourcePackagePath/**") + }.forEach { + val path = it.path + + println(path) + + val className = path + .substringAfter(sourcePackagePath) + .removePrefix("/") + .removeSuffix(".class") + .replace("/", ".") + classes.add("$sourcePackage.$className") + } + + // todo remove output to console + println("Discovered ${classes.size} classes for reflection:") + println(classes) + + // write into targetFile in json format + targetFile.parentFile.mkdirs() + targetFile.bufferedWriter().use { writer -> + writer.write("[\n") + classes.forEachIndexed { index, className -> + writer.write(" {\n") + writer.write(" \"name\": \"$className\",\n") + writer.write(" \"allDeclaredMethods\": true,\n") + writer.write(" \"allDeclaredFields\": true,\n") + writer.write(" \"allDeclaredConstructors\": true\n") + writer.write(" }") + if (index < classes.size - 1) { + writer.write(",\n") + } else { + writer.write("\n") + } + } + writer.write("]\n") + } + } +} + tasks { + compileJava { + dependsOn(buildGraalVmReflectionJson) + } + compileTestJava { options.compilerArgs.add("-parameters") } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/native-image/io.opentelemetry.instrumentation/opentelemetry-spring-boot/reflect-config.json b/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/native-image/io.opentelemetry.instrumentation/opentelemetry-spring-boot/reflect-config.json index 4b8c8657a9bb..9c51127f66d2 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/native-image/io.opentelemetry.instrumentation/opentelemetry-spring-boot/reflect-config.json +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/native-image/io.opentelemetry.instrumentation/opentelemetry-spring-boot/reflect-config.json @@ -1,8 +1,512 @@ [ + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AggregationModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AlwaysOffSamplerModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AlwaysOnSamplerModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AttributeLimitsModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AttributeNameValueModel$AttributeType", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AttributeNameValueModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.B3MultiPropagatorModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.B3PropagatorModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.BaggagePropagatorModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.Base2ExponentialBucketHistogramAggregationModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.BatchLogRecordProcessorModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.BatchSpanProcessorModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.CardinalityLimitsModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ClientModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ConsoleExporterModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.DefaultAggregationModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.DropAggregationModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalGeneralInstrumentationModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalHttpInstrumentationModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalLanguageSpecificInstrumentationModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalLoggerConfigModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalLoggerConfiguratorModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalLoggerMatcherAndConfigModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalMeterConfigModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalMeterConfiguratorModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalMeterMatcherAndConfigModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalOtlpFileExporterModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalOtlpFileMetricExporterModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalPeerInstrumentationModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalPrometheusMetricExporterModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalResourceDetectionModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalResourceDetectorModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalTracerConfigModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalTracerConfiguratorModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalTracerMatcherAndConfigModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExplicitBucketHistogramAggregationModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.IncludeExcludeModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.InstrumentationModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.JaegerPropagatorModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.JaegerRemoteSamplerModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LastValueAggregationModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordExporterModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordLimitsModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordProcessorModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LoggerProviderModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.MeterProviderModel$ExemplarFilter", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.MeterProviderModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.MetricProducerModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.MetricReaderModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.NameStringValuePairModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenCensusMetricProducerModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, { "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel", "allDeclaredMethods": true, "allDeclaredFields": true, "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTracingPropagatorModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OtlpGrpcExporterModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OtlpGrpcMetricExporterModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OtlpHttpExporterModel$OtlpHttpEncoding", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OtlpHttpExporterModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OtlpHttpMetricExporterModel$ExporterDefaultHistogramAggregation", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OtlpHttpMetricExporterModel$ExporterTemporalityPreference", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OtlpHttpMetricExporterModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ParentBasedSamplerModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PeriodicMetricReaderModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PropagatorModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PullMetricExporterModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PullMetricReaderModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PushMetricExporterModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ResourceModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SamplerModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ServerModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ServiceMappingModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SimpleLogRecordProcessorModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SimpleSpanProcessorModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanExporterModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanLimitsModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SumAggregationModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TextMapPropagatorModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TraceContextPropagatorModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TraceIdRatioBasedSamplerModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ViewModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ViewSelectorModel$InstrumentType", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ViewSelectorModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ViewStreamModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true + }, + { + "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ZipkinSpanExporterModel", + "allDeclaredMethods": true, + "allDeclaredFields": true, + "allDeclaredConstructors": true } ] From 8cc07c14b9b407c3a8c19e807df6e285b7078c94 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Mon, 24 Nov 2025 16:51:01 +0100 Subject: [PATCH 4/9] cleanup --- .../build.gradle.kts | 20 ++----------------- 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts b/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts index 4bff600e92dc..9728987dea76 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts +++ b/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts @@ -291,30 +291,18 @@ val buildGraalVmReflectionJson = tasks.register("buildGraalVmReflectionJson") { doLast { val sourcePackage = "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model" - val sourcePackagePath = sourcePackage.replace(".", "/") + val sourcePackagePath = sourcePackage.replace(".", "/") - val cp = configurations.compileClasspath.get() - - println("Scanning classpath for OpenTelemetry Incubator SDK extension jar...") - println(cp.asPath) - - val incubatorJar = cp + val incubatorJar = configurations.compileClasspath.get() .filter { it.name.contains("opentelemetry-sdk-extension-incubator") && it.name.endsWith(".jar") } .singleFile - println("Found incubator jar: $incubatorJar") - val classes = mutableListOf() - - // list contents of incubatorJar in gradle cache - zipTree(incubatorJar).matching { include("$sourcePackagePath/**") }.forEach { val path = it.path - println(path) - val className = path .substringAfter(sourcePackagePath) .removePrefix("/") @@ -323,10 +311,6 @@ val buildGraalVmReflectionJson = tasks.register("buildGraalVmReflectionJson") { classes.add("$sourcePackage.$className") } - // todo remove output to console - println("Discovered ${classes.size} classes for reflection:") - println(classes) - // write into targetFile in json format targetFile.parentFile.mkdirs() targetFile.bufferedWriter().use { writer -> From eca730f9676f56c53e786d7e12a767a3ce5bc77b Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Mon, 24 Nov 2025 16:52:18 +0100 Subject: [PATCH 5/9] cleanup --- .../spring/spring-boot-autoconfigure/build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts b/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts index 9728987dea76..93ab189e0794 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts +++ b/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts @@ -312,6 +312,7 @@ val buildGraalVmReflectionJson = tasks.register("buildGraalVmReflectionJson") { } // write into targetFile in json format + // todo either write to generated sources or add to SDK extension incubator build process targetFile.parentFile.mkdirs() targetFile.bufferedWriter().use { writer -> writer.write("[\n") From 4d73e335abd6ae4dc8cebd1c20dcfce0b14a3f5a Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Mon, 24 Nov 2025 18:51:08 +0100 Subject: [PATCH 6/9] use SDK json --- .../build.gradle.kts | 84 +-- .../reflect-config.json | 512 ------------------ 2 files changed, 6 insertions(+), 590 deletions(-) delete mode 100644 instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/native-image/io.opentelemetry.instrumentation/opentelemetry-spring-boot/reflect-config.json diff --git a/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts b/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts index 93ab189e0794..2e71d2a2100d 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts +++ b/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts @@ -6,8 +6,7 @@ plugins { base.archivesName.set("opentelemetry-spring-boot-autoconfigure") group = "io.opentelemetry.instrumentation" -val springBootVersion = - "2.7.18" // AutoConfiguration is added in 2.7.0, but can be used with older versions +val springBootVersion = "2.7.18" // AutoConfiguration is added in 2.7.0, but can be used with older versions // r2dbc-proxy is shadowed to prevent org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration // from being loaded by Spring Boot (by the presence of META-INF/services/io.r2dbc.spi.ConnectionFactoryProvider) - even if the user doesn't want to use R2DBC. @@ -50,12 +49,7 @@ dependencies { implementation(project(":instrumentation-annotations-support")) implementation(project(":instrumentation:kafka:kafka-clients:kafka-clients-2.6:library")) implementation(project(":instrumentation:mongo:mongo-3.1:library")) - compileOnly( - project( - path = ":instrumentation:r2dbc-1.0:library-instrumentation-shaded", - configuration = "shadow" - ) - ) + compileOnly(project(path = ":instrumentation:r2dbc-1.0:library-instrumentation-shaded", configuration = "shadow")) implementation(project(":instrumentation:spring:spring-kafka-2.7:library")) implementation(project(":instrumentation:spring:spring-web:spring-web-3.1:library")) implementation(project(":instrumentation:spring:spring-webmvc:spring-webmvc-5.3:library")) @@ -124,14 +118,8 @@ dependencies { add("javaSpring3CompileOnly", files(sourceSets.main.get().output.classesDirs)) add("javaSpring3CompileOnly", "org.springframework.boot:spring-boot-starter-web:3.2.4") add("javaSpring3CompileOnly", "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure") - add( - "javaSpring3CompileOnly", - project(":instrumentation:spring:spring-web:spring-web-3.1:library") - ) - add( - "javaSpring3CompileOnly", - project(":instrumentation:spring:spring-webmvc:spring-webmvc-6.0:library") - ) + add("javaSpring3CompileOnly", project(":instrumentation:spring:spring-web:spring-web-3.1:library")) + add("javaSpring3CompileOnly", project(":instrumentation:spring:spring-webmvc:spring-webmvc-6.0:library")) // Spring Boot 4 add("javaSpring4CompileOnly", files(sourceSets.main.get().output.classesDirs)) @@ -157,10 +145,8 @@ if (latestDepTest) { } } -val testJavaVersion = - gradle.startParameter.projectProperties["testJavaVersion"]?.let(JavaVersion::toVersion) -val testSpring3 = - (testJavaVersion == null || testJavaVersion.compareTo(JavaVersion.VERSION_17) >= 0) +val testJavaVersion = gradle.startParameter.projectProperties["testJavaVersion"]?.let(JavaVersion::toVersion) +val testSpring3 = (testJavaVersion == null || testJavaVersion.compareTo(JavaVersion.VERSION_17) >= 0) testing { suites { @@ -280,65 +266,7 @@ configurations.configureEach { } } -val buildGraalVmReflectionJson = tasks.register("buildGraalVmReflectionJson") { - val targetFile = File( - projectDir, - "src/main/resources/META-INF/native-image/io.opentelemetry.instrumentation/opentelemetry-spring-boot/reflect-config.json" - ) - - onlyIf { !targetFile.exists() } - - doLast { - val sourcePackage = - "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model" - val sourcePackagePath = sourcePackage.replace(".", "/") - - val incubatorJar = configurations.compileClasspath.get() - .filter { it.name.contains("opentelemetry-sdk-extension-incubator") && it.name.endsWith(".jar") } - .singleFile - - val classes = mutableListOf() - zipTree(incubatorJar).matching { - include("$sourcePackagePath/**") - }.forEach { - val path = it.path - - val className = path - .substringAfter(sourcePackagePath) - .removePrefix("/") - .removeSuffix(".class") - .replace("/", ".") - classes.add("$sourcePackage.$className") - } - - // write into targetFile in json format - // todo either write to generated sources or add to SDK extension incubator build process - targetFile.parentFile.mkdirs() - targetFile.bufferedWriter().use { writer -> - writer.write("[\n") - classes.forEachIndexed { index, className -> - writer.write(" {\n") - writer.write(" \"name\": \"$className\",\n") - writer.write(" \"allDeclaredMethods\": true,\n") - writer.write(" \"allDeclaredFields\": true,\n") - writer.write(" \"allDeclaredConstructors\": true\n") - writer.write(" }") - if (index < classes.size - 1) { - writer.write(",\n") - } else { - writer.write("\n") - } - } - writer.write("]\n") - } - } -} - tasks { - compileJava { - dependsOn(buildGraalVmReflectionJson) - } - compileTestJava { options.compilerArgs.add("-parameters") } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/native-image/io.opentelemetry.instrumentation/opentelemetry-spring-boot/reflect-config.json b/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/native-image/io.opentelemetry.instrumentation/opentelemetry-spring-boot/reflect-config.json deleted file mode 100644 index 9c51127f66d2..000000000000 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/native-image/io.opentelemetry.instrumentation/opentelemetry-spring-boot/reflect-config.json +++ /dev/null @@ -1,512 +0,0 @@ -[ - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AggregationModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AlwaysOffSamplerModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AlwaysOnSamplerModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AttributeLimitsModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AttributeNameValueModel$AttributeType", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AttributeNameValueModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.B3MultiPropagatorModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.B3PropagatorModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.BaggagePropagatorModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.Base2ExponentialBucketHistogramAggregationModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.BatchLogRecordProcessorModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.BatchSpanProcessorModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.CardinalityLimitsModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ClientModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ConsoleExporterModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.DefaultAggregationModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.DropAggregationModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalGeneralInstrumentationModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalHttpInstrumentationModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalLanguageSpecificInstrumentationModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalLoggerConfigModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalLoggerConfiguratorModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalLoggerMatcherAndConfigModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalMeterConfigModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalMeterConfiguratorModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalMeterMatcherAndConfigModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalOtlpFileExporterModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalOtlpFileMetricExporterModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalPeerInstrumentationModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalPrometheusMetricExporterModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalResourceDetectionModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalResourceDetectorModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalTracerConfigModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalTracerConfiguratorModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalTracerMatcherAndConfigModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExplicitBucketHistogramAggregationModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.IncludeExcludeModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.InstrumentationModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.JaegerPropagatorModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.JaegerRemoteSamplerModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LastValueAggregationModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordExporterModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordLimitsModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordProcessorModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LoggerProviderModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.MeterProviderModel$ExemplarFilter", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.MeterProviderModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.MetricProducerModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.MetricReaderModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.NameStringValuePairModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenCensusMetricProducerModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTracingPropagatorModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OtlpGrpcExporterModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OtlpGrpcMetricExporterModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OtlpHttpExporterModel$OtlpHttpEncoding", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OtlpHttpExporterModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OtlpHttpMetricExporterModel$ExporterDefaultHistogramAggregation", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OtlpHttpMetricExporterModel$ExporterTemporalityPreference", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OtlpHttpMetricExporterModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ParentBasedSamplerModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PeriodicMetricReaderModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PropagatorModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PullMetricExporterModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PullMetricReaderModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PushMetricExporterModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ResourceModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SamplerModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ServerModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ServiceMappingModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SimpleLogRecordProcessorModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SimpleSpanProcessorModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanExporterModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanLimitsModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SumAggregationModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TextMapPropagatorModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TraceContextPropagatorModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TraceIdRatioBasedSamplerModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ViewModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ViewSelectorModel$InstrumentType", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ViewSelectorModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ViewStreamModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - }, - { - "name": "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ZipkinSpanExporterModel", - "allDeclaredMethods": true, - "allDeclaredFields": true, - "allDeclaredConstructors": true - } -] From dc6312a0b81821ac5bf316cfa7b00bc6caca2fae Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Mon, 8 Dec 2025 10:10:59 +0100 Subject: [PATCH 7/9] fix --- .../smoketest/OtelSpringStarterSmokeTest.java | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/smoke-tests-otel-starter/spring-boot-3.2/src/test/java/io/opentelemetry/spring/smoketest/OtelSpringStarterSmokeTest.java b/smoke-tests-otel-starter/spring-boot-3.2/src/test/java/io/opentelemetry/spring/smoketest/OtelSpringStarterSmokeTest.java index f01bafb6e22e..c38c1e718530 100644 --- a/smoke-tests-otel-starter/spring-boot-3.2/src/test/java/io/opentelemetry/spring/smoketest/OtelSpringStarterSmokeTest.java +++ b/smoke-tests-otel-starter/spring-boot-3.2/src/test/java/io/opentelemetry/spring/smoketest/OtelSpringStarterSmokeTest.java @@ -6,9 +6,9 @@ package io.opentelemetry.spring.smoketest; import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.await; import io.opentelemetry.api.trace.SpanKind; -import io.opentelemetry.sdk.testing.assertj.TraceAssert; import io.opentelemetry.semconv.HttpAttributes; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -41,18 +41,19 @@ void restClient() { .body(String.class)) .isEqualTo("pong"); - if (System.getProperty("org.graalvm.nativeimage.imagecode") != null) { - // ignore the trace for creating the db table - testing.waitAndAssertTraces(trace -> {}, OtelSpringStarterSmokeTest::assertClient); - } else { - testing.waitAndAssertTraces(OtelSpringStarterSmokeTest::assertClient); - } - } - - private static void assertClient(TraceAssert traceAssert) { - traceAssert.hasSpansSatisfyingExactly( - span -> HttpSpanDataAssert.create(span).assertClientGetRequest("/ping"), - span -> span.hasKind(SpanKind.SERVER).hasAttribute(HttpAttributes.HTTP_ROUTE, "/ping"), - span -> withSpanAssert(span)); + // ignore the trace for creating the db table + await() + .until( + () -> + testing.getExportedSpans().stream() + .anyMatch(span -> span.getKind() == SpanKind.SERVER)); + + testing.waitAndAssertTraces( + traceAssert -> + traceAssert.hasSpansSatisfyingExactly( + span -> HttpSpanDataAssert.create(span).assertClientGetRequest("/ping"), + span -> + span.hasKind(SpanKind.SERVER).hasAttribute(HttpAttributes.HTTP_ROUTE, "/ping"), + span -> withSpanAssert(span))); } } From 76353c8847da70c63f0689f5702e2cb9cbdd80c4 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Wed, 10 Dec 2025 16:48:06 +0100 Subject: [PATCH 8/9] fix --- .../spring/smoketest/OtelSpringStarterSmokeTest.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/smoke-tests-otel-starter/spring-boot-3.2/src/test/java/io/opentelemetry/spring/smoketest/OtelSpringStarterSmokeTest.java b/smoke-tests-otel-starter/spring-boot-3.2/src/test/java/io/opentelemetry/spring/smoketest/OtelSpringStarterSmokeTest.java index c38c1e718530..724fbf09bfb1 100644 --- a/smoke-tests-otel-starter/spring-boot-3.2/src/test/java/io/opentelemetry/spring/smoketest/OtelSpringStarterSmokeTest.java +++ b/smoke-tests-otel-starter/spring-boot-3.2/src/test/java/io/opentelemetry/spring/smoketest/OtelSpringStarterSmokeTest.java @@ -41,13 +41,6 @@ void restClient() { .body(String.class)) .isEqualTo("pong"); - // ignore the trace for creating the db table - await() - .until( - () -> - testing.getExportedSpans().stream() - .anyMatch(span -> span.getKind() == SpanKind.SERVER)); - testing.waitAndAssertTraces( traceAssert -> traceAssert.hasSpansSatisfyingExactly( From 4f7c000eccf07983c8aa41f51a48831344a6692e Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Wed, 10 Dec 2025 16:57:50 +0100 Subject: [PATCH 9/9] fix --- .../spring/smoketest/OtelSpringStarterSmokeTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/smoke-tests-otel-starter/spring-boot-3.2/src/test/java/io/opentelemetry/spring/smoketest/OtelSpringStarterSmokeTest.java b/smoke-tests-otel-starter/spring-boot-3.2/src/test/java/io/opentelemetry/spring/smoketest/OtelSpringStarterSmokeTest.java index 724fbf09bfb1..5508312be896 100644 --- a/smoke-tests-otel-starter/spring-boot-3.2/src/test/java/io/opentelemetry/spring/smoketest/OtelSpringStarterSmokeTest.java +++ b/smoke-tests-otel-starter/spring-boot-3.2/src/test/java/io/opentelemetry/spring/smoketest/OtelSpringStarterSmokeTest.java @@ -6,7 +6,6 @@ package io.opentelemetry.spring.smoketest; import static org.assertj.core.api.Assertions.assertThat; -import static org.awaitility.Awaitility.await; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.semconv.HttpAttributes;