@sentry/core
Advanced tools
Changelog
8.17.0
Changelog
8.16.0
Previously, the @sentry/nextjs
SDK automatically recorded spans in the form of transactions for each of your top-level
server components (pages, layouts, ...). This approach had a few drawbacks, the main ones being that traces didn't have
a root span, and more importantly, if you had data stream to the client, its duration was not captured because the
server component spans had finished before the data could finish streaming.
With this release, we will capture the duration of App Router requests in their entirety as a single transaction with server component spans being descendants of that transaction. This means you will get more data that is also more accurate. Note that this does not apply to the Edge runtime. For the Edge runtime, the SDK will emit transactions as it has before.
Generally speaking, this change means that you will see less transactions and more spans in Sentry. You will no
longer receive server component transactions like Page Server Component (/path/to/route)
(unless using the Edge
runtime), and you will instead receive transactions for your App Router SSR requests that look like
GET /path/to/route
.
If you are on Sentry SaaS, this may have an effect on your quota consumption: Less transactions, more spans.
The @sentry/nestjs
SDK now includes a @SentryCron
decorator that can be used to augment the native NestJS @Cron
decorator to send check-ins to Sentry before and after each cron job run:
import { Cron } from '@nestjs/schedule';
import { SentryCron, MonitorConfig } from '@sentry/nestjs';
import type { MonitorConfig } from '@sentry/types';
const monitorConfig: MonitorConfig = {
schedule: {
type: 'crontab',
value: '* * * * *',
},
checkinMargin: 2, // In minutes. Optional.
maxRuntime: 10, // In minutes. Optional.
timezone: 'America/Los_Angeles', // Optional.
};
export class MyCronService {
@Cron('* * * * *')
@SentryCron('my-monitor-slug', monitorConfig)
handleCron() {
// Your cron job logic here
}
}
httpIntegration
(#12761)addPluginTemplate
(#12760)h
import in ScreenshotEditor
(#12784)autoSessionTracking
is enabled by default (#12790)Changelog
8.15.0
on
(#11710)spanTimeInputToSeconds
for otel span exporter (#12699)lazyLoadIntegration
(#12766)jsxRuntime: 'classic'
to prevent breaking react 17 (#12775)getStack()
(#12737)Work in this release was contributed by @arturovt and @jaulz. Thank you for your contributions!
Changelog
8.14.0
The @sentry/nestjs
SDK no longer captures 4xx errors automatically.
JSX
(#12691)registerEsmLoaderHooks
option (#12684)afterAllSetup
instead of next tick (#12709)Work in this release was contributed by @quisido. Thank you for your contribution!
Changelog
8.13.0
@sentry/nestjs
)
in alpha state. The SDK is a drop-in replacement for the Sentry Node SDK (@sentry/node
) supporting the same set of
features. See the docs for how to use the SDK.2.20.1
(#12641)Changelog
8.12.0
This release introduces breaking changes to the @sentry/solid
package (which is currently out in alpha).
We've made it easier to get started with the solid router integration by removing the need to pass use* hooks
explicitly to solidRouterBrowserTracingIntegration
. Import solidRouterBrowserTracingIntegration
from
@sentry/solid/solidrouter
and add it to Sentry.init
import * as Sentry from '@sentry/solid';
import { solidRouterBrowserTracingIntegration, withSentryRouterRouting } from '@sentry/solid/solidrouter';
import { Router } from '@solidjs/router';
Sentry.init({
dsn: '__PUBLIC_DSN__',
integrations: [solidRouterBrowserTracingIntegration()],
tracesSampleRate: 1.0, // Capture 100% of the transactions
});
const SentryRouter = withSentryRouterRouting(Router);
Sentry.init()
now returns a client directly, so you don't need to explicitly call getClient()
anymore:
const client = Sentry.init();
deleteSourcemapsAfterUpload
option (#12457)This adds an easy way to delete sourcemaps immediately after uploading them:
module.exports = withSentryConfig(nextConfig, {
sourcemaps: {
deleteSourcemapsAfterUpload: true,
},
});
maxSpanWaitDuration
(#12610)Adds configuration option for the max. duration in seconds that the SDK will wait for parent spans to be finished before discarding a span. The SDK will automatically clean up spans that have no finished parent after this duration. This is necessary to prevent memory leaks in case of parent spans that are never finished or otherwise dropped/missing. However, if you have very long-running spans in your application, a shorter duration might cause spans to be discarded too early. In this case, you can increase this duration to a value that fits your expected data.
window.Sentry
(#12580)isRemixV2
as optional in exposed types. (#12614)Work in this release was contributed by @n4bb12. Thank you for your contribution!
Changelog
8.11.0
parentSpan
option to startSpan*
APIs (#12567)We've made it easier to create a span as a child of a specific span via the startSpan* APIs. This should allow you to explicitly manage the parent-child relationship of your spans better.
Sentry.startSpan({ name: 'root' }, parent => {
const span = Sentry.startInactiveSpan({ name: 'xxx', parentSpan: parent });
Sentry.startSpan({ name: 'xxx', parentSpan: parent }, () => {});
Sentry.startSpanManual({ name: 'xxx', parentSpan: parent }, () => {});
});
@sentry/node
exports from framework SDKs. (#12589)Changelog
8.10.0
opentelemetry-instrumentation-remix
. (#12110)You can now simplify your remix instrumentation by opting-in like this:
const Sentry = require('@sentry/remix');
Sentry.init({
dsn: YOUR_DSN
// opt-in to new auto instrumentation
autoInstrumentRemix: true,
});
With this setup, you do not need to add e.g. wrapExpressCreateRequestHandler
anymore. Additionally, the quality of the
captured data improves. The old way to use @sentry/remix
continues to work, but it is encouraged to use the new setup.
thirdPartyErrorFilterIntegration
from @sentry/browser
(#12512)tags
field to any feedback config param (#12197)getDynamicSamplingContextFromSpan
(#12522)captureRemixServerException
from client SDK (#12497)Work in this release was contributed by @AndreyKovanov and @kiliman. Thank you for your contributions!