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()
}