diff --git a/Cargo.toml b/Cargo.toml index d30c6d6..402ab14 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,6 +13,8 @@ futures = "0.3" serde = "1.0.186" rand = "0.8.5" +actix-web-prom = "0.6" + [dependencies.mongodb] diff --git a/src/handlers/metrics.rs b/src/handlers/metrics.rs new file mode 100644 index 0000000..5f1838e --- /dev/null +++ b/src/handlers/metrics.rs @@ -0,0 +1,15 @@ +use actix_web::{get, HttpResponse, Responder}; +use actix_web::web::{Data, ServiceConfig}; +use actix_web_prom::PrometheusMetrics; + +#[get("/metrics")] +async fn metrics(prometheus: Data) -> impl Responder { + let body = prometheus.render(); + HttpResponse::Ok() + .content_type("text/plain; version=0.0.4") + .body(body) +} + +pub fn config(cfg: &mut ServiceConfig) { + cfg.service(metrics); +} diff --git a/src/handlers/mod.rs b/src/handlers/mod.rs index cec0d6d..d84a52a 100644 --- a/src/handlers/mod.rs +++ b/src/handlers/mod.rs @@ -1,3 +1,4 @@ pub mod links; pub mod rewrite; +pub mod metrics; diff --git a/src/main.rs b/src/main.rs index dc846d7..b29b399 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,9 +8,10 @@ use dotenv::dotenv; use std::sync::Arc; use actix_web::{web::Data, App, HttpServer, Responder, web}; +use actix_web_prom::PrometheusMetricsBuilder; use config::{Config}; -use crate::handlers::{links, rewrite}; +use crate::handlers::{links, rewrite, metrics}; use crate::repository::mongodb_link::MongoRepo; @@ -21,17 +22,26 @@ async fn main() -> std::io::Result<()> { println!("{:?}", config); + let prometheus = PrometheusMetricsBuilder::new("api") + .build() + .unwrap(); + + let prometheus_data = Data::new(prometheus.clone()); + let mongodb = MongoRepo::new(config.clone()).await; let db_data = Data::new(Arc::new(mongodb)); HttpServer::new(move || App::new() + .wrap(prometheus.clone()) .service( web::scope("/short-links") .configure(links::config)) .service( - web::scope("/rewrite"). - configure(rewrite::config)) + web::scope("/rewrite") + .configure(rewrite::config)) + .configure(metrics::config) .app_data(db_data.clone()) + .app_data(prometheus_data.clone()) ) .bind((config.app.hostname, config.app.port))? .run()