apalis_core/backend/
expose.rs1use crate::{
2 backend::{Backend, BackendExt, TaskSink},
3 task::{Task, status::Status},
4};
5
6const DEFAULT_PAGE_SIZE: u32 = 10;
7pub trait Expose<Args> {}
9
10impl<B, Args> Expose<Args> for B where
11 B: Backend<Args = Args>
12 + Metrics
13 + ListWorkers
14 + ListQueues
15 + ListAllTasks
16 + ListTasks<Args>
17 + TaskSink<Args>
18{
19}
20
21pub trait ListQueues: Backend {
23 fn list_queues(&self) -> impl Future<Output = Result<Vec<QueueInfo>, Self::Error>> + Send;
25}
26
27pub trait ListWorkers: Backend {
29 fn list_workers(
31 &self,
32 queue: &str,
33 ) -> impl Future<Output = Result<Vec<RunningWorker>, Self::Error>> + Send;
34
35 fn list_all_workers(
37 &self,
38 ) -> impl Future<Output = Result<Vec<RunningWorker>, Self::Error>> + Send;
39}
40pub trait ListTasks<Args>: Backend {
42 #[allow(clippy::type_complexity)]
44 fn list_tasks(
45 &self,
46 queue: &str,
47 filter: &Filter,
48 ) -> impl Future<Output = Result<Vec<Task<Args, Self::Context, Self::IdType>>, Self::Error>> + Send;
49}
50
51pub trait ListAllTasks: BackendExt {
53 #[allow(clippy::type_complexity)]
55 fn list_all_tasks(
56 &self,
57 filter: &Filter,
58 ) -> impl Future<
59 Output = Result<Vec<Task<Self::Compact, Self::Context, Self::IdType>>, Self::Error>,
60 > + Send;
61}
62
63pub trait Metrics: Backend {
65 fn global(&self) -> impl Future<Output = Result<Vec<Statistic>, Self::Error>> + Send;
67
68 fn fetch_by_queue(
70 &self,
71 queue: &str,
72 ) -> impl Future<Output = Result<Vec<Statistic>, Self::Error>> + Send;
73}
74
75#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
77#[derive(Debug, Clone)]
78pub struct QueueInfo {
79 pub name: String,
81 pub stats: Vec<Statistic>,
83 pub workers: Vec<String>,
85 pub activity: Vec<usize>,
87}
88
89#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
91#[derive(Debug, Clone)]
92pub struct RunningWorker {
93 pub id: String,
95 pub queue: String,
97 pub backend: String,
99 pub started_at: u64,
101 pub last_heartbeat: u64,
103 pub layers: String,
105}
106
107#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
108#[derive(Debug, Clone)]
109pub struct Filter {
111 #[cfg_attr(feature = "serde", serde(default))]
113 pub status: Option<Status>,
114 #[cfg_attr(feature = "serde", serde(default = "default_page"))]
115 pub page: u32,
117 #[cfg_attr(feature = "serde", serde(default))]
119 pub page_size: Option<u32>,
120}
121
122impl Filter {
123 #[must_use]
125 pub fn offset(&self) -> u32 {
126 (self.page - 1) * self.page_size.unwrap_or(DEFAULT_PAGE_SIZE)
127 }
128
129 #[must_use]
131 pub fn limit(&self) -> u32 {
132 self.page_size.unwrap_or(DEFAULT_PAGE_SIZE)
133 }
134}
135
136#[cfg(feature = "serde")]
137fn default_page() -> u32 {
138 1
139}
140#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
142#[derive(Debug, Clone)]
143pub struct Statistic {
144 pub title: String,
146 pub stat_type: StatType,
148 pub value: String,
150 pub priority: Option<u64>,
152}
153#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
155#[derive(Debug, Clone)]
156pub enum StatType {
157 Timestamp,
159 Number,
161 Decimal,
163 Percentage,
165}