%PDF- %PDF-
| Direktori : /www/loslex_o/demo/vendor/sentry/sentry-laravel/src/Sentry/Laravel/Features/Storage/ |
| Current File : /www/loslex_o/demo/vendor/sentry/sentry-laravel/src/Sentry/Laravel/Features/Storage/Integration.php |
<?php
namespace Sentry\Laravel\Features\Storage;
use Illuminate\Contracts\Filesystem\Cloud as CloudFilesystem;
use Illuminate\Contracts\Filesystem\Filesystem;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Filesystem\AwsS3V3Adapter;
use Illuminate\Filesystem\FilesystemAdapter;
use Illuminate\Filesystem\FilesystemManager;
use RuntimeException;
use Sentry\Laravel\Features\Feature;
class Integration extends Feature
{
private const FEATURE_KEY = 'storage';
private const STORAGE_DRIVER_NAME = 'sentry';
public function isApplicable(): bool
{
// Since we only register the driver this feature is always applicable
return true;
}
public function register(): void
{
$this->container()->afterResolving(FilesystemManager::class, function (FilesystemManager $filesystemManager): void {
$filesystemManager->extend(
self::STORAGE_DRIVER_NAME,
function (Application $application, array $config) use ($filesystemManager): Filesystem {
if (empty($config['sentry_disk_name'])) {
throw new RuntimeException(sprintf('Missing `sentry_disk_name` config key for `%s` filesystem driver.', self::STORAGE_DRIVER_NAME));
}
if (empty($config['sentry_original_driver'])) {
throw new RuntimeException(sprintf('Missing `sentry_original_driver` config key for `%s` filesystem driver.', self::STORAGE_DRIVER_NAME));
}
if ($config['sentry_original_driver'] === self::STORAGE_DRIVER_NAME) {
throw new RuntimeException(sprintf('`sentry_original_driver` for Sentry storage integration cannot be the `%s` driver.', self::STORAGE_DRIVER_NAME));
}
$disk = $config['sentry_disk_name'];
$config['driver'] = $config['sentry_original_driver'];
unset($config['sentry_original_driver']);
$diskResolver = (function (string $disk, array $config) {
// This is a "hack" to make sure that the original driver is resolved by the FilesystemManager
config(["filesystems.disks.{$disk}" => $config]);
/** @var FilesystemManager $this */
return $this->resolve($disk);
})->bindTo($filesystemManager, FilesystemManager::class);
/** @var Filesystem $originalFilesystem */
$originalFilesystem = $diskResolver($disk, $config);
$defaultData = ['disk' => $disk, 'driver' => $config['driver']];
$recordSpans = $config['sentry_enable_spans'] ?? $this->isTracingFeatureEnabled(self::FEATURE_KEY);
$recordBreadcrumbs = $config['sentry_enable_breadcrumbs'] ?? $this->isBreadcrumbFeatureEnabled(self::FEATURE_KEY);
if ($originalFilesystem instanceof AwsS3V3Adapter) {
return new SentryS3V3Adapter($originalFilesystem, $defaultData, $recordSpans, $recordBreadcrumbs);
}
if ($originalFilesystem instanceof FilesystemAdapter) {
return new SentryFilesystemAdapter($originalFilesystem, $defaultData, $recordSpans, $recordBreadcrumbs);
}
if ($originalFilesystem instanceof CloudFilesystem) {
return new SentryCloudFilesystem($originalFilesystem, $defaultData, $recordSpans, $recordBreadcrumbs);
}
return new SentryFilesystem($originalFilesystem, $defaultData, $recordSpans, $recordBreadcrumbs);
}
);
});
}
/**
* Decorates the configuration for a single disk with Sentry driver configuration.
* This replaces the driver with a custom driver that will capture performance traces and breadcrumbs.
*
* The custom driver will be an instance of @see \Sentry\Laravel\Features\Storage\SentryS3V3Adapter
* if the original driver is an @see \Illuminate\Filesystem\AwsS3V3Adapter,
* and an instance of @see \Sentry\Laravel\Features\Storage\SentryFilesystemAdapter
* if the original driver is an @see \Illuminate\Filesystem\FilesystemAdapter.
* If the original driver is neither of those, it will be @see \Sentry\Laravel\Features\Storage\SentryFilesystem
* or @see \Sentry\Laravel\Features\Storage\SentryCloudFilesystem based on the contract of the original driver.
*
* You might run into problems if you expect another specific driver class.
*
* @param array<string, mixed> $diskConfig
*
* @return array<string, mixed>
*/
public static function configureDisk(string $diskName, array $diskConfig, bool $enableSpans = true, bool $enableBreadcrumbs = true): array
{
$currentDriver = $diskConfig['driver'];
if ($currentDriver !== self::STORAGE_DRIVER_NAME) {
$diskConfig['driver'] = self::STORAGE_DRIVER_NAME;
$diskConfig['sentry_disk_name'] = $diskName;
$diskConfig['sentry_original_driver'] = $currentDriver;
$diskConfig['sentry_enable_spans'] = $enableSpans;
$diskConfig['sentry_enable_breadcrumbs'] = $enableBreadcrumbs;
}
return $diskConfig;
}
/**
* Decorates the configuration for all disks with Sentry driver configuration.
*
* @see self::configureDisk()
*
* @param array<string, array<string, mixed>> $diskConfigs
*
* @return array<string, array<string, mixed>>
*/
public static function configureDisks(array $diskConfigs, bool $enableSpans = true, bool $enableBreadcrumbs = true): array
{
$diskConfigsWithSentryDriver = [];
foreach ($diskConfigs as $diskName => $diskConfig) {
$diskConfigsWithSentryDriver[$diskName] = static::configureDisk($diskName, $diskConfig, $enableSpans, $enableBreadcrumbs);
}
return $diskConfigsWithSentryDriver;
}
}