diff --git a/Cargo.toml b/Cargo.toml index bbeed62..6b81d58 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [workspace] resolver = "2" members = [ - "crates/api-grub", "crates/config-delivery", "crates/integr-structs", "crates/preproc", + "crates/api-grub", "crates/config-delivery", "crates/exporter", "crates/integr-structs", "crates/preproc", ] [profile.dev] diff --git a/crates/exporter/Cargo.toml b/crates/exporter/Cargo.toml new file mode 100644 index 0000000..a3f0402 --- /dev/null +++ b/crates/exporter/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "exporter" +version = "0.1.0" +edition = "2021" + +[dependencies] +axum = "0.8.1" +prometheus = "0.13.4" +tokio = { version = "1.43.0", features = ["full"] } + diff --git a/crates/exporter/src/main.rs b/crates/exporter/src/main.rs new file mode 100644 index 0000000..9bee6e7 --- /dev/null +++ b/crates/exporter/src/main.rs @@ -0,0 +1,46 @@ +use axum::{extract::State, routing::get, Router}; +use prometheus::{Encoder, TextEncoder, Counter, Opts, Registry}; +use std::sync::{Arc, Mutex}; +use tokio::net::TcpListener; + +struct AppState { + registry: Registry, + counter: Mutex, +} + +async fn metrics_handler(State(state): State>) -> String { + let encoder = TextEncoder::new(); + let mut buffer = Vec::new(); + let metric_families = state.registry.gather(); + encoder.encode(&metric_families, &mut buffer).unwrap(); + String::from_utf8(buffer).unwrap() +} + +async fn increment_handler(State(state): State>) -> &'static str { + let mut counter = state.counter.lock().unwrap(); + counter.inc(); + "Counter incremented" +} + +#[tokio::main] +async fn main() { + let registry = Registry::new(); + let counter_opts = Opts::new("example_counter", "Пример счётчика"); + let counter = Counter::with_opts(counter_opts).unwrap(); + registry.register(Box::new(counter.clone())).unwrap(); + + let state = Arc::new(AppState { + registry, + counter: Mutex::new(counter), + }); + + let app = Router::new() + .route("/metrics", get(metrics_handler)) + .route("/increment", get(increment_handler)) + .with_state(state.clone()); + + let listener = TcpListener::bind("0.0.0.0:8080").await.unwrap(); + // axum::Server::from_tcp(listener).unwrap().serve(app.into_make_service()).await.unwrap(); + // let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); + axum::serve(listener, app).await.unwrap(); +} \ No newline at end of file