Path: blob/1.0-develop/app/Services/Telemetry/TelemetryCollectionService.php
10279 views
<?php12namespace Pterodactyl\Services\Telemetry;34use Ramsey\Uuid\Uuid;5use Illuminate\Support\Arr;6use Pterodactyl\Models\Egg;7use Pterodactyl\Models\Nest;8use Pterodactyl\Models\Node;9use Pterodactyl\Models\User;10use Pterodactyl\Models\Mount;11use Pterodactyl\Models\Backup;12use Pterodactyl\Models\Server;13use Pterodactyl\Models\Location;14use Illuminate\Support\Facades\DB;15use Pterodactyl\Models\Allocation;16use Illuminate\Support\Facades\Http;17use Pterodactyl\Repositories\Eloquent\SettingsRepository;18use Pterodactyl\Repositories\Wings\DaemonConfigurationRepository;1920class TelemetryCollectionService21{22/**23* TelemetryCollectionService constructor.24*/25public function __construct(26private DaemonConfigurationRepository $daemonConfigurationRepository,27private SettingsRepository $settingsRepository,28) {29}3031/**32* Collects telemetry data and sends it to the Pterodactyl Telemetry Service.33*/34public function __invoke(): void35{36try {37$data = $this->collect();38} catch (\Exception) {39return;40}4142Http::post('https://telemetry.pterodactyl.io', $data);43}4445/**46* Collects telemetry data and returns it as an array.47*48* @throws \Pterodactyl\Exceptions\Model\DataValidationException49*/50public function collect(): array51{52$uuid = $this->settingsRepository->get('app:telemetry:uuid');53if (is_null($uuid)) {54$uuid = Uuid::uuid4()->toString();55$this->settingsRepository->set('app:telemetry:uuid', $uuid);56}5758$nodes = Node::all()->map(function ($node) {59try {60$info = $this->daemonConfigurationRepository->setNode($node)->getSystemInformation(2);61} catch (\Exception) {62return null;63}6465return [66'id' => $node->uuid,67'version' => Arr::get($info, 'version', ''),6869'docker' => [70'version' => Arr::get($info, 'docker.version', ''),7172'cgroups' => [73'driver' => Arr::get($info, 'docker.cgroups.driver', ''),74'version' => Arr::get($info, 'docker.cgroups.version', ''),75],7677'containers' => [78'total' => Arr::get($info, 'docker.containers.total', -1),79'running' => Arr::get($info, 'docker.containers.running', -1),80'paused' => Arr::get($info, 'docker.containers.paused', -1),81'stopped' => Arr::get($info, 'docker.containers.stopped', -1),82],8384'storage' => [85'driver' => Arr::get($info, 'docker.storage.driver', ''),86'filesystem' => Arr::get($info, 'docker.storage.filesystem', ''),87],8889'runc' => [90'version' => Arr::get($info, 'docker.runc.version', ''),91],92],9394'system' => [95'architecture' => Arr::get($info, 'system.architecture', ''),96'cpuThreads' => Arr::get($info, 'system.cpu_threads', ''),97'memoryBytes' => Arr::get($info, 'system.memory_bytes', ''),98'kernelVersion' => Arr::get($info, 'system.kernel_version', ''),99'os' => Arr::get($info, 'system.os', ''),100'osType' => Arr::get($info, 'system.os_type', ''),101],102];103})->filter(fn ($node) => !is_null($node))->toArray();104105return [106'id' => $uuid,107108'panel' => [109'version' => config('app.version'),110'phpVersion' => phpversion(),111112'drivers' => [113'backup' => [114'type' => config('backups.default'),115],116117'cache' => [118'type' => config('cache.default'),119],120121'database' => [122'type' => config('database.default'),123'version' => DB::getPdo()->getAttribute(\PDO::ATTR_SERVER_VERSION),124],125],126],127128'resources' => [129'allocations' => [130'count' => Allocation::count(),131'used' => Allocation::whereNotNull('server_id')->count(),132],133134'backups' => [135'count' => Backup::count(),136'bytes' => Backup::sum('bytes'),137],138139'eggs' => [140'count' => Egg::count(),141// Egg UUIDs are generated randomly on import, so there is not a consistent way to142// determine if servers are using default eggs or not.143// 'server_usage' => Egg::all()144// ->flatMap(fn (Egg $egg) => [$egg->uuid => $egg->servers->count()])145// ->filter(fn (int $count) => $count > 0)146// ->toArray(),147],148149'locations' => [150'count' => Location::count(),151],152153'mounts' => [154'count' => Mount::count(),155],156157'nests' => [158'count' => Nest::count(),159// Nest UUIDs are generated randomly on import, so there is not a consistent way to160// determine if servers are using default eggs or not.161// 'server_usage' => Nest::all()162// ->flatMap(fn (Nest $nest) => [$nest->uuid => $nest->eggs->sum(fn (Egg $egg) => $egg->servers->count())])163// ->filter(fn (int $count) => $count > 0)164// ->toArray(),165],166167'nodes' => [168'count' => Node::count(),169],170171'servers' => [172'count' => Server::count(),173'suspended' => Server::where('status', Server::STATUS_SUSPENDED)->count(),174],175176'users' => [177'count' => User::count(),178'admins' => User::where('root_admin', true)->count(),179],180],181182'nodes' => $nodes,183];184}185}186187188