2121package land .oras .auth ;
2222
2323import io .micrometer .core .instrument .MeterRegistry ;
24- import io .micrometer .core .instrument .simple .SimpleMeterRegistry ;
24+ import io .micrometer .core .instrument .Metrics ;
25+ import io .micrometer .core .instrument .Timer ;
2526import java .io .FileNotFoundException ;
2627import java .io .InputStream ;
2728import java .net .*;
3738import java .util .List ;
3839import java .util .Map ;
3940import java .util .Objects ;
41+ import java .util .concurrent .TimeUnit ;
4042import java .util .function .Supplier ;
4143import java .util .regex .Matcher ;
4244import java .util .regex .Pattern ;
@@ -108,7 +110,7 @@ private HttpClient() {
108110 this .skipTlsVerify = false ;
109111 this .builder .cookieHandler (new CookieManager (null , CookiePolicy .ACCEPT_NONE ));
110112 this .setTimeout (60 );
111- this .meterRegistry = new SimpleMeterRegistry () ;
113+ this .meterRegistry = Metrics . globalRegistry ;
112114 }
113115
114116 /**
@@ -533,7 +535,7 @@ private <T> ResponseWrapper<T> executeRequest(
533535
534536 HttpRequest request = builder .build ();
535537 logRequest (request , body );
536- HttpResponse <T > response = client . send (request , handler );
538+ HttpResponse <T > response = executeAndRecordRequest (request , handler );
537539
538540 // Follow redirect
539541 if (shouldRedirect (response )) {
@@ -565,6 +567,23 @@ private <T> ResponseWrapper<T> executeRequest(
565567 }
566568 }
567569
570+ private <T > HttpResponse <T > executeAndRecordRequest (HttpRequest request , HttpResponse .BodyHandler <T > handler )
571+ throws Exception {
572+ long start = System .nanoTime ();
573+ HttpResponse <T > response = client .send (request , handler );
574+ long duration = System .nanoTime () - start ;
575+ Timer .builder (Const .METRIC_HTTP_REQUESTS )
576+ .tag ("method" , request .method ())
577+ .tag ("host" , request .uri ().getHost ())
578+ .tag ("status" , response != null ? String .valueOf (response .statusCode ()) : "IO_ERROR" )
579+ .register (meterRegistry )
580+ .record (duration , TimeUnit .NANOSECONDS );
581+ if (response == null ) {
582+ throw new OrasException ("No response received" );
583+ }
584+ return response ;
585+ }
586+
568587 private <T > String getLocationHeader (HttpResponse <T > response ) {
569588 return response .headers ()
570589 .firstValue ("Location" )
@@ -593,7 +612,7 @@ private <T> ResponseWrapper<T> redoRequest(
593612 String service = token .service ();
594613 try {
595614 builder = builder .setHeader (Const .AUTHORIZATION_HEADER , "Bearer " + bearerToken );
596- HttpResponse <T > newResponse = client . send (builder .build (), handler );
615+ HttpResponse <T > newResponse = executeAndRecordRequest (builder .build (), handler );
597616
598617 // Follow redirect
599618 if (shouldRedirect (newResponse )) {
@@ -608,7 +627,9 @@ private <T> ResponseWrapper<T> redoRequest(
608627 }
609628
610629 return toResponseWrapper (
611- client .send (builder .uri (URI .create (location )).build (), handler ), service );
630+ executeAndRecordRequest (
631+ builder .uri (URI .create (location )).build (), handler ),
632+ service );
612633 }
613634 return toResponseWrapper (newResponse , service );
614635
@@ -763,7 +784,6 @@ public Builder withSkipTlsVerify(boolean skipTlsVerify) {
763784
764785 /**
765786 * Set the meter registry for metrics. Following Micrometer best practices for libraries,
766- * a {@link SimpleMeterRegistry} is used by default when no registry is provided.
767787 * @param meterRegistry The meter registry
768788 * @return The builder
769789 */
0 commit comments