diff --git a/src/Contracts/Storage.php b/src/Contracts/Storage.php index 7e8cbf09..980a0c70 100644 --- a/src/Contracts/Storage.php +++ b/src/Contracts/Storage.php @@ -30,18 +30,11 @@ public function purge(?array $types = null): void; * Retrieve values for the given type. * * @param list $keys - * @return \Illuminate\Support\Collection< - * int, - * array< - * string, - * array{ - * timestamp: int, - * type: string, - * key: string, - * value: string - * } - * > - * > + * @return \Illuminate\Support\Collection */ public function values(string $type, ?array $keys = null): Collection; diff --git a/src/Livewire/Cache.php b/src/Livewire/Cache.php index 0509d89d..1960ede7 100644 --- a/src/Livewire/Cache.php +++ b/src/Livewire/Cache.php @@ -5,7 +5,6 @@ use Illuminate\Contracts\Support\Renderable; use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\View; -use Laravel\Pulse\Facades\Pulse; use Laravel\Pulse\Recorders\CacheInteractions as CacheInteractionsRecorder; use Livewire\Attributes\Lazy; @@ -24,11 +23,7 @@ public function render(): Renderable { [$cacheInteractions, $allTime, $allRunAt] = $this->remember( fn () => with( - Pulse::aggregateTotal( - ['cache_hit', 'cache_miss'], - 'count', - $this->periodAsInterval(), - ), + $this->aggregateTotal(['cache_hit', 'cache_miss'], 'count'), fn ($results) => (object) [ 'hits' => $results['cache_hit'] ?? 0, 'misses' => $results['cache_miss'] ?? 0, @@ -38,7 +33,7 @@ public function render(): Renderable ); [$cacheKeyInteractions, $keyTime, $keyRunAt] = $this->remember( - fn () => Pulse::aggregateTypes(['cache_hit', 'cache_miss'], 'count', $this->periodAsInterval()) + fn () => $this->aggregateTypes(['cache_hit', 'cache_miss'], 'count') ->map(function ($row) { return (object) [ 'key' => $row->key, diff --git a/src/Livewire/Card.php b/src/Livewire/Card.php index 3b3036a4..0d719b39 100644 --- a/src/Livewire/Card.php +++ b/src/Livewire/Card.php @@ -3,6 +3,7 @@ namespace Laravel\Pulse\Livewire; use Illuminate\Contracts\Support\Renderable; +use Illuminate\Support\Collection; use Illuminate\Support\Facades\View; use Laravel\Pulse\Facades\Pulse; use Livewire\Component; @@ -10,6 +11,8 @@ abstract class Card extends Component { + use Concerns\HasPeriod, Concerns\RemembersQueries; + /** * The number of columns to span. * @@ -69,4 +72,78 @@ protected function css() { return null; } + + /** + * Retrieve values for the given type. + * + * @param list $keys + * @return \Illuminate\Support\Collection + */ + protected function values(string $type, ?array $keys = null): Collection + { + return Pulse::values($type, $keys); + } + + /** + * Retrieve aggregate values for plotting on a graph. + * + * @param list $types + * @param 'count'|'min'|'max'|'sum'|'avg' $aggregate + * @return \Illuminate\Support\Collection>> + */ + protected function graph(array $types, string $aggregate): Collection + { + return Pulse::graph($types, $aggregate, $this->periodAsInterval()); + } + + /** + * Retrieve aggregate values for the given type. + * + * @param 'count'|'min'|'max'|'sum'|'avg'|list<'count'|'min'|'max'|'sum'|'avg'> $aggregates + * @return \Illuminate\Support\Collection + */ + protected function aggregate( + string $type, + string|array $aggregates, + ?string $orderBy = null, + string $direction = 'desc', + int $limit = 101, + ): Collection { + return Pulse::aggregate($type, $aggregates, $this->periodAsInterval(), $orderBy, $direction, $limit); + } + + /** + * Retrieve aggregate values for the given types. + * + * @param string|list $types + * @param 'count'|'min'|'max'|'sum'|'avg' $aggregate + * @return \Illuminate\Support\Collection + */ + protected function aggregateTypes( + string|array $types, + string $aggregate, + ?string $orderBy = null, + string $direction = 'desc', + int $limit = 101, + ): Collection { + return Pulse::aggregateTypes($types, $aggregate, $this->periodAsInterval(), $orderBy, $direction, $limit); + } + + /** + * Retrieve an aggregate total for the given types. + * + * @param string|list $types + * @param 'count'|'min'|'max'|'sum'|'avg' $aggregate + * @return \Illuminate\Support\Collection + */ + protected function aggregateTotal( + array|string $types, + string $aggregate, + ): Collection { + return Pulse::aggregateTotal($types, $aggregate, $this->periodAsInterval()); + } } diff --git a/src/Livewire/Exceptions.php b/src/Livewire/Exceptions.php index 919887ee..feb42342 100644 --- a/src/Livewire/Exceptions.php +++ b/src/Livewire/Exceptions.php @@ -6,7 +6,6 @@ use Illuminate\Contracts\Support\Renderable; use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\View; -use Laravel\Pulse\Facades\Pulse; use Laravel\Pulse\Recorders\Exceptions as ExceptionsRecorder; use Livewire\Attributes\Lazy; use Livewire\Attributes\Url; @@ -17,8 +16,6 @@ #[Lazy] class Exceptions extends Card { - use Concerns\HasPeriod, Concerns\RemembersQueries; - /** * Ordering. * @@ -33,10 +30,9 @@ class Exceptions extends Card public function render(): Renderable { [$exceptions, $time, $runAt] = $this->remember( - fn () => Pulse::aggregate( + fn () => $this->aggregate( 'exception', ['max', 'count'], - $this->periodAsInterval(), match ($this->orderBy) { 'latest' => 'max', default => 'count' diff --git a/src/Livewire/Queues.php b/src/Livewire/Queues.php index 9a2988b5..2a113316 100644 --- a/src/Livewire/Queues.php +++ b/src/Livewire/Queues.php @@ -6,7 +6,6 @@ use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\View; use Illuminate\Support\Str; -use Laravel\Pulse\Facades\Pulse; use Laravel\Pulse\Recorders\Queues as QueuesRecorder; use Livewire\Attributes\Lazy; use Livewire\Livewire; @@ -17,17 +16,14 @@ #[Lazy] class Queues extends Card { - use Concerns\HasPeriod, Concerns\RemembersQueries; - /** * Render the component. */ public function render(): Renderable { - [$queues, $time, $runAt] = $this->remember(fn () => Pulse::graph( + [$queues, $time, $runAt] = $this->remember(fn () => $this->graph( ['queued', 'processing', 'processed', 'released', 'failed'], 'count', - $this->periodAsInterval(), )); if (Livewire::isLivewireRequest()) { diff --git a/src/Livewire/Servers.php b/src/Livewire/Servers.php index cba221ba..e52db790 100644 --- a/src/Livewire/Servers.php +++ b/src/Livewire/Servers.php @@ -5,7 +5,6 @@ use Carbon\CarbonImmutable; use Illuminate\Contracts\Support\Renderable; use Illuminate\Support\Facades\View; -use Laravel\Pulse\Facades\Pulse; use Livewire\Attributes\Lazy; use Livewire\Livewire; @@ -15,17 +14,15 @@ #[Lazy] class Servers extends Card { - use Concerns\HasPeriod, Concerns\RemembersQueries; - /** * Render the component. */ public function render(): Renderable { [$servers, $time, $runAt] = $this->remember(function () { - $graphs = Pulse::graph(['cpu', 'memory'], 'avg', $this->periodAsInterval()); + $graphs = $this->graph(['cpu', 'memory'], 'avg'); - return Pulse::values('system') + return $this->values('system') ->map(function ($system, $slug) use ($graphs) { $values = json_decode($system->value, flags: JSON_THROW_ON_ERROR); diff --git a/src/Livewire/SlowJobs.php b/src/Livewire/SlowJobs.php index 01614b25..492ba399 100644 --- a/src/Livewire/SlowJobs.php +++ b/src/Livewire/SlowJobs.php @@ -5,7 +5,6 @@ use Illuminate\Contracts\Support\Renderable; use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\View; -use Laravel\Pulse\Facades\Pulse; use Laravel\Pulse\Recorders\SlowJobs as SlowJobsRecorder; use Livewire\Attributes\Lazy; use Livewire\Attributes\Url; @@ -16,8 +15,6 @@ #[Lazy] class SlowJobs extends Card { - use Concerns\HasPeriod, Concerns\RemembersQueries; - /** * Ordering. * @@ -32,10 +29,9 @@ class SlowJobs extends Card public function render(): Renderable { [$slowJobs, $time, $runAt] = $this->remember( - fn () => Pulse::aggregate( + fn () => $this->aggregate( 'slow_job', ['max', 'count'], - $this->periodAsInterval(), match ($this->orderBy) { 'count' => 'count', default => 'max', diff --git a/src/Livewire/SlowOutgoingRequests.php b/src/Livewire/SlowOutgoingRequests.php index dfcec094..da1cfbfc 100644 --- a/src/Livewire/SlowOutgoingRequests.php +++ b/src/Livewire/SlowOutgoingRequests.php @@ -5,7 +5,6 @@ use Illuminate\Contracts\Support\Renderable; use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\View; -use Laravel\Pulse\Facades\Pulse; use Laravel\Pulse\Recorders\SlowOutgoingRequests as SlowOutgoingRequestsRecorder; use Livewire\Attributes\Lazy; use Livewire\Attributes\Url; @@ -16,8 +15,6 @@ #[Lazy] class SlowOutgoingRequests extends Card { - use Concerns\HasPeriod, Concerns\RemembersQueries; - /** * Ordering. * @@ -32,10 +29,9 @@ class SlowOutgoingRequests extends Card public function render(): Renderable { [$slowOutgoingRequests, $time, $runAt] = $this->remember( - fn () => Pulse::aggregate( + fn () => $this->aggregate( 'slow_outgoing_request', ['max', 'count'], - $this->periodAsInterval(), match ($this->orderBy) { 'count' => 'count', default => 'max', diff --git a/src/Livewire/SlowQueries.php b/src/Livewire/SlowQueries.php index 78df9a1b..51029551 100644 --- a/src/Livewire/SlowQueries.php +++ b/src/Livewire/SlowQueries.php @@ -5,7 +5,6 @@ use Illuminate\Contracts\Support\Renderable; use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\View; -use Laravel\Pulse\Facades\Pulse; use Laravel\Pulse\Recorders\SlowQueries as SlowQueriesRecorder; use Livewire\Attributes\Lazy; use Livewire\Attributes\Url; @@ -16,8 +15,6 @@ #[Lazy] class SlowQueries extends Card { - use Concerns\HasPeriod, Concerns\RemembersQueries; - /** * Ordering. * @@ -32,10 +29,9 @@ class SlowQueries extends Card public function render(): Renderable { [$slowQueries, $time, $runAt] = $this->remember( - fn () => Pulse::aggregate( + fn () => $this->aggregate( 'slow_query', ['max', 'count'], - $this->periodAsInterval(), match ($this->orderBy) { 'count' => 'count', default => 'max', diff --git a/src/Livewire/SlowRequests.php b/src/Livewire/SlowRequests.php index 2a1abaae..159e8813 100644 --- a/src/Livewire/SlowRequests.php +++ b/src/Livewire/SlowRequests.php @@ -5,7 +5,6 @@ use Illuminate\Contracts\Support\Renderable; use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\View; -use Laravel\Pulse\Facades\Pulse; use Laravel\Pulse\Recorders\SlowRequests as SlowRequestsRecorder; use Livewire\Attributes\Lazy; use Livewire\Attributes\Url; @@ -16,8 +15,6 @@ #[Lazy] class SlowRequests extends Card { - use Concerns\HasPeriod, Concerns\RemembersQueries; - /** * Ordering. * @@ -32,10 +29,9 @@ class SlowRequests extends Card public function render(): Renderable { [$slowRequests, $time, $runAt] = $this->remember( - fn () => Pulse::aggregate( + fn () => $this->aggregate( 'slow_request', ['max', 'count'], - $this->periodAsInterval(), match ($this->orderBy) { 'count' => 'count', default => 'max', diff --git a/src/Livewire/Usage.php b/src/Livewire/Usage.php index 5e30065e..9a99a4ad 100644 --- a/src/Livewire/Usage.php +++ b/src/Livewire/Usage.php @@ -18,8 +18,6 @@ #[Lazy] class Usage extends Card { - use Concerns\HasPeriod, Concerns\RemembersQueries; - /** * The type of usage to show. * @@ -44,14 +42,13 @@ public function render(): Renderable [$userRequestCounts, $time, $runAt] = $this->remember( function () use ($type) { - $counts = Pulse::aggregate( + $counts = $this->aggregate( match ($type) { 'requests' => 'user_request', 'slow_requests' => 'slow_user_request', 'jobs' => 'user_job', }, 'count', - $this->periodAsInterval(), limit: 10, ); diff --git a/src/Storage/DatabaseStorage.php b/src/Storage/DatabaseStorage.php index 0ae497aa..15942bea 100644 --- a/src/Storage/DatabaseStorage.php +++ b/src/Storage/DatabaseStorage.php @@ -394,23 +394,17 @@ protected function periods(): array * Retrieve values for the given type. * * @param list $keys - * @return \Illuminate\Support\Collection< - * int, - * array< - * string, - * array{ - * timestamp: int, - * type: string, - * key: string, - * value: string - * } - * > - * > + * @return \Illuminate\Support\Collection */ public function values(string $type, ?array $keys = null): Collection { return $this->connection() ->table('pulse_values') + ->select('timestamp', 'key', 'value') ->where('type', $type) ->when($keys, fn ($query) => $query->whereIn('key', $keys)) ->get()