import {Fragment} from 'react'; import ExternalLink from 'sentry/components/links/externalLink'; import {Layout, LayoutProps} from 'sentry/components/onboarding/gettingStartedDoc/layout'; import {ModuleProps} from 'sentry/components/onboarding/gettingStartedDoc/sdkDocumentation'; import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/step'; import {t, tct} from 'sentry/locale'; // Configuration Start const introduction = tct( "There are two variants of Sentry available for Spring Boot. If you're using Spring Boot 2, use [springBootStarterLink:sentry-spring-boot-starter]. If you're using Spring Boot 3, use [springBootStarterJakartaLink:sentry-spring-boot-starter-jakarta] instead. Sentry's integration with [springBootLink:Spring Boot] supports Spring Boot 2.1.0 and above to report unhandled exceptions as well as release and registration of beans. If you're on an older version, use [legacyIntegrationLink:our legacy integration].", { springBootStarterLink: ( ), springBootStarterJakartaLink: ( ), springBootLink: , legacyIntegrationLink: ( ), } ); export const steps = ({ dsn, }: { dsn?: string; } = {}): LayoutProps['steps'] => [ { type: StepType.INSTALL, description: t('Install using either Maven or Gradle:'), configurations: [ { description:
{t('Maven')}
, configurations: [ { language: 'xml', description: {t('Spring Boot 2')}, code: ` io.sentry sentry-spring-boot-starter {{@inject packages.version('sentry.java.spring-boot', '4.0.0') }} `, }, { language: 'xml', description: {t('Spring Boot 3')}, code: ` io.sentry sentry-spring-boot-starter-jakarta {{@inject packages.version('sentry.java.spring-boot.jakarta', '6.7.0') }} `, }, ], }, { description:
{t('Graddle')}
, configurations: [ { language: 'properties', description: {t('Spring Boot 2')}, code: "implementation 'io.sentry:sentry-spring-boot-starter:{{@inject packages.version('sentry.java.spring-boot', '4.0.0') }}'", }, { language: 'properties', description: {t('Spring Boot 3')}, code: "implementation 'io.sentry:sentry-spring-boot-starter-jakarta:{{@inject packages.version('sentry.java.spring-boot.jakarta', '6.7.0') }}'", }, ], }, ], }, { type: StepType.CONFIGURE, description: (

{tct( 'Open up [code:src/main/application.properties] (or [code:src/main/application.yml]) and configure the DSN, and any other settings you need:', { code: , } )}

), configurations: [ { language: 'properties', description: (

{tct('Modify [code:src/main/application.properties]:', {code: })}

), code: ` sentry.dsn=${dsn} # Set traces-sample-rate to 1.0 to capture 100% of transactions for performance monitoring. # We recommend adjusting this value in production. sentry.traces-sample-rate=1.0 `, }, { language: 'properties', description: (

{tct('Or, modify [code:src/main/application.yml]:', {code: })}

), code: ` sentry: dsn:${dsn} # Set traces-sample-rate to 1.0 to capture 100% of transactions for performance monitoring. # We recommend adjusting this value in production. traces-sample-rate: 1.0 `, additionalInfo: (

{tct( 'If you use Logback for logging you may also want to send error logs to Sentry. Add a dependency to the [code:sentry-logback] module using either Maven or Gradle. Sentry Spring Boot Starter will auto-configure [code:SentryAppender].', {code: } )}

), }, { description:
{t('Maven')}
, configurations: [ { language: 'xml', code: ` io.sentry sentry-logback {{@inject packages.version('sentry.java.logback', '4.0.0') }} `, }, { language: 'xml', description: t( 'To upload your source code to Sentry so it can be shown in stack traces, use our Maven plugin.' ), code: ` io.sentry sentry-maven-plugin {{@inject packages.version('sentry.java.mavenplugin', '0.0.2') }} true /path/to/sentry-cli ___ORG_SLUG___ ___PROJECT_SLUG___ env.SENTRY_AUTH_TOKEN} generate-resources uploadSourceBundle ... `, }, ], }, { description:
{t('Gradle')}
, configurations: [ { language: 'properties', code: "implementation 'io.sentry:sentry-logback:{{@inject packages.version('sentry.java.logback', '4.0.0') }}'", }, { language: 'javascript', // TODO: This shouldn't be javascript but because of better formatting we use it for now description: t( 'To upload your source code to Sentry so it can be shown in stack traces, use our Gradle plugin.' ), code: ` buildscript { repositories { mavenCentral() } } plugins { id "io.sentry.jvm.gradle" version "{{@inject packages.version('sentry.java.android.gradle-plugin', '3.9.0') }}" } sentry { // Generates a JVM (Java, Kotlin, etc.) source bundle and uploads your source code to Sentry. // This enables source context, allowing you to see your source // code as part of your stack traces in Sentry. includeSourceContext = true org = "___ORG_SLUG___" projectName = "___PROJECT_SLUG___" authToken = "your-sentry-auth-token" } `, }, ], }, ], }, { type: StepType.VERIFY, description: t( 'Then create an intentional error, so you can test that everything is working using either Java or Kotlin:' ), configurations: [ { description:
Java
, language: 'javascript', // TODO: This shouldn't be javascript but because of better formatting we use it for now code: ` import java.lang.Exception; import io.sentry.Sentry; try { throw new Exception("This is a test."); } catch (Exception e) { Sentry.captureException(e); } `, }, { description:
Kotlin
, language: 'javascript', // TODO: This shouldn't be javascript but because of better formatting we use it for now code: ` import java.lang.Exception import io.sentry.Sentry try { throw Exception("This is a test.") } catch (e: Exception) { Sentry.captureException(e) } `, }, ], additionalInfo: (

{t( "If you're new to Sentry, use the email alert to access your account and complete a product tour." )}

{t( "If you're an existing user and have disabled alerts, you won't receive this email." )}

), }, { title: t('Measure Performance'), description: (

{tct( 'Each incoming Spring MVC HTTP request is automatically turned into a transaction. To create spans around bean method executions, annotate bean method with [code:@SentrySpan] annotation:', {code: } )}

), configurations: [ { description:
Java
, configurations: [ { language: 'javascript', // TODO: This shouldn't be javascript but because of better formatting we use it for now description: {t('Spring Boot 2')}, code: ` import org.springframework.stereotype.Component; import io.sentry.spring.tracing.SentrySpan; @Component class PersonService { @SentrySpan Person findById(Long id) { ... } } `, }, { language: 'javascript', // TODO: This shouldn't be javascript but because of better formatting we use it for now description: {t('Spring Boot 3')}, code: ` import org.springframework.stereotype.Component; import io.sentry.spring.jakarta.tracing.SentrySpan; @Component class PersonService { @SentrySpan Person findById(Long id) { ... } } `, }, ], }, { description:
Kotlin
, configurations: [ { language: 'javascript', // TODO: This shouldn't be javascript but because of better formatting we use it for now description: {t('Spring Boot 2')}, code: ` import org.springframework.stereotype.Component import io.sentry.spring.tracing.SentrySpan @Component class PersonService { @SentrySpan(operation = "task") fun findById(id: Long): Person { ... } } `, }, { language: 'javascript', // TODO: This shouldn't be javascript but because of better formatting we use it for now description: {t('Spring Boot 3')}, code: ` import org.springframework.stereotype.Component import io.sentry.spring.jakarta.tracing.SentrySpan @Component class PersonService { @SentrySpan(operation = "task") fun findById(id: Long): Person { ... } } `, }, ], }, ], additionalInfo: (

{tct( 'Check out [docLink:the documentation] to learn more about the API and integrated instrumentations.', { docLink: ( ), } )}

), }, ]; // Configuration End export function GettingStartedWithSpringBoot({dsn, ...props}: ModuleProps) { return ; } export default GettingStartedWithSpringBoot;