This is an automated email from the ASF dual-hosted git repository.
jamesnetherton pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
The following commit(s) were added to refs/heads/main by this push:
new 5052b1770b Ensure Micrometer app.info metric version tag resolves
correctly for all Quarkus package types
5052b1770b is described below
commit 5052b1770bc99802b0ad88f042512d24b9e07c4d
Author: James Netherton <[email protected]>
AuthorDate: Tue Jun 23 14:08:19 2026 +0100
Ensure Micrometer app.info metric version tag resolves correctly for all
Quarkus package types
---
.../micrometer/deployment/MicrometerProcessor.java | 54 ++++++++++++++++++++++
.../micrometer/it/MicrometerResource.java | 18 ++++++++
.../component/micrometer/it/MicrometerTest.java | 15 +++++-
3 files changed, 86 insertions(+), 1 deletion(-)
diff --git
a/extensions/micrometer/deployment/src/main/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerProcessor.java
b/extensions/micrometer/deployment/src/main/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerProcessor.java
index 1bc904c4ed..ee0755b448 100644
---
a/extensions/micrometer/deployment/src/main/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerProcessor.java
+++
b/extensions/micrometer/deployment/src/main/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerProcessor.java
@@ -20,10 +20,13 @@ import java.util.List;
import java.util.Optional;
import io.micrometer.core.instrument.MeterRegistry;
+import io.quarkus.builder.Version;
import io.quarkus.deployment.annotations.BuildStep;
import io.quarkus.deployment.annotations.ExecutionTime;
import io.quarkus.deployment.annotations.Record;
+import io.quarkus.deployment.builditem.BytecodeTransformerBuildItem;
import io.quarkus.deployment.builditem.FeatureBuildItem;
+import io.quarkus.gizmo.Gizmo;
import io.quarkus.micrometer.deployment.MicrometerProcessor.MicrometerEnabled;
import io.quarkus.micrometer.deployment.MicrometerRegistryProviderBuildItem;
import io.quarkus.micrometer.deployment.RootMeterRegistryBuildItem;
@@ -33,6 +36,9 @@ import
org.apache.camel.quarkus.component.micrometer.CamelMicrometerRecorder;
import org.apache.camel.quarkus.core.deployment.spi.CamelBeanBuildItem;
import
org.apache.camel.quarkus.core.deployment.spi.CamelContextCustomizerBuildItem;
import
org.apache.camel.quarkus.core.deployment.spi.RuntimeCamelContextCustomizerBuildItem;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
class MicrometerProcessor {
@@ -81,4 +87,52 @@ class MicrometerProcessor {
recorder.configureDefaultRegistry(registry.get().getValue());
}
}
+
+ @BuildStep
+ BytecodeTransformerBuildItem generateRuntimeInfoMetricVersion() {
+ // Force the app.info metric version tag value, to avoid runtime
usages of reflection
+ // and other dynamic version lookup strategies that may not work with
all Quarkus package
+ // types. Such as uber-jar and native images
+ String quarkusVersion = Version.getVersion();
+ return new BytecodeTransformerBuildItem.Builder()
+ .setClassToTransform(
+
"org.apache.camel.component.micrometer.json.AbstractMicrometerService$RuntimeInfo")
+ .setCacheable(true)
+ .setVisitorFunction(
+ (className, classVisitor) -> new
RuntimeInfoClassVisitor(classVisitor, quarkusVersion))
+ .build();
+ }
+
+ static class RuntimeInfoClassVisitor extends ClassVisitor {
+ private final String quarkusVersion;
+
+ protected RuntimeInfoClassVisitor(ClassVisitor classVisitor, String
quarkusVersion) {
+ super(Gizmo.ASM_API_VERSION, classVisitor);
+ this.quarkusVersion = quarkusVersion;
+ }
+
+ @Override
+ public MethodVisitor visitMethod(int access, String name, String
descriptor, String signature,
+ String[] exceptions) {
+ MethodVisitor original = super.visitMethod(access, name,
descriptor, signature, exceptions);
+ if ("scan".equals(name)) {
+ return new MethodVisitor(Gizmo.ASM_API_VERSION, original) {
+ @Override
+ public void visitCode() {
+ super.visitCode();
+ visitLdcInsn(quarkusVersion);
+ visitMethodInsn(Opcodes.INVOKESTATIC,
"java/util/Optional", "of",
+ "(Ljava/lang/Object;)Ljava/util/Optional;",
false);
+ visitInsn(Opcodes.ARETURN);
+ }
+
+ @Override
+ public void visitMaxs(int maxStack, int maxLocals) {
+ super.visitMaxs(1, 1);
+ }
+ };
+ }
+ return original;
+ }
+ }
}
diff --git
a/integration-tests/micrometer/src/main/java/org/apache/camel/quarkus/component/micrometer/it/MicrometerResource.java
b/integration-tests/micrometer/src/main/java/org/apache/camel/quarkus/component/micrometer/it/MicrometerResource.java
index a4dcff44e5..50b24d0bb6 100644
---
a/integration-tests/micrometer/src/main/java/org/apache/camel/quarkus/component/micrometer/it/MicrometerResource.java
+++
b/integration-tests/micrometer/src/main/java/org/apache/camel/quarkus/component/micrometer/it/MicrometerResource.java
@@ -17,11 +17,14 @@
package org.apache.camel.quarkus.component.micrometer.it;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
+import java.util.Map;
import java.util.NoSuchElementException;
import java.util.concurrent.TimeUnit;
+import io.micrometer.core.instrument.Gauge;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Tag;
import io.micrometer.core.instrument.Tags;
@@ -229,4 +232,19 @@ public class MicrometerResource {
producerTemplate.sendBody("direct:dumpAsJson", "hello");
return Response.ok().build();
}
+
+ @Path("/appInfo")
+ @Produces(MediaType.APPLICATION_JSON)
+ @GET
+ public Response appInfo() {
+ Gauge appInfo = prometheusMeterRegistry.find("app.info").gauge();
+ if (appInfo == null) {
+ return Response.status(500).entity("app.info appInfo not
found").build();
+ }
+ Map<String, String> tags = new HashMap<>();
+ for (Tag tag : appInfo.getId().getTags()) {
+ tags.put(tag.getKey(), tag.getValue());
+ }
+ return Response.ok(tags).build();
+ }
}
diff --git
a/integration-tests/micrometer/src/test/java/org/apache/camel/quarkus/component/micrometer/it/MicrometerTest.java
b/integration-tests/micrometer/src/test/java/org/apache/camel/quarkus/component/micrometer/it/MicrometerTest.java
index ec18e5aa14..e456bc3f7e 100644
---
a/integration-tests/micrometer/src/test/java/org/apache/camel/quarkus/component/micrometer/it/MicrometerTest.java
+++
b/integration-tests/micrometer/src/test/java/org/apache/camel/quarkus/component/micrometer/it/MicrometerTest.java
@@ -38,6 +38,8 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.not;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -207,7 +209,7 @@ class MicrometerTest extends AbstractMicrometerTest {
return
filteredResult.values().stream().map(String::valueOf).collect(Collectors.joining());
},
//1 exchange with completed status should be caught
- Matchers.is("1"));
+ is("1"));
}
@ParameterizedTest
@@ -255,6 +257,17 @@ class MicrometerTest extends AbstractMicrometerTest {
}
+ @Test
+ void testAppInfo() {
+ RestAssured.get("/micrometer/appInfo")
+ .then()
+ .statusCode(200)
+ .body("'camel.runtime.provider'", is("Quarkus"))
+ // Avoid matching against explicit versions as it could change
if the Quarkus Platform is updated with a new Quarkus Core
+ .body("'camel.runtime.version'", not(Matchers.emptyString()))
+ .body("'camel.context'", is("quarkus-camel-micrometer"));
+ }
+
@Test
public void micrometerHistoryShouldBeAvailableThroughCamelContext() throws
Exception {
JsonPath jsonPath = RestAssured.get("/micrometer/history")