19
19
import java .util .List ;
20
20
21
21
import io .micrometer .tracing .Tracer ;
22
+ import io .micrometer .tracing .annotation .DefaultNewSpanParser ;
23
+ import io .micrometer .tracing .annotation .ImperativeMethodInvocationProcessor ;
24
+ import io .micrometer .tracing .annotation .MethodInvocationProcessor ;
25
+ import io .micrometer .tracing .annotation .NewSpanParser ;
26
+ import io .micrometer .tracing .annotation .SpanAspect ;
27
+ import io .micrometer .tracing .annotation .SpanTagAnnotationHandler ;
22
28
import io .micrometer .tracing .handler .DefaultTracingObservationHandler ;
23
29
import io .micrometer .tracing .handler .PropagatingReceiverTracingObservationHandler ;
24
30
import io .micrometer .tracing .handler .PropagatingSenderTracingObservationHandler ;
25
31
import io .micrometer .tracing .handler .TracingObservationHandler ;
26
32
import io .micrometer .tracing .propagation .Propagator ;
33
+ import org .aspectj .weaver .Advice ;
27
34
import org .junit .jupiter .api .Test ;
28
35
29
36
import org .springframework .boot .autoconfigure .AutoConfigurations ;
37
+ import org .springframework .boot .autoconfigure .condition .ConditionalOnMissingBean ;
30
38
import org .springframework .boot .test .context .FilteredClassLoader ;
31
39
import org .springframework .boot .test .context .runner .ApplicationContextRunner ;
32
40
import org .springframework .context .annotation .Bean ;
33
41
import org .springframework .context .annotation .Configuration ;
42
+ import org .springframework .test .util .ReflectionTestUtils ;
34
43
35
44
import static org .assertj .core .api .Assertions .assertThat ;
36
45
import static org .mockito .Mockito .mock ;
39
48
* Tests for {@link MicrometerTracingAutoConfiguration}.
40
49
*
41
50
* @author Moritz Halbritter
51
+ * @author Jonatan Ivanov
42
52
*/
43
53
class MicrometerTracingAutoConfigurationTests {
44
54
@@ -52,6 +62,9 @@ void shouldSupplyBeans() {
52
62
assertThat (context ).hasSingleBean (DefaultTracingObservationHandler .class );
53
63
assertThat (context ).hasSingleBean (PropagatingReceiverTracingObservationHandler .class );
54
64
assertThat (context ).hasSingleBean (PropagatingSenderTracingObservationHandler .class );
65
+ assertThat (context ).hasSingleBean (DefaultNewSpanParser .class );
66
+ assertThat (context ).hasSingleBean (ImperativeMethodInvocationProcessor .class );
67
+ assertThat (context ).hasSingleBean (SpanAspect .class );
55
68
});
56
69
}
57
70
@@ -75,14 +88,21 @@ void shouldSupplyBeansInCorrectOrder() {
75
88
76
89
@ Test
77
90
void shouldBackOffOnCustomBeans () {
78
- this .contextRunner .withUserConfiguration (CustomConfiguration .class ).run ((context ) -> {
79
- assertThat (context ).hasBean ("customDefaultTracingObservationHandler" );
80
- assertThat (context ).hasSingleBean (DefaultTracingObservationHandler .class );
81
- assertThat (context ).hasBean ("customPropagatingReceiverTracingObservationHandler" );
82
- assertThat (context ).hasSingleBean (PropagatingReceiverTracingObservationHandler .class );
83
- assertThat (context ).hasBean ("customPropagatingSenderTracingObservationHandler" );
84
- assertThat (context ).hasSingleBean (PropagatingSenderTracingObservationHandler .class );
85
- });
91
+ this .contextRunner .withUserConfiguration (TracerConfiguration .class , CustomConfiguration .class )
92
+ .run ((context ) -> {
93
+ assertThat (context ).hasBean ("customDefaultTracingObservationHandler" );
94
+ assertThat (context ).hasSingleBean (DefaultTracingObservationHandler .class );
95
+ assertThat (context ).hasBean ("customPropagatingReceiverTracingObservationHandler" );
96
+ assertThat (context ).hasSingleBean (PropagatingReceiverTracingObservationHandler .class );
97
+ assertThat (context ).hasBean ("customPropagatingSenderTracingObservationHandler" );
98
+ assertThat (context ).hasSingleBean (PropagatingSenderTracingObservationHandler .class );
99
+ assertThat (context ).hasBean ("customDefaultNewSpanParser" );
100
+ assertThat (context ).hasSingleBean (DefaultNewSpanParser .class );
101
+ assertThat (context ).hasBean ("customImperativeMethodInvocationProcessor" );
102
+ assertThat (context ).hasSingleBean (ImperativeMethodInvocationProcessor .class );
103
+ assertThat (context ).hasBean ("customSpanAspect" );
104
+ assertThat (context ).hasSingleBean (SpanAspect .class );
105
+ });
86
106
}
87
107
88
108
@ Test
@@ -91,6 +111,9 @@ void shouldNotSupplyBeansIfMicrometerIsMissing() {
91
111
assertThat (context ).doesNotHaveBean (DefaultTracingObservationHandler .class );
92
112
assertThat (context ).doesNotHaveBean (PropagatingReceiverTracingObservationHandler .class );
93
113
assertThat (context ).doesNotHaveBean (PropagatingSenderTracingObservationHandler .class );
114
+ assertThat (context ).doesNotHaveBean (DefaultNewSpanParser .class );
115
+ assertThat (context ).doesNotHaveBean (ImperativeMethodInvocationProcessor .class );
116
+ assertThat (context ).doesNotHaveBean (SpanAspect .class );
94
117
});
95
118
}
96
119
@@ -100,17 +123,47 @@ void shouldNotSupplyBeansIfTracerIsMissing() {
100
123
assertThat (context ).doesNotHaveBean (DefaultTracingObservationHandler .class );
101
124
assertThat (context ).doesNotHaveBean (PropagatingReceiverTracingObservationHandler .class );
102
125
assertThat (context ).doesNotHaveBean (PropagatingSenderTracingObservationHandler .class );
126
+ assertThat (context ).doesNotHaveBean (DefaultNewSpanParser .class );
127
+ assertThat (context ).doesNotHaveBean (ImperativeMethodInvocationProcessor .class );
128
+ assertThat (context ).doesNotHaveBean (SpanAspect .class );
103
129
});
104
130
}
105
131
132
+ @ Test
133
+ void shouldNotSupplyBeansIfAspectjIsMissing () {
134
+ this .contextRunner .withUserConfiguration (TracerConfiguration .class )
135
+ .withClassLoader (new FilteredClassLoader (Advice .class ))
136
+ .run ((context ) -> {
137
+ assertThat (context ).doesNotHaveBean (DefaultNewSpanParser .class );
138
+ assertThat (context ).doesNotHaveBean (ImperativeMethodInvocationProcessor .class );
139
+ assertThat (context ).doesNotHaveBean (SpanAspect .class );
140
+ });
141
+ }
142
+
106
143
@ Test
107
144
void shouldNotSupplyBeansIfPropagatorIsMissing () {
108
145
this .contextRunner .withUserConfiguration (TracerConfiguration .class ).run ((context ) -> {
109
146
assertThat (context ).doesNotHaveBean (PropagatingSenderTracingObservationHandler .class );
110
147
assertThat (context ).doesNotHaveBean (PropagatingReceiverTracingObservationHandler .class );
148
+
149
+ assertThat (context ).hasSingleBean (DefaultNewSpanParser .class );
150
+ assertThat (context ).hasSingleBean (ImperativeMethodInvocationProcessor .class );
151
+ assertThat (context ).hasSingleBean (SpanAspect .class );
111
152
});
112
153
}
113
154
155
+ @ Test
156
+ void shouldConfigureSpanTagAnnotationHandler () {
157
+ this .contextRunner .withUserConfiguration (TracerConfiguration .class , SpanTagAnnotationHandlerConfiguration .class )
158
+ .run ((context ) -> {
159
+ assertThat (context ).hasSingleBean (DefaultNewSpanParser .class );
160
+ assertThat (context ).hasSingleBean (SpanAspect .class );
161
+ assertThat (ReflectionTestUtils .getField (context .getBean (ImperativeMethodInvocationProcessor .class ),
162
+ "spanTagAnnotationHandler" ))
163
+ .isSameAs (context .getBean (SpanTagAnnotationHandler .class ));
164
+ });
165
+ }
166
+
114
167
@ Configuration (proxyBeanMethods = false )
115
168
private static class TracerConfiguration {
116
169
@@ -149,6 +202,34 @@ PropagatingSenderTracingObservationHandler<?> customPropagatingSenderTracingObse
149
202
return mock (PropagatingSenderTracingObservationHandler .class );
150
203
}
151
204
205
+ @ Bean
206
+ DefaultNewSpanParser customDefaultNewSpanParser () {
207
+ return new DefaultNewSpanParser ();
208
+ }
209
+
210
+ @ Bean
211
+ @ ConditionalOnMissingBean
212
+ ImperativeMethodInvocationProcessor customImperativeMethodInvocationProcessor (NewSpanParser newSpanParser ,
213
+ Tracer tracer ) {
214
+ return new ImperativeMethodInvocationProcessor (newSpanParser , tracer );
215
+ }
216
+
217
+ @ Bean
218
+ @ ConditionalOnMissingBean
219
+ SpanAspect customSpanAspect (MethodInvocationProcessor methodInvocationProcessor ) {
220
+ return new SpanAspect (methodInvocationProcessor );
221
+ }
222
+
223
+ }
224
+
225
+ @ Configuration (proxyBeanMethods = false )
226
+ private static class SpanTagAnnotationHandlerConfiguration {
227
+
228
+ @ Bean
229
+ SpanTagAnnotationHandler spanTagAnnotationHandler () {
230
+ return new SpanTagAnnotationHandler ((aClass ) -> null , (aClass ) -> null );
231
+ }
232
+
152
233
}
153
234
154
235
}
0 commit comments