forked from kube-rs/controller-rs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.rs
73 lines (63 loc) · 2.19 KB
/
main.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
#![allow(unused_imports, unused_variables)]
pub use controller::*;
use prometheus::{Encoder, TextEncoder};
use tracing::{debug, error, info, trace, warn};
use tracing_subscriber::{prelude::*, EnvFilter, Registry};
use actix_web::{
get, middleware,
web::{self, Data},
App, HttpRequest, HttpResponse, HttpServer, Responder,
};
#[get("/metrics")]
async fn metrics(c: Data<Manager>, _req: HttpRequest) -> impl Responder {
let metrics = c.metrics();
let encoder = TextEncoder::new();
let mut buffer = vec![];
encoder.encode(&metrics, &mut buffer).unwrap();
HttpResponse::Ok().body(buffer)
}
#[get("/health")]
async fn health(_: HttpRequest) -> impl Responder {
HttpResponse::Ok().json("healthy")
}
#[get("/")]
async fn index(c: Data<Manager>, _req: HttpRequest) -> impl Responder {
let d = c.diagnostics().await;
HttpResponse::Ok().json(&d)
}
#[tokio::main]
async fn main() -> Result<()> {
// Setup tracing layers
#[cfg(feature = "telemetry")]
let telemetry = tracing_opentelemetry::layer().with_tracer(telemetry::init_tracer().await);
let logger = tracing_subscriber::fmt::layer();
let env_filter = EnvFilter::try_from_default_env()
.or_else(|_| EnvFilter::try_new("info"))
.unwrap();
// Decide on layers
#[cfg(feature = "telemetry")]
let collector = Registry::default().with(telemetry).with(logger).with(env_filter);
#[cfg(not(feature = "telemetry"))]
let collector = Registry::default().with(logger).with(env_filter);
// Initialize tracing
tracing::subscriber::set_global_default(collector).unwrap();
// Start kubernetes controller
let (manager, controller) = Manager::new().await;
// Start web server
let server = HttpServer::new(move || {
App::new()
.app_data(Data::new(manager.clone()))
.wrap(middleware::Logger::default().exclude("/health"))
.service(index)
.service(health)
.service(metrics)
})
.bind("0.0.0.0:8080")
.expect("Can not bind to 0.0.0.0:8080")
.shutdown_timeout(5);
tokio::select! {
_ = controller => warn!("controller exited"),
_ = server.run() => info!("actix exited"),
}
Ok(())
}