2323import org .apache .arrow .vector .VectorSchemaRoot ;
2424import org .apache .arrow .vector .ipc .ArrowStreamReader ;
2525import org .awaitility .Awaitility ;
26+ import org .slf4j .Logger ;
27+ import org .slf4j .LoggerFactory ;
2628import relationalai .protocol .Message ;
2729
2830import java .io .*;
@@ -62,6 +64,8 @@ public class Client {
6264 defaultHeaders .put ("User-Agent" , userAgent ());
6365 }
6466
67+ private Logger logger ;
68+
6569 public Client () {}
6670
6771 // Note, creating a client from config will also enable the default access
@@ -70,6 +74,10 @@ public Client() {}
7074 // alternate implementation of AccessTokenHandler handler, or it can be
7175 // disabled by caling setAccessTokenHandler(null).
7276 public Client (Config cfg ) {
77+ this (cfg , LoggerFactory .getLogger ("rai" ));
78+ }
79+
80+ public Client (Config cfg , Logger logger ) {
7381 if (cfg .region != null )
7482 this .region = cfg .region ;
7583 if (cfg .scheme != null )
@@ -81,9 +89,10 @@ public Client(Config cfg) {
8189 this .httpClient = HttpClient .newBuilder ().build ();
8290 this .credentials = cfg .credentials ;
8391 this .setAccessTokenHandler (new DefaultAccessTokenHandler ());
92+ this .logger = logger ;
8493 }
8594
86- // Returns the current `HttpClient` instance, creating one if necessarry .
95+ // Returns the current `HttpClient` instance, creating one if necessary .
8796 public HttpClient getHttpClient () {
8897 return this .httpClient ;
8998 }
@@ -267,10 +276,16 @@ Object sendRequest(HttpRequest.Builder builder, Map<String, String> extraHeaders
267276 HttpResponse <byte []> response =
268277 getHttpClient ().send (request , HttpResponse .BodyHandlers .ofByteArray ());
269278
270- int statusCode = response .statusCode ();
271- String contentType = response .headers ().firstValue ("Content-Type" ).orElse ("" );
279+ var statusCode = response .statusCode ();
280+ var contentType = response .headers ().firstValue ("Content-Type" ).orElse ("" );
281+ var requestId = response .headers ().firstValue ("X-Request-ID" ).orElse ("" );
282+ var userAgent = response .request ().headers ().firstValue ("User-Agent" ).orElse ("" );
283+ logger .debug ("{} {} {} {} {} {} {}" ,
284+ response .request ().method (),
285+ response .version (), response .request ().headers ().firstValue ("Content-Type" ).orElse ("" ),
286+ response .request ().uri (), statusCode , userAgent , requestId );
287+
272288 if (statusCode >= 400 ) {
273- var requestId = response .headers ().firstValue ("x-request-id" ).orElse ("" );
274289 throw new HttpError (
275290 statusCode ,
276291 String .format ("(request_id: %s) %s" , requestId , new String (response .body (), StandardCharsets .UTF_8 ))
@@ -586,6 +601,7 @@ public Engine[] listEngines(String state)
586601
587602 public OAuthClientExtra createOAuthClient (String name )
588603 throws HttpError , InterruptedException , IOException {
604+ logger .info ("createOAuthClient {}" , name );
589605 return createOAuthClient (name , null );
590606 }
591607
@@ -739,7 +755,7 @@ public TransactionAsyncResult execute(
739755 String database , String engine ,
740756 String source , boolean readonly ,
741757 Map <String , String > inputs ) throws HttpError , IOException , InterruptedException {
742-
758+ logger . info ( "execute: database {}, engine {}, readonly {}" , database , engine , readonly );
743759 var id = executeAsync (database , engine , source , readonly , inputs ).transaction .id ;
744760
745761 Awaitility .await ()
0 commit comments