@@ -14,9 +14,9 @@ use axum::response::IntoResponse;
14
14
use clap:: Parser ;
15
15
use itertools:: Itertools ;
16
16
use metrics_exporter_prometheus:: PrometheusBuilder ;
17
- use serde:: { Deserialize , Serialize } ;
18
17
use tracing:: * ;
19
18
19
+ use clickhouse_client:: ClickhouseQuery ;
20
20
use sqlsonnet:: { FsResolver , Queries , Query } ;
21
21
22
22
lazy_static:: lazy_static! {
@@ -30,14 +30,9 @@ lazy_static::lazy_static! {
30
30
#[ derive( Clone , Parser ) ]
31
31
#[ clap( version) ]
32
32
pub struct Flags {
33
- // URL to the Clickhouse HTTP endpoint
33
+ // URL to the Clickhouse HTTP endpoint, with username and password if necessary
34
34
#[ clap( long, env = "CLICKHOUSE_URL" ) ]
35
35
pub url : reqwest:: Url ,
36
- /// Clickhouse username
37
- #[ clap( long, env = "CLICKHOUSE_USERNAME" ) ]
38
- pub username : String ,
39
- #[ clap( long, env = "CLICKHOUSE_PASSWORD" ) ]
40
- pub password : Option < String > ,
41
36
#[ clap( long) ]
42
37
pub cache : Option < PathBuf > ,
43
38
/// Folder with Jsonnet library files
@@ -102,19 +97,6 @@ async fn handle_query(
102
97
. await
103
98
}
104
99
105
- #[ derive( Clone , Debug , Serialize , Deserialize , Hash ) ]
106
- pub struct ClickhouseQuery {
107
- query : String ,
108
- params : BTreeMap < String , String > ,
109
- }
110
- impl ClickhouseQuery {
111
- fn heartbeat ( ) -> Self {
112
- Self {
113
- query : "SELECT 1+1" . into ( ) ,
114
- params : Default :: default ( ) ,
115
- }
116
- }
117
- }
118
100
pub struct PreparedRequest {
119
101
id : u64 ,
120
102
query : Option < ClickhouseQuery > ,
@@ -138,7 +120,7 @@ impl PreparedRequest {
138
120
139
121
#[ derive( Clone ) ]
140
122
struct State {
141
- client : reqwest :: Client ,
123
+ client : clickhouse_client :: HttpClient ,
142
124
args : Arc < Flags > ,
143
125
resolver : Arc < FsResolver > ,
144
126
cache : Option < Arc < cache:: Cache > > ,
@@ -147,7 +129,7 @@ struct State {
147
129
impl State {
148
130
fn new ( args : & Flags ) -> Result < Self , Error > {
149
131
Ok ( Self {
150
- client : reqwest :: Client :: new ( ) ,
132
+ client : clickhouse_client :: HttpClient :: new ( args . url . clone ( ) ) ,
151
133
resolver : sqlsonnet:: FsResolver :: new (
152
134
args. library . clone ( ) . map ( |p| vec ! [ p] ) . unwrap_or_default ( ) ,
153
135
)
@@ -177,24 +159,15 @@ impl State {
177
159
// Hash query
178
160
let mut hasher = DefaultHasher :: default ( ) ;
179
161
query. hash ( & mut hasher) ;
180
- self . args . username . hash ( & mut hasher) ;
181
- self . args . password . hash ( & mut hasher) ;
182
- let inner = self
183
- . client
184
- . post ( self . args . url . clone ( ) )
185
- . body ( query. query . clone ( ) )
186
- . query ( & query. params )
187
- . header ( reqwest:: header:: TRANSFER_ENCODING , "chunked" )
188
- . basic_auth ( & self . args . username , self . args . password . clone ( ) ) ;
162
+ let builder = self . client . prepare_request ( & query) ;
189
163
PreparedRequest {
190
164
id : hasher. finish ( ) ,
191
165
query : Some ( query) ,
192
- builder : inner ,
166
+ builder,
193
167
}
194
168
}
195
169
async fn send_query ( & self , query : ClickhouseQuery ) -> Result < axum:: response:: Response , Error > {
196
170
let request = self . prepare_request ( query) ;
197
-
198
171
if let Some ( cache) = & self . cache {
199
172
Ok ( cache. process ( request) . await ?)
200
173
} else {
@@ -208,7 +181,10 @@ impl State {
208
181
}
209
182
async fn test_clickhouse ( & self ) -> Result < ( ) , ClickhouseError > {
210
183
let resp = self
211
- . prepare_request ( ClickhouseQuery :: heartbeat ( ) )
184
+ . prepare_request ( ClickhouseQuery {
185
+ query : "SELECT 1+1" . into ( ) ,
186
+ params : Default :: default ( ) ,
187
+ } )
212
188
. send ( )
213
189
. await ?;
214
190
let headers = resp. headers ( ) . clone ( ) ;
0 commit comments