Skip to content

Commit

Permalink
Merge pull request #84 from neighborhoods/feature/KOJO-148
Browse files Browse the repository at this point in the history
Feature/KOJO-148 | Correct target branch
  • Loading branch information
alexberryman committed Oct 1, 2019
2 parents f190d1c + 9532247 commit df74740
Show file tree
Hide file tree
Showing 31 changed files with 910 additions and 178 deletions.
3 changes: 2 additions & 1 deletion src/Foreman.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ class Foreman implements ForemanInterface
use Update\Complete\Success\Factory\AwareTrait;
use Defensive\AwareTrait;
use Logger\AwareTrait;
use Logger\Message\Metadata\Builder\AwareTrait;
use Api\V1\RDBMS\Connection\Service\AwareTrait;

public function workWorker(): ForemanInterface
Expand All @@ -43,7 +44,7 @@ protected function _workWorker(): ForemanInterface
$this->setJob($this->_getSelector()->getWorkableJob());
$this->_getLocator()->setJob($this->_getJob());
try {
$this->_getLogger()->setJob($this->_getJob());
$this->getProcessPoolLoggerMessageMetadataBuilder()->setJob($this->_getJob());
$this->_updateJobAsWorking();
$this->_runWorker();
$this->_updateJobAfterWork();
Expand Down
1 change: 1 addition & 0 deletions src/Foreman.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ services:
- [setServiceUpdateCrashFactory, ['@service.update.crash.factory']]
- [setServiceUpdateCompleteSuccessFactory, ['@service.update.complete.success.factory']]
- [setLogger, ['@process.pool.logger']]
- [setProcessPoolLoggerMessageMetadataBuilder, ['@neighborhoods.kojo.process.pool.logger.message.metadata.builder']]
- [setApiV1WorkerService, ['@api.v1.worker.service']]
- [setStateService, ['@state.service']]
- [setMessageBroker, ['@message.broker.redis']]
Expand Down
102 changes: 9 additions & 93 deletions src/Process/Pool/Logger.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,114 +3,30 @@

namespace Neighborhoods\Kojo\Process\Pool;

use Monolog\Formatter\NormalizerFormatter;
use Neighborhoods\Kojo\Data\JobInterface;
use Neighborhoods\Kojo\ProcessInterface;
use Neighborhoods\Pylon\Data\Property\Defensive;
use Neighborhoods\Pylon\Time;
use Psr\Log;

class Logger extends Log\AbstractLogger implements LoggerInterface
{
use Time\AwareTrait;
use Logger\Message\Factory\AwareTrait;
use Logger\Message\SerializableProcess\FromProcessModel\Builder\Factory\AwareTrait;
use Logger\Message\Builder\Factory\AwareTrait;
use Defensive\AwareTrait;

public const PROP_IS_ENABLED = 'is_enabled';
public const CONTEXT_KEY_EXCEPTION = 'exception';
public const CONTEXT_KEY_EXCEPTION_STRING = 'exception_string';

protected const LOG_DATE_TIME_FORMAT = 'D, d M y H:i:s.u T';

protected $log_formatter;
protected $level_filter_mask;
/** @var JobInterface */
protected $job;

public function setProcess(ProcessInterface $process): LoggerInterface
{
$this->_createOrUpdate(ProcessInterface::class, $process);

return $this;
}

public function hasJob(): bool
{
return isset($this->job);
}

public function getJob() : JobInterface
{
if ($this->job === null) {
throw new \LogicException('Logger job has not been set.');
}

return $this->job;
}

public function setJob(JobInterface $job) : LoggerInterface
public function log($level, $message, array $context = [])
{
if ($this->job !== null) {
throw new \LogicException('Logger job is already set.');
}

$this->job = $job;

return $this;
}
if ($this->_isEnabled() === true && $this->getLevelFilterMask()[$level] === false) {
$logMessageBuilder = $this->getProcessPoolLoggerMessageBuilderFactory()->create();
$logMessageBuilder->setLevel($level);
$logMessageBuilder->setMessage($message);
$logMessageBuilder->setContext($context);

protected function _getProcess(): ProcessInterface
{
return $this->_read(ProcessInterface::class);
}
$logMessage = $logMessageBuilder->build();
fwrite(STDOUT, $this->getLogFormatter()->getFormattedMessage($logMessage) . PHP_EOL);

public function log($level, $message, array $context = [])
{
if ($this->_isEnabled() === true) {
$logMessage = $this->getProcessPoolLoggerMessageFactory()->create();

if ($this->getLevelFilterMask()[$level] === false) {
if ($this->_exists(ProcessInterface::class)) {
$processId = (string)$this->_getProcess()->getProcessId();
$serializableProcess = $this->getProcessPoolLoggerMessageSerializableProcessFromProcessModelBuilderFactory()
->create()
->setProcessModelInterface($this->_getProcess())
->build();
$logMessage->setKojoProcess($serializableProcess);

} else {
$processId = '?';
}

$referenceTime = $this->_getTime()->getNow();
$logMessage->setTime($referenceTime->format(self::LOG_DATE_TIME_FORMAT));
$logMessage->setLevel($level);
$logMessage->setProcessId($processId);
$logMessage->setProcessPath($this->_getProcess()->getPath());

if ($this->hasJob()){
$logMessage->setKojoJob($this->getJob());
}

$logMessage->setMessage($message);

if (array_key_exists(self::CONTEXT_KEY_EXCEPTION, $context) && $context[self::CONTEXT_KEY_EXCEPTION]
instanceof \Throwable){
$normalizedException = (new NormalizerFormatter())->format([$context[self::CONTEXT_KEY_EXCEPTION]]);
unset($context[self::CONTEXT_KEY_EXCEPTION]);
$context[self::CONTEXT_KEY_EXCEPTION] = $normalizedException[0];
}

if (json_encode($context) === false) {
$logMessage->setContext([]);
} else {
$logMessage->setContext($context);
}

$logMessage->setContextJsonLastError(json_last_error());
fwrite(STDOUT, $this->getLogFormatter()->getFormattedMessage($logMessage) . PHP_EOL);
}
}

return;
Expand Down
5 changes: 2 additions & 3 deletions src/Process/Pool/Logger.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,9 @@ services:
class: Neighborhoods\Kojo\Process\Pool\Logger
calls:
- [setIsEnabled, ['%process.pool.logger.is_enabled%']]
- [setTime, ['@neighborhoods.pylon.time']]
- [setLogFormatter, ['@neighborhoods.kojo.process.log_formatter']]
- [setProcessPoolLoggerMessageFactory, ['@neighborhoods.kojo.process.pool.logger.message.factory']]
- [setProcessPoolLoggerMessageBuilderFactory, ['@neighborhoods.kojo.process.pool.logger.message.builder.factory']]
- [setLevelFilterMask, ['%neighborhoods.kojo.process.pool.logger.level_filter_mask%']]
- [setProcessPoolLoggerMessageSerializableProcessFromProcessModelBuilderFactory, ['@neighborhoods.kojo.process.pool.logger.message.serializable_process.from_process_model.builder.factory']]
process.pool.logger:
alias: neighborhoods.kojo.process.pool.logger

10 changes: 7 additions & 3 deletions src/Process/Pool/Logger/Formatter.php
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,15 @@ protected function formatPipes(MessageInterface $message) : string
{
$processPathPaddingLength = $this->getProcessPathPadding();

$processPath = str_pad($message->getProcessPath(), $processPathPaddingLength, ' ');
$processPath = str_pad($message->getMetadata()->getProcess()->getPath(), $processPathPaddingLength, ' ');
$level = str_pad($message->getLevel(), 8, ' ');
$kojoJobTypeCode = str_pad($message->hasKojoJob() ? $message->getKojoJob()->getTypeCode() : '', 26, ' ');
$kojoJobTypeCode = str_pad(
$message->getMetadata()->hasJob() ? $message->getMetadata()->getJob()->getTypeCode() : '',
26,
' '
);
$kojoJobAssignedState = str_pad(
$message->hasKojoJob() ? $message->getKojoJob()->getAssignedState() : '',
$message->getMetadata()->hasJob() ? $message->getMetadata()->getJob()->getAssignedState() : '',
20,
' '
);
Expand Down
132 changes: 72 additions & 60 deletions src/Process/Pool/Logger/Message.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

use Neighborhoods\Kojo\Data\JobInterface;
use Neighborhoods\Kojo\Process\Pool\Logger\Message\SerializableProcessInterface;
use Neighborhoods\Kojo\Process\Pool\Logger\Message\MetadataInterface;

class Message implements MessageInterface, \JsonSerializable
{
Expand All @@ -17,14 +18,31 @@ class Message implements MessageInterface, \JsonSerializable

protected $time;
protected $level;
protected $message;
protected $context;
protected $context_json_last_error;
/** @var MetadataInterface */
protected $kojo_metadata;
/**
* @var int
* @deprecated
*/
protected $process_id;
/**
* @var string
* @deprecated
*/
protected $process_path;
/**
* @var JobInterface
* @deprecated
*/
protected $kojo_job;
/** @var SerializableProcessInterface */
/**
* @var SerializableProcessInterface
* @deprecated
*/
protected $kojo_process;
protected $message;
protected $context;
protected $context_json_last_error;

public function jsonSerialize(): array
{
Expand Down Expand Up @@ -71,46 +89,6 @@ public function setLevel(string $level): MessageInterface
return $this;
}

public function getProcessId(): string
{
if ($this->process_id === null) {
throw new \LogicException('Message ' . self::KEY_PROCESS_ID . ' has not been set.');
}

return $this->process_id;
}

public function setProcessId(string $process_id): MessageInterface
{
if ($this->process_id !== null) {
throw new \LogicException('Message ' . self::KEY_PROCESS_ID . ' already set.');
}

$this->process_id = $process_id;

return $this;
}

public function getProcessPath(): string
{
if ($this->process_path === null) {
throw new \LogicException('Message ' . self::KEY_PROCESS_PATH . ' has not been set.');
}

return $this->process_path;
}

public function setProcessPath(string $process_path): MessageInterface
{
if ($this->process_path !== null) {
throw new \LogicException('Message ' . self::KEY_PROCESS_PATH . ' already set.');
}

$this->process_path = $process_path;

return $this;
}

public function getMessage(): string
{
if ($this->message === null) {
Expand Down Expand Up @@ -171,45 +149,79 @@ public function setContextJsonLastError(int $context_json_last_error): MessageIn
return $this;
}

public function hasKojoJob(): bool
public function getMetadata() : MetadataInterface
{
return isset($this->kojo_job);
if ($this->kojo_metadata === null) {
throw new \LogicException('Message kojo_metadata has not been set.');
}

return $this->kojo_metadata;
}

public function getKojoJob() : JobInterface
public function setMetadata(MetadataInterface $kojo_metadata) : MessageInterface
{
if ($this->kojo_job === null) {
throw new \LogicException('Message kojo_job has not been set.');
if ($this->kojo_metadata !== null) {
throw new \LogicException('Message kojo_metadata is already set.');
}

return $this->kojo_job;
$this->kojo_metadata = $kojo_metadata;

return $this;
}

public function setKojoJob(JobInterface $kojo_job) : MessageInterface
/**
* @param int $process_id
* @return MessageInterface
* @deprecated
*/
public function setProcessId(int $process_id) : MessageInterface
{
if ($this->kojo_job !== null) {
throw new \LogicException('Message kojo_job is already set.');
if ($this->process_id !== null) {
throw new \LogicException('Message process_id is already set.');
}

$this->kojo_job = $kojo_job;
$this->process_id = $process_id;

return $this;
}

public function hasKojoProcess() : bool
/**
* @param string $process_path
* @return MessageInterface
* @deprecated
*/
public function setProcessPath(string $process_path) : MessageInterface
{
return isset($this->kojo_process);
if ($this->process_path !== null) {
throw new \LogicException('Message process_path is already set.');
}

$this->process_path = $process_path;

return $this;
}

public function getKojoProcess() : SerializableProcessInterface
/**
* @param JobInterface $kojo_job
* @return MessageInterface
* @deprecated
*/
public function setKojoJob(JobInterface $kojo_job) : MessageInterface
{
if ($this->kojo_process === null) {
throw new \LogicException('Message kojo_process has not been set.');
if ($this->kojo_job !== null) {
throw new \LogicException('Message kojo_job is already set.');
}

return $this->kojo_process;
$this->kojo_job = $kojo_job;

return $this;
}

/**
* @param SerializableProcessInterface $kojo_process
* @return MessageInterface
* @deprecated
*/
public function setKojoProcess(SerializableProcessInterface $kojo_process) : MessageInterface
{
if ($this->kojo_process !== null) {
Expand Down
Loading

0 comments on commit df74740

Please sign in to comment.