Skip to content

Commit 2188b01

Browse files
committed
add few simple metrics to sqld
- libsql_server_total_response_size_before_lock - histogram of TOTAL_RESPOSE_SIZE values before attempt to acquire connection semaphore - libsql_server_stream_handles - guage with current in-memory stream handles - libsql_server_hrana_step_errors - counter with Hrana error codes
1 parent 7aad3e6 commit 2188b01

File tree

4 files changed

+45
-19
lines changed

4 files changed

+45
-19
lines changed

libsql-server/src/connection/mod.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,13 @@ use crate::error::Error;
1313
use crate::http::user::timing::sample_time;
1414
use crate::metrics::{
1515
CONCURRENT_CONNECTIONS_COUNT, CONNECTION_ALIVE_DURATION, CONNECTION_CREATE_TIME,
16+
TOTAL_RESPONSE_SIZE_HIST,
1617
};
1718
use crate::namespace::meta_store::MetaStore;
1819
use crate::namespace::NamespaceName;
1920
use crate::query::{Params, Query};
2021
use crate::query_analysis::Statement;
21-
use crate::query_result_builder::{IgnoreResult, QueryResultBuilder};
22+
use crate::query_result_builder::{IgnoreResult, QueryResultBuilder, TOTAL_RESPONSE_SIZE};
2223
use crate::replication::FrameNo;
2324
use crate::Result;
2425

@@ -352,6 +353,8 @@ impl<F: MakeConnection> MakeConnection for MakeThrottledConnection<F> {
352353
"Available semaphore units: {}",
353354
self.semaphore.available_permits()
354355
);
356+
TOTAL_RESPONSE_SIZE_HIST
357+
.record(TOTAL_RESPONSE_SIZE.load(std::sync::atomic::Ordering::Relaxed) as f64);
355358
let units = self.units_to_take();
356359
let waiters_guard = WaitersGuard::new(&self.waiters);
357360
if (waiters_guard.waiters.load(Ordering::Relaxed) as u64) >= self.max_concurrent_requests {

libsql-server/src/hrana/http/stream.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use tokio::time::{Duration, Instant};
1212

1313
use crate::connection::MakeConnection;
1414
use crate::database::Connection;
15+
use crate::metrics::STREAM_HANDLES_COUNT;
1516

1617
use super::super::ProtocolError;
1718
use super::Server;
@@ -169,6 +170,8 @@ pub async fn acquire<'srv>(
169170
baton_seq: rand::random(),
170171
});
171172
state.handles.insert(stream.stream_id, Handle::Acquired);
173+
STREAM_HANDLES_COUNT.increment(1.0);
174+
172175
tracing::debug!(
173176
"Stream {} was created with baton seq {}",
174177
stream.stream_id,
@@ -253,6 +256,7 @@ impl<'srv> Drop for Guard<'srv> {
253256
tracing::debug!("Stream {stream_id} was released for further use");
254257
} else {
255258
tracing::debug!("Stream {stream_id} was closed");
259+
STREAM_HANDLES_COUNT.decrement(1.0);
256260
}
257261
}
258262
}
@@ -374,6 +378,7 @@ fn pump_expire(state: &mut ServerStreamState, cx: &mut task::Context) {
374378

375379
match state.handles.get_mut(&stream_id) {
376380
Some(handle @ Handle::Available(_)) => {
381+
STREAM_HANDLES_COUNT.decrement(1.0);
377382
*handle = Handle::Expired;
378383
}
379384
_ => continue,

libsql-server/src/hrana/stmt.rs

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use anyhow::{anyhow, bail, Result};
2+
use metrics::counter;
23
use std::collections::HashMap;
34

45
use super::result_builder::SingleStatementBuilder;
@@ -206,39 +207,46 @@ fn catch_stmt_error(sqld_error: SqldError) -> anyhow::Error {
206207
}
207208

208209
pub fn stmt_error_from_sqld_error(sqld_error: SqldError) -> Result<StmtError, SqldError> {
209-
Ok(match sqld_error {
210-
SqldError::LibSqlInvalidQueryParams(source) => StmtError::ArgsInvalid { source },
211-
SqldError::LibSqlTxTimeout => StmtError::TransactionTimeout,
212-
SqldError::LibSqlTxBusy => StmtError::TransactionBusy,
210+
let result = match sqld_error {
211+
SqldError::LibSqlInvalidQueryParams(source) => Ok(StmtError::ArgsInvalid { source }),
212+
SqldError::LibSqlTxTimeout => Ok(StmtError::TransactionTimeout),
213+
SqldError::LibSqlTxBusy => Ok(StmtError::TransactionBusy),
213214
SqldError::BuilderError(QueryResultBuilderError::ResponseTooLarge(_)) => {
214-
StmtError::ResponseTooLarge
215+
Ok(StmtError::ResponseTooLarge)
215216
}
216-
SqldError::Blocked(reason) => StmtError::Blocked { reason },
217-
SqldError::RpcQueryError(e) => StmtError::Proxy(e.message),
217+
SqldError::Blocked(reason) => Ok(StmtError::Blocked { reason }),
218+
SqldError::RpcQueryError(e) => Ok(StmtError::Proxy(e.message)),
218219
SqldError::RusqliteError(rusqlite_error)
219220
| SqldError::RusqliteErrorExtended(rusqlite_error, _) => match rusqlite_error {
220-
rusqlite::Error::SqliteFailure(sqlite_error, Some(message)) => StmtError::SqliteError {
221-
source: sqlite_error,
222-
message,
223-
},
224-
rusqlite::Error::SqliteFailure(sqlite_error, None) => StmtError::SqliteError {
221+
rusqlite::Error::SqliteFailure(sqlite_error, Some(message)) => {
222+
Ok(StmtError::SqliteError {
223+
source: sqlite_error,
224+
message,
225+
})
226+
}
227+
rusqlite::Error::SqliteFailure(sqlite_error, None) => Ok(StmtError::SqliteError {
225228
message: sqlite_error.to_string(),
226229
source: sqlite_error,
227-
},
230+
}),
228231
rusqlite::Error::SqlInputError {
229232
error: sqlite_error,
230233
msg: message,
231234
offset,
232235
..
233-
} => StmtError::SqlInputError {
236+
} => Ok(StmtError::SqlInputError {
234237
source: sqlite_error,
235238
message,
236239
offset,
237-
},
238-
rusqlite_error => return Err(SqldError::RusqliteError(rusqlite_error)),
240+
}),
241+
rusqlite_error => Err(SqldError::RusqliteError(rusqlite_error)),
239242
},
240-
sqld_error => return Err(sqld_error),
241-
})
243+
sqld_error => Err(sqld_error),
244+
};
245+
246+
let code = result.as_ref().map(|x| x.code()).unwrap_or("UKNOWN");
247+
counter!("libsql_server_hrana_step_errors", 1, "code" => code);
248+
249+
result
242250
}
243251

244252
pub fn proto_error_from_stmt_error(error: &StmtError) -> hrana::proto::Error {

libsql-server/src/metrics.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,16 @@ pub static CONCURRENT_CONNECTIONS_COUNT: Lazy<Gauge> = Lazy::new(|| {
2727
describe_gauge!(NAME, "number of concurrent connections");
2828
register_gauge!(NAME)
2929
});
30+
pub static TOTAL_RESPONSE_SIZE_HIST: Lazy<Histogram> = Lazy::new(|| {
31+
const NAME: &str = "libsql_server_total_response_size_before_lock";
32+
describe_histogram!(NAME, "total response size value before connection lock");
33+
register_histogram!(NAME)
34+
});
35+
pub static STREAM_HANDLES_COUNT: Lazy<Gauge> = Lazy::new(|| {
36+
const NAME: &str = "libsql_server_stream_handles";
37+
describe_gauge!(NAME, "amount of in-memory stream handles");
38+
register_gauge!(NAME)
39+
});
3040
pub static NAMESPACE_LOAD_LATENCY: Lazy<Histogram> = Lazy::new(|| {
3141
const NAME: &str = "libsql_server_namespace_load_latency";
3242
describe_histogram!(NAME, "latency is us when loading a namespace");

0 commit comments

Comments
 (0)