From 811e5675a37a9295498c2f0fffe0de28a7ed3d6d Mon Sep 17 00:00:00 2001 From: Anastasia Lubennikova Date: Wed, 4 Dec 2024 19:20:55 +0000 Subject: [PATCH] Track extension updates live --- compute_tools/src/http/api.rs | 15 +++- compute_tools/src/installed_extensions.rs | 8 ++ pgxn/neon/extension_server.c | 22 +++-- .../regress/test_installed_extensions.py | 86 +++++++++++++++++++ 4 files changed, 124 insertions(+), 7 deletions(-) diff --git a/compute_tools/src/http/api.rs b/compute_tools/src/http/api.rs index 43e9fc42fc..8273f47db6 100644 --- a/compute_tools/src/http/api.rs +++ b/compute_tools/src/http/api.rs @@ -326,9 +326,20 @@ async fn routes(req: Request, compute: &Arc) -> Response Result Result 0: + try: + res = client.metrics() + timeout = -1 + if len(parse_metrics(res).query_all("compute_installed_extensions")) < 1: + # Assume that not all metrics that are collected yet + time.sleep(1) + timeout -= 1 + continue + except Exception: + log.exception("failed to get metrics, assume they are not collected yet") + time.sleep(1) + timeout -= 1 + continue + + info("After start metrics: %s", res) + m = parse_metrics(res) + info("parsed metrics: %s", m) + + # create extension neon_test_utils + pg_conn = endpoint.connect(dbname="test_installed_extensions") + with pg_conn.cursor() as cur: + cur.execute("CREATE EXTENSION neon_test_utils") + cur.execute( + "SELECT default_version FROM pg_available_extensions WHERE name = 'neon_test_utils'" + ) + res = cur.fetchone() + neon_test_utils_version = res[0] + + # check the metric again + res = client.metrics() + info("After creating neon_test_utils metrics: %s", res) + time.sleep(1) + res = client.metrics() + info("After creating neon_test_utils metrics: %s", res) + + m = parse_metrics(res) + neon_m = m.query_all( + "compute_installed_extensions", + { + "extension_name": "neon_test_utils", + "version": neon_test_utils_version, + "owned_by_superuser": "1", + }, + ) + assert len(neon_m) == 1 + for sample in neon_m: + assert sample.value == 1 + + # drop extension neon_test_utils + with pg_conn.cursor() as cur: + cur.execute("DROP EXTENSION neon_test_utils") + + # check the metric again + res = client.metrics() + info("After dropping neon_test_utils metrics: %s", res) + time.sleep(5) + res = client.metrics() + info("After dropping neon_test_utils metrics: %s", res) + + m = parse_metrics(res) + neon_m = m.query_all( + "compute_installed_extensions", + { + "extension_name": "neon_test_utils", + "version": neon_test_utils_version, + "owned_by_superuser": "1", + }, + ) + assert len(neon_m) == 0