Compare commits

...

1 Commits

Author SHA1 Message Date
Anastasia Lubennikova
a769a43767 Add build_info_metric with git_version and build_tag for compute_ctl 2023-11-28 17:23:24 +00:00
6 changed files with 39 additions and 2 deletions

2
Cargo.lock generated
View File

@@ -1133,7 +1133,9 @@ dependencies = [
"compute_api",
"flate2",
"futures",
"git-version",
"hyper",
"metrics",
"notify",
"num_cpus",
"opentelemetry",

View File

@@ -12,8 +12,10 @@ cfg-if.workspace = true
clap.workspace = true
flate2.workspace = true
futures.workspace = true
git-version.workspace = true
hyper = { workspace = true, features = ["full"] }
notify.workspace = true
metrics.workspace = true
num_cpus.workspace = true
opentelemetry.workspace = true
postgres.workspace = true

View File

@@ -57,18 +57,27 @@ use compute_tools::logger::*;
use compute_tools::monitor::launch_monitor;
use compute_tools::params::*;
use compute_tools::spec::*;
use metrics::set_build_info_metric;
use utils::{project_build_tag, project_git_version};
// this is an arbitrary build tag. Fine as a default / for testing purposes
// in-case of not-set environment var
const BUILD_TAG_DEFAULT: &str = "latest";
project_git_version!(GIT_VERSION);
project_build_tag!(BUILD_TAG);
fn main() -> Result<()> {
init_tracing_and_logging(DEFAULT_LOG_LEVEL)?;
let build_tag = option_env!("BUILD_TAG")
.unwrap_or(BUILD_TAG_DEFAULT)
.to_string();
info!("build_tag: {build_tag}");
info!("Version: {GIT_VERSION}");
info!("Build_tag: {BUILD_TAG}");
set_build_info_metric(GIT_VERSION, BUILD_TAG);
let matches = cli().get_matches();
let pgbin_default = String::from("postgres");

View File

@@ -11,7 +11,8 @@ use compute_api::responses::{ComputeStatus, ComputeStatusResponse, GenericAPIErr
use anyhow::Result;
use hyper::service::{make_service_fn, service_fn};
use hyper::{Body, Method, Request, Response, Server, StatusCode};
use hyper::{header::CONTENT_TYPE, Body, Method, Request, Response, Server, StatusCode};
use metrics::{Encoder, TextEncoder};
use num_cpus;
use serde_json;
use tokio::task;
@@ -51,6 +52,20 @@ async fn routes(req: Request<Body>, compute: &Arc<ComputeNode>) -> Response<Body
Response::new(Body::from(serde_json::to_string(&status_response).unwrap()))
}
// prometheus metrics
(&Method::GET, "/metrics") => {
let mut buffer = vec![];
let metrics = metrics::gather();
let encoder = TextEncoder::new();
encoder.encode(&metrics, &mut buffer).unwrap();
Response::builder()
.status(StatusCode::OK)
.header(CONTENT_TYPE, encoder.format_type())
.body(Body::from(buffer))
.unwrap()
}
// Startup metrics in JSON format. Keep /metrics reserved for a possible
// future use for Prometheus metrics format.
(&Method::GET, "/metrics.json") => {

View File

@@ -2640,6 +2640,11 @@ class Endpoint(PgProtocol):
return self
def get_metrics_str(self) -> str:
request_result = requests.get(f"http://localhost:{self.http_port}/metrics")
request_result.raise_for_status()
return request_result.text
def __enter__(self) -> "Endpoint":
return self

View File

@@ -6,11 +6,15 @@ def test_build_info_metric(neon_env_builder: NeonEnvBuilder, link_proxy: NeonPro
neon_env_builder.num_safekeepers = 1
env = neon_env_builder.init_start()
env.neon_cli.create_branch("test_build_info_metric")
endpoint = env.endpoints.create_start("test_build_info_metric")
parsed_metrics = {}
parsed_metrics["pageserver"] = parse_metrics(env.pageserver.http_client().get_metrics_str())
parsed_metrics["safekeeper"] = parse_metrics(env.safekeepers[0].http_client().get_metrics_str())
parsed_metrics["proxy"] = parse_metrics(link_proxy.get_metrics())
parsed_metrics["compute_ctl"] = parse_metrics(endpoint.get_metrics_str())
for _component, metrics in parsed_metrics.items():
sample = metrics.query_one("libmetrics_build_info")