Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
5af6abe
uplift part 1: remove javax support, update java to v17 and update gr…
richardelms Oct 21, 2025
8aa7580
Rename filters to redacted keys for spec compliance (#236)
richardelms Oct 24, 2025
ddddf2c
migrate groovy gradle files to kotlin gradle format (#238)
richardelms Nov 3, 2025
9c140d8
rename MetaData to Metadata (#237)
richardelms Nov 10, 2025
b530c39
notifyReleaseStages -> enabledReleaseStages (#239)
richardelms Nov 13, 2025
4de3d6a
rename ignoreClasses to discardClasses (#240)
richardelms Nov 13, 2025
a531075
rename callbacks and update functionality (#241)
richardelms Nov 24, 2025
3b69aef
Rename endpointConfiguration to endpoints (#242)
richardelms Nov 24, 2025
c1a713c
Encapsulation (#243)
richardelms Dec 1, 2025
e343ab9
missing metadata accessors (#246)
richardelms Dec 2, 2025
5cab647
initial agent work
richardelms Dec 5, 2025
d9f4a5d
remove trailing spaces
richardelms Dec 15, 2025
04ca7f5
checkstyle
richardelms Dec 15, 2025
a2ebaf9
appender
richardelms Dec 15, 2025
9c38ec3
test fixes
richardelms Dec 16, 2025
82df229
initial change
richardelms Dec 17, 2025
aed4bf7
tests
richardelms Dec 17, 2025
27a926f
syntax fix
richardelms Dec 17, 2025
67a925b
Update features/fixtures/scenarios/src/main/java/com/bugsnag/mazerunn…
richardelms Dec 18, 2025
374cd91
review changes
richardelms Dec 18, 2025
96b9733
Merge branch 'discardClassesAsPatterns' of github.com:bugsnag/bugsnag…
richardelms Dec 18, 2025
859b52c
remove md file
richardelms Dec 18, 2025
d0a8b22
convert away from blob
richardelms Dec 18, 2025
fd79d6d
full pattern support
richardelms Dec 18, 2025
d40d29c
refac
richardelms Dec 18, 2025
d06aa20
fix(FeatureFlag): added a ReadWriteLock to the FeatureFlagStore, and …
lemnik Mar 11, 2026
a884744
Merge pull request #247 from bugsnag/featureFlags
lemnik Mar 13, 2026
0d46121
Merge pull request #248 from bugsnag/discardClassesAsPatterns
lemnik Mar 18, 2026
c994bfa
refactor(Event): rename Report -> Event
lemnik Mar 17, 2026
b7e42d4
refactor(Event): rename Exception -> Error
lemnik Mar 17, 2026
b7ca7cf
refactor(Bugsnag*): rename Event, Error, and Thread to `Bugsnag{name}…
lemnik Mar 17, 2026
fa5400c
refactor(sendThreads): replaced sendThreads boolean with ThreadSendPo…
lemnik Mar 18, 2026
4a61e34
refactor(OnErrorCallback): renamed `Callback` -> `OnErrorCallback` & …
lemnik Mar 18, 2026
ec58f8f
refactor(Configuration): Replaced AtomicBoolean with volatile boolean…
lemnik Mar 18, 2026
6ab6567
chore(checkstyle): Checkstyle fixes
lemnik Mar 18, 2026
1b5a5d9
test(e2e): updated end-to-end tests to handle SDK renames
lemnik Mar 18, 2026
ad30876
fix(json): add `getExceptions()` for JSON serialization compatibility
lemnik Mar 18, 2026
32091c4
Merge pull request #250 from bugsnag/PLAT-15339/notifier-spec
lemnik Mar 25, 2026
d289ddb
refactor(spec): rename sendUncaughtExceptions -> autoDetectErrors
lemnik Mar 25, 2026
7a5b53f
refactor(spec): rename sendUncaughtExceptions -> autoDetectErrors
lemnik Mar 25, 2026
1c84ce4
Fix: remove bugsnag.buildReport(exception); & remove bugsnag.setTimeout
SB-sachinp Apr 13, 2026
dda627e
Fix: remove bugsnag.buildReport(exception); & remove bugsnag.setTimeout
SB-sachinp Apr 13, 2026
4d7e528
Merge branch 'integration/uplift-2025' into sachin/PLAT-15367-Remove-…
Copilot Apr 21, 2026
35cde71
Fix: resolve checkstyle line length violations in JakartaServletCallb…
SB-sachinp Apr 21, 2026
51f9c51
Fix: remove bugsnag.buildReport(exception); & remove bugsnag.setTimeout
SB-sachinp Apr 22, 2026
f0d25fc
Build Kite error fix.
SB-sachinp Apr 23, 2026
488beb1
Package protected methods created.
SB-sachinp Apr 24, 2026
59ffcdb
Package protected methods created.Grouped all notify methods.
SB-sachinp Apr 24, 2026
9efdd84
Package protected methods created.Grouped all notify methods.
SB-sachinp Apr 24, 2026
ef30fea
Merge pull request #251 from bugsnag/PLAT-15368/autoDetectErrors
lemnik Apr 28, 2026
74c9a4f
Merge pull request #253 from bugsnag/sachin/PLAT-15367-Remove-Bugsnag…
SB-sachinp Apr 28, 2026
86c579f
first draft
richardelms Apr 28, 2026
6617052
Merge pull request #254 from bugsnag/upliftUpgradingGuide
lemnik Apr 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 2 additions & 26 deletions .buildkite/pipeline.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,32 +22,6 @@ steps:
run: java-common
command: './gradlew check test'

- label: ':docker: Mazerunner java8 tests batch 1'
key: 'java-mazerunner-tests-1'
depends_on: 'java-jvm-build'
timeout_in_minutes: 30
plugins:
- docker-compose#v3.7.0:
run: java8-mazerunner
- artifacts#v1.9.0:
download: "maven-repository.zip"
command:
- 'features/scripts/assemble-fixtures.sh'
- 'bundle exec maze-runner --exclude=features/[^a-m].*.feature'

- label: ':docker: Mazerunner java8 tests batch 2'
key: 'java-mazerunner-tests-2'
depends_on: 'java-jvm-build'
timeout_in_minutes: 30
plugins:
- docker-compose#v3.7.0:
run: java8-mazerunner
- artifacts#v1.9.0:
download: "maven-repository.zip"
command:
- 'features/scripts/assemble-fixtures.sh'
- 'bundle exec maze-runner --exclude=features/[^n-z].*.feature'

- label: ':docker: Mazerunner java17 tests batch 1'
key: 'java-mazerunner-tests-3'
depends_on: 'java-jvm-build'
Expand All @@ -57,6 +31,7 @@ steps:
run: java17-mazerunner
- artifacts#v1.9.0:
download: "maven-repository.zip"
upload: "maze_output/maze_output.zip"
command:
- 'features/scripts/assemble-fixtures.sh'
- 'bundle exec maze-runner --exclude=features/[^a-m].*.feature'
Expand All @@ -70,6 +45,7 @@ steps:
run: java17-mazerunner
- artifacts#v1.9.0:
download: "maven-repository.zip"
upload: "maze_output/maze_output.zip"
command:
- 'features/scripts/assemble-fixtures.sh'
- 'bundle exec maze-runner --exclude=features/[^n-z].*.feature'
Expand Down
2 changes: 2 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,5 @@ source 'https://rubygems.org'

gem 'bugsnag-maze-runner', '~>9.0'
gem 'os'
# Pin power_assert to avoid compatibility issues with test-unit
gem 'power_assert', '< 3.0.0'
204 changes: 204 additions & 0 deletions UPGRADING.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,210 @@
Upgrading
=========

## 3.x to 4.x

*This major release modernises the Java notifier with breaking changes to align with current Bugsnag conventions, drop legacy Java/Servlet support, and add new capabilities like feature flags.*

### Java 17+ required

The minimum Java version has been raised from Java 7 to **Java 17**. You must compile and run on Java 17 or above.

### Javax servlet support removed

Support for `javax.servlet` has been removed. Only **Jakarta Servlet API 5.0+** is now supported. If your application still uses `javax.servlet`, you will need to migrate to Jakarta before upgrading. The `bugsnag-spring:javax` submodule has been removed entirely.

### Report renamed to BugsnagEvent

The `Report` class has been renamed to `BugsnagEvent`. Update any references in callbacks and direct usage:

```java
// Before
Report report = bugsnag.buildReport(exception);
report.setSeverity(Severity.ERROR);

// After
// BugsnagEvent is now provided directly via callbacks (buildReport has been removed)
bugsnag.notify(exception, (event) -> {
event.setSeverity(Severity.ERROR);
return true;
});
```

### Callback renamed to OnErrorCallback

The `Callback` interface has been replaced by `OnErrorCallback`. The method signature has also changed — `onError` now returns a `boolean` to control whether the event is delivered:

```java
// Before
bugsnag.addCallback((report) -> {
report.setSeverity(Severity.ERROR);
});

// After
bugsnag.addOnError((event) -> {
event.setSeverity(Severity.ERROR);
return true; // return false to suppress delivery
});
```

The `BugsnagMarker` constructor for Logback integration now also takes `OnErrorCallback` instead of `Callback`.

### addCallback renamed to addOnError

The method for registering global callbacks has been renamed:

```java
// Before
bugsnag.addCallback(callback);

// After
bugsnag.addOnError(callback);
```

### Metadata method changes

The `addToTab` method on events has been renamed to `addMetadata`:

```java
// Before
report.addToTab("tab", "key", "value");

// After
event.addMetadata("tab", "key", "value");
```

The static thread metadata methods have also been renamed (note the lowercase 'd'):

```java
// Before
Bugsnag.addThreadMetaData("tab", "key", "value");
Bugsnag.clearThreadMetaData();

// After
Bugsnag.addThreadMetadata("tab", "key", "value");
Bugsnag.clearThreadMetadata();
```

### setFilters renamed to setRedactedKeys

The method for specifying keys whose values should be redacted from metadata has been renamed:

```java
// Before
bugsnag.setFilters("password", "secret");

// After
bugsnag.setRedactedKeys("password", "secret");
```

### setIgnoreClasses renamed to setDiscardClasses

The method for ignoring exceptions by class name now takes `Pattern` objects instead of plain strings, giving you full regex control:

```java
// Before
bugsnag.setIgnoreClasses("com.example.IgnoreMe");

// After
bugsnag.setDiscardClasses(Pattern.compile("com\\.example\\.IgnoreMe"));
```

### setNotifyReleaseStages renamed to setEnabledReleaseStages

```java
// Before
bugsnag.setNotifyReleaseStages("production", "staging");

// After
bugsnag.setEnabledReleaseStages("production", "staging");
```

### setSendThreads now takes ThreadSendPolicy

The boolean `setSendThreads` has been replaced with a `ThreadSendPolicy` enum for finer control:

```java
// Before
bugsnag.setSendThreads(true); // always send
bugsnag.setSendThreads(false); // never send

// After
bugsnag.setSendThreads(ThreadSendPolicy.ALWAYS);
bugsnag.setSendThreads(ThreadSendPolicy.UNHANDLED_ONLY); // new option
bugsnag.setSendThreads(ThreadSendPolicy.NEVER);
```

### Endpoint configuration

A new `EndpointConfiguration` class has been introduced for configuring custom endpoints. The previous string-based `setEndpoints(String, String)` method is now deprecated in favour of:

```java
// Before
bugsnag.setEndpoints("https://notify.example.com", "https://sessions.example.com");

// After
bugsnag.setEndpoints(new EndpointConfiguration(
"https://notify.example.com",
"https://sessions.example.com"
));
```

### buildReport removed

The `buildReport(Throwable)` method has been removed from `Bugsnag`. Use the callback-based `notify` methods instead to modify events before delivery.

### Feature flags (new)

A new feature flags API has been added for annotating events with experiment and A/B test information. Feature flags can be set globally on the client or per-event:

```java
// Add flags globally
bugsnag.addFeatureFlag("checkout-v2", "enabled");
bugsnag.addFeatureFlag("dark-mode");

// Add/remove flags per-event in a callback
bugsnag.addOnError((event) -> {
event.addFeatureFlag("experiment-123", "variant-a");
event.clearFeatureFlag("old-flag");
return true;
});

// Clear all flags
bugsnag.clearFeatureFlags();
```

### New public model classes

Several internal classes are now part of the public API, providing richer access to error data in callbacks:

- **`BugsnagError`** — access `getErrorClass()`, `getMessage()`, and `getStacktrace()` on the underlying error
- **`BugsnagThread`** — access `getId()`, `getName()`, `getStacktrace()`, and `isErrorReportingThread()` on captured threads
- **`Stackframe`** — access `getFile()`, `getMethod()`, `getLineNumber()`, and `isInProject()` on individual stack frames
- **`FeatureFlag`** — created via `FeatureFlag.of("name")` or `FeatureFlag.of("name", "variant")`

### Spring integration changes

- The `bugsnag-spring:javax` submodule has been removed. Only Jakarta-based Spring (Spring 6 / Spring Boot 3+) is supported.
- Spring configuration classes now use `OnErrorCallback` rather than `Callback`.
- If you were importing `JavaxMvcConfiguration` or `SpringBootJavaxConfiguration`, switch to `JakartaMvcConfiguration` and `SpringBootJakartaConfiguration` respectively.

### Logback configuration changes

Logback XML configuration properties have been updated to match the new API names:

| Old property | New property |
|---|---|
| `<filteredProperties>` | `<redactedKeys>` |
| `<ignoredClasses>` | `<discardClasses>` |
| `<notifyReleaseStages>` | `<enabledReleaseStages>` |
| `<sendThreads>` (boolean) | `<sendThreads>` (enum: `ALWAYS`, `UNHANDLED_ONLY`, `NEVER`) |

New properties are also available: `<featureFlags>` for declaring feature flags in your Logback configuration.

### Serializer is now an interface

`Serializer` has been changed from a concrete class to an interface. If you implemented custom delivery, update to use `DefaultSerializer` as the concrete implementation.

## Migrating from bugsnag-java to bugsnag-spring

If you develop a [Spring Framework](https://spring.io/) application, it is recommended that you migrate from bugsnag-java to bugsnag-spring. bugsnag-spring adds support for various Spring-specific features, such as automatic detection of exceptions within scheduled tasks. To upgrade:
Expand Down
Loading