From 40bbed2a8bf4bd17b24d1d713ed751ff1835dd2b Mon Sep 17 00:00:00 2001 From: James Cole Date: Sat, 29 May 2021 11:30:13 +0200 Subject: [PATCH] Limit some collection features. --- .../V1/Controllers/System/CronController.php | 1 - app/Console/Commands/Export/ExportData.php | 4 +- app/Console/Commands/SetLatestVersion.php | 2 +- app/Console/Commands/Tools/ApplyRules.php | 6 +- app/Console/Commands/Tools/Cron.php | 62 +----- .../Commands/UpgradeFireflyInstructions.php | 1 - .../Controllers/Admin/TelemetryController.php | 67 +----- app/Jobs/SubmitTelemetryData.php | 200 ------------------ app/Providers/FireflyServiceProvider.php | 3 - .../Telemetry/TelemetryRepository.php | 69 ------ .../TelemetryRepositoryInterface.php | 60 ------ app/Support/Cronjobs/TelemetryCronjob.php | 106 ---------- app/Support/Http/Controllers/CronRunner.php | 31 --- app/Support/Telemetry.php | 156 +++----------- resources/views/v1/admin/telemetry/index.twig | 29 --- resources/views/v1/admin/telemetry/view.twig | 101 --------- routes/web.php | 4 - 17 files changed, 40 insertions(+), 862 deletions(-) delete mode 100644 app/Jobs/SubmitTelemetryData.php delete mode 100644 app/Repositories/Telemetry/TelemetryRepository.php delete mode 100644 app/Repositories/Telemetry/TelemetryRepositoryInterface.php delete mode 100644 app/Support/Cronjobs/TelemetryCronjob.php delete mode 100644 resources/views/v1/admin/telemetry/view.twig diff --git a/app/Api/V1/Controllers/System/CronController.php b/app/Api/V1/Controllers/System/CronController.php index dfb77101c3..c33373f240 100644 --- a/app/Api/V1/Controllers/System/CronController.php +++ b/app/Api/V1/Controllers/System/CronController.php @@ -51,7 +51,6 @@ class CronController extends Controller $return = []; $return['recurring_transactions'] = $this->runRecurring($config['force'], $config['date']); $return['auto_budgets'] = $this->runAutoBudget($config['force'], $config['date']); - $return['telemetry'] = $this->runTelemetry($config['force'], $config['date']); return response()->json($return); } diff --git a/app/Console/Commands/Export/ExportData.php b/app/Console/Commands/Export/ExportData.php index 5cdcea94d6..909c3b90db 100644 --- a/app/Console/Commands/Export/ExportData.php +++ b/app/Console/Commands/Export/ExportData.php @@ -132,11 +132,11 @@ class ExportData extends Command if (0 !== count($data)) { try { $this->exportData($options, $data); - app('telemetry')->feature('system.command.executed', $this->signature); + app('telemetry')->feature('system.command.executed', 'firefly-iii:export-data'); } catch (FireflyException $e) { $this->error(sprintf('Could not store data: %s', $e->getMessage())); - app('telemetry')->feature('system.command.errored', $this->signature); + app('telemetry')->feature('system.command.errored', 'firefly-iii:export-data'); $returnCode = 1; } } diff --git a/app/Console/Commands/SetLatestVersion.php b/app/Console/Commands/SetLatestVersion.php index b961e755d7..a5b065a8af 100644 --- a/app/Console/Commands/SetLatestVersion.php +++ b/app/Console/Commands/SetLatestVersion.php @@ -60,7 +60,7 @@ class SetLatestVersion extends Command app('fireflyconfig')->set('ff3_version', config('firefly.version')); $this->line('Updated version.'); - app('telemetry')->feature('system.command.executed', $this->signature); + app('telemetry')->feature('system.command.executed', 'firefly-iii:set-latest-version'); return 0; } diff --git a/app/Console/Commands/Tools/ApplyRules.php b/app/Console/Commands/Tools/ApplyRules.php index dba8126ab7..6197a76d1c 100644 --- a/app/Console/Commands/Tools/ApplyRules.php +++ b/app/Console/Commands/Tools/ApplyRules.php @@ -99,7 +99,7 @@ class ApplyRules extends Command $result = $this->verifyInput(); if (false === $result) { - app('telemetry')->feature('system.command.errored', $this->signature); + app('telemetry')->feature('system.command.errored', 'firefly-iii:apply-rules'); return 1; } @@ -119,7 +119,7 @@ class ApplyRules extends Command $this->warn(' --rule_groups=1,2,...'); $this->warn(' --all_rules'); - app('telemetry')->feature('system.command.errored', $this->signature); + app('telemetry')->feature('system.command.errored', 'firefly-iii:apply-rules'); return 1; } @@ -148,7 +148,7 @@ class ApplyRules extends Command // file the rule(s) $ruleEngine->fire(); - app('telemetry')->feature('system.command.executed', $this->signature); + app('telemetry')->feature('system.command.executed', 'firefly-iii:apply-rules'); $this->line(''); $end = round(microtime(true) - $start, 2); diff --git a/app/Console/Commands/Tools/Cron.php b/app/Console/Commands/Tools/Cron.php index b214846c26..c5920dd66b 100644 --- a/app/Console/Commands/Tools/Cron.php +++ b/app/Console/Commands/Tools/Cron.php @@ -25,11 +25,9 @@ declare(strict_types=1); namespace FireflyIII\Console\Commands\Tools; use Carbon\Carbon; -use Exception; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Support\Cronjobs\AutoBudgetCronjob; use FireflyIII\Support\Cronjobs\RecurringCronjob; -use FireflyIII\Support\Cronjobs\TelemetryCronjob; use Illuminate\Console\Command; use InvalidArgumentException; use Log; @@ -92,20 +90,9 @@ class Cron extends Command $this->error($e->getMessage()); } - /* - * Fire telemetry cron job - */ - try { - $this->telemetryCronJob($force, $date); - } catch (FireflyException $e) { - Log::error($e->getMessage()); - Log::error($e->getTraceAsString()); - $this->error($e->getMessage()); - } - $this->info('More feedback on the cron jobs can be found in the log files.'); - app('telemetry')->feature('system.command.executed', $this->signature); + app('telemetry')->feature('system.command.executed', 'firefly-iii:cron'); return 0; } @@ -127,13 +114,13 @@ class Cron extends Command } $recurring->fire(); - if($recurring->jobErrored) { + if ($recurring->jobErrored) { $this->error(sprintf('Error in "create recurring transactions" cron: %s', $recurring->message)); } - if($recurring->jobFired) { + if ($recurring->jobFired) { $this->error(sprintf('"Create recurring transactions" cron fired: %s', $recurring->message)); } - if($recurring->jobSucceeded) { + if ($recurring->jobSucceeded) { $this->error(sprintf('"Create recurring transactions" cron ran with success: %s', $recurring->message)); } } @@ -154,50 +141,15 @@ class Cron extends Command $autoBudget->fire(); - if($autoBudget->jobErrored) { + if ($autoBudget->jobErrored) { $this->error(sprintf('Error in "create auto budgets" cron: %s', $autoBudget->message)); } - if($autoBudget->jobFired) { + if ($autoBudget->jobFired) { $this->error(sprintf('"Create auto budgets" cron fired: %s', $autoBudget->message)); } - if($autoBudget->jobSucceeded) { + if ($autoBudget->jobSucceeded) { $this->error(sprintf('"Create auto budgets" cron ran with success: %s', $autoBudget->message)); } } - - /** - * @param bool $force - * @param Carbon|null $date - * - * @throws FireflyException - */ - private function telemetryCronJob(bool $force, ?Carbon $date): void - { - if (false === config('firefly.send_telemetry') || false === config('firefly.feature_flags.telemetry')) { - // if not configured to do anything with telemetry, do nothing. - return; - } - $telemetry = new TelemetryCronjob; - $telemetry->setForce($force); - - // set date in cron job: - if (null !== $date) { - $telemetry->setDate($date); - } - - $telemetry->fire(); - - if($telemetry->jobErrored) { - $this->error(sprintf('Error in "send telemetry" cron: %s', $telemetry->message)); - } - if($telemetry->jobFired) { - $this->error(sprintf('"Send telemetry" cron fired: %s', $telemetry->message)); - } - if($telemetry->jobSucceeded) { - $this->error(sprintf('"Send telemetry" cron ran with success: %s', $telemetry->message)); - } - - } - } diff --git a/app/Console/Commands/UpgradeFireflyInstructions.php b/app/Console/Commands/UpgradeFireflyInstructions.php index aa997ff96c..8c624d0bf9 100644 --- a/app/Console/Commands/UpgradeFireflyInstructions.php +++ b/app/Console/Commands/UpgradeFireflyInstructions.php @@ -69,7 +69,6 @@ class UpgradeFireflyInstructions extends Command app('telemetry')->feature('system.os.version', PHP_OS); app('telemetry')->feature('system.database.driver', env('DB_CONNECTION', '(unknown)')); app('telemetry')->feature('system.os.is_docker', $isDocker); - app('telemetry')->feature('system.command.executed', $this->signature); try { app('telemetry')->feature('system.users.count', (string)User::count()); } catch (QueryException $e) { diff --git a/app/Http/Controllers/Admin/TelemetryController.php b/app/Http/Controllers/Admin/TelemetryController.php index ee377bfc49..949f3eb28d 100644 --- a/app/Http/Controllers/Admin/TelemetryController.php +++ b/app/Http/Controllers/Admin/TelemetryController.php @@ -25,21 +25,15 @@ declare(strict_types=1); namespace FireflyIII\Http\Controllers\Admin; use FireflyIII\Http\Controllers\Controller; -use FireflyIII\Jobs\SubmitTelemetryData; -use FireflyIII\Repositories\Telemetry\TelemetryRepositoryInterface; -use Illuminate\Contracts\View\Factory; -use Illuminate\Http\RedirectResponse; -use Illuminate\Routing\Redirector; -use Illuminate\View\View; /** * Class TelemetryController */ class TelemetryController extends Controller { - /** @var TelemetryRepositoryInterface */ - private $repository; - + /** + * TelemetryController constructor. + */ public function __construct() { if (false === config('firefly.feature_flags.telemetry')) { @@ -51,37 +45,12 @@ class TelemetryController extends Controller function ($request, $next) { app('view')->share('title', (string)trans('firefly.administration')); app('view')->share('mainTitleIcon', 'fa-hand-spock-o'); - $this->repository = app(TelemetryRepositoryInterface::class); return $next($request); } ); } - /** - * @return RedirectResponse|Redirector - */ - public function deleteAll() - { - $this->repository->deleteAll(); - - session()->flash('success', trans('firefly.telemetry_all_deleted')); - - return redirect(url()->previous(route('admin.telemetry.index'))); - } - - /** - * @return RedirectResponse|Redirector - */ - public function deleteSubmitted() - { - $this->repository->deleteSubmitted(); - - session()->flash('success', trans('firefly.telemetry_submitted_deleted')); - - return redirect(url()->previous(route('admin.telemetry.index'))); - } - /** * Index */ @@ -91,37 +60,7 @@ class TelemetryController extends Controller app('view')->share('subTitle', (string)trans('firefly.telemetry_admin_index')); $version = config('firefly.version'); $enabled = config('firefly.send_telemetry', false) && config('firefly.feature_flags.telemetry'); - - $count = $this->repository->count(); - return prefixView('admin.telemetry.index', compact('version', 'enabled', 'count')); } - /** - * Run job to submit telemetry. - */ - public function submit() - { - $job = app(SubmitTelemetryData::class); - $job->setDate(today(config('app.timezone'))); - $job->setForce(true); - $job->handle(); - session()->flash('info', trans('firefly.telemetry_submission_executed')); - - return redirect(url()->previous(route('admin.telemetry.index'))); - } - - /** - * View telemetry. Paginated because you never know how much will be collected. - * - * @return Factory|View - */ - public function view() - { - $format = trans('config.date_time'); - $size = 100; - $records = $this->repository->paginated($size); - - return prefixView('admin.telemetry.view', compact('records', 'format')); - } } diff --git a/app/Jobs/SubmitTelemetryData.php b/app/Jobs/SubmitTelemetryData.php deleted file mode 100644 index 92000cd985..0000000000 --- a/app/Jobs/SubmitTelemetryData.php +++ /dev/null @@ -1,200 +0,0 @@ -. - */ - -declare(strict_types=1); - -namespace FireflyIII\Jobs; - -use Carbon\Carbon; -use Exception; -use FireflyIII\Exceptions\FireflyException; -use FireflyIII\Models\Telemetry; -use GuzzleHttp\Client; -use GuzzleHttp\Exception\GuzzleException; -use Illuminate\Bus\Queueable; -use Illuminate\Contracts\Queue\ShouldQueue; -use Illuminate\Foundation\Bus\Dispatchable; -use Illuminate\Queue\InteractsWithQueue; -use Illuminate\Queue\SerializesModels; -use Illuminate\Support\Collection; -use JsonException; -use Log; -use Sentry\State\Scope; -use function Sentry\captureMessage; -use function Sentry\configureScope; - -/** - * Class SubmitTelemetryData - */ -class SubmitTelemetryData implements ShouldQueue -{ - use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; - - private Carbon $date; - private bool $force; - - /** - * Create a new job instance. - * - * @codeCoverageIgnore - * - * @param Carbon|null $date - */ - public function __construct(?Carbon $date) - { - $this->date = $date; - Log::debug('Created new SubmitTelemetryData'); - } - - /** - * @throws FireflyException - */ - public function handle(): void - { - $url = sprintf('%s/submit', config('firefly.telemetry_endpoint')); - Log::debug(sprintf('Will submit telemetry to endpoint: %s', $url)); - - $telemetry = $this->collectTelemetry(); - - if (0 === $telemetry->count()) { - Log::debug('Nothing to submit.'); - - return; - } - - // submit to Sentry one by one: - /** @var Telemetry $entry */ - foreach($telemetry as $entry) { - - configureScope(function (Scope $scope) use ($entry): void { - $scope->setContext('telemetry', [ - 'installation_id' => $entry->installation_id, - 'collected_at' => $entry->created_at->format('r'), - 'type' => $entry->type, - 'key' => $entry->key, - 'value' => $entry->value, - ]); - }); - - captureMessage('Telemetry submission'); - } - $this->markAsSubmitted($telemetry); - -// $json = $this->parseJson($telemetry); -// try { -// $body = json_encode($json, JSON_THROW_ON_ERROR); -// } catch (JsonException $e) { -// Log::error($e->getMessage()); -// Log::error('Could not parse JSON.'); -// throw new FireflyException(sprintf('Could not parse telemetry JSON: %s', $e->getMessage()), 0, $e); -// } -// -// $client = new Client; -// $options = [ -// 'body' => $body, -// 'headers' => [ -// 'Content-Type' => 'application/json', -// 'Accept' => 'application/json', -// 'connect_timeout' => 3.14, -// 'User-Agent' => sprintf('FireflyIII/%s', config('firefly.version')), -// ], -// ]; -// try { -// $result = $client->post($url, $options); -// } catch (GuzzleException | Exception $e) { -// Log::error($e->getMessage()); -// Log::error($e->getTraceAsString()); -// Log::error('Could not submit telemetry.'); -// throw new FireflyException(sprintf('Could not submit telemetry: %s', $e->getMessage()), 0, $e); -// } -// $body = (string)$result->getBody(); -// $statusCode = $result->getStatusCode(); -// Log::info(sprintf('Result of submission [%d]: %s', $statusCode, $body)); -// if (200 === $statusCode) { -// // mark as submitted: -// $this->markAsSubmitted($telemetry); -// } - } - - /** - * @return Collection - */ - private function collectTelemetry(): Collection - { - $collection = Telemetry::whereNull('submitted')->take(50)->get(); - Log::debug(sprintf('Found %d entry(s) to submit', $collection->count())); - - return $collection; - } - - /** - * @param Collection $telemetry - * - * @return array - */ - private function parseJson(Collection $telemetry): array - { - $array = []; - /** @var Telemetry $entry */ - foreach ($telemetry as $entry) { - $array[] = [ - 'installation_id' => $entry->installation_id, - 'collected_at' => $entry->created_at->format('r'), - 'type' => $entry->type, - 'key' => $entry->key, - 'value' => $entry->value, - ]; - } - - return $array; - } - - /** - * @param Collection $telemetry - */ - private function markAsSubmitted(Collection $telemetry): void - { - $telemetry->each( - static function (Telemetry $entry) { - $entry->submitted = today(config('app.timezone')); - $entry->save(); - } - ); - } - - /** - * @param Carbon $date - */ - public function setDate(Carbon $date): void - { - $this->date = $date; - } - - /** - * @param bool $force - */ - public function setForce(bool $force): void - { - $this->force = $force; - } - -} diff --git a/app/Providers/FireflyServiceProvider.php b/app/Providers/FireflyServiceProvider.php index ae216cdb74..5430e9c5aa 100644 --- a/app/Providers/FireflyServiceProvider.php +++ b/app/Providers/FireflyServiceProvider.php @@ -42,8 +42,6 @@ use FireflyIII\Helpers\Webhook\Sha3SignatureGenerator; use FireflyIII\Helpers\Webhook\SignatureGeneratorInterface; use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepository; use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepositoryInterface; -use FireflyIII\Repositories\Telemetry\TelemetryRepository; -use FireflyIII\Repositories\Telemetry\TelemetryRepositoryInterface; use FireflyIII\Repositories\TransactionType\TransactionTypeRepository; use FireflyIII\Repositories\TransactionType\TransactionTypeRepositoryInterface; use FireflyIII\Repositories\User\UserRepository; @@ -226,7 +224,6 @@ class FireflyServiceProvider extends ServiceProvider $this->app->bind(ReportHelperInterface::class, ReportHelper::class); $this->app->bind(FiscalHelperInterface::class, FiscalHelper::class); $this->app->bind(UpdateRequestInterface::class, UpdateRequest::class); - $this->app->bind(TelemetryRepositoryInterface::class, TelemetryRepository::class); // webhooks: $this->app->bind(MessageGeneratorInterface::class, StandardMessageGenerator::class); diff --git a/app/Repositories/Telemetry/TelemetryRepository.php b/app/Repositories/Telemetry/TelemetryRepository.php deleted file mode 100644 index 403ad37c69..0000000000 --- a/app/Repositories/Telemetry/TelemetryRepository.php +++ /dev/null @@ -1,69 +0,0 @@ -. - */ - -declare(strict_types=1); - -namespace FireflyIII\Repositories\Telemetry; - -use FireflyIII\Models\Telemetry; -use Illuminate\Contracts\Pagination\LengthAwarePaginator; - -/** - * Class TelemetryRepository - */ -class TelemetryRepository implements TelemetryRepositoryInterface -{ - - /** - * @inheritDoc - */ - public function count(): int - { - return Telemetry::count(); - } - - /** - * @inheritDoc - */ - public function deleteAll(): void - { - // created_at is never NULL. - Telemetry::whereNotNull('created_at')->delete(); - } - - /** - * @inheritDoc - */ - public function deleteSubmitted(): void - { - // created_at is never NULL. - Telemetry::whereNotNull('submitted')->delete(); - } - - /** - * @inheritDoc - */ - public function paginated(int $pageSize): LengthAwarePaginator - { - return Telemetry::orderBy('created_at', 'DESC')->paginate($pageSize); - } -} diff --git a/app/Repositories/Telemetry/TelemetryRepositoryInterface.php b/app/Repositories/Telemetry/TelemetryRepositoryInterface.php deleted file mode 100644 index fef7f8ddfc..0000000000 --- a/app/Repositories/Telemetry/TelemetryRepositoryInterface.php +++ /dev/null @@ -1,60 +0,0 @@ -. - */ - -declare(strict_types=1); - -namespace FireflyIII\Repositories\Telemetry; - -use Illuminate\Contracts\Pagination\LengthAwarePaginator; - -/** - * Interface TelemetryRepositoryInterface - */ -interface TelemetryRepositoryInterface -{ - /** - * Return the number of stored telemetry records. - * - * @return int - */ - public function count(): int; - - /** - * Delete all records. - */ - public function deleteAll(): void; - - /** - * - */ - public function deleteSubmitted(): void; - - /** - * Return paginated result of telemetry records. - * - * @param int $pageSize - * - * @return LengthAwarePaginator - */ - public function paginated(int $pageSize): LengthAwarePaginator; - -} diff --git a/app/Support/Cronjobs/TelemetryCronjob.php b/app/Support/Cronjobs/TelemetryCronjob.php deleted file mode 100644 index 88a7850ef5..0000000000 --- a/app/Support/Cronjobs/TelemetryCronjob.php +++ /dev/null @@ -1,106 +0,0 @@ -. - */ - -declare(strict_types=1); - -namespace FireflyIII\Support\Cronjobs; - -use Carbon\Carbon; -use FireflyIII\Exceptions\FireflyException; -use FireflyIII\Jobs\SubmitTelemetryData; -use FireflyIII\Models\Configuration; -use Log; - -/** - * Class TelemetryCronjob - */ -class TelemetryCronjob extends AbstractCronjob -{ - - /** - * @inheritDoc - * @throws FireflyException - */ - public function fire(): void - { - // do not fire if telemetry is disabled. - if (false === config('firefly.send_telemetry') || false === config('firefly.feature_flags.telemetry')) { - $msg = 'Telemetry is disabled. The cron job will do nothing.'; - $this->message = $msg; - Log::warning($msg); - - return; - } - /** @var Configuration $config */ - $config = app('fireflyconfig')->get('last_tm_job', 0); - $lastTime = (int)$config->data; - $diff = time() - $lastTime; - $diffForHumans = Carbon::now()->diffForHumans(Carbon::createFromTimestamp($lastTime), null, true); - if (0 === $lastTime) { - Log::info('Telemetry cron-job has never fired before.'); - } - // less than a week ago: - if ($lastTime > 0 && $diff <= 604800) { - Log::info(sprintf('It has been %s since the telemetry cron-job has fired.', $diffForHumans)); - if (false === $this->force) { - Log::info('The cron-job will not fire now.'); - $this->message = sprintf('It has been %s since the telemetry cron-job has fired. It will not fire now.', $diffForHumans); - return; - } - - // fire job regardless. - if (true === $this->force) { - Log::info('Execution of the telemetry cron-job has been FORCED.'); - } - } - // more than a week ago. - if ($lastTime > 0 && $diff > 604799) { - Log::info(sprintf('It has been %s since the telemetry cron-job has fired. It will fire now!', $diffForHumans)); - } - - $this->fireTelemetry(); - - app('preferences')->mark(); - } - /** - * @throws FireflyException - */ - private function fireTelemetry(): void - { - Log::info(sprintf('Will now fire telemetry cron job task for date "%s".', $this->date->format('Y-m-d'))); - /** @var SubmitTelemetryData $job */ - $job = app(SubmitTelemetryData::class); - $job->setDate($this->date); - $job->setForce($this->force); - $job->handle(); - - $this->jobFired = true; - $this->jobErrored = false; - $this->jobSucceeded = true; - $this->message = 'Telemetry cron job fired successfully.'; - - // TODO remove old, submitted telemetry data. - - app('fireflyconfig')->set('last_tm_job', (int)$this->date->format('U')); - Log::info('Done with telemetry cron job task.'); - } -} diff --git a/app/Support/Http/Controllers/CronRunner.php b/app/Support/Http/Controllers/CronRunner.php index 58de807fef..89e93ef55d 100644 --- a/app/Support/Http/Controllers/CronRunner.php +++ b/app/Support/Http/Controllers/CronRunner.php @@ -27,7 +27,6 @@ use Carbon\Carbon; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Support\Cronjobs\AutoBudgetCronjob; use FireflyIII\Support\Cronjobs\RecurringCronjob; -use FireflyIII\Support\Cronjobs\TelemetryCronjob; /** * Trait CronRunner @@ -97,35 +96,5 @@ trait CronRunner } - /** - * @param bool $force - * @param Carbon $date - * - * @return array - */ - protected function runTelemetry(bool $force, Carbon $date): array - { - /** @var TelemetryCronjob $telemetry */ - $telemetry = app(TelemetryCronjob::class); - $telemetry->setForce($force); - $telemetry->setDate($date); - try { - $telemetry->fire(); - } catch (FireflyException $e) { - return [ - 'job_fired' => false, - 'job_succeeded' => false, - 'job_errored' => true, - 'message' => $e->getMessage(), - ]; - } - - return [ - 'job_fired' => $telemetry->jobFired, - 'job_succeeded' => $telemetry->jobSucceeded, - 'job_errored' => $telemetry->jobErrored, - 'message' => $telemetry->message, - ]; - } } diff --git a/app/Support/Telemetry.php b/app/Support/Telemetry.php index 978fde2592..495068d9c7 100644 --- a/app/Support/Telemetry.php +++ b/app/Support/Telemetry.php @@ -25,11 +25,11 @@ declare(strict_types=1); namespace FireflyIII\Support; use Carbon\Carbon; -use FireflyIII\Models\Telemetry as TelemetryModel; use FireflyIII\Support\System\GeneratesInstallationId; -use Illuminate\Database\QueryException; -use JsonException; -use Log; +use Sentry\Severity; +use Sentry\State\Scope; +use function Sentry\captureMessage; +use function Sentry\configureScope; /** * Class Telemetry @@ -37,6 +37,7 @@ use Log; class Telemetry { use GeneratesInstallationId; + /** * Feature telemetry stores a $value for the given $feature. * Will only store the given $feature / $value combination once. @@ -64,134 +65,25 @@ class Telemetry // do nothing! return; } - - Log::info(sprintf('Logged telemetry feature "%s" with value "%s".', $key, $value)); - if (!$this->hasEntry('feature', $key, $value)) { - $this->storeEntry('feature', $key, $value); - } - } - - /** - * @param string $key - * @param string $value - * @param int $days - */ - public function recurring(string $key, string $value, int $days): void - { - if (false === config('firefly.send_telemetry') || false === config('firefly.feature_flags.telemetry')) { - // hard stop if not allowed to do telemetry. - // do nothing! - return; - } - - $cutoffDate = Carbon::today()->subDays($days); - if (!$this->hasRecentEntry('recurring', $key, $value, $cutoffDate)) { - $this->storeEntry('recurring', $key, $value); - } - } - - /** - * String telemetry stores a string value as a telemetry entry. Values could include: - * - * - "php-version", "php7.3" - * - "os-version", "linux" - * - * Any meta-data stored is strictly non-financial. - * - * @param string $name - * @param string $value - */ - public function string(string $name, string $value): void - { - if (false === config('firefly.send_telemetry') || false === config('firefly.feature_flags.telemetry')) { - // hard stop if not allowed to do telemetry. - // do nothing! - return; - } - Log::info(sprintf('Logged telemetry string "%s" with value "%s".', $name, $value)); - - $this->storeEntry('string', $name, $value); - } - - /** - * @param string $type - * @param string $key - * @param string $value - * - * @return bool - */ - private function hasEntry(string $type, string $key, string $value): bool - { - try { - $jsonEncoded = json_encode($value, JSON_THROW_ON_ERROR); - } catch (JsonException $e) { - Log::error(sprintf('JSON Exception encoding the following value: %s: %s', $value, $e->getMessage())); - $jsonEncoded = []; - } - try { - $count = TelemetryModel - ::where('type', $type) - ->where('key', $key) - ->where('value', $jsonEncoded) - ->count(); - } catch (QueryException $e) { - Log::info(sprintf('Could not execute hasEntry() but this is OK: %s', $e->getMessage())); - $count = 0; - } - - return $count > 0; - } - - /** - * @param string $type - * @param string $key - * @param string $value - * @param Carbon $date - * - * @return bool - */ - private function hasRecentEntry(string $type, string $key, string $value, Carbon $date): bool - { - try { - $jsonEncoded = json_encode($value, JSON_THROW_ON_ERROR); - } catch (JsonException $e) { - Log::error(sprintf('JSON Exception encoding the following value: %s: %s', $value, $e->getMessage())); - $jsonEncoded = []; - } - - return TelemetryModel - ::where('type', $type) - ->where('key', $key) - ->where('created_at', '>=', $date->format('Y-m-d H:i:s')) - ->where('value', $jsonEncoded) - ->count() > 0; - } - - /** - * Store new entry in DB. - * - * @param string $type - * @param string $name - * @param string $value - * - * @throws \FireflyIII\Exceptions\FireflyException - */ - private function storeEntry(string $type, string $name, string $value): void - { + // send to Sentry. $this->generateInstallationId(); - $config = app('fireflyconfig')->get('installation_id'); - $installationId = null !== $config ? $config->data : 'empty'; - try { - TelemetryModel::create( - [ - 'installation_id' => $installationId, - 'key' => $name, - 'type' => $type, - 'value' => $value, - ] - ); - } catch (QueryException $e) { - Log::info(sprintf('Could not execute storeEntry() but this is OK: %s', $e->getMessage())); - } + $installationId = app('fireflyconfig')->get('installation_id'); + + // add some context: + configureScope( + function (Scope $scope) use ($installationId, $key, $value): void { + $scope->setContext( + 'telemetry', [ + 'installation_id' => $installationId->data, + 'version' => config('firefly.version'), + 'collected_at' => Carbon::now()->format('r'), + 'key' => $key, + 'value' => $value, + ] + ); + } + ); + captureMessage(sprintf('FIT: %s/%s', $key, $value), Severity::info()); } + } diff --git a/resources/views/v1/admin/telemetry/index.twig b/resources/views/v1/admin/telemetry/index.twig index fcd80abdc5..13f62849b2 100644 --- a/resources/views/v1/admin/telemetry/index.twig +++ b/resources/views/v1/admin/telemetry/index.twig @@ -37,36 +37,7 @@ -
-
-
-

{{ 'telemetry_collected_info'|_ }}

-
-
- {% if count == 0 %} -

- {{ 'no_telemetry_present'|_ }} -

- {% else %} -

- {{ trans_choice('firefly.records_telemetry_present', count) }} -

- - {% endif %} -
-
-
- {% endblock %} {% block scripts %} {% endblock %} diff --git a/resources/views/v1/admin/telemetry/view.twig b/resources/views/v1/admin/telemetry/view.twig deleted file mode 100644 index d92e003dac..0000000000 --- a/resources/views/v1/admin/telemetry/view.twig +++ /dev/null @@ -1,101 +0,0 @@ -{% extends './v1/layout/default' %} - -{% block breadcrumbs %} - {{ Breadcrumbs.render }} -{% endblock %} -{% block content %} -
-
-
-
-

{{ 'telemetry_admin_overview'|_ }}

-
-
- -
- {{ records.links | raw }} -
- - - - - - - - - {% for record in records %} - - - - - - - - {% endfor %} -
{{ trans('form.collected') }}{{ trans('form.submitted') }}{{ trans('form.type') }}{{ trans('form.key') }}{{ trans('form.value') }}
- {{ record.created_at.formatLocalized(format) }} - - - {% if record.submitted %} - {{ record.submitted.formatLocalized(format) }} - {% else %} - {{ 'not_yet_submitted'|_ }} - {% endif %} - - - {{ trans('firefly.telemetry_type_'~record.type) }} - - {{ record.key }} - - {% if record.value|json_encode|length > 100 %} - - {{ record.value|json_encode|slice(0, 30) }}... - - {% else %} - {{ record.value|json_encode }} - {% endif %} -
-
- {{ records.links | raw }} -
-
- -
-
-
- -{% endblock %} -{% block styles %} - -{% endblock %} -{% block scripts %} - -{% endblock %} diff --git a/routes/web.php b/routes/web.php index c0fe573993..5ef33405fe 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1103,10 +1103,6 @@ Route::group( // telemetry manager: Route::get('telemetry', ['uses' => 'TelemetryController@index', 'as' => 'telemetry.index']); - Route::get('telemetry/view', ['uses' => 'TelemetryController@view', 'as' => 'telemetry.view']); - Route::get('telemetry/delete', ['uses' => 'TelemetryController@deleteAll', 'as' => 'telemetry.delete']); - Route::get('telemetry/delete-submitted', ['uses' => 'TelemetryController@deleteSubmitted', 'as' => 'telemetry.delete-submitted']); - Route::get('telemetry/submit', ['uses' => 'TelemetryController@submit', 'as' => 'telemetry.submit']); // journal links manager Route::get('links', ['uses' => 'LinkController@index', 'as' => 'links.index']);