From c08a4d85bc086ee6289206c5fc0571f4d0cf2e6e Mon Sep 17 00:00:00 2001 From: Venelin Kochev Date: Thu, 14 May 2026 15:49:55 +0300 Subject: [PATCH] Add ICMP check type to monitors Introduce an ICMP (ping) check type and wire it through the app: add a CheckType enum, a string check_type column (default 'http') via migration, and cast Monitor.check_type to the enum. Update Livewire Create/Edit components and views to expose a Check Type radio, adjust URL/Host input, add validation (including a regex for host/IP without scheme/path) and custom error message, and persist check_type. Ensure probe dispatching prefixes icmp:// for ICMP checks in CheckDispatcher. Add factory default and icmp state helper, update index/show badges, add feature and unit tests for ICMP behavior, and include a README screenshot image. --- README.md | 5 ++ app/Enums/CheckType.php | 33 +++++++ app/Livewire/Monitors/Create.php | 24 ++++- app/Livewire/Monitors/Edit.php | 25 +++++- app/Models/Monitor.php | 3 + .../MonitoringEngine/CheckDispatcher.php | 9 +- database/factories/MonitorFactory.php | 12 +++ ...14700_add_check_type_to_monitors_table.php | 28 ++++++ public/img/dashboard.png | Bin 0 -> 105343 bytes .../views/livewire/monitors/create.blade.php | 33 ++++++- .../views/livewire/monitors/edit.blade.php | 33 ++++++- .../views/livewire/monitors/index.blade.php | 3 + .../views/livewire/monitors/show.blade.php | 3 + .../Feature/Monitors/MonitorCrudTest.php | 83 ++++++++++++++++++ tests/Unit/Services/CheckDispatcherTest.php | 42 +++++++++ 15 files changed, 327 insertions(+), 9 deletions(-) create mode 100644 app/Enums/CheckType.php create mode 100644 database/migrations/2026_05_14_114700_add_check_type_to_monitors_table.php create mode 100644 public/img/dashboard.png create mode 100644 tests/Unit/Services/CheckDispatcherTest.php diff --git a/README.md b/README.md index 47e8c8b..17d5dd5 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,11 @@ EasyMonitor is a full-stack monitoring platform for your websites and APIs. Add a URL, pick an interval, and get alerted when something breaks. Group monitors into projects, share live status with your users via public status pages, and run probes in multiple regions to eliminate false positives. +## Screenshot + + +![EasyMonitor dashboard](public/img/dashboard.png) + --- ## Features diff --git a/app/Enums/CheckType.php b/app/Enums/CheckType.php new file mode 100644 index 0000000..d3baf75 --- /dev/null +++ b/app/Enums/CheckType.php @@ -0,0 +1,33 @@ + 'HTTP / HTTPS', + self::Icmp => 'Ping (ICMP)', + }; + } + + /** + * Short label for compact UI badges. + */ + public function shortLabel(): string + { + return match ($this) { + self::Http => 'HTTP', + self::Icmp => 'ICMP', + }; + } +} diff --git a/app/Livewire/Monitors/Create.php b/app/Livewire/Monitors/Create.php index 116a201..9874623 100644 --- a/app/Livewire/Monitors/Create.php +++ b/app/Livewire/Monitors/Create.php @@ -2,10 +2,12 @@ namespace App\Livewire\Monitors; +use App\Enums\CheckType; use App\Models\Monitor; use App\Models\Project; use App\Models\Team; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; +use Illuminate\Validation\Rule; use Livewire\Attributes\Url; use Livewire\Component; @@ -20,6 +22,8 @@ class Create extends Component public string $name = ''; + public string $checkType = 'http'; + public string $url = ''; public int $checkInterval = 60; @@ -54,11 +58,16 @@ public function mount(): void */ public function rules(): array { + $urlRule = $this->checkType === CheckType::Icmp->value + ? ['required', 'string', 'max:255', 'regex:/^(?!.*:\/\/)[a-zA-Z0-9](?:[a-zA-Z0-9.\-:]*[a-zA-Z0-9])?$/'] + : ['required', 'url', 'max:255']; + return [ 'teamId' => ['nullable', 'exists:teams,id'], 'projectId' => ['nullable', 'exists:projects,id'], 'name' => ['required', 'string', 'max:255'], - 'url' => ['required', 'url', 'max:255'], + 'checkType' => ['required', Rule::in([CheckType::Http->value, CheckType::Icmp->value])], + 'url' => $urlRule, 'checkInterval' => ['required', 'integer', 'min:30', 'max:3600'], 'isActive' => ['boolean'], 'failureThreshold' => ['required', 'integer', 'min:1', 'max:10'], @@ -67,6 +76,18 @@ public function rules(): array ]; } + /** + * Custom validation messages + * + * @return array + */ + public function messages(): array + { + return [ + 'url.regex' => __('Enter a valid hostname or IP address (no scheme, no path).'), + ]; + } + /** * Save the new monitor */ @@ -99,6 +120,7 @@ public function save(): void 'team_id' => $validated['teamId'], 'project_id' => $validated['projectId'], 'name' => $validated['name'], + 'check_type' => $validated['checkType'], 'url' => $validated['url'], 'check_interval' => $validated['checkInterval'], 'is_active' => $validated['isActive'], diff --git a/app/Livewire/Monitors/Edit.php b/app/Livewire/Monitors/Edit.php index 957fc22..8e73493 100644 --- a/app/Livewire/Monitors/Edit.php +++ b/app/Livewire/Monitors/Edit.php @@ -2,9 +2,11 @@ namespace App\Livewire\Monitors; +use App\Enums\CheckType; use App\Models\Monitor; use App\Models\Project; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; +use Illuminate\Validation\Rule; use Livewire\Component; class Edit extends Component @@ -17,6 +19,8 @@ class Edit extends Component public string $name = ''; + public string $checkType = 'http'; + public string $url = ''; public int $checkInterval = 60; @@ -40,6 +44,7 @@ public function mount(Monitor $monitor): void $this->monitor = $monitor; $this->projectId = $monitor->project_id; $this->name = $monitor->name; + $this->checkType = $monitor->check_type->value; $this->url = $monitor->url; $this->checkInterval = $monitor->check_interval; $this->isActive = $monitor->is_active; @@ -56,10 +61,15 @@ public function mount(Monitor $monitor): void */ public function rules(): array { + $urlRule = $this->checkType === CheckType::Icmp->value + ? ['required', 'string', 'max:255', 'regex:/^(?!.*:\/\/)[a-zA-Z0-9](?:[a-zA-Z0-9.\-:]*[a-zA-Z0-9])?$/'] + : ['required', 'url', 'max:255']; + return [ 'projectId' => ['nullable', 'exists:projects,id'], 'name' => ['required', 'string', 'max:255'], - 'url' => ['required', 'url', 'max:255'], + 'checkType' => ['required', Rule::in([CheckType::Http->value, CheckType::Icmp->value])], + 'url' => $urlRule, 'checkInterval' => ['required', 'integer', 'min:30', 'max:3600'], 'isActive' => ['boolean'], 'failureThreshold' => ['required', 'integer', 'min:1', 'max:10'], @@ -68,6 +78,18 @@ public function rules(): array ]; } + /** + * Custom validation messages + * + * @return array + */ + public function messages(): array + { + return [ + 'url.regex' => __('Enter a valid hostname or IP address (no scheme, no path).'), + ]; + } + /** * Save the updated monitor */ @@ -89,6 +111,7 @@ public function save(): void 'project_id' => $validated['projectId'], 'team_id' => $validated['projectId'] ? null : $this->monitor->team_id, 'name' => $validated['name'], + 'check_type' => $validated['checkType'], 'url' => $validated['url'], 'check_interval' => $validated['checkInterval'], 'is_active' => $validated['isActive'], diff --git a/app/Models/Monitor.php b/app/Models/Monitor.php index 9c3151b..8d267cf 100644 --- a/app/Models/Monitor.php +++ b/app/Models/Monitor.php @@ -2,6 +2,7 @@ namespace App\Models; +use App\Enums\CheckType; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -25,6 +26,7 @@ class Monitor extends Model 'project_id', 'name', 'url', + 'check_type', 'is_active', 'status', 'check_interval', @@ -47,6 +49,7 @@ protected function casts(): array 'is_active' => 'boolean', 'last_checked_at' => 'datetime', 'next_run_at' => 'datetime', + 'check_type' => CheckType::class, ]; } diff --git a/app/Services/MonitoringEngine/CheckDispatcher.php b/app/Services/MonitoringEngine/CheckDispatcher.php index abe91b8..42e433c 100644 --- a/app/Services/MonitoringEngine/CheckDispatcher.php +++ b/app/Services/MonitoringEngine/CheckDispatcher.php @@ -4,6 +4,7 @@ namespace App\Services\MonitoringEngine; +use App\Enums\CheckType; use App\Models\Monitor; use Illuminate\Support\Facades\Redis; @@ -71,13 +72,19 @@ public function dispatchCheck(Monitor $monitor): string // so ResultConsumer can apply quorum across probes. $roundId = (string) \Illuminate\Support\Str::uuid(); + // For ICMP monitors, the URL column stores a bare host. The probe node + // discriminates check types by URL scheme, so we prefix icmp://. + $url = $monitor->check_type === CheckType::Icmp + ? 'icmp://'.$monitor->url + : $monitor->url; + // XADD checks * check_id=42 url=... timeout=... round_id=... $entryId = Redis::connection('streams')->xadd( self::STREAM_CHECKS, '*', // Auto-generate ID [ 'check_id' => (string) $monitor->id, - 'url' => $monitor->url, + 'url' => $url, 'timeout' => (string) ($monitor->check_interval * 1000), // milliseconds 'round_id' => $roundId, ] diff --git a/database/factories/MonitorFactory.php b/database/factories/MonitorFactory.php index 1754bf4..9430cf2 100644 --- a/database/factories/MonitorFactory.php +++ b/database/factories/MonitorFactory.php @@ -21,6 +21,7 @@ public function definition(): array 'team_id' => null, 'name' => fake()->domainName(), 'url' => fake()->url(), + 'check_type' => \App\Enums\CheckType::Http, 'is_active' => true, 'status' => 'pending', 'check_interval' => 60, @@ -75,4 +76,15 @@ public function inactive(): static 'is_active' => false, ]); } + + /** + * Indicate that the monitor is an ICMP/ping check + */ + public function icmp(): static + { + return $this->state(fn (array $attributes) => [ + 'check_type' => \App\Enums\CheckType::Icmp, + 'url' => fake()->domainName(), + ]); + } } diff --git a/database/migrations/2026_05_14_114700_add_check_type_to_monitors_table.php b/database/migrations/2026_05_14_114700_add_check_type_to_monitors_table.php new file mode 100644 index 0000000..fed0b7b --- /dev/null +++ b/database/migrations/2026_05_14_114700_add_check_type_to_monitors_table.php @@ -0,0 +1,28 @@ +string('check_type')->default('http')->after('url'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('monitors', function (Blueprint $table) { + $table->dropColumn('check_type'); + }); + } +}; diff --git a/public/img/dashboard.png b/public/img/dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..4e29874117f1543c2c54e1fb23067ce6bf224efd GIT binary patch literal 105343 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 W_ub7*_uU5mXsGF4tGIIe*Z%|E`gOGc literal 0 HcmV?d00001 diff --git a/resources/views/livewire/monitors/create.blade.php b/resources/views/livewire/monitors/create.blade.php index f8c6104..7701965 100644 --- a/resources/views/livewire/monitors/create.blade.php +++ b/resources/views/livewire/monitors/create.blade.php @@ -19,6 +19,28 @@

{{ __('What to monitor') }}

+
+ +
+ + +
+
+
+
+ + {{ $checkType === 'icmp' ? __('Hostname or IP address — no scheme or path.') : __('Full URL including https://') }} + +
@error('url')
{{ $message }} diff --git a/resources/views/livewire/monitors/edit.blade.php b/resources/views/livewire/monitors/edit.blade.php index 8d9072c..e0fbb59 100644 --- a/resources/views/livewire/monitors/edit.blade.php +++ b/resources/views/livewire/monitors/edit.blade.php @@ -19,6 +19,28 @@

{{ __('What to monitor') }}

+
+ +
+ + +
+
+
+
+ + {{ $checkType === 'icmp' ? __('Hostname or IP address — no scheme or path.') : __('Full URL including https://') }} + +
@error('url')
{{ $message }} diff --git a/resources/views/livewire/monitors/index.blade.php b/resources/views/livewire/monitors/index.blade.php index f1f07a4..3ec68d5 100644 --- a/resources/views/livewire/monitors/index.blade.php +++ b/resources/views/livewire/monitors/index.blade.php @@ -75,6 +75,9 @@
{{ $monitor->name }} + @if ($monitor->check_type === \App\Enums\CheckType::Icmp) + {{ __('ICMP') }} + @endif @if ($monitor->project) @if ($monitor->project->color) diff --git a/resources/views/livewire/monitors/show.blade.php b/resources/views/livewire/monitors/show.blade.php index 98193f9..01ba620 100644 --- a/resources/views/livewire/monitors/show.blade.php +++ b/resources/views/livewire/monitors/show.blade.php @@ -25,6 +25,9 @@ {{ __('Pending') }}
@endif + @if ($monitor->check_type === \App\Enums\CheckType::Icmp) + {{ __('ICMP') }} + @endif @if ($monitor->project)
@if ($monitor->project->color) diff --git a/tests/Feature/Feature/Monitors/MonitorCrudTest.php b/tests/Feature/Feature/Monitors/MonitorCrudTest.php index 1089450..3983694 100644 --- a/tests/Feature/Feature/Monitors/MonitorCrudTest.php +++ b/tests/Feature/Feature/Monitors/MonitorCrudTest.php @@ -228,6 +228,89 @@ ]); }); +test('user can create an icmp monitor with a hostname', function () { + $user = User::factory()->create(); + + $this->actingAs($user); + + Livewire::test(Create::class) + ->set('name', 'Cloudflare DNS') + ->set('checkType', 'icmp') + ->set('url', '1.1.1.1') + ->set('checkInterval', 60) + ->call('save') + ->assertRedirect(route('monitors.index')); + + $this->assertDatabaseHas('monitors', [ + 'user_id' => $user->id, + 'name' => 'Cloudflare DNS', + 'check_type' => 'icmp', + 'url' => '1.1.1.1', + ]); +}); + +test('check type defaults to http on create', function () { + $user = User::factory()->create(); + $this->actingAs($user); + + Livewire::test(Create::class)->assertSet('checkType', 'http'); +}); + +test('icmp monitor rejects values with a scheme', function () { + $user = User::factory()->create(); + $this->actingAs($user); + + Livewire::test(Create::class) + ->set('name', 'Bad') + ->set('checkType', 'icmp') + ->set('url', 'https://example.com') + ->call('save') + ->assertHasErrors('url'); +}); + +test('icmp monitor rejects values with a path', function () { + $user = User::factory()->create(); + $this->actingAs($user); + + Livewire::test(Create::class) + ->set('name', 'Bad') + ->set('checkType', 'icmp') + ->set('url', 'example.com/path') + ->call('save') + ->assertHasErrors('url'); +}); + +test('http monitor still requires a valid url', function () { + $user = User::factory()->create(); + $this->actingAs($user); + + Livewire::test(Create::class) + ->set('name', 'Bad') + ->set('checkType', 'http') + ->set('url', 'example.com') + ->call('save') + ->assertHasErrors('url'); +}); + +test('user can switch a monitor from http to icmp', function () { + $user = User::factory()->create(); + $monitor = Monitor::factory()->create(['user_id' => $user->id, 'url' => 'https://example.com']); + + $this->actingAs($user); + + Livewire::test(Edit::class, ['monitor' => $monitor]) + ->set('checkType', 'icmp') + ->set('url', '8.8.8.8') + ->call('save') + ->assertRedirect(route('monitors.show', $monitor)); + + $this->assertDatabaseHas('monitors', [ + 'id' => $monitor->id, + 'check_type' => 'icmp', + 'url' => '8.8.8.8', + ]); +}); + test('monitors index shows personal monitors', function () { $user = User::factory()->create(); $monitor1 = Monitor::factory()->create(['user_id' => $user->id, 'name' => 'Monitor 1']); diff --git a/tests/Unit/Services/CheckDispatcherTest.php b/tests/Unit/Services/CheckDispatcherTest.php new file mode 100644 index 0000000..f69b3f5 --- /dev/null +++ b/tests/Unit/Services/CheckDispatcherTest.php @@ -0,0 +1,42 @@ +captured = null; + + Redis::shouldReceive('connection')->with('streams')->andReturnSelf(); + Redis::shouldReceive('xadd')->andReturnUsing(function (string $stream, string $id, array $fields) { + $this->captured = $fields; + + return '1-0'; + }); +}); + +test('http monitors are dispatched with their url unchanged', function () { + $monitor = Monitor::factory()->create([ + 'check_type' => CheckType::Http, + 'url' => 'https://example.com', + 'check_interval' => 60, + ]); + + (new CheckDispatcher)->dispatchCheck($monitor); + + expect($this->captured['url'])->toBe('https://example.com'); +}); + +test('icmp monitors are dispatched with an icmp scheme prefix', function () { + $monitor = Monitor::factory()->icmp()->create([ + 'url' => '1.1.1.1', + 'check_interval' => 60, + ]); + + (new CheckDispatcher)->dispatchCheck($monitor); + + expect($this->captured['url'])->toBe('icmp://1.1.1.1'); +});