From c6ab7786d893168d601f32555fbd34fafdfc6a3f Mon Sep 17 00:00:00 2001 From: Alex Renoki Date: Fri, 11 Sep 2020 13:41:02 +0300 Subject: [PATCH] improved statistics --- src/Statistics/Collectors/MemoryCollector.php | 2 +- src/Statistics/Collectors/RedisCollector.php | 32 +++++++++---------- src/Statistics/Statistic.php | 11 +++++++ 3 files changed, 27 insertions(+), 18 deletions(-) diff --git a/src/Statistics/Collectors/MemoryCollector.php b/src/Statistics/Collectors/MemoryCollector.php index b56db20..049c001 100644 --- a/src/Statistics/Collectors/MemoryCollector.php +++ b/src/Statistics/Collectors/MemoryCollector.php @@ -151,7 +151,7 @@ class MemoryCollector implements StatisticsCollector protected function findOrMake($appId): Statistic { if (! isset($this->statistics[$appId])) { - $this->statistics[$appId] = new Statistic($appId); + $this->statistics[$appId] = Statistic::new($appId); } return $this->statistics[$appId]; diff --git a/src/Statistics/Collectors/RedisCollector.php b/src/Statistics/Collectors/RedisCollector.php index bb75f27..7b845b5 100644 --- a/src/Statistics/Collectors/RedisCollector.php +++ b/src/Statistics/Collectors/RedisCollector.php @@ -177,8 +177,8 @@ class RedisCollector extends MemoryCollector return; } - $statistic = $this->listToStatisticInstance( - $appId, $list + $statistic = $this->arrayToStatisticInstance( + $appId, $this->redisListToArray($list) ); $this->createRecord($statistic, $appId); @@ -228,8 +228,8 @@ class RedisCollector extends MemoryCollector ->getPublishClient() ->hgetall($this->channelManager->getRedisKey($appId, null, ['stats'])) ->then(function ($list) use ($appId, &$appsWithStatistics) { - $appsWithStatistics[$appId] = $this->listToStatisticInstance( - $appId, $list + $appsWithStatistics[$appId] = $this->arrayToStatisticInstance( + $appId, $this->redisListToArray($list) ); }); } @@ -250,6 +250,8 @@ class RedisCollector extends MemoryCollector ->getPublishClient() ->hgetall($this->channelManager->getRedisKey($appId, null, ['stats'])) ->then(function ($list) use ($appId) { + return $this->arrayToStatisticInstance( + $appId, $this->redisListToArray($list) ); }); } @@ -366,13 +368,12 @@ class RedisCollector extends MemoryCollector * @param array $list * @return array */ - protected function listToKeyValue(array $list) + protected function redisListToArray(array $list) { // Redis lists come into a format where the keys are on even indexes // and the values are on odd indexes. This way, we know which // ones are keys and which ones are values and their get combined // later to form the key => value array. - [$keys, $values] = collect($list)->partition(function ($value, $key) { return $key % 2 === 0; }); @@ -381,21 +382,18 @@ class RedisCollector extends MemoryCollector } /** - * Transform a list coming from a Redis list - * to a Statistic instance. + * Transform a key-value pair to a Statistic instance. * * @param string|int $appId - * @param array $list + * @param array $stats * @return \BeyondCode\LaravelWebSockets\Statistics\Statistic */ - protected function listToStatisticInstance($appId, array $list) + protected function arrayToStatisticInstance($appId, array $stats) { - $list = $this->listToKeyValue($list); - - return (new Statistic($appId)) - ->setCurrentConnectionsCount($list['current_connections_count'] ?? 0) - ->setPeakConnectionsCount($list['peak_connections_count'] ?? 0) - ->setWebSocketMessagesCount($list['websocket_messages_count'] ?? 0) - ->setApiMessagesCount($list['api_messages_count'] ?? 0); + return Statistic::new($appId) + ->setCurrentConnectionsCount($stats['current_connections_count'] ?? 0) + ->setPeakConnectionsCount($stats['peak_connections_count'] ?? 0) + ->setWebSocketMessagesCount($stats['websocket_messages_count'] ?? 0) + ->setApiMessagesCount($stats['api_messages_count'] ?? 0); } } diff --git a/src/Statistics/Statistic.php b/src/Statistics/Statistic.php index 46d9b25..1a92488 100644 --- a/src/Statistics/Statistic.php +++ b/src/Statistics/Statistic.php @@ -52,6 +52,17 @@ class Statistic $this->appId = $appId; } + /** + * Create a new statistic instance. + * + * @param string|int $appId + * @return \BeyondCode\LaravelWebSockets\Statistics\Statistic + */ + public static function new($appId) + { + return new static($appId); + } + /** * Set the current connections count. *