Skip to content

Commit fc69ce7

Browse files
Simplify Spring integration (#1188)
Fixes #1187
1 parent d0502db commit fc69ce7

36 files changed

+443
-110
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
* Enhancement: Simplify registering traces sample callback in Spring integration (#1184)
1212
* Enhancement: Polish Performance API (#1165)
1313
* Enhancement: Set "debug" through external properties (#1186)
14+
* Enhancement: Simplify Spring integration (#1188)
1415

1516
# 4.0.0-alpha.3
1617

buildSrc/src/main/java/Config.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ object Config {
1616
val springBoot = "org.springframework.boot"
1717
val springDependencyManagement = "io.spring.dependency-management"
1818
val springDependencyManagementVersion = "1.0.10.RELEASE"
19+
val gretty = "org.gretty"
20+
val grettyVersion = "3.0.3"
1921
}
2022

2123
object Android {
@@ -54,6 +56,8 @@ object Config {
5456
val springBootStarterSecurity = "org.springframework.boot:spring-boot-starter-security:$springBootVersion"
5557

5658
val springWeb = "org.springframework:spring-webmvc"
59+
val springSecurityWeb = "org.springframework.security:spring-security-web"
60+
val springSecurityConfig = "org.springframework.security:spring-security-config"
5761
val springAop = "org.springframework:spring-aop"
5862
val aspectj = "org.aspectj:aspectjweaver"
5963
val servletApi = "javax.servlet:javax.servlet-api"

sentry-samples/sentry-samples-spring/README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,16 @@ Sample application showing how to use Sentry with [Spring](http://spring.io/).
44

55
## How to run?
66

7-
To see events triggered in this sample application in your Sentry dashboard, go to `src/main/java/io/sentry/samples/spring/SentryDemoApplication.java` and replace the test DSN with your own DSN.
7+
To see events triggered in this sample application in your Sentry dashboard, go to `src/main/java/io/sentry/samples/spring/SentryConfig.java` and replace the test DSN with your own DSN.
88

99
Then, execute a command from the module directory:
1010

1111
```
12-
../../gradlew bootRun
12+
../../gradlew appRun
1313
```
1414

1515
Make an HTTP request that will trigger events:
1616

1717
```
18-
curl -XPOST --user user:password http://localhost:8080/person/ -H "Content-Type:application/json" -d '{"firstName":"John","lastName":"Smith"}
18+
curl -XPOST --user user:password http://localhost:8080/sentry-samples-spring/person/ -H "Content-Type:application/json" -d '{"firstName":"John","lastName":"Smith"}
1919
```
Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
public class io/sentry/samples/spring/Person {
2-
public fun <init> (Ljava/lang/String;Ljava/lang/String;)V
3-
public fun getFirstName ()Ljava/lang/String;
4-
public fun getLastName ()Ljava/lang/String;
5-
public fun toString ()Ljava/lang/String;
1+
public class io/sentry/samples/spring/AppConfig {
2+
public fun <init> ()V
63
}
74

8-
public class io/sentry/samples/spring/PersonController {
5+
public class io/sentry/samples/spring/AppInitializer : org/springframework/web/servlet/support/AbstractAnnotationConfigDispatcherServletInitializer {
96
public fun <init> ()V
7+
protected fun getRootConfigClasses ()[Ljava/lang/Class;
8+
protected fun getServletConfigClasses ()[Ljava/lang/Class;
9+
protected fun getServletFilters ()[Ljavax/servlet/Filter;
10+
protected fun getServletMappings ()[Ljava/lang/String;
1011
}
1112

1213
public class io/sentry/samples/spring/SecurityConfiguration : org/springframework/security/config/annotation/web/configuration/WebSecurityConfigurerAdapter {
@@ -15,8 +16,26 @@ public class io/sentry/samples/spring/SecurityConfiguration : org/springframewor
1516
public fun userDetailsService ()Lorg/springframework/security/core/userdetails/UserDetailsService;
1617
}
1718

18-
public class io/sentry/samples/spring/SentryDemoApplication {
19+
public class io/sentry/samples/spring/SentryConfig {
1920
public fun <init> ()V
20-
public static fun main ([Ljava/lang/String;)V
21+
}
22+
23+
public class io/sentry/samples/spring/WebConfig {
24+
public fun <init> ()V
25+
}
26+
27+
public class io/sentry/samples/spring/web/Person {
28+
public fun <init> (Ljava/lang/String;Ljava/lang/String;)V
29+
public fun getFirstName ()Ljava/lang/String;
30+
public fun getLastName ()Ljava/lang/String;
31+
public fun toString ()Ljava/lang/String;
32+
}
33+
34+
public class io/sentry/samples/spring/web/PersonController {
35+
public fun <init> (Lio/sentry/samples/spring/web/PersonService;)V
36+
}
37+
38+
public class io/sentry/samples/spring/web/PersonService {
39+
public fun <init> (Lorg/springframework/web/client/RestTemplate;)V
2140
}
2241

sentry-samples/sentry-samples-spring/build.gradle.kts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@ import org.jetbrains.kotlin.config.KotlinCompilerVersion
22
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
33

44
plugins {
5-
id(Config.BuildPlugins.springBoot) version Config.springBootVersion
5+
id(Config.BuildPlugins.springBoot) version Config.springBootVersion apply false
66
id(Config.BuildPlugins.springDependencyManagement) version Config.BuildPlugins.springDependencyManagementVersion
77
kotlin("jvm")
88
kotlin("plugin.spring") version Config.kotlinVersion
9+
id("war")
10+
id(Config.BuildPlugins.gretty) version Config.BuildPlugins.grettyVersion
911
}
1012

1113
group = "io.sentry.sample.spring"
@@ -16,10 +18,20 @@ repositories {
1618
mavenCentral()
1719
}
1820

21+
dependencyManagement {
22+
imports {
23+
mavenBom(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES)
24+
}
25+
}
26+
1927
dependencies {
20-
implementation(Config.Libs.springBootStarterSecurity)
21-
implementation(Config.Libs.springBootStarterWeb)
22-
implementation(Config.Libs.springBootStarter)
28+
implementation(Config.Libs.servletApi)
29+
implementation(Config.Libs.springWeb)
30+
implementation(Config.Libs.springAop)
31+
implementation(Config.Libs.aspectj)
32+
implementation(Config.Libs.springSecurityWeb)
33+
implementation(Config.Libs.springSecurityConfig)
34+
implementation(Config.Libs.logbackClassic)
2335
implementation("org.jetbrains.kotlin:kotlin-reflect")
2436
implementation(kotlin(Config.kotlinStdLib, KotlinCompilerVersion.VERSION))
2537
implementation(project(":sentry-spring"))
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package io.sentry.samples.spring;
2+
3+
import org.springframework.context.annotation.Configuration;
4+
import org.springframework.context.annotation.Import;
5+
6+
@Configuration
7+
@Import(SentryConfig.class)
8+
public class AppConfig {}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package io.sentry.samples.spring;
2+
3+
import io.sentry.spring.tracing.SentryTracingFilter;
4+
import javax.servlet.Filter;
5+
import org.springframework.web.filter.DelegatingFilterProxy;
6+
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
7+
8+
public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
9+
10+
@Override
11+
protected String[] getServletMappings() {
12+
return new String[] {"/*"};
13+
}
14+
15+
@Override
16+
protected Class<?>[] getRootConfigClasses() {
17+
return new Class<?>[] {AppConfig.class, SecurityConfiguration.class};
18+
}
19+
20+
@Override
21+
protected Class<?>[] getServletConfigClasses() {
22+
return new Class<?>[] {WebConfig.class};
23+
}
24+
25+
@Override
26+
protected Filter[] getServletFilters() {
27+
// creates Sentry transactions around incoming HTTP requests
28+
SentryTracingFilter sentryTracingFilter = new SentryTracingFilter();
29+
30+
// filter required by Spring Security
31+
DelegatingFilterProxy springSecurityFilterChain = new DelegatingFilterProxy();
32+
springSecurityFilterChain.setTargetBeanName("springSecurityFilterChain");
33+
return new Filter[] {sentryTracingFilter, springSecurityFilterChain};
34+
}
35+
}

sentry-samples/sentry-samples-spring/src/main/java/io/sentry/samples/spring/SecurityConfiguration.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import org.springframework.context.annotation.Bean;
55
import org.springframework.context.annotation.Configuration;
66
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
7+
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
78
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
89
import org.springframework.security.core.userdetails.User;
910
import org.springframework.security.core.userdetails.UserDetails;
@@ -13,6 +14,7 @@
1314
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
1415

1516
@Configuration
17+
@EnableWebSecurity
1618
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
1719

1820
// this API is meant to be consumed by non-browser clients thus the CSRF protection is not needed.
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package io.sentry.samples.spring;
2+
3+
import io.sentry.SentryOptions.TracesSamplerCallback;
4+
import io.sentry.spring.EnableSentry;
5+
import io.sentry.spring.tracing.SentryTracingConfiguration;
6+
import javax.servlet.http.HttpServletRequest;
7+
import org.springframework.context.annotation.Bean;
8+
import org.springframework.context.annotation.Import;
9+
10+
// NOTE: Replace the test DSN below with YOUR OWN DSN to see the events from this app in your Sentry
11+
// project/dashboard
12+
@EnableSentry(
13+
dsn = "https://[email protected]/5428563",
14+
sendDefaultPii = true)
15+
@Import(SentryTracingConfiguration.class)
16+
public class SentryConfig {
17+
18+
/**
19+
* Configures callback used to determine if transaction should be sampled.
20+
*
21+
* @return traces sampler callback
22+
*/
23+
@Bean
24+
TracesSamplerCallback tracesSamplerCallback() {
25+
return samplingContext -> {
26+
HttpServletRequest request =
27+
(HttpServletRequest) samplingContext.getCustomSamplingContext().get("request");
28+
if ("/error".equals(request.getRequestURI())) {
29+
return 0.5d;
30+
} else {
31+
return 1.0d;
32+
}
33+
};
34+
}
35+
}

sentry-samples/sentry-samples-spring/src/main/java/io/sentry/samples/spring/SentryDemoApplication.java

Lines changed: 0 additions & 17 deletions
This file was deleted.

0 commit comments

Comments
 (0)