mirror of
https://github.com/meilisearch/meilisearch.git
synced 2025-12-19 19:06:59 +00:00
Merge pull request #5956 from meilisearch/progress-trace-in-metrics
Expose batch progress traces on the metrics route
This commit is contained in:
7
Cargo.lock
generated
7
Cargo.lock
generated
@@ -2931,6 +2931,12 @@ version = "1.0.3"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
|
checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "humantime"
|
||||||
|
version = "2.3.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hyper"
|
name = "hyper"
|
||||||
version = "1.8.1"
|
version = "1.8.1"
|
||||||
@@ -4008,6 +4014,7 @@ dependencies = [
|
|||||||
"futures",
|
"futures",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
"hex",
|
"hex",
|
||||||
|
"humantime",
|
||||||
"index-scheduler",
|
"index-scheduler",
|
||||||
"indexmap",
|
"indexmap",
|
||||||
"insta",
|
"insta",
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ secrecy = "0.10.3"
|
|||||||
actix-web-lab = { version = "0.24.3", default-features = false }
|
actix-web-lab = { version = "0.24.3", default-features = false }
|
||||||
urlencoding = "2.1.3"
|
urlencoding = "2.1.3"
|
||||||
backoff = { version = "0.4.0", features = ["tokio"] }
|
backoff = { version = "0.4.0", features = ["tokio"] }
|
||||||
|
humantime = { version = "2.3.0", default-features = false }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
actix-rt = "2.11.0"
|
actix-rt = "2.11.0"
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
use lazy_static::lazy_static;
|
use lazy_static::lazy_static;
|
||||||
use prometheus::{
|
use prometheus::{
|
||||||
opts, register_gauge, register_histogram_vec, register_int_counter_vec, register_int_gauge,
|
opts, register_gauge, register_gauge_vec, register_histogram_vec, register_int_counter_vec,
|
||||||
register_int_gauge_vec, Gauge, HistogramVec, IntCounterVec, IntGauge, IntGaugeVec,
|
register_int_gauge, register_int_gauge_vec, Gauge, GaugeVec, HistogramVec, IntCounterVec,
|
||||||
|
IntGauge, IntGaugeVec,
|
||||||
};
|
};
|
||||||
|
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
@@ -73,6 +74,20 @@ lazy_static! {
|
|||||||
&["kind", "value"]
|
&["kind", "value"]
|
||||||
)
|
)
|
||||||
.expect("Can't create a metric");
|
.expect("Can't create a metric");
|
||||||
|
pub static ref MEILISEARCH_BATCH_RUNNING_PROGRESS_TRACE: GaugeVec = register_gauge_vec!(
|
||||||
|
opts!("meilisearch_batch_running_progress_trace", "The currently running progress trace"),
|
||||||
|
&["batch_uid", "step_name"]
|
||||||
|
)
|
||||||
|
.expect("Can't create a metric");
|
||||||
|
pub static ref MEILISEARCH_LAST_FINISHED_BATCHES_PROGRESS_TRACE_MS: IntGaugeVec =
|
||||||
|
register_int_gauge_vec!(
|
||||||
|
opts!(
|
||||||
|
"meilisearch_last_finished_batches_progress_trace_ms",
|
||||||
|
"The last few batches progress trace in milliseconds"
|
||||||
|
),
|
||||||
|
&["batch_uid", "step_name"]
|
||||||
|
)
|
||||||
|
.expect("Can't create a metric");
|
||||||
pub static ref MEILISEARCH_LAST_UPDATE: IntGauge =
|
pub static ref MEILISEARCH_LAST_UPDATE: IntGauge =
|
||||||
register_int_gauge!(opts!("meilisearch_last_update", "Meilisearch Last Update"))
|
register_int_gauge!(opts!("meilisearch_last_update", "Meilisearch Last Update"))
|
||||||
.expect("Can't create a metric");
|
.expect("Can't create a metric");
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ use index_scheduler::{IndexScheduler, Query};
|
|||||||
use meilisearch_auth::AuthController;
|
use meilisearch_auth::AuthController;
|
||||||
use meilisearch_types::error::ResponseError;
|
use meilisearch_types::error::ResponseError;
|
||||||
use meilisearch_types::keys::actions;
|
use meilisearch_types::keys::actions;
|
||||||
|
use meilisearch_types::milli::progress::ProgressStepView;
|
||||||
use meilisearch_types::tasks::Status;
|
use meilisearch_types::tasks::Status;
|
||||||
use prometheus::{Encoder, TextEncoder};
|
use prometheus::{Encoder, TextEncoder};
|
||||||
use time::OffsetDateTime;
|
use time::OffsetDateTime;
|
||||||
@@ -38,6 +39,12 @@ pub fn configure(config: &mut web::ServiceConfig) {
|
|||||||
# HELP meilisearch_db_size_bytes Meilisearch DB Size In Bytes
|
# HELP meilisearch_db_size_bytes Meilisearch DB Size In Bytes
|
||||||
# TYPE meilisearch_db_size_bytes gauge
|
# TYPE meilisearch_db_size_bytes gauge
|
||||||
meilisearch_db_size_bytes 1130496
|
meilisearch_db_size_bytes 1130496
|
||||||
|
# HELP meilisearch_batch_running_progress_trace The currently running progress trace
|
||||||
|
# TYPE meilisearch_batch_running_progress_trace gauge
|
||||||
|
meilisearch_batch_running_progress_trace{batch_uid="0",step_name="document"} 0.710618582519409
|
||||||
|
meilisearch_batch_running_progress_trace{batch_uid="0",step_name="extracting word proximity"} 0.2222222222222222
|
||||||
|
meilisearch_batch_running_progress_trace{batch_uid="0",step_name="indexing"} 0.6666666666666666
|
||||||
|
meilisearch_batch_running_progress_trace{batch_uid="0",step_name="processing tasks"} 0
|
||||||
# HELP meilisearch_http_requests_total Meilisearch HTTP requests total
|
# HELP meilisearch_http_requests_total Meilisearch HTTP requests total
|
||||||
# TYPE meilisearch_http_requests_total counter
|
# TYPE meilisearch_http_requests_total counter
|
||||||
meilisearch_http_requests_total{method="GET",path="/metrics",status="400"} 1
|
meilisearch_http_requests_total{method="GET",path="/metrics",status="400"} 1
|
||||||
@@ -61,6 +68,13 @@ meilisearch_http_response_time_seconds_bucket{method="GET",path="/metrics",le="1
|
|||||||
meilisearch_http_response_time_seconds_bucket{method="GET",path="/metrics",le="+Inf"} 0
|
meilisearch_http_response_time_seconds_bucket{method="GET",path="/metrics",le="+Inf"} 0
|
||||||
meilisearch_http_response_time_seconds_sum{method="GET",path="/metrics"} 0
|
meilisearch_http_response_time_seconds_sum{method="GET",path="/metrics"} 0
|
||||||
meilisearch_http_response_time_seconds_count{method="GET",path="/metrics"} 0
|
meilisearch_http_response_time_seconds_count{method="GET",path="/metrics"} 0
|
||||||
|
# HELP meilisearch_last_finished_batches_progress_trace_ms The last few batches progress trace in milliseconds
|
||||||
|
# TYPE meilisearch_last_finished_batches_progress_trace_ms gauge
|
||||||
|
meilisearch_last_finished_batches_progress_trace_ms{batch_uid="0",step_name="processing tasks"} 19360
|
||||||
|
meilisearch_last_finished_batches_progress_trace_ms{batch_uid="0",step_name="processing tasks > computing document changes"} 368
|
||||||
|
meilisearch_last_finished_batches_progress_trace_ms{batch_uid="0",step_name="processing tasks > computing document changes > preparing payloads"} 367
|
||||||
|
meilisearch_last_finished_batches_progress_trace_ms{batch_uid="0",step_name="processing tasks > computing document changes > preparing payloads > payload"} 367
|
||||||
|
meilisearch_last_finished_batches_progress_trace_ms{batch_uid="0",step_name="processing tasks > indexing"} 18970
|
||||||
# HELP meilisearch_index_count Meilisearch Index Count
|
# HELP meilisearch_index_count Meilisearch Index Count
|
||||||
# TYPE meilisearch_index_count gauge
|
# TYPE meilisearch_index_count gauge
|
||||||
meilisearch_index_count 1
|
meilisearch_index_count 1
|
||||||
@@ -148,6 +162,46 @@ pub async fn get_metrics(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fetch and expose the current progressing step
|
||||||
|
crate::metrics::MEILISEARCH_BATCH_RUNNING_PROGRESS_TRACE.reset();
|
||||||
|
let (batches, _total) = index_scheduler.get_batches_from_authorized_indexes(
|
||||||
|
&Query { statuses: Some(vec![Status::Processing]), ..Query::default() },
|
||||||
|
auth_filters,
|
||||||
|
)?;
|
||||||
|
if let Some(batch) = batches.into_iter().next() {
|
||||||
|
let batch_uid = batch.uid.to_string();
|
||||||
|
if let Some(progress) = batch.progress {
|
||||||
|
for ProgressStepView { current_step, finished, total } in progress.steps {
|
||||||
|
crate::metrics::MEILISEARCH_BATCH_RUNNING_PROGRESS_TRACE
|
||||||
|
.with_label_values(&[batch_uid.as_str(), current_step.as_ref()])
|
||||||
|
// We return the completion ratio of the current step
|
||||||
|
.set(finished as f64 / total as f64);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
crate::metrics::MEILISEARCH_LAST_FINISHED_BATCHES_PROGRESS_TRACE_MS.reset();
|
||||||
|
let (batches, _total) = index_scheduler.get_batches_from_authorized_indexes(
|
||||||
|
// Fetch the finished batches...
|
||||||
|
&Query { statuses: Some(vec![Status::Succeeded, Status::Failed]), ..Query::default() },
|
||||||
|
auth_filters,
|
||||||
|
)?;
|
||||||
|
// ...and get the last batch only.
|
||||||
|
if let Some(batch) = batches.into_iter().next() {
|
||||||
|
let batch_uid = batch.uid.to_string();
|
||||||
|
for (step_name, duration_str) in batch.stats.progress_trace {
|
||||||
|
let Some(duration_str) = duration_str.as_str() else { continue };
|
||||||
|
match humantime::parse_duration(duration_str) {
|
||||||
|
Ok(duration) => {
|
||||||
|
crate::metrics::MEILISEARCH_LAST_FINISHED_BATCHES_PROGRESS_TRACE_MS
|
||||||
|
.with_label_values(&[&batch_uid, &step_name])
|
||||||
|
.set(duration.as_millis() as i64);
|
||||||
|
}
|
||||||
|
Err(e) => tracing::error!("Failed to parse duration: {e}"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if let Some(last_update) = response.last_update {
|
if let Some(last_update) = response.last_update {
|
||||||
crate::metrics::MEILISEARCH_LAST_UPDATE.set(last_update.unix_timestamp());
|
crate::metrics::MEILISEARCH_LAST_UPDATE.set(last_update.unix_timestamp());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user