From 135060b866336f3f853524fbadc0837f839e72e0 Mon Sep 17 00:00:00 2001 From: Dan Bond Date: Tue, 19 Apr 2022 11:36:19 -0700 Subject: [PATCH] add http method Signed-off-by: Dan Bond --- Cargo.toml | 2 +- README.md | 4 ++-- examples/prometheus.rs | 2 +- src/lib.rs | 2 +- src/server.rs | 23 ++++++++++++++++++++--- tests/server.rs | 24 ++++++++++++++++++++++-- 6 files changed, 47 insertions(+), 10 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index a719998..98ef321 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "metrics_server" -version = "0.5.0" +version = "0.6.0" authors = ["Dan Bond "] edition = "2021" rust-version = "1.58" diff --git a/README.md b/README.md index 89c4679..e7acb9c 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ This crate provides a thread safe, minimalstic HTTP/S server used to buffer metr Include the lib in your `Cargo.toml` dependencies: ```toml [dependencies] -metrics_server = "0.5" +metrics_server = "0.6" ``` ### HTTP @@ -24,7 +24,7 @@ metrics_server = "0.5" use metrics_server::MetricsServer; // Create a new HTTP server and start listening for requests in the background. -let server = MetricsServer::new("localhost:8001"); +let server = MetricsServer::http("localhost:8001"); // Publish you application metrics. let bytes = server.update(Vec::from([1, 2, 3, 4])); diff --git a/examples/prometheus.rs b/examples/prometheus.rs index f29b06a..f65dae5 100644 --- a/examples/prometheus.rs +++ b/examples/prometheus.rs @@ -16,7 +16,7 @@ fn main() { registry.register("some_count", "Number of random counts", counter.clone()); // Expose the Prometheus metrics. - let server = MetricsServer::new("localhost:8001"); + let server = MetricsServer::http("localhost:8001"); // Increment the counter every 5 seconds. loop { diff --git a/src/lib.rs b/src/lib.rs index d56959b..7ecf12c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -13,7 +13,7 @@ //! use metrics_server::MetricsServer; //! //! // Create a new HTTP server and start listening for requests in the background. -//! let server = MetricsServer::new("localhost:8001"); +//! let server = MetricsServer::http("localhost:8001"); //! //! // Publish your application metrics. //! let bytes = server.update(Vec::from([1, 2, 3, 4])); diff --git a/src/server.rs b/src/server.rs index f6942dd..8b77f88 100644 --- a/src/server.rs +++ b/src/server.rs @@ -19,14 +19,31 @@ struct MetricsServerShared { } impl MetricsServer { - /// Creates an empty `MetricsServer` and starts a HTTP server on a new thread at the given address. + /// Creates an empty `MetricsServer` and starts a HTTP/S server on a new thread at the given address. /// /// This server will only respond synchronously as it blocks until receiving new requests. /// /// # Panics /// /// Panics if given an invalid address. - pub fn new(addr: A) -> Self + pub fn new(addr: A, certificate: Option>, private_key: Option>) -> Self + where + A: ToSocketAddrs, + { + match (certificate, private_key) { + (Some(cert), Some(key)) => MetricsServer::https(addr, cert, key), + _ => MetricsServer::http(addr), + } + } + + /// Shortcut for creating an empty `MetricsServer` and starting a HTTP server on a new thread at the given address. + /// + /// This server will only respond synchronously as it blocks until receiving new requests. + /// + /// # Panics + /// + /// Panics if given an invalid address. + pub fn http(addr: A) -> Self where A: ToSocketAddrs, { @@ -35,7 +52,7 @@ impl MetricsServer { MetricsServer::serve(config) } - /// Creates an empty `MetricsServer` and starts a HTTPS server on a new thread at the given address. + /// Shortcut for creating an empty `MetricsServer` and starting a HTTPS server on a new thread at the given address. /// /// This server will only respond synchronously as it blocks until receiving new requests. /// diff --git a/tests/server.rs b/tests/server.rs index 231ded2..6114482 100644 --- a/tests/server.rs +++ b/tests/server.rs @@ -1,14 +1,34 @@ use metrics_server::MetricsServer; +#[test] +#[should_panic] +fn test_new_server_invalid_address() { + let _ = MetricsServer::new("invalid:99999999", None, None); +} + +#[test] +fn test_new_http_server_serve() { + let _ = MetricsServer::new("localhost:8001", None, None); +} + +#[test] +fn test_new_https_server_serve() { + // Load TLS config. + let cert = include_bytes!("./certs/certificate.pem").to_vec(); + let key = include_bytes!("./certs/private_key.pem").to_vec(); + + let _ = MetricsServer::new("localhost:8443", Some(cert), Some(key)); +} + #[test] #[should_panic] fn test_http_server_invalid_address() { - let _ = MetricsServer::new("invalid:99999999"); + let _ = MetricsServer::http("invalid:99999999"); } #[test] fn test_http_server_serve() { - let server = MetricsServer::new("localhost:8001"); + let server = MetricsServer::http("localhost:8001"); // Assert calls to non /metrics endpoint returns 404. let res = reqwest::blocking::get("http://localhost:8001/invalid").unwrap();