mirror of
https://github.com/neondatabase/neon.git
synced 2026-01-06 13:02:55 +00:00
The metrics include a histogram of how long we need to wait for a
GetPage request, number of reconnects, and number of requests among
other things.
The metrics are not yet exported anywhere, but you can query them
manually.
Note: This does *not* bump the default version of the 'neon' extension. We
will do that later, as a separate PR. The reason is that this allows us to roll back
the compute image smoothly, if necessary. Once the image that includes the
new extension .so file with the new functions has been rolled out, and we're
confident that we don't need to roll back the image anymore, we can change
default extension version and actually start using the new functions and views.
This is what the view looks like:
```
postgres=# select * from neon_perf_counters ;
metric | bucket_le | value
---------------------------------------+-----------+----------
getpage_wait_seconds_count | | 300
getpage_wait_seconds_sum | | 0.048506
getpage_wait_seconds_bucket | 2e-05 | 0
getpage_wait_seconds_bucket | 3e-05 | 0
getpage_wait_seconds_bucket | 6e-05 | 71
getpage_wait_seconds_bucket | 0.0001 | 124
getpage_wait_seconds_bucket | 0.0002 | 248
getpage_wait_seconds_bucket | 0.0003 | 279
getpage_wait_seconds_bucket | 0.0006 | 297
getpage_wait_seconds_bucket | 0.001 | 298
getpage_wait_seconds_bucket | 0.002 | 298
getpage_wait_seconds_bucket | 0.003 | 298
getpage_wait_seconds_bucket | 0.006 | 300
getpage_wait_seconds_bucket | 0.01 | 300
getpage_wait_seconds_bucket | 0.02 | 300
getpage_wait_seconds_bucket | 0.03 | 300
getpage_wait_seconds_bucket | 0.06 | 300
getpage_wait_seconds_bucket | 0.1 | 300
getpage_wait_seconds_bucket | 0.2 | 300
getpage_wait_seconds_bucket | 0.3 | 300
getpage_wait_seconds_bucket | 0.6 | 300
getpage_wait_seconds_bucket | 1 | 300
getpage_wait_seconds_bucket | 2 | 300
getpage_wait_seconds_bucket | 3 | 300
getpage_wait_seconds_bucket | 6 | 300
getpage_wait_seconds_bucket | 10 | 300
getpage_wait_seconds_bucket | 20 | 300
getpage_wait_seconds_bucket | 30 | 300
getpage_wait_seconds_bucket | 60 | 300
getpage_wait_seconds_bucket | 100 | 300
getpage_wait_seconds_bucket | Infinity | 300
getpage_prefetch_requests_total | | 69
getpage_sync_requests_total | | 231
getpage_prefetch_misses_total | | 0
getpage_prefetch_discards_total | | 0
pageserver_requests_sent_total | | 323
pageserver_requests_disconnects_total | | 0
pageserver_send_flushes_total | | 323
file_cache_hits_total | | 0
(39 rows)
```
97 lines
4.2 KiB
Python
97 lines
4.2 KiB
Python
import time
|
|
from contextlib import closing
|
|
|
|
from fixtures.log_helper import log
|
|
from fixtures.neon_fixtures import NeonEnvBuilder
|
|
|
|
|
|
# Verify that the neon extension is installed and has the correct version.
|
|
def test_neon_extension(neon_env_builder: NeonEnvBuilder):
|
|
env = neon_env_builder.init_start()
|
|
env.neon_cli.create_branch("test_create_extension_neon")
|
|
|
|
endpoint_main = env.endpoints.create("test_create_extension_neon")
|
|
# don't skip pg_catalog updates - it runs CREATE EXTENSION neon
|
|
endpoint_main.respec(skip_pg_catalog_updates=False)
|
|
endpoint_main.start()
|
|
|
|
with closing(endpoint_main.connect()) as conn:
|
|
with conn.cursor() as cur:
|
|
cur.execute("SELECT extversion from pg_extension where extname='neon'")
|
|
# If this fails, it means the extension is either not installed
|
|
# or was updated and the version is different.
|
|
#
|
|
# IMPORTANT:
|
|
# If the version has changed, the test should be updated.
|
|
# Ensure that the default version is also updated in the neon.control file
|
|
assert cur.fetchone() == ("1.4",)
|
|
cur.execute("SELECT * from neon.NEON_STAT_FILE_CACHE")
|
|
res = cur.fetchall()
|
|
log.info(res)
|
|
assert len(res) == 1
|
|
assert len(res[0]) == 5
|
|
|
|
|
|
# Verify that the neon extension can be upgraded/downgraded.
|
|
def test_neon_extension_compatibility(neon_env_builder: NeonEnvBuilder):
|
|
env = neon_env_builder.init_start()
|
|
env.neon_cli.create_branch("test_neon_extension_compatibility")
|
|
|
|
endpoint_main = env.endpoints.create("test_neon_extension_compatibility")
|
|
# don't skip pg_catalog updates - it runs CREATE EXTENSION neon
|
|
endpoint_main.respec(skip_pg_catalog_updates=False)
|
|
endpoint_main.start()
|
|
|
|
with closing(endpoint_main.connect()) as conn:
|
|
with conn.cursor() as cur:
|
|
cur.execute("SELECT extversion from pg_extension where extname='neon'")
|
|
# IMPORTANT:
|
|
# If the version has changed, the test should be updated.
|
|
# Ensure that the default version is also updated in the neon.control file
|
|
assert cur.fetchone() == ("1.4",)
|
|
cur.execute("SELECT * from neon.NEON_STAT_FILE_CACHE")
|
|
all_versions = ["1.5", "1.4", "1.3", "1.2", "1.1", "1.0"]
|
|
current_version = "1.5"
|
|
for idx, begin_version in enumerate(all_versions):
|
|
for target_version in all_versions[idx + 1 :]:
|
|
if current_version != begin_version:
|
|
cur.execute(
|
|
f"ALTER EXTENSION neon UPDATE TO '{begin_version}'; -- {current_version}->{begin_version}"
|
|
)
|
|
current_version = begin_version
|
|
# downgrade
|
|
cur.execute(
|
|
f"ALTER EXTENSION neon UPDATE TO '{target_version}'; -- {begin_version}->{target_version}"
|
|
)
|
|
# upgrade
|
|
cur.execute(
|
|
f"ALTER EXTENSION neon UPDATE TO '{begin_version}'; -- {target_version}->{begin_version}"
|
|
)
|
|
|
|
|
|
# Verify that the neon extension can be auto-upgraded to the latest version.
|
|
def test_neon_extension_auto_upgrade(neon_env_builder: NeonEnvBuilder):
|
|
env = neon_env_builder.init_start()
|
|
env.neon_cli.create_branch("test_neon_extension_auto_upgrade")
|
|
|
|
endpoint_main = env.endpoints.create("test_neon_extension_auto_upgrade")
|
|
# don't skip pg_catalog updates - it runs CREATE EXTENSION neon
|
|
endpoint_main.respec(skip_pg_catalog_updates=False)
|
|
endpoint_main.start()
|
|
|
|
with closing(endpoint_main.connect()) as conn:
|
|
with conn.cursor() as cur:
|
|
cur.execute("ALTER EXTENSION neon UPDATE TO '1.0';")
|
|
cur.execute("SELECT extversion from pg_extension where extname='neon'")
|
|
assert cur.fetchone() == ("1.0",) # Ensure the extension gets downgraded
|
|
|
|
endpoint_main.stop()
|
|
time.sleep(1)
|
|
endpoint_main.start()
|
|
time.sleep(1)
|
|
|
|
with closing(endpoint_main.connect()) as conn:
|
|
with conn.cursor() as cur:
|
|
cur.execute("SELECT extversion from pg_extension where extname='neon'")
|
|
assert cur.fetchone() != ("1.0",) # Ensure the extension gets upgraded
|