1
0
Fork 0
mirror of synced 2024-09-28 07:21:35 +12:00

WIP: Better worker error logging

This commit is contained in:
Matej Baco 2021-11-30 13:12:17 +01:00
parent 7bed9aed5b
commit 970936c93d

View file

@ -2,12 +2,15 @@
namespace Appwrite\Resque;
use Utopia\App;
use Utopia\CLI\Console;
use Utopia\Logger\Log;
abstract class Worker
{
/**
* Callbacks that will be executed when an error occurs
*
* @var array
*/
protected $errorCallbacks = [];
/**
* Named array holding all information passed into worker alongside a new task.
*
@ -60,38 +63,8 @@ abstract class Worker
try {
$this->init();
} catch(\Throwable $error) {
global $register;
$logger = $register->get('logger');
if($logger) {
$version = App::getEnv('_APP_VERSION', 'UNKNOWN');
$workerType = $this->getName();
$log = new Log();
$log->setNamespace("worker-" . $workerType);
$log->setServer(\gethostname());
$log->setVersion($version);
$log->setType(Log::TYPE_ERROR);
$log->setMessage($error->getMessage());
$log->addTag('worker_type', $workerType);
$log->addTag('code', $error->getCode());
$log->addTag('verbose_type', \get_class($error));
$log->addExtra('file', $error->getFile());
$log->addExtra('line', $error->getLine());
$log->addExtra('trace', $error->getTraceAsString());
$log->addExtra('args', $this->args);
$action = 'worker.' . $workerType . '.setUp';
$log->setAction($action);
$isProduction = App::getEnv('_APP_ENV', 'development') === 'production';
$log->setEnvironment($isProduction ? Log::ENVIRONMENT_PRODUCTION : Log::ENVIRONMENT_STAGING);
$responseCode = $logger->addLog($log);
Console::info('Setup log pushed with status code: '.$responseCode);
foreach ($this->errorCallbacks as $errorCallback) {
$errorCallback($error, "init");
}
throw $error;
@ -109,39 +82,8 @@ abstract class Worker
try {
$this->run();
} catch(\Throwable $error) {
global $register;
$logger = $register->get('logger');
if($logger) {
$version = App::getEnv('_APP_VERSION', 'UNKNOWN');
$workerType = $this->getName();
$log = new Log();
$log->setNamespace("worker-" . $workerType);
$log->setServer(\gethostname());
$log->setVersion($version);
$log->setType(Log::TYPE_ERROR);
$log->setMessage($error->getMessage());
$log->setTags([
'worker_type' => $workerType,
'code' => $error->getCode(),
'verbose_type' => \get_class($error),
]);
$log->addExtra('file', $error->getFile());
$log->addExtra('line', $error->getLine());
$log->addExtra('trace', $error->getTraceAsString());
$action = 'worker.' . $workerType . '.perform';
$log->setAction($action);
$isProduction = App::getEnv('_APP_ENV', 'development') === 'production';
$log->setEnvironment($isProduction ? Log::ENVIRONMENT_PRODUCTION : Log::ENVIRONMENT_STAGING);
$responseCode = $logger->addLog($log);
Console::info('Perform log pushed with status code: '.$responseCode);
foreach ($this->errorCallbacks as $errorCallback) {
$errorCallback($error, "run");
}
throw $error;
@ -159,42 +101,59 @@ abstract class Worker
try {
$this->shutdown();
} catch(\Throwable $error) {
global $register;
$logger = $register->get('logger');
if($logger) {
$version = App::getEnv('_APP_VERSION', 'UNKNOWN');
$workerType = $this->getName();
$log = new Log();
$log->setNamespace("worker-" . $workerType);
$log->setServer(\gethostname());
$log->setVersion($version);
$log->setType(Log::TYPE_ERROR);
$log->setMessage($error->getMessage());
$log->setTags([
'worker_type' => $workerType,
'code' => $error->getCode(),
'verbose_type' => \get_class($error),
]);
$log->addExtra('file', $error->getFile());
$log->addExtra('line', $error->getLine());
$log->addExtra('trace', $error->getTraceAsString());
$action = 'worker.' . $workerType . '.tearDown';
$log->setAction($action);
$isProduction = App::getEnv('_APP_ENV', 'development') === 'production';
$log->setEnvironment($isProduction ? Log::ENVIRONMENT_PRODUCTION : Log::ENVIRONMENT_STAGING);
$responseCode = $logger->addLog($log);
Console::info('Teardown log pushed with status code: '.$responseCode);
foreach ($this->errorCallbacks as $errorCallback) {
$errorCallback($error, "shutdown");
}
throw $error;
}
}
/**
* Register callback. Will be executed when error occurs.
* @param callable $callback
* @param Throwable $error
* @return self
*/
public function error(callable $callback): self
{
\array_push($this->errorCallbacks, $callback);
return $this;
}
// TODO: Implement this on init file using Worker->error(function() { HERE })
//global $register;
//$logger = $register->get('logger');
//
//if($logger) {
//$version = App::getEnv('_APP_VERSION', 'UNKNOWN');
//$workerType = $this->getName();
//
//$log = new Log();
//
//$log->setNamespace("worker-" . $workerType);
//$log->setServer(\gethostname());
//$log->setVersion($version);
//$log->setType(Log::TYPE_ERROR);
//$log->setMessage($error->getMessage());
//
//$log->addTag('worker_type', $workerType);
//$log->addTag('code', $error->getCode());
//$log->addTag('verbose_type', \get_class($error));
//
//$log->addExtra('file', $error->getFile());
//$log->addExtra('line', $error->getLine());
//$log->addExtra('trace', $error->getTraceAsString());
//$log->addExtra('args', $this->args);
//
//$action = 'worker.' . $workerType . '.setUp';
//$log->setAction($action);
//
//$isProduction = App::getEnv('_APP_ENV', 'development') === 'production';
//$log->setEnvironment($isProduction ? Log::ENVIRONMENT_PRODUCTION : Log::ENVIRONMENT_STAGING);
//
//$responseCode = $logger->addLog($log);
//Console::info('Setup log pushed with status code: '.$responseCode);
//}
}