Skip to content

Commit d9c031d

Browse files
Add docs for multiple MeterTag annotations
See #4081
1 parent 09810cc commit d9c031d

File tree

6 files changed

+245
-13
lines changed

6 files changed

+245
-13
lines changed

docs/modules/ROOT/pages/concepts/counters.adoc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,10 @@ include::{include-java}/metrics/CountedAspectTest.java[tags=example_value_resolv
118118
119119
// Example for calling the provided <ValueExpressionResolver>
120120
include::{include-java}/metrics/CountedAspectTest.java[tags=example_value_spel,indent=0]
121+
122+
// Example for using multiple @MeterTag annotations on the same parameter
123+
// @MeterTags({ @MeterTag(...), @MeterTag(...) }) can be also used
124+
include::{include-java}/metrics/CountedAspectTest.java[tags=example_multi_annotations,indent=0]
121125
-----
122126

123127
== Function-tracking Counters

docs/modules/ROOT/pages/concepts/timers.adoc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,10 @@ include::{include-java}/metrics/TimedAspectTest.java[tags=example_value_resolver
144144
145145
// Example for calling the provided <ValueExpressionResolver>
146146
include::{include-java}/metrics/TimedAspectTest.java[tags=example_value_spel,indent=0]
147+
148+
// Example for using multiple @MeterTag annotations on the same parameter
149+
// @MeterTags({ @MeterTag(...), @MeterTag(...) }) can be also used
150+
include::{include-java}/metrics/TimedAspectTest.java[tags=example_multi_annotations,indent=0]
147151
-----
148152

149153
== Function-tracking Timers

docs/src/test/java/io/micrometer/docs/metrics/CountedAspectTest.java

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,30 @@ void meterTagsWithExpression(AnnotatedTestClass annotatedClass) {
107107
// end::example_value_spel[]
108108
}
109109

110+
@ParameterizedTest
111+
@EnumSource(AnnotatedTestClass.class)
112+
void multipleMeterTagsWithExpression(AnnotatedTestClass annotatedClass) {
113+
MeterRegistry registry = new SimpleMeterRegistry();
114+
CountedAspect countedAspect = new CountedAspect(registry);
115+
countedAspect.setMeterTagAnnotationHandler(
116+
new CountedMeterTagAnnotationHandler(aClass -> valueResolver, aClass -> valueExpressionResolver));
117+
118+
AspectJProxyFactory pf = new AspectJProxyFactory(annotatedClass.newInstance());
119+
pf.addAspect(countedAspect);
120+
121+
MeterTagClassInterface service = pf.getProxy();
122+
123+
// tag::example_multi_annotations[]
124+
service.getMultipleAnnotationsForTagValueExpression(new DataHolder("zxe", "qwe"));
125+
126+
assertThat(registry.get("method.counted")
127+
.tag("value1", "value1: zxe")
128+
.tag("value2", "value2: qwe")
129+
.counter()
130+
.count()).isEqualTo(1);
131+
// end::example_multi_annotations[]
132+
}
133+
110134
enum AnnotatedTestClass {
111135

112136
CLASS_WITHOUT_INTERFACE(MeterTagClass.class), CLASS_WITH_INTERFACE(MeterTagClassChild.class);
@@ -142,6 +166,11 @@ void getAnnotationForTagValueExpression(
142166
@Counted
143167
void getAnnotationForArgumentToString(@MeterTag("test") Long param);
144168

169+
@Counted
170+
void getMultipleAnnotationsForTagValueExpression(
171+
@MeterTag(key = "value1", expression = "'value1: ' + value1") @MeterTag(key = "value2",
172+
expression = "'value2: ' + value2") DataHolder param);
173+
145174
}
146175
// end::interface[]
147176

@@ -164,6 +193,13 @@ public void getAnnotationForTagValueExpression(
164193
public void getAnnotationForArgumentToString(@MeterTag("test") Long param) {
165194
}
166195

196+
@Counted
197+
@Override
198+
public void getMultipleAnnotationsForTagValueExpression(
199+
@MeterTag(key = "value1", expression = "'value1: ' + value1") @MeterTag(key = "value2",
200+
expression = "'value2: ' + value2") DataHolder param) {
201+
}
202+
167203
}
168204

169205
static class MeterTagClassChild implements MeterTagClassInterface {
@@ -183,6 +219,33 @@ public void getAnnotationForTagValueExpression(String test) {
183219
public void getAnnotationForArgumentToString(Long param) {
184220
}
185221

222+
@Counted
223+
@Override
224+
public void getMultipleAnnotationsForTagValueExpression(
225+
@MeterTag(key = "value2", expression = "'value2: ' + value2") DataHolder param) {
226+
}
227+
228+
}
229+
230+
static class DataHolder {
231+
232+
private final String value1;
233+
234+
private final String value2;
235+
236+
private DataHolder(String value1, String value2) {
237+
this.value1 = value1;
238+
this.value2 = value2;
239+
}
240+
241+
public String getValue1() {
242+
return value1;
243+
}
244+
245+
public String getValue2() {
246+
return value2;
247+
}
248+
186249
}
187250

188251
}

docs/src/test/java/io/micrometer/docs/metrics/TimedAspectTest.java

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,28 @@ void meterTagsWithExpression(AnnotatedTestClass annotatedClass) {
107107
// end::example_value_spel[]
108108
}
109109

110+
@ParameterizedTest
111+
@EnumSource(AnnotatedTestClass.class)
112+
void multipleMeterTagsWithExpression(AnnotatedTestClass annotatedClass) {
113+
MeterRegistry registry = new SimpleMeterRegistry();
114+
TimedAspect timedAspect = new TimedAspect(registry);
115+
timedAspect.setMeterTagAnnotationHandler(
116+
new MeterTagAnnotationHandler(aClass -> valueResolver, aClass -> valueExpressionResolver));
117+
118+
AspectJProxyFactory pf = new AspectJProxyFactory(annotatedClass.newInstance());
119+
pf.addAspect(timedAspect);
120+
121+
MeterTagClassInterface service = pf.getProxy();
122+
123+
// tag::example_multi_annotations[]
124+
service.getMultipleAnnotationsForTagValueExpression(new DataHolder("zxe", "qwe"));
125+
126+
assertThat(
127+
registry.get("method.timed").tag("value1", "value1: zxe").tag("value2", "value2: qwe").timer().count())
128+
.isEqualTo(1);
129+
// end::example_multi_annotations[]
130+
}
131+
110132
enum AnnotatedTestClass {
111133

112134
CLASS_WITHOUT_INTERFACE(MeterTagClass.class), CLASS_WITH_INTERFACE(MeterTagClassChild.class);
@@ -142,6 +164,11 @@ void getAnnotationForTagValueExpression(
142164
@Timed
143165
void getAnnotationForArgumentToString(@MeterTag("test") Long param);
144166

167+
@Timed
168+
void getMultipleAnnotationsForTagValueExpression(
169+
@MeterTag(key = "value1", expression = "'value1: ' + value1") @MeterTag(key = "value2",
170+
expression = "'value2: ' + value2") DataHolder param);
171+
145172
}
146173
// end::interface[]
147174

@@ -164,6 +191,13 @@ public void getAnnotationForTagValueExpression(
164191
public void getAnnotationForArgumentToString(@MeterTag("test") Long param) {
165192
}
166193

194+
@Timed
195+
@Override
196+
public void getMultipleAnnotationsForTagValueExpression(
197+
@MeterTag(key = "value1", expression = "'value1: ' + value1") @MeterTag(key = "value2",
198+
expression = "'value2: ' + value2") DataHolder param) {
199+
}
200+
167201
}
168202

169203
static class MeterTagClassChild implements MeterTagClassInterface {
@@ -183,6 +217,33 @@ public void getAnnotationForTagValueExpression(String test) {
183217
public void getAnnotationForArgumentToString(Long param) {
184218
}
185219

220+
@Timed
221+
@Override
222+
public void getMultipleAnnotationsForTagValueExpression(
223+
@MeterTag(key = "value2", expression = "'value2: ' + value2") DataHolder param) {
224+
}
225+
226+
}
227+
228+
static class DataHolder {
229+
230+
private final String value1;
231+
232+
private final String value2;
233+
234+
private DataHolder(String value1, String value2) {
235+
this.value1 = value1;
236+
this.value2 = value2;
237+
}
238+
239+
public String getValue1() {
240+
return value1;
241+
}
242+
243+
public String getValue2() {
244+
return value2;
245+
}
246+
186247
}
187248

188249
}

samples/micrometer-samples-spring-framework6/src/test/java/io/micrometer/samples/spring6/aop/CountedAspectTest.java

Lines changed: 103 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,7 @@
1919
import io.micrometer.common.annotation.ValueResolver;
2020
import io.micrometer.core.Issue;
2121
import io.micrometer.core.annotation.Counted;
22-
import io.micrometer.core.aop.CountedAspect;
23-
import io.micrometer.core.aop.CountedMeterTagAnnotationHandler;
24-
import io.micrometer.core.aop.MeterTag;
22+
import io.micrometer.core.aop.*;
2523
import io.micrometer.core.instrument.Counter;
2624
import io.micrometer.core.instrument.MeterRegistry;
2725
import io.micrometer.core.instrument.Tag;
@@ -496,6 +494,49 @@ void meterTagsWithExpression(AnnotatedTestClass annotatedClass) {
496494
assertThat(registry.get("method.counted").tag("test", "hello characters").counter().count()).isEqualTo(1);
497495
}
498496

497+
@ParameterizedTest
498+
@EnumSource(AnnotatedTestClass.class)
499+
void multipleMeterTagsWithExpression(AnnotatedTestClass annotatedClass) {
500+
MeterRegistry registry = new SimpleMeterRegistry();
501+
CountedAspect countedAspect = new CountedAspect(registry);
502+
countedAspect.setMeterTagAnnotationHandler(meterTagAnnotationHandler);
503+
504+
AspectJProxyFactory pf = new AspectJProxyFactory(annotatedClass.newInstance());
505+
pf.addAspect(countedAspect);
506+
507+
MeterTagClassInterface service = pf.getProxy();
508+
509+
service.getMultipleAnnotationsForTagValueExpression(new DataHolder("zxe", "qwe"));
510+
511+
assertThat(registry.get("method.counted")
512+
.tag("value1", "value1: zxe")
513+
.tag("value2", "value2.overridden: qwe")
514+
.counter()
515+
.count()).isEqualTo(1);
516+
}
517+
518+
@ParameterizedTest
519+
@EnumSource(AnnotatedTestClass.class)
520+
void multipleMeterTagsWithinContainerWithExpression(AnnotatedTestClass annotatedClass) {
521+
MeterRegistry registry = new SimpleMeterRegistry();
522+
CountedAspect countedAspect = new CountedAspect(registry);
523+
countedAspect.setMeterTagAnnotationHandler(meterTagAnnotationHandler);
524+
525+
AspectJProxyFactory pf = new AspectJProxyFactory(annotatedClass.newInstance());
526+
pf.addAspect(countedAspect);
527+
528+
MeterTagClassInterface service = pf.getProxy();
529+
530+
service.getMultipleAnnotationsWithContainerForTagValueExpression(new DataHolder("zxe", "qwe"));
531+
532+
assertThat(registry.get("method.counted")
533+
.tag("value1", "value1: zxe")
534+
.tag("value2", "value2: qwe")
535+
.tag("value3", "value3.overridden: ZXEQWE")
536+
.counter()
537+
.count()).isEqualTo(1);
538+
}
539+
499540
@Test
500541
void meterTagOnPackagePrivateMethod() {
501542
MeterRegistry registry = new SimpleMeterRegistry();
@@ -547,6 +588,17 @@ void getAnnotationForTagValueExpression(
547588
@Counted
548589
void getAnnotationForArgumentToString(@MeterTag("test") Long param);
549590

591+
@Counted
592+
void getMultipleAnnotationsForTagValueExpression(
593+
@MeterTag(key = "value1", expression = "'value1: ' + value1") @MeterTag(key = "value2",
594+
expression = "'value2: ' + value2") DataHolder param);
595+
596+
@Counted
597+
void getMultipleAnnotationsWithContainerForTagValueExpression(@MeterTags({
598+
@MeterTag(key = "value1", expression = "'value1: ' + value1"),
599+
@MeterTag(key = "value2", expression = "'value2: ' + value2"), @MeterTag(key = "value3",
600+
expression = "'value3: ' + value1.toUpperCase + value2.toUpperCase") }) DataHolder param);
601+
550602
}
551603

552604
static class MeterTagClass implements MeterTagClassInterface {
@@ -572,6 +624,21 @@ public void getAnnotationForArgumentToString(@MeterTag("test") Long param) {
572624
void getAnnotationForPackagePrivateMethod(@MeterTag("foo") String foo) {
573625
}
574626

627+
@Counted
628+
@Override
629+
public void getMultipleAnnotationsForTagValueExpression(
630+
@MeterTag(key = "value1", expression = "'value1: ' + value1") @MeterTag(key = "value2",
631+
expression = "'value2.overridden: ' + value2") DataHolder param) {
632+
}
633+
634+
@Counted
635+
@Override
636+
public void getMultipleAnnotationsWithContainerForTagValueExpression(@MeterTags({
637+
@MeterTag(key = "value1", expression = "'value1: ' + value1"),
638+
@MeterTag(key = "value2", expression = "'value2: ' + value2"), @MeterTag(key = "value3",
639+
expression = "'value3.overridden: ' + value1.toUpperCase + value2.toUpperCase") }) DataHolder param) {
640+
}
641+
575642
}
576643

577644
static class MeterTagClassChild implements MeterTagClassInterface {
@@ -591,6 +658,39 @@ public void getAnnotationForTagValueExpression(String test) {
591658
public void getAnnotationForArgumentToString(Long param) {
592659
}
593660

661+
@Counted
662+
@Override
663+
public void getMultipleAnnotationsForTagValueExpression(
664+
@MeterTag(key = "value2", expression = "'value2.overridden: ' + value2") DataHolder param) {
665+
}
666+
667+
@Counted
668+
@Override
669+
public void getMultipleAnnotationsWithContainerForTagValueExpression(@MeterTag(key = "value3",
670+
expression = "'value3.overridden: ' + value1.toUpperCase + value2.toUpperCase") DataHolder param) {
671+
}
672+
673+
}
674+
675+
static class DataHolder {
676+
677+
private final String value1;
678+
679+
private final String value2;
680+
681+
private DataHolder(String value1, String value2) {
682+
this.value1 = value1;
683+
this.value2 = value2;
684+
}
685+
686+
public String getValue1() {
687+
return value1;
688+
}
689+
690+
public String getValue2() {
691+
return value2;
692+
}
693+
594694
}
595695

596696
}

0 commit comments

Comments
 (0)