1
0
Fork 0
mirror of synced 2024-08-21 05:02:07 +12:00
appwrite/app/workers/usage.php
2022-12-08 21:06:55 +02:00

103 lines
4.1 KiB
PHP

<?php
require_once __DIR__ . '/../worker.php';
use Swoole\Timer;
use Utopia\App;
use Utopia\Database\Database;
use Utopia\Database\Document;
use Utopia\Database\Validator\Authorization;
use Utopia\Queue\Message;
use Utopia\CLI\Console;
Authorization::disable();
Authorization::setDefaultStatus(false);
$stats = [];
$periods['1h'] = 'Y-m-d H:00';
$periods['1d'] = 'Y-m-d 00:00';
$periods['inf'] = '0000-00-00 00:00';
$server->job()
->inject('message')
->action(function (Message $message) use (&$stats) {
$payload = $message->getPayload() ?? [];
$project = new Document($payload['project'] ?? []);
foreach ($payload['metrics'] ?? [] as $metric) {
$uniq = md5($metric['key']);
if (!isset($stats[$uniq])) {
$stats[$uniq] = [
'projectInternalId' => $project->getInternalId(),
'database' => $project->getAttribute('database'),
'key' => $metric['key'],
'value' => $metric['value']
];
continue;
}
$stats[$uniq]['value'] += $metric['value'];
}
});
$server
->workerStart()
->inject('register')
->inject('cache')
->inject('pools')
->action(function ($register, $cache, $pools) use ($periods, &$stats) {
Timer::tick(30000, function () use ($register, $cache, $pools, $periods, &$stats) {
$slice = array_slice($stats, 0, count($stats));
array_splice($stats, 0, count($stats));
foreach ($slice as $metric) {
foreach ($periods as $period => $format) {
$time = 'inf' === $period ? null : date($format, time());
$id = \md5("{$time}_{$period}_{$metric['key']}");
$adapter = new Database(
$pools
->get($metric['database'])
->pop()
->getResource(),
$cache
);
$adapter->setNamespace('_' . $metric['projectInternalId']);
try {
$document = $adapter->getDocument('stats', $id);
if ($document->isEmpty()) {
//console::log("{$period}, {$time}, {$metric['key']}={$metric['value']}");
$adapter->createDocument('stats', new Document([
'$id' => $id,
'period' => $period,
'time' => $time,
'metric' => $metric['key'],
'value' => $metric['value'],
'type' => 0,
'region' => App::getEnv('_APP_REGION', 'default'),
]));
} else {
$value = $document->getAttribute('value') + $metric['value'];
//console::info("{$document->getAttribute('period')}, {$document->getAttribute('time')}, {$document->getAttribute('metric')} = {$value}");
$adapter->updateDocument(
'stats',
$document->getId(),
$document->setAttribute('value', $document->getAttribute('value') + $metric['value'])
);
}
} catch (\Exception $e) {
console::error($e->getMessage());
} finally {
$pools->reclaim();
}
}
}
});
});
$server->start();