diff --git a/app/controllers/api/databases.php b/app/controllers/api/databases.php index 583be90f1d..d9312442ac 100644 --- a/app/controllers/api/databases.php +++ b/app/controllers/api/databases.php @@ -2411,8 +2411,8 @@ App::get('/v1/databases/:databaseId/usage') $stats = $usage = []; $days = $periods[$range]; $metrics = [ - $database->getId() . '.collections', - $database->getId() . '.documents', + $database->getInternalId() . '.collections', + $database->getInternalId() . '.documents', ]; Authorization::skip(function () use ($dbForProject, $days, $metrics, &$stats) { @@ -2490,7 +2490,7 @@ App::get('/v1/databases/:databaseId/collections/:collectionId/usage') $stats = $usage = []; $days = $periods[$range]; $metrics = [ - $collection->getId() . '.documents', + $collectionDocument->getInternalId() . '.documents', ]; Authorization::skip(function () use ($dbForProject, $days, $metrics, &$stats) { diff --git a/app/controllers/api/functions.php b/app/controllers/api/functions.php index 88f7bed087..c048404937 100644 --- a/app/controllers/api/functions.php +++ b/app/controllers/api/functions.php @@ -1384,11 +1384,11 @@ App::get('/v1/functions/:functionId/usage') $metrics = [ 'functions.' . $function->getId() . '.deployments', 'functions.' . $function->getId() . '.deployments.storage', - $function->getId() . '.builds', - $function->getId() . '.builds.storage', - $function->getId() . '.builds.compute', - $function->getId() . '.executions', - $function->getId() . '.executions.compute', + $function->getInternalId() . '.builds', + $function->getInternalId() . '.builds.storage', + $function->getInternalId() . '.builds.compute', + $function->getInternalId() . '.executions', + $function->getInternalId() . '.executions.compute', ]; Authorization::skip(function () use ($dbForProject, $days, $metrics, &$stats) { diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php index 279ef4f3ae..dcf5900b46 100644 --- a/app/controllers/api/storage.php +++ b/app/controllers/api/storage.php @@ -1439,8 +1439,8 @@ App::get('/v1/storage/:bucketId/usage') $stats = $usage = []; $days = $periods[$range]; $metrics = [ - $bucket->getId() . '.files', - $bucket->getId() . '.files.storage', + $bucket->getInternalId() . '.files', + $bucket->getInternalId() . '.files.storage', ]; Authorization::skip(function () use ($dbForProject, $days, $metrics, &$stats) { diff --git a/app/controllers/shared/api.php b/app/controllers/shared/api.php index af1cb3cf44..d126ac926e 100644 --- a/app/controllers/shared/api.php +++ b/app/controllers/shared/api.php @@ -75,8 +75,10 @@ $databaseListener = function (string $event, Document $document, Document $proje //Project level sessions deduction if ($event === Database::EVENT_DOCUMENT_DELETE) { $sessions = count($document->getAttribute('sessions')); - $queueForUsage - ->addMetric("sessions", ($sessions * -1)); // per project + if (!empty($sessions)) { + $queueForUsage + ->addMetric("sessions", ($sessions * -1)); // per project + } } break; case $document->getCollection() === 'sessions': // sessions @@ -89,12 +91,13 @@ $databaseListener = function (string $event, Document $document, Document $proje if ($event === Database::EVENT_DOCUMENT_DELETE) { //Project level collections/documents deduction - $collections = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getAttribute('$internalId')}" . ".collections")); - $documents = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getAttribute('$internalId')}" . ".documents")); - $queueForUsage - ->addMetric("collections", ($collections['value'] * -1)) - ->addMetric("documents", ($documents['value'] * -1)) - ; + $collections = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getInternalId()}" . ".collections")); + $documents = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getInternalId()}" . ".documents")); + if (!empty($collections['value'])) { + $queueForUsage + ->addMetric("collections", ($collections['value'] * -1)) + ->addMetric("documents", ($documents['value'] * -1)); + } } break; case str_starts_with($document->getCollection(), 'database_') && !str_contains($document->getCollection(), 'collection'): //collections @@ -108,9 +111,10 @@ $databaseListener = function (string $event, Document $document, Document $proje if ($event === Database::EVENT_DOCUMENT_DELETE) { //Project documents deduction $documents = $dbForProject->getDocument('stats', md5("_inf_" . "{$databaseId}" . ".documents")); - $queueForUsage - ->addMetric("documents", ($documents['value'] * -1)) - ; + if (!empty($documents['value'])) { + $queueForUsage + ->addMetric("documents", ($documents['value'] * -1)); + } } break; case str_starts_with($document->getCollection(), 'database_') && str_contains($document->getCollection(), '_collection_'): //documents @@ -128,22 +132,25 @@ $databaseListener = function (string $event, Document $document, Document $proje ->addMetric("buckets", $value); // per project if ($event === Database::EVENT_DOCUMENT_DELETE) { - $files = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getAttribute('$internalId')}" . ".files")); - $storage = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getAttribute('$internalId')}" . ".files.storage")); + //Project files/files.storage deduction + $files = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getInternalId()}" . ".files")); + $storage = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getInternalId()}" . ".files.storage")); - //Project level function deduction - $queueForUsage - ->addMetric("files", ($files['value'] * -1)) - ->addMetric("files.storage", ($storage['value'] * -1)) - ; + if (!empty($files['value'])) { + $queueForUsage + ->addMetric("files", ($files['value'] * -1)) + ->addMetric("files.storage", ($storage['value'] * -1)); + } } break; case str_starts_with($document->getCollection(), 'bucket_'): // files + $parts = explode('_', $document->getCollection()); + $bucketId = $parts[1]; $queueForUsage ->addMetric("files", $value) // per project ->addMetric("files.storage", $document->getAttribute('sizeOriginal') * $value) // per project - ->addMetric("{$document->getAttribute('bucketId')}" . ".files", $value) // per bucket - ->addMetric("{$document->getAttribute('bucketId')}" . ".files.storage", $document->getAttribute('sizeOriginal') * $value)// per bucket + ->addMetric("{$bucketId}" . ".files", $value) // per bucket + ->addMetric("{$bucketId}" . ".files.storage", $document->getAttribute('sizeOriginal') * $value)// per bucket ; break; case $document->getCollection() === 'functions': @@ -151,24 +158,36 @@ $databaseListener = function (string $event, Document $document, Document $proje ->addMetric("functions", $value); // per project if ($event === Database::EVENT_DOCUMENT_DELETE) { - //Project level function deduction - $deployments = $dbForProject->getDocument('stats', md5("_inf_function." . "{$document->getAttribute('$internalId')}" . ".deployments")); - $deploymentsStorage = $dbForProject->getDocument('stats', md5("_inf_function." . "{$document->getAttribute('$internalId')}" . ".deployments.storage")); - $builds = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getAttribute('$internalId')}" . ".builds")); - $buildsStorage = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getAttribute('$internalId')}" . ".builds.storage")); - $buildsCompute = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getAttribute('$internalId')}" . ".builds.compute")); - $executions = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getAttribute('$internalId')}" . ".executions")); - $executionsCompute = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getAttribute('$internalId')}" . ".executions.compute")); + //Project level function/builds/executions deduction + $deployments = $dbForProject->getDocument('stats', md5("_inf_function." . "{$document->getInternalId()}" . ".deployments")); + $deploymentsStorage = $dbForProject->getDocument('stats', md5("_inf_function." . "{$document->getInternalId()}" . ".deployments.storage")); + $builds = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getInternalId()}" . ".builds")); + $buildsStorage = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getInternalId()}" . ".builds.storage")); + $buildsCompute = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getInternalId()}" . ".builds.compute")); + $executions = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getInternalId()}" . ".executions")); + $executionsCompute = $dbForProject->getDocument('stats', md5("_inf_" . "{$document->getInternalId()}" . ".executions.compute")); - $queueForUsage - ->addMetric("deployments", ($deployments['value'] * -1)) - ->addMetric("deployments.storage", ($deploymentsStorage['value'] * -1)) - ->addMetric("builds", ($builds['value'] * -1)) - ->addMetric("builds.storage", ($buildsStorage['value'] * -1)) - ->addMetric("builds.compute", ($buildsCompute['value'] * -1)) - ->addMetric("executions", ($executions['value'] * -1)) - ->addMetric("executions.compute", ($executionsCompute['value'] * -1)) - ; + if (!empty($deployments['value'])) { + $queueForUsage + ->addMetric("deployments", ($deployments['value'] * -1)) + ->addMetric("deployments.storage", ($deploymentsStorage['value'] * -1)) + ; + } + + if (!empty($builds['value'])) { + $queueForUsage + ->addMetric("builds", ($builds['value'] * -1)) + ->addMetric("builds.storage", ($buildsStorage['value'] * -1)) + ->addMetric("builds.compute", ($buildsCompute['value'] * -1)) + ; + } + + if (!empty($executions['value'])) { + $queueForUsage + ->addMetric("executions", ($executions['value'] * -1)) + ->addMetric("executions.compute", ($executionsCompute['value'] * -1)) + ; + } } break; case $document->getCollection() === 'deployments': @@ -556,7 +575,7 @@ App::shutdown() if ( $project->getId() !== 'console' - //&& $mode !== APP_MODE_ADMIN + && $mode !== APP_MODE_ADMIN ) { $fileSize = 0; $file = $request->getFiles('file'); diff --git a/tests/e2e/General/UsageTest.php b/tests/e2e/General/UsageTest.php index ab9e82e0d9..abaac548c4 100644 --- a/tests/e2e/General/UsageTest.php +++ b/tests/e2e/General/UsageTest.php @@ -111,11 +111,7 @@ class UsageTest extends Scope $consoleHeaders ); $res = $res['body']; - var_dump($res['users']); - var_dump(array_key_last($res['users'])); - var_dump($res['users'][array_key_last($res['users'])]['value']); - exit; $this->assertEquals('24h', $res['range']); $this->assertEquals(9, count($res)); $this->assertEquals(24, count($res['requests'])); @@ -162,7 +158,9 @@ class UsageTest extends Scope '/storage/buckets', array_merge( $headers, - ['content-type' => 'multipart/form-data'] + [ + 'content-type' => 'multipart/form-data' + ] ), [ 'bucketId' => 'unique()', @@ -517,14 +515,14 @@ class UsageTest extends Scope $this->assertEquals($collectionsCount, $res['collectionsCount'][array_key_last($res['collectionsCount'])]['value']); $this->validateDates($res['collectionsCount']); -// $this->assertEquals($documentsCount, $res['documentsCount'][array_key_last($res['documentsCount'])]['value']); -// $this->validateDates($res['documentsCount']); -// -// $res = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/collections/' . $collectionId . '/usage?range=30d', $data['consoleHeaders']); -// $res = $res['body']; -// -// $this->assertEquals($documentsCount, $res['documentsCount'][array_key_last($res['documentsCount'])]['value']); -// $this->validateDates($res['documentsCount']); + $this->assertEquals($documentsCount, $res['documentsCount'][array_key_last($res['documentsCount'])]['value']); + $this->validateDates($res['documentsCount']); + + $res = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/collections/' . $collectionId . '/usage?range=30d', $data['consoleHeaders']); + $res = $res['body']; + + $this->assertEquals($documentsCount, $res['documentsCount'][array_key_last($res['documentsCount'])]['value']); + $this->validateDates($res['documentsCount']); $data['requestsCount'] = $requestsCount;