-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
a6b0ab7
commit 52c0a0f
Showing
9 changed files
with
248 additions
and
63 deletions.
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,6 @@ | ||
[package] | ||
name = "worker-rust" | ||
version = "0.3.5" | ||
version = "0.3.6" | ||
edition = "2021" | ||
|
||
[[bin]] | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,28 +1,164 @@ | ||
use std::fmt::Write; | ||
|
||
use prometheus_client::encoding::{EncodeLabelSet, LabelValueEncoder}; | ||
use prometheus_client::metrics::counter::Counter; | ||
use prometheus_client::metrics::info::Info; | ||
use prometheus_client::registry::Registry; | ||
use prometheus_client::metrics::{family::Family, gauge::Gauge, histogram::Histogram, info::Info}; | ||
use prometheus_client::registry::{Registry, Unit}; | ||
|
||
use crate::query::result::QueryResult; | ||
|
||
#[derive(Clone, Debug, Hash, PartialEq, Eq)] | ||
pub enum WorkerStatus { | ||
Starting, | ||
NotRegistered, | ||
UnsupportedVersion, | ||
Jailed, | ||
Active, | ||
} | ||
|
||
#[derive(Clone, Debug, Hash, PartialEq, Eq)] | ||
pub enum QueryStatus { | ||
Ok, | ||
BadRequest, | ||
NoAllocation, | ||
ServerError, | ||
} | ||
|
||
#[derive(Clone, Debug, Hash, PartialEq, Eq, EncodeLabelSet)] | ||
struct StatusLabels { | ||
worker_status: WorkerStatus, | ||
} | ||
|
||
#[derive(Clone, Debug, Hash, PartialEq, Eq, EncodeLabelSet)] | ||
struct QueryExecutedLabels { | ||
status: QueryStatus, | ||
} | ||
|
||
lazy_static::lazy_static! { | ||
pub static ref QUERY_OK: Counter = Default::default(); | ||
pub static ref BAD_REQUEST: Counter = Default::default(); | ||
pub static ref SERVER_ERROR: Counter = Default::default(); | ||
static ref STATUS: Family<StatusLabels, Gauge> = Default::default(); | ||
pub static ref CHUNKS_AVAILABLE: Gauge = Default::default(); | ||
pub static ref CHUNKS_DOWNLOADING: Gauge = Default::default(); | ||
pub static ref CHUNKS_PENDING: Gauge = Default::default(); | ||
pub static ref CHUNKS_DOWNLOADED: Counter = Default::default(); | ||
pub static ref CHUNKS_FAILED_DOWNLOAD: Counter = Default::default(); | ||
pub static ref CHUNKS_REMOVED: Counter = Default::default(); | ||
pub static ref STORED_BYTES: Gauge = Default::default(); | ||
|
||
static ref QUERY_EXECUTED: Family<QueryExecutedLabels, Counter> = Default::default(); | ||
static ref QUERY_RESULT_SIZE: Histogram = Histogram::new(std::iter::empty()); | ||
static ref READ_CHUNKS: Histogram = Histogram::new(std::iter::empty()); | ||
pub static ref PENDING_QUERIES: Gauge = Default::default(); | ||
} | ||
|
||
pub fn set_status(status: WorkerStatus) { | ||
STATUS.clear(); | ||
STATUS | ||
.get_or_create(&StatusLabels { | ||
worker_status: status, | ||
}) | ||
.set(1); | ||
} | ||
|
||
pub fn query_executed(status: QueryStatus, result: Option<&QueryResult>) { | ||
QUERY_EXECUTED | ||
.get_or_create(&QueryExecutedLabels { status }) | ||
.inc(); | ||
if let Some(result) = result { | ||
QUERY_RESULT_SIZE.observe(result.compressed_size as f64); | ||
READ_CHUNKS.observe(result.num_read_chunks as f64); | ||
} | ||
} | ||
|
||
pub fn register_metrics(registry: &mut Registry, info: Info<Vec<(String, String)>>) { | ||
registry.register("worker_info", "Worker info", info); | ||
registry.register( | ||
"num_successful_queries", | ||
"Number of queries which executed successfully", | ||
QUERY_OK.clone(), | ||
"chunks_available", | ||
"Number of available chunks", | ||
CHUNKS_AVAILABLE.clone(), | ||
); | ||
registry.register( | ||
"chunks_downloading", | ||
"Number of chunks being downloaded", | ||
CHUNKS_DOWNLOADING.clone(), | ||
); | ||
registry.register( | ||
"chunks_pending", | ||
"Number of chunks pending download", | ||
CHUNKS_PENDING.clone(), | ||
); | ||
registry.register( | ||
"chunks_downloaded", | ||
"Number of chunks downloaded", | ||
CHUNKS_DOWNLOADED.clone(), | ||
); | ||
registry.register( | ||
"chunks_failed_download", | ||
"Number of chunks failed to download", | ||
CHUNKS_FAILED_DOWNLOAD.clone(), | ||
); | ||
registry.register( | ||
"chunks_removed", | ||
"Number of removed chunks", | ||
CHUNKS_REMOVED.clone(), | ||
); | ||
registry.register_with_unit( | ||
"used_storage", | ||
"Total bytes stored in the data directory", | ||
Unit::Bytes, | ||
STORED_BYTES.clone(), | ||
); | ||
|
||
registry.register( | ||
"num_queries_executed", | ||
"Number of executed queries", | ||
QUERY_EXECUTED.clone(), | ||
); | ||
registry.register_with_unit( | ||
"query_result_size", | ||
"(Gzipped) result size of an executed query (bytes)", | ||
Unit::Bytes, | ||
QUERY_RESULT_SIZE.clone(), | ||
); | ||
registry.register( | ||
"num_bad_requests", | ||
"Number of received invalid queries", | ||
BAD_REQUEST.clone(), | ||
"num_read_chunks", | ||
"Number of chunks read during query execution", | ||
READ_CHUNKS.clone(), | ||
); | ||
} | ||
|
||
pub fn register_p2p_metrics(registry: &mut Registry) { | ||
registry.register("worker_status", "Status of the worker", STATUS.clone()); | ||
set_status(WorkerStatus::Starting); | ||
registry.register( | ||
"num_server_errors", | ||
"Number of queries which resulted in server error", | ||
SERVER_ERROR.clone(), | ||
"pending_queries", | ||
"Current size of the queries queue", | ||
PENDING_QUERIES.clone(), | ||
); | ||
} | ||
|
||
impl prometheus_client::encoding::EncodeLabelValue for WorkerStatus { | ||
fn encode(&self, encoder: &mut LabelValueEncoder) -> Result<(), std::fmt::Error> { | ||
let status = match self { | ||
WorkerStatus::Starting => "starting", | ||
WorkerStatus::NotRegistered => "not_registered", | ||
WorkerStatus::UnsupportedVersion => "unsupported_version", | ||
WorkerStatus::Jailed => "jailed", | ||
WorkerStatus::Active => "active", | ||
}; | ||
encoder.write_str(status)?; | ||
Ok(()) | ||
} | ||
} | ||
|
||
impl prometheus_client::encoding::EncodeLabelValue for QueryStatus { | ||
fn encode(&self, encoder: &mut LabelValueEncoder) -> Result<(), std::fmt::Error> { | ||
let status = match self { | ||
QueryStatus::Ok => "ok", | ||
QueryStatus::BadRequest => "bad_request", | ||
QueryStatus::NoAllocation => "no_allocation", | ||
QueryStatus::ServerError => "server_error", | ||
}; | ||
encoder.write_str(status)?; | ||
Ok(()) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.