pub struct QoSService<C: HeartbeatConsumer + Send + Sync + 'static> { /* private fields */ }
Expand description
Unified Quality of Service (QoS
) service that integrates heartbeat monitoring, metrics collection,
logging, and dashboard visualization into a single cohesive system.
QoSService
orchestrates multiple components:
- Heartbeat service for liveness monitoring and reporting
- Metrics collection and exposure via Prometheus
- Log aggregation via Loki
- Dashboard visualization via Grafana
- Server management for the above components
It can be configured to automatically manage server instances or connect to externally managed services.
Implementations§
Source§impl<C: HeartbeatConsumer + Send + Sync + 'static> QoSService<C>
impl<C: HeartbeatConsumer + Send + Sync + 'static> QoSService<C>
Sourcepub fn heartbeat_service(&self) -> Option<&Arc<HeartbeatService<C>>>
pub fn heartbeat_service(&self) -> Option<&Arc<HeartbeatService<C>>>
Returns a reference to the heartbeat service if configured.
The HeartbeatService
is responsible for sending periodic liveness updates
to the blockchain or other monitoring systems.
Sourcepub async fn set_completion_sender(&self, sender: Sender<Result<()>>)
pub async fn set_completion_sender(&self, sender: Sender<Result<()>>)
Sets the completion sender for this QoS
service.
Sourcepub async fn new(
config: QoSConfig,
heartbeat_consumer: Arc<C>,
ws_rpc_endpoint: String,
keystore_uri: String,
) -> Result<Self>
pub async fn new( config: QoSConfig, heartbeat_consumer: Arc<C>, ws_rpc_endpoint: String, keystore_uri: String, ) -> Result<Self>
§Errors
Returns an error if initialization of any underlying service fails.
Sourcepub async fn with_otel_config(
config: QoSConfig,
heartbeat_consumer: Arc<C>,
ws_rpc_endpoint: String,
keystore_uri: String,
otel_config: OpenTelemetryConfig,
) -> Result<Self>
pub async fn with_otel_config( config: QoSConfig, heartbeat_consumer: Arc<C>, ws_rpc_endpoint: String, keystore_uri: String, otel_config: OpenTelemetryConfig, ) -> Result<Self>
§Errors
Returns an error if initialization of any underlying service fails.
pub fn debug_server_status(&self)
Sourcepub fn grafana_client(&self) -> Option<Arc<GrafanaClient>>
pub fn grafana_client(&self) -> Option<Arc<GrafanaClient>>
Returns a reference to the Grafana API client if configured.
The Grafana client can be used to programmatically create or update dashboards, manage data sources, and configure alerts.
Sourcepub fn grafana_server_url(&self) -> Option<String>
pub fn grafana_server_url(&self) -> Option<String>
Returns the URL of the Grafana server if running.
This URL can be used to access the Grafana web interface for viewing dashboards and visualizations.
Sourcepub fn loki_server_url(&self) -> Option<String>
pub fn loki_server_url(&self) -> Option<String>
Returns the URL of the Loki server if configured and running.
This URL can be used to configure log shipping or to query logs directly via the Loki API.
Sourcepub fn provider(&self) -> Option<Arc<EnhancedMetricsProvider>>
pub fn provider(&self) -> Option<Arc<EnhancedMetricsProvider>>
Returns a reference to the metrics provider if configured.
The EnhancedMetricsProvider
collects and aggregates system and application metrics
that can be exposed via Prometheus or queried programmatically.
Sourcepub async fn create_dashboard(&mut self, blueprint_name: &str) -> Result<()>
pub async fn create_dashboard(&mut self, blueprint_name: &str) -> Result<()>
Creates a Grafana dashboard for visualizing metrics from the blueprint.
This method:
- Creates or updates required data sources (Prometheus and Loki)
- Creates a dashboard with panels for system metrics, job execution statistics, and log visualization
- Sets up appropriate refresh intervals and time ranges
§Parameters
blueprint_name
- The name of the blueprint to use in dashboard titles
§Errors
Returns an error if:
- Creating or updating data sources fails
- Dashboard creation fails
- The Grafana client is not configured
Sourcepub fn record_job_execution(
&self,
job_id: u64,
execution_time: f64,
service_id: u64,
blueprint_id: u64,
)
pub fn record_job_execution( &self, job_id: u64, execution_time: f64, service_id: u64, blueprint_id: u64, )
Records metrics about a job execution for monitoring and visualization.
This method tracks job execution frequency and performance metrics, which are exposed via Prometheus and can be visualized in Grafana dashboards.
§Parameters
job_id
- Unique identifier of the executed jobexecution_time
- Time taken to execute the job in secondsservice_id
- ID of the service that executed the jobblueprint_id
- ID of the blueprint that contains the job
Sourcepub fn record_job_error(&self, job_id: u64, error_type: &str)
pub fn record_job_error(&self, job_id: u64, error_type: &str)
Records metrics about job execution errors for monitoring and alerting.
This method tracks job failures by type, which can be used for alerting and diagnostic purposes in Grafana dashboards.
§Parameters
job_id
- Unique identifier of the job that encountered an errorerror_type
- Classification or description of the error that occurred
Sourcepub async fn wait_for_completion(&self) -> Result<()>
pub async fn wait_for_completion(&self) -> Result<()>
Waits for the QoS
service to complete its operation.
This method blocks until a completion signal is received, which typically
happens when the service is being shut down gracefully. It’s useful for
coordinating shutdown of the QoS
service with the rest of the application.
§Errors
Returns an error if the completion signal receiver is dropped prematurely, indicating an unexpected termination of the service.
Sourcepub fn shutdown(&self) -> Result<()>
pub fn shutdown(&self) -> Result<()>
Initiates a graceful shutdown of the QoS
service and all managed components.
This method stops all server instances (Grafana, Prometheus, Loki) if they were started by this service, and signals completion to any waiting tasks.
§Errors
This function is designed to return errors from shutdown operations, though the current implementation always returns Ok(()).
Trait Implementations§
Auto Trait Implementations§
impl<C> !Freeze for QoSService<C>
impl<C> !RefUnwindSafe for QoSService<C>
impl<C> Send for QoSService<C>
impl<C> Sync for QoSService<C>
impl<C> Unpin for QoSService<C>
impl<C> !UnwindSafe for QoSService<C>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CheckedConversion for T
impl<T> CheckedConversion for T
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.Source§impl<T> FutureExt for T
impl<T> FutureExt for T
Source§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
Source§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T
in a tonic::Request
Source§impl<T, Outer> IsWrappedBy<Outer> for T
impl<T, Outer> IsWrappedBy<Outer> for T
Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self
, then passes self.as_ref()
into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
Source§impl<T> SaturatedConversion for T
impl<T> SaturatedConversion for T
Source§fn saturated_from<T>(t: T) -> Selfwhere
Self: UniqueSaturatedFrom<T>,
fn saturated_from<T>(t: T) -> Selfwhere
Self: UniqueSaturatedFrom<T>,
Source§fn saturated_into<T>(self) -> Twhere
Self: UniqueSaturatedInto<T>,
fn saturated_into<T>(self) -> Twhere
Self: UniqueSaturatedInto<T>,
T
. Read moreSource§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.Source§impl<S, T> UncheckedInto<T> for Swhere
T: UncheckedFrom<S>,
impl<S, T> UncheckedInto<T> for Swhere
T: UncheckedFrom<S>,
Source§fn unchecked_into(self) -> T
fn unchecked_into(self) -> T
unchecked_from
.Source§impl<T, S> UniqueSaturatedInto<T> for S
impl<T, S> UniqueSaturatedInto<T> for S
Source§fn unique_saturated_into(self) -> T
fn unique_saturated_into(self) -> T
T
.