From b775c5366609f77d4e6322c9c7ffa3c1063b43d8 Mon Sep 17 00:00:00 2001 From: shimon Date: Wed, 25 Oct 2023 13:16:25 +0300 Subject: [PATCH] clean up --- app/controllers/api/project.php | 1 + src/Appwrite/Platform/Tasks/Usage.php | 60 -- src/Appwrite/Usage/Calculator.php | 15 - src/Appwrite/Usage/Calculators/TimeSeries.php | 557 ------------------ src/Appwrite/Usage/Stats.php | 225 ------- 5 files changed, 1 insertion(+), 857 deletions(-) delete mode 100644 src/Appwrite/Platform/Tasks/Usage.php delete mode 100644 src/Appwrite/Usage/Calculator.php delete mode 100644 src/Appwrite/Usage/Calculators/TimeSeries.php delete mode 100644 src/Appwrite/Usage/Stats.php diff --git a/app/controllers/api/project.php b/app/controllers/api/project.php index bf0c6fc24b..bb4457eeed 100644 --- a/app/controllers/api/project.php +++ b/app/controllers/api/project.php @@ -3,6 +3,7 @@ use Appwrite\Extend\Exception; use Appwrite\Utopia\Response; use Utopia\App; +use Utopia\Config\Config; use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Exception\Duplicate as DuplicateException; diff --git a/src/Appwrite/Platform/Tasks/Usage.php b/src/Appwrite/Platform/Tasks/Usage.php deleted file mode 100644 index fa677ea142..0000000000 --- a/src/Appwrite/Platform/Tasks/Usage.php +++ /dev/null @@ -1,60 +0,0 @@ -desc('Schedules syncing data from influxdb to Appwrite console db') - ->inject('dbForConsole') - ->inject('influxdb') - ->inject('register') - ->inject('getProjectDB') - ->inject('logError') - ->callback(fn ($dbForConsole, $influxDB, $register, $getProjectDB, $logError) => $this->action($dbForConsole, $influxDB, $register, $getProjectDB, $logError)); - } - - protected function aggregateTimeseries(UtopiaDatabase $database, InfluxDatabase $influxDB, callable $logError): void - { - } - - public function action(UtopiaDatabase $dbForConsole, InfluxDatabase $influxDB, Registry $register, callable $getProjectDB, callable $logError) - { - Console::title('Usage Aggregation V1'); - Console::success(APP_NAME . ' usage aggregation process v1 has started'); - - $errorLogger = fn(Throwable $error, string $action = 'syncUsageStats') => $logError($error, "usage", $action); - - $interval = (int) App::getEnv('_APP_USAGE_AGGREGATION_INTERVAL', '30'); // 30 seconds (by default) - $region = App::getEnv('region', 'default'); - $usage = new TimeSeries($region, $dbForConsole, $influxDB, $getProjectDB, $register, $errorLogger); - - Console::loop(function () use ($interval, $usage) { - $now = date('d-m-Y H:i:s', time()); - Console::info("[{$now}] Aggregating Timeseries Usage data every {$interval} seconds"); - $loopStart = microtime(true); - - $usage->collect(); - - $loopTook = microtime(true) - $loopStart; - $now = date('d-m-Y H:i:s', time()); - Console::info("[{$now}] Aggregation took {$loopTook} seconds"); - }, $interval); - } -} diff --git a/src/Appwrite/Usage/Calculator.php b/src/Appwrite/Usage/Calculator.php deleted file mode 100644 index 37c130a34a..0000000000 --- a/src/Appwrite/Usage/Calculator.php +++ /dev/null @@ -1,15 +0,0 @@ -region = $region; - } - - abstract public function collect(): void; -} diff --git a/src/Appwrite/Usage/Calculators/TimeSeries.php b/src/Appwrite/Usage/Calculators/TimeSeries.php deleted file mode 100644 index e0a12b443f..0000000000 --- a/src/Appwrite/Usage/Calculators/TimeSeries.php +++ /dev/null @@ -1,557 +0,0 @@ - '1h', - 'startTime' => '-24 hours' - ], - [ - 'key' => '1d', - 'startTime' => '-30 days' - ] - ]; - - /** - * All the metrics that we are collecting - * - * @var array - */ - protected array $metrics = [ - 'project.$all.network.requests' => [ - 'table' => 'appwrite_usage_project_{scope}_network_requests', - ], - 'project.$all.network.bandwidth' => [ - 'table' => 'appwrite_usage_project_{scope}_network_bandwidth', - ], - 'project.$all.network.inbound' => [ - 'table' => 'appwrite_usage_project_{scope}_network_inbound', - ], - 'project.$all.network.outbound' => [ - 'table' => 'appwrite_usage_project_{scope}_network_outbound', - ], - /* Users service metrics */ - 'users.$all.requests.create' => [ - 'table' => 'appwrite_usage_users_{scope}_requests_create', - ], - 'users.$all.requests.read' => [ - 'table' => 'appwrite_usage_users_{scope}_requests_read', - ], - 'users.$all.requests.update' => [ - 'table' => 'appwrite_usage_users_{scope}_requests_update', - ], - 'users.$all.requests.delete' => [ - 'table' => 'appwrite_usage_users_{scope}_requests_delete', - ], - - 'databases.$all.requests.create' => [ - 'table' => 'appwrite_usage_databases_{scope}_requests_create', - ], - 'databases.$all.requests.read' => [ - 'table' => 'appwrite_usage_databases_{scope}_requests_read', - ], - 'databases.$all.requests.update' => [ - 'table' => 'appwrite_usage_databases_{scope}_requests_update', - ], - 'databases.$all.requests.delete' => [ - 'table' => 'appwrite_usage_databases_{scope}_requests_delete', - ], - - 'collections.$all.requests.create' => [ - 'table' => 'appwrite_usage_collections_{scope}_requests_create', - ], - 'collections.$all.requests.read' => [ - 'table' => 'appwrite_usage_collections_{scope}_requests_read', - ], - 'collections.$all.requests.update' => [ - 'table' => 'appwrite_usage_collections_{scope}_requests_update', - ], - 'collections.$all.requests.delete' => [ - 'table' => 'appwrite_usage_collections_{scope}_requests_delete', - ], - - 'documents.$all.requests.create' => [ - 'table' => 'appwrite_usage_documents_{scope}_requests_create', - ], - 'documents.$all.requests.read' => [ - 'table' => 'appwrite_usage_documents_{scope}_requests_read', - ], - 'documents.$all.requests.update' => [ - 'table' => 'appwrite_usage_documents_{scope}_requests_update', - ], - 'documents.$all.requests.delete' => [ - 'table' => 'appwrite_usage_documents_{scope}_requests_delete', - ], - - 'collections.databaseId.requests.create' => [ - 'table' => 'appwrite_usage_collections_{scope}_requests_create', - 'groupBy' => ['databaseId'], - ], - 'collections.databaseId.requests.read' => [ - 'table' => 'appwrite_usage_collections_{scope}_requests_read', - 'groupBy' => ['databaseId'], - ], - 'collections.databaseId.requests.update' => [ - 'table' => 'appwrite_usage_collections_{scope}_requests_update', - 'groupBy' => ['databaseId'], - ], - 'collections.databaseId.requests.delete' => [ - 'table' => 'appwrite_usage_collections_{scope}_requests_delete', - 'groupBy' => ['databaseId'], - ], - - 'documents.databaseId.requests.create' => [ - 'table' => 'appwrite_usage_documents_{scope}_requests_create', - 'groupBy' => ['databaseId'], - ], - 'documents.databaseId.requests.read' => [ - 'table' => 'appwrite_usage_documents_{scope}_requests_read', - 'groupBy' => ['databaseId'], - ], - 'documents.databaseId.requests.update' => [ - 'table' => 'appwrite_usage_documents_{scope}_requests_update', - 'groupBy' => ['databaseId'], - ], - 'documents.databaseId.requests.delete' => [ - 'table' => 'appwrite_usage_documents_{scope}_requests_delete', - 'groupBy' => ['databaseId'], - ], - - 'documents.databaseId/collectionId.requests.create' => [ - 'table' => 'appwrite_usage_documents_{scope}_requests_create', - 'groupBy' => ['databaseId', 'collectionId'], - ], - 'documents.databaseId/collectionId.requests.read' => [ - 'table' => 'appwrite_usage_documents_{scope}_requests_read', - 'groupBy' => ['databaseId', 'collectionId'], - ], - 'documents.databaseId/collectionId.requests.update' => [ - 'table' => 'appwrite_usage_documents_{scope}_requests_update', - 'groupBy' => ['databaseId', 'collectionId'], - ], - 'documents.databaseId/collectionId.requests.delete' => [ - 'table' => 'appwrite_usage_documents_{scope}_requests_delete', - 'groupBy' => ['databaseId', 'collectionId'], - ], - - 'buckets.$all.requests.create' => [ - 'table' => 'appwrite_usage_buckets_{scope}_requests_create', - ], - 'buckets.$all.requests.read' => [ - 'table' => 'appwrite_usage_buckets_{scope}_requests_read', - ], - 'buckets.$all.requests.update' => [ - 'table' => 'appwrite_usage_buckets_{scope}_requests_update', - ], - 'buckets.$all.requests.delete' => [ - 'table' => 'appwrite_usage_buckets_{scope}_requests_delete', - ], - - 'files.$all.requests.create' => [ - 'table' => 'appwrite_usage_files_{scope}_requests_create', - ], - 'files.$all.requests.read' => [ - 'table' => 'appwrite_usage_files_{scope}_requests_read', - ], - 'files.$all.requests.update' => [ - 'table' => 'appwrite_usage_files_{scope}_requests_update', - ], - 'files.$all.requests.delete' => [ - 'table' => 'appwrite_usage_files_{scope}_requests_delete', - ], - - 'files.bucketId.requests.create' => [ - 'table' => 'appwrite_usage_files_{scope}_requests_create', - 'groupBy' => ['bucketId'], - ], - 'files.bucketId.requests.read' => [ - 'table' => 'appwrite_usage_files_{scope}_requests_read', - 'groupBy' => ['bucketId'], - ], - 'files.bucketId.requests.update' => [ - 'table' => 'appwrite_usage_files_{scope}_requests_update', - 'groupBy' => ['bucketId'], - ], - 'files.bucketId.requests.delete' => [ - 'table' => 'appwrite_usage_files_{scope}_requests_delete', - 'groupBy' => ['bucketId'], - ], - - 'sessions.$all.requests.create' => [ - 'table' => 'appwrite_usage_sessions__{scope}_requests_create', - ], - 'sessions.provider.requests.create' => [ - 'table' => 'appwrite_usage_sessions_{scope}_requests_create', - 'groupBy' => ['provider'], - ], - 'sessions.$all.requests.delete' => [ - 'table' => 'appwrite_usage_sessions_{scope}_requests_delete', - ], - 'executions.$all.compute.total' => [ - 'table' => 'appwrite_usage_executions_{scope}_compute', - ], - 'builds.$all.compute.total' => [ - 'table' => 'appwrite_usage_builds_{scope}_compute', - ], - 'executions.$all.compute.failure' => [ - 'table' => 'appwrite_usage_executions_{scope}_compute', - 'filters' => [ - 'functionStatus' => 'failed', - ], - ], - 'builds.$all.compute.failure' => [ - 'table' => 'appwrite_usage_builds_{scope}_compute', - 'filters' => [ - 'functionStatus' => 'failed', - ], - ], - 'executions.$all.compute.success' => [ - 'table' => 'appwrite_usage_executions_{scope}_compute', - 'filters' => [ - 'functionStatus' => 'success', - ], - ], - 'builds.$all.compute.success' => [ - 'table' => 'appwrite_usage_builds_{scope}_compute', - 'filters' => [ - 'functionStatus' => 'success', - ], - ], - 'executions.functionId.compute.total' => [ - 'table' => 'appwrite_usage_executions_{scope}_compute', - 'groupBy' => ['functionId'], - ], - 'builds.functionId.compute.total' => [ - 'table' => 'appwrite_usage_builds_{scope}_compute', - 'groupBy' => ['functionId'], - ], - - 'executions.functionId.compute.failure' => [ - 'table' => 'appwrite_usage_executions_{scope}_compute', - 'groupBy' => ['functionId'], - 'filters' => [ - 'functionStatus' => 'failed', - ], - ], - 'builds.functionId.compute.failure' => [ - 'table' => 'appwrite_usage_builds_{scope}_compute', - 'groupBy' => ['functionId'], - 'filters' => [ - 'functionBuildStatus' => 'failed', - ], - ], - 'executions.functionId.compute.success' => [ - 'table' => 'appwrite_usage_executions_{scope}_compute', - 'groupBy' => ['functionId'], - 'filters' => [ - 'functionStatus' => 'success', - ], - ], - 'builds.functionId.compute.success' => [ - 'table' => 'appwrite_usage_builds_{scope}_compute', - 'groupBy' => ['functionId'], - 'filters' => [ - 'functionBuildStatus' => 'success', - ], - ], - - // counters - 'users.$all.count.total' => [ - 'table' => 'appwrite_usage_users_{scope}_count_total', - ], - 'buckets.$all.count.total' => [ - 'table' => 'appwrite_usage_buckets_{scope}_count_total', - ], - 'files.$all.count.total' => [ - 'table' => 'appwrite_usage_files_{scope}_count_total', - ], - 'files.bucketId.count.total' => [ - 'table' => 'appwrite_usage_files_{scope}_count_total', - 'groupBy' => ['bucketId'] - ], - 'databases.$all.count.total' => [ - 'table' => 'appwrite_usage_databases_{scope}_count_total', - ], - 'collections.$all.count.total' => [ - 'table' => 'appwrite_usage_collections_{scope}_count_total', - ], - 'documents.$all.count.total' => [ - 'table' => 'appwrite_usage_documents_{scope}_count_total', - ], - 'collections.databaseId.count.total' => [ - 'table' => 'appwrite_usage_collections_{scope}_count_total', - 'groupBy' => ['databaseId'] - ], - 'documents.databaseId.count.total' => [ - 'table' => 'appwrite_usage_documents_{scope}_count_total', - 'groupBy' => ['databaseId'] - ], - 'documents.databaseId/collectionId.count.total' => [ - 'table' => 'appwrite_usage_documents_{scope}_count_total', - 'groupBy' => ['databaseId', 'collectionId'] - ], - 'deployments.$all.storage.size' => [ - 'table' => 'appwrite_usage_deployments_{scope}_storage_size', - ], - 'project.$all.storage.size' => [ - 'table' => 'appwrite_usage_project_{scope}_storage_size', - ], - 'files.$all.storage.size' => [ - 'table' => 'appwrite_usage_files_{scope}_storage_size', - ], - 'files.$bucketId.storage.size' => [ - 'table' => 'appwrite_usage_files_{scope}_storage_size', - 'groupBy' => ['bucketId'] - ], - - 'builds.$all.compute.time' => [ - 'table' => 'appwrite_usage_executions_{scope}_compute_time', - ], - 'executions.$all.compute.time' => [ - 'table' => 'appwrite_usage_executions_{scope}_compute_time', - ], - - 'executions.functionId.compute.time' => [ - 'table' => 'appwrite_usage_executions_{scope}_compute_time', - 'groupBy' => ['functionId'], - ], - 'builds.functionId.compute.time' => [ - 'table' => 'appwrite_usage_builds_{scope}_compute_time', - 'groupBy' => ['functionId'], - ], - - 'project.$all.compute.time' => [ // Built time + execution time - 'table' => 'appwrite_usage_project_{scope}_compute_time', - 'groupBy' => ['functionId'], - ], - - 'deployments.$all.storage.size' => [ - 'table' => 'appwrite_usage_deployments_{scope}_storage_size' - ], - 'project.$all.storage.size' => [ - 'table' => 'appwrite_usage_project_{scope}_storage_size' - ], - 'files.$all.storage.size' => [ - 'table' => 'appwrite_usage_files_{scope}_storage_size' - ], - 'files.bucketId.storage.size' => [ - 'table' => 'appwrite_usage_files_{scope}_storage_size', - 'groupBy' => ['bucketId'] - ] - ]; - - public function __construct(string $region, Database $database, InfluxDatabase $influxDB, callable $getProjectDB, Registry $register, callable $errorHandler = null) - { - parent::__construct($region); - $this->database = $database; - $this->influxDB = $influxDB; - $this->getProjectDB = $getProjectDB; - $this->register = $register; - $this->errorHandler = $errorHandler; - } - - /** - * Create or Update Mertic - * Create or update each metric in the stats collection for the given project - * - * @param string $projectId - * @param int $time - * @param string $period - * @param string $metric - * @param int $value - * @param int $type - * - * @return void - */ - private function createOrUpdateMetric(string $projectId, string $time, string $period, string $metric, int $value, int $type): void - { - $id = \md5("{$time}_{$period}_{$metric}"); - $project = $this->database->getDocument('projects', $projectId); - $database = call_user_func($this->getProjectDB, $project); - - try { - $document = $database->getDocument('stats', $id); - if ($document->isEmpty()) { - $database->createDocument('stats', new Document([ - '$id' => $id, - 'period' => $period, - 'time' => $time, - 'metric' => $metric, - 'value' => $value, - 'type' => $type, - 'region' => $this->region, - ])); - } else { - $database->updateDocument( - 'stats', - $document->getId(), - $document->setAttribute('value', $value) - ); - } - } catch (\Exception $e) { // if projects are deleted this might fail - if (is_callable($this->errorHandler)) { - call_user_func($this->errorHandler, $e, "sync_project_{$projectId}_metric_{$metric}"); - } else { - throw $e; - } - } - - $this->register->get('pools')->reclaim(); - } - - /** - * Sync From InfluxDB - * Sync stats from influxDB to stats collection in the Appwrite database - * - * @param string $metric - * @param array $options - * @param array $period - * - * @return void - */ - private function syncFromInfluxDB(string $metric, array $options, array $period): void - { - $start = DateTime::createFromFormat('U', \strtotime($period['startTime']))->format(DateTime::RFC3339); - if (!empty($this->latestTime[$metric][$period['key']])) { - $start = $this->latestTime[$metric][$period['key']]; - } - $end = (new DateTime())->format(DateTime::RFC3339); - - $table = $options['table']; //Which influxdb table to query for this metric - $groupBy = empty($options['groupBy']) ? '' : ', ' . implode(', ', array_map(fn($groupBy) => '"' . $groupBy . '" ', $options['groupBy'])); //Some sub level metrics may be grouped by other tags like collectionId, bucketId, etc - - $filters = $options['filters'] ?? []; // Some metrics might have additional filters, like function's status - if (!empty($filters)) { - $filters = ' AND ' . implode(' AND ', array_map(fn ($filter, $value) => "\"{$filter}\"='{$value}'", array_keys($filters), array_values($filters))); - } else { - $filters = ''; - } - - $query = "SELECT sum(value) AS \"value\" "; - $query .= "FROM \"{$table}\" "; - $query .= "WHERE \"time\" > '{$start}' "; - $query .= "AND \"time\" < '{$end}' "; - $query .= "AND \"metric_type\"='counter' {$filters} "; - $query .= "GROUP BY time({$period['key']}), \"projectId\" {$groupBy} "; - $query .= "FILL(null)"; - - try { - $result = $this->influxDB->query($query); - $points = $result->getPoints(); - foreach ($points as $point) { - $projectId = $point['projectId']; - - if (!empty($projectId) && $projectId !== 'console') { - $metricUpdated = $metric; - if (!empty($groupBy)) { - foreach ($options['groupBy'] as $groupBy) { - $groupedBy = $point[$groupBy] ?? ''; - if (empty($groupedBy)) { - continue; - } - $metricUpdated = str_replace($groupBy, $groupedBy, $metricUpdated); - } - } - - $value = (!empty($point['value'])) ? $point['value'] : 0; - - $this->createOrUpdateMetric( - $point['projectId'], - $point['time'], - $period['key'], - $metricUpdated, - $value, - 0 - ); - $this->latestTime[$metric][$period['key']] = $point['time']; - } - } - } catch (\Exception $e) { // if projects are deleted this might fail - if (is_callable($this->errorHandler)) { - call_user_func($this->errorHandler, $e, "sync_metric_{$metric}_influxdb"); - } else { - throw $e; - } - } - } - - /** - * Collect Stats - * Collect all the stats from Influd DB to Database - * - * @return void - */ - public function collect(): void - { - foreach ($this->periods as $period) { - foreach ($this->metrics as $metric => $options) { //for each metrics - try { - $this->syncFromInfluxDB($metric, $options, $period); - } catch (\Exception $e) { - if (is_callable($this->errorHandler)) { - call_user_func($this->errorHandler, $e); - } else { - throw $e; - } - } - } - } - } -} diff --git a/src/Appwrite/Usage/Stats.php b/src/Appwrite/Usage/Stats.php deleted file mode 100644 index e6e0056664..0000000000 --- a/src/Appwrite/Usage/Stats.php +++ /dev/null @@ -1,225 +0,0 @@ -statsd = $statsd; - } - - /** - * @param string $key - * @param mixed $value - * - * @return $this - */ - public function setParam(string $key, $value): self - { - $this->params[$key] = $value; - - return $this; - } - - /** - * @param string $key - * - * @return mixed|null - */ - public function getParam(string $key) - { - return (isset($this->params[$key])) ? $this->params[$key] : null; - } - - /** - * @param string $namespace - * - * @return $this - */ - public function setNamespace(string $namespace): self - { - $this->namespace = $namespace; - - return $this; - } - - /** - * @return string - */ - public function getNamespace() - { - return $this->namespace; - } - - /** - * Submit data to StatsD. - * Send various metrics to StatsD based on the parameters that are set - * @return void - */ - public function submit(): void - { - $projectId = $this->params['projectId'] ?? ''; - $projectInternalId = $this->params['projectInternalId']; - $tags = ",projectInternalId={$projectInternalId},projectId={$projectId},version=" . App::getEnv('_APP_VERSION', 'UNKNOWN'); - - // the global namespace is prepended to every key (optional) - $this->statsd->setNamespace($this->namespace); - - $httpRequest = $this->params['project.{scope}.network.requests'] ?? 0; - $httpMethod = $this->params['httpMethod'] ?? ''; - if ($httpRequest >= 1) { - $this->statsd->increment('project.{scope}.network.requests' . $tags . ',method=' . \strtolower($httpMethod)); - } - - $inbound = $this->params['project.{scope}.network.inbound'] ?? 0; - $outbound = $this->params['project.{scope}.network.outbound'] ?? 0; - $this->statsd->count('project.{scope}.network.inbound' . $tags, $inbound); - $this->statsd->count('project.{scope}.network.outbound' . $tags, $outbound); - $this->statsd->count('project.{scope}.network.bandwidth' . $tags, $inbound + $outbound); - - $usersMetrics = [ - 'users.{scope}.requests.create', - 'users.{scope}.requests.read', - 'users.{scope}.requests.update', - 'users.{scope}.requests.delete', - 'users.{scope}.count.total', - ]; - - foreach ($usersMetrics as $metric) { - $value = $this->params[$metric] ?? 0; - if ($value === 1 || $value === -1) { - $this->statsd->count($metric . $tags, $value); - } - } - - $dbMetrics = [ - 'databases.{scope}.requests.create', - 'databases.{scope}.requests.read', - 'databases.{scope}.requests.update', - 'databases.{scope}.requests.delete', - 'collections.{scope}.requests.create', - 'collections.{scope}.requests.read', - 'collections.{scope}.requests.update', - 'collections.{scope}.requests.delete', - 'documents.{scope}.requests.create', - 'documents.{scope}.requests.read', - 'documents.{scope}.requests.update', - 'documents.{scope}.requests.delete', - 'databases.{scope}.count.total', - 'collections.{scope}.count.total', - 'documents.{scope}.count.total' - ]; - - foreach ($dbMetrics as $metric) { - $value = $this->params[$metric] ?? 0; - if ($value === 1 || $value === -1) { - $dbTags = $tags . ",collectionId=" . ($this->params['collectionId'] ?? '') . ",databaseId=" . ($this->params['databaseId'] ?? ''); - $this->statsd->count($metric . $dbTags, $value); - } - } - - $storageMertics = [ - 'buckets.{scope}.requests.create', - 'buckets.{scope}.requests.read', - 'buckets.{scope}.requests.update', - 'buckets.{scope}.requests.delete', - 'files.{scope}.requests.create', - 'files.{scope}.requests.read', - 'files.{scope}.requests.update', - 'files.{scope}.requests.delete', - 'buckets.{scope}.count.total', - 'files.{scope}.count.total', - 'files.{scope}.storage.size' - ]; - - foreach ($storageMertics as $metric) { - $value = $this->params[$metric] ?? 0; - if ($value !== 0) { - $storageTags = $tags . ",bucketId=" . ($this->params['bucketId'] ?? ''); - $this->statsd->count($metric . $storageTags, $value); - } - } - - $sessionsMetrics = [ - 'sessions.{scope}.requests.create', - 'sessions.{scope}.requests.update', - 'sessions.{scope}.requests.delete', - ]; - - foreach ($sessionsMetrics as $metric) { - $value = $this->params[$metric] ?? 0; - if ($value >= 1) { - $sessionTags = $tags . ",provider=" . ($this->params['provider'] ?? ''); - $this->statsd->count($metric . $sessionTags, $value); - } - } - - $functionId = $this->params['functionId'] ?? ''; - $functionExecution = $this->params['executions.{scope}.compute'] ?? 0; - $functionExecutionTime = ($this->params['executionTime'] ?? 0) * 1000; // ms - $functionExecutionStatus = $this->params['executionStatus'] ?? ''; - - $functionBuild = $this->params['builds.{scope}.compute'] ?? 0; - $functionBuildTime = ($this->params['buildTime'] ?? 0) * 1000; // ms - $functionBuildStatus = $this->params['buildStatus'] ?? ''; - $functionCompute = $functionExecutionTime + $functionBuildTime; - $functionTags = $tags . ',functionId=' . $functionId; - - $deploymentSize = $this->params['deployment.{scope}.storage.size'] ?? 0; - $storageSize = $this->params['files.{scope}.storage.size'] ?? 0; - if ($deploymentSize + $storageSize > 0 || $deploymentSize + $storageSize <= -1) { - $this->statsd->count('project.{scope}.storage.size' . $tags, $deploymentSize + $storageSize); - } - - if ($deploymentSize !== 0) { - $this->statsd->count('deployments.{scope}.storage.size' . $functionTags, $deploymentSize); - } - - if ($functionExecution >= 1) { - $this->statsd->increment('executions.{scope}.compute' . $functionTags . ',functionStatus=' . $functionExecutionStatus); - if ($functionExecutionTime > 0) { - $this->statsd->count('executions.{scope}.compute.time' . $functionTags, $functionExecutionTime); - } - } - if ($functionBuild >= 1) { - $this->statsd->increment('builds.{scope}.compute' . $functionTags . ',functionBuildStatus=' . $functionBuildStatus); - $this->statsd->count('builds.{scope}.compute.time' . $functionTags, $functionBuildTime); - } - if ($functionBuild + $functionExecution >= 1) { - $this->statsd->count('project.{scope}.compute.time' . $functionTags, $functionCompute); - } - - $this->reset(); - } - - public function reset(): self - { - $this->params = []; - $this->namespace = 'appwrite.usage'; - - return $this; - } -}