From 26af9b7463732ba48039b4654041fe80725a5b0b Mon Sep 17 00:00:00 2001 From: shimon Date: Wed, 14 Feb 2024 23:05:01 +0200 Subject: [PATCH 1/6] usage logs updates --- src/Appwrite/Platform/Workers/Usage.php | 1 + src/Appwrite/Platform/Workers/UsageDump.php | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Appwrite/Platform/Workers/Usage.php b/src/Appwrite/Platform/Workers/Usage.php index 49f3344906..35c0e02cef 100644 --- a/src/Appwrite/Platform/Workers/Usage.php +++ b/src/Appwrite/Platform/Workers/Usage.php @@ -76,6 +76,7 @@ class Usage extends Action } $this->stats[$projectId]['project'] = $project; + $this->stats[$projectId]['receivedAt'] = DateTime::now(); foreach ($payload['metrics'] ?? [] as $metric) { $this->keys++; if (!isset($this->stats[$projectId]['keys'][$metric['key']])) { diff --git a/src/Appwrite/Platform/Workers/UsageDump.php b/src/Appwrite/Platform/Workers/UsageDump.php index f563578984..9f2e269d5f 100644 --- a/src/Appwrite/Platform/Workers/UsageDump.php +++ b/src/Appwrite/Platform/Workers/UsageDump.php @@ -59,12 +59,12 @@ class UsageDump extends Action foreach ($payload['stats'] ?? [] as $stats) { $project = new Document($stats['project'] ?? []); $numberOfKeys = !empty($stats['keys']) ? count($stats['keys']) : 0; - + $receivedAt = $stats['receivedAt'] ?? 'NONE'; if ($numberOfKeys === 0) { continue; } - console::log('[' . DateTime::now() . '] ProjectId [' . $project->getInternalId() . '] Database [' . $project['database'] . '] ' . $numberOfKeys . ' keys'); + console::log('[' . DateTime::now() . '] ProjectId [' . $project->getInternalId() . '] receivedAt [' . $receivedAt . '] ' . $numberOfKeys . ' keys'); try { $dbForProject = $getProjectDB($project); From dae01f707773ec5edbb714c7980e4bd6cb945613 Mon Sep 17 00:00:00 2001 From: shimon Date: Wed, 14 Feb 2024 23:07:25 +0200 Subject: [PATCH 2/6] usage logs updates --- src/Appwrite/Platform/Workers/UsageDump.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Appwrite/Platform/Workers/UsageDump.php b/src/Appwrite/Platform/Workers/UsageDump.php index 9f2e269d5f..5a4324fd3e 100644 --- a/src/Appwrite/Platform/Workers/UsageDump.php +++ b/src/Appwrite/Platform/Workers/UsageDump.php @@ -64,7 +64,7 @@ class UsageDump extends Action continue; } - console::log('[' . DateTime::now() . '] ProjectId [' . $project->getInternalId() . '] receivedAt [' . $receivedAt . '] ' . $numberOfKeys . ' keys'); + console::log('[' . DateTime::now() . '] ProjectId [' . $project->getInternalId() . '] ReceivedAt [' . $receivedAt . '] ' . $numberOfKeys . ' keys'); try { $dbForProject = $getProjectDB($project); From 2a5f21e9827d92db3d4919d4d8fe69b112ac3f54 Mon Sep 17 00:00:00 2001 From: shimon Date: Thu, 15 Feb 2024 17:12:37 +0200 Subject: [PATCH 3/6] Addressed comments --- app/worker.php | 5 +++-- src/Appwrite/Event/Mail.php | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/worker.php b/app/worker.php index 4cf0edbae6..0bf5ae89e1 100644 --- a/app/worker.php +++ b/app/worker.php @@ -253,7 +253,6 @@ try { Console::error($e->getMessage() . ', File: ' . $e->getFile() . ', Line: ' . $e->getLine()); } - $worker = $platform->getWorker(); $worker @@ -268,7 +267,8 @@ $worker ->inject('error') ->inject('logger') ->inject('log') - ->action(function (Throwable $error, ?Logger $logger, Log $log) { + ->inject('project') + ->action(function (Throwable $error, ?Logger $logger, Log $log, Document $project) { $version = App::getEnv('_APP_VERSION', 'UNKNOWN'); if ($error instanceof PDOException) { @@ -284,6 +284,7 @@ $worker $log->setAction('appwrite-queue-' . App::getEnv('QUEUE')); $log->addTag('verboseType', get_class($error)); $log->addTag('code', $error->getCode()); + $log->addTag('projectId', $project->getInternalId() ?? 'n/a'); $log->addExtra('file', $error->getFile()); $log->addExtra('line', $error->getLine()); $log->addExtra('trace', $error->getTraceAsString()); diff --git a/src/Appwrite/Event/Mail.php b/src/Appwrite/Event/Mail.php index 9973dae403..ca8fe7d202 100644 --- a/src/Appwrite/Event/Mail.php +++ b/src/Appwrite/Event/Mail.php @@ -365,6 +365,7 @@ class Mail extends Event $client = new Client($this->queue, $this->connection); return $client->enqueue([ + 'project' => $this->project, 'recipient' => $this->recipient, 'name' => $this->name, 'subject' => $this->subject, From ed4319314af0610b2a353ac074245ccee0b8dd38 Mon Sep 17 00:00:00 2001 From: shimon Date: Thu, 15 Feb 2024 17:15:10 +0200 Subject: [PATCH 4/6] Addressed comments --- app/worker.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/worker.php b/app/worker.php index 0bf5ae89e1..de12bba6cb 100644 --- a/app/worker.php +++ b/app/worker.php @@ -284,7 +284,7 @@ $worker $log->setAction('appwrite-queue-' . App::getEnv('QUEUE')); $log->addTag('verboseType', get_class($error)); $log->addTag('code', $error->getCode()); - $log->addTag('projectId', $project->getInternalId() ?? 'n/a'); + $log->addTag('projectId', $project->getId() ?? 'n/a'); $log->addExtra('file', $error->getFile()); $log->addExtra('line', $error->getLine()); $log->addExtra('trace', $error->getTraceAsString()); From 2ab6156db4f9a9c454931b2dcf7a59714df2a916 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Mon, 19 Feb 2024 14:08:15 +0000 Subject: [PATCH 5/6] Add smarter traefik load balancing with health check --- .env | 2 +- app/controllers/api/health.php | 10 +++++++++- app/controllers/web/home.php | 1 + app/http.php | 7 +++++++ docker-compose.yml | 9 ++++++--- 5 files changed, 24 insertions(+), 5 deletions(-) diff --git a/.env b/.env index b915f91516..56fde8a4fb 100644 --- a/.env +++ b/.env @@ -1,6 +1,6 @@ _APP_ENV=development _APP_LOCALE=en -_APP_WORKER_PER_CORE=6 +_APP_WORKER_PER_CORE=1 _APP_CONSOLE_WHITELIST_ROOT=disabled _APP_CONSOLE_WHITELIST_EMAILS= _APP_CONSOLE_WHITELIST_IPS= diff --git a/app/controllers/api/health.php b/app/controllers/api/health.php index a85f9da321..f6ab3e8eec 100644 --- a/app/controllers/api/health.php +++ b/app/controllers/api/health.php @@ -51,8 +51,16 @@ App::get('/v1/health/version') ->label('sdk.response.code', Response::STATUS_CODE_OK) ->label('sdk.response.type', Response::CONTENT_TYPE_JSON) ->label('sdk.response.model', Response::MODEL_HEALTH_VERSION) + ->inject('http') ->inject('response') - ->action(function (Response $response) { + ->action(function (mixed $http, Response $response) { + $stats = $http->stats(); + \var_dump(\gethostname() . ': ' . $stats['idle_worker_num'] . '/' . $stats['worker_num']); + + if(($stats['idle_worker_num'] ?? 0) <= 1) { + throw new Exception(Exception::GENERAL_SERVER_ERROR, 'Can not process more requests at the moment.'); + } + $response->dynamic(new Document([ 'version' => APP_VERSION_STABLE ]), Response::MODEL_HEALTH_VERSION); }); diff --git a/app/controllers/web/home.php b/app/controllers/web/home.php index 27b2614c37..5a8a7e1a93 100644 --- a/app/controllers/web/home.php +++ b/app/controllers/web/home.php @@ -10,6 +10,7 @@ App::get('/versions') ->label('scope', 'public') ->inject('response') ->action(function (Response $response) { + \sleep(60); $platforms = Config::getParam('platforms'); $versions = [ diff --git a/app/http.php b/app/http.php index 5b32d8f134..4b740516ee 100644 --- a/app/http.php +++ b/app/http.php @@ -327,4 +327,11 @@ $http->on('request', function (SwooleRequest $swooleRequest, SwooleResponse $swo } }); +$register->set('http', function () use ($http) { + return $http; +}); +App::setResource('http', function ($register) { + return $register->get('http'); +}, ['register']); + $http->start(); diff --git a/docker-compose.yml b/docker-compose.yml index de71e3937a..8e017c3e50 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -44,7 +44,9 @@ services: - appwrite appwrite: - container_name: appwrite + deploy: + mode: replicated + replicas: 3 <<: *x-logging image: appwrite-dev build: @@ -53,8 +55,6 @@ services: DEBUG: false TESTING: true VERSION: dev - ports: - - 9501:80 networks: - appwrite labels: @@ -62,6 +62,9 @@ services: - "traefik.constraint-label-stack=appwrite" - "traefik.docker.network=appwrite" - "traefik.http.services.appwrite_api.loadbalancer.server.port=80" + - "traefik.http.services.appwrite_api.loadbalancer.healthcheck.path=/v1/health/version" + - "traefik.http.services.appwrite_api.loadbalancer.healthcheck.interval=3s" + - "traefik.http.services.appwrite_api.loadbalancer.healthcheck.timeout=2s" #http - traefik.http.routers.appwrite_api_http.entrypoints=appwrite_web - traefik.http.routers.appwrite_api_http.rule=PathPrefix(`/`) From 505b4815378622a1c3988c26e087c2fcc8dc6832 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Mon, 19 Feb 2024 14:10:35 +0000 Subject: [PATCH 6/6] Revert "Add smarter traefik load balancing with health check" This reverts commit 2ab6156db4f9a9c454931b2dcf7a59714df2a916. --- .env | 2 +- app/controllers/api/health.php | 10 +--------- app/controllers/web/home.php | 1 - app/http.php | 7 ------- docker-compose.yml | 9 +++------ 5 files changed, 5 insertions(+), 24 deletions(-) diff --git a/.env b/.env index 56fde8a4fb..b915f91516 100644 --- a/.env +++ b/.env @@ -1,6 +1,6 @@ _APP_ENV=development _APP_LOCALE=en -_APP_WORKER_PER_CORE=1 +_APP_WORKER_PER_CORE=6 _APP_CONSOLE_WHITELIST_ROOT=disabled _APP_CONSOLE_WHITELIST_EMAILS= _APP_CONSOLE_WHITELIST_IPS= diff --git a/app/controllers/api/health.php b/app/controllers/api/health.php index f6ab3e8eec..a85f9da321 100644 --- a/app/controllers/api/health.php +++ b/app/controllers/api/health.php @@ -51,16 +51,8 @@ App::get('/v1/health/version') ->label('sdk.response.code', Response::STATUS_CODE_OK) ->label('sdk.response.type', Response::CONTENT_TYPE_JSON) ->label('sdk.response.model', Response::MODEL_HEALTH_VERSION) - ->inject('http') ->inject('response') - ->action(function (mixed $http, Response $response) { - $stats = $http->stats(); - \var_dump(\gethostname() . ': ' . $stats['idle_worker_num'] . '/' . $stats['worker_num']); - - if(($stats['idle_worker_num'] ?? 0) <= 1) { - throw new Exception(Exception::GENERAL_SERVER_ERROR, 'Can not process more requests at the moment.'); - } - + ->action(function (Response $response) { $response->dynamic(new Document([ 'version' => APP_VERSION_STABLE ]), Response::MODEL_HEALTH_VERSION); }); diff --git a/app/controllers/web/home.php b/app/controllers/web/home.php index 5a8a7e1a93..27b2614c37 100644 --- a/app/controllers/web/home.php +++ b/app/controllers/web/home.php @@ -10,7 +10,6 @@ App::get('/versions') ->label('scope', 'public') ->inject('response') ->action(function (Response $response) { - \sleep(60); $platforms = Config::getParam('platforms'); $versions = [ diff --git a/app/http.php b/app/http.php index 4b740516ee..5b32d8f134 100644 --- a/app/http.php +++ b/app/http.php @@ -327,11 +327,4 @@ $http->on('request', function (SwooleRequest $swooleRequest, SwooleResponse $swo } }); -$register->set('http', function () use ($http) { - return $http; -}); -App::setResource('http', function ($register) { - return $register->get('http'); -}, ['register']); - $http->start(); diff --git a/docker-compose.yml b/docker-compose.yml index 8e017c3e50..de71e3937a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -44,9 +44,7 @@ services: - appwrite appwrite: - deploy: - mode: replicated - replicas: 3 + container_name: appwrite <<: *x-logging image: appwrite-dev build: @@ -55,6 +53,8 @@ services: DEBUG: false TESTING: true VERSION: dev + ports: + - 9501:80 networks: - appwrite labels: @@ -62,9 +62,6 @@ services: - "traefik.constraint-label-stack=appwrite" - "traefik.docker.network=appwrite" - "traefik.http.services.appwrite_api.loadbalancer.server.port=80" - - "traefik.http.services.appwrite_api.loadbalancer.healthcheck.path=/v1/health/version" - - "traefik.http.services.appwrite_api.loadbalancer.healthcheck.interval=3s" - - "traefik.http.services.appwrite_api.loadbalancer.healthcheck.timeout=2s" #http - traefik.http.routers.appwrite_api_http.entrypoints=appwrite_web - traefik.http.routers.appwrite_api_http.rule=PathPrefix(`/`)