diff --git a/compute_tools/src/http/api.rs b/compute_tools/src/http/api.rs index 5f2dc9993b..2da25a5e82 100644 --- a/compute_tools/src/http/api.rs +++ b/compute_tools/src/http/api.rs @@ -9,6 +9,7 @@ use crate::catalog::SchemaDumpError; use crate::catalog::{get_database_schema, get_dbs_and_roles}; use crate::compute::forward_termination_signal; use crate::compute::{ComputeNode, ComputeState, ParsedSpec}; +use crate::installed_extensions; use compute_api::requests::ConfigurationRequest; use compute_api::responses::{ComputeStatus, ComputeStatusResponse, GenericAPIError}; @@ -16,10 +17,11 @@ use anyhow::Result; use hyper::header::CONTENT_TYPE; use hyper::service::{make_service_fn, service_fn}; use hyper::{Body, Method, Request, Response, Server, StatusCode}; +use metrics::Encoder; +use metrics::TextEncoder; use tokio::task; use tracing::{debug, error, info, warn}; use tracing_utils::http::OtelName; -use utils::http::endpoint::prometheus_metrics_handler; use utils::http::request::must_get_query_param; fn status_response_from_state(state: &ComputeState) -> ComputeStatusResponse { @@ -65,8 +67,18 @@ async fn routes(req: Request, compute: &Arc) -> Response { - info!("serving /metrics GET request"); - match prometheus_metrics_handler(req).await { + debug!("serving /metrics GET request"); + + let mut buffer = vec![]; + let metrics = installed_extensions::collect(); + let encoder = TextEncoder::new(); + encoder.encode(&metrics, &mut buffer).unwrap(); + + match Response::builder() + .status(StatusCode::OK) + .header(CONTENT_TYPE, encoder.format_type()) + .body(Body::from(buffer)) + { Ok(response) => response, Err(err) => { let msg = format!("error handling /metrics request: {err}"); diff --git a/compute_tools/src/installed_extensions.rs b/compute_tools/src/installed_extensions.rs index 8855c592dd..e16e13b044 100644 --- a/compute_tools/src/installed_extensions.rs +++ b/compute_tools/src/installed_extensions.rs @@ -1,4 +1,5 @@ use compute_api::responses::{InstalledExtension, InstalledExtensions}; +use metrics::proto::MetricFamily; use std::collections::HashMap; use std::collections::HashSet; use url::Url; @@ -9,6 +10,7 @@ use anyhow::Result; use postgres::{Client, NoTls}; use tokio::task; +use metrics::core::Collector; use metrics::{register_uint_gauge_vec, UIntGaugeVec}; use once_cell::sync::Lazy; @@ -120,58 +122,6 @@ static INSTALLED_EXTENSIONS: Lazy = Lazy::new(|| { .expect("failed to define a metric") }); -#[cfg(test)] -mod tests { - use super::*; - //use metrics::{core::Collector}; - use metrics::{core::Collector, TextEncoder}; - - #[test] - fn test_installed_extensions() { - let tenant_id = "b0554b632bd4d547a63b86c3630317e8"; - let timeline_id = "2414a61ffc94e428f14b5758fe308e13"; - let ext = InstalledExtensions { - extensions: vec![ - InstalledExtension { - extname: "extension_1".to_string(), - versions: ["1.0".to_string(), "1.5".to_string(), "1.1".to_string()] - .iter() - .cloned() - .collect(), - n_databases: 5, - }, - InstalledExtension { - extname: "extension_2".to_string(), - versions: ["4.2".to_string()].iter().cloned().collect(), - n_databases: 2, - }, - ], - }; - - for ext in ext.extensions.iter() { - let versions = { - let mut vec: Vec<_> = ext.versions.iter().cloned().collect(); - vec.sort(); - vec.iter() - .map(|x| x.to_string()) - .collect::>() - .join(",") - }; - - INSTALLED_EXTENSIONS - .with_label_values(&[tenant_id, timeline_id, &ext.extname, &versions]) - .set(ext.n_databases as u64); - } - - let mut buffer = String::new(); - let metrics = INSTALLED_EXTENSIONS.collect(); - let encoder = TextEncoder::new(); - encoder.encode_utf8(&metrics, &mut buffer).unwrap(); - - print!("{}", buffer); - assert_eq!( - buffer, - "# HELP installed_extensions Number of databases where extension is installed, versions passed as label\n# TYPE installed_extensions gauge\ninstalled_extensions{extension_name=\"extension_2\",tenant_id=\"b0554b632bd4d547a63b86c3630317e8\",timeline_id=\"2414a61ffc94e428f14b5758fe308e13\",versions=\"4.2\"} 2\ninstalled_extensions{extension_name=\"extension_1\",tenant_id=\"b0554b632bd4d547a63b86c3630317e8\",timeline_id=\"2414a61ffc94e428f14b5758fe308e13\",versions=\"1.0,1.1,1.5\"} 5\n" - ) - } +pub fn collect() -> Vec { + INSTALLED_EXTENSIONS.collect() }