import ExternalLink from 'sentry/components/links/externalLink'; import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/step'; import { Docs, DocsParams, OnboardingConfig, } from 'sentry/components/onboarding/gettingStartedDoc/types'; import replayOnboardingJsLoader from 'sentry/gettingStartedDocs/javascript/jsLoader/jsLoader'; import {t, tct} from 'sentry/locale'; type Params = DocsParams; const getExceptionHandlerSnippet = () => ` public function register() { $this->reportable(function (Throwable $e) { if (app()->bound('sentry')) { app('sentry')->captureException($e); } }); }`; const getConfigureSnippet = (params: Params) => `SENTRY_LARAVEL_DSN=${params.dsn}${ params.isPerformanceSelected ? ` # Specify a fixed sample rate SENTRY_TRACES_SAMPLE_RATE=1.0` : '' }${ params.isProfilingSelected ? ` # Set a sampling rate for profiling - this is relative to traces_sample_rate SENTRY_PROFILES_SAMPLE_RATE=1.0` : '' }`; const getMetricsInstallSnippet = () => ` composer install sentry/sentry-laravel composer update sentry/sentry-laravel -W`; const getMetricsVerifySnippet = () => ` use function \\Sentry\\metrics; // Add 4 to a counter named 'hits' metrics()->increment('hits', 4); metrics()->flush(); // We recommend registering the flush call in a shutdown function register_shutdown_function(static fn () => metrics()->flush()); // Or call flush in a Terminable Middleware use Closure; use Illuminate\\Http\\Request; use Symfony\\Component\\HttpFoundation\\Response; use function \\Sentry\\metrics; class SentryMetricsMiddleware { public function handle(Request $request, Closure $next): Response { return $next($request); } public function terminate(Request $request, Response $response): void { metrics()->flush(); } }`; const onboarding: OnboardingConfig = { introduction: () => tct( 'This guide is for Laravel 8+. We also provide instructions for [otherVersionsLink:other versions] as well as [lumenSpecificLink:Lumen-specific instructions].', { otherVersionsLink: ( ), lumenSpecificLink: ( ), } ), install: (params: Params) => [ { type: StepType.INSTALL, configurations: [ { description: tct('Install the [code:sentry/sentry-laravel] package:', { code: , }), language: 'bash', code: `composer require sentry/sentry-laravel`, }, ...(params.isProfilingSelected ? [ { description: t('Install the Excimer extension via PECL:'), language: 'bash', code: 'pecl install excimer', }, ] : []), { description: tct( 'Enable capturing unhandled exception to report to Sentry by making the following change to your [code:App/Exceptions/Handler.php]:', { code: , } ), language: 'php', code: getExceptionHandlerSnippet(), }, ], }, ], configure: (params: Params) => [ { type: StepType.CONFIGURE, configurations: [ { description: t('Configure the Sentry DSN with this command:'), language: 'shell', code: `php artisan sentry:publish --dsn=${params.dsn}`, }, { description: tct( 'It creates the config file ([sentryPHPCode:config/sentry.php]) and adds the [dsnCode:DSN] to your [envCode:.env] file where you can add further configuration options:', {sentryPHPCode: , dsnCode: , envCode: } ), language: 'shell', code: getConfigureSnippet(params), }, ], }, ], verify: () => [ { type: StepType.VERIFY, configurations: [ { description: tct( 'You can test your configuration using the provided [code:sentry:test] artisan command:', { code: , } ), language: 'shell', code: 'php artisan sentry:test', }, ], }, ], nextSteps: () => [], }; const customMetricsOnboarding: OnboardingConfig = { install: () => [ { type: StepType.INSTALL, description: tct( 'You need a minimum version [codeVersionLaravel:4.0.0] of the Laravel SDK and a minimum version [codeVersion:4.3.0] of the PHP SDK installed', { codeVersionLaravel: , codeVersion: , } ), configurations: [ { language: 'bash', code: getMetricsInstallSnippet(), }, ], }, ], configure: () => [ { type: StepType.CONFIGURE, description: tct( 'Once the SDK is installed or updated, you can enable code locations being emitted with your metricsin your [code:config/sentry.php] file:', { code: , } ), configurations: [ { code: [ { label: 'PHP', value: 'php', language: 'php', code: `'metric_code_locations' => true,`, }, ], }, ], }, ], verify: () => [ { type: StepType.VERIFY, description: tct( "Then you'll be able to add metrics as [codeCounters:counters], [codeSets:sets], [codeDistribution:distributions], and [codeGauge:gauges]. Try out this example:", { codeCounters: , codeSets: , codeDistribution: , codeGauge: , codeNamespace: , } ), configurations: [ { code: [ { label: 'PHP', value: 'php', language: 'php', code: getMetricsVerifySnippet(), }, ], }, { description: t( 'With a bit of delay you can see the data appear in the Sentry UI.' ), }, { description: tct( 'Learn more about metrics and how to configure them, by reading the [docsLink:docs].', { docsLink: ( ), } ), }, ], }, ], }; const docs: Docs = { onboarding, replayOnboardingJsLoader, customMetricsOnboarding, }; export default docs;