@@ -84,7 +84,7 @@ public void directCounterTest() {
8484
8585 @ Test
8686 void testAllJvmMetrics () {
87- // Force GC to run
87+ // Force GC to run in order to generate metrics data
8888 System .gc ();
8989
9090 // generate load
@@ -103,40 +103,66 @@ void testAllJvmMetrics() {
103103 .isGreaterThanOrEqualTo (allMetrics .size ());
104104 });
105105
106- // System.out.println(getAllMetricNames("jvm."));
107-
108106 allMetrics .forEach (metricToAssert -> {
109107
108+ // metric is there and has at least 1 reading
110109 await ().atMost (10 , SECONDS )
111110 .untilAsserted (() -> assertThat (getMetrics (metricToAssert .name ()).size ())
112111 .withFailMessage ("The metric " + metricToAssert .name ())
113112 .isGreaterThan (0 ));
114113
115- List <Map <String , Object >> metrics = getMetrics (metricToAssert .name ());
116-
117- assertThat (metrics .size ())
118- .withFailMessage (metricToAssert .name () + " not found" )
119- .isGreaterThan (0 );
120-
121- Map <String , Object > lastMetric = metrics .size () > 0 ? metrics .get (metrics .size () - 1 ) : null ;
122-
123- Double value = ((Number ) ((Map ) ((List ) ((Map ) (lastMetric .get ("data" )))
124- .get ("points" ))
125- .get (0 ))
126- .get (metricToAssert .metricType ().equals (HISTOGRAM ) ? "sum" : "value" ))
127- .doubleValue ();
128-
114+ // skip assertions from flaky metrics
129115 if (!metricToAssert .name ().equals ("jvm.memory.used_after_last_gc" ) &&
130116 !metricToAssert .name ().equals ("jvm.cpu.limit" ) &&
131- !metricToAssert .name ().equals ("jvm.cpu.recent_utilization" ) && // skip value assertions on flaky metrics
117+ !metricToAssert .name ().equals ("jvm.cpu.recent_utilization" ) &&
132118 !metricToAssert .name ().equals ("jvm.system.cpu.utilization" )) {
133- assertThat (value )
134- .withFailMessage ("Metric should be greater than 0: " + metricToAssert .name + " value: " + value )
135- .isGreaterThan (0d );
119+
120+ // Correct values might take some time to register
121+ await ().atMost (10 , SECONDS ).untilAsserted (() -> assertThat (getLastReading (metricToAssert ))
122+ .withFailMessage ("Metric must be greater than 0: " + metricToAssert .name )
123+ .isGreaterThan (0d ));
136124 }
137125 });
138126 }
139127
128+ @ Test
129+ void testServerRequestDuration () {
130+ given ()
131+ .when ()
132+ .get ("/nopath" )
133+ .then ()
134+ .statusCode (200 );
135+
136+ await ().atMost (10 , SECONDS ).until (() -> getMetrics ("http.server.request.duration" ).size () > 2 );
137+
138+ List <Map <String , Object >> metrics = getMetrics ("http.server.request.duration" );
139+
140+ Integer value = (Integer ) ((Map ) ((List ) ((Map ) (getMetrics ("http.server.request.duration" )
141+ .get (metrics .size () - 1 )
142+ .get ("data" )))
143+ .get ("points" ))
144+ .get (0 ))
145+ .get ("count" );
146+
147+ assertThat (value ).isGreaterThanOrEqualTo (1 ); // at least one endpoint was called once
148+ }
149+
150+ private static Set <String > getAllMetricNames (String prefix ) {
151+ List <Map <String , Object >> foundMetrics = given ()
152+ .when ()
153+ .get ("/export/metrics" )
154+ .body ().as (new TypeRef <>() {
155+ });
156+
157+ return foundMetrics .stream ()
158+ .filter (m -> ((String ) m .get ("name" )).startsWith (prefix ))
159+ .map (m -> ((String ) m .get ("name" )))
160+ .collect (Collectors .toSet ());
161+ }
162+
163+ record MetricToAssert (String name , String description , String metricUnit , MetricDataType metricType ) {
164+ }
165+
140166 protected Set <MetricToAssert > getJvmMetricsToAssert () {
141167 return Set .of (
142168 // new MetricToAssert("http.server.request.duration", "Duration of HTTP server requests.", "s",
@@ -174,41 +200,19 @@ protected Set<MetricToAssert> getJvmMetricsToAssert() {
174200 LONG_SUM ));
175201 }
176202
177- @ Test
178- void testServerRequestDuration () {
179- given ()
180- .when ()
181- .get ("/nopath" )
182- .then ()
183- .statusCode (200 );
184-
185- await ().atMost (10 , SECONDS ).until (() -> getMetrics ("http.server.request.duration" ).size () > 2 );
186-
187- List <Map <String , Object >> metrics = getMetrics ("http.server.request.duration" );
188-
189- Integer value = (Integer ) ((Map ) ((List ) ((Map ) (getMetrics ("http.server.request.duration" )
190- .get (metrics .size () - 1 )
191- .get ("data" )))
192- .get ("points" ))
193- .get (0 ))
194- .get ("count" );
203+ private Double getLastReading (MetricToAssert metricToAssert ) {
195204
196- assertThat (value ).isGreaterThanOrEqualTo (1 ); // at least one endpoint was called once
197- }
205+ List <Map <String , Object >> metrics = getMetrics (metricToAssert .name ());
198206
199- private static Set <String > getAllMetricNames (String prefix ) {
200- List <Map <String , Object >> foundMetrics = given ()
201- .when ()
202- .get ("/export/metrics" )
203- .body ().as (new TypeRef <>() {
204- });
207+ // assumes metric is there. The test asserts that already.
208+ Map <String , Object > lastReading = metrics .size () > 0 ? metrics .get (metrics .size () - 1 ) : null ;
205209
206- return foundMetrics .stream ()
207- .filter (m -> ((String ) m .get ("name" )).startsWith (prefix ))
208- .map (m -> ((String ) m .get ("name" )))
209- .collect (Collectors .toSet ());
210- }
210+ List pointsList = (List ) ((Map ) (lastReading .get ("data" ))).get ("points" );
211211
212- record MetricToAssert (String name , String description , String metricUnit , MetricDataType metricType ) {
212+ // get last data point from the last reading
213+ return ((Number ) ((Map ) pointsList
214+ .get (pointsList .size () > 0 ? pointsList .size () - 1 : null ))
215+ .get (metricToAssert .metricType ().equals (HISTOGRAM ) ? "sum" : "value" ))
216+ .doubleValue ();
213217 }
214218}
0 commit comments