From 3ebd80a17b7e362151a1d2cf318871fecdd15b54 Mon Sep 17 00:00:00 2001 From: Ladislav Thon Date: Thu, 25 May 2023 11:02:44 +0200 Subject: [PATCH] Fix the Micrometer MP Metrics annotation transformation The annotation transformation replaces an existing annotation with a new one without paying attention to the annotation's target. That's usually OK, because the `TransformationContext` typically contains the correct target, but that isn't true for method parameter annotations. For legacy reasons, the annotation transformation API treats them as annotations on methods, so we need to pay extra attention to preserve the annotation target. This commit does that. --- .../deployment/binder/mpmetrics/AnnotationHandler.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/extensions/micrometer/deployment/src/main/java/io/quarkus/micrometer/deployment/binder/mpmetrics/AnnotationHandler.java b/extensions/micrometer/deployment/src/main/java/io/quarkus/micrometer/deployment/binder/mpmetrics/AnnotationHandler.java index 1645ffbe59ef5e..46ff12cef8293b 100644 --- a/extensions/micrometer/deployment/src/main/java/io/quarkus/micrometer/deployment/binder/mpmetrics/AnnotationHandler.java +++ b/extensions/micrometer/deployment/src/main/java/io/quarkus/micrometer/deployment/binder/mpmetrics/AnnotationHandler.java @@ -71,10 +71,14 @@ public void transform(TransformationContext ctx) { MetricAnnotationInfo annotationInfo = new MetricAnnotationInfo(annotation, index, classInfo, methodInfo, fieldInfo); + // preserve the original annotation target, `ctx.getTarget()` is different in case of method parameters + AnnotationInstance newAnnotation = AnnotationInstance.create(targetAnnotation, annotation.target(), + annotationInfo.getAnnotationValues()); + // Remove the existing annotation, and add a new one with all the fields ctx.transform() .remove(x -> x == annotation) - .add(targetAnnotation, annotationInfo.getAnnotationValues()) + .add(newAnnotation) .done(); } });