Change admin health endpoint to ready

This commit is contained in:
steve-chavez
2022-01-04 20:12:52 -05:00
committed by Steve Chavez
parent bba6e96fd3
commit 65a3ae08f0
5 changed files with 15 additions and 14 deletions
+2 -1
View File
@@ -7,8 +7,9 @@ This project adheres to [Semantic Versioning](http://semver.org/).
### Added ### Added
- #1933, Add a minimal health check endpoint on an admin port at the `<host>:<admin_server_port>/health` endpoint - @steve-chavez - #1933, #2109, Add a minimal health check endpoint - @steve-chavez
+ For enabling this, the `admin-server-port` config must be set explictly + For enabling this, the `admin-server-port` config must be set explictly
+ The check is at the `<host>:<admin_server_port>/ready` endpoint
### Fixed ### Fixed
+1 -1
View File
@@ -24,7 +24,7 @@ postgrestAdmin appState appConfig req respond = do
isMainAppReachable <- isRight <$> reachMainApp appConfig isMainAppReachable <- isRight <$> reachMainApp appConfig
case Wai.pathInfo req of case Wai.pathInfo req of
["health"] -> ["ready"] ->
if configDbChannelEnabled appConfig then do if configDbChannelEnabled appConfig then do
listenerOn <- AppState.getIsListenerOn appState listenerOn <- AppState.getIsListenerOn appState
respond $ Wai.responseLBS (if listenerOn && isMainAppReachable then HTTP.status200 else HTTP.status503) [] mempty respond $ Wai.responseLBS (if listenerOn && isMainAppReachable then HTTP.status200 else HTTP.status503) [] mempty
+1 -1
View File
@@ -55,7 +55,7 @@ data AppState = AppState
, stateIsWorkerOn :: IORef Bool , stateIsWorkerOn :: IORef Bool
-- | Binary semaphore used to sync the listener(NOTIFY reload) with the connectionWorker. -- | Binary semaphore used to sync the listener(NOTIFY reload) with the connectionWorker.
, stateListener :: MVar () , stateListener :: MVar ()
-- | State of the LISTEN channel, used for health checks -- | State of the LISTEN channel, used for the admin server checks
, stateIsListenerOn :: IORef Bool , stateIsListenerOn :: IORef Bool
-- | Config that can change at runtime -- | Config that can change at runtime
, stateConf :: IORef AppConfig , stateConf :: IORef AppConfig
+1 -1
View File
@@ -199,7 +199,7 @@ exampleConfigFile =
|## when none is provided, 660 is applied by default |## when none is provided, 660 is applied by default
|# server-unix-socket-mode = "660" |# server-unix-socket-mode = "660"
| |
|## admin server for health checks, it's disabled by default unless a port is specified |## admin server used for checks, it's disabled by default unless a port is specified
|# admin-server-port = 3001 |# admin-server-port = 3001
| |
|## determine if the OpenAPI output should follow or ignore role privileges or be disabled entirely |## determine if the OpenAPI output should follow or ignore role privileges or be disabled entirely
+10 -10
View File
@@ -741,8 +741,8 @@ def test_db_prepared_statements_disable(defaultenv):
assert response.text == "false" assert response.text == "false"
def test_admin_healthy_w_channel(defaultenv): def test_admin_ready_w_channel(defaultenv):
"Should get a success response from the admin server health endpoint when the LISTEN channel is enabled" "Should get a success response from the admin server ready endpoint when the LISTEN channel is enabled"
env = { env = {
**defaultenv, **defaultenv,
@@ -750,12 +750,12 @@ def test_admin_healthy_w_channel(defaultenv):
} }
with run(env=env, adminport=freeport()) as postgrest: with run(env=env, adminport=freeport()) as postgrest:
response = postgrest.admin.get("/health") response = postgrest.admin.get("/ready")
assert response.status_code == 200 assert response.status_code == 200
def test_admin_healthy_wo_channel(defaultenv): def test_admin_ready_wo_channel(defaultenv):
"Should get a success response from the admin server health endpoint when the LISTEN channel is disabled" "Should get a success response from the admin server ready endpoint when the LISTEN channel is disabled"
env = { env = {
**defaultenv, **defaultenv,
@@ -763,20 +763,20 @@ def test_admin_healthy_wo_channel(defaultenv):
} }
with run(env=env, adminport=freeport()) as postgrest: with run(env=env, adminport=freeport()) as postgrest:
response = postgrest.admin.get("/health") response = postgrest.admin.get("/ready")
assert response.status_code == 200 assert response.status_code == 200
def test_admin_not_found(defaultenv): def test_admin_not_found(defaultenv):
"Should get a not found from the admin server" "Should get a not found from a undefined endpoint on the admin server"
with run(env=defaultenv, adminport=freeport()) as postgrest: with run(env=defaultenv, adminport=freeport()) as postgrest:
response = postgrest.admin.get("/notfound") response = postgrest.admin.get("/notfound")
assert response.status_code == 404 assert response.status_code == 404
def test_admin_health_dependent_on_main_app(defaultenv): def test_admin_ready_dependent_on_main_app(defaultenv):
"Should get a failure from the admin health endpoint if the main app also fails" "Should get a failure from the admin ready endpoint if the main app also fails"
env = { env = {
**defaultenv, **defaultenv,
@@ -787,6 +787,6 @@ def test_admin_health_dependent_on_main_app(defaultenv):
# delete the unix socket to make the main app fail # delete the unix socket to make the main app fail
os.remove(env["PGRST_SERVER_UNIX_SOCKET"]) os.remove(env["PGRST_SERVER_UNIX_SOCKET"])
response = requests.get( response = requests.get(
f"http://localhost:{env['PGRST_ADMIN_SERVER_PORT']}/health" f"http://localhost:{env['PGRST_ADMIN_SERVER_PORT']}/ready"
) )
assert response.status_code == 503 assert response.status_code == 503