diff --git a/.env b/.env index 4e86263840..9cac2e6438 100644 --- a/.env +++ b/.env @@ -62,10 +62,10 @@ _APP_MAINTENANCE_RETENTION_CACHE=2592000 _APP_MAINTENANCE_RETENTION_EXECUTION=1209600 _APP_MAINTENANCE_RETENTION_ABUSE=86400 _APP_MAINTENANCE_RETENTION_AUDIT=1209600 -_APP_MAINTENANCE_RETENTION_SCHEDULES= 86400 -_APP_USAGE_AGGREGATION_INTERVAL=5 +_APP_MAINTENANCE_RETENTION_SCHEDULES=86400 _APP_MAINTENANCE_RETENTION_USAGE_HOURLY=8640000 _APP_USAGE_STATS=enabled +_APP_USAGE_AGGREGATION_INTERVAL=5 _APP_LOGGING_PROVIDER= _APP_LOGGING_CONFIG= _APP_REGION=default diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index cd9faa39c4..cff75b73b4 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -33,8 +33,7 @@ jobs: docker compose build appwrite docker compose up -d sleep 30 - - name: logs - run: docker compose logs appwrite + - name: Doctor run: docker compose exec -T appwrite doctor diff --git a/app/console b/app/console index 4e2cecefb5..25d281795a 160000 --- a/app/console +++ b/app/console @@ -1 +1 @@ -Subproject commit 4e2cecefb571104f0dbbe5a578729f0e17a10242 +Subproject commit 25d281795a1b73c9b7ed37b14c451068c36d2ff1 diff --git a/app/controllers/api/projects.php b/app/controllers/api/projects.php index f6d0a58c19..ac2bb675b5 100644 --- a/app/controllers/api/projects.php +++ b/app/controllers/api/projects.php @@ -28,7 +28,6 @@ use Utopia\Domains\Domain; use Appwrite\Extend\Exception; use Appwrite\Utopia\Database\Validator\Queries\Projects; use Utopia\Cache\Cache; -use Utopia\Database\Validator\Authorization; use Utopia\Pools\Group; use Utopia\Validator\ArrayList; use Utopia\Validator\Boolean; @@ -252,117 +251,6 @@ App::get('/v1/projects/:projectId') $response->dynamic($project, Response::MODEL_PROJECT); }); -App::get('/v1/projects/:projectId/usage') - ->desc('Get usage stats for a project') - ->groups(['api', 'projects']) - ->label('scope', 'projects.read') - ->label('sdk.auth', [APP_AUTH_TYPE_ADMIN]) - ->label('sdk.namespace', 'projects') - ->label('sdk.method', 'getUsage') - ->label('sdk.response.code', Response::STATUS_CODE_OK) - ->label('sdk.response.type', Response::CONTENT_TYPE_JSON) - ->label('sdk.response.model', Response::MODEL_USAGE_PROJECT) - ->param('projectId', '', new UID(), 'Project unique ID.') - ->param('range', '30d', new WhiteList(['24h', '7d', '30d', '90d'], true), 'Date range.', true) - ->inject('response') - ->inject('dbForConsole') - ->inject('dbForProject') - ->action(function (string $projectId, string $range, Response $response, Database $dbForConsole, Database $dbForProject) { - - $project = $dbForConsole->getDocument('projects', $projectId); - - if ($project->isEmpty()) { - throw new Exception(Exception::PROJECT_NOT_FOUND); - } - - $usage = []; - if (App::getEnv('_APP_USAGE_STATS', 'enabled') == 'enabled') { - $periods = [ - '24h' => [ - 'period' => '1h', - 'limit' => 24, - ], - '7d' => [ - 'period' => '1d', - 'limit' => 7, - ], - '30d' => [ - 'period' => '1d', - 'limit' => 30, - ], - '90d' => [ - 'period' => '1d', - 'limit' => 90, - ], - ]; - - $dbForProject->setNamespace("_{$project->getInternalId()}"); - - $metrics = [ - 'project.$all.network.requests', - 'project.$all.network.bandwidth', - 'project.$all.storage.size', - 'users.$all.count.total', - 'collections.$all.count.total', - 'documents.$all.count.total', - 'executions.$all.compute.total', - ]; - - $stats = []; - - Authorization::skip(function () use ($dbForProject, $periods, $range, $metrics, &$stats) { - foreach ($metrics as $metric) { - $limit = $periods[$range]['limit']; - $period = $periods[$range]['period']; - - $requestDocs = $dbForProject->find('stats', [ - Query::equal('period', [$period]), - Query::equal('metric', [$metric]), - Query::limit($limit), - Query::orderDesc('time'), - ]); - - $stats[$metric] = []; - foreach ($requestDocs as $requestDoc) { - $stats[$metric][] = [ - 'value' => $requestDoc->getAttribute('value'), - 'date' => $requestDoc->getAttribute('time'), - ]; - } - - // backfill metrics with empty values for graphs - $backfill = $limit - \count($requestDocs); - while ($backfill > 0) { - $last = $limit - $backfill - 1; // array index of last added metric - $diff = match ($period) { // convert period to seconds for unix timestamp math - '1h' => 3600, - '1d' => 86400, - }; - $stats[$metric][] = [ - 'value' => 0, - 'date' => DateTime::formatTz(DateTime::addSeconds(new \DateTime($stats[$metric][$last]['date'] ?? null), -1 * $diff)), - ]; - $backfill--; - } - $stats[$metric] = array_reverse($stats[$metric]); - } - }); - - $usage = new Document([ - 'range' => $range, - 'requests' => $stats[$metrics[0]] ?? [], - 'network' => $stats[$metrics[1]] ?? [], - 'storage' => $stats[$metrics[2]] ?? [], - 'users' => $stats[$metrics[3]] ?? [], - 'collections' => $stats[$metrics[4]] ?? [], - 'documents' => $stats[$metrics[5]] ?? [], - 'executions' => $stats[$metrics[6]] ?? [], - ]); - } - - $response->dynamic($usage, Response::MODEL_USAGE_PROJECT); - }); - App::patch('/v1/projects/:projectId') ->desc('Update Project') ->groups(['api', 'projects']) diff --git a/composer.json b/composer.json index b2d0d9e846..1d6d1be25b 100644 --- a/composer.json +++ b/composer.json @@ -50,17 +50,17 @@ "utopia-php/cli": "0.14.*", "utopia-php/config": "0.2.*", "utopia-php/database": "0.28.*", - "utopia-php/domains": "1.1.*", - "utopia-php/framework": "0.25.*", - "utopia-php/image": "0.5.*", "utopia-php/queue": "0.5.*", - "utopia-php/locale": "0.4.*", - "utopia-php/logger": "0.3.*", "utopia-php/orchestration": "0.9.*", "utopia-php/platform": "0.3.*", "utopia-php/pools": "0.4.*", "utopia-php/preloader": "0.2.*", + "utopia-php/domains": "1.1.*", + "utopia-php/framework": "0.25.*", + "utopia-php/image": "0.5.*", "utopia-php/dsn": "0.1.*", + "utopia-php/locale": "0.4.*", + "utopia-php/logger": "0.3.*", "utopia-php/messaging": "0.1.*", "utopia-php/registry": "0.5.*", "utopia-php/storage": "0.13.*", diff --git a/composer.lock b/composer.lock index dfeff542b7..7e3705f123 100644 --- a/composer.lock +++ b/composer.lock @@ -2356,16 +2356,16 @@ }, { "name": "utopia-php/pools", - "version": "0.4.1", + "version": "0.4.2", "source": { "type": "git", "url": "https://github.com/utopia-php/pools.git", - "reference": "c8f96a33e7fbf58c1145eb6cf0f2c00cbe319979" + "reference": "d2870ab74b31b7f4027799f082e85122154f8bed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/pools/zipball/c8f96a33e7fbf58c1145eb6cf0f2c00cbe319979", - "reference": "c8f96a33e7fbf58c1145eb6cf0f2c00cbe319979", + "url": "https://api.github.com/repos/utopia-php/pools/zipball/d2870ab74b31b7f4027799f082e85122154f8bed", + "reference": "d2870ab74b31b7f4027799f082e85122154f8bed", "shasum": "" }, "require": { @@ -2401,9 +2401,9 @@ ], "support": { "issues": "https://github.com/utopia-php/pools/issues", - "source": "https://github.com/utopia-php/pools/tree/0.4.1" + "source": "https://github.com/utopia-php/pools/tree/0.4.2" }, - "time": "2022-11-15T08:55:16+00:00" + "time": "2022-11-22T07:55:45+00:00" }, { "name": "utopia-php/preloader", @@ -5403,5 +5403,5 @@ "platform-overrides": { "php": "8.0" }, - "plugin-api-version": "2.2.0" + "plugin-api-version": "2.3.0" }