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;