apalis_core/backend/
expose.rs1use crate::{
2 backend::{Backend, 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 fn list_tasks(
44 &self,
45 queue: &str,
46 filter: &Filter,
47 ) -> impl Future<Output = Result<Vec<Task<Args, Self::Context, Self::IdType>>, Self::Error>> + Send;
48}
49
50pub trait ListAllTasks: Backend {
52 fn list_all_tasks(
54 &self,
55 filter: &Filter,
56 ) -> impl Future<
57 Output = Result<Vec<Task<Self::Compact, Self::Context, Self::IdType>>, Self::Error>,
58 > + Send;
59}
60
61pub trait Metrics: Backend {
63 fn global(&self) -> impl Future<Output = Result<Vec<Statistic>, Self::Error>> + Send;
65
66 fn fetch_by_queue(
68 &self,
69 queue: &str,
70 ) -> impl Future<Output = Result<Vec<Statistic>, Self::Error>> + Send;
71}
72
73#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
75#[derive(Debug, Clone)]
76pub struct QueueInfo {
77 pub name: String,
79 pub stats: Vec<Statistic>,
81 pub workers: Vec<String>,
83 pub activity: Vec<usize>,
85}
86
87#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
89#[derive(Debug, Clone)]
90pub struct RunningWorker {
91 pub id: String,
93 pub queue: String,
95 pub backend: String,
97 pub started_at: u64,
99 pub last_heartbeat: u64,
101 pub layers: String,
103}
104
105#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
106#[derive(Debug, Clone)]
107pub struct Filter {
109 #[cfg_attr(feature = "serde", serde(default))]
111 pub status: Option<Status>,
112 #[cfg_attr(feature = "serde", serde(default = "default_page"))]
113 pub page: u32,
115 #[cfg_attr(feature = "serde", serde(default))]
117 pub page_size: Option<u32>,
118}
119
120impl Filter {
121 pub fn offset(&self) -> u32 {
123 (self.page - 1) * self.page_size.unwrap_or(DEFAULT_PAGE_SIZE)
124 }
125
126 pub fn limit(&self) -> u32 {
128 self.page_size.unwrap_or(DEFAULT_PAGE_SIZE)
129 }
130}
131
132#[cfg(feature = "serde")]
133fn default_page() -> u32 {
134 1
135}
136#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
138#[derive(Debug, Clone)]
139pub struct Statistic {
140 pub title: String,
142 pub stat_type: StatType,
144 pub value: String,
146 pub priority: Option<u64>,
148}
149#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
151#[derive(Debug, Clone)]
152pub enum StatType {
153 Timestamp,
155 Number,
157 Decimal,
159 Percentage,
161}