diff --git a/src/Contracts/StatisticsCollector.php b/src/Contracts/StatisticsCollector.php index a46e757..316a83b 100644 --- a/src/Contracts/StatisticsCollector.php +++ b/src/Contracts/StatisticsCollector.php @@ -66,4 +66,13 @@ interface StatisticsCollector * @return PromiseInterface[\BeyondCode\LaravelWebSockets\Statistics\Statistic|null] */ public function getAppStatistics($appId): PromiseInterface; + + /** + * Remove all app traces from the database if no connections have been set + * in the meanwhile since last save. + * + * @param string|int $appId + * @return void + */ + public function resetAppTraces($appId); } diff --git a/src/Statistics/Collectors/MemoryCollector.php b/src/Statistics/Collectors/MemoryCollector.php index 2394e0a..80070dc 100644 --- a/src/Statistics/Collectors/MemoryCollector.php +++ b/src/Statistics/Collectors/MemoryCollector.php @@ -92,6 +92,12 @@ class MemoryCollector implements StatisticsCollector continue; } + if ($statistic->shouldHaveTracesRemoved()) { + $this->resetAppTraces($appId); + + continue; + } + $this->createRecord($statistic, $appId); $this->channelManager->getGlobalConnectionsCount($appId)->then(function ($connections) use ($statistic) { @@ -136,6 +142,18 @@ class MemoryCollector implements StatisticsCollector ); } + /** + * Remove all app traces from the database if no connections have been set + * in the meanwhile since last save. + * + * @param string|int $appId + * @return void + */ + public function resetAppTraces($appId) + { + unset($this->statistics[$appId]); + } + /** * Find or create a defined statistic for an app. * diff --git a/src/Statistics/Collectors/RedisCollector.php b/src/Statistics/Collectors/RedisCollector.php index a7bd00f..e487a94 100644 --- a/src/Statistics/Collectors/RedisCollector.php +++ b/src/Statistics/Collectors/RedisCollector.php @@ -161,6 +161,10 @@ class RedisCollector extends MemoryCollector $appId, Helpers::redisListToArray($list) ); + if ($statistic->shouldHaveTracesRemoved()) { + return $this->resetAppTraces($appId); + } + $this->createRecord($statistic, $appId); $this->channelManager @@ -272,6 +276,8 @@ class RedisCollector extends MemoryCollector */ public function resetAppTraces($appId) { + parent::resetAppTraces($appId); + $this->channelManager->getPublishClient()->hdel( $this->channelManager->getRedisKey($appId, null, ['stats']), 'current_connections_count' diff --git a/src/Statistics/Statistic.php b/src/Statistics/Statistic.php index 5e1f05f..b31d547 100644 --- a/src/Statistics/Statistic.php +++ b/src/Statistics/Statistic.php @@ -183,6 +183,18 @@ class Statistic $this->apiMessagesCount = 0; } + /** + * Check if the current statistic entry is empty. This means + * that the statistic entry can be easily deleted if no activity + * occured for a while. + * + * @return bool + */ + public function shouldHaveTracesRemoved(): bool + { + return $this->currentConnectionsCount === 0 && $this->peakConnectionsCount === 0; + } + /** * Transform the statistic to array. *