Browse Source

ref(getting-started-docs): Migrate java frameworks docs to sentry main repo (#53139)

Priscila Oliveira 1 year ago
parent
commit
4812d4c6c0

+ 4 - 0
static/app/components/onboarding/gettingStartedDoc/sdkDocumentation.tsx

@@ -39,7 +39,11 @@ export const migratedDocs = [
   'python-aiohttp',
   'python-awslambda',
   'react-native',
+  'java',
   'java-spring-boot',
+  'java-logback',
+  'java-log4j2',
+  'java-spring',
   'php',
   'php-laravel',
   'php-symfony',

+ 20 - 0
static/app/gettingStartedDocs/java/java.spec.tsx

@@ -0,0 +1,20 @@
+import {render, screen} from 'sentry-test/reactTestingLibrary';
+
+import {StepTitle} from 'sentry/components/onboarding/gettingStartedDoc/step';
+
+import {GettingStartedWithJava, steps} from './java';
+
+describe('GettingStartedWithJava', function () {
+  it('renders doc correctly', function () {
+    const {container} = render(<GettingStartedWithJava dsn="test-dsn" />);
+
+    // Steps
+    for (const step of steps()) {
+      expect(
+        screen.getByRole('heading', {name: step.title ?? StepTitle[step.type]})
+      ).toBeInTheDocument();
+    }
+
+    expect(container).toSnapshot();
+  });
+});

+ 279 - 0
static/app/gettingStartedDocs/java/java.tsx

@@ -0,0 +1,279 @@
+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(
+  'Sentry for Java is a collection of modules provided by Sentry; it supports Java 1.8 and above. At its core, Sentry for Java provides a raw client for sending events to Sentry. If you use [strong:Spring Boot, Spring, Logback, or Log4j2], we recommend visiting our Sentry Java documentation for installation instructions.',
+  {
+    strong: <strong />,
+    link: <ExternalLink href="https://docs.sentry.io/platforms/java/" />,
+  }
+);
+
+export const steps = ({
+  dsn,
+}: {
+  dsn?: string;
+} = {}): LayoutProps['steps'] => [
+  {
+    type: StepType.INSTALL,
+    description: t('Install the SDK via Gradle, Maven, or SBT:'),
+    configurations: [
+      {
+        description: <h5>{t('Gradle')}</h5>,
+        configurations: [
+          {
+            language: 'groovy',
+            description: (
+              <p>
+                {tct('For Gradle, add to your [code:build.gradle] file:', {
+                  code: <code />,
+                })}
+              </p>
+            ),
+            code: `
+// Make sure mavenCentral is there.
+repositories {
+    mavenCentral()
+}
+
+// Add Sentry's SDK as a dependency.
+dependencies {
+    implementation 'io.sentry:sentry:6.25.2'
+}
+          `,
+          },
+          {
+            language: 'groovy',
+            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 "3.11.1"
+}
+
+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"
+}
+        `,
+          },
+        ],
+      },
+      {
+        description: <h5>{t('Maven')}</h5>,
+        configurations: [
+          {
+            language: 'xml',
+            description: (
+              <p>
+                {tct('For Maven, add to your [code:pom.xml] file:', {code: <code />})}
+              </p>
+            ),
+            code: `
+<dependency>
+  <groupId>io.sentry</groupId>
+  <artifactId>sentry</artifactId>
+  <version>6.25.2</version>
+</dependency>
+            `,
+          },
+          {
+            language: 'xml',
+            description: t(
+              'To upload your source code to Sentry so it can be shown in stack traces, use our Maven plugin.'
+            ),
+            code: `
+<build>
+  <plugins>
+    <plugin>
+      <groupId>io.sentry</groupId>
+      <artifactId>sentry-maven-plugin</artifactId>
+      <version>0.0.2</version>
+      <configuration>
+      <!-- for showing output of sentry-cli -->
+      <debugSentryCli>true</debugSentryCli>
+
+      <!-- download the latest sentry-cli and provide path to it here -->
+      <!-- download it here: https://github.com/getsentry/sentry-cli/releases -->
+      <!-- minimum required version is 2.17.3 -->
+      <sentryCliExecutablePath>/path/to/sentry-cli</sentryCliExecutablePath>
+
+      <org>___ORG_SLUG___</org>
+
+      <project>___PROJECT_SLUG___</project>
+
+      <!-- in case you're self hosting, provide the URL here -->
+      <!--<url>http://localhost:8000/</url>-->
+
+      <!-- provide your auth token via SENTRY_AUTH_TOKEN environment variable -->
+      <!-- you can find it in Sentry UI: Settings > Account > API > Auth Tokens -->
+      <authToken>env.SENTRY_AUTH_TOKEN</authToken>
+      </configuration>
+      <executions>
+        <execution>
+            <phase>generate-resources</phase>
+            <goals>
+                <goal>uploadSourceBundle</goal>
+            </goals>
+        </execution>
+      </executions>
+    </plugin>
+  </plugins>
+...
+</build>
+            `,
+          },
+        ],
+      },
+      {
+        description: <h5>{t('SBT')}</h5>,
+        configurations: [
+          {
+            description: <p>{tct('For [strong:SBT]:', {strong: <strong />})}</p>,
+            language: 'scala',
+            code: `libraryDependencies += "io.sentry" % "sentry" % "6.25.2"`,
+          },
+        ],
+      },
+    ],
+    additionalInfo: (
+      <p>
+        {tct(
+          'To upload your source code to Sentry so it can be shown in stack traces, please refer to [link:Manually Uploading Source Context].',
+          {
+            link: (
+              <ExternalLink href="https://docs.sentry.io/platforms/java/source-context/" />
+            ),
+          }
+        )}
+      </p>
+    ),
+  },
+  {
+    type: StepType.CONFIGURE,
+    description: t(
+      "Configure Sentry as soon as possible in your application's lifecycle:"
+    ),
+    configurations: [
+      {
+        language: 'java',
+        code: `
+import io.sentry.Sentry;
+
+Sentry.init(options -> {
+  options.setDsn("${dsn}");
+  // Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring.
+  // We recommend adjusting this value in production.
+  options.setTracesSampleRate(1.0);
+  // When first trying Sentry it's good to see what the SDK is doing:
+  options.setDebug(true);
+});
+      `,
+      },
+    ],
+  },
+  {
+    type: StepType.VERIFY,
+    description: (
+      <p>
+        {tct(
+          'Trigger your first event from your development environment by intentionally creating an error with the [code:Sentry#captureException] method, to test that everything is working:',
+          {code: <code />}
+        )}
+      </p>
+    ),
+    configurations: [
+      {
+        language: 'java',
+        code: `
+import java.lang.Exception;
+import io.sentry.Sentry;
+
+try {
+  throw new Exception("This is a test.");
+} catch (Exception e) {
+  Sentry.captureException(e);
+}
+      `,
+      },
+    ],
+    additionalInfo: (
+      <Fragment>
+        <p>
+          {t(
+            "If you're new to Sentry, use the email alert to access your account and complete a product tour."
+          )}
+        </p>
+        <p>
+          {t(
+            "If you're an existing user and have disabled alerts, you won't receive this email."
+          )}
+        </p>
+      </Fragment>
+    ),
+  },
+  {
+    title: t('Measure Performance'),
+    description: t('You can capture transactions using the SDK. For example:'),
+    configurations: [
+      {
+        language: 'java',
+        code: `
+import io.sentry.ITransaction;
+import io.sentry.Sentry;
+import io.sentry.SpanStatus;
+
+// A good name for the transaction is key, to help identify what this is about
+ITransaction transaction = Sentry.startTransaction("processOrderBatch()", "task");
+try {
+processOrderBatch();
+} catch (Exception e) {
+transaction.setThrowable(e);
+transaction.setStatus(SpanStatus.INTERNAL_ERROR);
+throw e;
+} finally {
+transaction.finish();
+}
+        `,
+      },
+    ],
+    additionalInfo: (
+      <p>
+        {tct(
+          'For more information about the API and automatic instrumentations included in the SDK, [link:visit the docs].',
+          {
+            link: (
+              <ExternalLink href="https://docs.sentry.io/platforms/java/performance/" />
+            ),
+          }
+        )}
+      </p>
+    ),
+  },
+];
+// Configuration End
+
+export function GettingStartedWithJava({dsn, ...props}: ModuleProps) {
+  return <Layout steps={steps({dsn})} introduction={introduction} {...props} />;
+}
+
+export default GettingStartedWithJava;

+ 20 - 0
static/app/gettingStartedDocs/java/log4j2.spec.tsx

@@ -0,0 +1,20 @@
+import {render, screen} from 'sentry-test/reactTestingLibrary';
+
+import {StepTitle} from 'sentry/components/onboarding/gettingStartedDoc/step';
+
+import {GettingStartedWithLog4j2, steps} from './log4j2';
+
+describe('GettingStartedWithLog4j2', function () {
+  it('renders doc correctly', function () {
+    const {container} = render(<GettingStartedWithLog4j2 dsn="test-dsn" />);
+
+    // Steps
+    for (const step of steps()) {
+      expect(
+        screen.getByRole('heading', {name: step.title ?? StepTitle[step.type]})
+      ).toBeInTheDocument();
+    }
+
+    expect(container).toSnapshot();
+  });
+});

+ 267 - 0
static/app/gettingStartedDocs/java/log4j2.tsx

@@ -0,0 +1,267 @@
+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(
+  'The [code:sentry-log4j2] library provides [log4jLink:Log4j 2.x] support for Sentry via an [appenderLink:Appender] that sends logged exceptions to Sentry.',
+  {
+    log4jLink: <ExternalLink href="https://logging.apache.org/log4j/2.x//" />,
+    appenderLink: (
+      <ExternalLink href="https://logging.apache.org/log4j/2.x/manual/appenders.html" />
+    ),
+    code: <code />,
+  }
+);
+
+export const steps = ({
+  dsn,
+}: {
+  dsn?: string;
+} = {}): LayoutProps['steps'] => [
+  {
+    type: StepType.INSTALL,
+    description: t(
+      "Install Sentry's integration with Log4j 2.x using either Maven or Gradle:"
+    ),
+    configurations: [
+      {
+        description: <h5>{t('Maven')}</h5>,
+        configurations: [
+          {
+            language: 'xml',
+            code: `
+<dependency>
+  <groupId>io.sentry</groupId>
+  <artifactId>sentry-log4j2</artifactId>
+  <version>6.25.2</version>
+</dependency>
+          `,
+          },
+          {
+            language: 'xml',
+            description: t(
+              'To upload your source code to Sentry so it can be shown in stack traces, use our Maven plugin.'
+            ),
+            code: `
+<build>
+  <plugins>
+    <plugin>
+      <groupId>io.sentry</groupId>
+      <artifactId>sentry-maven-plugin</artifactId>
+      <version>0.0.2</version>
+      <configuration>
+      <!-- for showing output of sentry-cli -->
+      <debugSentryCli>true</debugSentryCli>
+
+      <!-- download the latest sentry-cli and provide path to it here -->
+      <!-- download it here: https://github.com/getsentry/sentry-cli/releases -->
+      <!-- minimum required version is 2.17.3 -->
+      <sentryCliExecutablePath>/path/to/sentry-cli</sentryCliExecutablePath>
+
+      <org>___ORG_SLUG___</org>
+
+      <project>___PROJECT_SLUG___</project>
+
+      <!-- in case you're self hosting, provide the URL here -->
+      <!--<url>http://localhost:8000/</url>-->
+
+      <!-- provide your auth token via SENTRY_AUTH_TOKEN environment variable -->
+      <!-- you can find it in Sentry UI: Settings > Account > API > Auth Tokens -->
+      <authToken>env.SENTRY_AUTH_TOKEN</authToken>
+      </configuration>
+      <executions>
+        <execution>
+          <phase>generate-resources</phase>
+          <goals>
+          <goal>uploadSourceBundle</goal>
+          </goals>
+        </execution>
+      </executions>
+    </plugin>
+  </plugins>
+  ...
+</build>
+        `,
+          },
+        ],
+      },
+      {
+        description: <h5>{t('Graddle')}</h5>,
+        configurations: [
+          {
+            language: 'groovy',
+            code: "implementation 'io.sentry:sentry-log4j2:6.25.2'",
+          },
+          {
+            description: t(
+              'To upload your source code to Sentry so it can be shown in stack traces, use our Gradle plugin.'
+            ),
+            language: 'groovy',
+            code: `
+buildscript {
+  repositories {
+    mavenCentral()
+  }
+}
+
+plugins {
+  id "io.sentry.jvm.gradle" version "3.11.1"
+}
+
+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.CONFIGURE,
+    description: t(
+      "Configure Sentry as soon as possible in your application's lifecycle:"
+    ),
+    configurations: [
+      {
+        language: 'xml',
+        description: (
+          <p>
+            {tct(
+              'The following example using the [log4j2Code:log4j2.xml] format to configure a [sentryAppenderCode:ConsoleAppender] that logs to standard out at the INFO level, and a [code:SentryAppender] that logs to the Sentry server at the ERROR level.',
+              {log4j2Code: <code />, sentryAppenderCode: <code />}
+            )}
+          </p>
+        ),
+        code: `
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration status="warn" packages="org.apache.logging.log4j.core,io.sentry.log4j2">
+    <Appenders>
+        <Console name="Console" target="SYSTEM_OUT">
+            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
+        </Console>
+        <Sentry name="Sentry"
+                dsn=${dsn}>
+    </Appenders>
+    <Loggers>
+        <Root level="info">
+            <AppenderRef ref="Sentry"/>
+            <AppenderRef ref="Console"/>
+        </Root>
+    </Loggers>
+</Configuration>
+        `,
+        additionalInfo: (
+          <p>
+            {tct(
+              "You'll also need to configure your DSN (client key) if it's not already in the [code:log4j2.xml] configuration. Learn more in [link:our documentation for DSN configuration].",
+              {
+                code: <code />,
+                link: (
+                  <ExternalLink href="https://docs.sentry.io/platforms/java/guides/log4j2/#dsn-configuration" />
+                ),
+              }
+            )}
+          </p>
+        ),
+      },
+      {
+        description: (
+          <p>
+            {tct(
+              "Next, you'll need to set your log levels, as illustrated here. You can learn more about [link:configuring log levels] in our documentation.",
+              {
+                link: (
+                  <ExternalLink href="https://docs.sentry.io/platforms/java/guides/log4j2/#configure" />
+                ),
+              }
+            )}
+          </p>
+        ),
+        configurations: [
+          {
+            language: 'xml',
+            code: `
+<!-- Setting minimumBreadcrumbLevel modifies the default minimum level to add breadcrumbs from INFO to DEBUG  -->
+<!-- Setting minimumEventLevel the default minimum level to capture an event from ERROR to WARN  -->
+<Sentry name="Sentry"
+        dsn="${dsn}"
+        minimumBreadcrumbLevel="DEBUG"
+        minimumEventLevel="WARN"
+/>
+          `,
+          },
+        ],
+      },
+    ],
+  },
+  {
+    type: StepType.VERIFY,
+    description: t(
+      'Last, create an intentional error, so you can test that everything is working:'
+    ),
+    configurations: [
+      {
+        description: <h5>Java</h5>,
+        language: 'java',
+        code: `
+import java.lang.Exception;
+import io.sentry.Sentry;
+
+try {
+  throw new Exception("This is a test.");
+} catch (Exception e) {
+  Sentry.captureException(e);
+}
+        `,
+      },
+      {
+        description: <h5>Kotlin</h5>,
+        language: 'java',
+        code: `
+import java.lang.Exception
+import io.sentry.Sentry
+
+try {
+  throw Exception("This is a test.")
+} catch (e: Exception) {
+  Sentry.captureException(e)
+}
+        `,
+      },
+    ],
+    additionalInfo: (
+      <Fragment>
+        <p>
+          {t(
+            "If you're new to Sentry, use the email alert to access your account and complete a product tour."
+          )}
+        </p>
+        <p>
+          {t(
+            "If you're an existing user and have disabled alerts, you won't receive this email."
+          )}
+        </p>
+      </Fragment>
+    ),
+  },
+];
+// Configuration End
+
+export function GettingStartedWithLog4j2({dsn, ...props}: ModuleProps) {
+  return <Layout steps={steps({dsn})} introduction={introduction} {...props} />;
+}
+
+export default GettingStartedWithLog4j2;

+ 20 - 0
static/app/gettingStartedDocs/java/logback.spec.tsx

@@ -0,0 +1,20 @@
+import {render, screen} from 'sentry-test/reactTestingLibrary';
+
+import {StepTitle} from 'sentry/components/onboarding/gettingStartedDoc/step';
+
+import {GettingStartedWithLogBack, steps} from './logback';
+
+describe('GettingStartedWithLogBack', function () {
+  it('renders doc correctly', function () {
+    const {container} = render(<GettingStartedWithLogBack dsn="test-dsn" />);
+
+    // Steps
+    for (const step of steps()) {
+      expect(
+        screen.getByRole('heading', {name: step.title ?? StepTitle[step.type]})
+      ).toBeInTheDocument();
+    }
+
+    expect(container).toSnapshot();
+  });
+});

+ 277 - 0
static/app/gettingStartedDocs/java/logback.tsx

@@ -0,0 +1,277 @@
+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(
+  'The sentry-logback library provides Logback support for Sentry using an [link:Appender] that sends logged exceptions to Sentry.',
+  {
+    link: (
+      <ExternalLink href="https://logback.qos.ch/apidocs/ch/qos/logback/core/Appender.html" />
+    ),
+  }
+);
+
+export const steps = ({
+  dsn,
+}: {
+  dsn?: string;
+} = {}): LayoutProps['steps'] => [
+  {
+    type: StepType.INSTALL,
+    description: t(
+      "Install Sentry's integration with Logback using either Maven or Gradle:"
+    ),
+    configurations: [
+      {
+        description: <h5>{t('Maven')}</h5>,
+        configurations: [
+          {
+            language: 'xml',
+            code: `
+<dependency>
+  <groupId>io.sentry</groupId>
+  <artifactId>sentry-logback</artifactId>
+  <version>6.25.2</version>
+</dependency>
+          `,
+          },
+          {
+            language: 'xml',
+            description: t(
+              'To upload your source code to Sentry so it can be shown in stack traces, use our Maven plugin.'
+            ),
+            code: `
+<build>
+  <plugins>
+    <plugin>
+      <groupId>io.sentry</groupId>
+      <artifactId>sentry-maven-plugin</artifactId>
+      <version>0.0.2</version>
+      <configuration>
+      <!-- for showing output of sentry-cli -->
+      <debugSentryCli>true</debugSentryCli>
+
+      <!-- download the latest sentry-cli and provide path to it here -->
+      <!-- download it here: https://github.com/getsentry/sentry-cli/releases -->
+      <!-- minimum required version is 2.17.3 -->
+      <sentryCliExecutablePath>/path/to/sentry-cli</sentryCliExecutablePath>
+
+      <org>___ORG_SLUG___</org>
+
+      <project>___PROJECT_SLUG___</project>
+
+      <!-- in case you're self hosting, provide the URL here -->
+      <!--<url>http://localhost:8000/</url>-->
+
+      <!-- provide your auth token via SENTRY_AUTH_TOKEN environment variable -->
+      <!-- you can find it in Sentry UI: Settings > Account > API > Auth Tokens -->
+      <authToken>env.SENTRY_AUTH_TOKEN</authToken>
+      </configuration>
+      <executions>
+        <execution>
+          <phase>generate-resources</phase>
+          <goals>
+          <goal>uploadSourceBundle</goal>
+          </goals>
+        </execution>
+      </executions>
+    </plugin>
+  </plugins>
+  ...
+</build>
+        `,
+          },
+        ],
+      },
+      {
+        description: <h5>{t('Graddle')}</h5>,
+        configurations: [
+          {
+            language: 'groovy',
+            code: "implementation 'io.sentry:sentry-logback:6.25.2'",
+          },
+          {
+            description: t(
+              'To upload your source code to Sentry so it can be shown in stack traces, use our Maven plugin.'
+            ),
+            language: 'groovy',
+            code: `
+buildscript {
+  repositories {
+    mavenCentral()
+  }
+}
+
+plugins {
+  id "io.sentry.jvm.gradle" version "3.11.1"
+}
+
+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"
+}
+            `,
+          },
+        ],
+      },
+    ],
+    additionalInfo: (
+      <p>
+        {tct('For other dependency managers see the [link:central Maven repository].', {
+          link: (
+            <ExternalLink href="https://search.maven.org/artifact/io.sentry/sentry-logback" />
+          ),
+        })}
+      </p>
+    ),
+  },
+  {
+    type: StepType.CONFIGURE,
+    description: t(
+      "Configure Sentry as soon as possible in your application's lifecycle:"
+    ),
+    configurations: [
+      {
+        language: 'xml',
+        description: t(
+          'The following example configures a ConsoleAppender that logs to standard out at the INFO level, and a SentryAppender that logs to the Sentry server at the ERROR level. This only an example of a non-Sentry appender set to a different logging threshold, similar to what you may already have in your project.'
+        ),
+        code: `
+<configuration>
+  <!-- Configure the Console appender -->
+  <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
+    <encoder>
+      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
+    </encoder>
+  </appender>
+
+  <!-- Configure the Sentry appender, overriding the logging threshold to the WARN level -->
+  <appender name="Sentry" class="io.sentry.logback.SentryAppender">
+    <options>
+      <dsn>${dsn}</dsn>
+    </options>
+  </appender>
+
+  <!-- Enable the Console and Sentry appenders, Console is provided as an example
+  of a non-Sentry logger that is set to a different logging threshold -->
+  <root level="INFO">
+    <appender-ref ref="Console" />
+    <appender-ref ref="Sentry" />
+  </root>
+</configuration>
+        `,
+        additionalInfo: (
+          <p>
+            {tct(
+              "You'll also need to configure your DSN (client key) if it's not already in the [code:logback.xml] configuration. Learn more in [link:our documentation for DSN configuration].",
+              {
+                code: <code />,
+                link: (
+                  <ExternalLink href="https://docs.sentry.io/platforms/java/guides/logback/#dsn-configuration/" />
+                ),
+              }
+            )}
+          </p>
+        ),
+      },
+      {
+        description: (
+          <p>
+            {tct(
+              "Next, you'll need to set your log levels, as illustrated here. You can learn more about [link:configuring log levels] in our documentation.",
+              {
+                link: (
+                  <ExternalLink href="https://docs.sentry.io/platforms/java/guides/logback/#minimum-log-level/" />
+                ),
+              }
+            )}
+          </p>
+        ),
+        configurations: [
+          {
+            language: 'xml',
+            code: `
+<appender name="Sentry" class="io.sentry.logback.SentryAppender">
+  <options>
+    <dsn>${dsn}</dsn>
+  </options>
+  <!-- Optionally change minimum Event level. Default for Events is ERROR -->
+  <minimumEventLevel>WARN</minimumEventLevel>
+  <!-- Optionally change minimum Breadcrumbs level. Default for Breadcrumbs is INFO -->
+  <minimumBreadcrumbLevel>DEBUG</minimumBreadcrumbLevel>
+</appender>
+          `,
+          },
+        ],
+      },
+    ],
+  },
+  {
+    type: StepType.VERIFY,
+    description: t(
+      'Last, create an intentional error, so you can test that everything is working:'
+    ),
+    configurations: [
+      {
+        description: <h5>Java</h5>,
+        language: 'java',
+        code: `
+import java.lang.Exception;
+import io.sentry.Sentry;
+
+try {
+  throw new Exception("This is a test.");
+} catch (Exception e) {
+  Sentry.captureException(e);
+}
+        `,
+      },
+      {
+        description: <h5>Kotlin</h5>,
+        language: 'java',
+        code: `
+import java.lang.Exception
+import io.sentry.Sentry
+
+try {
+  throw Exception("This is a test.")
+} catch (e: Exception) {
+  Sentry.captureException(e)
+}
+        `,
+      },
+    ],
+    additionalInfo: (
+      <Fragment>
+        <p>
+          {t(
+            "If you're new to Sentry, use the email alert to access your account and complete a product tour."
+          )}
+        </p>
+        <p>
+          {t(
+            "If you're an existing user and have disabled alerts, you won't receive this email."
+          )}
+        </p>
+      </Fragment>
+    ),
+  },
+];
+// Configuration End
+
+export function GettingStartedWithLogBack({dsn, ...props}: ModuleProps) {
+  return <Layout steps={steps({dsn})} introduction={introduction} {...props} />;
+}
+
+export default GettingStartedWithLogBack;

+ 20 - 0
static/app/gettingStartedDocs/java/spring.spec.tsx

@@ -0,0 +1,20 @@
+import {render, screen} from 'sentry-test/reactTestingLibrary';
+
+import {StepTitle} from 'sentry/components/onboarding/gettingStartedDoc/step';
+
+import {GettingStartedWithSpring, steps} from './spring';
+
+describe('GettingStartedWithSpring', function () {
+  it('renders doc correctly', function () {
+    const {container} = render(<GettingStartedWithSpring dsn="test-dsn" />);
+
+    // Steps
+    for (const step of steps()) {
+      expect(
+        screen.getByRole('heading', {name: step.title ?? StepTitle[step.type], level: 4})
+      ).toBeInTheDocument();
+    }
+
+    expect(container).toSnapshot();
+  });
+});

+ 337 - 0
static/app/gettingStartedDocs/java/spring.tsx

@@ -0,0 +1,337 @@
+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. If you're using Spring 5, use [sentrySpringLink:sentry-spring]. If you're using Spring 6, use [sentrySpringJakartaLink:sentry-spring-jakarta] instead. Sentry's integration with Spring supports Spring Framework 5.1.2 and above to report unhandled exceptions and optional user information. If you're on an older version, use [legacyIntegrationLink:our legacy integration].",
+  {
+    sentrySpringLink: (
+      <ExternalLink href="https://github.com/getsentry/sentry-java/tree/master/sentry-spring" />
+    ),
+    sentrySpringJakartaLink: (
+      <ExternalLink href="https://github.com/getsentry/sentry-java/tree/master/sentry-spring-jakarta" />
+    ),
+    legacyIntegrationLink: (
+      <ExternalLink href="https://docs.sentry.io/platforms/java/guides/spring/legacy/" />
+    ),
+  }
+);
+
+export const steps = ({
+  dsn,
+}: {
+  dsn?: string;
+} = {}): LayoutProps['steps'] => [
+  {
+    type: StepType.INSTALL,
+    description: t(
+      "Install Sentry's integration with Spring using either Maven or Gradle:"
+    ),
+    configurations: [
+      {
+        description: <h5>{t('Maven')}</h5>,
+        configurations: [
+          {
+            language: 'xml',
+            description: <strong>{t('Spring 5')}</strong>,
+            code: `
+<dependency>
+  <groupId>io.sentry</groupId>
+  <artifactId>sentry-spring</artifactId>
+  <version>6.25.2</version>
+</dependency>
+          `,
+          },
+          {
+            language: 'xml',
+            description: <strong>{t('Spring 6')}</strong>,
+            code: `
+<dependency>
+  <groupId>io.sentry</groupId>
+  <artifactId>sentry-spring-jakarta</artifactId>
+  <version>6.25.2</version>
+</dependency>
+        `,
+          },
+        ],
+      },
+    ],
+  },
+  {
+    type: StepType.CONFIGURE,
+    description: (
+      <Fragment>
+        {t("Configure Sentry as soon as possible in your application's lifecycle:")}
+        <p>
+          {tct(
+            'The [codeSentrySpring:sentry-spring] and [codeSentrySpringJakarta:sentry-spring-jakarta] libraries provide an [codeEnableSentry:@EnableSentry] annotation that registers all required Spring beans. [codeEnableSentry:@EnableSentry] can be placed on any class annotated with [configurationLink:@Configuration] including the main entry class in Spring Boot applications annotated with [springBootApplicationLink:@SpringBootApplication].',
+            {
+              codeSentrySpring: <code />,
+              codeSentrySpringJakarta: <code />,
+              codeEnableSentry: <code />,
+              configurationLink: (
+                <ExternalLink href="https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/Configuration.html" />
+              ),
+              springBootApplicationLink: (
+                <ExternalLink href="https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/autoconfigure/SpringBootApplication.html" />
+              ),
+            }
+          )}
+        </p>
+      </Fragment>
+    ),
+    configurations: [
+      {
+        description: <h5>{t('Java')}</h5>,
+        configurations: [
+          {
+            language: 'java',
+            description: <strong>{t('Spring 5')}</strong>,
+            code: `
+import io.sentry.spring.EnableSentry;
+
+@EnableSentry(dsn = "${dsn}")
+@Configuration
+class SentryConfiguration {
+}
+          `,
+          },
+          {
+            language: 'java',
+            description: <strong>{t('Spring 6')}</strong>,
+            code: `
+import io.sentry.spring.jakarta.EnableSentry;
+
+@EnableSentry(dsn = "${dsn}")
+@Configuration
+class SentryConfiguration {
+}
+        `,
+          },
+        ],
+      },
+      {
+        description: <h5>{t('Kotlin')}</h5>,
+        configurations: [
+          {
+            language: 'java',
+            description: <strong>{t('Spring 5')}</strong>,
+            code: `
+import io.sentry.spring.EnableSentry
+import org.springframework.core.Ordered
+
+@EnableSentry(
+  dsn = "${dsn}",
+  exceptionResolverOrder = Ordered.LOWEST_PRECEDENCE
+)
+          `,
+          },
+          {
+            language: 'java',
+            description: <strong>{t('Spring 6')}</strong>,
+            code: `
+import io.sentry.spring.jakarta.EnableSentry
+import org.springframework.core.Ordered
+
+@EnableSentry(
+  dsn = "${dsn}",
+  exceptionResolverOrder = Ordered.LOWEST_PRECEDENCE
+)
+        `,
+          },
+        ],
+      },
+      {
+        description: <h5>{t('Source Context')}</h5>,
+        configurations: [
+          {
+            language: 'xml',
+            description: t(
+              'To upload your source code to Sentry so it can be shown in stack traces, use our Maven plugin.'
+            ),
+            code: `
+<build>
+  <plugins>
+    <plugin>
+    <groupId>io.sentry</groupId>
+    <artifactId>sentry-maven-plugin</artifactId>
+    <version>0.0.2</version>
+    <configuration>
+      <!-- for showing output of sentry-cli -->
+      <debugSentryCli>true</debugSentryCli>
+
+      <!-- download the latest sentry-cli and provide path to it here -->
+      <!-- download it here: https://github.com/getsentry/sentry-cli/releases -->
+      <!-- minimum required version is 2.17.3 -->
+      <sentryCliExecutablePath>/path/to/sentry-cli</sentryCliExecutablePath>
+
+      <org>___ORG_SLUG___</org>
+
+      <project>___PROJECT_SLUG___</project>
+
+      <!-- in case you're self hosting, provide the URL here -->
+      <!--<url>http://localhost:8000/</url>-->
+
+      <!-- provide your auth token via SENTRY_AUTH_TOKEN environment variable -->
+      <!-- you can find it in Sentry UI: Settings > Account > API > Auth Tokens -->
+      <authToken>env.SENTRY_AUTH_TOKEN</authToken>
+    </configuration>
+    <executions>
+      <execution>
+        <phase>generate-resources</phase>
+        <goals>
+        <goal>uploadSourceBundle</goal>
+        </goals>
+      </execution>
+    </executions>
+  </plugin>
+</plugins>
+...
+        `,
+          },
+        ],
+      },
+      {
+        description: <h5>{t('Graddle')}</h5>,
+        configurations: [
+          {
+            description: <strong>{t('Spring 5')}</strong>,
+            language: 'groovy',
+            code: `implementation 'io.sentry:sentry-spring:6.25.2'`,
+          },
+          {
+            description: <strong>{t('Spring 6')}</strong>,
+            language: 'groovy',
+            code: `implementation 'io.sentry:sentry-spring-jakarta:6.25.2'`,
+          },
+        ],
+      },
+    ],
+  },
+  {
+    type: StepType.VERIFY,
+    description: t(
+      'Last, create an intentional error, so you can test that everything is working:'
+    ),
+    configurations: [
+      {
+        description: <h5>Java</h5>,
+        language: 'java',
+        code: `
+import java.lang.Exception;
+import io.sentry.Sentry;
+
+try {
+  throw new Exception("This is a test.");
+} catch (Exception e) {
+  Sentry.captureException(e);
+}
+        `,
+      },
+      {
+        description: <h5>Kotlin</h5>,
+        language: 'java',
+        code: `
+import java.lang.Exception
+import io.sentry.Sentry
+
+try {
+  throw Exception("This is a test.")
+} catch (e: Exception) {
+  Sentry.captureException(e)
+}
+        `,
+      },
+    ],
+    additionalInfo: (
+      <Fragment>
+        <p>
+          {t(
+            "If you're new to Sentry, use the email alert to access your account and complete a product tour."
+          )}
+        </p>
+        <p>
+          {t(
+            "If you're an existing user and have disabled alerts, you won't receive this email."
+          )}
+        </p>
+      </Fragment>
+    ),
+  },
+  {
+    title: t('Source Context'),
+    configurations: [
+      {
+        language: 'groovy',
+        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 "3.11.1"
+}
+
+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"
+}
+          `,
+      },
+    ],
+
+    additionalInfo: (
+      <p>
+        {tct(
+          'For other dependency managers see the [mavenRepositorySpring5Link:central Maven repository (Spring 5)] and [mavenRepositorySpring6Link:central Maven repository (Spring 6)].',
+          {
+            mavenRepositorySpring5Link: (
+              <ExternalLink href="https://central.sonatype.com/artifact/io.sentry/sentry-spring/6.26.0" />
+            ),
+            mavenRepositorySpring6Link: (
+              <ExternalLink href="https://central.sonatype.com/artifact/io.sentry/sentry-spring-jakarta/6.26.0" />
+            ),
+          }
+        )}
+      </p>
+    ),
+  },
+  {
+    title: t('Measure Performance'),
+    description: (
+      <p>
+        {tct(
+          'Check out [link:the documentation] to learn how to configure and use Sentry Performance Monitoring with Spring.',
+          {
+            link: (
+              <ExternalLink href="https://docs.sentry.io/platforms/java/guides/spring/performance/" />
+            ),
+          }
+        )}
+      </p>
+    ),
+  },
+];
+// Configuration End
+
+export function GettingStartedWithSpring({dsn, ...props}: ModuleProps) {
+  return <Layout steps={steps({dsn})} introduction={introduction} {...props} />;
+}
+
+export default GettingStartedWithSpring;