Skip to content

Releases: getsentry/sentry-java

8.9.0-alpha.1

22 Apr 13:16
Compare
Choose a tag to compare
8.9.0-alpha.1 Pre-release
Pre-release

Features

  • Add SentryWrapper.wrapRunnable to wrap Runnable for use with Sentry (#4332)
  • Support globalHubMode for OpenTelemetry
    • Sentry now adds OpenTelemetry spans without a parent to the last known unfinished root span (transaction)
    • Previously those spans would end up in Sentry as separate transactions

Fixes

  • Fix TTFD measurement when API called too early (#4297)
  • Tag sockets traffic originating from Sentry's HttpConnection (#4340)
    • This should suppress the StrictMode's UntaggedSocketViolation
  • Reduce debug logs verbosity (#4341)
  • Fix unregister SystemEventsBroadcastReceiver when entering background (#4338)
    • This should reduce ANRs seen with this class in the stack trace for Android 14 and above

Improvements

  • Make user interaction tracing faster and do fewer allocations (#4347)

8.8.0

14 Apr 15:32
Compare
Choose a tag to compare

Features

  • Add CoroutineExceptionHandler for reporting uncaught exceptions in coroutines to Sentry (#4259)
    • This is now part of sentry-kotlin-extensions and can be used together with SentryContext when launching a coroutine
    • Any exceptions thrown in a coroutine when using the handler will be captured (not rethrown!) and reported to Sentry
    • It's also possible to extend CoroutineExceptionHandler to implement custom behavior in addition to the one we provide by default

Fixes

  • Use thread context classloader when available (#4320)
    • This ensures correct resource loading in environments like Spring Boot where the thread context classloader is used for resource loading.
  • Improve low memory breadcrumb capturing (#4325)
  • Fix do not initialize SDK for Jetpack Compose Preview builds (#4324)
  • Fix Synchronize Baggage values (#4327)

Improvements

  • Make SystemEventsBreadcrumbsIntegration faster (#4330)

8.7.0

08 Apr 14:19
Compare
Choose a tag to compare

Features

  • UI Profiling GA

    Continuous Profiling is now GA, named UI Profiling. To enable it you can use one of the following options. More info can be found at https://docs.sentry.io/platforms/android/profiling/.
    Note: Both options.profilesSampler and options.profilesSampleRate must not be set to enable UI Profiling.
    To keep the same transaction-based behaviour, without the 30 seconds limitation, you can use the trace lifecycle mode.

    <application>
      <!-- Enable UI profiling, adjust in production env. This is evaluated only once per session -->
      <meta-data android:name="io.sentry.traces.profiling.session-sample-rate" android:value="1.0" />
      <!-- Set profiling lifecycle, can be `manual` (controlled through `Sentry.startProfiler()` and `Sentry.stopProfiler()`) or `trace` (automatically starts and stop a profile whenever a sampled trace starts and finishes) -->
      <meta-data android:name="io.sentry.traces.profiling.lifecycle" android:value="trace" />
      <!-- Enable profiling on app start. The app start profile will be stopped automatically when the app start root span finishes -->
      <meta-data android:name="io.sentry.traces.profiling.start-on-app-start" android:value="true" />
    </application>
    import io.sentry.ProfileLifecycle;
    import io.sentry.android.core.SentryAndroid;
    
    SentryAndroid.init(context, options -> {
        // Enable UI profiling, adjust in production env. This is evaluated only once per session
        options.setProfileSessionSampleRate(1.0);
        // Set profiling lifecycle, can be `manual` (controlled through `Sentry.startProfiler()` and `Sentry.stopProfiler()`) or `trace` (automatically starts and stop a profile whenever a sampled trace starts and finishes)
        options.setProfileLifecycle(ProfileLifecycle.TRACE);
        // Enable profiling on app start. The app start profile will be stopped automatically when the app start root span finishes
        options.setStartProfilerOnAppStart(true);
      });
    import io.sentry.ProfileLifecycle
    import io.sentry.android.core.SentryAndroid
    
    SentryAndroid.init(context, { options ->
      // Enable UI profiling, adjust in production env. This is evaluated only once per session
      options.profileSessionSampleRate = 1.0
      // Set profiling lifecycle, can be `manual` (controlled through `Sentry.startProfiler()` and `Sentry.stopProfiler()`) or `trace` (automatically starts and stop a profile whenever a sampled trace starts and finishes)
      options.profileLifecycle = ProfileLifecycle.TRACE
      // Enable profiling on app start. The app start profile will be stopped automatically when the app start root span finishes
      options.isStartProfilerOnAppStart = true
      })
    • Continuous Profiling - Stop when app goes in background (#4311)
    • Continuous Profiling - Add delayed stop (#4293)
    • Continuous Profiling - Out of Experimental (#4310)

Fixes

  • Compress Screenshots on a background thread (#4295)

8.6.0

01 Apr 08:38
Compare
Choose a tag to compare

Behavioral Changes

  • The Sentry SDK will now crash on startup if mixed versions have been detected (#4277)
    • On Sentry.init / SentryAndroid.init the SDK now checks if all Sentry Java / Android SDK dependencies have the same version.
    • While this may seem like a bad idea at first glance, mixing versions of dependencies has a very high chance of causing a crash later. We opted for a controlled crash that's hard to miss.
    • Note: This detection only works for new versions of the SDK, so please take this as a reminder to check your SDK version alignment manually when upgrading the SDK to this version and then you should be good.
    • The SDK will also print log messages if mixed versions have been detected at a later point. (#4270)
      • This takes care of cases missed by the startup check above due to older versions.

Features

  • Increase http timeouts from 5s to 30s to have a better chance of events being delivered without retry (#4276)
  • Add MANIFEST.MF to Sentry JARs (#4272)
  • Retain baggage sample rate/rand values as doubles (#4279)
  • Introduce fatal SDK logger (#4288)
    • We use this to print out messages when there is a problem that prevents the SDK from working correctly.
    • One example for this is when the SDK has been configured with mixed dependency versions where we print out details, which module and version are affected.

Fixes

  • Do not override user-defined SentryOptions (#4262)
  • Session Replay: Change bitmap config to ARGB_8888 for screenshots (#4282)
  • The MANIFEST.MF of sentry-opentelemetry-agent now has Implementation-Version set to the raw version (#4291)
    • An example value would be 8.6.0
    • The value of the Sentry-Version-Name attribute looks like sentry-8.5.0-otel-2.10.0
  • Fix tags missing for compose view hierarchies (#4275)
  • Do not leak SentryFileInputStream/SentryFileOutputStream descriptors and channels (#4296)
  • Remove "not yet implemented" from Sentry.flush comment (#4305)

Internal

  • Added platform to SentryEnvelopeItemHeader (#4287)
    • Set android platform to ProfileChunk envelope item header

Dependencies

7.22.5 (Stable)

24 Mar 16:14
Compare
Choose a tag to compare

Fixes

  • Session Replay: Change bitmap config to ARGB_8888 for screenshots (#4282)

7.22.4

20 Mar 10:37
Compare
Choose a tag to compare

Fixes

  • Session Replay: Fix crash when a navigation breadcrumb does not have "to" destination (#4185)
  • Session Replay: Cap video segment duration to maximum 5 minutes to prevent endless video encoding in background (#4185)
  • Avoid logging an error when a float is passed in the manifest (#4266)

8.5.0 (Stable)

18 Mar 17:38
Compare
Choose a tag to compare

Features

  • Add native stack frame address information and debug image metadata to ANR events (#4061)

    • This enables symbolication for stripped native code in ANRs
  • Add Continuous Profiling Support (#3710)

    To enable Continuous Profiling use the Sentry.startProfiler and Sentry.stopProfiler experimental APIs. Sampling rate can be set through options.profileSessionSampleRate, which defaults to null (disabled).
    Note: Both options.profilesSampler and options.profilesSampleRate must not be set to enable Continuous Profiling.

    import io.sentry.ProfileLifecycle;
    import io.sentry.android.core.SentryAndroid;
    
    SentryAndroid.init(context) { options ->
     
      // Currently under experimental options:
      options.getExperimental().setProfileSessionSampleRate(1.0);
      // In manual mode, you need to start and stop the profiler manually using Sentry.startProfiler and Sentry.stopProfiler
      // In trace mode, the profiler will start and stop automatically whenever a sampled trace starts and finishes
      options.getExperimental().setProfileLifecycle(ProfileLifecycle.MANUAL);
    }
    // Start profiling
    Sentry.startProfiler();
    
    // After all profiling is done, stop the profiler. Profiles can last indefinitely if not stopped.
    Sentry.stopProfiler();
    import io.sentry.ProfileLifecycle
    import io.sentry.android.core.SentryAndroid
    
    SentryAndroid.init(context) { options ->
     
      // Currently under experimental options:
      options.experimental.profileSessionSampleRate = 1.0
      // In manual mode, you need to start and stop the profiler manually using Sentry.startProfiler and Sentry.stopProfiler
      // In trace mode, the profiler will start and stop automatically whenever a sampled trace starts and finishes
      options.experimental.profileLifecycle = ProfileLifecycle.MANUAL
    }
    // Start profiling
    Sentry.startProfiler()
    
    // After all profiling is done, stop the profiler. Profiles can last indefinitely if not stopped.
    Sentry.stopProfiler()

    To learn more visit Sentry's Continuous Profiling documentation page.

Fixes

  • Reduce excessive CPU usage when serializing breadcrumbs to disk for ANRs (#4181)
  • Ensure app start type is set, even when ActivityLifecycleIntegration is not running (#4250)
  • Use SpringServletTransactionNameProvider as fallback for Spring WebMVC (#4263)
    • In certain cases the SDK was not able to provide a transaction name automatically and thus did not finish the transaction for the request.
    • We now first try SpringMvcTransactionNameProvider which would provide the route as transaction name.
    • If that does not return anything, we try SpringServletTransactionNameProvider next, which returns the URL of the request.

Behavioral Changes

  • The user's device.name is not reported anymore via the device context, even if options.isSendDefaultPii is enabled (#4179)

Dependencies

7.22.3

17 Mar 14:31
Compare
Choose a tag to compare

Fixes

  • Reduce excessive CPU usage when serializing breadcrumbs to disk for ANRs (#4181)

8.4.0

14 Mar 10:42
Compare
Choose a tag to compare

Fixes

  • The SDK now handles null on many APIs instead of expecting a non null value (#4245)
    • Certain APIs like setTag, setData, setExtra, setContext previously caused a NullPointerException when invoked with either null key or value.
    • The SDK now tries to have a sane fallback when null is passed and no longer throws NullPointerException
    • If null is passed, the SDK will
      • do nothing if a null key is passed, returning null for non void methods
      • remove any previous value if the new value is set to null
  • Add support for setting in-app-includes/in-app-excludes via AndroidManifest.xml (#4240)
  • Modifications to OkHttp requests are now properly propagated to the affected span / breadcrumbs (#4238)
    • Please ensure the SentryOkHttpInterceptor is added last to your OkHttpClient, as otherwise changes to the Request by subsequent interceptors won't be considered
  • Fix "class ch.qos.logback.classic.spi.ThrowableProxyVO cannot be cast to class ch.qos.logback.classic.spi.ThrowableProxy" (#4206)
    • In this case we cannot report the Throwable to Sentry as it's not available
    • If you are using OpenTelemetry v1 OpenTelemetryAppender, please consider upgrading to v2
  • Pass OpenTelemetry span attributes into TracesSampler callback (#4253)
    • SamplingContext now has a getAttribute method that grants access to OpenTelemetry span attributes via their String key (e.g. http.request.method)
  • Fix AbstractMethodError when using SentryTraced for Jetpack Compose (#4255)
  • Assume http.client for span op if not a root span (#4257)
  • Avoid unnecessary copies when using CopyOnWriteArrayList (#4247)
    • This affects in particular SentryTracer.getLatestActiveSpan which would have previously copied all child span references. This may have caused OutOfMemoryError on certain devices due to high frequency of calling the method.

Features

  • The SDK now automatically propagates the trace-context to the native layer. This allows to connect errors on different layers of the application. (#4137)
  • Capture OpenTelemetry span events (#3564)
    • OpenTelemetry spans may have exceptions attached to them (openTelemetrySpan.recordException). We can now send those to Sentry as errors.
    • Set capture-open-telemetry-events=true in sentry.properties to enable it
    • Set sentry.capture-open-telemetry-events=true in Springs application.properties to enable it
    • Set sentry.captureOpenTelemetryEvents: true in Springs application.yml to enable it

Behavioural Changes

  • Use java.net.URI for parsing URLs in UrlUtils (#4210)
    • This could affect grouping for issues with messages containing URLs that fall in known corner cases that were handled incorrectly previously (e.g. email in URL path)

Internal

  • Also use port when checking if a request is made to Sentry DSN (#4231)
    • For our OpenTelemetry integration we check if a span is for a request to Sentry
    • We now also consider the port when performing this check

Dependencies

7.22.2

13 Mar 17:24
Compare
Choose a tag to compare

Fixes

  • Fix AbstractMethodError when using SentryTraced for Jetpack Compose (#4256)