. */ namespace FireflyIII\Support; use FireflyIII\Models\Telemetry as TelemetryModel; use Log; /** * Class Telemetry */ class Telemetry { /** * Feature telemetry stores a $value for the given $feature. * Will only store the given $feature / $value combination once. * * * Examples: * - execute-cli-command [value] * - use-help-pages * - has-created-bill * - do-big-import * - first-time-install * - more * * Its use should be limited to exotic and strange use cases in Firefly III. * Because time and date are logged as well, useful to track users' evolution in Firefly III. * * Any meta-data stored is strictly non-financial. * * @param string $key * @param string $value */ public function feature(string $key, 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 feature "%s" with value "%s".', $key, $value)); if (!$this->hasEntry('feature', $key, $value)) { $this->storeEntry('feature', $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)); // no storage backend yet, do nothing. $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 { return TelemetryModel ::where('type', $type) ->where('key', $key) ->where('value', json_encode($value, JSON_THROW_ON_ERROR, 512)) ->count() > 0; } /** * Store new entry in DB. * * @param string $name * @param string $value */ private function storeEntry(string $type, string $name, string $value): void { TelemetryModel::create( [ 'installation_id' => \FireflyConfig::get('installation_id', '')->data, 'key' => $name, 'type' => $type, 'value' => $value, ] ); } }