use async_trait::async_trait;
use mocra::prelude::*;
use serde::Serialize;
#[derive(Debug, Serialize)]
struct Page {
url: String,
status: u16,
bytes: usize,
}
struct Demo;
#[async_trait]
impl Spider for Demo {
type Item = Page;
fn name(&self) -> &str {
"dashboard-demo"
}
async fn start(&self, s: &mut Seeds) {
for _ in 0..40 {
s.get("https://httpbin.org/get");
s.get("https://httpbin.org/uuid");
s.get("https://httpbin.org/headers");
}
}
async fn parse(&self, res: Response, cx: &mut Ctx<Self::Item>) -> Result<()> {
cx.emit(Page {
url: res.module_id(),
status: res.status_code,
bytes: res.text().map(|t| t.len()).unwrap_or(0),
});
Ok(())
}
}
#[tokio::main]
async fn main() -> Result<()> {
let port: u16 = std::env::var("PORT")
.ok()
.and_then(|p| p.parse().ok())
.unwrap_or(8080);
println!("dashboard: 打开 http://127.0.0.1:{port} 查看 指标 / 日志 / 任务 / 性能");
Mocra::builder()
.spider(
Demo,
on_item(|page: Page| async move {
println!(
"[item] {} -> {} ({} bytes)",
page.url, page.status, page.bytes
);
}),
)
.dashboard(port)
.run()
.await
}