-
Notifications
You must be signed in to change notification settings - Fork 3
/
server.rs
79 lines (68 loc) · 2.41 KB
/
server.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
use axum::{routing::get, Router};
use std::net::SocketAddr;
use std::time::Duration;
#[tokio::main]
async fn main() {
tracing_subscriber::fmt::init();
// register global runtime collector
prometheus::default_registry()
.register(Box::new(
tokio_metrics_collector::default_runtime_collector(),
))
.unwrap();
// register global task collector
let task_collector = tokio_metrics_collector::default_task_collector();
prometheus::default_registry()
.register(Box::new(task_collector))
.unwrap();
// create a monitor for collecting `user` metrics
let monitor_get_user = tokio_metrics_collector::TaskMonitor::new();
task_collector.add("get_user", monitor_get_user.clone());
// create app
let app = Router::new()
.route("/", get(root))
.route("/send_email", get(send_email))
.route(
"/user",
axum::routing::get({
let monitor = monitor_get_user.clone();
move || {
monitor.instrument(async {
// Get user from database
tokio::time::sleep(Duration::from_millis(500)).await;
r#"{"name": "miho"}"#
})
}
}),
)
.route("/metrics", get(metrics));
// bind and serve
let addr = SocketAddr::from(([127, 0, 0, 1], 8000));
axum::Server::bind(&addr)
.serve(app.into_make_service())
.await
.unwrap();
}
async fn root() -> &'static str {
"Hello, World!"
}
async fn send_email() -> &'static str {
let monitor = tokio_metrics_collector::TaskMonitor::new();
let task_collector = tokio_metrics_collector::default_task_collector();
task_collector.add("email", monitor.clone());
// Background task to send an email
tokio::spawn(monitor.clone().instrument(async {
tokio::time::sleep(Duration::from_secs(2)).await;
}));
"Email is sent"
}
async fn metrics() -> Result<String, String> {
use prometheus::Encoder;
let encoder = prometheus::TextEncoder::new();
let mut buffer = Vec::new();
if let Err(e) = encoder.encode(&prometheus::default_registry().gather(), &mut buffer) {
return Err(format!("could not encode custom metrics: {e}"));
};
String::from_utf8(buffer.clone())
.map_err(|e| format!("custom metrics could not be from_utf8'd: {e}"))
}