diff --git a/CHANGELOG.md b/CHANGELOG.md index a9766a50d..58f11a0b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # api + +## 10x.18.3 - 10 February 2025 +- Added new table wiki_daily_metrics +- Added a new Wiki.php class in the metric folder for wiki related metrics +- Added a Job scheduled to run daily and update metrics in the wiki_daily_metric table. + ## 10x.18.2 - 16 December 2024 - Update FAQ link in empty wiki notification email diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 33cfa3a04..65e4f00a3 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -10,11 +10,13 @@ use App\Jobs\RequeuePendingQsBatchesJob; use App\Jobs\SandboxCleanupJob; use App\Jobs\PollForMediaWikiJobsJob; +use App\Jobs\UpdateWikiDailyMetricJob; use App\Jobs\UpdateWikiSiteStatsJob; use App\Jobs\SendEmptyWikiNotificationsJob; use App\Jobs\CreateQueryserviceBatchesJob; use App\Jobs\FailStalledEntityImportsJob; use App\Jobs\UpdateQueryserviceAllowList; +use App\Wiki; use Illuminate\Console\Scheduling\Schedule; use Illuminate\Foundation\Console\Kernel as ConsoleKernel; @@ -59,7 +61,10 @@ protected function schedule(Schedule $schedule): void $schedule->job(new SendEmptyWikiNotificationsJob)->dailyAt('21:00'); + $schedule->job(new UpdateWikiDailyMetricJob)->dailyAt('23:00'); + $schedule->job(new UpdateQueryserviceAllowList)->weeklyOn(Schedule::MONDAY, '01:00'); + } /** diff --git a/app/Jobs/UpdateWikiDailyMetricJob.php b/app/Jobs/UpdateWikiDailyMetricJob.php new file mode 100755 index 000000000..2980eab54 --- /dev/null +++ b/app/Jobs/UpdateWikiDailyMetricJob.php @@ -0,0 +1,27 @@ +get(); + foreach ( $wikis as $wiki ) { + (new WikiMetrics())->saveMetrics($wiki); + } + } +} diff --git a/app/Metrics/App/WikiMetrics.php b/app/Metrics/App/WikiMetrics.php new file mode 100644 index 000000000..c75b03f51 --- /dev/null +++ b/app/Metrics/App/WikiMetrics.php @@ -0,0 +1,38 @@ +format('Y-m-d'); + $oldRecord = WikiDailyMetrics::where('wiki_id', $wiki->id)->latest('date')->first(); + $todayPageCount = $wiki->wikiSiteStats()->first()->pages ?? 0; + $isDeleted = (bool)$wiki->deleted_at; + if ($oldRecord) { + if ($oldRecord->is_deleted) { + \Log::info("WikiMetrics is deleted, no new record for WikiMetrics ID {$wiki->id}."); + return; + } + if ($oldRecord->pages === $todayPageCount) { + \Log::info("Page count unchanged for WikiMetrics ID {$wiki->id}, no new record added."); + return; + } + } + WikiDailyMetrics::create([ + 'id' => $wiki->id . '_' . date('Y-m-d'), + 'pages' => $todayPageCount, + 'is_deleted' => $isDeleted, + 'date' => $today, + 'wiki_id' => $wiki->id, + ]); + \Log::info("New metric recorded for WikiMetrics ID {$wiki->id}"); + } + +} + diff --git a/app/WikiDailyMetrics.php b/app/WikiDailyMetrics.php new file mode 100644 index 000000000..e29eeaf1b --- /dev/null +++ b/app/WikiDailyMetrics.php @@ -0,0 +1,29 @@ +string('id')->primary(); + $table->string('wiki_id'); + $table->integer('pages'); + $table->boolean('is_deleted'); + $table->date('date'); + $table->timestamps(); // Created at & Updated at + $table->unique(['wiki_id', 'date']); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('wiki_daily_metrics'); + } +}; diff --git a/tests/Jobs/UpdateWikiDailyMetricJobTest.php b/tests/Jobs/UpdateWikiDailyMetricJobTest.php new file mode 100644 index 000000000..d7a334c5c --- /dev/null +++ b/tests/Jobs/UpdateWikiDailyMetricJobTest.php @@ -0,0 +1,51 @@ +create([ + 'domain' => 'example.wikibase.cloud', + ]); + $deletedWiki = Wiki::factory()->create([ + 'domain' => 'deletedwiki.wikibase.cloud', + ]); + $deletedWiki->delete(); + + (new UpdateWikiDailyMetricJob())->handle(); + + $this->assertDatabaseHas('wiki_daily_metrics', [ + 'wiki_id' => $activeWiki->id, + 'date' => Carbon::today()->toDateString() + ]); + + $this->assertDatabaseHas('wiki_daily_metrics', [ + 'wiki_id' => $deletedWiki->id, + 'date' => Carbon::today()->toDateString() + ]); + } + +} diff --git a/tests/Metrics/WikiMetricsTest.php b/tests/Metrics/WikiMetricsTest.php new file mode 100644 index 000000000..1806d90e9 --- /dev/null +++ b/tests/Metrics/WikiMetricsTest.php @@ -0,0 +1,53 @@ +create([ + 'domain' => 'thisfake.wikibase.cloud' + ]); + + (new WikiMetrics())->saveMetrics($wiki); + // Assert the metric is updated in the database + $this->assertDatabaseHas('wiki_daily_metrics', [ + 'date' => now()->toDateString() + ]); + } + + + public function testDoesNotAddDuplicateRecordsWithOnlyDateChange() + { + $wiki = Wiki::factory()->create([ + 'domain' => 'thisfake.wikibase.cloud' + ]); + //Insert an old metric value for a wiki + WikiDailyMetrics::create([ + 'id' => $wiki->id. '_'. Carbon::yesterday()->toDateString(), + 'wiki_id' => $wiki->id, + 'date' => Carbon::yesterday()->toDateString(), + 'pages' => 0, + 'is_deleted' => 0 + ]); + (new WikiMetrics())->saveMetrics($wiki); + + //Assert No new record was created for today + $this->assertDatabaseMissing('wiki_daily_metrics', [ + 'wiki_id' => $wiki->id, + 'date' => Carbon::today()->toDateString() + ]); + } +} +