import ExternalLink from 'sentry/components/links/externalLink'; import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/step'; import type { Docs, DocsParams, OnboardingConfig, } from 'sentry/components/onboarding/gettingStartedDoc/types'; import { getCrashReportModalConfigDescription, getCrashReportModalIntroduction, getCrashReportSDKInstallFirstStepRails, } from 'sentry/components/onboarding/gettingStartedDoc/utils/feedbackOnboarding'; import {getRubyMetricsOnboarding} from 'sentry/components/onboarding/gettingStartedDoc/utils/metricsOnboarding'; import replayOnboardingJsLoader from 'sentry/gettingStartedDocs/javascript/jsLoader/jsLoader'; import {t, tct} from 'sentry/locale'; type Params = DocsParams; const getInstallSnippet = ( params: Params ) => `${params.isProfilingSelected ? 'gem "stackprof"\n' : ''}gem "sentry-ruby" gem "sentry-rails"`; const generatorSnippet = 'bin/rails generate sentry'; const getConfigureSnippet = (params: Params) => ` Sentry.init do |config| config.dsn = '${params.dsn.public}' config.breadcrumbs_logger = [:active_support_logger, :http_logger]${ params.isPerformanceSelected ? ` # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. # We recommend adjusting this value in production. config.traces_sample_rate = 1.0 # or config.traces_sampler = lambda do |context| true end` : '' }${ params.isProfilingSelected ? ` # Set profiles_sample_rate to profile 100% # of sampled transactions. # We recommend adjusting this value in production. config.profiles_sample_rate = 1.0` : '' } end`; const getVerifySnippet = () => ` begin 1 / 0 rescue ZeroDivisionError => exception Sentry.capture_exception(exception) end Sentry.capture_message("test message")`; const onboarding: OnboardingConfig = { introduction: () => t( 'In Rails, all uncaught exceptions will be automatically reported. We support Rails 5 and newer.' ), install: (params: Params) => [ { type: StepType.INSTALL, description: tct( 'The Sentry SDK for Rails comes as two gems that should be added to your [gemfileCode:Gemfile]:', { gemfileCode: , } ), configurations: [ { description: params.isProfilingSelected ? tct( 'Ruby Profiling beta is available since SDK version 5.9.0. We use the [stackprofLink:stackprof gem] to collect profiles for Ruby. Make sure [stackprofCode:stackprof] is loaded before [sentryRubyCode:sentry-ruby].', { stackprofLink: ( ), stackprofCode: , sentryRubyCode: , } ) : undefined, language: 'ruby', code: getInstallSnippet(params), }, { description: t('After adding the gems, run the following to install the SDK:'), language: 'ruby', code: 'bundle install', }, ], }, ], configure: (params: Params) => [ { type: StepType.CONFIGURE, description: tct( 'Run the following Rails generator to create the initializer file [code:config/initializers/sentry.rb].', { code: , } ), configurations: [ { language: 'ruby', code: generatorSnippet, }, { description: t('You can then change the Sentry configuration as follows:'), }, { language: 'ruby', code: getConfigureSnippet(params), }, ], }, ], verify: () => [ { type: StepType.VERIFY, description: t( "This snippet contains a deliberate error and message sent to Sentry and can be used as a test to make sure that everything's working as expected." ), configurations: [ { code: [ { label: 'ruby', value: 'ruby', language: 'ruby', code: getVerifySnippet(), }, ], }, ], }, ], nextSteps: () => [], }; const crashReportOnboarding: OnboardingConfig = { introduction: () => getCrashReportModalIntroduction(), install: (params: Params) => [ { type: StepType.INSTALL, description: tct( "In Rails, being able to serve dynamic pages in response to errors is required to pass the needed [codeEvent:event_id] to the JavaScript SDK. [link:Read our docs] to learn more. Once you're able to serve dynamic exception pages, you can support user feedback.", { codeEvent: , link: ( ), } ), configurations: [ getCrashReportSDKInstallFirstStepRails(params), { description: t( 'Additionally, you need the template that brings up the dialog:' ), code: [ { label: 'ERB', value: 'erb', language: 'erb', code: `<% sentry_id = request.env["sentry.error_event_id"] %> <% if sentry_id.present? %> <% end %>`, }, ], }, ], }, ], configure: () => [ { type: StepType.CONFIGURE, description: getCrashReportModalConfigDescription({ link: 'https://docs.sentry.io/platforms/ruby/guides/rails/user-feedback/configuration/#crash-report-modal', }), }, ], verify: () => [], nextSteps: () => [], }; const docs: Docs = { onboarding, customMetricsOnboarding: getRubyMetricsOnboarding(), replayOnboardingJsLoader, crashReportOnboarding, }; export default docs;