Skip to content

Commit

Permalink
Merge pull request #81 from neighborhoods/feature/KOJO-137
Browse files Browse the repository at this point in the history
Feature/KOJO-137 | Add host information to Metadata, and memory info to process
  • Loading branch information
alexberryman committed Oct 1, 2019
2 parents df74740 + 2f2f056 commit 6eaf12c
Show file tree
Hide file tree
Showing 10 changed files with 192 additions and 1 deletion.
22 changes: 22 additions & 0 deletions src/Process/Pool/Logger/Message/Metadata.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@
namespace Neighborhoods\Kojo\Process\Pool\Logger\Message;

use Neighborhoods\Kojo\Data\JobInterface;
use Neighborhoods\Kojo\Process\Pool\Logger\Message\Metadata\HostInterface;

class Metadata implements MetadataInterface
{
/** @var JobInterface */
protected $job;
/** @var SerializableProcessInterface */
protected $process;
/** @var HostInterface */
protected $host;

public function getJob() : JobInterface
Expand Down Expand Up @@ -68,4 +70,24 @@ public function jsonSerialize()
return get_object_vars($this);
}

public function getHost() : HostInterface
{
if ($this->host === null) {
throw new \LogicException('Metadata host has not been set.');
}

return $this->host;
}

public function setHost(HostInterface $host) : MetadataInterface
{
if ($this->host !== null) {
throw new \LogicException('Metadata host is already set.');
}

$this->host = $host;

return $this;
}

}
3 changes: 3 additions & 0 deletions src/Process/Pool/Logger/Message/Metadata/Builder.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ class Builder implements BuilderInterface
{
use Factory\AwareTrait;
use SerializableProcess\FromProcessModel\Builder\Factory\AwareTrait;
use Host\AwareTrait;

/** @var ProcessInterface */
protected $process;
Expand All @@ -35,6 +36,8 @@ public function build() : MetadataInterface
$metadata->setJob($this->getJob());
}

$metadata->setHost($this->getProcessPoolLoggerMessageMetadataHost());

return $metadata;
}

Expand Down
1 change: 1 addition & 0 deletions src/Process/Pool/Logger/Message/Metadata/Builder.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ services:
calls:
- [setProcessPoolLoggerMessageMetadataFactory, ['@neighborhoods.kojo.process.pool.logger.message.metadata.factory']]
- [setProcessPoolLoggerMessageSerializableProcessFromProcessModelBuilderFactory, ['@neighborhoods.kojo.process.pool.logger.message.serializable_process.from_process_model.builder.factory']]
- [setProcessPoolLoggerMessageMetadataHost, ['@neighborhoods.kojo.neighborhoods.kojo.src.process.pool.logger.message.metadata.host']]
34 changes: 34 additions & 0 deletions src/Process/Pool/Logger/Message/Metadata/Host.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php
declare(strict_types=1);

namespace Neighborhoods\Kojo\Process\Pool\Logger\Message\Metadata;

class Host implements HostInterface
{
const KEY_HOST_NAME = 'host_name';
const KEY_LOAD_AVERAGE = 'load_average';

/** @var string */
protected $host_name;
/** @var float */
protected $load_average;

public function getHostName() : string
{
return gethostname();
}

public function getLoadAverage() : float
{
return (float)current(sys_getloadavg());
}

public function jsonSerialize()
{
$data = get_object_vars($this);
$data[self::KEY_HOST_NAME] = $this->getHostName();
$data[self::KEY_LOAD_AVERAGE] = $this->getLoadAverage();

return $data;
}
}
4 changes: 4 additions & 0 deletions src/Process/Pool/Logger/Message/Metadata/Host.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
services:
neighborhoods.kojo.neighborhoods.kojo.src.process.pool.logger.message.metadata.host:
class: Neighborhoods\Kojo\Process\Pool\Logger\Message\Metadata\Host
shared: true
54 changes: 54 additions & 0 deletions src/Process/Pool/Logger/Message/Metadata/Host/AwareTrait.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<?php
declare(strict_types=1);

namespace Neighborhoods\Kojo\Process\Pool\Logger\Message\Metadata\Host;

use Neighborhoods\Kojo\Process\Pool\Logger\Message\Metadata\HostInterface;

/** @codeCoverageIgnore */
trait AwareTrait
{
protected $NeighborhoodsKojoProcessPoolLoggerMessageMetadataHost;

public function setProcessPoolLoggerMessageMetadataHost(
HostInterface $ProcessPoolLoggerMessageMetadataHost
) : self
{
if ($this->hasProcessPoolLoggerMessageMetadataHost()) {
throw new \LogicException(
'NeighborhoodsKojoProcessPoolLoggerMessageMetadataHost is already set.'
);
}
$this->NeighborhoodsKojoProcessPoolLoggerMessageMetadataHost = $ProcessPoolLoggerMessageMetadataHost;

return $this;
}

protected function getProcessPoolLoggerMessageMetadataHost() : HostInterface
{
if (!$this->hasProcessPoolLoggerMessageMetadataHost()) {
throw new \LogicException(
'NeighborhoodsKojoProcessPoolLoggerMessageMetadataHost is not set.'
);
}

return $this->NeighborhoodsKojoProcessPoolLoggerMessageMetadataHost;
}

protected function hasProcessPoolLoggerMessageMetadataHost() : bool
{
return isset($this->NeighborhoodsKojoProcessPoolLoggerMessageMetadataHost);
}

protected function unsetProcessPoolLoggerMessageMetadataHost() : self
{
if (!$this->hasProcessPoolLoggerMessageMetadataHost()) {
throw new \LogicException(
'NeighborhoodsKojoProcessPoolLoggerMessageMetadataHost is not set.'
);
}
unset($this->NeighborhoodsKojoProcessPoolLoggerMessageMetadataHost);

return $this;
}
}
11 changes: 11 additions & 0 deletions src/Process/Pool/Logger/Message/Metadata/HostInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php
declare(strict_types=1);

namespace Neighborhoods\Kojo\Process\Pool\Logger\Message\Metadata;

interface HostInterface extends \JsonSerializable
{
public function getHostName() : string;

public function getLoadAverage() : float;
}
5 changes: 5 additions & 0 deletions src/Process/Pool/Logger/Message/MetadataInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
namespace Neighborhoods\Kojo\Process\Pool\Logger\Message;

use Neighborhoods\Kojo\Data\JobInterface;
use Neighborhoods\Kojo\Process\Pool\Logger\Message\Metadata\HostInterface;

interface MetadataInterface extends \JsonSerializable
{
Expand All @@ -19,4 +20,8 @@ public function setProcess(SerializableProcessInterface $process) : MetadataInte
public function hasJob() : bool;

public function hasProcess() : bool;

public function setHost(HostInterface $host) : MetadataInterface;

public function getHost() : HostInterface;
}
53 changes: 52 additions & 1 deletion src/Process/Pool/Logger/Message/SerializableProcess.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@

class SerializableProcess implements SerializableProcessInterface
{
const KEY_MEMORY_USAGE_BYTES = 'memory_usage_bytes';
const KEY_MEMORY_PEAK_USAGE_BYTES = 'memory_peak_usage_bytes';
const KEY_MEMORY_LIMIT_BYTES = 'memory_limit_bytes';

/** @var int */
protected $process_id;
/** @var int */
Expand All @@ -15,6 +19,12 @@ class SerializableProcess implements SerializableProcessInterface
protected $uuid;
/** @var string */
protected $type_code;
/** @var int */
protected $memory_usage_bytes;
/** @var int */
protected $memory_peak_usage_bytes;
/** @var int */
protected $memory_limit_bytes;

public function getProcessId() : int
{
Expand Down Expand Up @@ -116,8 +126,49 @@ public function setTypeCode(string $type_code) : SerializableProcessInterface
return $this;
}

public function getMemoryUsageBytes() : int
{
return memory_get_usage();
}

public function getMemoryPeakUsageBytes() : int
{
return memory_get_peak_usage();
}

public function getMemoryLimitBytes() : int
{
return $this->dataUnitToBytes(ini_get('memory_limit'));
}

public function jsonSerialize()
{
return get_object_vars($this);
$data = get_object_vars($this);
$data[self::KEY_MEMORY_USAGE_BYTES]= $this->getMemoryUsageBytes();
$data[self::KEY_MEMORY_PEAK_USAGE_BYTES]= $this->getMemoryPeakUsageBytes();
$data[self::KEY_MEMORY_LIMIT_BYTES]= $this->getMemoryLimitBytes();
return $data;
}

/* converts a number with byte unit (B / K / M / G) into an integer */
protected function dataUnitToBytes(string $memoryString) : int
{
$memoryString = trim($memoryString);
$lastCharacter = strtolower($memoryString[-1]);
switch ($lastCharacter) {
case 'g':
$bytes = (int)$memoryString * 1024 * 1024 * 1024;
break;
case 'm':
$bytes = (int)$memoryString * 1024 * 1024;
break;
case 'k':
$bytes = (int)$memoryString * 1024;
break;
default:
$bytes = (int)$memoryString;
}

return $bytes;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,10 @@ public function setProcessId(int $process_id) : SerializableProcessInterface;
public function getPath() : string;

public function setPath(string $path) : SerializableProcessInterface;

public function getMemoryPeakUsageBytes() : int;

public function getMemoryUsageBytes() : int;

public function getMemoryLimitBytes() : int;
}

0 comments on commit 6eaf12c

Please sign in to comment.