From cc97b0c2f94dff268ed95b204121cdad8b65b751 Mon Sep 17 00:00:00 2001 From: "sentry-api-schema-updater[bot]" <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> Date: Tue, 20 Oct 2026 08:54:25 +0000 Subject: [PATCH 001/127] Bump API schema to 2b03abf7 (#20101) Co-authored-by: sentry-api-schema-updater[bot] <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> --- src/build/resolveOpenAPI.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/resolveOpenAPI.ts b/src/build/resolveOpenAPI.ts index eac8b6ad0c0ae..5980b6674f725 100644 --- a/src/build/resolveOpenAPI.ts +++ b/src/build/resolveOpenAPI.ts @@ -6,7 +6,7 @@ import {DeRefedOpenAPI, Parameter} from './open-api/types'; // SENTRY_API_SCHEMA_SHA is used in the sentry-docs GHA workflow in getsentry/sentry-api-schema. // DO NOT change variable name unless you change it in the sentry-docs GHA workflow in getsentry/sentry-api-schema. -const SENTRY_API_SCHEMA_SHA = 'c8e163b204d82a42cb46e9f1c989e39608727b55'; +const SENTRY_API_SCHEMA_SHA = '2b03abf70a7a2734b7fa30b77be972f741449172'; const activeEnv = process.env.GATSBY_ENV || process.env.NODE_ENV || 'development'; From 1a0984994382a75d36e46e15b4a74d5405b07fb9 Mon Sep 17 00:00:00 2001 From: Reinaldy Rafli Date: Tue, 20 Oct 2026 17:12:38 +0700 Subject: [PATCH 002/127] docs(self-hosted): remove invalid mentions of copying .env.custom and various minor improvements (#19797) Changing some copy, as I hope it will make first timers understand our release cadence & how often they should upgrade, better. --- develop-docs/self-hosted/releases.mdx | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/develop-docs/self-hosted/releases.mdx b/develop-docs/self-hosted/releases.mdx index d400d3dd72654..f5720d28b4a30 100644 --- a/develop-docs/self-hosted/releases.mdx +++ b/develop-docs/self-hosted/releases.mdx @@ -19,9 +19,9 @@ Sentry cuts regular releases for self-hosting to keep it as close to [sentry.io] ## Upgrading -We encourage everyone to regularly update their Sentry installations to get the best and the most recent Sentry experience. +We encourage everyone to regularly update their Sentry installations to get the best and the most recent Sentry experience. The best upgrade interval is every month, as this is the frequency of our release schedule. -Before starting the upgrade, we shut down all the services and then run some data migrations, so expect to have some downtime. There is an *experimental* `--minimize-downtime` option to reduce the downtime during upgrades. Use this at your own risk and see [the pull request it was implemented in](https://github.com/getsentry/self-hosted/issues/607) for more information. +Before starting the upgrade, we shut down all the services and then run some data migrations, so expect to have some downtime. There is an *experimental* `--minimize-downtime` option to reduce the downtime during upgrades. Use this at your own risk and see [the pull request it was implemented in](https://github.com/getsentry/self-hosted/issues/607) for more information. We assume you've cloned the self-hosted repository, so checkout the version you want to upgrade to (25.7.0 as an example). @@ -37,8 +37,6 @@ git checkout 25.7.0 We may have some updated configuration, especially for new features, so always check the example config files under the sentry directory and see if you need to update your existing configuration. We do our best to automate critical configuration updates, but you should always check your configs during upgrades. -If you have a `.env.custom` file, make sure to copy new environment variables from the `.env` file into the `.env.custom` file before running the install script. - Finally, to upgrade, run `./install.sh`. Upon completion, run `docker compose up --wait` (or if you have `.env.custom` file, run `docker compose --env-file .env --env-file .env.custom up --wait`). ### Hard Stops @@ -81,7 +79,7 @@ This section lists known issues with specific versions of the self-hosted Sentry ## Nightly Builds -We provide nightly builds from the [master branch of the self-hosted repository](https://github.com/getsentry/self-hosted/) for each new commit for [Sentry](https://github.com/getsentry/sentry), and all of the supporting projects: +We provide nightly builds from the [master branch of the self-hosted repository](https://github.com/getsentry/self-hosted/) for each new commit for [Sentry](https://github.com/getsentry/sentry), and all of the supporting projects: - [Snuba](https://github.com/getsentry/snuba) - [Relay](https://github.com/getsentry/relay) @@ -89,8 +87,9 @@ We provide nightly builds from the [master branch of the self-hosted repository - [Vroom](https://github.com/getsentry/vroom) - [Uptime Checker](https://github.com/getsentry/uptime-checker) - [Taskbroker](https://github.com/getsentry/taskbroker) +- [Launchpad](https://github.com/getsentry/launchpad) -These builds are usually stable, but you may occasionally hit a broken version as these versions are not guaranteed to be deployed to [sentry.io](http://sentry.io/) first. There is also no guarantee that you will be able to do a clean upgrade to later versions without losing any data. **Use the nightly builds at your own risk.** +These builds are usually stable, but you may occasionally hit a broken version as these versions are not guaranteed to be deployed to [sentry.io](http://sentry.io/) right away, or due to missing configuration. There is also no guarantee that you will be able to do a clean upgrade to later versions without losing any data. **Use the nightly builds at your own risk.** ## Breaking Changes From a01d830bd0c76f62366803fcc2fa6f6e7a3492a0 Mon Sep 17 00:00:00 2001 From: "sentry-api-schema-updater[bot]" <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> Date: Tue, 20 Oct 2026 11:56:32 +0000 Subject: [PATCH 003/127] Bump API schema to 1ef2ab27 (#20104) Co-authored-by: sentry-api-schema-updater[bot] <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> --- src/build/resolveOpenAPI.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/resolveOpenAPI.ts b/src/build/resolveOpenAPI.ts index 5980b6674f725..d3407ca1108b5 100644 --- a/src/build/resolveOpenAPI.ts +++ b/src/build/resolveOpenAPI.ts @@ -6,7 +6,7 @@ import {DeRefedOpenAPI, Parameter} from './open-api/types'; // SENTRY_API_SCHEMA_SHA is used in the sentry-docs GHA workflow in getsentry/sentry-api-schema. // DO NOT change variable name unless you change it in the sentry-docs GHA workflow in getsentry/sentry-api-schema. -const SENTRY_API_SCHEMA_SHA = '2b03abf70a7a2734b7fa30b77be972f741449172'; +const SENTRY_API_SCHEMA_SHA = '1ef2ab2770f6c455aec8462cf284008426679e42'; const activeEnv = process.env.GATSBY_ENV || process.env.NODE_ENV || 'development'; From a706b45968e0d9e685e5f940074866224a9d386b Mon Sep 17 00:00:00 2001 From: "sentry-api-schema-updater[bot]" <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> Date: Tue, 20 Oct 2026 12:00:22 +0000 Subject: [PATCH 004/127] Bump API schema to a1e7464c (#20105) Co-authored-by: sentry-api-schema-updater[bot] <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> --- src/build/resolveOpenAPI.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/resolveOpenAPI.ts b/src/build/resolveOpenAPI.ts index d3407ca1108b5..dcad5e33d8c01 100644 --- a/src/build/resolveOpenAPI.ts +++ b/src/build/resolveOpenAPI.ts @@ -6,7 +6,7 @@ import {DeRefedOpenAPI, Parameter} from './open-api/types'; // SENTRY_API_SCHEMA_SHA is used in the sentry-docs GHA workflow in getsentry/sentry-api-schema. // DO NOT change variable name unless you change it in the sentry-docs GHA workflow in getsentry/sentry-api-schema. -const SENTRY_API_SCHEMA_SHA = '1ef2ab2770f6c455aec8462cf284008426679e42'; +const SENTRY_API_SCHEMA_SHA = 'a1e7464c55cb6eabf4565482e22c9c8002b8ee3b'; const activeEnv = process.env.GATSBY_ENV || process.env.NODE_ENV || 'development'; From d2d61f083c007f468b8d0bdc334ad4e43f9bfa38 Mon Sep 17 00:00:00 2001 From: "sentry-junior[bot]" <264270552+sentry-junior[bot]@users.noreply.github.com> Date: Tue, 20 Oct 2026 09:50:26 -0400 Subject: [PATCH 005/127] docs(size-analysis): Link status check rules API from Status Checks (#20109) ## DESCRIBE YOUR PR Adds a link to the [Size Analysis status check rules API](https://docs.sentry.io/api/mobile-builds/retrieve-size-analysis-status-check-rules-for-a-project/) in the Status Checks section of the Size Analysis overview page, so readers can find how to read a project's rules programmatically without digging into the CI integration guide. ## IS YOUR CHANGE URGENT? - [ ] Urgent deadline (GA date, etc.): YYYY-MM-DD - [ ] Other deadline: YYYY-MM-DD - [x] No deadline: Not urgent, can wait up to 1 week+ ## PRE-MERGE CHECKLIST - [ ] Checked Vercel preview for correctness, including links - [ ] PR was reviewed and approved by any necessary SMEs (subject matter experts) - [ ] PR was reviewed and approved by a member of the [Sentry docs team](https://github.com/orgs/getsentry/teams/docs) via **max.topolsky**. -- [View Junior Session](https://junior-prod.sentry.dev/conversations/slack%3AC0C688S96UU%3A1792502714.313099) [[Sentry]](https://sentry.sentry.io/explore/conversations/slack%3AC0C688S96UU%3A1792502714.313099/?project=4510944073809921) --------- Co-authored-by: sentry-junior[bot] <264270552+sentry-junior[bot]@users.noreply.github.com> Co-authored-by: Max Topolsky --- docs/product/size-analysis/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/product/size-analysis/index.mdx b/docs/product/size-analysis/index.mdx index 96e3ebb9a72aa..892521147c098 100644 --- a/docs/product/size-analysis/index.mdx +++ b/docs/product/size-analysis/index.mdx @@ -81,7 +81,7 @@ Integrate into CI Size Analysis results on pull requests. You can track size on ![Status check screenshot placeholder](./images/status-check.png) -Learn how to set it up in the [CI integration guide](/product/size-analysis/integrating-into-ci/). +Learn how to set it up in the [CI integration guide](/product/size-analysis/integrating-into-ci/). You can access a project's status check rules via the [API](/api/mobile-builds/retrieve-size-analysis-status-check-rules-for-a-project/). ### Monitoring and Alerting From 2c1980ad1051d483faa0573254c89f45bc022abd Mon Sep 17 00:00:00 2001 From: "sentry-junior[bot]" <264270552+sentry-junior[bot]@users.noreply.github.com> Date: Tue, 20 Oct 2026 17:27:09 +0200 Subject: [PATCH 006/127] docs(develop): Remove next_trace span link type (#20113) ## DESCRIBE YOUR PR Removes `next_trace` from the predefined `sentry.link.type` values in the span links develop docs. No SDK sets this link type, and the product doesn't read it. Span links only point to spans that already exist, and the next trace doesn't exist yet when the current trace is sent. The trace view finds the next trace the other way around: it searches for a trace whose `previous_trace` link points at the current trace (see `useFindLinkedTraces.ts` in getsentry/sentry). The JS SDK already marks `next_trace` as "Not set by the SDK". `next_trace` is also still listed as an enum value in `sentry-conventions` (`sentry__link__type.json`). That can be cleaned up separately. ## IS YOUR CHANGE URGENT? - [ ] Urgent deadline (GA date, etc.): YYYY-MM-DD - [ ] Other deadline: YYYY-MM-DD - [x] No deadline: Not urgent, can wait up to 1 week+ ## PRE-MERGE CHECKLIST - [ ] Checked Vercel preview for correctness, including links - [ ] PR was reviewed and approved by any necessary SMEs (subject matter experts) - [ ] PR was reviewed and approved by a member of the [Sentry docs team](https://github.com/orgs/getsentry/teams/docs) via **Sigrid Huemer**. -- [View Junior Session](https://junior-prod.sentry.dev/conversations/slack%3AC0CATDDN8TW%3A1792509038.539669) [[Sentry]](https://sentry.sentry.io/explore/conversations/slack%3AC0CATDDN8TW%3A1792509038.539669/?project=4510944073809921) Co-authored-by: sentry-junior[bot] <264270552+sentry-junior[bot]@users.noreply.github.com> Co-authored-by: Sigrid Huemer --- develop-docs/sdk/telemetry/traces/span-links.mdx | 1 - 1 file changed, 1 deletion(-) diff --git a/develop-docs/sdk/telemetry/traces/span-links.mdx b/develop-docs/sdk/telemetry/traces/span-links.mdx index 5fca4c0d459bd..eea20abe92c47 100644 --- a/develop-docs/sdk/telemetry/traces/span-links.mdx +++ b/develop-docs/sdk/telemetry/traces/span-links.mdx @@ -146,7 +146,6 @@ Any string can be used, but these types have predefined meanings: | `sentry.link.type` | Usage | UI Implications | |--------------------|--------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------| | "previous_trace" | Linking e.g. a navigation span to the previous page load span. | Used to query linked traces. Shows a button to go to linked previous trace in the trace explorer. | -| "next_trace" | Linking e.g. a page load span to the next navigation span. | Used to query linked traces. Shows a button to go to linked next trace in the trace explorer. | | "cache_origin" | Linking a span that reads a cached value to the trace that produced that value (e.g. server-side rendering). | Used to navigate from a cache-hit span to the origin trace. | ### `previous_trace` From 24bf5eae157bac10a6f44c6ad07afe2ec7573e62 Mon Sep 17 00:00:00 2001 From: "sentry-api-schema-updater[bot]" <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> Date: Tue, 20 Oct 2026 17:31:37 +0000 Subject: [PATCH 007/127] Bump API schema to 3cdad034 (#20114) Co-authored-by: sentry-api-schema-updater[bot] <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> --- src/build/resolveOpenAPI.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/resolveOpenAPI.ts b/src/build/resolveOpenAPI.ts index dcad5e33d8c01..de218d8e8b671 100644 --- a/src/build/resolveOpenAPI.ts +++ b/src/build/resolveOpenAPI.ts @@ -6,7 +6,7 @@ import {DeRefedOpenAPI, Parameter} from './open-api/types'; // SENTRY_API_SCHEMA_SHA is used in the sentry-docs GHA workflow in getsentry/sentry-api-schema. // DO NOT change variable name unless you change it in the sentry-docs GHA workflow in getsentry/sentry-api-schema. -const SENTRY_API_SCHEMA_SHA = 'a1e7464c55cb6eabf4565482e22c9c8002b8ee3b'; +const SENTRY_API_SCHEMA_SHA = '3cdad0342a56d71baff4742c39b83a22c76f9fbd'; const activeEnv = process.env.GATSBY_ENV || process.env.NODE_ENV || 'development'; From ae069295208e0f4ca8aa8358f31edeea76c6bdab Mon Sep 17 00:00:00 2001 From: "sentry-api-schema-updater[bot]" <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> Date: Tue, 20 Oct 2026 17:35:26 +0000 Subject: [PATCH 008/127] Bump API schema to a25931d5 (#20115) Co-authored-by: sentry-api-schema-updater[bot] <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> --- src/build/resolveOpenAPI.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/resolveOpenAPI.ts b/src/build/resolveOpenAPI.ts index de218d8e8b671..1126700724055 100644 --- a/src/build/resolveOpenAPI.ts +++ b/src/build/resolveOpenAPI.ts @@ -6,7 +6,7 @@ import {DeRefedOpenAPI, Parameter} from './open-api/types'; // SENTRY_API_SCHEMA_SHA is used in the sentry-docs GHA workflow in getsentry/sentry-api-schema. // DO NOT change variable name unless you change it in the sentry-docs GHA workflow in getsentry/sentry-api-schema. -const SENTRY_API_SCHEMA_SHA = '3cdad0342a56d71baff4742c39b83a22c76f9fbd'; +const SENTRY_API_SCHEMA_SHA = 'a25931d59d71c403d7d912bf9eca4308ab36f70b'; const activeEnv = process.env.GATSBY_ENV || process.env.NODE_ENV || 'development'; From 6f86cefb84ede1aaabab68ef6bef2404ddc402ab Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Tue, 20 Oct 2026 20:41:22 +0200 Subject: [PATCH 009/127] docs(nestjs): Clarify background job scope isolation (#20079) The NestJS docs still recommend manual scope wrappers for handlers the SDK already isolates. Document automatic isolation for scheduled tasks, event handlers, and BullMQ processors, and use a BullMQ lifecycle listener to demonstrate when manual isolation is still needed. Fixes getsentry/sentry-javascript#19767 ([JS-1923](https://linear.app/getsentry/issue/JS-1923)). ## IS YOUR CHANGE URGENT? - [ ] Urgent deadline (GA date, etc.): YYYY-MM-DD - [ ] Other deadline: YYYY-MM-DD - [x] No deadline: Not urgent, can wait up to 1 week+ Co-authored-by: OpenAI GPT-6 --- .../guides/nestjs/features/async-context.mdx | 52 ++++++++++++------- .../javascript/guides/nestjs/index.mdx | 2 +- 2 files changed, 34 insertions(+), 20 deletions(-) diff --git a/docs/platforms/javascript/guides/nestjs/features/async-context.mdx b/docs/platforms/javascript/guides/nestjs/features/async-context.mdx index 44c5938deaff8..efe99e8323275 100644 --- a/docs/platforms/javascript/guides/nestjs/features/async-context.mdx +++ b/docs/platforms/javascript/guides/nestjs/features/async-context.mdx @@ -3,30 +3,44 @@ title: Isolate Background Job Scopes description: "Learn how to isolate Sentry scopes in NestJS background jobs to prevent breadcrumb leakage into HTTP request events." --- -In NestJS, background job handlers like `@Cron()`, `@Interval()`, `@OnEvent()`, or BullMQ `@Processor()` handlers share the default isolation scope with incoming HTTP requests. This means breadcrumbs and tags added inside background jobs can leak into error events from unrelated HTTP requests, making it harder to debug issues. +Background jobs need their own isolation scopes to prevent breadcrumbs and tags from leaking into unrelated HTTP request events. -To prevent this, wrap each background job handler with `Sentry.withIsolationScope()` to give it its own isolated scope. Here's an example using `@Cron()`: +## Automatic Isolation -```typescript +Sentry automatically forks an isolation scope for each invocation of: + +- `@Cron()`, `@Interval()`, and `@Timeout()` handlers from `@nestjs/schedule` +- `@OnEvent()` handlers from `@nestjs/event-emitter` +- The `process()` method of `@Processor()` classes from `@nestjs/bullmq` + +These handlers do not need a manual `Sentry.withIsolationScope()` wrapper. + +## Manual Isolation + +For other background tasks, wrap each handler with `Sentry.withIsolationScope()` to give it its own isolated scope. + +For example, BullMQ lifecycle event listeners such as `@OnWorkerEvent('completed')` can run outside the isolation scope created for `process()` and need their own wrapper: + +```typescript {filename: my.processor.ts} import * as Sentry from "@sentry/nestjs"; -import { Injectable } from "@nestjs/common"; -import { Cron, CronExpression } from "@nestjs/schedule"; - -@Injectable() -export class MyJobService { - @Cron(CronExpression.EVERY_HOUR) - handleCron() { - Sentry.withIsolationScope(() => { - // Breadcrumbs and tags added here won't leak into HTTP request events - Sentry.addBreadcrumb({ message: "Processing scheduled job" }); - this.doWork(); - }); +import { OnWorkerEvent, Processor, WorkerHost } from "@nestjs/bullmq"; +import { Job } from "bullmq"; + +@Processor("my-queue") +export class MyProcessor extends WorkerHost { + async process(job: Job) { + // Your job processing logic runs in an automatically isolated scope. } - private doWork() { - // your job logic + @OnWorkerEvent("completed") + onCompleted(job: Job) { + return Sentry.withIsolationScope(() => { + Sentry.addBreadcrumb({ + message: "Job completed", + data: { jobId: job.id }, + }); + // Your completion handler logic. + }); } } ``` - -Apply the same pattern to `@Interval()`, `@OnEvent()`, `@Processor()`, and any other background task that runs outside the context of a request lifecycle. diff --git a/docs/platforms/javascript/guides/nestjs/index.mdx b/docs/platforms/javascript/guides/nestjs/index.mdx index eb37fbc9c5b5b..9a8aef2cc21a2 100644 --- a/docs/platforms/javascript/guides/nestjs/index.mdx +++ b/docs/platforms/javascript/guides/nestjs/index.mdx @@ -87,7 +87,7 @@ export class AppModule {} ## Isolate Async Context for Background Jobs (Optional) -If your NestJS app uses background jobs (such as `@Cron()`, `@Interval()`, `@OnEvent()`, or BullMQ), breadcrumbs from those jobs can leak into unrelated HTTP request error events. Wrap your background job handlers with `Sentry.withIsolationScope()` to isolate them. See Isolate Background Job Scopes for details and code examples. +Sentry automatically isolates background jobs using `@Cron()`, `@Interval()`, `@Timeout()`, `@OnEvent()`, and BullMQ `@Processor()` handlers. For other background tasks, wrap your handlers with `Sentry.withIsolationScope()` to prevent breadcrumbs and tags from leaking into unrelated events. See Isolate Background Job Scopes for details and code examples. ## Control the Data You Send to Sentry (Optional) From 77086dfd0e489e361f934a238ce0fa0bb31f0279 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20Daxb=C3=B6ck?= Date: Tue, 20 Oct 2026 21:08:43 +0200 Subject: [PATCH 010/127] docs: Remove outdated logs and metrics enable flags from shared pages (#19996) ## DESCRIBE YOUR PR Most SDKs no longer need `enable_logs` / `enable_metrics` for their manual logs and metrics APIs, and several have removed the options. A few shared pages still told readers to set them: - **What to Log guide:** drops the removed flags from the Ruby (SDK 7.0) and Flutter (SDK 10) tabs, and switches the JavaScript tab to `consoleLoggingIntegration`, since `captureConsoleIntegration` sends console calls as errors, not logs. - **Sentry Basics table:** the Logs row now says "Add log calls or a logging integration" instead of "Enable `enableLogs: true`". - **Manage Application Metrics quota:** "Disabling Metrics" now recommends returning `null` from `beforeSendMetric` (or the SDK's equivalent) instead of `enableMetrics` options that were removed or no longer work. - **Manage Logs quota:** drops the removed `enableLogs` from the JavaScript example and `enable_logs` from the Python example, and fixes the Python example's invalid keyword syntax. - **Rails quick start:** adds a note that Rails structured logging is disabled by default since Ruby SDK 7.1.0, using the Rails Logs page's wording. The guide's Python, .NET, Swift and Kotlin tabs keep their flags for now. The flags still turn on logging integrations in Python 2.x, .NET 6.x and Java/Android 8.x, and the Apple docs still describe `enableLogs` as required (follow-up). Refs SDK-1533 ## IS YOUR CHANGE URGENT? Help us prioritize incoming PRs by letting us know when the change needs to go live. Select exactly one option. For deadlines, replace `YYYY-MM-DD` with the due date. You can update this information later by editing the PR description. - [ ] Urgent deadline (GA date, etc.): YYYY-MM-DD - [ ] Other deadline: YYYY-MM-DD - [x] No deadline: Not urgent, can wait up to 1 week+ ## SLA - Teamwork makes the dream work, so please add a reviewer to your PRs. - Please give the docs team up to 1 week to review your PR unless you've supplied a deadline. Thanks in advance for your help! ## PRE-MERGE CHECKLIST _Make sure you've checked the following before merging your changes:_ - [ ] Checked Vercel preview for correctness, including links - [ ] PR was reviewed and approved by any necessary SMEs (subject matter experts) - [ ] PR was reviewed and approved by a member of the [Sentry docs team](https://github.com/orgs/getsentry/teams/docs) --------- Co-authored-by: Claude Opus 5.5 (1M context) --- docs/get-started/guides/logs.mdx | 4 +--- docs/pricing/quotas/manage-application-metrics-quota.mdx | 2 +- docs/pricing/quotas/manage-logs-quota.mdx | 4 +--- includes/sentry-basics-getting-started.mdx | 2 +- platform-includes/getting-started-verify/ruby.mdx | 6 ++++++ 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/docs/get-started/guides/logs.mdx b/docs/get-started/guides/logs.mdx index b42b30d791a33..4040c6ee31049 100644 --- a/docs/get-started/guides/logs.mdx +++ b/docs/get-started/guides/logs.mdx @@ -810,7 +810,7 @@ Sentry.init({ tracesSampleRate: 1.0, // 100% of traces // Capture all logs in development integrations: [ - Sentry.captureConsoleIntegration({ + Sentry.consoleLoggingIntegration({ levels: ["log", "info", "warn", "error", "debug"], }), ], @@ -851,7 +851,6 @@ Sentry.init do |config| config.dsn = '...' config.environment = 'development' config.traces_sample_rate = 1.0 # 100% of traces - config.enable_logs = true end ``` @@ -861,7 +860,6 @@ await SentryFlutter.init( options.dsn = '...'; options.environment = 'development'; options.tracesSampleRate = 1.0; // 100% of traces - options.enableLogs = true; }, appRunner: () => runApp(MyApp()), ); diff --git a/docs/pricing/quotas/manage-application-metrics-quota.mdx b/docs/pricing/quotas/manage-application-metrics-quota.mdx index 09c846172c3b1..715b4b60d8c6e 100644 --- a/docs/pricing/quotas/manage-application-metrics-quota.mdx +++ b/docs/pricing/quotas/manage-application-metrics-quota.mdx @@ -92,7 +92,7 @@ sentry_sdk.init( ### Disabling Metrics -If you want to stop sending Application Metrics from a specific SDK entirely, most SDKs expose an option to disable metrics without removing the rest of your Sentry configuration (for example, `enableMetrics: false` in JavaScript SDKs or `experimental.enableMetrics = false` on Apple platforms). See the [platform-specific metrics docs](/product/metrics/getting-started/) for the option name on your SDK. +If you want to stop sending Application Metrics from a specific SDK entirely, use the `beforeSendMetric` callback shown above (or your SDK's equivalent) to return `null` for every metric, or remove the metric calls from your code. See the [platform-specific metrics docs](/product/metrics/getting-started/) for details on your SDK. ### Application Metrics Filtering diff --git a/docs/pricing/quotas/manage-logs-quota.mdx b/docs/pricing/quotas/manage-logs-quota.mdx index 52a0113da6e44..08759cbda3fa3 100644 --- a/docs/pricing/quotas/manage-logs-quota.mdx +++ b/docs/pricing/quotas/manage-logs-quota.mdx @@ -60,7 +60,6 @@ For various SDKs, there's the ability to filter out logs before sending to Sentr ```js Sentry.init({ dsn: "___PUBLIC_DSN___", - enableLogs: true, beforeSendLog: (log) => { if (log.level === "info") { // Filter out all info logs @@ -86,8 +85,7 @@ def before_log(log: Log, _hint: Hint) -> Optional[Log]: sentry_sdk.init( dsn="___PUBLIC_DSN___", - "enable_logs": True, - "before_send_log": before_log, + before_send_log=before_log, ) ``` diff --git a/includes/sentry-basics-getting-started.mdx b/includes/sentry-basics-getting-started.mdx index 3f3ca114b29d8..67e7293fad6f5 100644 --- a/includes/sentry-basics-getting-started.mdx +++ b/includes/sentry-basics-getting-started.mdx @@ -30,7 +30,7 @@ After basic error monitoring, these features add the debugging context that will | Feature | What it adds | Set up | | ---------------------------------------------- | ----------------------------------------------------------- | ---------------------------------------------------------------------------------------- | | **[Tracing](/product/trace-explorer/)** | Follow requests across services, find slow queries and N+1s | Enable `tracesSampleRate` in SDK config | -| **[Logs](/product/logs/)** | Structured logs alongside errors and traces | Enable `enableLogs: true` in SDK config — [set up guide](/product/logs/getting-started/) | +| **[Logs](/product/logs/)** | Structured logs alongside errors and traces | Add log calls or a logging integration — [set up guide](/product/logs/getting-started/) | | **[Session Replay](/product/session-replay/)** | Video-like recordings of user sessions (web and mobile) | Enable replay in SDK config | | **[Profiling](/product/profiling/)** | CPU profiles showing which functions are slow | Enable profiling in SDK config | | **[Application Metrics](/product/metrics/)** | Custom counters, gauges, distributions | Add metric calls to your code | diff --git a/platform-includes/getting-started-verify/ruby.mdx b/platform-includes/getting-started-verify/ruby.mdx index 8f71d92b5981f..3dcf8a9e7b554 100644 --- a/platform-includes/getting-started-verify/ruby.mdx +++ b/platform-includes/getting-started-verify/ruby.mdx @@ -39,6 +39,12 @@ To verify that Sentry catches your logs, add some log statements to your applica Use Sentry's Ruby stdlib Logger integration to capture logs from all loggers that use Ruby Logger automatically. + + +Rails structured logging is disabled by default. Set `config.rails.structured_logging.enabled = true` to capture Rails framework events, such as ActiveRecord queries and controller actions. + + + ```ruby Sentry.logger.info("This is an info log message") From 29e6c68bc407a913213a9a0ab27227bf9ed8c4f2 Mon Sep 17 00:00:00 2001 From: Saad Khan Date: Tue, 20 Oct 2026 16:42:05 -0700 Subject: [PATCH 011/127] docs(auth): Add SCIM 2.0 service discovery section (#19817) ## DESCRIBE YOUR PR Adds a short "SCIM 2.0 Service Discovery" subsection under SCIM Provisioning on the [SSO page](https://docs.sentry.io/organization/authentication/sso/#scim-provisioning), and links to it from the SAML2 page's SCIM section. It covers the RFC 7644 Section 4 discovery endpoints (`ServiceProviderConfig`, `ResourceTypes`, `Schemas`) that getsentry/sentry#119884 completed: they live under the SCIM URL shown in Sentry's auth settings, they require the same Auth Token as the rest of the SCIM API, and identity governance platforms such as SailPoint IdentityIQ need them to connect. The per-endpoint reference pages are already live under [/api/scim/](https://docs.sentry.io/api/scim/) from the automatic schema bump, so this PR is prose only. The matching update to the intro text on the `/api/scim/` page is in getsentry/sentry#126535. Neither PR depends on the other. #### Issues * Refs: getsentry/sentry#114950 * Refs: ENG-7619 ## IS YOUR CHANGE URGENT? Help us prioritize incoming PRs by letting us know when the change needs to go live. Select exactly one option. For deadlines, replace `YYYY-MM-DD` with the due date. You can update this information later by editing the PR description. - [ ] Urgent deadline (GA date, etc.): YYYY-MM-DD - [ ] Other deadline: YYYY-MM-DD - [x] No deadline: Not urgent, can wait up to 1 week+ --- docs/organization/authentication/sso/index.mdx | 6 ++++++ docs/organization/authentication/sso/saml2.mdx | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/organization/authentication/sso/index.mdx b/docs/organization/authentication/sso/index.mdx index c264f4c58b177..dc8d7f1c694cd 100644 --- a/docs/organization/authentication/sso/index.mdx +++ b/docs/organization/authentication/sso/index.mdx @@ -179,3 +179,9 @@ System for Cross-Domain Identity Management ([SCIM](http://www.simplecloud.info/ - [Okta SCIM Setup](/organization/authentication/sso/okta-sso/okta-scim/) - [Azure AD SCIM Setup](/organization/authentication/sso/azure-sso/#scim-integration) - If your Provider is not listed here, SCIM may be supported as it is a common standard. If you are having issues please contact our support team. + +### SCIM 2.0 Service Discovery + +Sentry supports the SCIM 2.0 service discovery endpoints defined in [Section 4 of RFC 7644](https://datatracker.ietf.org/doc/html/rfc7644#section-4): `ServiceProviderConfig`, `ResourceTypes`, and `Schemas`. They're available under your SCIM URL, require the same Auth Token as the rest of the SCIM API, and need no additional setup. + +Identity Governance and Administration (IGA) platforms, such as SailPoint IdentityIQ, require these endpoints to connect and use them to discover which SCIM features and attributes Sentry supports. For request and response details, see the [SCIM API documentation](/api/scim/). diff --git a/docs/organization/authentication/sso/saml2.mdx b/docs/organization/authentication/sso/saml2.mdx index 5c998ab2fd2cc..bbbce5f6cd03d 100644 --- a/docs/organization/authentication/sso/saml2.mdx +++ b/docs/organization/authentication/sso/saml2.mdx @@ -136,7 +136,7 @@ Because Sentry uses Just-In-Time (JIT) provisioning, new members are registered ## SCIM Provisioning -SCIM is available for automatic user provisioning, deprovisioning, and team assignment for SAML2 IdPs. [Configure Sentry for SCIM](/organization/authentication/sso/okta-sso/okta-scim/#sentry-configuration), and then follow your IdP's documentation for further setup. Learn more about the Sentry SCIM API endpoints in the [SCIM API documentation](/api/scim/). +SCIM is available for automatic user provisioning, deprovisioning, and team assignment for SAML2 IdPs. [Configure Sentry for SCIM](/organization/authentication/sso/okta-sso/okta-scim/#sentry-configuration), and then follow your IdP's documentation for further setup. Learn more about the Sentry SCIM API endpoints in the [SCIM API documentation](/api/scim/). If you connect an identity governance platform, such as SailPoint IdentityIQ, see [SCIM 2.0 Service Discovery](/organization/authentication/sso/#scim-20-service-discovery). ## FAQ From c9cb8e7e7ad9e5921e0233984f64ef825bebbf8b Mon Sep 17 00:00:00 2001 From: "sentry-api-schema-updater[bot]" <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> Date: Wed, 21 Oct 2026 00:58:41 +0000 Subject: [PATCH 012/127] Bump API schema to f56baf12 (#20118) Co-authored-by: sentry-api-schema-updater[bot] <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> --- src/build/resolveOpenAPI.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/resolveOpenAPI.ts b/src/build/resolveOpenAPI.ts index 1126700724055..585197ad6feb2 100644 --- a/src/build/resolveOpenAPI.ts +++ b/src/build/resolveOpenAPI.ts @@ -6,7 +6,7 @@ import {DeRefedOpenAPI, Parameter} from './open-api/types'; // SENTRY_API_SCHEMA_SHA is used in the sentry-docs GHA workflow in getsentry/sentry-api-schema. // DO NOT change variable name unless you change it in the sentry-docs GHA workflow in getsentry/sentry-api-schema. -const SENTRY_API_SCHEMA_SHA = 'a25931d59d71c403d7d912bf9eca4308ab36f70b'; +const SENTRY_API_SCHEMA_SHA = 'f56baf126283e34ad030980cdfe86b4872667459'; const activeEnv = process.env.GATSBY_ENV || process.env.NODE_ENV || 'development'; From 24f553d1e6dc95ab0f6e8ea837c722640e25be5f Mon Sep 17 00:00:00 2001 From: "sentry-api-schema-updater[bot]" <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> Date: Wed, 21 Oct 2026 01:02:07 +0000 Subject: [PATCH 013/127] Bump API schema to 285d9cbc (#20119) Co-authored-by: sentry-api-schema-updater[bot] <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> --- src/build/resolveOpenAPI.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/resolveOpenAPI.ts b/src/build/resolveOpenAPI.ts index 585197ad6feb2..abbee9db096ad 100644 --- a/src/build/resolveOpenAPI.ts +++ b/src/build/resolveOpenAPI.ts @@ -6,7 +6,7 @@ import {DeRefedOpenAPI, Parameter} from './open-api/types'; // SENTRY_API_SCHEMA_SHA is used in the sentry-docs GHA workflow in getsentry/sentry-api-schema. // DO NOT change variable name unless you change it in the sentry-docs GHA workflow in getsentry/sentry-api-schema. -const SENTRY_API_SCHEMA_SHA = 'f56baf126283e34ad030980cdfe86b4872667459'; +const SENTRY_API_SCHEMA_SHA = '285d9cbc72165ebc7de508d757f5598bb459fa2c'; const activeEnv = process.env.GATSBY_ENV || process.env.NODE_ENV || 'development'; From dca8c337fdebaaab3795ef7bbbc68e52a6746f9f Mon Sep 17 00:00:00 2001 From: "sentry-junior[bot]" <264270552+sentry-junior[bot]@users.noreply.github.com> Date: Wed, 21 Oct 2026 07:51:29 +0000 Subject: [PATCH 014/127] docs(python): Fix trace_ignore_status_codes option type (#20121) ## DESCRIBE YOUR PR The Python options page lists `trace_ignore_status_codes` as type `bool`, but the option takes a set of HTTP status codes. This changes the documented type to `AbstractSet[int]`. The default (`frozenset()`) and description stay as they are. Source evidence (sentry-python `2.72.0`, the latest release): - [`sentry_sdk/consts.py`](https://github.com/getsentry/sentry-python/blob/2.72.0/sentry_sdk/consts.py#L1448) declares `trace_ignore_status_codes: "AbstractSet[int]" = frozenset()` - [`sentry_sdk/tracing.py`](https://github.com/getsentry/sentry-python/blob/2.72.0/sentry_sdk/tracing.py#L1024) checks membership with `status_code in client.options["trace_ignore_status_codes"]` Corrected claim: `trace_ignore_status_codes` is `AbstractSet[int]` (for example `{403, 404}`), not `bool`. cc @getsentry/owners-python-sdk ## IS YOUR CHANGE URGENT? - [ ] Urgent deadline (GA date, etc.): YYYY-MM-DD - [ ] Other deadline: YYYY-MM-DD - [x] No deadline: Not urgent, can wait up to 1 week+ via Junior system actor `event`. -- [View Junior Session](https://junior-prod.sentry.dev/conversations/agent-dispatch%3Adispatch_51ed2321cd7553f06241dff253dee523) [[Sentry]](https://sentry.sentry.io/explore/conversations/agent-dispatch%3Adispatch_51ed2321cd7553f06241dff253dee523/?project=4510944073809921) --------- Co-authored-by: sentry-junior[bot] <264270552+sentry-junior[bot]@users.noreply.github.com> Co-authored-by: Ivana Kellyer --- docs/platforms/python/configuration/options.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/platforms/python/configuration/options.mdx b/docs/platforms/python/configuration/options.mdx index 786f17fc595d2..bc0c4c535fcf9 100644 --- a/docs/platforms/python/configuration/options.mdx +++ b/docs/platforms/python/configuration/options.mdx @@ -577,7 +577,7 @@ The threshold in milliseconds for adding the source location to an outgoing HTTP - + An optional property that disables tracing for HTTP requests with certain status codes. From 84d5e595c7a8101e20d83991638b1ced4146d2e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Peer=20St=C3=B6cklmair?= Date: Wed, 21 Oct 2026 10:53:21 +0200 Subject: [PATCH 015/127] docs(js): Load the Deno import hook with --preload (#20080) ## DESCRIBE YOUR PR follow up to #19365 This fixes the Deno guide: - Load `@sentry/deno/import` with `deno run --preload`, not as the first import of the entry file. - `--allow-read` is required when the hook is loaded. Without it, the app stops at start with `NotCapable: Requires read access`. The guide said that the SDK continues without it. - The troubleshooting entry for the JSON crash now says to remove the `--preload` flag. ## Why Deno loads the whole static import graph before the first import runs. With the first-import setup, the hook instrumented only CommonJS packages such as `pg` and `mysql`. ES module packages such as `openai` and `hono` stayed uninstrumented, with no warning (tested with `@sentry/deno` 11.8.0 on Deno 2.8.3). ## IS YOUR CHANGE URGENT? Help us prioritize incoming PRs by letting us know when the change needs to go live. Select exactly one option. For deadlines, replace `YYYY-MM-DD` with the due date. You can update this information later by editing the PR description. - [ ] Urgent deadline (GA date, etc.): YYYY-MM-DD - [ ] Other deadline: YYYY-MM-DD - [x] No deadline: Not urgent, can wait up to 1 week+ ## SLA - Teamwork makes the dream work, so please add a reviewer to your PRs. - Please give the docs team up to 1 week to review your PR unless you've supplied a deadline. Thanks in advance for your help! ## PRE-MERGE CHECKLIST _Make sure you've checked the following before merging your changes:_ - [ ] Checked Vercel preview for correctness, including links - [ ] PR was reviewed and approved by any necessary SMEs (subject matter experts) - [ ] PR was reviewed and approved by a member of the [Sentry docs team](https://github.com/orgs/getsentry/teams/docs) Co-authored-by: Claude Opus 5.5 --- .../common/troubleshooting/index.mdx | 6 +---- .../javascript/guides/deno/index.mdx | 25 ++++++++++--------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/docs/platforms/javascript/common/troubleshooting/index.mdx b/docs/platforms/javascript/common/troubleshooting/index.mdx index 838e9fb64f534..27a2e12db5ccf 100644 --- a/docs/platforms/javascript/common/troubleshooting/index.mdx +++ b/docs/platforms/javascript/common/troubleshooting/index.mdx @@ -808,11 +808,7 @@ error: Uncaught SyntaxError: Unexpected token ':' This is a Deno bug ([denoland/deno#36240](https://github.com/denoland/deno/issues/36240)): while any module hook is registered, Deno loads `.json` files with the wrong format. Express, Fastify, Hapi, Koa and mysql2 all read a JSON file this way. -Remove the `@sentry/deno/import` line from your entry file to start your app again: - -```javascript {filename: main.ts} -import * as Sentry from "npm:@sentry/deno"; -``` +Remove the `--preload=npm:@sentry/deno/import` flag from your `deno run` command to start your app again. Errors, `Deno.serve` and `node:http` spans, logs and metrics all keep working without the hook. You lose the integrations that depend on it, such as `mysql` 2.x and `pg`. Drivers that publish their own diagnostics channels, among them `mysql2` 3.20.0 and later and `ioredis` 5.11.0 and later, are instrumented either way. diff --git a/docs/platforms/javascript/guides/deno/index.mdx b/docs/platforms/javascript/guides/deno/index.mdx index 098dfe3040692..24d90265ac49e 100644 --- a/docs/platforms/javascript/guides/deno/index.mdx +++ b/docs/platforms/javascript/guides/deno/index.mdx @@ -29,15 +29,14 @@ Choose the features you want to configure, and this guide will show you how: ### Import the Sentry SDK -Import the Sentry Deno SDK directly from the npm registry, before importing any other modules. The first line registers the hook that instruments your database drivers, message queues, AI libraries and web frameworks. It only works as the first import of your entry file: +Import the Sentry Deno SDK directly from the npm registry, before importing any other modules: ```javascript {filename: main.ts} -import "___SDK_PACKAGE___/import"; import * as Sentry from "___SDK_PACKAGE___"; // your other imports ``` -The hook reads your dependencies from a local `node_modules` directory, not from Deno's global npm cache. Set `nodeModulesDir` in your `deno.json`: +The Sentry import hook, which you load when you [start your app](#start-your-app), reads your dependencies from a local `node_modules` directory, not from Deno's global npm cache. Set `nodeModulesDir` in your `deno.json`: ```json {filename: deno.json} { @@ -55,7 +54,6 @@ The hook reads your dependencies from a local `node_modules` directory, not from Initialize Sentry as early as possible in your app: ```javascript {filename: main.ts} -import "___SDK_PACKAGE___/import"; import * as Sentry from "___SDK_PACKAGE___"; // your other imports @@ -74,12 +72,15 @@ Sentry.init({ }); ``` -### Grant Permissions +### Start Your App + +Load the Sentry import hook with the `--preload` flag. The hook instruments your database drivers, message queues, AI libraries and web frameworks. An `import` statement in your entry file is too late for packages that ship ES modules, because Deno loads every module that your entry file imports before it runs any of them. Deno blocks access to the network, the file system and system information until you grant it. Start your app with all four permissions so that the SDK can send complete events. Add the other hosts your app talks to, separated by commas: ```bash deno run \ + --preload=___SDK_PACKAGE___/import \ --allow-net=___ORG_INGEST_DOMAIN___ \ --allow-env \ --allow-read=. \ @@ -89,14 +90,14 @@ deno run \ -| Flag | What it gives you | -| -------------------------------- | -------------------------------------------------------------------------------------------- | -| `--allow-net=` | Delivery of events to Sentry. If a host is missing, Deno names it in the error. | -| `--allow-env` | The import hook. Without it, your app stops at start with `NotCapable: Requires env access`. | -| `--allow-read=.` | Source code in stack traces, and `app:///` paths instead of absolute paths. | -| `--allow-sys=hostname,osRelease` | The server name and the operating system version on events. | +| Flag | What it gives you | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `--allow-net=` | Delivery of events to Sentry. If a host is missing, Deno names it in the error. | +| `--allow-env` | The import hook. Without it, your app stops at start with `NotCapable: Requires env access`. | +| `--allow-read=.` | The import hook, source code in stack traces, and `app:///` paths instead of absolute paths. Without it, your app stops at start with `NotCapable: Requires read access`. | +| `--allow-sys=hostname,osRelease` | The server name and the operating system version on events. | -If you omit `--allow-read` or `--allow-sys`, the SDK sends events without that data and prints no warning. +If you omit `--allow-sys`, the SDK sends events without that data and prints no warning. From 8654e1696065825a1263edc38a09cb49dd82f0d6 Mon Sep 17 00:00:00 2001 From: "sentry-junior[bot]" <264270552+sentry-junior[bot]@users.noreply.github.com> Date: Wed, 21 Oct 2026 11:23:20 +0200 Subject: [PATCH 016/127] feat(docs): Apply new quick start template to .NET quick start guides (#19990) ## DESCRIBE YOUR PR Applies the quick start template from #19295 (Ember) to the .NET landing page and 15 .NET guides: ASP.NET, ASP.NET Core, AWS Lambda, Azure Functions Worker, Blazor Server, Blazor WebAssembly, Entity Framework, MAUI, WinForms, WinUI, WPF, Xamarin, .NET for Android, .NET for Apple (iOS/Mac Catalyst), and Google Cloud Functions. All pages keep their single-column layout. The Serilog, NLog, log4net and Microsoft.Extensions.Logging pages are logging integration guides and are unchanged. - Removes the onboarding option checkboxes and `___PRODUCT_OPTION___` markers. - Configure names the features each guide sets up. The init snippets include all options by default, and a note explains that unwanted options can be removed. - **Logs:** `SentrySdk.Logger` works without an extra option. Guides whose logging integrations need it (ASP.NET Core, AWS Lambda, Azure Functions Worker, Blazor WebAssembly, MAUI) include `EnableLogs = true`. Xamarin and Google Cloud Functions have no Send Logs step because the Logs docs mark them as unsupported. - **Application Metrics:** enabled by default (SDK 6.1.0+); every guide except Xamarin has a Send Application Metrics step. `Sentry.Xamarin` depends on Sentry 4.x, which doesn't have the current metrics API, so the Metrics page now lists Xamarin as not supported. - **Profiling:** on the .NET for Apple guide, and as an optional step for .NET 8 and later on the .NET landing page, outside the default install and snippet. The docs mark it unsupported on Android and Google Cloud Functions. - **Session Replay:** named on .NET for Android and .NET for Apple, where it's documented. - Simplifies Verify. The shared `getting-started-verify/dotnet*.mdx` snippets are unchanged because other .NET guides (Serilog, NLog, log4net, etc.) also render them. - Fixes along the way: the AWS Lambda snippet used `o.TracesSampleRate` inside an `options =>` lambda (also broken on `master`); a few stale links and anchors on the Android and Apple guides; Google Cloud Functions' `DiagnosticsLevel` typo (now `DiagnosticLevel`) with the JSON wrapped in `{}`; metric attributes use `Dictionary` initializers so the snippets compile on .NET Framework (C# 7.3); every ASP.NET Core setup tab sets the DSN; and the Android guide keeps Session Replay text and image masking on. ## IS YOUR CHANGE URGENT? - [ ] Urgent deadline (GA date, etc.): YYYY-MM-DD - [ ] Other deadline: YYYY-MM-DD - [x] No deadline: Not urgent, can wait up to 1 week+ ## PRE-MERGE CHECKLIST - [ ] Checked Vercel preview for correctness, including links - [ ] PR was reviewed and approved by any necessary SMEs (subject matter experts) - [ ] PR was reviewed and approved by a member of the [Sentry docs team](https://github.com/orgs/getsentry/teams/docs) via Junior system actor `event`. -- [View Junior Session](https://junior-prod.sentry.dev/conversations/slack%3AD0BB8KQT6MU%3A1792013336.218129) [[Sentry]](https://sentry.sentry.io/explore/conversations/slack%3AD0BB8KQT6MU%3A1792013336.218129/?project=4510944073809921) --------- Co-authored-by: sentry-junior[bot] <264270552+sentry-junior[bot]@users.noreply.github.com> Co-authored-by: Shannon Anahata --- .../platforms/dotnet/common/metrics/index.mdx | 2 + .../platforms/dotnet/guides/android/index.mdx | 86 ++++++-- docs/platforms/dotnet/guides/apple/index.mdx | 85 ++++++-- docs/platforms/dotnet/guides/aspnet/index.mdx | 73 +++++-- .../dotnet/guides/aspnetcore/index.mdx | 185 ++++++++++++------ .../dotnet/guides/aws-lambda/index.mdx | 88 +++++++-- .../guides/azure-functions-worker/index.mdx | 87 +++++--- .../dotnet/guides/blazor-server/index.mdx | 68 +++++-- .../guides/blazor-webassembly/index.mdx | 73 ++++++- .../dotnet/guides/entityframework/index.mdx | 73 +++++-- .../guides/google-cloud-functions/index.mdx | 97 +++++---- docs/platforms/dotnet/guides/maui/index.mdx | 85 ++++++-- .../dotnet/guides/winforms/index.mdx | 69 +++++-- docs/platforms/dotnet/guides/winui/index.mdx | 74 +++++-- docs/platforms/dotnet/guides/wpf/index.mdx | 67 +++++-- .../platforms/dotnet/guides/xamarin/index.mdx | 45 +++-- docs/platforms/dotnet/index.mdx | 119 +++++++---- 17 files changed, 1019 insertions(+), 357 deletions(-) diff --git a/docs/platforms/dotnet/common/metrics/index.mdx b/docs/platforms/dotnet/common/metrics/index.mdx index 6363af6ef13e6..01a94054b9d7b 100644 --- a/docs/platforms/dotnet/common/metrics/index.mdx +++ b/docs/platforms/dotnet/common/metrics/index.mdx @@ -5,6 +5,8 @@ description: "Metrics allow you to send, view and query counters, gauges and mea sidebar_order: 3 sidebar_section: features new: true +notSupported: + - dotnet.xamarin --- diff --git a/docs/platforms/dotnet/guides/android/index.mdx b/docs/platforms/dotnet/guides/android/index.mdx index a22d3c50e1813..275826bcbcc2c 100644 --- a/docs/platforms/dotnet/guides/android/index.mdx +++ b/docs/platforms/dotnet/guides/android/index.mdx @@ -6,20 +6,6 @@ description: "Learn about Sentry's .NET integration with .NET for Android" Sentry supports [.NET for Android](https://learn.microsoft.com/dotnet/android/getting-started/installation/) directly from the [Sentry NuGet package](https://www.nuget.org/packages/Sentry). -## Overview of the features - -- All the features of our main [.NET SDK](/platforms/dotnet/), for your managed code -- Attach LogCat logs to events -- Java crash reporting for Android, leveraging our [Android SDK](/platforms/android/) including: - - [Capture Application Not Responding (ANR) errors](/platforms/android/configuration/app-not-respond/) when the app is unresponsive - - Automatically [attach screenshots to Java exceptions](/platforms/android/enriching-events/screenshots/) - - Automatic breadcrumbs for Activity lifecycle, App lifecycle, System and Network events and User Interactions - - Automatic [Activity lifecycle tracing](/platforms/android/tracing/instrumentation/automatic-instrumentation/#activity-instrumentation) and [User Interaction tracing](/platforms/android/performance/instrumentation/automatic-instrumentation/#user-interaction-instrumentation) - - Device Root checking -- Native crash reporting for Android, leveraging our [Android NDK](/platforms/android/configuration/using-ndk/) -- Automatic session tracking and [release health](/product/releases/) -- _Session Replay for Android_ (currently experimental) - ## Install Add the Sentry dependency to your .NET for Android application: @@ -34,8 +20,31 @@ Install-Package Sentry -Version {{@inject packages.version('sentry.dotnet') }} ## Configure +**Error Monitoring** starts working as soon as you call `SentrySdk.Init()`. **Logs** sent through `SentrySdk.Logger` and **Application Metrics** need no extra configuration. You'll learn how to send them in [Send Logs](#send-logs) and [Send Application Metrics](#send-application-metrics-). + +This guide also enables **Tracing** and **Session Replay** (experimental). + +On .NET for Android, you also get: + +- All the features of our main [.NET SDK](/platforms/dotnet/), for your managed code +- LogCat logs attached to events +- Java crash reporting for Android, leveraging our [Android SDK](/platforms/android/) including: + - [Capture Application Not Responding (ANR) errors](/platforms/android/configuration/app-not-respond/) when the app is unresponsive + - Automatically [attach screenshots to Java exceptions](/platforms/android/enriching-events/screenshots/) + - Automatic breadcrumbs for Activity lifecycle, App lifecycle, System and Network events and User Interactions + - Automatic [Activity lifecycle tracing](/platforms/android/tracing/instrumentation/automatic-instrumentation/#activity-instrumentation) and [User Interaction tracing](/platforms/android/tracing/instrumentation/automatic-instrumentation/#user-interaction-instrumentation) + - Device Root checking +- Native crash reporting for Android, leveraging our [Android NDK](/platforms/android/configuration/using-ndk/) +- Automatic session tracking and [release health](/product/releases/) + In your `MainActivity.cs` file, call `SentrySdk.Init` in the `OnCreate` event and include any options you would like to set. The `Dsn` is the only required parameter. +The snippet also turns on: + +- Tracing: via `TracesSampleRate` +- Session Replay: via `Native.ExperimentalOptions.SessionReplay` + +Don't need a feature? Remove its options from the snippet. ```csharp [Activity(Label = "@string/app_name", MainLauncher = true)] @@ -47,6 +56,10 @@ public class MainActivity : Activity { options.Dsn = "___PUBLIC_DSN___"; options.SendDefaultPii = true; // adds the user's IP address automatically + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. + options.TracesSampleRate = 1.0; #if DEBUG // Log debug information about the Sentry SDK options.Debug = true; @@ -67,8 +80,6 @@ public class MainActivity : Activity // Session Replay is currently available via the ExperimentalOptions options.Native.ExperimentalOptions.SessionReplay.OnErrorSampleRate = 1.0; options.Native.ExperimentalOptions.SessionReplay.SessionSampleRate = 1.0; - options.Native.ExperimentalOptions.SessionReplay.MaskAllImages = false; - options.Native.ExperimentalOptions.SessionReplay.MaskAllText = false; options.SetBeforeSend(evt => { @@ -95,7 +106,7 @@ The .NET for Android integration is part of [Sentry](/platforms/dotnet/). Please Android-specific options are described below. For configuration of the embedded Sentry Android SDK, see Android Native Options. -### LogCatIntegration +#### LogCatIntegration Can be set to control whether when LogCat logs are attached to events. It can be set to one of the following values: @@ -112,18 +123,53 @@ Use caution when enabling `LogCatIntegrationType.All`, as this may result in a l -### LogCatMaxLines +#### LogCatMaxLines The maximum number of lines to read from LogCat logs. The default value is 1000. -## Verify +## Send Logs + +Use `SentrySdk.Logger` to send logs at different levels. These logs are sent without an additional option. + +See Set Up Logs for all available logging methods and formatting options. + +```csharp +SentrySdk.Logger.LogInfo("Order processed"); +SentrySdk.Logger.LogWarning("Rate limit reached for /api/orders"); +``` + +## Send Application Metrics -This snippet includes an intentional error, so you can test that everything is working as soon as you set it up. +Metrics are enabled by default in Sentry .NET SDK 6.1.0 and later. Use `SentrySdk.Metrics` to send counters, gauges, and distributions from your app. + +See Set Up Metrics for all available metric types and configuration options. + +```csharp +SentrySdk.Metrics.EmitCounter("button_click", 5, + new Dictionary { ["browser"] = "Firefox" }); +SentrySdk.Metrics.EmitGauge("page_load", 15.0, MeasurementUnit.Duration.Millisecond, + new Dictionary { ["page"] = "/home" }); +SentrySdk.Metrics.EmitDistribution("api_latency", 187, MeasurementUnit.Duration.Millisecond, + new Dictionary { ["endpoint"] = "/api/orders" }); +``` + +## Verify Your Setup + +Let's test your setup and confirm that data reaches your Sentry project. +### View Captured Data in Sentry + +Open your Sentry project to view the captured event. + ## Next Steps +At this point, you should have integrated Sentry into your .NET for Android application. Here's what to explore next: + - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup +- Learn how to [manually capture errors](/platforms/dotnet/usage/) +- Explore [Tracing](/platforms/dotnet/tracing/) +- Configure the embedded Android SDK with Android Native Options diff --git a/docs/platforms/dotnet/guides/apple/index.mdx b/docs/platforms/dotnet/guides/apple/index.mdx index 1e22ffc0d3b26..cacafbc17d0c4 100644 --- a/docs/platforms/dotnet/guides/apple/index.mdx +++ b/docs/platforms/dotnet/guides/apple/index.mdx @@ -6,17 +6,6 @@ description: "Learn about Sentry's .NET integration with .NET for iOS, macOS, an Sentry supports [.NET for iOS, macOS, and Mac Catalyst](https://learn.microsoft.com/dotnet/ios/) directly from the [Sentry NuGet package](https://www.nuget.org/packages/Sentry). -## Overview of the features - -- All the features of our main [.NET SDK](/platforms/dotnet/), for your managed code -- Native crash reporting for Apple platforms, leveraging our [Cocoa SDK](/platforms/apple/) including: - - Automatically [attach screenshots to Native exceptions](/platforms/apple/guides/ios/configuration/options/#attach-screenshot) - - Detect [App Hangs](/platforms/apple/configuration/app-hangs/) - - [Automatic performance tracing](/platforms/apple/performance/) - - [Automatic breadcrumbs](/platforms/apple/enriching-events/breadcrumbs/#automatic-breadcrumbs) - - [Swizzling](/platforms/apple/configuration/swizzling/) -- Automatic session tracking and [release health](/product/releases/) - ## Install Add the Sentry dependency to your .NET for iOS, macOS, and/or Mac Catalyst application: @@ -31,8 +20,30 @@ Install-Package Sentry -Version {{@inject packages.version('sentry.dotnet') }} ## Configure +**Error Monitoring** starts working as soon as you call `SentrySdk.Init()`. **Logs** sent through `SentrySdk.Logger` and **Application Metrics** need no extra configuration. You'll learn how to send them in [Send Logs](#send-logs) and [Send Application Metrics](#send-application-metrics-). + +This guide also enables **Tracing**, **Profiling**, and **Session Replay** (experimental). + +On .NET for iOS, macOS, and Mac Catalyst, you also get: + +- All the features of our main [.NET SDK](/platforms/dotnet/), for your managed code +- Native crash reporting for Apple platforms, leveraging our [Cocoa SDK](/platforms/apple/) including: + - Automatically [attach screenshots to Native exceptions](/platforms/apple/guides/ios/configuration/options/#attachScreenshot) + - Detect [App Hangs](/platforms/apple/configuration/app-hangs/) + - [Automatic performance tracing](/platforms/apple/tracing/) + - [Automatic breadcrumbs](/platforms/apple/enriching-events/breadcrumbs/#automatic-breadcrumbs) + - [Swizzling](/platforms/apple/configuration/swizzling/) +- Automatic session tracking and [release health](/product/releases/) + In your `AppDelegate.cs` file, call `SentrySdk.Init` in the `FinishedLaunching` event and include any options you would like to set. The `Dsn` is the only required parameter. +The snippet also turns on: + +- Tracing: via `TracesSampleRate` +- Profiling: via `ProfilesSampleRate`. On iOS and Mac Catalyst, the SDK adds the native profiling integration automatically, so you don't need the `Sentry.Profiling` package. +- Session Replay: via `Native.ExperimentalOptions.SessionReplay` + +Don't need a feature? Remove its options from the snippet. ```csharp [Register("AppDelegate")] @@ -45,6 +56,13 @@ public class AppDelegate : UIApplicationDelegate { options.Dsn = "___PUBLIC_DSN___"; options.SendDefaultPii = true; // adds the user's IP address automatically + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. + options.TracesSampleRate = 1.0; + // Enables Profiling. + // Set to 1.0 to profile 100% of captured transactions. + options.ProfilesSampleRate = 1.0; #if DEBUG // Log debug information about the Sentry SDK options.Debug = true; @@ -57,6 +75,10 @@ public class AppDelegate : UIApplicationDelegate // https://docs.sentry.io/platforms/apple/guides/ios/configuration/options/#attachScreenshot options.Native.AttachScreenshot = true; + // Session Replay is currently available via the ExperimentalOptions + options.Native.ExperimentalOptions.SessionReplay.OnErrorSampleRate = 1.0; + options.Native.ExperimentalOptions.SessionReplay.SessionSampleRate = 1.0; + options.SetBeforeSend(evt => { if (evt.Exception?.Message.Contains("Something you don't care want logged?") ?? false) @@ -73,6 +95,8 @@ public class AppDelegate : UIApplicationDelegate Console.WriteLine(e); }; }); + + return true; } } ``` @@ -85,12 +109,47 @@ The .NET for iOS, macOS, and Mac Catalyst integration is part of [Sentry](/platf For configuration of the embedded Sentry Cocoa SDK, see Apple Native Options. -## Verify +## Send Logs + +Use `SentrySdk.Logger` to send logs at different levels. These logs are sent without an additional option. + +See Set Up Logs for all available logging methods and formatting options. + +```csharp +SentrySdk.Logger.LogInfo("Order processed"); +SentrySdk.Logger.LogWarning("Rate limit reached for /api/orders"); +``` + +## Send Application Metrics -This snippet includes an intentional error, so you can test that everything is working as soon as you set it up. +Metrics are enabled by default in Sentry .NET SDK 6.1.0 and later. Use `SentrySdk.Metrics` to send counters, gauges, and distributions from your app. + +See Set Up Metrics for all available metric types and configuration options. + +```csharp +SentrySdk.Metrics.EmitCounter("button_click", 5, + new Dictionary { ["browser"] = "Firefox" }); +SentrySdk.Metrics.EmitGauge("page_load", 15.0, MeasurementUnit.Duration.Millisecond, + new Dictionary { ["page"] = "/home" }); +SentrySdk.Metrics.EmitDistribution("api_latency", 187, MeasurementUnit.Duration.Millisecond, + new Dictionary { ["endpoint"] = "/api/orders" }); +``` + +## Verify Your Setup + +Let's test your setup and confirm that data reaches your Sentry project. +### View Captured Data in Sentry + +Open your Sentry project to view the captured event. + ## Next Steps +At this point, you should have integrated Sentry into your .NET for iOS, macOS, or Mac Catalyst application. Here's what to explore next: + - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup +- Learn how to [manually capture errors](/platforms/dotnet/usage/) +- Explore [Tracing](/platforms/dotnet/tracing/) +- Configure the embedded Cocoa SDK with Apple Native Options diff --git a/docs/platforms/dotnet/guides/aspnet/index.mdx b/docs/platforms/dotnet/guides/aspnet/index.mdx index 0f9f035ef343f..a49d3a19ad296 100644 --- a/docs/platforms/dotnet/guides/aspnet/index.mdx +++ b/docs/platforms/dotnet/guides/aspnet/index.mdx @@ -6,16 +6,7 @@ description: "Learn about Sentry's .NET integration with ASP.NET." Sentry provides an integration with ASP.NET through the [Sentry.AspNet NuGet package](https://www.nuget.org/packages/Sentry.AspNet). -## Features - -In addition to capturing errors, you can monitor interactions between multiple services or applications by [enabling tracing](/concepts/key-terms/tracing/). - -Select which Sentry features you'd like to install in addition to Error Monitoring to get the corresponding installation and configuration instructions below. - ## Install - - - Add the Sentry dependency: ```powershell {tabTitle:Package Manager} @@ -31,9 +22,21 @@ as well as your logs as breadcrumbs. The logging integrations also capture event ## Configure +**Error Monitoring** starts working as soon as you initialize the SDK. **Logs** sent through `SentrySdk.Logger` and **Application Metrics** need no extra configuration. You'll learn how to send them in [Send Logs](#send-logs) and [Send Application Metrics](#send-application-metrics-). + +This guide also enables **Tracing**. + + You configure the SDK in the `Global.asax.cs`: +The snippet also turns on: + +- Tracing: via `TracesSampleRate` +- Logs from logging integrations: via `EnableLogs` + +Don't need a feature? Remove its options from the snippet. + ```csharp using System; using System.Web; @@ -55,12 +58,11 @@ public class MvcApplication : HttpApplication options.Debug = true; // Adds request URL and headers, IP and name for users, etc. options.SendDefaultPii = true; - - // ___PRODUCT_OPTION_START___ performance - // Set traces_sample_rate to 1.0 to capture 100% of transactions for performance monitoring. - // We recommend adjusting this value in production. + options.EnableLogs = true; + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. options.TracesSampleRate = 1.0; - // ___PRODUCT_OPTION_END___ performance // If you also installed the Sentry.EntityFramework package options.AddEntityFramework(); @@ -70,8 +72,6 @@ public class MvcApplication : HttpApplication // Global error catcher protected void Application_Error() => Server.CaptureLastError(); - - // ___PRODUCT_OPTION_START___ performance protected void Application_BeginRequest() { Context.StartSentryTransaction(); @@ -81,7 +81,6 @@ public class MvcApplication : HttpApplication { Context.FinishSentryTransaction(); } - // ___PRODUCT_OPTION_END___ performance protected void Application_End() { @@ -116,12 +115,44 @@ Opt-in to send the request body to Sentry: options.AddAspNet(RequestSize.Always); ``` -## Verify +## Send Logs + +Use `SentrySdk.Logger` to send logs at different levels without an additional option. If you also send logs through an integration, set `EnableLogs = true` in the initialization snippet. + +If you use Serilog, NLog, or log4net, see the documented [Serilog](/platforms/dotnet/guides/serilog/), [NLog](/platforms/dotnet/guides/nlog/), and [log4net](/platforms/dotnet/guides/log4net/) integrations. -This snippet includes an intentional error, so you can test that everything is working as soon as you set it up. +See Set Up Logs for all available logging methods and formatting options. + +```csharp +SentrySdk.Logger.LogInfo("Order processed"); +SentrySdk.Logger.LogWarning("Rate limit reached for /api/orders"); +``` + +## Send Application Metrics + +Metrics are enabled by default in Sentry .NET SDK 6.1.0 and later. Use `SentrySdk.Metrics` to send counters, gauges, and distributions from your app. + +See Set Up Metrics for all available metric types and configuration options. + +```csharp +SentrySdk.Metrics.EmitCounter("button_click", 5, + new Dictionary { ["browser"] = "Firefox" }); +SentrySdk.Metrics.EmitGauge("page_load", 15.0, MeasurementUnit.Duration.Millisecond, + new Dictionary { ["page"] = "/home" }); +SentrySdk.Metrics.EmitDistribution("api_latency", 187, MeasurementUnit.Duration.Millisecond, + new Dictionary { ["endpoint"] = "/api/orders" }); +``` + +## Verify Your Setup + +Let's test your setup and confirm that data reaches your Sentry project. +### View Captured Data in Sentry + +Open your Sentry project to view the captured event. + ## Troubleshooting For information about Troubleshooting, please visit the [troubleshooting](troubleshooting/) page. @@ -132,4 +163,8 @@ For information about Troubleshooting, please visit the [troubleshooting](troubl ## Next Steps +At this point, you should have integrated Sentry into your ASP.NET application. Here's what to explore next: + - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup +- Learn how to [manually capture errors](/platforms/dotnet/usage/) +- Explore [Tracing](/platforms/dotnet/tracing/) diff --git a/docs/platforms/dotnet/guides/aspnetcore/index.mdx b/docs/platforms/dotnet/guides/aspnetcore/index.mdx index 16fe5517e5588..4b33240722ece 100644 --- a/docs/platforms/dotnet/guides/aspnetcore/index.mdx +++ b/docs/platforms/dotnet/guides/aspnetcore/index.mdx @@ -6,16 +6,7 @@ description: "Learn about Sentry's .NET integration with ASP.NET Core." Sentry provides an integration with ASP.NET Core through the [Sentry.AspNetCore](https://www.nuget.org/packages/Sentry.AspNetCore) NuGet package. -## Features - -In addition to capturing errors, you can monitor interactions between multiple services or applications by [enabling tracing](/concepts/key-terms/tracing/). - -Select which Sentry features you'd like to install in addition to Error Monitoring to get the corresponding installation and configuration instructions below. - ## Install - - - Add the Sentry dependency: ```powershell {tabTitle:Package Manager} @@ -32,15 +23,34 @@ paket add Sentry --version {{@inject packages.version('sentry.dotnet.aspnetcore' This package extends [Sentry.Extensions.Logging](/platforms/dotnet/guides/extensions-logging/). This means that besides the ASP.NET Core related features, through this package you'll also get access to all the framework's logging integration and also the features available in the main [Sentry](/platforms/dotnet/) SDK. -## Initialize +## Configure + +**Error Monitoring** starts working as soon as you initialize the SDK. **Logs** sent through `Microsoft.Extensions.Logging` need `EnableLogs = true`, and **Application Metrics** need no extra configuration. You'll learn how to send them in [Send Logs](#send-logs) and [Send Application Metrics](#send-application-metrics-). + +This guide also enables **Tracing**. The simplest way to initialize Sentry in ASP.NET Core is by using the `UseSentry` extension method from the `Sentry.AspNetCore` package in conjunction with the [framework configuration system](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-7.0). -When configuring the SDK via the frameworks configuration system, it's possible to add the SDK by simply calling `UseSentry` without providing any further information. The SDK provides this as extension methods to support ASP.NET Core `2.X`, `3.X`, and `5.X` and later: +Call `UseSentry` with your DSN and the options you want. The SDK provides this as extension methods to support ASP.NET Core `2.X`, `3.X`, and `5.X` and later. + +The snippet also turns on: + +- Tracing: via `TracesSampleRate` +- Logs: via `EnableLogs` + +Don't need a feature? Remove its options from the snippet. ```csharp {tabTitle:WebApplication} {mdExpandTabs} var builder = WebApplication.CreateBuilder(args); -builder.WebHost.UseSentry(); // Initialize Sentry +builder.WebHost.UseSentry(options => +{ + options.Dsn = "___PUBLIC_DSN___"; + options.EnableLogs = true; + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. + options.TracesSampleRate = 1.0; +}); ``` ```csharp {tabTitle:IHostBuilder} @@ -48,19 +58,33 @@ public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { - // Add the following line: - webBuilder.UseSentry(); + webBuilder.UseSentry(options => + { + options.Dsn = "___PUBLIC_DSN___"; + options.EnableLogs = true; + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. + options.TracesSampleRate = 1.0; + }); }); ``` ```csharp {tabTitle:IWebHost} public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) - // Add the following line: - .UseSentry() + .UseSentry(options => + { + options.Dsn = "___PUBLIC_DSN___"; + options.EnableLogs = true; + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. + options.TracesSampleRate = 1.0; + }) ``` -## Configure +### Additional configuration The framework takes configuration settings from `appsettings.json`, environment variables, or from code. These settings get applied to `Sentry.AspNetCore.SentryAspNetCoreOptions`, which extends `Sentry.Extensions.Logging.SentryLoggingOptions`, which in turn extends `Sentry.SentryOptions`. This means options for `Sentry.AspNetCore` as well as all the inner packages are available to be configured through the configuration system. @@ -70,6 +94,7 @@ An example of some of the options that can be configured via `appsettings.json`: ```json {filename:appsettings.json} +{ "Sentry": { "Dsn": "___PUBLIC_DSN___", "SendDefaultPii": true, @@ -78,19 +103,11 @@ An example of some of the options that can be configured via `appsettings.json`: "MinimumEventLevel": "Warning", "AttachStackTrace": true, "Debug": true, - "DiagnosticLevel": "Error", - // ___PRODUCT_OPTION_START___ performance - "TracesSampleRate": 1.0 - // ___PRODUCT_OPTION_END___ performance - }, + "DiagnosticLevel": "Error" + } +} ``` - - -Setting `TracesSampleRate` to `1.0` in this example configures Sentry to capture 100% of transactions for tracing. We recommend adjusting this value in production. See Automatic Instrumentation for further information. - - - ### Environment variables It's also possible to bind properties to the SDK via environment variables, like: @@ -113,9 +130,10 @@ Finally, any settings that can be configured via `appsettings.json` or environme .UseSentry(options => { options.SendDefaultPii = true; // Adds request URL and headers, IP and name for users, etc. - // ___PRODUCT_OPTION_START___ performance - options.TracesSampleRate = 1.0; // Set this to configure automatic tracing - // ___PRODUCT_OPTION_END___ performance + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. + options.TracesSampleRate = 1.0; options.SetBeforeSend((@event, hint) => { // Never report server names @@ -128,9 +146,10 @@ Finally, any settings that can be configured via `appsettings.json` or environme ```fsharp .UseSentry (fun options -> options.SendDefaultPii <- true // Adds request URL and headers, IP and name for users, etc. - // ___PRODUCT_OPTION_START___ performance - options.TracesSampleRate <- 1.0 // Set this to configure automatic tracing - // ___PRODUCT_OPTION_END___ performance + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. + options.TracesSampleRate <- 1.0 options.SetBeforeSend(fun event hint -> // Never report server names event.ServerName <- null @@ -141,21 +160,15 @@ Finally, any settings that can be configured via `appsettings.json` or environme > Example modifying all events before they are sent to avoid server names being reported. -## Verify - -This snippet includes an intentional error, so you can test that everything is working as soon as you set it up. - - - -## Dependency Injection +### Dependency Injection Much of the behavior of the ASP.NET Core integration with Sentry can be customized by using the frameworks dependency injection system. That is done by registering your own implementation of some of the exposed abstraction. -### Lifetimes +#### Lifetimes The lifetime used will be respected by the SDK. For example, when registering a `Transient` dependency, a new instance of the processor is created for each event sent out to Sentry. This allows the use of non thread-safe event processors. -### Capturing the affected user +#### Capturing the affected user When opting-in to [SendDefaultPii](#senddefaultpii), the SDK will automatically read the user from the request by inspecting `HttpContext.User`. Default claim values like `NameIdentifier` for the _Id_ will be used. @@ -173,7 +186,7 @@ member this.ConfigureServices(services: IServiceCollection) = services.AddSingleton() |> ignore ``` -### Adding event and exception processors +#### Adding event and exception processors Event processors and exception processors can be added via DI: @@ -191,17 +204,17 @@ member this.ConfigureServices(services: IServiceCollection) = services.AddScoped() |> ignore ``` -## Options and Initialization +### Options and Initialization As previously mentioned, this package is a wrapper around [Sentry.Extensions.Logging](/platforms/dotnet/guides/extensions-logging/) and [Sentry](/platforms/dotnet/). Please refer to the documentation of these packages to get the options that are defined at those levels. Below, the options that are specific to `Sentry.AspNetCore` will be described. -### SendDefaultPii +#### SendDefaultPii Although this setting is part of the [Sentry](/platforms/dotnet/) package, in the context of ASP.NET Core, it means reporting the user by reading the frameworks `HttpContext.User`. The strategy to create the `SentryUser` can be customized. Please read [retrieving user info](#capturing-the-affected-user) for more. -### Environment +#### Environment The environment name is automatically populated by reading the frameworks `IHostingEnvironment` value. @@ -213,7 +226,7 @@ Methods that take precedence over `IHostingEnvironment` are: - Environment variable _SENTRY_ENVIRONMENT_ - Configuration system like `appsettings.json` -### MaxRequestBodySize +#### MaxRequestBodySize This parameter controls whether integrations should capture HTTP request bodies. It can be set to one of the following values: @@ -224,7 +237,7 @@ This parameter controls whether integrations should capture HTTP request bodies. If the request bodies should be captured, all requests will have the `EnableRewind` method invoked. This is done so that the request data can be read later, in case an error happens while processing the request. -### CaptureBlockingCalls +#### CaptureBlockingCalls When set to `true`, the SDK will detect blocking calls in async methods (like `Task.Wait()` and `Task.Result`) and report these to Sentry as errors. Blocking calls can lead to [Threadpool starvation](https://learn.microsoft.com/en-nz/archive/blogs/vancem/diagnosing-net-core-threadpool-starvation-with-perfview-why-my-service-is-not-saturating-all-cores-or-seems-to-stall). @@ -240,24 +253,18 @@ This feature makes use of the `Ben.BlockingDetector` library and so has [the sam > > It will detect CLR-initiated waits lock, `ManualResetEventSlim`, `Semaphore\{Slim\}`, `Task.Wait`, `Task.Result` etc. if they do block. -### IncludeActivityData +#### IncludeActivityData Opt-in to capture values from [System.Diagnostic.Activity](https://github.com/dotnet/runtime/blob/master/src/libraries/System.Diagnostics.DiagnosticSource/src/ActivityUserGuide.md) if one exists. -## Samples - -- A [simple example](https://github.com/getsentry/sentry-dotnet/tree/main/samples/Sentry.Samples.AspNetCore.Basic) without MVC. (**C#**) -- An [example](https://github.com/getsentry/sentry-dotnet/tree/main/samples/Sentry.Samples.AspNetCore.Mvc) using MVC and most of the SDK features. (**C#**) -- An [example](https://github.com/sentry-demos/giraffe) using Giraffe on top of ASP.NET Core with a basic overview of available features. (**F#**) -- For [more samples](https://github.com/getsentry/sentry-dotnet-samples) of the .NET SDKs. -## Tunnel +### Tunnel If events are being logged to Sentry from the client-side, then you should use a [tunnel](/platforms/javascript/troubleshooting/#using-the-tunnel-option). A tunnel is an HTTP endpoint that acts as a proxy between Sentry and your application. Because you control this server, there is no risk of any requests sent to it being blocked. -### Usage +#### Usage - Add to the container by calling `AddSentryTunneling();` on `IServiceCollection`. - Add the web app by calling `UseSentryTunneling();` on `IApplicationBuilder`. @@ -274,6 +281,68 @@ Sentry.init({ The [AspNetCore.Mvc sample](https://github.com/getsentry/sentry-dotnet/tree/main/samples/Sentry.Samples.AspNetCore.Mvc) uses this approach. + +## Send Logs + +Use `Microsoft.Extensions.Logging` to send structured logs from your application. Set `EnableLogs = true` in your Sentry initialization. + +See [Microsoft.Extensions.Logging](/platforms/dotnet/guides/extensions-logging/) for setup details. + +See Set Up Logs for all available logging methods and formatting options. + +```csharp +using Microsoft.Extensions.Logging; + +public sealed class OrderService +{ + private readonly ILogger _logger; + + public OrderService(ILogger logger) => _logger = logger; + + public void Process() + { + _logger.LogInformation("Order processed {OrderId}", "order-123"); + _logger.LogWarning("Rate limit reached for {Endpoint}", "/api/orders"); + } +} +``` + +## Send Application Metrics + +Metrics are enabled by default in Sentry .NET SDK 6.1.0 and later. Use `SentrySdk.Metrics` to send counters, gauges, and distributions from your app. + +See Set Up Metrics for all available metric types and configuration options. + +```csharp +SentrySdk.Metrics.EmitCounter("button_click", 5, + new Dictionary { ["browser"] = "Firefox" }); +SentrySdk.Metrics.EmitGauge("page_load", 15.0, MeasurementUnit.Duration.Millisecond, + new Dictionary { ["page"] = "/home" }); +SentrySdk.Metrics.EmitDistribution("api_latency", 187, MeasurementUnit.Duration.Millisecond, + new Dictionary { ["endpoint"] = "/api/orders" }); +``` + +## Verify Your Setup + +Let's test your setup and confirm that data reaches your Sentry project. + + + +### View Captured Data in Sentry + +Open your Sentry project to view the captured event. + +## Samples + +- A [simple example](https://github.com/getsentry/sentry-dotnet/tree/main/samples/Sentry.Samples.AspNetCore.Basic) without MVC. (**C#**) +- An [example](https://github.com/getsentry/sentry-dotnet/tree/main/samples/Sentry.Samples.AspNetCore.Mvc) using MVC and most of the SDK features. (**C#**) +- An [example](https://github.com/sentry-demos/giraffe) using Giraffe on top of ASP.NET Core with a basic overview of available features. (**F#**) +- For [more samples](https://github.com/getsentry/sentry-dotnet-samples) of the .NET SDKs. + ## Next Steps +At this point, you should have integrated Sentry into your ASP.NET Core application. Here's what to explore next: + - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup +- Learn how to [manually capture errors](/platforms/dotnet/usage/) +- Explore [Tracing](/platforms/dotnet/tracing/) diff --git a/docs/platforms/dotnet/guides/aws-lambda/index.mdx b/docs/platforms/dotnet/guides/aws-lambda/index.mdx index 4111c1f1a8b09..088b899271e1f 100644 --- a/docs/platforms/dotnet/guides/aws-lambda/index.mdx +++ b/docs/platforms/dotnet/guides/aws-lambda/index.mdx @@ -6,16 +6,7 @@ description: "Learn about Sentry's .NET integration with AWS Lambda and ASP.NET Sentry provides an integration with AWS Lambda ASP.NET Core Server through the [Sentry.AspNetCore NuGet package](https://www.nuget.org/packages/Sentry.AspNetCore). -## Features - -In addition to capturing errors, you can monitor interactions between multiple services or applications by [enabling tracing](/concepts/key-terms/tracing/). - -Select which Sentry features you'd like to install in addition to Error Monitoring to get the corresponding installation and configuration instructions below. - ## Install - - - Add the Sentry dependency: ```powershell {tabTitle:Package Manager} @@ -30,11 +21,23 @@ You can combine this integration with a logging library like `log4net`, `NLog`, ## Configure +**Error Monitoring** starts working as soon as you initialize the SDK. **Logs** sent through `Microsoft.Extensions.Logging` need `EnableLogs = true`, and **Application Metrics** need no extra configuration. You'll learn how to send them in [Send Logs](#send-logs) and [Send Application Metrics](#send-application-metrics-). + +This guide also enables **Tracing**. + + All `ASP.NET Core` configurations are valid here. But one configuration in particular is relevant. `FlushOnCompletedRequest` ensures all events are flushed out. This is because the general ASP.NET Core hooks for when the process is exiting are not guaranteed to run in a serverless environment. This setting ensures that no event is lost if AWS recycles the process. +The snippet also turns on: + +- Tracing: via `TracesSampleRate` +- Logs: via `EnableLogs` + +Don't need a feature? Remove its options from the snippet. + ```csharp public class LambdaEntryPoint : Amazon.Lambda.AspNetCoreServer.APIGatewayProxyFunction { @@ -45,16 +48,15 @@ public class LambdaEntryPoint : Amazon.Lambda.AspNetCoreServer.APIGatewayProxyFu .UseSentry(options => { options.Dsn = "___PUBLIC_DSN___"; + options.EnableLogs = true; // When configuring for the first time, to see what the SDK is doing: - o.Debug = true; + options.Debug = true; // Adds request URL and headers, IP and name for users, etc. - o.SendDefaultPii = true; - // ___PRODUCT_OPTION_START___ performance - // Set TracesSampleRate to 1.0 to capture 100% - // of transactions for tracing. - // We recommend adjusting this value in production - o.TracesSampleRate = 1.0; - // ___PRODUCT_OPTION_END___ performance + options.SendDefaultPii = true; + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. + options.TracesSampleRate = 1.0; // Required in Serverless environments options.FlushOnCompletedRequest = true; }) @@ -65,16 +67,64 @@ public class LambdaEntryPoint : Amazon.Lambda.AspNetCoreServer.APIGatewayProxyFu Check out the [Sentry ASP.NET Core](/platforms/dotnet/guides/aspnetcore/) documentation for the complete set of options. -## Verify +## Send Logs + +Use `Microsoft.Extensions.Logging` to send structured logs from your application. Set `EnableLogs = true` in your Sentry initialization. + +See [Microsoft.Extensions.Logging](/platforms/dotnet/guides/extensions-logging/) for setup details. + +See Set Up Logs for all available logging methods and formatting options. + +```csharp +using Microsoft.Extensions.Logging; + +public sealed class OrderService +{ + private readonly ILogger _logger; + + public OrderService(ILogger logger) => _logger = logger; + + public void Process() + { + _logger.LogInformation("Order processed {OrderId}", "order-123"); + _logger.LogWarning("Rate limit reached for {Endpoint}", "/api/orders"); + } +} +``` + +## Send Application Metrics + +Metrics are enabled by default in Sentry .NET SDK 6.1.0 and later. Use `SentrySdk.Metrics` to send counters, gauges, and distributions from your app. -This snippet includes an intentional error, so you can test that everything is working as soon as you set it up. +See Set Up Metrics for all available metric types and configuration options. + +```csharp +SentrySdk.Metrics.EmitCounter("button_click", 5, + new Dictionary { ["browser"] = "Firefox" }); +SentrySdk.Metrics.EmitGauge("page_load", 15.0, MeasurementUnit.Duration.Millisecond, + new Dictionary { ["page"] = "/home" }); +SentrySdk.Metrics.EmitDistribution("api_latency", 187, MeasurementUnit.Duration.Millisecond, + new Dictionary { ["endpoint"] = "/api/orders" }); +``` + +## Verify Your Setup + +Let's test your setup and confirm that data reaches your Sentry project. +### View Captured Data in Sentry + +Open your Sentry project to view the captured event. + ## Samples - Our [samples on GitHub](https://github.com/getsentry/sentry-dotnet/tree/main/samples/Sentry.Samples.Aws.Lambda.AspNetCoreServer) demonstrate Sentry on AWS Lambda. (**C#**) ## Next Steps +At this point, you should have integrated Sentry into your AWS Lambda application. Here's what to explore next: + - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup +- Learn how to [manually capture errors](/platforms/dotnet/usage/) +- Explore [Tracing](/platforms/dotnet/tracing/) diff --git a/docs/platforms/dotnet/guides/azure-functions-worker/index.mdx b/docs/platforms/dotnet/guides/azure-functions-worker/index.mdx index a26ea50fc8845..7fa4beee87e09 100644 --- a/docs/platforms/dotnet/guides/azure-functions-worker/index.mdx +++ b/docs/platforms/dotnet/guides/azure-functions-worker/index.mdx @@ -6,60 +6,47 @@ description: "Learn about Sentry's .NET integration with Azure Functions." Sentry provides an integration with Azure Functions through the [Sentry.Extensions.Logging](https://www.nuget.org/packages/Sentry.Extensions.Logging) and [Sentry.OpenTelemetry.Exporter](https://www.nuget.org/packages/Sentry.OpenTelemetry.Exporter) NuGet packages. -## Features - -In addition to capturing errors, you can monitor interactions between multiple services or applications by enabling tracing. - -Select which Sentry features you'd like to install in addition to Error Monitoring to get the corresponding installation and configuration instructions below. - ## Install - - Add the Sentry dependencies to your Azure Functions application: ```shell {tabTitle:.NET Core CLI} dotnet add package Sentry.Extensions.Logging -v {{@inject packages.version('sentry.dotnet.extensions.logging') }} -// ___PRODUCT_OPTION_START___ performance dotnet add package Sentry.OpenTelemetry.Exporter -v {{@inject packages.version('sentry.dotnet') }} dotnet add package OpenTelemetry.Extensions.Hosting dotnet add package OpenTelemetry.Instrumentation.Http - -// ___PRODUCT_OPTION_END___ ``` ```powershell {tabTitle:Package Manager} Install-Package Sentry.Extensions.Logging -Version {{@inject packages.version('sentry.dotnet.extensions.logging') }} -// ___PRODUCT_OPTION_START___ performance Install-Package Sentry.OpenTelemetry.Exporter -Version {{@inject packages.version('sentry.dotnet') }} Install-Package OpenTelemetry.Extensions.Hosting Install-Package OpenTelemetry.Instrumentation.Http -// ___PRODUCT_OPTION_END___ ``` The [Sentry.Extensions.Logging](/platforms/dotnet/guides/extensions-logging/) package also provides access to the `ILogger` integration and the other core features available in the [Sentry](/platforms/dotnet/) SDK. ## Configure -The core features of Sentry are enabled by calling `AddSentry` when configuring logging. +**Error Monitoring** starts working as soon as you initialize the SDK by calling `AddSentry` when configuring logging. **Logs** sent through `Microsoft.Extensions.Logging` need `EnableLogs = true`, and **Application Metrics** need no extra configuration. You'll learn how to send them in [Send Logs](#send-logs) and [Send Application Metrics](#send-application-metrics-). + +This guide also enables **Tracing** through OpenTelemetry. Sentry's OTLP exporter is added to the OpenTelemetry `TracerProviderBuilder`, and `UseOtlp()` tells the Sentry SDK to use OpenTelemetry for tracing. - -To enable tracing, add Sentry's OTLP exporter to the OpenTelemetry `TracerProviderBuilder` and call `UseOtlp()` on the Sentry options. See OpenTelemetry (OTLP) for sampling and trace propagation. - +The snippet also turns on: -For example: +- Tracing: via `AddSentryOtlpExporter` and `UseOtlp()`. Don't also set `TracesSampleRate`; OpenTelemetry handles tracing. See OpenTelemetry (OTLP) for sampling and trace propagation. +- Logs: via `EnableLogs` + +Don't need a feature? Remove its options from the snippet. ```csharp +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; -// ___PRODUCT_OPTION_START___ performance -using Microsoft.Extensions.DependencyInjection; using OpenTelemetry.Trace; -// ___PRODUCT_OPTION_END___ var host = new HostBuilder() .ConfigureFunctionsWorkerDefaults() -// ___PRODUCT_OPTION_START___ performance .ConfigureServices(services => { services.AddOpenTelemetry().WithTracing(builder => @@ -69,15 +56,13 @@ var host = new HostBuilder() .AddHttpClientInstrumentation(); // From OpenTelemetry.Instrumentation.Http, instruments outgoing HTTP requests }); }) -// ___PRODUCT_OPTION_END___ .ConfigureLogging(logging => { logging.AddSentry(options => { options.Dsn = "___PUBLIC_DSN___"; - // ___PRODUCT_OPTION_START___ performance + options.EnableLogs = true; options.UseOtlp(); // <-- Configure Sentry to use OpenTelemetry for tracing - // ___PRODUCT_OPTION_END___ options.Debug = true; }); }) @@ -86,16 +71,64 @@ var host = new HostBuilder() await host.RunAsync(); ``` -## Verify +## Send Logs + +Use `Microsoft.Extensions.Logging` to send structured logs from your application. Set `EnableLogs = true` in your Sentry initialization. + +See [Microsoft.Extensions.Logging](/platforms/dotnet/guides/extensions-logging/) for setup details. + +See Set Up Logs for all available logging methods and formatting options. + +```csharp +using Microsoft.Extensions.Logging; + +public sealed class OrderService +{ + private readonly ILogger _logger; + + public OrderService(ILogger logger) => _logger = logger; + + public void Process() + { + _logger.LogInformation("Order processed {OrderId}", "order-123"); + _logger.LogWarning("Rate limit reached for {Endpoint}", "/api/orders"); + } +} +``` + +## Send Application Metrics -This snippet includes an intentional error, so you can test that everything is working as soon as you set it up. +Metrics are enabled by default in Sentry .NET SDK 6.1.0 and later. Use `SentrySdk.Metrics` to send counters, gauges, and distributions from your app. + +See Set Up Metrics for all available metric types and configuration options. + +```csharp +SentrySdk.Metrics.EmitCounter("button_click", 5, + new Dictionary { ["browser"] = "Firefox" }); +SentrySdk.Metrics.EmitGauge("page_load", 15.0, MeasurementUnit.Duration.Millisecond, + new Dictionary { ["page"] = "/home" }); +SentrySdk.Metrics.EmitDistribution("api_latency", 187, MeasurementUnit.Duration.Millisecond, + new Dictionary { ["endpoint"] = "/api/orders" }); +``` + +## Verify Your Setup + +Let's test your setup and confirm that data reaches your Sentry project. +### View Captured Data in Sentry + +Open your Sentry project to view the captured event. + ## Samples - [Azure Functions Sample](https://github.com/getsentry/sentry-dotnet/blob/main/samples/Sentry.Samples.OpenTelemetry.AzureFunctions/) demonstrates Sentry with Azure Functions Isolated Worker SDK. (**C#**) ## Next Steps +At this point, you should have integrated Sentry into your Azure Functions application. Here's what to explore next: + - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup +- Learn how to [manually capture errors](/platforms/dotnet/usage/) +- Learn more about tracing with OpenTelemetry (OTLP) diff --git a/docs/platforms/dotnet/guides/blazor-server/index.mdx b/docs/platforms/dotnet/guides/blazor-server/index.mdx index d2442ee2f9c5e..c05548bffc813 100644 --- a/docs/platforms/dotnet/guides/blazor-server/index.mdx +++ b/docs/platforms/dotnet/guides/blazor-server/index.mdx @@ -7,9 +7,6 @@ description: "Learn about Sentry's .NET integration with Blazor Interactive Serv Blazor Interactive SSR (also known as Blazor Server) runs components on the server and streams UI updates to the browser over a SignalR connection (circuit). Sentry integrates with Blazor Interactive SSR through the [Sentry.AspNetCore NuGet package](https://www.nuget.org/packages/Sentry.AspNetCore), which captures unhandled exceptions and provides optional tracing via OpenTelemetry. ## Install - - - Add the Sentry dependency to your Blazor Server application: ```shell {tabTitle:.NET Core CLI} @@ -24,8 +21,19 @@ This package extends [Sentry.Extensions.Logging](/platforms/dotnet/guides/extens ## Configure +**Error Monitoring** starts working as soon as you initialize the SDK. **Logs** sent through `SentrySdk.Logger` and **Application Metrics** need no extra configuration. You'll learn how to send them in [Send Logs](#send-logs) and [Send Application Metrics](#send-application-metrics-). + +This guide also enables **Tracing**. + + Initialize Sentry by calling `UseSentry` on your `WebHostBuilder`: +The snippet also turns on: + +- Tracing: via `TracesSampleRate` + +Don't need a feature? Remove its options from the snippet. + ```csharp {filename:Program.cs} var builder = WebApplication.CreateBuilder(args); @@ -39,9 +47,10 @@ builder.WebHost.UseSentry(options => options.Debug = true; // Adds request URL and headers, IP and name for users, etc. options.SendDefaultPii = true; - // ___PRODUCT_OPTION_START___ performance + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. options.TracesSampleRate = 0.1; - // ___PRODUCT_OPTION_END___ performance }); var app = builder.Build(); @@ -56,17 +65,17 @@ app.MapFallbackToPage("/_Host"); app.Run(); ``` -## Limited Tracing on .NET 10 and Later +### Limited Tracing on .NET 10 and Later Tracing events in Blazor Server applications is challenging due to the socket based nature of communications. However, on .NET 10 and later, Blazor emits OpenTelemetry activities for circuit lifecycle events, component navigation, and UI interactions that can be used to provide some limited tracing. The [Sentry.Samples.AspNetCore.Blazor.Server](https://github.com/getsentry/sentry-dotnet/tree/main/samples/Sentry.Samples.AspNetCore.Blazor.Server) sample project gives an example of this. -### Install OpenTelemetry +#### Install OpenTelemetry See OpenTelemetry Support for installation and setup instructions. -### Configure OpenTelemetry +#### Configure OpenTelemetry Wire up Sentry as an OpenTelemetry exporter, subscribe to the Blazor activity sources, and register helper services for circuit and breadcrumb tracking: @@ -94,6 +103,9 @@ builder.WebHost.UseSentry(options => { options.Dsn = "___PUBLIC_DSN___"; options.UseOpenTelemetry(); + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. options.TracesSampleRate = 0.1; // Rewrites /_blazor SignalR transaction names to the actual Blazor route options.AddEventProcessor(new BlazorEventProcessor()); @@ -116,7 +128,7 @@ app.MapFallbackToPage("/_Host"); app.Run(); ``` -### Circuit Lifecycle Tracking Services +#### Circuit Lifecycle Tracking Services The `BlazorSentryIntegration`, `SentryCircuitHandler`, and `BlazorEventProcessor` services shown above are not part of the Sentry integration. You can copy them from the [Blazor Server sample](https://github.com/getsentry/sentry-dotnet/tree/main/samples/Sentry.Samples.AspNetCore.Blazor.Server/Services) into your application if they prove useful for your use case. @@ -128,16 +140,50 @@ They provide the following features: | `SentryCircuitHandler` | Hooks into circuit open/close events to track circuit lifetime and prevent memory leaks | | `BlazorEventProcessor` | Rewrites uninformative SignalR transaction names (e.g. `/_blazor`) to the actual Blazor route | -## Verify +## Send Logs + +Use `SentrySdk.Logger` to send logs at different levels. These logs are sent without an additional option. -This snippet includes an intentional error, so you can test that everything is working as soon as you set it up. +See Set Up Logs for all available logging methods and formatting options. + +```csharp +SentrySdk.Logger.LogInfo("Order processed"); +SentrySdk.Logger.LogWarning("Rate limit reached for /api/orders"); +``` + +## Send Application Metrics + +Metrics are enabled by default in Sentry .NET SDK 6.1.0 and later. Use `SentrySdk.Metrics` to send counters, gauges, and distributions from your app. + +See Set Up Metrics for all available metric types and configuration options. + +```csharp +SentrySdk.Metrics.EmitCounter("button_click", 5, + new Dictionary { ["browser"] = "Firefox" }); +SentrySdk.Metrics.EmitGauge("page_load", 15.0, MeasurementUnit.Duration.Millisecond, + new Dictionary { ["page"] = "/home" }); +SentrySdk.Metrics.EmitDistribution("api_latency", 187, MeasurementUnit.Duration.Millisecond, + new Dictionary { ["endpoint"] = "/api/orders" }); +``` + +## Verify Your Setup + +Let's test your setup and confirm that data reaches your Sentry project. +### View Captured Data in Sentry + +Open your Sentry project to view the captured event. + ## Samples - This [integration with Blazor Interactive SSR](https://github.com/getsentry/sentry-dotnet/tree/main/samples/Sentry.Samples.AspNetCore.Blazor.Server) sample demonstrates using Sentry with Blazor Server, including enhanced circuit tracking on .NET 10. (**C#**) ## Next Steps +At this point, you should have integrated Sentry into your Blazor Server application. Here's what to explore next: + - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup +- Learn how to [manually capture errors](/platforms/dotnet/usage/) +- Explore [Tracing](/platforms/dotnet/tracing/) diff --git a/docs/platforms/dotnet/guides/blazor-webassembly/index.mdx b/docs/platforms/dotnet/guides/blazor-webassembly/index.mdx index 5b784b93f6c63..bafbb652e24b1 100644 --- a/docs/platforms/dotnet/guides/blazor-webassembly/index.mdx +++ b/docs/platforms/dotnet/guides/blazor-webassembly/index.mdx @@ -7,9 +7,6 @@ description: "Learn about Sentry's .NET integration with Blazor WebAssembly." Sentry provides an integration with Blazor WebAssembly through the [Sentry.AspNetCore.Blazor.WebAssembly NuGet package](https://www.nuget.org/packages/Sentry.AspNetCore.Blazor.WebAssembly). ## Install - - - Add the Sentry dependency to your Blazor WebAssembly application: ```shell {tabTitle:.NET Core CLI} @@ -24,10 +21,22 @@ This package extends [Sentry.Extensions.Logging](/platforms/dotnet/guides/extens ## Configure +**Error Monitoring** starts working as soon as you initialize the SDK. **Logs** sent through `Microsoft.Extensions.Logging` need `EnableLogs = true`, and **Application Metrics** need no extra configuration. You'll learn how to send them in [Send Logs](#send-logs) and [Send Application Metrics](#send-application-metrics-). + +This guide also enables **Tracing**. + + Sentry integration with Blazor WebAssembly is done by calling `.UseSentry()` and specifying the options, for example: +The snippet also turns on: + +- Tracing: via `TracesSampleRate` +- Logs: via `EnableLogs` + +Don't need a feature? Remove its options from the snippet. + ```csharp using Microsoft.AspNetCore.Components.WebAssembly.Hosting; using Microsoft.Extensions.Logging; @@ -36,13 +45,15 @@ var builder = WebAssemblyHostBuilder.CreateDefault(args); builder.UseSentry(options => { options.Dsn = "___PUBLIC_DSN___"; + options.EnableLogs = true; // When configuring for the first time, to see what the SDK is doing: options.Debug = true; // Adds request URL and headers, IP and name for users, etc. options.SendDefaultPii = true; - // ___PRODUCT_OPTION_START___ performance + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. options.TracesSampleRate = 0.1; - // ___PRODUCT_OPTION_END___ performance }); // Captures logError and higher as events @@ -51,16 +62,64 @@ builder.Logging.AddSentry(o => o.InitializeSdk = false); await builder.Build().RunAsync(); ``` -## Verify +## Send Logs -This snippet includes an intentional error, so you can test that everything is working as soon as you set it up. +Use `Microsoft.Extensions.Logging` to send structured logs from your application. Set `EnableLogs = true` in your Sentry initialization. + +See [Microsoft.Extensions.Logging](/platforms/dotnet/guides/extensions-logging/) for setup details. + +See Set Up Logs for all available logging methods and formatting options. + +```csharp +using Microsoft.Extensions.Logging; + +public sealed class OrderService +{ + private readonly ILogger _logger; + + public OrderService(ILogger logger) => _logger = logger; + + public void Process() + { + _logger.LogInformation("Order processed {OrderId}", "order-123"); + _logger.LogWarning("Rate limit reached for {Endpoint}", "/api/orders"); + } +} +``` + +## Send Application Metrics + +Metrics are enabled by default in Sentry .NET SDK 6.1.0 and later. Use `SentrySdk.Metrics` to send counters, gauges, and distributions from your app. + +See Set Up Metrics for all available metric types and configuration options. + +```csharp +SentrySdk.Metrics.EmitCounter("button_click", 5, + new Dictionary { ["browser"] = "Firefox" }); +SentrySdk.Metrics.EmitGauge("page_load", 15.0, MeasurementUnit.Duration.Millisecond, + new Dictionary { ["page"] = "/home" }); +SentrySdk.Metrics.EmitDistribution("api_latency", 187, MeasurementUnit.Duration.Millisecond, + new Dictionary { ["endpoint"] = "/api/orders" }); +``` + +## Verify Your Setup + +Let's test your setup and confirm that data reaches your Sentry project. +### View Captured Data in Sentry + +Open your Sentry project to view the captured event. + ## Samples - This [integration with Blazor WebAssembly](https://github.com/getsentry/sentry-dotnet/tree/main/samples/Sentry.Samples.AspNetCore.Blazor.Wasm) sample demonstrates using Sentry with Blazor WebAssembly. (**C#**) ## Next Steps +At this point, you should have integrated Sentry into your Blazor WebAssembly application. Here's what to explore next: + - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup +- Learn how to [manually capture errors](/platforms/dotnet/usage/) +- Explore [Tracing](/platforms/dotnet/tracing/) diff --git a/docs/platforms/dotnet/guides/entityframework/index.mdx b/docs/platforms/dotnet/guides/entityframework/index.mdx index da865b9022cf0..d08272d0a7fc5 100644 --- a/docs/platforms/dotnet/guides/entityframework/index.mdx +++ b/docs/platforms/dotnet/guides/entityframework/index.mdx @@ -9,23 +9,14 @@ Sentry provides an integration with `EntityFramework` through the of the [Sentry > Looking for `EntityFramework Core`? If you're targeting .NET Core 3.1 or newer, that's already built in to the main Sentry .NET SDK. It's also enabled by default for our ASP.NET or ASP.NET Core integrations, even for older targets. For other scenarios, you may need to add the `Sentry.DiagnosticSource` package and call `AddDiagnosticSourceIntegration`, [as described here](/platforms/dotnet/tracing/instrumentation/automatic-instrumentation/#diagnosticsource-integration). (The rest of this page describes our EF6 integration, not EFCore.) -## Overview of the features +**Overview of the features** - Queries as breadcrumbs - Validation errors All queries executed are added as breadcrumbs and are sent with any event which happens on the same [scope](enriching-events/scopes/). Besides that, validation errors are also included as `Extra`. -## Features - -In addition to capturing errors, you can monitor interactions between multiple services or applications by [enabling tracing](/concepts/key-terms/tracing/). - -Select which Sentry features you'd like to install in addition to Error Monitoring to get the corresponding installation and configuration instructions below. - ## Install - - - ```powershell {tabTitle:Package Manager} Install-Package Sentry.EntityFramework -Version {{@inject packages.version('sentry.dotnet.ef') }} ``` @@ -36,7 +27,12 @@ dotnet add package Sentry.EntityFramework -v {{@inject packages.version('sentry. This package extends `Sentry` main SDK. That means that besides the EF features, through this package you'll also get access to all API and features available in the main `Sentry` SDK. -## Configuration +## Configure + +**Error Monitoring** starts working as soon as you initialize the SDK. **Logs** sent through `SentrySdk.Logger` and **Application Metrics** need no extra configuration. You'll learn how to send them in [Send Logs](#send-logs) and [Send Application Metrics](#send-application-metrics-). + +This guide also enables **Tracing**. + Add the Entity Framework 6 support to your project in one step: @@ -46,6 +42,12 @@ Add the Entity Framework 6 support to your project in one step: For example, configuring an ASP.NET app with _global.asax_: +The snippet also turns on: + +- Tracing: via `TracesSampleRate` + +Don't need a feature? Remove its options from the snippet. + ```csharp {filename:global.asax} using System; using System.Configuration; @@ -63,11 +65,10 @@ public class MvcApplication : System.Web.HttpApplication options.Dsn = ConfigurationManager.AppSettings["SentryDsn"]; // Adds request URL and headers, IP and name for users, etc. options.SendDefaultPii = true; - // ___PRODUCT_OPTION_START___ performance - // Set traces_sample_rate to 1.0 to capture 100% of transactions for performance monitoring. - // We recommend adjusting this value in production. + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. options.TracesSampleRate = 1.0; - // ___PRODUCT_OPTION_END___ performance // Add the EntityFramework integration options.AddEntityFramework(); }); @@ -75,8 +76,6 @@ public class MvcApplication : System.Web.HttpApplication // Global error catcher protected void Application_Error() => Server.CaptureLastError(); - - // ___PRODUCT_OPTION_START___ performance protected void Application_BeginRequest() { Context.StartSentryTransaction(); @@ -86,8 +85,6 @@ public class MvcApplication : System.Web.HttpApplication { Context.FinishSentryTransaction(); } - - // ___PRODUCT_OPTION_END___ performance public override void Dispose() { _sentrySdk.Dispose(); @@ -96,12 +93,42 @@ public class MvcApplication : System.Web.HttpApplication } ``` -## Verify +## Send Logs -This snippet includes an intentional error, so you can test that everything is working as soon as you set it up. +Use `SentrySdk.Logger` to send logs at different levels. These logs are sent without an additional option. + +See Set Up Logs for all available logging methods and formatting options. + +```csharp +SentrySdk.Logger.LogInfo("Order processed"); +SentrySdk.Logger.LogWarning("Rate limit reached for /api/orders"); +``` + +## Send Application Metrics + +Metrics are enabled by default in Sentry .NET SDK 6.1.0 and later. Use `SentrySdk.Metrics` to send counters, gauges, and distributions from your app. + +See Set Up Metrics for all available metric types and configuration options. + +```csharp +SentrySdk.Metrics.EmitCounter("button_click", 5, + new Dictionary { ["browser"] = "Firefox" }); +SentrySdk.Metrics.EmitGauge("page_load", 15.0, MeasurementUnit.Duration.Millisecond, + new Dictionary { ["page"] = "/home" }); +SentrySdk.Metrics.EmitDistribution("api_latency", 187, MeasurementUnit.Duration.Millisecond, + new Dictionary { ["endpoint"] = "/api/orders" }); +``` + +## Verify Your Setup + +Let's test your setup and confirm that data reaches your Sentry project. +### View Captured Data in Sentry + +Open your Sentry project to view the captured event. + ## Sample Check out a complete working [sample](https://github.com/getsentry/sentry-dotnet-ef/tree/master/samples/Sentry.Samples.AspNet.Mvc) to see it in action. @@ -110,4 +137,8 @@ Check out a complete working [sample](https://github.com/getsentry/sentry-dotnet ## Next Steps +At this point, you should have integrated Sentry into your Entity Framework application. Here's what to explore next: + - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup +- Learn how to [manually capture errors](/platforms/dotnet/usage/) +- Explore [Tracing](/platforms/dotnet/tracing/) diff --git a/docs/platforms/dotnet/guides/google-cloud-functions/index.mdx b/docs/platforms/dotnet/guides/google-cloud-functions/index.mdx index 31193f41c65ed..9b0f8af3ffd38 100644 --- a/docs/platforms/dotnet/guides/google-cloud-functions/index.mdx +++ b/docs/platforms/dotnet/guides/google-cloud-functions/index.mdx @@ -6,29 +6,6 @@ description: "Learn about Sentry's .NET integration with Google Cloud Functions. Sentry provides an integration with `Google Cloud Functions` through the [Sentry.Google.Cloud.Functions NuGet package](https://www.nuget.org/packages/sentry.google.cloud.functions). -## Overview of the Features - -- Easy Google Cloud Functions integration, single line: `[assembly: FunctionsStartup(typeof(SentryStartup))]` -- Captures unhandled exceptions in the middleware pipeline -- Captures exceptions handled by the framework `UseExceptionHandler` -- Captures process-wide unhandled exceptions (AppDomain) -- Captures `LogError` or `LogCritical` -- Any event sent will include relevant application log messages -- RequestId as tag -- URL as tag -- Environment is automatically set (IHostingEnvironment) -- Request payload can be captured if opt-in -- Support for EventProcessors registered with DI -- Support for ExceptionProcessors registered with DI -- Supports configuration system (bind to `SentryAspNetCoreOptions`) -- Server OS info sent -- Server Runtime info sent -- Request headers sent -- HTTP Proxy configuration -- Request body compressed -- Event flooding protection (429 retry-after and internal bound queue) -- Assembly Strong named - ## Install Add the Sentry dependency: @@ -59,13 +36,44 @@ Messages logged from assemblies with the name starting with `Sentry` will not ge ## Configure +**Error Monitoring** starts working as soon as you initialize the SDK. **Application Metrics** need no extra configuration. You'll learn how to send them in [Send Application Metrics](#send-application-metrics-). + +This guide also enables **Tracing**. + +The `Sentry.Google.Cloud.Functions` integration also gives you: + +- Easy Google Cloud Functions integration, single line: `[assembly: FunctionsStartup(typeof(SentryStartup))]` +- Captures unhandled exceptions in the middleware pipeline +- Captures exceptions handled by the framework `UseExceptionHandler` +- Captures process-wide unhandled exceptions (AppDomain) +- Captures `LogError` or `LogCritical` +- Any event sent will include relevant application log messages +- RequestId as tag +- URL as tag +- Environment is automatically set (IHostingEnvironment) +- Request payload can be captured if opt-in +- Support for EventProcessors registered with DI +- Support for ExceptionProcessors registered with DI +- Supports configuration system (bind to `SentryAspNetCoreOptions`) +- Server OS info sent +- Server Runtime info sent +- Request headers sent +- HTTP Proxy configuration +- Request body compressed +- Event flooding protection (429 retry-after and internal bound queue) +- Assembly Strong named + The simplest way to configure the `Sentry.Google.Cloud.Functions` package is by setting up your Sentry configuration into `appsettings.json` using the assembly method `FunctionsStartup` to include the type `SentryStartup`. -For example: +The snippet also turns on: + +- Tracing: via `TracesSampleRate` +Don't need a feature? Remove its options from the snippet. ```json {filename:appsettings.json} +{ "Sentry": { "Dsn": "___PUBLIC_DSN___", "MaxRequestBodySize": "Always", @@ -74,12 +82,16 @@ For example: "MinimumEventLevel": "Warning", "AttachStackTrace": true, "Debug": true, - "DiagnosticsLevel": "Error" + "DiagnosticLevel": "Error", + "TracesSampleRate": 1.0 } +} ``` > An example of some of the options that can be configured via `appsettings.json`. +Setting `TracesSampleRate` to `1.0` captures 100% of spans. We recommend reducing this value in production. + To load the configurations, you will need to use the assembly `[assembly: FunctionsStartup(typeof(SentryStartup))]`. After being initialized, the framework automatically loads `appsettings.json` and environment variables, binding to `SentryAspNetCoreOptions`. ```csharp {tabTitle:Function.cs} @@ -124,11 +136,11 @@ public class CustomOptions : FunctionsStartup > Example modifying all events before they are sent to avoid server names being reported. -## Dependency Injection +### Dependency Injection Much of the behavior of the Google cloud functions integration with Sentry can be customized by using the frameworks dependency injection system. That is done by registering your own implementation of some of the exposed abstraction inside of `FunctionsStartup`. -### Capturing the Affected User +#### Capturing the Affected User When opting in to `SendDefaultPii`, the SDK will automatically read the user from the request by inspecting `HttpContext.User`. Default claim values like `NameIdentifier` for the _Id_ will be used. @@ -152,21 +164,40 @@ public class UserFactoryStartup : FunctionsStartup } ``` -### Options & Initialization +### Options and Initialization As previously mentioned, this package is a wrapper around [Sentry.Extensions.Logging](/platforms/dotnet/guides/extensions-logging/), [Sentry.AspNetCore](/platforms/dotnet/guides/aspnetcore/) and [Sentry](/platforms/dotnet/). Please refer to the documentation of these packages to get the options that are defined at those levels. -## Verify +## Send Application Metrics -This snippet includes an intentional error, so you can test that everything is working as soon as you set it up. +Metrics are enabled by default in Sentry .NET SDK 6.1.0 and later. Use `SentrySdk.Metrics` to send counters, gauges, and distributions from your app. + +See Set Up Metrics for all available metric types and configuration options. + +```csharp +SentrySdk.Metrics.EmitCounter("button_click", 5, + new Dictionary { ["browser"] = "Firefox" }); +SentrySdk.Metrics.EmitGauge("page_load", 15.0, MeasurementUnit.Duration.Millisecond, + new Dictionary { ["page"] = "/home" }); +SentrySdk.Metrics.EmitDistribution("api_latency", 187, MeasurementUnit.Duration.Millisecond, + new Dictionary { ["endpoint"] = "/api/orders" }); +``` + +## Verify Your Setup + +Let's test your setup and confirm that data reaches your Sentry project. -## Samples +### View Captured Data in Sentry -- [Google Cloud Functions sample](https://github.com/getsentry/sentry-dotnet/tree/main/samples/Sentry.Samples.Google.Cloud.Functions) -- For [more samples](https://github.com/getsentry/sentry-dotnet-samples) of the .NET SDKs. +Open your Sentry project to view the captured event. ## Next Steps +At this point, you should have integrated Sentry into your Google Cloud Functions application. Here's what to explore next: + - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup +- Learn how to [manually capture errors](/platforms/dotnet/usage/) +- Explore [Tracing](/platforms/dotnet/tracing/) +- Check out the [Google Cloud Functions sample](https://github.com/getsentry/sentry-dotnet/tree/main/samples/Sentry.Samples.Google.Cloud.Functions), or browse [more samples](https://github.com/getsentry/sentry-dotnet-samples) of the .NET SDKs diff --git a/docs/platforms/dotnet/guides/maui/index.mdx b/docs/platforms/dotnet/guides/maui/index.mdx index 1d707e3568b51..1688daecfafc0 100644 --- a/docs/platforms/dotnet/guides/maui/index.mdx +++ b/docs/platforms/dotnet/guides/maui/index.mdx @@ -6,7 +6,7 @@ description: "Learn about Sentry's .NET integration with .NET Multi-platform App Sentry has an integration for the [.NET Multi-platform App UI (MAUI)](https://dotnet.microsoft.com/apps/maui) through the [Sentry.Maui NuGet package](https://www.nuget.org/packages/Sentry.Maui). -## Overview of the features +**Overview of the features** - Easy MAUI integration by calling `UseSentry` on your `MauiAppBuilder` - All the features of our main [.NET SDK](/platforms/dotnet/), for your managed code @@ -18,16 +18,7 @@ Sentry has an integration for the [.NET Multi-platform App UI (MAUI)](https://do - Detailed device and runtime information passed on every event - Automatic session tracking enabled, to support [release health](/product/releases/) -## Features - -In addition to capturing errors, you can monitor interactions between multiple services or applications by [enabling tracing](/concepts/key-terms/tracing/). - -Select which Sentry features you'd like to install in addition to Error Monitoring to get the corresponding installation and configuration instructions below. - ## Install - - - Add the Sentry dependency to your .NET MAUI application: ```shell {tabTitle:.NET Core CLI} @@ -42,9 +33,21 @@ This package extends [Sentry.Extensions.Logging](/platforms/dotnet/guides/extens ## Configure +**Error Monitoring** starts working as soon as you initialize the SDK. **Logs** sent through `Microsoft.Extensions.Logging` need `EnableLogs = true`, and **Application Metrics** need no extra configuration. You'll learn how to send them in [Send Logs](#send-logs) and [Send Application Metrics](#send-application-metrics-). + +This guide also enables **Tracing**. + + In your `MauiProgram.cs` file, call `UseSentry` on your `MauiAppBuilder`, and include any options you would like to set. The `Dsn` is the only required parameter. +The snippet also turns on: + +- Tracing: via `TracesSampleRate` +- Logs: via `EnableLogs` + +Don't need a feature? Remove its options from the snippet. + ```csharp public static MauiApp CreateMauiApp() { @@ -57,6 +60,7 @@ public static MauiApp CreateMauiApp() { // The DSN is the only required setting. options.Dsn = "___PUBLIC_DSN___"; + options.EnableLogs = true; // Use debug mode if you want to see what the SDK is doing. // Debug messages are written to stdout with Console.Writeline, @@ -66,15 +70,12 @@ public static MauiApp CreateMauiApp() // Adds request URL and headers, IP and name for users, etc. options.SendDefaultPii = true; - - // ___PRODUCT_OPTION_START___ performance - // Set TracesSampleRate to 1.0 to capture 100% of transactions for tracing. - // We recommend adjusting this value in production. + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. options.TracesSampleRate = 1.0; - // ___PRODUCT_OPTION_END___ performance // If your app doesn't have sensitive data, you can get screenshots on error events automatically - // https://docs.sentry.io/platforms/dotnet/guides/maui/configuration/options/#AttachScreenshot options.AttachScreenshot = true; // Other Sentry options can be set here. @@ -127,12 +128,60 @@ Use caution when enabling, as such values may contain personally identifiable in -## Verify +## Send Logs + +Use `Microsoft.Extensions.Logging` to send structured logs from your application. Set `EnableLogs = true` in your Sentry initialization. -This snippet includes an intentional error, so you can test that everything is working as soon as you set it up. +See [Microsoft.Extensions.Logging](/platforms/dotnet/guides/extensions-logging/) for setup details. + +See Set Up Logs for all available logging methods and formatting options. + +```csharp +using Microsoft.Extensions.Logging; + +public sealed class OrderService +{ + private readonly ILogger _logger; + + public OrderService(ILogger logger) => _logger = logger; + + public void Process() + { + _logger.LogInformation("Order processed {OrderId}", "order-123"); + _logger.LogWarning("Rate limit reached for {Endpoint}", "/api/orders"); + } +} +``` + +## Send Application Metrics + +Metrics are enabled by default in Sentry .NET SDK 6.1.0 and later. Use `SentrySdk.Metrics` to send counters, gauges, and distributions from your app. + +See Set Up Metrics for all available metric types and configuration options. + +```csharp +SentrySdk.Metrics.EmitCounter("button_click", 5, + new Dictionary { ["browser"] = "Firefox" }); +SentrySdk.Metrics.EmitGauge("page_load", 15.0, MeasurementUnit.Duration.Millisecond, + new Dictionary { ["page"] = "/home" }); +SentrySdk.Metrics.EmitDistribution("api_latency", 187, MeasurementUnit.Duration.Millisecond, + new Dictionary { ["endpoint"] = "/api/orders" }); +``` + +## Verify Your Setup + +Let's test your setup and confirm that data reaches your Sentry project. +### View Captured Data in Sentry + +Open your Sentry project to view the captured event. + ## Next Steps +At this point, you should have integrated Sentry into your .NET MAUI application. Here's what to explore next: + - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup +- Learn how to [manually capture errors](/platforms/dotnet/usage/) +- Explore [Tracing](/platforms/dotnet/tracing/) diff --git a/docs/platforms/dotnet/guides/winforms/index.mdx b/docs/platforms/dotnet/guides/winforms/index.mdx index 166143d0461d5..0c2e5915b5bd2 100644 --- a/docs/platforms/dotnet/guides/winforms/index.mdx +++ b/docs/platforms/dotnet/guides/winforms/index.mdx @@ -6,20 +6,16 @@ og_image: /og-images/platforms-dotnet-guides-winforms.png Sentry's .NET SDK works with WinForms applications through the [Sentry NuGet package](https://www.nuget.org/packages/Sentry). It works with WinForms apps running on .NET Framework 4.6.2, .NET Core 3.0, or higher. -## Features - -In addition to capturing errors, you can monitor interactions between multiple services or applications by [enabling tracing](/concepts/key-terms/tracing/). - -Select which Sentry features you'd like to install in addition to Error Monitoring to get the corresponding installation and configuration instructions below. - ## Install - - - ## Configure +**Error Monitoring** starts working as soon as you initialize the SDK. **Logs** sent through `SentrySdk.Logger` and **Application Metrics** need no extra configuration. You'll learn how to send them in [Send Logs](#send-logs) and [Send Application Metrics](#send-application-metrics-). + +This guide also enables **Tracing**. + + After adding the NuGet package, the SDK should be initialized in the program's main entry point, before launching any forms or performing significant work. The options for initialization vary by language. ### C# Initialization @@ -31,6 +27,12 @@ You should also set `Application.SetUnhandledExceptionMode(UnhandledExceptionMod A complete example of the recommended startup is as follows: +The snippet also turns on: + +- Tracing: via `TracesSampleRate` + +Don't need a feature? Remove its options from the snippet. + ```csharp using System; using System.Windows.Forms; @@ -63,14 +65,11 @@ namespace WindowsFormsApp1 Debug = true, // Adds request URL and headers, IP and name for users, etc. - options.SendDefaultPii = true; - - // ___PRODUCT_OPTION_START___ performance - // Set traces_sample_rate to 1.0 to capture 100% of transactions for tracing. - // We recommend adjusting this value in production. + SendDefaultPii = true, + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. TracesSampleRate = 1.0, - - // ___PRODUCT_OPTION_END___ performance // Enable Global Mode since this is a client app IsGlobalModeEnabled = true, @@ -226,16 +225,50 @@ Namespace My End Namespace ``` -## Verify +## Send Logs + +Use `SentrySdk.Logger` to send logs at different levels. These logs are sent without an additional option. + +See Set Up Logs for all available logging methods and formatting options. + +```csharp +SentrySdk.Logger.LogInfo("Order processed"); +SentrySdk.Logger.LogWarning("Rate limit reached for /api/orders"); +``` + +## Send Application Metrics + +Metrics are enabled by default in Sentry .NET SDK 6.1.0 and later. Use `SentrySdk.Metrics` to send counters, gauges, and distributions from your app. + +See Set Up Metrics for all available metric types and configuration options. + +```csharp +SentrySdk.Metrics.EmitCounter("button_click", 5, + new Dictionary { ["browser"] = "Firefox" }); +SentrySdk.Metrics.EmitGauge("page_load", 15.0, MeasurementUnit.Duration.Millisecond, + new Dictionary { ["page"] = "/home" }); +SentrySdk.Metrics.EmitDistribution("api_latency", 187, MeasurementUnit.Duration.Millisecond, + new Dictionary { ["endpoint"] = "/api/orders" }); +``` + +## Verify Your Setup -This snippet includes an intentional error, so you can test that everything is working as soon as you set it up. +Let's test your setup and confirm that data reaches your Sentry project. +### View Captured Data in Sentry + +Open your Sentry project to view the captured event. + ## Resources [Discussion on GitHub `Application.SetUnhandledExceptionMode`](https://github.com/getsentry/sentry-dotnet/issues/176) ## Next Steps +At this point, you should have integrated Sentry into your WinForms application. Here's what to explore next: + - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup +- Learn how to [manually capture errors](/platforms/dotnet/usage/) +- Explore [Tracing](/platforms/dotnet/tracing/) diff --git a/docs/platforms/dotnet/guides/winui/index.mdx b/docs/platforms/dotnet/guides/winui/index.mdx index a0c231388bbbd..16f84ae9841b2 100644 --- a/docs/platforms/dotnet/guides/winui/index.mdx +++ b/docs/platforms/dotnet/guides/winui/index.mdx @@ -5,19 +5,15 @@ description: "Learn about using Sentry's .NET SDK with the Windows UI Library" Sentry's .NET SDK works with Windows UI Library applications through the [Sentry NuGet package](https://www.nuget.org/packages/Sentry). -## Features - -In addition to capturing errors, you can monitor interactions between multiple services or applications by [enabling tracing](/concepts/key-terms/tracing/). - -Select which Sentry features you'd like to install in addition to Error Monitoring to get the corresponding installation and configuration instructions below. - ## Install + - +## Configure - +**Error Monitoring** starts working as soon as you initialize the SDK. **Logs** sent through `SentrySdk.Logger` and **Application Metrics** need no extra configuration. You'll learn how to send them in [Send Logs](#send-logs) and [Send Application Metrics](#send-application-metrics-). + +This guide also enables **Tracing**. -## Configure (Without Trimming) If you don't have [Trimming](https://learn.microsoft.com/en-us/dotnet/core/deploying/trimming/trimming-options?pivots=dotnet-8-0) enabled when publishing your application then all you need to do is [initialize the SDK with `SentrySdk.Init`](/platforms/dotnet/) in the constructor of your application class (usually `App.xaml.cs`). Sentry's integration for WinUI will automatically capture any unhandled exceptions in your application and send these to Sentry. @@ -30,7 +26,11 @@ Do not initialize the SDK in the `OnLaunched` event of the application or the `H In addition to capturing errors, you can monitor interactions between multiple services or applications by [enabling tracing](/concepts/key-terms/tracing/). -Select which Sentry features you'd like to install in addition to Error Monitoring to get the corresponding installation and configuration instructions below. +The snippet also turns on: + +- Tracing: via `TracesSampleRate` + +Don't need a feature? Remove its options from the snippet. ```csharp using Sentry.Protocol; @@ -50,12 +50,11 @@ sealed partial class App : Application // Adds request URL and headers, IP and name for users, etc. options.SendDefaultPii = true; - // ___PRODUCT_OPTION_START___ performance - // Set TracesSampleRate to 1.0 to capture 100% of transactions for tracing. - // We recommend adjusting this value in production. + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. options.TracesSampleRate = 1.0; - // ___PRODUCT_OPTION_END___ performance // Enable Global Mode since this is a client app. options.IsGlobalModeEnabled = true; @@ -71,7 +70,7 @@ sealed partial class App : Application } ``` -## Configure (With Trimming) +### Configure With Trimming If you have [Trimming](https://learn.microsoft.com/en-us/dotnet/core/deploying/trimming/trimming-options?pivots=dotnet-8-0) enabled when publishing your application then, in addition to [initializing the SDK with `SentrySdk.Init`](/platforms/dotnet/), you must also configure an UnhandledException handler in the constructor of your application class (usually `App.xaml.cs`). @@ -102,12 +101,11 @@ sealed partial class App : Application // Adds request URL and headers, IP and name for users, etc. o.SendDefaultPii = true; - // ___PRODUCT_OPTION_START___ performance - // Set TracesSampleRate to 1.0 to capture 100% of transactions for tracing. - // We recommend adjusting this value in production. + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. o.TracesSampleRate = 1.0; - // ___PRODUCT_OPTION_END___ performance // Enable Global Mode since this is a client app. o.IsGlobalModeEnabled = true; @@ -151,12 +149,46 @@ sealed partial class App : Application } ``` -## Verify +## Send Logs + +Use `SentrySdk.Logger` to send logs at different levels. These logs are sent without an additional option. + +See Set Up Logs for all available logging methods and formatting options. + +```csharp +SentrySdk.Logger.LogInfo("Order processed"); +SentrySdk.Logger.LogWarning("Rate limit reached for /api/orders"); +``` + +## Send Application Metrics + +Metrics are enabled by default in Sentry .NET SDK 6.1.0 and later. Use `SentrySdk.Metrics` to send counters, gauges, and distributions from your app. + +See Set Up Metrics for all available metric types and configuration options. + +```csharp +SentrySdk.Metrics.EmitCounter("button_click", 5, + new Dictionary { ["browser"] = "Firefox" }); +SentrySdk.Metrics.EmitGauge("page_load", 15.0, MeasurementUnit.Duration.Millisecond, + new Dictionary { ["page"] = "/home" }); +SentrySdk.Metrics.EmitDistribution("api_latency", 187, MeasurementUnit.Duration.Millisecond, + new Dictionary { ["endpoint"] = "/api/orders" }); +``` + +## Verify Your Setup -This snippet includes an intentional error, so you can test that everything is working as soon as you set it up. +Let's test your setup and confirm that data reaches your Sentry project. +### View Captured Data in Sentry + +Open your Sentry project to view the captured event. + ## Next Steps +At this point, you should have integrated Sentry into your WinUI application. Here's what to explore next: + - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup +- Learn how to [manually capture errors](/platforms/dotnet/usage/) +- Explore [Tracing](/platforms/dotnet/tracing/) diff --git a/docs/platforms/dotnet/guides/wpf/index.mdx b/docs/platforms/dotnet/guides/wpf/index.mdx index 436f99010e3a3..f9a1444911649 100644 --- a/docs/platforms/dotnet/guides/wpf/index.mdx +++ b/docs/platforms/dotnet/guides/wpf/index.mdx @@ -5,25 +5,27 @@ description: "Learn more about how Sentry's .NET SDK works with Windows Presenta Sentry's .NET SDK works with Windows Presentation Foundation applications through the [Sentry NuGet package](https://www.nuget.org/packages/Sentry). It works with WPF apps running on .NET Framework 4.6.2, .NET Core 3.0 or higher. -## Features - -In addition to capturing errors, you can monitor interactions between multiple services or applications by [enabling tracing](/concepts/key-terms/tracing/). - -Select which Sentry features you'd like to install in addition to Error Monitoring to get the corresponding installation and configuration instructions below. - ## Install - - - ## Configure +**Error Monitoring** starts working as soon as you initialize the SDK. **Logs** sent through `SentrySdk.Logger` and **Application Metrics** need no extra configuration. You'll learn how to send them in [Send Logs](#send-logs) and [Send Application Metrics](#send-application-metrics-). + +This guide also enables **Tracing**. + + In addition to [initializing the SDK with `SentrySdk.Init`](/platforms/dotnet/), you must configure the WPF specific error handler. The SDK automatically handles `AppDomain.UnhandledException`. On WPF, for production apps (when no debugger is attached), WPF catches exception to show the dialog to the user. You can also configure your app to capture those exceptions before the dialog shows up: +The snippet also turns on: + +- Tracing: via `TracesSampleRate` + +Don't need a feature? Remove its options from the snippet. + ```csharp using System.Windows; @@ -41,13 +43,10 @@ public partial class App : Application // Adds request URL and headers, IP and name for users, etc. options.SendDefaultPii = true; - - // ___PRODUCT_OPTION_START___ performance - // Set traces_sample_rate to 1.0 to capture 100% of transactions for tracing. - // We recommend adjusting this value in production. + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. options.TracesSampleRate = 1.0; - - // ___PRODUCT_OPTION_END___ performance // Enable Global Mode since this is a client app options.IsGlobalModeEnabled = true; @@ -66,12 +65,46 @@ public partial class App : Application } ``` -## Verify +## Send Logs + +Use `SentrySdk.Logger` to send logs at different levels. These logs are sent without an additional option. + +See Set Up Logs for all available logging methods and formatting options. + +```csharp +SentrySdk.Logger.LogInfo("Order processed"); +SentrySdk.Logger.LogWarning("Rate limit reached for /api/orders"); +``` + +## Send Application Metrics + +Metrics are enabled by default in Sentry .NET SDK 6.1.0 and later. Use `SentrySdk.Metrics` to send counters, gauges, and distributions from your app. + +See Set Up Metrics for all available metric types and configuration options. + +```csharp +SentrySdk.Metrics.EmitCounter("button_click", 5, + new Dictionary { ["browser"] = "Firefox" }); +SentrySdk.Metrics.EmitGauge("page_load", 15.0, MeasurementUnit.Duration.Millisecond, + new Dictionary { ["page"] = "/home" }); +SentrySdk.Metrics.EmitDistribution("api_latency", 187, MeasurementUnit.Duration.Millisecond, + new Dictionary { ["endpoint"] = "/api/orders" }); +``` + +## Verify Your Setup -This snippet includes an intentional error, so you can test that everything is working as soon as you set it up. +Let's test your setup and confirm that data reaches your Sentry project. +### View Captured Data in Sentry + +Open your Sentry project to view the captured event. + ## Next Steps +At this point, you should have integrated Sentry into your WPF application. Here's what to explore next: + - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup +- Learn how to [manually capture errors](/platforms/dotnet/usage/) +- Explore [Tracing](/platforms/dotnet/tracing/) diff --git a/docs/platforms/dotnet/guides/xamarin/index.mdx b/docs/platforms/dotnet/guides/xamarin/index.mdx index e4aca0e0cd367..2e7800b29932c 100644 --- a/docs/platforms/dotnet/guides/xamarin/index.mdx +++ b/docs/platforms/dotnet/guides/xamarin/index.mdx @@ -19,13 +19,21 @@ The SDK is compatible with the following versions or higher: ## Configure -After you've completed setting up a project in Sentry, Sentry will give you a value which we call a DSN or Data Source Name. It looks a lot like a standard URL, but it's just a representation of the configuration required by the Sentry SDK. It consists of a few pieces, including the protocol, public key, the server address, and the project identifier. +**Error Monitoring** starts working as soon as you initialize the SDK. + +This guide also enables **Tracing**. - +After you've completed setting up a project in Sentry, Sentry will give you a value which we call a DSN or Data Source Name. It looks a lot like a standard URL, but it's just a representation of the configuration required by the Sentry SDK. It consists of a few pieces, including the protocol, public key, the server address, and the project identifier. You should initialize the SDK as early as possible, for an example, the start of OnCreate on MainActivity for Android, and, the top of FinishedLaunching on AppDelegate for iOS). +The snippet also turns on: + +- Tracing: via `TracesSampleRate` + +Don't need a feature? Remove its options from the snippet. + ```csharp SentryXamarin.Init(options => { @@ -36,27 +44,15 @@ SentryXamarin.Init(options => options.Debug = true; // Adds request URL and headers, IP and name for users, etc. options.SendDefaultPii = true; - // ___PRODUCT_OPTION_START___ performance - // Set TracesSampleRate to 1.0 to capture 100% - // of transactions for tracing. - // We recommend adjusting this value in production + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. options.TracesSampleRate = 1.0; - // ___PRODUCT_OPTION_END___ performance }); // App code ``` -## Verify - -Great! Now that you've completed setting up the SDK, maybe you want to quickly test out how Sentry works. Start by capturing an exception: - - - -All you need to do is to [initialize the SDK with `SentryXamarin.Init`](../../), you will not need any additional changes to get the SDK ready to go. - -The SDK automatically handles `AppDomain.UnhandledException` and `Application.UnhandledException`, so you'll not need to worry about trying to Catch Unhandled Exceptions. - ### Xamarin Options The following options are only going to be valid during the SDK initialization. @@ -85,6 +81,17 @@ Note that personally identifiable information (PII) might be included in the scr Disables the automatic Logging of internal Warnings that comes from Xamarin Forms. + +## Verify Your Setup + +Let's test your setup and confirm that data reaches your Sentry project. + + + +### View Captured Data in Sentry + +Open your Sentry project to view the captured event. + ## Troubleshooting For information about Troubleshooting, please visit the [troubleshooting](troubleshooting/) page. @@ -95,4 +102,8 @@ For information about Troubleshooting, please visit the [troubleshooting](troubl ## Next Steps +At this point, you should have integrated Sentry into your Xamarin application. Here's what to explore next: + - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup +- Learn how to [manually capture errors](/platforms/dotnet/usage/) +- Explore [Tracing](/platforms/dotnet/tracing/) diff --git a/docs/platforms/dotnet/index.mdx b/docs/platforms/dotnet/index.mdx index 45a64bc5f8916..d6803feaf506d 100644 --- a/docs/platforms/dotnet/index.mdx +++ b/docs/platforms/dotnet/index.mdx @@ -24,47 +24,32 @@ You can use these instructions to run Sentry in an app running on: If you're using a framework, such as ASP.NET Core or MAUI, please select the framework on the drop down on the top left. -## Features - -In addition to capturing errors, you can monitor interactions between multiple services or applications by [enabling tracing](/concepts/key-terms/tracing/). You can also collect and analyze performance profiles from real users with [profiling](/product/profiling/). - -Select which Sentry features you'd like to install in addition to Error Monitoring to get the corresponding installation and configuration instructions below. - ## Install - +Install the `Sentry` NuGet package to add the SDK: -Sentry captures data by using an SDK within your application's runtime. These are platform-specific and allow Sentry to have a deep understanding of how your application works. - -Install the **NuGet** package to add the Sentry dependency: - - +```shell {tabTitle:.NET Core CLI} +dotnet add package Sentry -v {{@inject packages.version('sentry.dotnet') }} +``` - ```shell {tabTitle:.NET Core CLI} - dotnet add package Sentry -v {{@inject packages.version('sentry.dotnet') }} - ``` +```powershell {tabTitle:Package Manager} +Install-Package Sentry -Version {{@inject packages.version('sentry.dotnet') }} +``` - ```powershell {tabTitle:Package Manager} - Install-Package Sentry. -Version {{@inject packages.version('sentry.dotnet') }} - ``` +## Configure - +**Error Monitoring** starts working as soon as you call `SentrySdk.Init()`. **Logs** sent through `SentrySdk.Logger` and **Application Metrics** need no extra configuration. You'll learn how to send them in [Send Logs](#send-logs) and [Send Application Metrics](#send-application-metrics-). - +This guide also enables **Tracing**. **Profiling** is in Alpha and needs .NET 8 or later, so it's a separate step: see [Enable Profiling on .NET 8 and Later](#enable-profiling-on-net-8-and-later). - ```shell {tabTitle:.NET Core CLI} - dotnet add package Sentry.Profiling -v {{@inject packages.version('sentry.dotnet.profiling') }} - ``` - ```powershell {tabTitle:Package Manager} - Install-Package Sentry.Profiling -Version {{@inject packages.version('sentry.dotnet.profiling') }} - ``` +To capture all errors, even the one during the startup of your application, you should initialize the Sentry .NET SDK as soon as possible. - +The snippet also turns on: -## Configure +- Tracing: via `TracesSampleRate` -To capture all errors, even the one during the startup of your application, you should initialize the Sentry .NET SDK as soon as possible. +Don't need a feature? Remove its options from the snippet. ```csharp SentrySdk.Init(options => @@ -73,23 +58,81 @@ SentrySdk.Init(options => options.Debug = true; // Adds request URL and headers, IP and name for users, etc. options.SendDefaultPii = true; - // ___PRODUCT_OPTION_START___ performance - // A fixed sample rate of 1.0 - 100% of all transactions are getting sent + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. options.TracesSampleRate = 1.0f; - // ___PRODUCT_OPTION_END___ performance - // ___PRODUCT_OPTION_START___ profiling - // A sample rate for profiling - this is relative to TracesSampleRate - options.ProfilesSampleRate = 1.0f; - // ___PRODUCT_OPTION_END___ profiling }); ``` -## Verify +### Enable Profiling on .NET 8 and Later + + + +Profiling for .NET is in Alpha and needs .NET 8 or later. On .NET Framework, `Sentry.Profiling` installs without a warning, but `AddProfilingIntegration()` doesn't compile. + + + +To profile your app, install the `Sentry.Profiling` package: + +```shell {tabTitle:.NET Core CLI} +dotnet add package Sentry.Profiling -v {{@inject packages.version('sentry.dotnet.profiling') }} +``` + +```powershell {tabTitle:Package Manager} +Install-Package Sentry.Profiling -Version {{@inject packages.version('sentry.dotnet.profiling') }} +``` + +Then add these options to `SentrySdk.Init()`: + +```csharp +// Enables Profiling for 100% of sampled transactions. +options.ProfilesSampleRate = 1.0f; +options.AddProfilingIntegration(); +``` + +See Set Up Profiling for supported platforms and options. + +## Send Logs + +Use `SentrySdk.Logger` to send logs at different levels. These logs are sent without an additional option. + +See Set Up Logs for all available logging methods and formatting options. + +```csharp +SentrySdk.Logger.LogInfo("Order processed"); +SentrySdk.Logger.LogWarning("Rate limit reached for /api/orders"); +``` -This snippet includes an intentional error, so you can test that everything is working as soon as you set it up. +## Send Application Metrics + +Metrics are enabled by default in Sentry .NET SDK 6.1.0 and later. Use `SentrySdk.Metrics` to send counters, gauges, and distributions from your app. + +See Set Up Metrics for all available metric types and configuration options. + +```csharp +SentrySdk.Metrics.EmitCounter("button_click", 5, + new Dictionary { ["browser"] = "Firefox" }); +SentrySdk.Metrics.EmitGauge("page_load", 15.0, MeasurementUnit.Duration.Millisecond, + new Dictionary { ["page"] = "/home" }); +SentrySdk.Metrics.EmitDistribution("api_latency", 187, MeasurementUnit.Duration.Millisecond, + new Dictionary { ["endpoint"] = "/api/orders" }); +``` + +## Verify Your Setup + +Let's test your setup and confirm that data reaches your Sentry project. +### View Captured Data in Sentry + +Open your Sentry project to view the captured event. + ## Next Steps +At this point, you should have integrated Sentry into your .NET application. Here's what to explore next: + - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup +- Learn how to [manually capture errors](/platforms/dotnet/usage/) +- Explore [Tracing](/platforms/dotnet/tracing/) From f1d092b64108aa8ba3516c1f88708853addc50ef Mon Sep 17 00:00:00 2001 From: Markus Unterwaditzer Date: Wed, 21 Oct 2026 11:29:53 +0000 Subject: [PATCH 017/127] getsentry/relay@60972d455a1178423ec2d793a2d783158c022896 --- src/data/relay_metrics.json | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/data/relay_metrics.json b/src/data/relay_metrics.json index 34771670db9ea..e9f4b597cf88a 100644 --- a/src/data/relay_metrics.json +++ b/src/data/relay_metrics.json @@ -381,6 +381,12 @@ "description": "Size of emitted kafka message in bytes.\n\nThis metric is tagged with:\n- `topic`: The Kafka topic being produced to.\n- `variant`: The Kafka message variant.\n- `producer_name`: The configured producer name/deployment identifier.", "features": [] }, + { + "type": "Gauge", + "name": "kafka.reload_generation", + "description": "The number of times this topic's Kafka client has been replaced by a config reload.\n\nAlways `0` for topics not using the reloading producer. Arroyo reports the same number\nunder `arroyo.producer.config_reload_generation`; this one is tagged the way Relay tags\nthe rest of its produce metrics, so it lines up with them.\n\nThis metric is tagged with:\n- `topic`: The Kafka topic being produced to.\n- `producer_name`: The configured producer name/deployment identifier.", + "features": [] + }, { "type": "Counter", "name": "logs.envelope", @@ -538,6 +544,18 @@ "processing" ] }, + { + "type": "Counter", + "name": "producer.config_reload.pushed", + "description": "Number of Kafka config blobs handed to a topic's reloading producer.\n\nCounts pushes that were accepted for rollout, which includes blobs that resolve to the\nconfig already running. It does not mean the client was replaced; watch\n[`KafkaGauges::ReloadGeneration`] for that.\n\nThis metric is tagged with:\n- `topic`: The Kafka topic being produced to.\n- `producer_name`: The configured producer name/deployment identifier.", + "features": [] + }, + { + "type": "Counter", + "name": "producer.config_reload.rejected", + "description": "Number of Kafka config blobs a topic's reloading producer refused.\n\nRejection leaves the running client in place. Sustained non-zero values mean this topic\nis no longer applying config changes.\n\nThis metric is tagged with:\n- `topic`: The Kafka topic being produced to.\n- `producer_name`: The configured producer name/deployment identifier.", + "features": [] + }, { "type": "Counter", "name": "producer.enqueue.error", From e64c3ea4052f65c241e7e81e2393ce8c1cf4fe9e Mon Sep 17 00:00:00 2001 From: "sentry-junior[bot]" <264270552+sentry-junior[bot]@users.noreply.github.com> Date: Wed, 21 Oct 2026 14:11:15 +0200 Subject: [PATCH 018/127] docs(php): Fix before_breadcrumb return type (#20122) ## DESCRIBE YOUR PR The PHP options page documents the `before_breadcrumb` callback as returning a non-nullable `\Sentry\Breadcrumb`. The same section says the breadcrumb is dropped when nothing is returned. The SDK expects the callback to return `?\Sentry\Breadcrumb` and drops the breadcrumb on `null`. This makes the return type nullable and says `null` explicitly. Source evidence (sentry-php `4.34.0`, the latest release): - [`src/Options.php`](https://github.com/getsentry/sentry-php/blob/4.34.0/src/Options.php#L898) documents the callback as `callable(Breadcrumb): ?Breadcrumb` for both the getter and the setter - [`src/State/Hub.php`](https://github.com/getsentry/sentry-php/blob/4.34.0/src/State/Hub.php#L227-L235) runs the callback and adds the breadcrumb only `if ($breadcrumb !== null)` Corrected claim: `function (\Sentry\Breadcrumb $breadcrumb): ?\Sentry\Breadcrumb`. Returning `null` drops the breadcrumb. cc @Litarnus @stayallive ## IS YOUR CHANGE URGENT? - [ ] Urgent deadline (GA date, etc.): YYYY-MM-DD - [ ] Other deadline: YYYY-MM-DD - [x] No deadline: Not urgent, can wait up to 1 week+ via **Martin Linzmayer**. -- [View Junior Session](https://junior-prod.sentry.dev/conversations/agent-dispatch%3Adispatch_51ed2321cd7553f06241dff253dee523) [[Sentry]](https://sentry.sentry.io/explore/conversations/agent-dispatch%3Adispatch_51ed2321cd7553f06241dff253dee523/?project=4510944073809921) Co-authored-by: sentry-junior[bot] <264270552+sentry-junior[bot]@users.noreply.github.com> --- docs/platforms/php/common/configuration/options.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/platforms/php/common/configuration/options.mdx b/docs/platforms/php/common/configuration/options.mdx index 8e86d81a2f30f..38299038c8415 100644 --- a/docs/platforms/php/common/configuration/options.mdx +++ b/docs/platforms/php/common/configuration/options.mdx @@ -215,9 +215,9 @@ The number of characters after which the values containing text in the event pay - + -This function is called with a breadcrumb object before the breadcrumb is added to the scope. When nothing is returned from the function, the breadcrumb is dropped. To pass the breadcrumb through, return the breadcrumb itself. +This function is called with a breadcrumb object before the breadcrumb is added to the scope. When `null` is returned from the function, the breadcrumb is dropped. To pass the breadcrumb through, return the breadcrumb itself. From 2bd643f51c62e6cbba2236db98f5c9e22e08580d Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Wed, 21 Oct 2026 14:13:14 +0200 Subject: [PATCH 019/127] docs(python): Add `data_collection` alternatives to integration docs (#20128) ## DESCRIBE YOUR PR The Python integration and agent tracing pages only describe `send_default_pii`. This adds the `data_collection` alternative, naming the specific key that controls each behavior. - Web framework pages: mention `data_collection` next to `send_default_pii` - Django, Flask: `user_info` - Redis, PyMongo, clickhouse-driver: `database_query_data` - GQL, Graphene, Ariadne, Strawberry: `graphql` and `http_bodies` (also fixes a typo on the Strawberry page claiming body capture was on by default) - MCP and agent tracing pages: `gen_ai`, and that `include_prompts` is ignored when `data_collection` is set - Rust Tracing: `data_collection` doesn't affect `include_tracing_fields` - Data Collected: `outgoing_response` is a valid `http_bodies` type and part of the default (used by Ariadne and Strawberry) - Mention `data_collection` before `send_default_pii` everywhere, and note that `send_default_pii` will be removed in version 3.0 of the SDK (also updates Options, Data Collected and Sensitive Data, which said it would only be deprecated eventually) - AI pages and Data Collected: clarify that prompts, messages, and responses aren't recorded by default, but some tool data is (tool definitions, LangChain and Google GenAI tool calls, MCP arguments), and how to remove it Init snippets still use `send_default_pii=True`; that'll be handled separately. ## IS YOUR CHANGE URGENT? Help us prioritize incoming PRs by letting us know when the change needs to go live. Select exactly one option. For deadlines, replace `YYYY-MM-DD` with the due date. You can update this information later by editing the PR description. - [ ] Urgent deadline (GA date, etc.): YYYY-MM-DD - [ ] Other deadline: YYYY-MM-DD - [x] No deadline: Not urgent, can wait up to 1 week+ ## SLA - Teamwork makes the dream work, so please add a reviewer to your PRs. - Please give the docs team up to 1 week to review your PR unless you've supplied a deadline. Thanks in advance for your help! ## PRE-MERGE CHECKLIST _Make sure you've checked the following before merging your changes:_ - [ ] Checked Vercel preview for correctness, including links - [ ] PR was reviewed and approved by any necessary SMEs (subject matter experts) - [ ] PR was reviewed and approved by a member of the [Sentry docs team](https://github.com/orgs/getsentry/teams/docs) --- .../python/agent-tracing/anthropic/index.mdx | 18 +++++++++-- .../agent-tracing/google-genai/index.mdx | 18 +++++++++-- .../agent-tracing/huggingface_hub/index.mdx | 18 +++++++++-- docs/platforms/python/agent-tracing/index.mdx | 18 +++++++++-- .../python/agent-tracing/langchain/index.mdx | 18 +++++++++-- .../python/agent-tracing/langgraph/index.mdx | 4 ++- .../python/agent-tracing/litellm/index.mdx | 18 +++++++++-- .../python/agent-tracing/mistral/index.mdx | 14 ++++++++- .../agent-tracing/openai-agents/index.mdx | 18 +++++++++-- .../python/agent-tracing/openai/index.mdx | 18 +++++++++-- .../agent-tracing/pydantic-ai/index.mdx | 18 +++++++++-- .../python/configuration/options.mdx | 2 +- .../python/data-management/data-collected.mdx | 30 +++++++++---------- .../data-management/sensitive-data/index.mdx | 2 +- .../python/integrations/ariadne/index.mdx | 28 +++++++++++++---- .../python/integrations/asgi/index.mdx | 2 +- .../manual-instrumentation/index.mdx | 2 +- .../python/integrations/bottle/index.mdx | 2 +- .../python/integrations/chalice/index.mdx | 2 +- .../integrations/clickhouse-driver/index.mdx | 2 +- .../python/integrations/django/index.mdx | 2 +- .../python/integrations/falcon/index.mdx | 2 +- .../python/integrations/fastapi/index.mdx | 2 +- .../python/integrations/flask/index.mdx | 2 +- .../integrations/gcp-functions/index.mdx | 2 +- .../python/integrations/gql/index.mdx | 25 ++++++++++++---- .../python/integrations/graphene/index.mdx | 23 +++++++++++--- .../python/integrations/mcp/index.mdx | 24 ++++++++++++--- .../python/integrations/pymongo/index.mdx | 2 +- .../python/integrations/pyramid/index.mdx | 2 +- .../python/integrations/quart/index.mdx | 2 +- .../python/integrations/redis/index.mdx | 2 +- .../integrations/rust_tracing/index.mdx | 4 ++- .../python/integrations/sanic/index.mdx | 2 +- .../python/integrations/serverless/index.mdx | 2 +- .../python/integrations/starlette/index.mdx | 2 +- .../python/integrations/strawberry/index.mdx | 25 +++++++++++++--- .../python/integrations/tornado/index.mdx | 2 +- .../python/integrations/tryton/index.mdx | 2 +- .../python/integrations/wsgi/index.mdx | 2 +- 40 files changed, 301 insertions(+), 82 deletions(-) diff --git a/docs/platforms/python/agent-tracing/anthropic/index.mdx b/docs/platforms/python/agent-tracing/anthropic/index.mdx index 0536774383c1f..6055f79c34d59 100644 --- a/docs/platforms/python/agent-tracing/anthropic/index.mdx +++ b/docs/platforms/python/agent-tracing/anthropic/index.mdx @@ -68,7 +68,19 @@ It may take a couple of moments for the data to appear in [sentry.io](https://se - The supported function is currently `messages.create` (both sync and async). -- Sentry considers LLM inputs/outputs as PII (Personally identifiable information) and doesn't include PII data by default. If you want to include the data, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False` as shown in the [Options section](#options) below. +- Sentry considers LLM inputs/outputs as PII (Personally identifiable information) and doesn't include prompts, messages, or responses by default. Tool definitions are still attached by default; setting `inputs` to `False` in the `gen_ai` key described below removes them. To include prompts, messages, and responses, use the `gen_ai` key of the `data_collection` option, which lets you control inputs and outputs separately. When you pass a `data_collection` dictionary, both are collected by default and `include_prompts` is ignored: + + ```python + sentry_sdk.init( + # ... + data_collection={ + # Record LLM inputs, but not outputs + "gen_ai": {"inputs": True, "outputs": False}, + }, + ) + ``` + + Alternatively, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False` as shown in the [Options section](#options) below. `send_default_pii` will be removed in version 3.0 of the SDK. ## Options @@ -95,7 +107,9 @@ You can pass the following keyword arguments to `AnthropicIntegration()`: - `include_prompts`: - Whether LLM inputs and outputs should be sent to Sentry. Sentry considers this data personal identifiable data (PII) by default. If you want to include the data, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False`. + Whether LLM inputs and outputs should be sent to Sentry. If you use the `data_collection` option, this option is ignored. Use the `gen_ai` key instead. + + Sentry considers this data personal identifiable data (PII) by default. If you want to include the data, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False`. `send_default_pii` will be removed in version 3.0 of the SDK. The default is `True`. diff --git a/docs/platforms/python/agent-tracing/google-genai/index.mdx b/docs/platforms/python/agent-tracing/google-genai/index.mdx index 2a9c185c599a1..2388a3d88b000 100644 --- a/docs/platforms/python/agent-tracing/google-genai/index.mdx +++ b/docs/platforms/python/agent-tracing/google-genai/index.mdx @@ -81,7 +81,19 @@ It may take a couple of moments for the data to appear in [sentry.io](https://se - The supported function is currently `models.generate_content` (both sync and async). -- Sentry considers LLM inputs/outputs as PII (Personally identifiable information) and doesn't include PII data by default. If you want to include the data, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False` as shown in the [Options section](#options) below. +- Sentry considers LLM inputs/outputs as PII (Personally identifiable information) and doesn't include prompts, messages, or responses by default. Tool definitions and the tool calls returned by the model, including their arguments, are still attached by default; setting `inputs` and `outputs` to `False` in the `gen_ai` key described below removes them. The arguments and return values of Python functions you pass as tools are currently always attached to tool execution spans, regardless of these options. To include prompts, messages, and responses, use the `gen_ai` key of the `data_collection` option, which lets you control inputs and outputs separately. When you pass a `data_collection` dictionary, both are collected by default and `include_prompts` is ignored: + + ```python + sentry_sdk.init( + # ... + data_collection={ + # Record LLM inputs, but not outputs + "gen_ai": {"inputs": True, "outputs": False}, + }, + ) + ``` + + Alternatively, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False` as shown in the [Options section](#options) below. `send_default_pii` will be removed in version 3.0 of the SDK. ## Options @@ -108,7 +120,9 @@ You can pass the following keyword arguments to `GoogleGenAIIntegration()`: - `include_prompts`: - Whether LLM inputs and outputs should be sent to Sentry. Sentry considers this data personal identifiable data (PII) by default. If you want to include the data, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False`. + Whether LLM inputs and outputs should be sent to Sentry. If you use the `data_collection` option, this option is ignored. Use the `gen_ai` key instead. + + Sentry considers this data personal identifiable data (PII) by default. If you want to include the data, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False`. `send_default_pii` will be removed in version 3.0 of the SDK. The default is `True`. diff --git a/docs/platforms/python/agent-tracing/huggingface_hub/index.mdx b/docs/platforms/python/agent-tracing/huggingface_hub/index.mdx index 308b4522b23c8..a3d769e9fd3c6 100644 --- a/docs/platforms/python/agent-tracing/huggingface_hub/index.mdx +++ b/docs/platforms/python/agent-tracing/huggingface_hub/index.mdx @@ -100,7 +100,19 @@ It may take a couple of moments for the data to appear in [sentry.io](https://se - All exceptions are reported. -- Sentry considers LLM and tokenizer inputs/outputs as PII (Personally identifiable information) and doesn't include PII data by default. If you want to include the data, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False` as shown in the [Options section](#options) below. +- Sentry considers LLM and tokenizer inputs/outputs as PII (Personally identifiable information) and doesn't include prompts, messages, or responses by default. Tool definitions are still attached by default; setting `inputs` to `False` in the `gen_ai` key described below removes them. To include prompts, messages, and responses, use the `gen_ai` key of the `data_collection` option, which lets you control inputs and outputs separately. When you pass a `data_collection` dictionary, both are collected by default and `include_prompts` is ignored: + + ```python + sentry_sdk.init( + # ... + data_collection={ + # Record LLM inputs, but not outputs + "gen_ai": {"inputs": True, "outputs": False}, + }, + ) + ``` + + Alternatively, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False` as shown in the [Options section](#options) below. `send_default_pii` will be removed in version 3.0 of the SDK. ## Options @@ -127,7 +139,9 @@ You can pass the following keyword arguments to `HuggingfaceHubIntegration()`: - `include_prompts` - Whether LLM and tokenizer inputs and outputs should be sent to Sentry. Sentry considers this data personal identifiable data (PII) by default. If you want to include the data, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False`. + Whether LLM and tokenizer inputs and outputs should be sent to Sentry. If you use the `data_collection` option, this option is ignored. Use the `gen_ai` key instead. + + Sentry considers this data personal identifiable data (PII) by default. If you want to include the data, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False`. `send_default_pii` will be removed in version 3.0 of the SDK. The default is `True`. diff --git a/docs/platforms/python/agent-tracing/index.mdx b/docs/platforms/python/agent-tracing/index.mdx index a983557512fd9..ceddc4109355a 100644 --- a/docs/platforms/python/agent-tracing/index.mdx +++ b/docs/platforms/python/agent-tracing/index.mdx @@ -13,7 +13,7 @@ With Sentry Agent Tracing, you can ## Getting Started -Enable tracing. Supported AI libraries are instrumented automatically when their packages are installed. Prompt and response content is off by default — set `send_default_pii=True` to capture it (or configure `include_prompts` per integration). +Enable tracing. Supported AI libraries are instrumented automatically when their packages are installed. Prompt and response content is off by default — use the `gen_ai` key of the `data_collection` option to capture it. Alternatively, set `send_default_pii=True` (and configure `include_prompts` per integration). `send_default_pii` will be removed in version 3.0 of the SDK. ```python import sentry_sdk @@ -73,7 +73,21 @@ Any of `id`, `email`, or `username` is sufficient — the Conversations tab disp ### Privacy Controls -LLM inputs and outputs are treated as PII and are **off** by default. Set `send_default_pii=True` to capture them. To keep other PII on but turn AI content off, set `include_prompts=False` on the integration: +LLM inputs and outputs are treated as PII and are **off** by default. Some integrations still attach tool data, such as tool definitions, by default. See each integration page for details. To capture them, use the `gen_ai` key of the `data_collection` option, which lets you control inputs and outputs separately. When you pass a `data_collection` dictionary, both are collected by default and `include_prompts` is ignored: + +```python +import sentry_sdk + +sentry_sdk.init( + dsn="___PUBLIC_DSN___", + data_collection={ + # Record LLM inputs, but not outputs + "gen_ai": {"inputs": True, "outputs": False}, + }, +) +``` + +Alternatively, set `send_default_pii=True` to capture them. To keep other PII on but turn AI content off, set `include_prompts=False` on the integration. `send_default_pii` will be removed in version 3.0 of the SDK. ```python import sentry_sdk diff --git a/docs/platforms/python/agent-tracing/langchain/index.mdx b/docs/platforms/python/agent-tracing/langchain/index.mdx index ef0a65978bfde..3c6a3712c25f0 100644 --- a/docs/platforms/python/agent-tracing/langchain/index.mdx +++ b/docs/platforms/python/agent-tracing/langchain/index.mdx @@ -162,7 +162,19 @@ It may take a couple of moments for the data to appear in [sentry.io](https://se - All exceptions are reported. -- Sentry considers LLM and tokenizer inputs/outputs as PII (Personally identifiable information) and doesn't include PII data by default. If you want to include the data, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False` as shown in the [Options section](#options) below. +- Sentry considers LLM and tokenizer inputs/outputs as PII (Personally identifiable information) and doesn't include prompts, messages, or responses by default. Tool definitions, as well as tool calls passed in the model's invocation parameters, are still attached by default; setting `inputs` to `False` in the `gen_ai` key described below removes them. To include prompts, messages, and responses, use the `gen_ai` key of the `data_collection` option, which lets you control inputs and outputs separately. When you pass a `data_collection` dictionary, both are collected by default and `include_prompts` is ignored: + + ```python + sentry_sdk.init( + # ... + data_collection={ + # Record LLM inputs, but not outputs + "gen_ai": {"inputs": True, "outputs": False}, + }, + ) + ``` + + Alternatively, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False` as shown in the [Options section](#options) below. `send_default_pii` will be removed in version 3.0 of the SDK. ## Options @@ -189,7 +201,9 @@ You can pass the following keyword arguments to `LangchainIntegration()`: - `include_prompts` - Whether LLM and tokenizer inputs and outputs should be sent to Sentry. Sentry considers this data personal identifiable data (PII) by default. If you want to include the data, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False`. + Whether LLM and tokenizer inputs and outputs should be sent to Sentry. If you use the `data_collection` option, this option is ignored. Use the `gen_ai` key instead. + + Sentry considers this data personal identifiable data (PII) by default. If you want to include the data, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False`. `send_default_pii` will be removed in version 3.0 of the SDK. The default is `True`. diff --git a/docs/platforms/python/agent-tracing/langgraph/index.mdx b/docs/platforms/python/agent-tracing/langgraph/index.mdx index a9a2aa0f40174..b81a792565613 100644 --- a/docs/platforms/python/agent-tracing/langgraph/index.mdx +++ b/docs/platforms/python/agent-tracing/langgraph/index.mdx @@ -122,7 +122,9 @@ You can pass the following keyword arguments to `LanggraphIntegration()`: - `include_prompts` - Controls whether LLM inputs and outputs should be sent to Sentry. Sentry considers this data personal identifiable data (PII) by default. If you want to include the data, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False`. + Controls whether LLM inputs and outputs should be sent to Sentry. If you use the `data_collection` option, this option is ignored. Use the `gen_ai` key instead. + + Sentry considers this data personal identifiable data (PII) by default. If you want to include the data, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False`. `send_default_pii` will be removed in version 3.0 of the SDK. The default is `True`. diff --git a/docs/platforms/python/agent-tracing/litellm/index.mdx b/docs/platforms/python/agent-tracing/litellm/index.mdx index 3c110af96a172..53bc8ae838ea2 100644 --- a/docs/platforms/python/agent-tracing/litellm/index.mdx +++ b/docs/platforms/python/agent-tracing/litellm/index.mdx @@ -82,7 +82,19 @@ It may take a couple of moments for the data to appear in [sentry.io](https://se - The supported functions are currently `completion` and `embedding` (both sync and async). -- Sentry considers LLM inputs/outputs as PII (Personally identifiable information) and doesn't include PII data by default. If you want to include the data, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False` as shown in the [Options section](#options) below. +- Sentry considers LLM inputs/outputs as PII (Personally identifiable information) and doesn't include PII data by default. To include the data, use the `gen_ai` key of the `data_collection` option, which lets you control inputs and outputs separately. When you pass a `data_collection` dictionary, both are collected by default and `include_prompts` is ignored: + + ```python + sentry_sdk.init( + # ... + data_collection={ + # Record LLM inputs, but not outputs + "gen_ai": {"inputs": True, "outputs": False}, + }, + ) + ``` + + Alternatively, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False` as shown in the [Options section](#options) below. `send_default_pii` will be removed in version 3.0 of the SDK. ## Options @@ -109,7 +121,9 @@ You can pass the following keyword arguments to `LiteLLMIntegration()`: - `include_prompts`: - Whether LLM inputs and outputs should be sent to Sentry. Sentry considers this data personal identifiable data (PII) by default. If you want to include the data, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False`. + Whether LLM inputs and outputs should be sent to Sentry. If you use the `data_collection` option, this option is ignored. Use the `gen_ai` key instead. + + Sentry considers this data personal identifiable data (PII) by default. If you want to include the data, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False`. `send_default_pii` will be removed in version 3.0 of the SDK. The default is `True`. diff --git a/docs/platforms/python/agent-tracing/mistral/index.mdx b/docs/platforms/python/agent-tracing/mistral/index.mdx index 7f46f22e57aa4..a59c31243180c 100644 --- a/docs/platforms/python/agent-tracing/mistral/index.mdx +++ b/docs/platforms/python/agent-tracing/mistral/index.mdx @@ -87,7 +87,19 @@ It may take a couple of moments for the data to appear in [sentry.io](https://se - The supported functions are currently `Chat.complete` and `Chat.complete_async` (sync and async). Streaming completions (`stream=True`) are not instrumented. -- Sentry considers LLM inputs/outputs as PII (Personally identifiable information) and doesn't include PII data by default. If you want to include the data, set `send_default_pii=True` in the `sentry_sdk.init()` call. +- Sentry considers LLM inputs/outputs as PII (Personally identifiable information) and doesn't include PII data by default. To include the data, use the `gen_ai` key of the `data_collection` option, which lets you control inputs and outputs separately. When you pass a `data_collection` dictionary, both are collected by default: + + ```python + sentry_sdk.init( + # ... + data_collection={ + # Record LLM inputs, but not outputs + "gen_ai": {"inputs": True, "outputs": False}, + }, + ) + ``` + + Alternatively, set `send_default_pii=True` in the `sentry_sdk.init()` call. `send_default_pii` will be removed in version 3.0 of the SDK. ## Supported Versions diff --git a/docs/platforms/python/agent-tracing/openai-agents/index.mdx b/docs/platforms/python/agent-tracing/openai-agents/index.mdx index 27eee28342142..a88c64a2c0a29 100644 --- a/docs/platforms/python/agent-tracing/openai-agents/index.mdx +++ b/docs/platforms/python/agent-tracing/openai-agents/index.mdx @@ -93,7 +93,19 @@ Data on the following will be collected: - number of input and output tokens used - LLM models usage -Sentry considers LLM and tool inputs/outputs as PII and doesn't include PII data by default. If you want to include the data, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False` as shown in the [Options section](#options) below. +Sentry considers LLM and tool inputs/outputs as PII and doesn't include prompts, messages, or responses by default. Tool definitions are still attached by default; setting `inputs` to `False` in the `gen_ai` key described below removes them. To include prompts, messages, and responses, use the `gen_ai` key of the `data_collection` option, which lets you control inputs and outputs separately. When you pass a `data_collection` dictionary, both are collected by default and `include_prompts` is ignored: + +```python +sentry_sdk.init( + # ... + data_collection={ + # Record LLM and tool inputs, but not outputs + "gen_ai": {"inputs": True, "outputs": False}, + }, +) +``` + +Alternatively, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False` as shown in the [Options section](#options) below. `send_default_pii` will be removed in version 3.0 of the SDK. ## Options @@ -120,7 +132,9 @@ You can pass the following keyword arguments to `OpenAIAgentsIntegration()`: - `include_prompts`: - Whether LLM and tool inputs and outputs should be sent to Sentry. Sentry considers this data personal identifiable data (PII) by default. If you want to include the data, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False`. + Whether LLM and tool inputs and outputs should be sent to Sentry. If you use the `data_collection` option, this option is ignored. Use the `gen_ai` key instead. + + Sentry considers this data personal identifiable data (PII) by default. If you want to include the data, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False`. `send_default_pii` will be removed in version 3.0 of the SDK. The default is `True`. diff --git a/docs/platforms/python/agent-tracing/openai/index.mdx b/docs/platforms/python/agent-tracing/openai/index.mdx index 86d11124e7766..503ee0d30f9e0 100644 --- a/docs/platforms/python/agent-tracing/openai/index.mdx +++ b/docs/platforms/python/agent-tracing/openai/index.mdx @@ -79,7 +79,19 @@ It may take a couple of moments for the data to appear in [sentry.io](https://se - The supported modules are currently `responses.create`, `chat.completions.create`, and `embeddings.create`. -- Sentry considers LLM and tokenizer inputs/outputs as PII (Personally identifiable information) and doesn't include PII data by default. If you want to include the data, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False` as shown in the [Options section](#options) below. +- Sentry considers LLM and tokenizer inputs/outputs as PII (Personally identifiable information) and doesn't include prompts, messages, or responses by default. Tool definitions are still attached by default; setting `inputs` to `False` in the `gen_ai` key described below removes them. To include prompts, messages, and responses, use the `gen_ai` key of the `data_collection` option, which lets you control inputs and outputs separately. When you pass a `data_collection` dictionary, both are collected by default and `include_prompts` is ignored: + + ```python + sentry_sdk.init( + # ... + data_collection={ + # Record LLM inputs, but not outputs + "gen_ai": {"inputs": True, "outputs": False}, + }, + ) + ``` + + Alternatively, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False` as shown in the [Options section](#options) below. `send_default_pii` will be removed in version 3.0 of the SDK. ## Options @@ -107,7 +119,9 @@ You can pass the following keyword arguments to `OpenAIIntegration()`: - `include_prompts`: - Whether LLM and tokenizer inputs and outputs should be sent to Sentry. Sentry considers this data personal identifiable data (PII) by default. If you want to include the data, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False`. + Whether LLM and tokenizer inputs and outputs should be sent to Sentry. If you use the `data_collection` option, this option is ignored. Use the `gen_ai` key instead. + + Sentry considers this data personal identifiable data (PII) by default. If you want to include the data, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False`. `send_default_pii` will be removed in version 3.0 of the SDK. The default is `True`. diff --git a/docs/platforms/python/agent-tracing/pydantic-ai/index.mdx b/docs/platforms/python/agent-tracing/pydantic-ai/index.mdx index 9289f13479102..49e026d4866fb 100644 --- a/docs/platforms/python/agent-tracing/pydantic-ai/index.mdx +++ b/docs/platforms/python/agent-tracing/pydantic-ai/index.mdx @@ -211,7 +211,19 @@ Data on the following will be collected: - LLM models usage - model settings (temperature, max_tokens, etc.) -Sentry considers LLM and tool inputs/outputs as PII and doesn't include PII data by default. If you want to include the data, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False` as shown in the Options section below. +Sentry considers LLM and tool inputs/outputs as PII and doesn't include prompts, messages, or responses by default. Tool definitions are still attached by default; setting `inputs` to `False` in the `gen_ai` key described below removes them. To include prompts, messages, and responses, use the `gen_ai` key of the `data_collection` option, which lets you control inputs and outputs separately. When you pass a `data_collection` dictionary, both are collected by default and `include_prompts` is ignored: + +```python +sentry_sdk.init( + # ... + data_collection={ + # Record LLM and tool inputs, but not outputs + "gen_ai": {"inputs": True, "outputs": False}, + }, +) +``` + +Alternatively, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False` as shown in the Options section below. `send_default_pii` will be removed in version 3.0 of the SDK. ## Options @@ -238,7 +250,9 @@ You can pass the following keyword arguments to `PydanticAIIntegration()`: - `include_prompts`: - Whether LLM and tool inputs and outputs should be sent to Sentry. Sentry considers this data personal identifiable data (PII) by default. If you want to include the data, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False`. + Whether LLM and tool inputs and outputs should be sent to Sentry. If you use the `data_collection` option, this option is ignored. Use the `gen_ai` key instead. + + Sentry considers this data personal identifiable data (PII) by default. If you want to include the data, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False`. `send_default_pii` will be removed in version 3.0 of the SDK. The default is `True`. diff --git a/docs/platforms/python/configuration/options.mdx b/docs/platforms/python/configuration/options.mdx index bc0c4c535fcf9..e91b669f7f682 100644 --- a/docs/platforms/python/configuration/options.mdx +++ b/docs/platforms/python/configuration/options.mdx @@ -102,7 +102,7 @@ If this flag is enabled, [certain personally identifiable information (PII)](/pl If you enable this option, be sure to manually remove what you don't want to send using our features for managing [_Sensitive Data_](../../data-management/sensitive-data/). - We plan to eventually deprecate `send_default_pii` in favor of the [`data_collection`](#data_collection) option, but that won't happen until a future major version. Until then, `send_default_pii` remains fully supported. + `send_default_pii` will be removed in version 3.0 of the SDK. Use the [`data_collection`](#data_collection) option instead. If you set both, `send_default_pii` is ignored entirely and the SDK emits a `DeprecationWarning`. diff --git a/docs/platforms/python/data-management/data-collected.mdx b/docs/platforms/python/data-management/data-collected.mdx index 76f8e740d8072..08c5b4c716f89 100644 --- a/docs/platforms/python/data-management/data-collected.mdx +++ b/docs/platforms/python/data-management/data-collected.mdx @@ -12,7 +12,7 @@ The category types and amount of data collected vary, depending on the integrati You can control many of the categories listed here with the `data_collection` option, which lets you opt in or out of each data category individually. -The `send_default_pii` option is still fully supported. We plan to eventually deprecate it in favor of `data_collection`, but that won't happen until a future major version. +The `send_default_pii` option is still supported, but `send_default_pii` will be removed in version 3.0 of the SDK. How much data the SDK collects by default depends on which option you use. Without `data_collection` (and with `send_default_pii` unset or `False`), the SDK collects conservatively, and the defaults described on this page apply. @@ -28,8 +28,6 @@ Regardless of these options, you can always scrub any data before it's sent to S By default, the Sentry SDK sends HTTP request headers to Sentry but filters out any headers that contain sensitive data. (See the [list of headers](https://github.com/getsentry/sentry-python/blob/master/sentry_sdk/integrations/_wsgi_common.py#L28-L35) that are filtered). The Python SDK doesn't capture response headers. -To send all HTTP headers, set `send_default_pii=True` in the `sentry_sdk.init()` call. - When using `data_collection`, request headers are collected with sensitive values scrubbed. Use `http_headers` to control this: ```python @@ -50,14 +48,14 @@ sentry_sdk.init( Values whose keys match Sentry's built-in sensitive denylist (such as `auth`, `token`, or `password`) are always scrubbed, while the keys are kept. See [Key-Value Collection Behavior](#key-value-collection-behavior) below for details on `mode` and `terms`. +If you use `send_default_pii` instead, set it to `True` in the `sentry_sdk.init()` call to send all HTTP headers. + Additionally a [data scrubber](/platforms/python/data-management/sensitive-data/) removes sensitive data from headers (and a lot of other fields) right before sending data to Sentry. ## Cookies By default, the Sentry SDK doesn't send cookies. Sentry tries to remove any cookies that contain sensitive information, such as the Session ID and CSRF Token cookies in Django. -If you want to send cookies, set `send_default_pii=True` in the `sentry_sdk.init()` call. - When using `data_collection`, cookies are collected by default with sensitive values scrubbed. Opt out with `{"mode": "off"}`, or restrict which values are sent using `"allowlist"` or `"denylist"` mode: ```python @@ -71,14 +69,14 @@ sentry_sdk.init( ) ``` +If you use `send_default_pii` instead, set it to `True` in the `sentry_sdk.init()` call to send cookies. + Additionally a [data scrubber](/platforms/python/data-management/sensitive-data/) removes sensitive data from cookies (and a lot of other fields) right before sending data to Sentry. ## Information About Logged-in User By default, the Sentry SDK doesn't send any information about the logged-in user, such as email address, user ID, or username. Even if enabled, the type of logged-in user information you'll be able to send depends on the integrations you enable in Sentry's SDK. Most integrations won't send any user information. Some will only set the user ID, but there are a few that will set the user ID, username, and email address. -To start sending logged-in user information, set `send_default_pii=True` in the `sentry_sdk.init()` call. - When using `data_collection`, the SDK populates user identity fields (`user.id`, `user.email`, `user.username`) from instrumentation by default. To disable this, set `user_info` to `False`: ```python @@ -92,12 +90,12 @@ sentry_sdk.init( ) ``` +If you use `send_default_pii` instead, set it to `True` in the `sentry_sdk.init()` call to start sending logged-in user information. + ## Users' IP Address By default, the Sentry SDK doesn't send the user's IP address. Even if enabled, whether you're able to send the user's IP address or not, will depend on the integrations you enable in Sentry's SDK. Most integrations won't set the user's IP address at all. -To enable sending the user's IP address, set `send_default_pii=True` in the `sentry_sdk.init()` call. - When using `data_collection`, the user's IP address is sent by default. Disable it by setting `user_info` to `False`. Even when this is disabled, IP addresses can still reach Sentry through collected HTTP headers, cookies, or query parameters (for example, the `X-Forwarded-For` header). If you use `data_collection`, add these terms to the deny lists for those categories so their values are filtered: @@ -126,6 +124,8 @@ sentry_sdk.init( ) ``` +If you use `send_default_pii` instead, set it to `True` in the `sentry_sdk.init()` call to send the user's IP address. + ## Request URL The full request URL of outgoing and incoming HTTP requests is **always sent to Sentry**. Depending on your application, this could contain PII data. @@ -161,7 +161,7 @@ The request body of incoming HTTP requests can be sent to Sentry. Whether it's s If you want to prevent bodies from being sent to Sentry altogether, set `max_request_body_size` to `"never"`. -When using `data_collection`, incoming and outgoing request bodies are collected by default. To disable body collection, set `http_bodies` to an empty list, or provide only the body types you want: +When using `data_collection`, incoming and outgoing request bodies, as well as outgoing response bodies, are collected by default. To disable body collection, set `http_bodies` to an empty list, or provide only the body types you want: ```python import sentry_sdk @@ -175,7 +175,7 @@ sentry_sdk.init( ) ``` -The valid body types are `"incoming_request"` and `"outgoing_request"`. The Python SDK doesn't capture response bodies, so there are no response body types. +The valid body types are `"incoming_request"`, `"outgoing_request"`, and `"outgoing_response"`. Currently, only the Ariadne and Strawberry integrations use `"outgoing_response"`, to attach the GraphQL response to error events. The Python SDK doesn't capture incoming response bodies. `max_request_body_size` still applies on top of `http_bodies`. @@ -272,9 +272,7 @@ Without `data_collection` (and with `send_default_pii` unset or `False`), this d ## LLM Inputs And Responses -When using Sentry in your AI apps, the SDK by default won't add data like LLM inputs and responses to spans. To start recording these, add `send_default_pii=True` to your `sentry_sdk.init()` call. - -Most AI integrations have an additional parameter to control whether prompts should be included called `include_prompts`. See the documentation for the specific AI framework for more information. +When using Sentry in your AI apps, the SDK by default won't add LLM prompts, messages, or responses to spans. Some integrations still attach tool data by default, such as tool definitions and MCP tool arguments. See the documentation for the specific AI framework for details on what's attached and how to remove it. When using `data_collection`, the `gen_ai` category records both inputs and outputs unless you opt out. Metadata like the model ID and token counts is always collected. @@ -291,6 +289,8 @@ sentry_sdk.init( `gen_ai` supersedes the per-integration `include_prompts` parameter. When `data_collection` is set, `gen_ai` determines whether prompt content is recorded, regardless of what an individual integration's `include_prompts` is set to. +If you use `send_default_pii` instead, add `send_default_pii=True` to your `sentry_sdk.init()` call to start recording LLM inputs and responses. Most AI integrations have an additional parameter to control whether prompts should be included called `include_prompts`. See the documentation for the specific AI framework for more information. + ## `data_collection` Reference ### Keys @@ -300,7 +300,7 @@ sentry_sdk.init( | `user_info` | `bool` | `True` | Populate `user.*` fields (`id`, `email`, `username`, `ip_address`) from instrumentation. | | `cookies` | key-value behavior | `{"mode": "denylist"}` | Collect cookies. | | `http_headers` | `{"request": key-value behavior}` | `{"request": {"mode": "denylist"}}` | Collect HTTP request headers. The Python SDK currently doesn't capture response headers. | -| `http_bodies` | `list[str]` | `["incoming_request", "outgoing_request"]` | Body types to collect. Set to `[]` to disable. The Python SDK currently doesn't capture response bodies. | +| `http_bodies` | `list[str]` | `["incoming_request", "outgoing_request", "outgoing_response"]` | Body types to collect. Set to `[]` to disable. The Python SDK currently doesn't capture incoming response bodies. | | `url_query_params` | key-value behavior | `{"mode": "denylist"}` | Collect URL query parameters. | | `graphql` | `{"document": bool, "variables": bool}` | both `True` | Collect the GraphQL query document and its variables. | | `gen_ai` | `{"inputs": bool, "outputs": bool}` | both `True` | Collect generative AI input and output content. Metadata such as the model ID and token counts is always collected. | diff --git a/docs/platforms/python/data-management/sensitive-data/index.mdx b/docs/platforms/python/data-management/sensitive-data/index.mdx index e12b491821416..ed92f8e4d661f 100644 --- a/docs/platforms/python/data-management/sensitive-data/index.mdx +++ b/docs/platforms/python/data-management/sensitive-data/index.mdx @@ -33,7 +33,7 @@ Ensure that your team is aware of your company's policy around what can and cann The SDK can be configured to collect or ignore specific data using the [`data_collection`](../../configuration/options/#data_collection) option. -Alternately, you can use the simpler [`send_default_pii`](../../configuration/options/#send_default_pii) option by setting it to `True` or `False`. Note that this option will be phased out in favor of the more fine-grained [`data_collection`](../../configuration/options/#data_collection). +Alternately, you can use the simpler [`send_default_pii`](../../configuration/options/#send_default_pii) option by setting it to `True` or `False`. Note that `send_default_pii` will be removed in version 3.0 of the SDK in favor of the more fine-grained [`data_collection`](../../configuration/options/#data_collection). If you _do not_ wish to use the default PII behavior, you can also choose to identify users in a more controlled manner, using our [user identity context](../../enriching-events/identify-user/). diff --git a/docs/platforms/python/integrations/ariadne/index.mdx b/docs/platforms/python/integrations/ariadne/index.mdx index 25c8f37b42b7b..7f082a1e4c9be 100644 --- a/docs/platforms/python/integrations/ariadne/index.mdx +++ b/docs/platforms/python/integrations/ariadne/index.mdx @@ -78,12 +78,27 @@ This will create a corresponding `GraphQLError` in the Issues section of ## Options The Ariadne integration can capture request and response payload for each GraphQL -error that happens. Since these may contain sensitive data, the SDK needs to be -initialized with the -[send_default_pii](/platforms/python/configuration/options/#send-default-pii) -option set to `True`. +error that happens. Since these may contain sensitive data, no request and response +data will be attached by default. -By default, no request and response data will be attached. +To attach this data, use the `data_collection` option. The `graphql` key controls the query document and its variables in the request +payload, and the `outgoing_response` entry in `http_bodies` controls the response +payload: + +```python +sentry_sdk.init( + # same options as above + data_collection={ + "graphql": {"document": True, "variables": True}, + "http_bodies": ["incoming_request", "outgoing_request", "outgoing_response"], + }, +) +``` + +These are also the defaults when you pass a `data_collection` dictionary, so you only +need to set the keys you want to change. See Data Collected for all available keys. + +Alternatively, you can initialize the SDK with the `send_default_pii` option set to `True`, though `send_default_pii` will be removed in version 3.0 of the SDK: ```python sentry_sdk.init( @@ -96,7 +111,8 @@ sentry_sdk.init( Since `send_default_pii` is a global SDK option, setting it to `True` will affect all integrations, not just Ariadne. Please make sure to [scrub sensitive data](/platforms/python/data-management/sensitive-data/) -from events before enabling this option. +from events before enabling this option. With `data_collection`, you can enable +only the categories you need instead. diff --git a/docs/platforms/python/integrations/asgi/index.mdx b/docs/platforms/python/integrations/asgi/index.mdx index 22e2bebd6016b..fe24fa8309768 100644 --- a/docs/platforms/python/integrations/asgi/index.mdx +++ b/docs/platforms/python/integrations/asgi/index.mdx @@ -102,7 +102,7 @@ Additionally, a transaction will show up in the "Performance" section on [sentry ## Behavior -- Request data is attached to all events: **HTTP method, URL, headers**. Sentry excludes raw bodies and multipart file uploads. Sentry also excludes personally identifiable information (such as user ids, usernames, cookies, authorization headers, IP addresses) unless you set `send_default_pii` to `True`. +- Request data is attached to all events: **HTTP method, URL, headers**. Sentry excludes raw bodies and multipart file uploads. Sentry also excludes personally identifiable information (such as user ids, usernames, cookies, authorization headers, IP addresses) unless you configure which categories to collect with the `data_collection` option or set `send_default_pii` to `True`. `send_default_pii` will be removed in version 3.0 of the SDK. - Each request has a separate scope. Changes to the scope within a view, for example setting a tag, will only apply to events sent as part of the request being handled. diff --git a/docs/platforms/python/integrations/aws-lambda/manual-instrumentation/index.mdx b/docs/platforms/python/integrations/aws-lambda/manual-instrumentation/index.mdx index 4675d89591cbb..29f84778ebcbb 100644 --- a/docs/platforms/python/integrations/aws-lambda/manual-instrumentation/index.mdx +++ b/docs/platforms/python/integrations/aws-lambda/manual-instrumentation/index.mdx @@ -95,7 +95,7 @@ With the AWS Lambda integration enabled, the Python SDK will: You can add more data as described here. -- Request data including **HTTP method, URL, headers, form data, and JSON payloads** will be attached to all events. Sentry excludes raw bodies and multipart file uploads. Sentry also excludes personally identifiable information such as user ids, usernames, cookies, authorization headers, and IP addresses (unless you set `send_default_pii` to `True`). +- Request data including **HTTP method, URL, headers, form data, and JSON payloads** will be attached to all events. Sentry excludes raw bodies and multipart file uploads. Sentry also excludes personally identifiable information such as user ids, usernames, cookies, authorization headers, and IP addresses, unless you configure which categories to collect with the `data_collection` option or set `send_default_pii` to `True`. `send_default_pii` will be removed in version 3.0 of the SDK. - Each request has a separate scope. Changes to the scope within a view, for example setting a tag, will only apply to events sent as part of the request being handled. diff --git a/docs/platforms/python/integrations/bottle/index.mdx b/docs/platforms/python/integrations/bottle/index.mdx index 2ee76609557e0..78e85a4331b9c 100644 --- a/docs/platforms/python/integrations/bottle/index.mdx +++ b/docs/platforms/python/integrations/bottle/index.mdx @@ -54,7 +54,7 @@ It takes a couple of moments for the data to appear in [sentry.io](https://sentr - All exceptions leading to an Internal Server Error are reported. -- Request data is attached to all events: **HTTP method, URL, headers, form data, JSON payloads**. Sentry excludes raw bodies and multipart file uploads. Sentry also excludes personally identifiable information (such as user ids, usernames, cookies, authorization headers, IP addresses) unless you set `send_default_pii` to `True`. +- Request data is attached to all events: **HTTP method, URL, headers, form data, JSON payloads**. Sentry excludes raw bodies and multipart file uploads. Sentry also excludes personally identifiable information (such as user ids, usernames, cookies, authorization headers, IP addresses) unless you configure which categories to collect with the `data_collection` option or set `send_default_pii` to `True`. `send_default_pii` will be removed in version 3.0 of the SDK. - Each request has a separate scope. Changes to the scope within a view, for example setting a tag, will only apply to events sent as part of the request being handled. diff --git a/docs/platforms/python/integrations/chalice/index.mdx b/docs/platforms/python/integrations/chalice/index.mdx index 8b54681be4d30..00367578f4898 100644 --- a/docs/platforms/python/integrations/chalice/index.mdx +++ b/docs/platforms/python/integrations/chalice/index.mdx @@ -43,7 +43,7 @@ When you enter the `"/"` route or the scheduled task is run, an error event will ## Behavior -- Request data is attached to all events: HTTP method, URL, headers, form data, JSON payloads. Sentry excludes raw bodies and multipart file uploads. Sentry also excludes personally identifiable information (such as user ids, usernames, cookies, authorization headers, IP addresses) unless you set send_default_pii to True. +- Request data is attached to all events: HTTP method, URL, headers, form data, JSON payloads. Sentry excludes raw bodies and multipart file uploads. Sentry also excludes personally identifiable information (such as user ids, usernames, cookies, authorization headers, IP addresses) unless you configure which categories to collect with the `data_collection` option or set `send_default_pii` to `True`. `send_default_pii` will be removed in version 3.0 of the SDK. - Each request has a separate scope. Changes to the scope within a view, for example setting a tag, will only apply to events sent as part of the request being handled. diff --git a/docs/platforms/python/integrations/clickhouse-driver/index.mdx b/docs/platforms/python/integrations/clickhouse-driver/index.mdx index cecfb707cf04d..a4b518f2315c7 100644 --- a/docs/platforms/python/integrations/clickhouse-driver/index.mdx +++ b/docs/platforms/python/integrations/clickhouse-driver/index.mdx @@ -27,7 +27,7 @@ If you have the `clickhouse-driver` package in your dependencies, the clickhouse -By default, the parameters of the query are not retrieved. To see the query parameters in Sentry, enable `send_default_pii`. See Basic Options for details. +By default, the parameters of the query are not retrieved. To see the query parameters in Sentry, enable `database_query_data` in the `data_collection` option, or enable `send_default_pii`. `send_default_pii` will be removed in version 3.0 of the SDK. ## Verify diff --git a/docs/platforms/python/integrations/django/index.mdx b/docs/platforms/python/integrations/django/index.mdx index 574b1ad3771d3..3178c7e40cb4b 100644 --- a/docs/platforms/python/integrations/django/index.mdx +++ b/docs/platforms/python/integrations/django/index.mdx @@ -76,7 +76,7 @@ To further customize your setup, review the [Options section](#options) below. Sentry automatically captures errors and reports issues for you. You can also expect the following for your Django project: -- If you use `django.contrib.auth`, and you've set `send_default_pii=True` in your call to `init`, user data (such as current user ID, email address, username) will be attached to error events. +- If you use `django.contrib.auth`, and you've either enabled `user_info` in the `data_collection` option or set `send_default_pii=True` in your call to `init`, user data (such as current user ID, email address, username) will be attached to error events. `send_default_pii` will be removed in version 3.0 of the SDK. - Request data will be attached to all events: **HTTP method, URL, headers, form data, JSON payloads**. Sentry excludes raw bodies and multipart file uploads. - Logs emitted by any logger will be recorded as breadcrumbs by the [Logging](/platforms/python/integrations/logging/) integration (this integration is enabled by default). diff --git a/docs/platforms/python/integrations/falcon/index.mdx b/docs/platforms/python/integrations/falcon/index.mdx index cf55207a13aeb..ad966bb3badcc 100644 --- a/docs/platforms/python/integrations/falcon/index.mdx +++ b/docs/platforms/python/integrations/falcon/index.mdx @@ -57,7 +57,7 @@ It takes a couple of moments for the data to appear in [sentry.io](https://sentr - All exceptions leading to an Internal Server Error are reported. -- Request data is attached to all events: **HTTP method, URL, headers, form data, JSON payloads**. Sentry excludes raw bodies and multipart file uploads. Sentry also excludes personally identifiable information (such as user ids, usernames, cookies, authorization headers, IP addresses) unless you set `send_default_pii` to `True`. +- Request data is attached to all events: **HTTP method, URL, headers, form data, JSON payloads**. Sentry excludes raw bodies and multipart file uploads. Sentry also excludes personally identifiable information (such as user ids, usernames, cookies, authorization headers, IP addresses) unless you configure which categories to collect with the `data_collection` option or set `send_default_pii` to `True`. `send_default_pii` will be removed in version 3.0 of the SDK. - Each request has a separate scope. Changes to the scope within a view, for example setting a tag, will only apply to events sent as part of the request being handled. diff --git a/docs/platforms/python/integrations/fastapi/index.mdx b/docs/platforms/python/integrations/fastapi/index.mdx index 7b7752cdcec82..1d930ba2d3021 100644 --- a/docs/platforms/python/integrations/fastapi/index.mdx +++ b/docs/platforms/python/integrations/fastapi/index.mdx @@ -59,7 +59,7 @@ You can also expect the following for your FastAPI project: - By default, all exceptions leading to an Internal Server Error are captured and reported. The HTTP status codes to report on are configurable via the `failed_request_status_codes` [option](#options). - Request data will be attached to all events: HTTP method, URL, headers, form data, JSON payloads. Sentry excludes raw bodies and multipart file uploads. -- Sentry also excludes personally identifiable information (such as user ids, usernames, cookies, authorization headers, IP addresses) unless you set `send_default_pii` to `True`. +- Sentry also excludes personally identifiable information (such as user ids, usernames, cookies, authorization headers, IP addresses) unless you configure which categories to collect with the `data_collection` option or set `send_default_pii` to `True`. `send_default_pii` will be removed in version 3.0 of the SDK. To learn how to manually report issues, see Capturing Errors. diff --git a/docs/platforms/python/integrations/flask/index.mdx b/docs/platforms/python/integrations/flask/index.mdx index 970c6ccd891a7..475392cd9660a 100644 --- a/docs/platforms/python/integrations/flask/index.mdx +++ b/docs/platforms/python/integrations/flask/index.mdx @@ -59,7 +59,7 @@ To further customize your setup, review the [Options section](#options) below. Sentry automatically captures errors and reports issues for you. You can also expect the following for your Flask app: -- If you use `flask-login`, and you've set `send_default_pii=True` in your call to `init`, user data (such as current user ID, email address, username) will be attached to error events. +- If you use `flask-login`, and you've either enabled `user_info` in the `data_collection` option or set `send_default_pii=True` in your call to `init`, user data (such as current user ID, email address, username) will be attached to error events. `send_default_pii` will be removed in version 3.0 of the SDK. - Request data will be attached to all events: HTTP method, URL, headers, form data, JSON payloads. Sentry excludes raw bodies and multipart file uploads. - Logs emitted by any `app.logger` or _any_ logger will be recorded by the [Logging](/platforms/python/integrations/logging/) integration (this integration is enabled by default). diff --git a/docs/platforms/python/integrations/gcp-functions/index.mdx b/docs/platforms/python/integrations/gcp-functions/index.mdx index 9b35ef21b0ec1..7e8bac32768a5 100644 --- a/docs/platforms/python/integrations/gcp-functions/index.mdx +++ b/docs/platforms/python/integrations/gcp-functions/index.mdx @@ -105,6 +105,6 @@ With the Google Cloud Functions integration enabled, the Python SDK will: - Function configured time (in seconds) - You can add more data as described here -- Request data is attached to all events: **HTTP method, URL, headers, form data, JSON payloads**. Sentry excludes raw bodies and multipart file uploads. Sentry also excludes personally identifiable information (such as user ids, usernames, cookies, authorization headers, IP addresses) unless you set `send_default_pii` to `True`. +- Request data is attached to all events: **HTTP method, URL, headers, form data, JSON payloads**. Sentry excludes raw bodies and multipart file uploads. Sentry also excludes personally identifiable information (such as user ids, usernames, cookies, authorization headers, IP addresses) unless you configure which categories to collect with the `data_collection` option or set `send_default_pii` to `True`. `send_default_pii` will be removed in version 3.0 of the SDK. - Each request has a separate scope. Changes to the scope within a view, for example setting a tag, will only apply to events sent as part of the request being handled. diff --git a/docs/platforms/python/integrations/gql/index.mdx b/docs/platforms/python/integrations/gql/index.mdx index 83dabd42c16e2..fa6be7b4b4834 100644 --- a/docs/platforms/python/integrations/gql/index.mdx +++ b/docs/platforms/python/integrations/gql/index.mdx @@ -28,17 +28,24 @@ If you have the `gql` package in your dependencies, the GQL integration will be ## Data Privacy and the GQL Integration -To ensure data privacy, the SDK avoids sending any information that may potentially contain personally identifiable information (PII) by default. See the docs for the [`send_default_pii` flag](/platforms/python/configuration/options/#send-default-pii) for more information. +To ensure data privacy, the SDK avoids sending any information that may potentially contain personally identifiable information (PII) by default. See the docs for the `data_collection` and `send_default_pii` options for more information. -For the GQL integration, this policy means that the SDK **doesn't send** the GraphQL queries and the `errors` information that the GraphQL server returns, unless you override the default configuration via the `send_default_pii` flag. +For the GQL integration, this policy means that the SDK **doesn't send** the GraphQL queries and the `errors` information that the GraphQL server returns, unless you override the default configuration. - +To have Sentry record the GraphQL queries and the `errors` information returned by the GraphQL server, enable the `graphql` key of the `data_collection` option in your SDK init. The `document` key controls the queries and the `errors` information, and the `variables` key controls the query variables: -Before enabling the `send_default_pii` flag, ensure you've configured Sentry's [sensitive data scrubbing](/platforms/python/data-management/sensitive-data/) tools to scrub all PII. +```python +sentry_sdk.init( + # ... + data_collection={ + "graphql": {"document": True, "variables": True}, + }, +) +``` - +These are also the defaults when you pass a `data_collection` dictionary. See Data Collected for all available keys. -To have Sentry record the GraphQL queries and the `errors` information returned by the GraphQL server, add the following to your SDK init: +Alternatively, you can set `send_default_pii` to `True`, though `send_default_pii` will be removed in version 3.0 of the SDK: ```python sentry_sdk.init( @@ -48,3 +55,9 @@ sentry_sdk.init( send_default_pii=True, ) ``` + + + +Before enabling the `send_default_pii` flag, ensure you've configured Sentry's [sensitive data scrubbing](/platforms/python/data-management/sensitive-data/) tools to scrub all PII. Since `send_default_pii` affects all integrations, consider using `data_collection` to enable only the categories you need instead. + + diff --git a/docs/platforms/python/integrations/graphene/index.mdx b/docs/platforms/python/integrations/graphene/index.mdx index 31a27b69e7acd..02ba4011bd6c4 100644 --- a/docs/platforms/python/integrations/graphene/index.mdx +++ b/docs/platforms/python/integrations/graphene/index.mdx @@ -62,10 +62,24 @@ by default. To capture request bodies: -- Initialize the SDK with the - [send_default_pii](/platforms/python/configuration/options/#send-default-pii) - option set to `True`. - Make sure the integration for the web framework you're using is enabled. +- Initialize the SDK with the `data_collection` option. The `graphql` key's `document` setting controls whether the GraphQL + request body is attached. If you set `http_bodies`, it must include + `incoming_request` so that your web framework integration captures the body + in the first place. + +```python +sentry_sdk.init( + # same options as above + data_collection={ + "graphql": {"document": True}, + }, +) +``` + +Both are enabled by default when you pass a `data_collection` dictionary. See Data Collected for all available keys. + +Alternatively, you can initialize the SDK with the `send_default_pii` option set to `True`, though `send_default_pii` will be removed in version 3.0 of the SDK: ```python sentry_sdk.init( @@ -81,7 +95,8 @@ sentry_sdk.init( Since `send_default_pii` is a global SDK option, setting it to `True` affects all integrations, not just Graphene. Please make sure to take care of [scrubbing sensitive data](/platforms/python/data-management/sensitive-data/) -from events before enabling this option. +from events before enabling this option. With `data_collection`, you can enable +only the categories you need instead. diff --git a/docs/platforms/python/integrations/mcp/index.mdx b/docs/platforms/python/integrations/mcp/index.mdx index 9c979a418cc82..93b0f29967afc 100644 --- a/docs/platforms/python/integrations/mcp/index.mdx +++ b/docs/platforms/python/integrations/mcp/index.mdx @@ -193,7 +193,21 @@ Data on the following will be collected: - **Request context**: Request IDs, session IDs, and transport types (stdio/HTTP) - **Execution spans**: Timing information for all handler invocations -Sentry considers tool inputs/outputs and prompt content as PII and doesn't include PII data by default. If you want to include the data, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude this data despite `send_default_pii=True`, configure the integration with `include_prompts=False` as shown in the [Options section](#options) below. +Sentry considers tool inputs/outputs and prompt content as PII. By default, it doesn't include tool results or prompt content, but tool and prompt arguments (`mcp.request.argument.*`) are still attached; setting `inputs` to `False` in the `gen_ai` key described below removes them. To include tool results and prompt content, use the `gen_ai` key of the `data_collection` option, which lets you control inputs and outputs separately. When you pass a `data_collection` dictionary, both are collected by default, and `include_prompts` is ignored: + +```python +sentry_sdk.init( + # ... + data_collection={ + # Collect tool and prompt inputs, but not outputs + "gen_ai": {"inputs": True, "outputs": False}, + }, +) +``` + +Setting `inputs` to `False` removes the `mcp.request.argument.*` attributes from spans, and setting `outputs` to `False` removes tool results and prompt message content. + +Alternatively, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude this data despite `send_default_pii=True`, configure the integration with `include_prompts=False` as shown in the [Options section](#options) below. `send_default_pii` will be removed in version 3.0 of the SDK. ### Captured Span Data @@ -208,7 +222,7 @@ For each operation, the following span data attributes are captured: **Tools:** - `mcp.tool.name`: The name of the tool being executed - `mcp.request.argument.*`: Tool input arguments -- `mcp.tool.result.content`: Tool output (when `send_default_pii=True`) +- `mcp.tool.result.content`: Tool output (when `gen_ai.outputs` is enabled in `data_collection`, or when `send_default_pii=True`) - `mcp.tool.result.is_error`: Whether the tool execution resulted in an error **Prompts:** @@ -216,7 +230,7 @@ For each operation, the following span data attributes are captured: - `mcp.request.argument.*`: Prompt input arguments - `mcp.prompt.result.message.count`: Number of messages in the prompt result - `mcp.prompt.result.message.role`: Role of the message (for single-message prompts) -- `mcp.prompt.result.message.content`: Message content (for single-message prompts, when `send_default_pii=True`) +- `mcp.prompt.result.message.content`: Message content (for single-message prompts, when `gen_ai.outputs` is enabled in `data_collection`, or when `send_default_pii=True`) **Resources:** - `mcp.resource.uri`: The URI of the resource being accessed @@ -247,7 +261,9 @@ You can pass the following keyword arguments to `MCPIntegration()`: - `include_prompts`: - Whether tool inputs/outputs and prompt content should be sent to Sentry. Sentry considers this data personal identifiable data (PII) by default. If you want to include the data, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False`. + Whether tool inputs/outputs and prompt content should be sent to Sentry. If you use the `data_collection` option, this option is ignored. Use the `gen_ai` key instead. + + Sentry considers this data personal identifiable data (PII) by default. If you want to include the data, set `send_default_pii=True` in the `sentry_sdk.init()` call. To explicitly exclude prompts and outputs despite `send_default_pii=True`, configure the integration with `include_prompts=False`. `send_default_pii` will be removed in version 3.0 of the SDK. The default is `True`. diff --git a/docs/platforms/python/integrations/pymongo/index.mdx b/docs/platforms/python/integrations/pymongo/index.mdx index 6eb54dff069c4..aea9b73f03d7e 100644 --- a/docs/platforms/python/integrations/pymongo/index.mdx +++ b/docs/platforms/python/integrations/pymongo/index.mdx @@ -58,7 +58,7 @@ The following information about your MongoDB queries will be available to you on - Performance traces for all MongoDB queries - Breadcrumbs for all MongoDB queries -- Personal identifiable information (PII) will be stripped from all MongoDB queries if `send_default_pii` is disabled in the SDK. (This was tested for PyMongo 4.2 and below, but "should" also be future proof) +- Personal identifiable information (PII) will be stripped from all MongoDB queries unless you enable `database_query_data` in the `data_collection` option or set `send_default_pii` to `True`. (This was tested for PyMongo 4.2 and below, but "should" also be future proof) `send_default_pii` will be removed in version 3.0 of the SDK. ### Other MongoDB libraries diff --git a/docs/platforms/python/integrations/pyramid/index.mdx b/docs/platforms/python/integrations/pyramid/index.mdx index 5f6b80953790b..033d0619abf85 100644 --- a/docs/platforms/python/integrations/pyramid/index.mdx +++ b/docs/platforms/python/integrations/pyramid/index.mdx @@ -60,7 +60,7 @@ When you point your browser to [http://localhost:6543/](http://localhost:6543/) - exceptions that are not handled by any exception view - exceptions whose exception view returns a status code of 500 -- Request data is attached to all events: **HTTP method, URL, headers, form data, JSON payloads**. Sentry excludes raw bodies and multipart file uploads. Sentry also excludes personally identifiable information (such as user ids, usernames, cookies, authorization headers, IP addresses) unless you set `send_default_pii` to `True`. +- Request data is attached to all events: **HTTP method, URL, headers, form data, JSON payloads**. Sentry excludes raw bodies and multipart file uploads. Sentry also excludes personally identifiable information (such as user ids, usernames, cookies, authorization headers, IP addresses) unless you configure which categories to collect with the `data_collection` option or set `send_default_pii` to `True`. `send_default_pii` will be removed in version 3.0 of the SDK. - Each request has a separate scope. Changes to the scope within a view, for example setting a tag, will only apply to events sent as part of the request being handled. diff --git a/docs/platforms/python/integrations/quart/index.mdx b/docs/platforms/python/integrations/quart/index.mdx index 7945c3a2773d6..0aaa51f3915c9 100644 --- a/docs/platforms/python/integrations/quart/index.mdx +++ b/docs/platforms/python/integrations/quart/index.mdx @@ -52,7 +52,7 @@ It takes a couple of moments for the data to appear in [sentry.io](https://sentr - All exceptions leading to an Internal Server Error, from before/after serving functions, and background tasks are reported. -- Request data is attached to all events: **HTTP method, URL, headers**. Sentry also excludes personally identifiable information (such as user IDs, usernames, cookies, authorization headers, IP addresses) unless you set `send_default_pii` to `True`. +- Request data is attached to all events: **HTTP method, URL, headers**. Sentry also excludes personally identifiable information (such as user IDs, usernames, cookies, authorization headers, IP addresses) unless you configure which categories to collect with the `data_collection` option or set `send_default_pii` to `True`. `send_default_pii` will be removed in version 3.0 of the SDK. - Each request has a separate scope. Changes to the scope within a view, for example setting a tag, will only apply to events sent as part of the request being handled. diff --git a/docs/platforms/python/integrations/redis/index.mdx b/docs/platforms/python/integrations/redis/index.mdx index 85548a6199279..370de83b72bb3 100644 --- a/docs/platforms/python/integrations/redis/index.mdx +++ b/docs/platforms/python/integrations/redis/index.mdx @@ -27,7 +27,7 @@ The following information will be available to you on Sentry: - Performance information about requests to Redis will be available in the waterfall diagram in the [Traces](https://sentry.io/orgredirect/organizations/:orgslug/explore/traces/) section on Sentry. - Redis commands will be added as [breadcrumbs](/product/issues/issue-details/breadcrumbs/). -- If `send_default_pii` is set to `True` in your app's `sentry_sdk.init()` call, you will also see the data used in your Redis commands. +- If you enable `database_query_data` in the `data_collection` option, or set `send_default_pii` to `True` in your app's `sentry_sdk.init()` call, you will also see the data used in your Redis commands. `send_default_pii` will be removed in version 3.0 of the SDK. - Sentry will never collect data of the `AUTH` command. ## Verify Your Setup diff --git a/docs/platforms/python/integrations/rust_tracing/index.mdx b/docs/platforms/python/integrations/rust_tracing/index.mdx index 6bbbadc783af4..54a8215671885 100644 --- a/docs/platforms/python/integrations/rust_tracing/index.mdx +++ b/docs/platforms/python/integrations/rust_tracing/index.mdx @@ -187,7 +187,9 @@ The `pyo3-python-tracing-subscriber` crate has [a working example of a Sentry in A boolean controlling whether the values of a `tracing` span's key-value fields will be attached to the corresponding Sentry span. - If it is `None`, this behavior will be controlled by the `send_default_pii` option set during SDK initialization. If it is `False`, field values will be redacted on Sentry spans. If it is `True`, field values will be included on Sentry spans. + The `data_collection` option doesn't affect this behavior. If you use `data_collection` and want field values on your spans, set `include_tracing_fields` to `True` explicitly. + + If it is `None`, this behavior will be controlled by the `send_default_pii` option set during SDK initialization. If it is `False`, field values will be redacted on Sentry spans. If it is `True`, field values will be included on Sentry spans. `send_default_pii` will be removed in version 3.0 of the SDK. The default value of this option is `None`. diff --git a/docs/platforms/python/integrations/sanic/index.mdx b/docs/platforms/python/integrations/sanic/index.mdx index 544edd9cf7c14..2acd08a72f01a 100644 --- a/docs/platforms/python/integrations/sanic/index.mdx +++ b/docs/platforms/python/integrations/sanic/index.mdx @@ -123,7 +123,7 @@ When you point your browser to [http://localhost:8000/](http://localhost:8000/) - All exceptions leading to an Internal Server Error are reported. -- Request data is attached to all events: **HTTP method, URL, headers, form data, JSON payloads**. Sentry excludes raw bodies and multipart file uploads. Sentry also excludes personally identifiable information (such as user ids, usernames, cookies, authorization headers, IP addresses) unless you set `send_default_pii` to `True`. +- Request data is attached to all events: **HTTP method, URL, headers, form data, JSON payloads**. Sentry excludes raw bodies and multipart file uploads. Sentry also excludes personally identifiable information (such as user ids, usernames, cookies, authorization headers, IP addresses) unless you configure which categories to collect with the `data_collection` option or set `send_default_pii` to `True`. `send_default_pii` will be removed in version 3.0 of the SDK. - Each request has a separate scope. Changes to the scope within a view, for example setting a tag, will only apply to events sent as part of the request being handled. diff --git a/docs/platforms/python/integrations/serverless/index.mdx b/docs/platforms/python/integrations/serverless/index.mdx index 08dd0a45cc6b6..cf66d149d5a79 100644 --- a/docs/platforms/python/integrations/serverless/index.mdx +++ b/docs/platforms/python/integrations/serverless/index.mdx @@ -89,7 +89,7 @@ Now deploy your function. When you now run your function an error event will be - You can add more context as described here. -- Request data is attached to all events: **HTTP method, URL, headers, form data, JSON payloads**. Sentry excludes raw bodies and multipart file uploads. Sentry also excludes personally identifiable information (such as user ids, usernames, cookies, authorization headers, IP addresses) unless you set `send_default_pii` to `True`. +- Request data is attached to all events: **HTTP method, URL, headers, form data, JSON payloads**. Sentry excludes raw bodies and multipart file uploads. Sentry also excludes personally identifiable information (such as user ids, usernames, cookies, authorization headers, IP addresses) unless you configure which categories to collect with the `data_collection` option or set `send_default_pii` to `True`. `send_default_pii` will be removed in version 3.0 of the SDK. - Each request has a separate scope. Changes to the scope within a view, for example setting a tag, will only apply to events sent as part of the request being handled. diff --git a/docs/platforms/python/integrations/starlette/index.mdx b/docs/platforms/python/integrations/starlette/index.mdx index f48f8c2937c43..7c76cf26af4c4 100644 --- a/docs/platforms/python/integrations/starlette/index.mdx +++ b/docs/platforms/python/integrations/starlette/index.mdx @@ -58,7 +58,7 @@ You can also expect the following for your Starlette project: - By default, all exceptions leading to an Internal Server Error are reported. The HTTP status codes to report on are configurable via the `failed_request_status_codes` [option](#options). - Request data will be attached to all events: HTTP method, URL, headers, form data, JSON payloads. Sentry excludes raw bodies and multipart file uploads. -- Sentry also excludes personally identifiable information (such as user ids, usernames, cookies, authorization headers, IP addresses) unless you set `send_default_pii` to `True`. +- Sentry also excludes personally identifiable information (such as user ids, usernames, cookies, authorization headers, IP addresses) unless you configure which categories to collect with the `data_collection` option or set `send_default_pii` to `True`. `send_default_pii` will be removed in version 3.0 of the SDK. To learn how to manually report issues, see Capturing Errors. diff --git a/docs/platforms/python/integrations/strawberry/index.mdx b/docs/platforms/python/integrations/strawberry/index.mdx index c808028f585af..36597eecf0b22 100644 --- a/docs/platforms/python/integrations/strawberry/index.mdx +++ b/docs/platforms/python/integrations/strawberry/index.mdx @@ -139,9 +139,25 @@ sentry_sdk.init( The Strawberry integration can capture request and response bodies for each GraphQL error that happens. Since these may contain sensitive data, -this is the default behavior. To enable capturing request and response bodies, the -SDK needs to be initialized with the -[send_default_pii](/platforms/python/configuration/options/#send-default-pii) option set to `True`. +this isn't the default behavior. + +To enable capturing request and response bodies, use the `data_collection` option. The `graphql` key controls the query document and its variables in the request +body, and the `outgoing_response` entry in `http_bodies` controls the response body: + +```python +sentry_sdk.init( + # ... + data_collection={ + "graphql": {"document": True, "variables": True}, + "http_bodies": ["incoming_request", "outgoing_request", "outgoing_response"], + }, +) +``` + +These are also the defaults when you pass a `data_collection` dictionary, so you only +need to set the keys you want to change. See Data Collected for all available keys. + +Alternatively, you can initialize the SDK with the `send_default_pii` option set to `True`, though `send_default_pii` will be removed in version 3.0 of the SDK: ```python sentry_sdk.init( @@ -155,7 +171,8 @@ sentry_sdk.init( Since `send_default_pii` is a global SDK option, setting it to `True` will affect all integrations, not just Strawberry. Please make sure to [remove sensitive data](/platforms/python/data-management/sensitive-data/) -from events before enabling this option. +from events before enabling this option. With `data_collection`, you can enable +only the categories you need instead. diff --git a/docs/platforms/python/integrations/tornado/index.mdx b/docs/platforms/python/integrations/tornado/index.mdx index 1ee3aabbd161e..452849a127145 100644 --- a/docs/platforms/python/integrations/tornado/index.mdx +++ b/docs/platforms/python/integrations/tornado/index.mdx @@ -61,7 +61,7 @@ It takes a couple of moments for the data to appear in [sentry.io](https://sentr - All exceptions leading to a Internal Server Error are reported. -- Request data is attached to all events: **HTTP method, URL, headers, form data, JSON payloads**. Sentry excludes raw bodies and multipart file uploads. Sentry also excludes personally identifiable information (such as user ids, usernames, cookies, authorization headers, IP addresses) unless you set `send_default_pii` to `True`. +- Request data is attached to all events: **HTTP method, URL, headers, form data, JSON payloads**. Sentry excludes raw bodies and multipart file uploads. Sentry also excludes personally identifiable information (such as user ids, usernames, cookies, authorization headers, IP addresses) unless you configure which categories to collect with the `data_collection` option or set `send_default_pii` to `True`. `send_default_pii` will be removed in version 3.0 of the SDK. - Each request has a separate scope. Changes to the scope within a view, for example setting a tag, will only apply to events sent as part of the request being handled. diff --git a/docs/platforms/python/integrations/tryton/index.mdx b/docs/platforms/python/integrations/tryton/index.mdx index 0c198d334133a..72b07582fb4f7 100644 --- a/docs/platforms/python/integrations/tryton/index.mdx +++ b/docs/platforms/python/integrations/tryton/index.mdx @@ -80,7 +80,7 @@ def _(app, request, e): - All uncaught exceptions not inherited from Tryton exceptions are reported. -- Request data is attached to all events: **HTTP method, URL, headers, form data, JSON payloads**. Sentry excludes raw bodies and multipart file uploads. Sentry also excludes personally identifiable information (such as user ids, usernames, cookies, authorization headers, IP addresses) unless you set `send_default_pii` to `True`. +- Request data is attached to all events: **HTTP method, URL, headers, form data, JSON payloads**. Sentry excludes raw bodies and multipart file uploads. Sentry also excludes personally identifiable information (such as user ids, usernames, cookies, authorization headers, IP addresses) unless you configure which categories to collect with the `data_collection` option or set `send_default_pii` to `True`. `send_default_pii` will be removed in version 3.0 of the SDK. Each request has a separate scope. Changes to the scope within a view, for example setting a tag, will only apply to events sent as part of the request being handled. diff --git a/docs/platforms/python/integrations/wsgi/index.mdx b/docs/platforms/python/integrations/wsgi/index.mdx index b63b9f59ab842..9064712435a2e 100644 --- a/docs/platforms/python/integrations/wsgi/index.mdx +++ b/docs/platforms/python/integrations/wsgi/index.mdx @@ -89,7 +89,7 @@ make_server('', 8000, app).serve_forever() -- Request data is attached to all events: **HTTP method, URL, headers**. Sentry excludes raw bodies and multipart file uploads. Sentry also excludes personally identifiable information (such as user ids, usernames, cookies, authorization headers, IP addresses) unless you set `send_default_pii` to `True`. +- Request data is attached to all events: **HTTP method, URL, headers**. Sentry excludes raw bodies and multipart file uploads. Sentry also excludes personally identifiable information (such as user ids, usernames, cookies, authorization headers, IP addresses) unless you configure which categories to collect with the `data_collection` option or set `send_default_pii` to `True`. `send_default_pii` will be removed in version 3.0 of the SDK. Each request has a separate scope. Changes to the scope within a view, for example setting a tag, will only apply to events sent as part of the request being handled. From c1e408bfb3add9d2ace0694edc415e5a1fb0afc7 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Wed, 21 Oct 2026 14:27:12 +0200 Subject: [PATCH 020/127] docs(python): Use `data_collection` in `init` snippets (#20130) ## DESCRIBE YOUR PR Replace `send_default_pii=True` in Python init snippets with a `data_collection` example, using the key that fits each page. `send_default_pii` will be removed in version 3.0 of the SDK. - `user_info`: shared getting-started/config includes, general pages, web frameworks, logging, feature flags, etc. - `gen_ai`: AI agent tracing pages and MCP - `queues`: Celery, RQ - `database_query_data`: aiomysql - `graphql`: Strawberry Snippets demonstrating `include_prompts`, `event_scrubber`, or Rust Tracing's `include_tracing_fields` keep `send_default_pii`, since those only work with it. The GQL, Graphene, Ariadne, and second Strawberry snippets are left alone because #20128 keeps them as the `send_default_pii` alternative. Related: #20128 ## IS YOUR CHANGE URGENT? Help us prioritize incoming PRs by letting us know when the change needs to go live. Select exactly one option. For deadlines, replace `YYYY-MM-DD` with the due date. You can update this information later by editing the PR description. - [ ] Urgent deadline (GA date, etc.): YYYY-MM-DD - [ ] Other deadline: YYYY-MM-DD - [x] No deadline: Not urgent, can wait up to 1 week+ ## SLA - Teamwork makes the dream work, so please add a reviewer to your PRs. - Please give the docs team up to 1 week to review your PR unless you've supplied a deadline. Thanks in advance for your help! ## PRE-MERGE CHECKLIST _Make sure you've checked the following before merging your changes:_ - [ ] Checked Vercel preview for correctness, including links - [ ] PR was reviewed and approved by any necessary SMEs (subject matter experts) - [ ] PR was reviewed and approved by a member of the [Sentry docs team](https://github.com/orgs/getsentry/teams/docs) --- .../agent-tracing/google-genai/index.mdx | 7 +++-- .../agent-tracing/huggingface_hub/index.mdx | 5 +++- docs/platforms/python/agent-tracing/index.mdx | 5 +++- .../python/agent-tracing/langchain/index.mdx | 10 +++++-- .../python/agent-tracing/langgraph/index.mdx | 5 +++- .../python/agent-tracing/litellm/index.mdx | 12 +++++--- .../python/agent-tracing/mistral/index.mdx | 12 +++++--- .../agent-tracing/openai-agents/index.mdx | 7 +++-- .../agent-tracing/pydantic-ai/index.mdx | 28 +++++++++++-------- .../python/agent-tracing/typesafe/index.mdx | 12 +++++--- docs/platforms/python/index.mdx | 7 +++-- .../python/integrations/aiomysql/index.mdx | 12 +++++--- .../python/integrations/asgi/index.mdx | 7 +++-- .../python/integrations/asyncio/index.mdx | 14 ++++++---- .../manual-instrumentation/index.mdx | 7 +++-- .../python/integrations/beam/index.mdx | 7 +++-- .../python/integrations/celery/crons.mdx | 7 +++-- .../python/integrations/celery/index.mdx | 14 ++++++---- .../cloudresourcecontext/index.mdx | 7 +++-- .../python/integrations/django/index.mdx | 7 +++-- .../python/integrations/dramatiq/index.mdx | 7 +++-- .../integrations/gcp-functions/index.mdx | 7 +++-- .../integrations/gnu_backtrace/index.mdx | 7 +++-- .../python/integrations/grpc/index.mdx | 14 ++++++---- .../integrations/launchdarkly/index.mdx | 7 +++-- .../python/integrations/litestar/index.mdx | 7 +++-- .../python/integrations/logging/index.mdx | 7 +++-- .../python/integrations/loguru/index.mdx | 7 +++-- .../python/integrations/mcp/index.mdx | 19 ++++++++----- .../python/integrations/openfeature/index.mdx | 7 +++-- .../python/integrations/otlp/index.mdx | 7 +++-- .../python/integrations/pure_eval/index.mdx | 7 +++-- .../python/integrations/pyreqwest/index.mdx | 7 +++-- .../python/integrations/ray/index.mdx | 7 +++-- .../python/integrations/rq/index.mdx | 28 +++++++++++-------- .../python/integrations/sanic/index.mdx | 7 +++-- .../python/integrations/serverless/index.mdx | 7 +++-- .../python/integrations/socket/index.mdx | 7 +++-- .../python/integrations/spark/index.mdx | 14 ++++++---- .../python/integrations/statsig/index.mdx | 7 +++-- .../python/integrations/strawberry/index.mdx | 7 +++-- .../python/integrations/sys_exit/index.mdx | 7 +++-- .../python/integrations/tryton/index.mdx | 7 +++-- .../python/integrations/typer/index.mdx | 7 +++-- .../python/integrations/unleash/index.mdx | 7 +++-- .../python/integrations/wsgi/index.mdx | 7 +++-- docs/platforms/python/profiling/index.mdx | 21 ++++++++------ docs/platforms/python/tracing/index.mdx | 7 +++-- .../configuration/config-intro/python.mdx | 7 +++-- .../getting-started-config/python.mdx | 7 +++-- .../python.splitlayout.mdx | 7 +++-- .../opentelemetry-setup/python.mdx | 7 +++-- 52 files changed, 284 insertions(+), 193 deletions(-) diff --git a/docs/platforms/python/agent-tracing/google-genai/index.mdx b/docs/platforms/python/agent-tracing/google-genai/index.mdx index 2388a3d88b000..583db380806c6 100644 --- a/docs/platforms/python/agent-tracing/google-genai/index.mdx +++ b/docs/platforms/python/agent-tracing/google-genai/index.mdx @@ -37,9 +37,10 @@ sentry_sdk.init( # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. traces_sample_rate=1.0, - # Add data like inputs and responses; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "gen_ai": {"inputs": True, "outputs": True}, + }, integrations=[ GoogleGenAIIntegration(), ], diff --git a/docs/platforms/python/agent-tracing/huggingface_hub/index.mdx b/docs/platforms/python/agent-tracing/huggingface_hub/index.mdx index a3d769e9fd3c6..f48ab12ff4295 100644 --- a/docs/platforms/python/agent-tracing/huggingface_hub/index.mdx +++ b/docs/platforms/python/agent-tracing/huggingface_hub/index.mdx @@ -33,7 +33,10 @@ sentry_sdk.init( dsn="___PUBLIC_DSN___", environment="local", traces_sample_rate=1.0, - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "gen_ai": {"inputs": True, "outputs": True}, + }, ) ``` diff --git a/docs/platforms/python/agent-tracing/index.mdx b/docs/platforms/python/agent-tracing/index.mdx index ceddc4109355a..11dd15f3d3679 100644 --- a/docs/platforms/python/agent-tracing/index.mdx +++ b/docs/platforms/python/agent-tracing/index.mdx @@ -21,7 +21,10 @@ import sentry_sdk sentry_sdk.init( dsn="___PUBLIC_DSN___", traces_sample_rate=1.0, - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "gen_ai": {"inputs": True, "outputs": True}, + }, ) ``` diff --git a/docs/platforms/python/agent-tracing/langchain/index.mdx b/docs/platforms/python/agent-tracing/langchain/index.mdx index 3c6a3712c25f0..2f3cf2a4d99ee 100644 --- a/docs/platforms/python/agent-tracing/langchain/index.mdx +++ b/docs/platforms/python/agent-tracing/langchain/index.mdx @@ -35,7 +35,10 @@ sentry_sdk.init( dsn="___PUBLIC_DSN___", environment="local", traces_sample_rate=1.0, - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "gen_ai": {"inputs": True, "outputs": True}, + }, debug=True, integrations=[ LangchainIntegration(), @@ -52,7 +55,10 @@ sentry_sdk.init( dsn="___PUBLIC_DSN___", environment="local", traces_sample_rate=1.0, - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "gen_ai": {"inputs": True, "outputs": True}, + }, debug=True, integrations=[ LangchainIntegration(), diff --git a/docs/platforms/python/agent-tracing/langgraph/index.mdx b/docs/platforms/python/agent-tracing/langgraph/index.mdx index b81a792565613..cbb16faaf5f0d 100644 --- a/docs/platforms/python/agent-tracing/langgraph/index.mdx +++ b/docs/platforms/python/agent-tracing/langgraph/index.mdx @@ -33,7 +33,10 @@ sentry_sdk.init( dsn="___PUBLIC_DSN___", environment="local", traces_sample_rate=1.0, - send_default_pii=True + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "gen_ai": {"inputs": True, "outputs": True}, + }, ) ``` diff --git a/docs/platforms/python/agent-tracing/litellm/index.mdx b/docs/platforms/python/agent-tracing/litellm/index.mdx index 53bc8ae838ea2..dde53bdd00c20 100644 --- a/docs/platforms/python/agent-tracing/litellm/index.mdx +++ b/docs/platforms/python/agent-tracing/litellm/index.mdx @@ -35,9 +35,10 @@ sentry_sdk.init( # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. traces_sample_rate=1.0, - # Add data like inputs and responses; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "gen_ai": {"inputs": True, "outputs": True}, + }, integrations=[ LiteLLMIntegration(), ], @@ -56,7 +57,10 @@ import litellm sentry_sdk.init( dsn="___PUBLIC_DSN___", traces_sample_rate=1.0, - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "gen_ai": {"inputs": True, "outputs": True}, + }, integrations=[ LiteLLMIntegration(), ], diff --git a/docs/platforms/python/agent-tracing/mistral/index.mdx b/docs/platforms/python/agent-tracing/mistral/index.mdx index a59c31243180c..29fee9feb9132 100644 --- a/docs/platforms/python/agent-tracing/mistral/index.mdx +++ b/docs/platforms/python/agent-tracing/mistral/index.mdx @@ -35,9 +35,10 @@ sentry_sdk.init( # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. traces_sample_rate=1.0, - # Add data like inputs and responses; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "gen_ai": {"inputs": True, "outputs": True}, + }, integrations=[ MistralIntegration(), ], @@ -57,7 +58,10 @@ from mistralai.client import Mistral sentry_sdk.init( dsn="___PUBLIC_DSN___", traces_sample_rate=1.0, - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "gen_ai": {"inputs": True, "outputs": True}, + }, integrations=[ MistralIntegration(), ], diff --git a/docs/platforms/python/agent-tracing/openai-agents/index.mdx b/docs/platforms/python/agent-tracing/openai-agents/index.mdx index a88c64a2c0a29..4d3520779ae8e 100644 --- a/docs/platforms/python/agent-tracing/openai-agents/index.mdx +++ b/docs/platforms/python/agent-tracing/openai-agents/index.mdx @@ -68,9 +68,10 @@ async def main() -> None: sentry_sdk.init( dsn="___PUBLIC_DSN___", traces_sample_rate=1.0, - # Add data like LLM and tool inputs/outputs; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "gen_ai": {"inputs": True, "outputs": True}, + }, ) await agents.Runner.run( diff --git a/docs/platforms/python/agent-tracing/pydantic-ai/index.mdx b/docs/platforms/python/agent-tracing/pydantic-ai/index.mdx index 49e026d4866fb..4e71bc19d5bdc 100644 --- a/docs/platforms/python/agent-tracing/pydantic-ai/index.mdx +++ b/docs/platforms/python/agent-tracing/pydantic-ai/index.mdx @@ -41,9 +41,10 @@ from sentry_sdk.integrations.openai import OpenAIIntegration sentry_sdk.init( dsn="___PUBLIC_DSN___", traces_sample_rate=1.0, - # Add data like LLM and tool inputs/outputs; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "gen_ai": {"inputs": True, "outputs": True}, + }, integrations=[ PydanticAIIntegration(), ] @@ -57,9 +58,10 @@ from sentry_sdk.integrations.pydantic_ai import PydanticAIIntegration sentry_sdk.init( dsn="___PUBLIC_DSN___", traces_sample_rate=1.0, - # Add data like LLM and tool inputs/outputs; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "gen_ai": {"inputs": True, "outputs": True}, + }, integrations=[ PydanticAIIntegration(), ], @@ -118,9 +120,10 @@ async def main() -> None: sentry_sdk.init( dsn="___PUBLIC_DSN___", traces_sample_rate=1.0, - # Add data like LLM and tool inputs/outputs; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "gen_ai": {"inputs": True, "outputs": True}, + }, integrations=[ PydanticAIIntegration(), ] @@ -182,9 +185,10 @@ async def main() -> None: sentry_sdk.init( dsn="___PUBLIC_DSN___", traces_sample_rate=1.0, - # Add data like LLM and tool inputs/outputs; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "gen_ai": {"inputs": True, "outputs": True}, + }, integrations=[ PydanticAIIntegration(), ], diff --git a/docs/platforms/python/agent-tracing/typesafe/index.mdx b/docs/platforms/python/agent-tracing/typesafe/index.mdx index 3082e80d4807b..3d3b9c6ea7caf 100644 --- a/docs/platforms/python/agent-tracing/typesafe/index.mdx +++ b/docs/platforms/python/agent-tracing/typesafe/index.mdx @@ -33,9 +33,10 @@ sentry_sdk.init( # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. traces_sample_rate=1.0, - # Add data like inputs and responses; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "gen_ai": {"inputs": True, "outputs": True}, + }, integrations=[ TypeSafeIntegration(), ], @@ -55,7 +56,10 @@ from typesafe_sdk import Choice, TypeSafeClient sentry_sdk.init( dsn="___PUBLIC_DSN___", traces_sample_rate=1.0, - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "gen_ai": {"inputs": True, "outputs": True}, + }, integrations=[ TypeSafeIntegration(), ], diff --git a/docs/platforms/python/index.mdx b/docs/platforms/python/index.mdx index 727dd24fca87a..245773b8724b1 100644 --- a/docs/platforms/python/index.mdx +++ b/docs/platforms/python/index.mdx @@ -51,9 +51,10 @@ from sentry_sdk import metrics sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add request headers and IP for users, - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, # ___PRODUCT_OPTION_START___ performance # Set traces_sample_rate to 1.0 to capture 100% diff --git a/docs/platforms/python/integrations/aiomysql/index.mdx b/docs/platforms/python/integrations/aiomysql/index.mdx index aef1be7f02897..64345d846c756 100644 --- a/docs/platforms/python/integrations/aiomysql/index.mdx +++ b/docs/platforms/python/integrations/aiomysql/index.mdx @@ -32,9 +32,10 @@ sentry_sdk.init( # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. traces_sample_rate=1.0, - # Add data like inputs and responses; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "database_query_data": True, + }, integrations=[ AioMySQLIntegration(), ], @@ -52,7 +53,10 @@ import asyncio sentry_sdk.init( dsn="___PUBLIC_DSN___", traces_sample_rate=1.0, - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "database_query_data": True, + }, integrations=[ AioMySQLIntegration(), ], diff --git a/docs/platforms/python/integrations/asgi/index.mdx b/docs/platforms/python/integrations/asgi/index.mdx index fe24fa8309768..aa54565fbf41d 100644 --- a/docs/platforms/python/integrations/asgi/index.mdx +++ b/docs/platforms/python/integrations/asgi/index.mdx @@ -41,9 +41,10 @@ from my_asgi_app import app sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, # ___PRODUCT_OPTION_START___ performance # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. diff --git a/docs/platforms/python/integrations/asyncio/index.mdx b/docs/platforms/python/integrations/asyncio/index.mdx index 4747d2a0369c1..cb890f628fcd5 100644 --- a/docs/platforms/python/integrations/asyncio/index.mdx +++ b/docs/platforms/python/integrations/asyncio/index.mdx @@ -37,9 +37,10 @@ from sentry_sdk.integrations.asyncio import AsyncioIntegration async def main(): sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, # ___PRODUCT_OPTION_START___ performance # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. @@ -75,9 +76,10 @@ from sentry_sdk.integrations.asyncio import enable_asyncio_integration # Initializing the SDK as early as possible, when there is no event loop yet sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, # ___PRODUCT_OPTION_START___ performance # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. diff --git a/docs/platforms/python/integrations/aws-lambda/manual-instrumentation/index.mdx b/docs/platforms/python/integrations/aws-lambda/manual-instrumentation/index.mdx index 29f84778ebcbb..95942b5485dfc 100644 --- a/docs/platforms/python/integrations/aws-lambda/manual-instrumentation/index.mdx +++ b/docs/platforms/python/integrations/aws-lambda/manual-instrumentation/index.mdx @@ -44,9 +44,10 @@ from sentry_sdk.integrations.aws_lambda import AwsLambdaIntegration sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, # ___PRODUCT_OPTION_START___ performance # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. diff --git a/docs/platforms/python/integrations/beam/index.mdx b/docs/platforms/python/integrations/beam/index.mdx index 774a0733212b5..b90644d9859c0 100644 --- a/docs/platforms/python/integrations/beam/index.mdx +++ b/docs/platforms/python/integrations/beam/index.mdx @@ -29,9 +29,10 @@ from sentry_sdk.integrations.beam import BeamIntegration sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, # ___PRODUCT_OPTION_START___ performance # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. diff --git a/docs/platforms/python/integrations/celery/crons.mdx b/docs/platforms/python/integrations/celery/crons.mdx index ee8ea911e7cef..c269ac7e4c206 100644 --- a/docs/platforms/python/integrations/celery/crons.mdx +++ b/docs/platforms/python/integrations/celery/crons.mdx @@ -64,9 +64,10 @@ from sentry_sdk.integrations.celery import CeleryIntegration def init_sentry(**kwargs): sentry_sdk.init( dsn='___PUBLIC_DSN___', - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "queues": True, + }, # ___PRODUCT_OPTION_START___ performance # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. diff --git a/docs/platforms/python/integrations/celery/index.mdx b/docs/platforms/python/integrations/celery/index.mdx index 54494ff8d209f..e8aac80935497 100644 --- a/docs/platforms/python/integrations/celery/index.mdx +++ b/docs/platforms/python/integrations/celery/index.mdx @@ -67,9 +67,10 @@ app = Celery("tasks", broker="...") def init_sentry(**_kwargs): sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add request headers and IP for users, - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "queues": True, + }, # ___PRODUCT_OPTION_START___ performance # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. @@ -106,9 +107,10 @@ def main(): # Initializing Sentry SDK in our process sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "queues": True, + }, # ___PRODUCT_OPTION_START___ performance # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. diff --git a/docs/platforms/python/integrations/cloudresourcecontext/index.mdx b/docs/platforms/python/integrations/cloudresourcecontext/index.mdx index 214eff25e971d..280b7a6bae09e 100644 --- a/docs/platforms/python/integrations/cloudresourcecontext/index.mdx +++ b/docs/platforms/python/integrations/cloudresourcecontext/index.mdx @@ -42,9 +42,10 @@ from sentry_sdk.integrations.cloud_resource_context import CloudResourceContextI sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, # ___PRODUCT_OPTION_START___ performance # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. diff --git a/docs/platforms/python/integrations/django/index.mdx b/docs/platforms/python/integrations/django/index.mdx index 3178c7e40cb4b..5eef058c81143 100644 --- a/docs/platforms/python/integrations/django/index.mdx +++ b/docs/platforms/python/integrations/django/index.mdx @@ -50,9 +50,10 @@ from sentry_sdk import metrics sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, # ___PRODUCT_OPTION_START___ performance # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. diff --git a/docs/platforms/python/integrations/dramatiq/index.mdx b/docs/platforms/python/integrations/dramatiq/index.mdx index 6905d813cb7e0..223474c160173 100644 --- a/docs/platforms/python/integrations/dramatiq/index.mdx +++ b/docs/platforms/python/integrations/dramatiq/index.mdx @@ -35,9 +35,10 @@ from sentry_sdk.integrations.dramatiq import DramatiqIntegration sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, integrations=[ DramatiqIntegration(), ], diff --git a/docs/platforms/python/integrations/gcp-functions/index.mdx b/docs/platforms/python/integrations/gcp-functions/index.mdx index 7e8bac32768a5..a12ba3305f1c7 100644 --- a/docs/platforms/python/integrations/gcp-functions/index.mdx +++ b/docs/platforms/python/integrations/gcp-functions/index.mdx @@ -39,9 +39,10 @@ from sentry_sdk.integrations.gcp import GcpIntegration sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, # ___PRODUCT_OPTION_START___ performance # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. diff --git a/docs/platforms/python/integrations/gnu_backtrace/index.mdx b/docs/platforms/python/integrations/gnu_backtrace/index.mdx index 3d2ef0206b379..df49c32f5cc39 100644 --- a/docs/platforms/python/integrations/gnu_backtrace/index.mdx +++ b/docs/platforms/python/integrations/gnu_backtrace/index.mdx @@ -29,9 +29,10 @@ from sentry_sdk.integrations.gnu_backtrace import GnuBacktraceIntegration sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, integrations=[ GnuBacktraceIntegration(), ], diff --git a/docs/platforms/python/integrations/grpc/index.mdx b/docs/platforms/python/integrations/grpc/index.mdx index 621229b420957..c731a310824da 100644 --- a/docs/platforms/python/integrations/grpc/index.mdx +++ b/docs/platforms/python/integrations/grpc/index.mdx @@ -46,9 +46,10 @@ from sentry_sdk.integrations.grpc import GRPCIntegration sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, # ___PRODUCT_OPTION_START___ performance # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. @@ -87,9 +88,10 @@ from sentry_sdk.integrations.grpc import GRPCIntegration sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, # ___PRODUCT_OPTION_START___ performance # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. diff --git a/docs/platforms/python/integrations/launchdarkly/index.mdx b/docs/platforms/python/integrations/launchdarkly/index.mdx index c933d515edfdb..dc08c9eb4effa 100644 --- a/docs/platforms/python/integrations/launchdarkly/index.mdx +++ b/docs/platforms/python/integrations/launchdarkly/index.mdx @@ -26,9 +26,10 @@ from sentry_sdk.integrations.launchdarkly import LaunchDarklyIntegration sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, integrations=[ LaunchDarklyIntegration(), ], diff --git a/docs/platforms/python/integrations/litestar/index.mdx b/docs/platforms/python/integrations/litestar/index.mdx index f82832d2be64a..672658b95c900 100644 --- a/docs/platforms/python/integrations/litestar/index.mdx +++ b/docs/platforms/python/integrations/litestar/index.mdx @@ -36,9 +36,10 @@ import sentry_sdk sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, # ___PRODUCT_OPTION_START___ performance # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. diff --git a/docs/platforms/python/integrations/logging/index.mdx b/docs/platforms/python/integrations/logging/index.mdx index 5cc0d10f6754c..3cad947696cf0 100644 --- a/docs/platforms/python/integrations/logging/index.mdx +++ b/docs/platforms/python/integrations/logging/index.mdx @@ -33,9 +33,10 @@ from sentry_sdk.integrations.logging import LoggingIntegration sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, integrations=[ LoggingIntegration(capture_sentry_logs=True), ], diff --git a/docs/platforms/python/integrations/loguru/index.mdx b/docs/platforms/python/integrations/loguru/index.mdx index 3931fc2b6c7a9..e9dcb80815aed 100644 --- a/docs/platforms/python/integrations/loguru/index.mdx +++ b/docs/platforms/python/integrations/loguru/index.mdx @@ -36,9 +36,10 @@ from sentry_sdk.integrations.loguru import LoguruIntegration sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, integrations=[ LoguruIntegration(capture_sentry_logs=True), ], diff --git a/docs/platforms/python/integrations/mcp/index.mdx b/docs/platforms/python/integrations/mcp/index.mdx index 93b0f29967afc..f8c61f3a64fdd 100644 --- a/docs/platforms/python/integrations/mcp/index.mdx +++ b/docs/platforms/python/integrations/mcp/index.mdx @@ -47,9 +47,10 @@ from sentry_sdk.integrations.mcp import MCPIntegration sentry_sdk.init( dsn="___PUBLIC_DSN___", traces_sample_rate=1.0, - # Add data like tool inputs/outputs; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "gen_ai": {"inputs": True, "outputs": True}, + }, integrations=[ MCPIntegration(), ], @@ -74,9 +75,10 @@ from mcp.server.fastmcp import FastMCP sentry_sdk.init( dsn="___PUBLIC_DSN___", traces_sample_rate=1.0, - # Add data like tool inputs/outputs; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "gen_ai": {"inputs": True, "outputs": True}, + }, integrations=[ MCPIntegration(), ], @@ -131,7 +133,10 @@ from mcp.types import Tool, TextContent, GetPromptResult, PromptMessage sentry_sdk.init( dsn="___PUBLIC_DSN___", traces_sample_rate=1.0, - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "gen_ai": {"inputs": True, "outputs": True}, + }, integrations=[ MCPIntegration(), ], diff --git a/docs/platforms/python/integrations/openfeature/index.mdx b/docs/platforms/python/integrations/openfeature/index.mdx index c63118d04d7f6..676da33b506eb 100644 --- a/docs/platforms/python/integrations/openfeature/index.mdx +++ b/docs/platforms/python/integrations/openfeature/index.mdx @@ -28,9 +28,10 @@ from sentry_sdk.integrations.openfeature import OpenFeatureIntegration sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, integrations=[ OpenFeatureIntegration(), ], diff --git a/docs/platforms/python/integrations/otlp/index.mdx b/docs/platforms/python/integrations/otlp/index.mdx index 00799eef4609b..ac8a5b58eb877 100644 --- a/docs/platforms/python/integrations/otlp/index.mdx +++ b/docs/platforms/python/integrations/otlp/index.mdx @@ -39,9 +39,10 @@ from sentry_sdk.integrations.otlp import OTLPIntegration sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, integrations=[ OTLPIntegration(), ], diff --git a/docs/platforms/python/integrations/pure_eval/index.mdx b/docs/platforms/python/integrations/pure_eval/index.mdx index 88b428af32fce..b71bb19fb62ff 100644 --- a/docs/platforms/python/integrations/pure_eval/index.mdx +++ b/docs/platforms/python/integrations/pure_eval/index.mdx @@ -27,9 +27,10 @@ from sentry_sdk.integrations.pure_eval import PureEvalIntegration sentry_sdk.init( dns="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, integrations=[ PureEvalIntegration(), ], diff --git a/docs/platforms/python/integrations/pyreqwest/index.mdx b/docs/platforms/python/integrations/pyreqwest/index.mdx index cf5f633222a09..b4b53e3dd9a8e 100644 --- a/docs/platforms/python/integrations/pyreqwest/index.mdx +++ b/docs/platforms/python/integrations/pyreqwest/index.mdx @@ -31,9 +31,10 @@ from sentry_sdk.integrations.pyreqwest import PyreqwestIntegration sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, integrations=[ PyreqwestIntegration(), ], diff --git a/docs/platforms/python/integrations/ray/index.mdx b/docs/platforms/python/integrations/ray/index.mdx index ef0561d2212ba..d309028888b67 100644 --- a/docs/platforms/python/integrations/ray/index.mdx +++ b/docs/platforms/python/integrations/ray/index.mdx @@ -40,9 +40,10 @@ from sentry_sdk.integrations.ray import RayIntegration def init_sentry(): sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, # ___PRODUCT_OPTION_START___ performance # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. diff --git a/docs/platforms/python/integrations/rq/index.mdx b/docs/platforms/python/integrations/rq/index.mdx index 67447669455c2..5196e5c164d02 100644 --- a/docs/platforms/python/integrations/rq/index.mdx +++ b/docs/platforms/python/integrations/rq/index.mdx @@ -39,9 +39,10 @@ import sentry_sdk sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "queues": True, + }, # ___PRODUCT_OPTION_START___ performance # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. @@ -77,9 +78,10 @@ import sentry_sdk sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "queues": True, + }, # ___PRODUCT_OPTION_START___ performance # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. @@ -126,9 +128,10 @@ import sentry_sdk # Sentry configuration for RQ worker processes sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "queues": True, + }, # ___PRODUCT_OPTION_START___ performance # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. @@ -159,9 +162,10 @@ import sentry_sdk # Sentry configuration for main.py process sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "queues": True, + }, # ___PRODUCT_OPTION_START___ performance # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. diff --git a/docs/platforms/python/integrations/sanic/index.mdx b/docs/platforms/python/integrations/sanic/index.mdx index 2acd08a72f01a..edf2ff60971d6 100644 --- a/docs/platforms/python/integrations/sanic/index.mdx +++ b/docs/platforms/python/integrations/sanic/index.mdx @@ -46,9 +46,10 @@ app = Sanic(__main__) async def init_sentry(_): sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, # ___PRODUCT_OPTION_START___ performance # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. diff --git a/docs/platforms/python/integrations/serverless/index.mdx b/docs/platforms/python/integrations/serverless/index.mdx index cf66d149d5a79..df39e5ec668c3 100644 --- a/docs/platforms/python/integrations/serverless/index.mdx +++ b/docs/platforms/python/integrations/serverless/index.mdx @@ -46,9 +46,10 @@ from sentry_sdk.integrations.serverless import serverless_function sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, # ___PRODUCT_OPTION_START___ performance # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. diff --git a/docs/platforms/python/integrations/socket/index.mdx b/docs/platforms/python/integrations/socket/index.mdx index 4eb7e0c4bd6b2..c1b49a1f78ecb 100644 --- a/docs/platforms/python/integrations/socket/index.mdx +++ b/docs/platforms/python/integrations/socket/index.mdx @@ -37,9 +37,10 @@ from sentry_sdk.integrations.socket import SocketIntegration sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, # ___PRODUCT_OPTION_START___ performance # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. diff --git a/docs/platforms/python/integrations/spark/index.mdx b/docs/platforms/python/integrations/spark/index.mdx index 2d2c57a03e7d5..24788abb982a9 100644 --- a/docs/platforms/python/integrations/spark/index.mdx +++ b/docs/platforms/python/integrations/spark/index.mdx @@ -33,9 +33,10 @@ from sentry_sdk.integrations.spark import SparkIntegration if __name__ == "__main__": sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, # ___PRODUCT_OPTION_START___ performance # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. @@ -76,9 +77,10 @@ import pyspark.daemon as original_daemon if __name__ == '__main__': sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, # ___PRODUCT_OPTION_START___ performance # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. diff --git a/docs/platforms/python/integrations/statsig/index.mdx b/docs/platforms/python/integrations/statsig/index.mdx index 17be95497a5b5..a530fbd9f6e31 100644 --- a/docs/platforms/python/integrations/statsig/index.mdx +++ b/docs/platforms/python/integrations/statsig/index.mdx @@ -26,9 +26,10 @@ from sentry_sdk.integrations.statsig import StatsigIntegration sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, integrations=[StatsigIntegration()], ) ``` diff --git a/docs/platforms/python/integrations/strawberry/index.mdx b/docs/platforms/python/integrations/strawberry/index.mdx index 36597eecf0b22..06db2ff927509 100644 --- a/docs/platforms/python/integrations/strawberry/index.mdx +++ b/docs/platforms/python/integrations/strawberry/index.mdx @@ -39,9 +39,10 @@ from sentry_sdk.integrations.strawberry import StrawberryIntegration sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "graphql": {"document": True, "variables": True}, + }, # ___PRODUCT_OPTION_START___ performance # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. diff --git a/docs/platforms/python/integrations/sys_exit/index.mdx b/docs/platforms/python/integrations/sys_exit/index.mdx index ce84ee6c9cbb7..55aff23f907f6 100644 --- a/docs/platforms/python/integrations/sys_exit/index.mdx +++ b/docs/platforms/python/integrations/sys_exit/index.mdx @@ -30,9 +30,10 @@ from sentry_sdk.integrations.sys_exit import SysExitIntegration sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, integrations=[SysExitIntegration()], ) ``` diff --git a/docs/platforms/python/integrations/tryton/index.mdx b/docs/platforms/python/integrations/tryton/index.mdx index 72b07582fb4f7..49ec2d21caa32 100644 --- a/docs/platforms/python/integrations/tryton/index.mdx +++ b/docs/platforms/python/integrations/tryton/index.mdx @@ -29,9 +29,10 @@ from sentry_sdk.integrations.trytond import TrytondWSGIIntegration sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, # ___PRODUCT_OPTION_START___ performance # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. diff --git a/docs/platforms/python/integrations/typer/index.mdx b/docs/platforms/python/integrations/typer/index.mdx index 8be07fcae764d..b7b9e9626db7d 100644 --- a/docs/platforms/python/integrations/typer/index.mdx +++ b/docs/platforms/python/integrations/typer/index.mdx @@ -26,9 +26,10 @@ from sentry_sdk.integrations.typer import TyperIntegration sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, integrations=[TyperIntegration()], ) ``` diff --git a/docs/platforms/python/integrations/unleash/index.mdx b/docs/platforms/python/integrations/unleash/index.mdx index 514f50fe010b0..f0b2b0ce02a76 100644 --- a/docs/platforms/python/integrations/unleash/index.mdx +++ b/docs/platforms/python/integrations/unleash/index.mdx @@ -26,9 +26,10 @@ from sentry_sdk.integrations.unleash import UnleashIntegration sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, integrations=[UnleashIntegration()], ) ``` diff --git a/docs/platforms/python/integrations/wsgi/index.mdx b/docs/platforms/python/integrations/wsgi/index.mdx index 9064712435a2e..dd963ea1de8d4 100644 --- a/docs/platforms/python/integrations/wsgi/index.mdx +++ b/docs/platforms/python/integrations/wsgi/index.mdx @@ -41,9 +41,10 @@ from my_wsgi_app import app sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, # ___PRODUCT_OPTION_START___ performance # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. diff --git a/docs/platforms/python/profiling/index.mdx b/docs/platforms/python/profiling/index.mdx index a5a015a20c07b..2befc779e36ae 100644 --- a/docs/platforms/python/profiling/index.mdx +++ b/docs/platforms/python/profiling/index.mdx @@ -31,9 +31,10 @@ import sentry_sdk sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. traces_sample_rate=1.0, @@ -53,9 +54,10 @@ import sentry_sdk sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. traces_sample_rate=1.0, @@ -107,9 +109,10 @@ def profiles_sampler(sampling_context: SamplingContext) -> float: sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. traces_sample_rate=1.0, diff --git a/docs/platforms/python/tracing/index.mdx b/docs/platforms/python/tracing/index.mdx index c3db81d113485..c83dd787f67c6 100644 --- a/docs/platforms/python/tracing/index.mdx +++ b/docs/platforms/python/tracing/index.mdx @@ -22,9 +22,10 @@ import sentry_sdk sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. + traces_sample_rate=1.0, diff --git a/platform-includes/configuration/config-intro/python.mdx b/platform-includes/configuration/config-intro/python.mdx index d8f450590ab5d..d384426e14c67 100644 --- a/platform-includes/configuration/config-intro/python.mdx +++ b/platform-includes/configuration/config-intro/python.mdx @@ -11,9 +11,10 @@ sentry_sdk.init( # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. traces_sample_rate=1.0, - # Add request headers and IP for users, - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, # By default the SDK will try to use the SENTRY_RELEASE # environment variable, or infer a git commit diff --git a/platform-includes/getting-started-config/python.mdx b/platform-includes/getting-started-config/python.mdx index 9d0c41de4ebc4..60be9c2943b00 100644 --- a/platform-includes/getting-started-config/python.mdx +++ b/platform-includes/getting-started-config/python.mdx @@ -7,9 +7,10 @@ import sentry_sdk sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, # ___PRODUCT_OPTION_START___ performance # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. diff --git a/platform-includes/getting-started-config/python.splitlayout.mdx b/platform-includes/getting-started-config/python.splitlayout.mdx index f418645f7aa34..10ba4d9fecbdf 100644 --- a/platform-includes/getting-started-config/python.splitlayout.mdx +++ b/platform-includes/getting-started-config/python.splitlayout.mdx @@ -6,9 +6,10 @@ from sentry_sdk import metrics sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, # ___PRODUCT_OPTION_START___ performance # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. diff --git a/platform-includes/performance/opentelemetry-setup/python.mdx b/platform-includes/performance/opentelemetry-setup/python.mdx index 4cf61176c1700..e14c203bc291a 100644 --- a/platform-includes/performance/opentelemetry-setup/python.mdx +++ b/platform-includes/performance/opentelemetry-setup/python.mdx @@ -6,9 +6,10 @@ import sentry_sdk sentry_sdk.init( dsn="___PUBLIC_DSN___", - # Add request headers and IP for users, - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, + # Check https://docs.sentry.io/platforms/python/data-management/data-collected/ to configure what data is collected + data_collection={ + "user_info": True, + }, # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. traces_sample_rate=1.0, From d8a2c92bb698ed93273febd0e3d722697c604855 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Wed, 21 Oct 2026 14:30:19 +0200 Subject: [PATCH 021/127] docs(python): Clarify that manual AI span attributes aren't filtered (#20131) ## DESCRIBE YOUR PR The manual AI and MCP instrumentation pages implied that prompt, response, and tool content you set yourself is only captured with `send_default_pii=True`. The SDK doesn't filter manually set attributes based on `send_default_pii` or `data_collection`, so this updates the pages to say that. - Manual Instrumentation: replace the `send_default_pii` claim, and point the privacy reference at `data_collection` - MCP custom instrumentation: align the tool-argument comment with the prompt examples on the same page Related: #20128 ## IS YOUR CHANGE URGENT? Help us prioritize incoming PRs by letting us know when the change needs to go live. Select exactly one option. For deadlines, replace `YYYY-MM-DD` with the due date. You can update this information later by editing the PR description. - [ ] Urgent deadline (GA date, etc.): YYYY-MM-DD - [ ] Other deadline: YYYY-MM-DD - [x] No deadline: Not urgent, can wait up to 1 week+ ## SLA - Teamwork makes the dream work, so please add a reviewer to your PRs. - Please give the docs team up to 1 week to review your PR unless you've supplied a deadline. Thanks in advance for your help! ## PRE-MERGE CHECKLIST _Make sure you've checked the following before merging your changes:_ - [ ] Checked Vercel preview for correctness, including links - [ ] PR was reviewed and approved by any necessary SMEs (subject matter experts) - [ ] PR was reviewed and approved by a member of the [Sentry docs team](https://github.com/orgs/getsentry/teams/docs) --- .../platforms/python/agent-tracing/manual-instrumentation.mdx | 4 ++-- .../instrumentation/custom-instrumentation/mcp-module.mdx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/platforms/python/agent-tracing/manual-instrumentation.mdx b/docs/platforms/python/agent-tracing/manual-instrumentation.mdx index 9845cdf3b80a3..898cad3d59d44 100644 --- a/docs/platforms/python/agent-tracing/manual-instrumentation.mdx +++ b/docs/platforms/python/agent-tracing/manual-instrumentation.mdx @@ -11,7 +11,7 @@ The [@sentry_sdk.trace()](/platforms/python/tracing/instrumentation/custom-instr This page describes the minimum span structure and attributes Sentry needs, then covers richer data such as messages, streaming metrics, and custom costs. -For conversations and privacy (`set_conversation_id`, `set_user`, `send_default_pii`), see the Agent Tracing guide. +For conversations and privacy (`set_conversation_id`, `set_user`, `data_collection`), see the Agent Tracing guide. ## Span Hierarchy @@ -46,7 +46,7 @@ To group turns into a [Conversation](/product/agents/conversations/), call `set_ Complex values (messages, tool definitions, arrays) must be **JSON strings** — span attributes only accept primitives. -Prompt, response, and tool content are treated as PII. They are only captured when `send_default_pii=True` (or per-integration `include_prompts`). See Privacy Controls. +Prompt, response, and tool content can contain PII. The SDK doesn't filter attributes you set manually, so the `data_collection` and `send_default_pii` options don't affect them. Decide what to record before you set these attributes. To learn how automatic integrations handle this data, see Privacy Controls. ## AI Request Span diff --git a/docs/platforms/python/tracing/instrumentation/custom-instrumentation/mcp-module.mdx b/docs/platforms/python/tracing/instrumentation/custom-instrumentation/mcp-module.mdx index 13cffde550d00..11d4e019a8655 100644 --- a/docs/platforms/python/tracing/instrumentation/custom-instrumentation/mcp-module.mdx +++ b/docs/platforms/python/tracing/instrumentation/custom-instrumentation/mcp-module.mdx @@ -59,7 +59,7 @@ with sentry_sdk.start_span( span.set_data("mcp.transport", "stdio") # or "http", "sse" for HTTP/WebSocket/SSE span.set_data("network.transport", "pipe") # or "tcp" for HTTP/SSE - # Set tool arguments (optional, if send_default_pii=True) + # Set tool arguments (keep in mind this might contain PII data, so only set if that's ok) for key, value in tool_arguments.items(): span.set_data(f"mcp.request.argument.{key}", value) @@ -105,7 +105,7 @@ with sentry_sdk.traces.start_span( "network.transport": "pipe", # or "tcp" for HTTP/SSE }) - # Set tool arguments (optional, if send_default_pii=True) + # Set tool arguments (keep in mind this might contain PII data, so only set if that's ok) for key, value in tool_arguments.items(): span.set_attribute(f"mcp.request.argument.{key}", value) From 636057c7ec1230275c454af2b7788ee45bc4d4d6 Mon Sep 17 00:00:00 2001 From: "sentry-api-schema-updater[bot]" <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> Date: Wed, 21 Oct 2026 12:48:26 +0000 Subject: [PATCH 022/127] Bump API schema to dc40ad2b (#20133) Co-authored-by: sentry-api-schema-updater[bot] <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> --- src/build/resolveOpenAPI.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/resolveOpenAPI.ts b/src/build/resolveOpenAPI.ts index abbee9db096ad..460b49ca1ce6d 100644 --- a/src/build/resolveOpenAPI.ts +++ b/src/build/resolveOpenAPI.ts @@ -6,7 +6,7 @@ import {DeRefedOpenAPI, Parameter} from './open-api/types'; // SENTRY_API_SCHEMA_SHA is used in the sentry-docs GHA workflow in getsentry/sentry-api-schema. // DO NOT change variable name unless you change it in the sentry-docs GHA workflow in getsentry/sentry-api-schema. -const SENTRY_API_SCHEMA_SHA = '285d9cbc72165ebc7de508d757f5598bb459fa2c'; +const SENTRY_API_SCHEMA_SHA = 'dc40ad2bc9614559b8fb78005c89ffe333a36e79'; const activeEnv = process.env.GATSBY_ENV || process.env.NODE_ENV || 'development'; From 46929c9f8e58e26a6d0f11e1e3b5c241ffaa35fc Mon Sep 17 00:00:00 2001 From: "sentry-api-schema-updater[bot]" <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> Date: Wed, 21 Oct 2026 12:51:56 +0000 Subject: [PATCH 023/127] Bump API schema to f5e2db97 (#20134) Co-authored-by: sentry-api-schema-updater[bot] <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> --- src/build/resolveOpenAPI.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/resolveOpenAPI.ts b/src/build/resolveOpenAPI.ts index 460b49ca1ce6d..08da0f7543532 100644 --- a/src/build/resolveOpenAPI.ts +++ b/src/build/resolveOpenAPI.ts @@ -6,7 +6,7 @@ import {DeRefedOpenAPI, Parameter} from './open-api/types'; // SENTRY_API_SCHEMA_SHA is used in the sentry-docs GHA workflow in getsentry/sentry-api-schema. // DO NOT change variable name unless you change it in the sentry-docs GHA workflow in getsentry/sentry-api-schema. -const SENTRY_API_SCHEMA_SHA = 'dc40ad2bc9614559b8fb78005c89ffe333a36e79'; +const SENTRY_API_SCHEMA_SHA = 'f5e2db97a2ea67361d82e4150657b752e38e73cb'; const activeEnv = process.env.GATSBY_ENV || process.env.NODE_ENV || 'development'; From 73db022114fdc8b165b3b5ec46182895436d8db9 Mon Sep 17 00:00:00 2001 From: "sentry-api-schema-updater[bot]" <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> Date: Wed, 21 Oct 2026 14:01:00 +0000 Subject: [PATCH 024/127] Bump API schema to 2c407fef (#20135) Co-authored-by: sentry-api-schema-updater[bot] <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> --- src/build/resolveOpenAPI.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/resolveOpenAPI.ts b/src/build/resolveOpenAPI.ts index 08da0f7543532..e6e2f14f6f59a 100644 --- a/src/build/resolveOpenAPI.ts +++ b/src/build/resolveOpenAPI.ts @@ -6,7 +6,7 @@ import {DeRefedOpenAPI, Parameter} from './open-api/types'; // SENTRY_API_SCHEMA_SHA is used in the sentry-docs GHA workflow in getsentry/sentry-api-schema. // DO NOT change variable name unless you change it in the sentry-docs GHA workflow in getsentry/sentry-api-schema. -const SENTRY_API_SCHEMA_SHA = 'f5e2db97a2ea67361d82e4150657b752e38e73cb'; +const SENTRY_API_SCHEMA_SHA = '2c407fefa6705280708b43fb97295bd40d707683'; const activeEnv = process.env.GATSBY_ENV || process.env.NODE_ENV || 'development'; From 62073724515e36f1ab40be3490f745f8c50dc314 Mon Sep 17 00:00:00 2001 From: "sentry-api-schema-updater[bot]" <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> Date: Wed, 21 Oct 2026 14:04:33 +0000 Subject: [PATCH 025/127] Bump API schema to 03b63c05 (#20136) Co-authored-by: sentry-api-schema-updater[bot] <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> --- src/build/resolveOpenAPI.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/resolveOpenAPI.ts b/src/build/resolveOpenAPI.ts index e6e2f14f6f59a..0a059d6fba563 100644 --- a/src/build/resolveOpenAPI.ts +++ b/src/build/resolveOpenAPI.ts @@ -6,7 +6,7 @@ import {DeRefedOpenAPI, Parameter} from './open-api/types'; // SENTRY_API_SCHEMA_SHA is used in the sentry-docs GHA workflow in getsentry/sentry-api-schema. // DO NOT change variable name unless you change it in the sentry-docs GHA workflow in getsentry/sentry-api-schema. -const SENTRY_API_SCHEMA_SHA = '2c407fefa6705280708b43fb97295bd40d707683'; +const SENTRY_API_SCHEMA_SHA = '03b63c05ba72b8961ccc0033fe6d37a9bd04b088'; const activeEnv = process.env.GATSBY_ENV || process.env.NODE_ENV || 'development'; From 4d01b27e5da29ff84adcbc3be56425d54baf139e Mon Sep 17 00:00:00 2001 From: "sentry-api-schema-updater[bot]" <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> Date: Wed, 21 Oct 2026 14:23:09 +0000 Subject: [PATCH 026/127] Bump API schema to 8de28f6d (#20138) Co-authored-by: sentry-api-schema-updater[bot] <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> --- src/build/resolveOpenAPI.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/resolveOpenAPI.ts b/src/build/resolveOpenAPI.ts index 0a059d6fba563..df81369a7ba1f 100644 --- a/src/build/resolveOpenAPI.ts +++ b/src/build/resolveOpenAPI.ts @@ -6,7 +6,7 @@ import {DeRefedOpenAPI, Parameter} from './open-api/types'; // SENTRY_API_SCHEMA_SHA is used in the sentry-docs GHA workflow in getsentry/sentry-api-schema. // DO NOT change variable name unless you change it in the sentry-docs GHA workflow in getsentry/sentry-api-schema. -const SENTRY_API_SCHEMA_SHA = '03b63c05ba72b8961ccc0033fe6d37a9bd04b088'; +const SENTRY_API_SCHEMA_SHA = '8de28f6d9e7b4b3817a6a40dd8f8a8ade069985e'; const activeEnv = process.env.GATSBY_ENV || process.env.NODE_ENV || 'development'; From b7fb950b79ca1a767e98229cfd035783761e53bc Mon Sep 17 00:00:00 2001 From: "sentry-api-schema-updater[bot]" <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> Date: Wed, 21 Oct 2026 14:35:04 +0000 Subject: [PATCH 027/127] Bump API schema to ceaace46 (#20139) Co-authored-by: sentry-api-schema-updater[bot] <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> --- src/build/resolveOpenAPI.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/resolveOpenAPI.ts b/src/build/resolveOpenAPI.ts index df81369a7ba1f..d744286bf60d0 100644 --- a/src/build/resolveOpenAPI.ts +++ b/src/build/resolveOpenAPI.ts @@ -6,7 +6,7 @@ import {DeRefedOpenAPI, Parameter} from './open-api/types'; // SENTRY_API_SCHEMA_SHA is used in the sentry-docs GHA workflow in getsentry/sentry-api-schema. // DO NOT change variable name unless you change it in the sentry-docs GHA workflow in getsentry/sentry-api-schema. -const SENTRY_API_SCHEMA_SHA = '8de28f6d9e7b4b3817a6a40dd8f8a8ade069985e'; +const SENTRY_API_SCHEMA_SHA = 'ceaace4649140960038449cab61dcae33ec154b3'; const activeEnv = process.env.GATSBY_ENV || process.env.NODE_ENV || 'development'; From bf18dfc80a5f288df48bf64f3348d70e810c3b5f Mon Sep 17 00:00:00 2001 From: "sentry-api-schema-updater[bot]" <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> Date: Wed, 21 Oct 2026 15:20:41 +0000 Subject: [PATCH 028/127] Bump API schema to e2dc40b3 (#20140) Co-authored-by: sentry-api-schema-updater[bot] <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> --- src/build/resolveOpenAPI.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/resolveOpenAPI.ts b/src/build/resolveOpenAPI.ts index d744286bf60d0..9e8fe528cd6b0 100644 --- a/src/build/resolveOpenAPI.ts +++ b/src/build/resolveOpenAPI.ts @@ -6,7 +6,7 @@ import {DeRefedOpenAPI, Parameter} from './open-api/types'; // SENTRY_API_SCHEMA_SHA is used in the sentry-docs GHA workflow in getsentry/sentry-api-schema. // DO NOT change variable name unless you change it in the sentry-docs GHA workflow in getsentry/sentry-api-schema. -const SENTRY_API_SCHEMA_SHA = 'ceaace4649140960038449cab61dcae33ec154b3'; +const SENTRY_API_SCHEMA_SHA = 'e2dc40b3e8e5eaee4f9e078cc22370ffb01440d7'; const activeEnv = process.env.GATSBY_ENV || process.env.NODE_ENV || 'development'; From faf8b61f277d9eb2a05cb70d97e05c77916523a0 Mon Sep 17 00:00:00 2001 From: "sentry-api-schema-updater[bot]" <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> Date: Wed, 21 Oct 2026 15:57:15 +0000 Subject: [PATCH 029/127] Bump API schema to 90906f96 (#20141) Co-authored-by: sentry-api-schema-updater[bot] <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> --- src/build/resolveOpenAPI.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/resolveOpenAPI.ts b/src/build/resolveOpenAPI.ts index 9e8fe528cd6b0..327243ba7287d 100644 --- a/src/build/resolveOpenAPI.ts +++ b/src/build/resolveOpenAPI.ts @@ -6,7 +6,7 @@ import {DeRefedOpenAPI, Parameter} from './open-api/types'; // SENTRY_API_SCHEMA_SHA is used in the sentry-docs GHA workflow in getsentry/sentry-api-schema. // DO NOT change variable name unless you change it in the sentry-docs GHA workflow in getsentry/sentry-api-schema. -const SENTRY_API_SCHEMA_SHA = 'e2dc40b3e8e5eaee4f9e078cc22370ffb01440d7'; +const SENTRY_API_SCHEMA_SHA = '90906f9663c1ec6f0710730e3b4423cca08202b2'; const activeEnv = process.env.GATSBY_ENV || process.env.NODE_ENV || 'development'; From a4148794db62df5f88e0063babea7941977db59e Mon Sep 17 00:00:00 2001 From: Shannon Anahata Date: Wed, 21 Oct 2026 09:36:39 -0700 Subject: [PATCH 030/127] feat(Explore): New Dropped Data page, new Explore feature page, updates to search (#19870) ## DESCRIBE YOUR PR - New product page for Explore feature as a whole - New dropped data feature page - New searchable properties pages for Logs and Metrics - Updated explore-related pages to link to new explore page **Note:** Screenshots and arcades are pending EA-ready updates for dropped data. ## IS YOUR CHANGE URGENT? Help us prioritize incoming PRs by letting us know when the change needs to go live. Select exactly one option. For deadlines, replace `YYYY-MM-DD` with the due date. You can update this information later by editing the PR description. - [ ] Urgent deadline (GA date, etc.): YYYY-MM-DD - [x] Other deadline: 2026-10-16 - [ ] No deadline: Not urgent, can wait up to 1 week+ ## SLA - Teamwork makes the dream work, so please add a reviewer to your PRs. - Please give the docs team up to 1 week to review your PR unless you've supplied a deadline. Thanks in advance for your help! ## PRE-MERGE CHECKLIST _Make sure you've checked the following before merging your changes:_ - [ ] Checked Vercel preview for correctness, including links - [ ] PR was reviewed and approved by any necessary SMEs (subject matter experts) - [ ] PR was reviewed and approved by a member of the [Sentry docs team](https://github.com/orgs/getsentry/teams/docs) --------- Co-authored-by: Shannon Anahata Co-authored-by: sentry-junior[bot] <264270552+sentry-junior[bot]@users.noreply.github.com> --- .../dynamic-sampling/the-big-picture.mdx | 2 +- develop-docs/sdk/telemetry/traces/index.mdx | 2 +- docs/concepts/key-terms/enrich-data/index.mdx | 4 +- docs/concepts/key-terms/extrapolation.mdx | 4 +- docs/concepts/key-terms/key-terms.mdx | 2 +- .../key-terms/tracing/distributed-tracing.mdx | 2 +- .../search/searchable-properties/events.mdx | 4 +- .../search/searchable-properties/index.mdx | 30 +- .../search/searchable-properties/logs.mdx | 209 ++ .../search/searchable-properties/metrics.mdx | 149 ++ docs/get-started/guides/custom-spans.mdx | 4 +- docs/get-started/guides/querying-traces.mdx | 2 +- docs/product/dashboards/index.mdx | 2 +- .../dashboards/widget-builder/index.mdx | 4 +- docs/product/drains/openrouter.mdx | 2 +- docs/product/errors/index.mdx | 15 +- docs/product/explore/dropped-data.mdx | 1857 +++++++++++++++++ .../img/Trace_explorer_ingestion_delay.png | Bin 0 -> 101783 bytes docs/product/explore/index.mdx | 94 + docs/product/index.mdx | 12 +- docs/product/logs/index.mdx | 14 +- docs/product/metrics/index.mdx | 14 +- .../uptime-monitoring/uptime-tracing.mdx | 2 +- docs/product/profiling/index.mdx | 2 +- docs/product/releases/index.mdx | 2 +- .../sentry-basics/performance-monitoring.mdx | 4 +- docs/product/session-replay/index.mdx | 2 + docs/product/trace-explorer/index.mdx | 46 +- includes/ai-dashboards/ai-spans-view.mdx | 2 +- includes/ai-dashboards/overview.mdx | 2 +- redirects.js | 8 - 31 files changed, 2400 insertions(+), 98 deletions(-) create mode 100644 docs/concepts/search/searchable-properties/logs.mdx create mode 100644 docs/concepts/search/searchable-properties/metrics.mdx create mode 100644 docs/product/explore/dropped-data.mdx create mode 100644 docs/product/explore/img/Trace_explorer_ingestion_delay.png create mode 100644 docs/product/explore/index.mdx diff --git a/develop-docs/application-architecture/dynamic-sampling/the-big-picture.mdx b/develop-docs/application-architecture/dynamic-sampling/the-big-picture.mdx index a2083ffc965a0..fc2e85afa733b 100644 --- a/develop-docs/application-architecture/dynamic-sampling/the-big-picture.mdx +++ b/develop-docs/application-architecture/dynamic-sampling/the-big-picture.mdx @@ -92,7 +92,7 @@ For more granular queries, **stored events are needed**. _The purpose of dynamic If Sentry applies a 1% dynamic sample rate, you can still receive accurate events per minute (SPM or TPM, depending on event type) and web vital quantiles through total event data backed by metrics. There is also a listing of each of these numbers by the transaction. -When you go into Trace Explorer or Errors, you might want to now split the data by a custom tag you’ve added to your events. This granularity is not offered by metrics, so **these queries need to use stored events**. +When you go into Explore → Traces or Errors, you might want to now split the data by a custom tag you’ve added to your events. This granularity is not offered by metrics, so **these queries need to use stored events**. diff --git a/develop-docs/sdk/telemetry/traces/index.mdx b/develop-docs/sdk/telemetry/traces/index.mdx index 442192074fb1b..deeb0e8966f62 100644 --- a/develop-docs/sdk/telemetry/traces/index.mdx +++ b/develop-docs/sdk/telemetry/traces/index.mdx @@ -161,7 +161,7 @@ In memory, spans build up a conceptual tree of timed operations. We call the who Over the wire, transactions are serialized to JSON as an augmented `Event`, and sent as envelopes. The different envelope types are for optimizing ingestion (so we can route "transaction events" differently than other events, mostly "error events"). -In the Sentry UI, you can use Errors and Trace Explorer to look at error and performance events, and the Issues section to dive into grouped errors. The [user-facing tracing documentation](https://docs.sentry.io/concepts/key-terms/tracing/distributed-tracing/) explains more of the concepts on the product level. +In the Sentry UI, you can use Errors and Explore → Traces to look at error and performance events, and the Issues section to dive into grouped errors. The [user-facing tracing documentation](https://docs.sentry.io/concepts/key-terms/tracing/distributed-tracing/) explains more of the concepts on the product level. The [Span](/sdk/foundations/transport/event-payloads/span/) class stores each individual span in a trace. diff --git a/docs/concepts/key-terms/enrich-data/index.mdx b/docs/concepts/key-terms/enrich-data/index.mdx index 126206be14e65..7a1c51481a239 100644 --- a/docs/concepts/key-terms/enrich-data/index.mdx +++ b/docs/concepts/key-terms/enrich-data/index.mdx @@ -60,11 +60,11 @@ Learn more in [Search](/concepts/search/). ### Explore -Explore is a powerful query engine that builds upon your data, allowing you to reveal patterns, anomalies, and deeper insights in the health of your entire system. With this in mind, the more (custom) data you bring into Sentry, the more flexibility you'll gain in building queries that address your environments, releases, custom development, and business characteristics. Sentry supports telemetry data from a wide range of sources, like [errors](/product/errors/), [traces and spans](/product/trace-explorer/), [logs](/product/logs/), [session replays](/product/session-replay/web/), and [application metrics](/product/metrics/). +[Explore](/product/explore/) queries your telemetry, including [errors](/product/errors/), [traces and spans](/product/trace-explorer/), [logs](/product/logs/), [session replays](/product/session-replay/web/), and [application metrics](/product/metrics/). The more custom data you send, the more specific those queries can be: environment, release, and your own tags. For instance, a Traces query can display all the spans that occurred in the _production environment_, aggregated by the _customer-type custom tag_, and ordered by _p90(span.duration)_. -Learn more in [Traces and Spans](/product/trace-explorer/). +Learn more in [Explore](/product/explore/). ### Ownership Rules diff --git a/docs/concepts/key-terms/extrapolation.mdx b/docs/concepts/key-terms/extrapolation.mdx index 9a58720d5c043..ab5721785d4b7 100644 --- a/docs/concepts/key-terms/extrapolation.mdx +++ b/docs/concepts/key-terms/extrapolation.mdx @@ -74,11 +74,11 @@ Extreme values like `min` and `max` aren't extrapolated because they're less sta While extrapolation is usually helpful, if you are exclusively looking to confirm your sampling usage or look exclusively at sampled data, you can turn off extrapolation. -You can disable extrapolation using the settings icon above charts in tools like Trace Explorer. Note that with extrapolation off, your metrics will only reflect the sampled data, not your full traffic. +You can disable extrapolation using the settings icon above charts in [Explore → Traces](/product/trace-explorer/). Note that with extrapolation off, your metrics will only reflect the sampled data, not your full traffic. If Sentry displays a **low confidence warning**, it means there isn't enough sampled data for reliable extrapolation. Consider increasing your sample rate or widening your query filters. -![Trace Explorer low samples warning =500x](./img/Trace_explorer_low_samples.png) +![Low sampling rate warning in Traces =500x](./img/Trace_explorer_low_samples.png) diff --git a/docs/concepts/key-terms/key-terms.mdx b/docs/concepts/key-terms/key-terms.mdx index 85b7a9dd284ef..eba65cf602d10 100644 --- a/docs/concepts/key-terms/key-terms.mdx +++ b/docs/concepts/key-terms/key-terms.mdx @@ -54,7 +54,7 @@ Each of these key features have their own page (or set of pages) in the [sentry. - **Projects** - Lists the projects of which you're a member, by team, and provides you with a high-level overview of your projects. From here, you can go to the **Project Details** page of each project for a more granular view. Learn more in the full [Projects documentation](/product/projects/). -- **Explore** - Sentry offers multiple ways to search and investigate your application's data — including your app's [errors](/product/errors/), [traces](/product/trace-explorer/), [metrics](/product/metrics/), [profiles](/product/profiling/), [replays](/product/session-replay/), and [logs](/product/logs/) — to get the information you need to debug issues more quickly and easily. +- **[Explore](/product/explore/)** - Sentry's home to search and investigate your application's data, including [errors](/product/errors/), [traces](/product/trace-explorer/), [metrics](/product/metrics/), [profiles](/product/profiling/), [replays](/product/session-replay/), and [logs](/product/logs/). - **Pre-built Sentry Dashboards** - Sentry surfaces insights that can help you identify opportunities at the service-level to improve various parts of your app's performance, including requests, assets, caches, queues, and more. Pre-built Sentry Dashboards living under the Dashboards heading provide an overview of how your project is performing in various categories, as well as the ability to review sample events and their traces to help you diagnose potential problems. Learn more in the full [Sentry Dashboards documentation](/product/dashboards/sentry-dashboards/). diff --git a/docs/concepts/key-terms/tracing/distributed-tracing.mdx b/docs/concepts/key-terms/tracing/distributed-tracing.mdx index 11424e7d71bf9..ccf1ae1c6ac19 100644 --- a/docs/concepts/key-terms/tracing/distributed-tracing.mdx +++ b/docs/concepts/key-terms/tracing/distributed-tracing.mdx @@ -240,6 +240,6 @@ Dynamic sampling ensures complete traces by retaining all transactions associate ## Viewing Trace Data -Use the [Trace Explorer](/product/trace-explorer/) to search for traces containing spans that meet your specific query conditions. This helps you find distributed traces that give you a connected view of your application and can help you debug and optimize your code. +Use [Explore → Traces](/product/trace-explorer/) to search for traces containing spans that meet your specific query conditions. This helps you find distributed traces that give you a connected view of your application and can help you debug and optimize your code. Through [Dashboards](/product/dashboards/sentry-dashboards/) and [Traces](/product/trace-explorer/), you can also view trace data in the [Trace View](/concepts/key-terms/tracing/trace-view/) page. diff --git a/docs/concepts/search/searchable-properties/events.mdx b/docs/concepts/search/searchable-properties/events.mdx index 5e3f246e714c0..11f7337bf9421 100644 --- a/docs/concepts/search/searchable-properties/events.mdx +++ b/docs/concepts/search/searchable-properties/events.mdx @@ -8,8 +8,8 @@ Events are the underlying event data captured using Sentry SDKs — that is, err You can search by event properties in the following [sentry.io](https://sentry.io) pages: -- Errors - in the query builder -- Trace Explorer - in the query builder +- Explore → Errors - in the query builder +- Explore → Traces - in the query builder - Dashboards - within the widget builder (depending on dataset selection) - Issues - as indicated in the list below - Alerts - when creating an alert diff --git a/docs/concepts/search/searchable-properties/index.mdx b/docs/concepts/search/searchable-properties/index.mdx index 952c2276d3b71..a6081df623ee0 100644 --- a/docs/concepts/search/searchable-properties/index.mdx +++ b/docs/concepts/search/searchable-properties/index.mdx @@ -4,22 +4,34 @@ description: "Learn more about searchable properties." sidebar_order: 10 --- -Sentry's search provides you with reserved keywords, like `is`, `user`, `server`, and `browser`, that you can use to search on the properties of issues, events and replays (as well as the special case of releases). You can also create [custom tags](#custom-tags) on which to search. This page provides guidance for how to use these properties and links you to the respective searchable property lists. +Search keys depend on the dataset. A key that works on Errors can be invalid on Logs. This page links each place you search to the property list for that dataset. You can also search [custom tags](#custom-tags) and any attribute you attach in the SDK. ## Search Properties -Sentry's searchable properties fall into one of five categories: +### Explore -- [Issue properties](/concepts/search/searchable-properties/issues/) -- [Event properties](/concepts/search/searchable-properties/events/) -- [Span properties](/concepts/search/searchable-properties/spans/) -- [Session Replay properties](/concepts/search/searchable-properties/session-replay/) -- [User Feedback properties](/concepts/search/searchable-properties/user-feedback/) -- [Release properties](/concepts/search/searchable-properties/releases/) +[Explore](/product/explore/) uses one search syntax and a different property list per dataset. + +- **Traces** use [span properties](/concepts/search/searchable-properties/spans/). +- **Logs** use [log properties](/concepts/search/searchable-properties/logs/). +- **Application Metrics** use [metric properties](/concepts/search/searchable-properties/metrics/). +- **Errors** use [event properties](/concepts/search/searchable-properties/events/). +- **Replays** use [session replay properties](/concepts/search/searchable-properties/session-replay/). +- **Releases** use [release properties](/concepts/search/searchable-properties/releases/). +- **Agents** use [span properties](/concepts/search/searchable-properties/spans/). Agent fields are attributes on spans. + +Profiles is a browse page. It does not have its own property list. + +### Issues and User Feedback + +Issues and User Feedback each have their own keys. + +- **Issues** uses [issue properties](/concepts/search/searchable-properties/issues/). +- **User Feedback** uses [user feedback properties](/concepts/search/searchable-properties/user-feedback/). ## Search Tips -Search terms should auto-complete, and when they don't that means you have an invalid dataset. If you enter an invalid search term and tap Return or Enter, an error message is displayed. For example, in **Errors** or **Trace Explorer**, you cannot search using a grouping function (properties with a parentheses in the key, for example `epm()`) if you don't already have a grouping function included in the "Results" table columns. +Search terms should auto-complete, and when they don't that means you have an invalid dataset. If you enter an invalid search term and tap Return or Enter, an error message is displayed. For example, in **Errors** or **Traces**, you cannot search using a grouping function (properties with a parentheses in the key, for example `epm()`) if you don't already have a grouping function included in the "Results" table columns. When you search using a property that's a function, if the key includes a parameter, you still need to add a filter or value to have a complete search token. For example, the function `count_unique(field)` takes whichever field you choose as the parameter and then you add a number as your value to filter on. So a typical search might look like: `count_unique(user):>=20`. diff --git a/docs/concepts/search/searchable-properties/logs.mdx b/docs/concepts/search/searchable-properties/logs.mdx new file mode 100644 index 0000000000000..d3cee47b93663 --- /dev/null +++ b/docs/concepts/search/searchable-properties/logs.mdx @@ -0,0 +1,209 @@ +--- +title: Log Properties +description: "Learn more about searchable log properties." +sidebar_order: 22 +--- + +Search logs in [Explore → Logs](/product/logs/). The keys below are common properties set by Sentry or the SDKs. Any custom attribute you attach on the log is searchable too, using the same attribute name you set in the SDK. + +Raw text search matches `message` only. It does not search the rest of the log. Search is case sensitive by default. Use the **Ignore case** toggle in the search bar to match regardless of case. A regular expression uses `message://pattern//`. See [regular expressions](/concepts/search/#regular-expressions-logs-only). + +## Searchable Properties + +These keys can be used in a log search: + + + +### `message` + +The log message body. + +- **Type:** string + +### `message.template` + +The parameterized template, when the SDK recorded one. For example, `Adding item {item} for user {user}`. + +- **Type:** string + +### `message.parameter.` + +One parameter from a parameterized message. `` is the parameter name or the positional index, such as `message.parameter.item` or `message.parameter.0`. + +- **Type:** string or number, depending on the value the SDK sent + +### `severity` + +The severity text. One of `trace`, `debug`, `info`, `warn`, `error`, or `fatal`. + +- **Type:** string + +### `severity_number` + +The numeric severity. Higher numbers are more severe. SDKs set the low end of each range: `trace` is 1, `debug` is 5, `info` is 9, `warn` is 13, `error` is 17, and `fatal` is 21. + +- **Type:** number + +### `timestamp` + +When the log was recorded. + +- **Type:** datetime + +### `trace` + +The trace ID for the active trace when the log was recorded. + +- **Type:** string + +### `span_id` + +The span the log was emitted from. Empty when no span was active. Older SDKs send the same value as `trace.parent_span_id`. + +- **Type:** string + +### `id` + +The log's unique ID. + +- **Type:** string + +### `project` + +The project the log belongs to. You can also scope projects with the page filter. + +- **Type:** string + +### `environment` + +The environment set in the SDK, such as `development`, `staging`, or `production`. [Learn more](/concepts/key-terms/environments/). + +- **Type:** string + +### `release` + +The release set in the SDK. `release:latest` selects the most recent release. [Learn more](/product/releases/usage/sorting-filtering/#latest-release). + +- **Type:** string + +### `logger.name` + +The name of the logger that emitted the log, when the SDK or logging integration set one. + +- **Type:** string + +### `origin` + +Set when an SDK integration captured the log. For example, `auto.log.serilog` or `auto.db.prisma`. Direct calls to the Sentry logger API do not set this. + +- **Type:** string + +### `sdk.name` + +Name of the Sentry SDK that sent the log. + +- **Type:** string + +### `sdk.version` + +Version of the Sentry SDK that sent the log. + +- **Type:** string + +### `payload_size` + +Size of the log payload, in bytes. + +- **Type:** number + +### `replay.id` + +The ID of the active replay when the log was recorded. + +- **Type:** string + +### `browser.name` + +Display name of the browser. Relay parses this from the user agent when the SDK does not set it. + +- **Type:** string + +### `browser.version` + +Version of the browser. + +- **Type:** string + +### `user.id` + +Application-specific identifier for the user. Sent when [send default PII](/platform-redirect/?next=/data-management/data-collected/) is enabled, or when you set it yourself. + +- **Type:** string + +### `user.email` + +Email address of the user. + +- **Type:** string + +### `user.name` + +Username of the user. + +- **Type:** string + +### `server.address` + +Server address. Backend SDKs attach this. + +- **Type:** string + +### `os.name` + +Operating system name. Mobile, desktop, and native SDKs attach this. + +- **Type:** string + +### `os.version` + +Operating system version. + +- **Type:** string + +### `device.brand` + +Device brand. + +- **Type:** string + +### `device.model` + +Device model. + +- **Type:** string + +### `device.family` + +Device family. + +- **Type:** string + +### `code.file.path` + +File path captured with the log, when the SDK recorded a code location. + +- **Type:** string + +### `code.function.name` + +Function name captured with the log. + +- **Type:** string + +### `code.line.number` + +Line number captured with the log. + +- **Type:** number + + diff --git a/docs/concepts/search/searchable-properties/metrics.mdx b/docs/concepts/search/searchable-properties/metrics.mdx new file mode 100644 index 0000000000000..5a6100505fb07 --- /dev/null +++ b/docs/concepts/search/searchable-properties/metrics.mdx @@ -0,0 +1,149 @@ +--- +title: Metric Properties +description: "Learn more about searchable application metric properties." +sidebar_order: 23 +--- + +Search application metrics in [Explore → Metrics](/product/metrics/). Pick the metric in the metric selector, then filter with the keys below. Any custom attribute you attach on the metric is searchable too, using the same attribute name you set in the SDK. + +The metric selector sets `metric.name`, `metric.type`, and `metric.unit` for you, so the search bar doesn't suggest those keys. + +## Searchable Properties + +These keys can be used in a metric search: + + + +### `metric.name` + +The metric identifier, such as `checkout.failed` or `queue.depth`. + +- **Type:** string + +### `metric.type` + +The metric type. One of `counter`, `gauge`, or `distribution`. + +- **Type:** string + +### `metric.unit` + +Unit of measurement, such as `millisecond`, `byte`, or `ratio`. SDKs can also send custom units. Empty or `none` when the SDK did not set one. + +- **Type:** string + +### `value` + +The numeric value. For a counter, this is the amount added. For a gauge, this is the current value. For a distribution, this is one measured value. + +- **Type:** number + +### `timestamp` + +When the metric was recorded. + +- **Type:** datetime + +### `trace` + +The trace ID for the active trace when the metric was recorded. Every metric has a trace ID, but metrics are often sampled at 100% while traces are sampled at a lower rate, so the trace itself may not have been stored. + +- **Type:** string + +### `sentry.span_id` + +The span the metric was recorded on. Empty when no span was active. + +- **Type:** string + +### `trace.parent_span_id` + +The parent span ID sent by some SDKs for the same association as `sentry.span_id`. + +- **Type:** string + +### `transaction` + +The name of the transaction or segment that was active when the metric was recorded, when the SDK set one. + +- **Type:** string + +### `id` + +The metric event's unique ID. + +- **Type:** string + +### `project` + +The project the metric belongs to. You can also scope projects with the page filter. + +- **Type:** string + +### `environment` + +The environment set in the SDK, such as `development`, `staging`, or `production`. [Learn more](/concepts/key-terms/environments/). + +- **Type:** string + +### `release` + +The release set in the SDK. [Learn more](/product/releases/). + +- **Type:** string + +### `sdk.name` + +Name of the Sentry SDK that sent the metric. + +- **Type:** string + +### `sdk.version` + +Version of the Sentry SDK that sent the metric. + +- **Type:** string + +### `replay.id` + +The ID of the active replay when the metric was recorded. + +- **Type:** string + +### `browser.name` + +Display name of the browser. Relay parses this from the user agent when the SDK does not set it. + +- **Type:** string + +### `browser.version` + +Version of the browser. + +- **Type:** string + +### `user.id` + +Application-specific identifier for the user. Sent when [send default PII](/platform-redirect/?next=/data-management/data-collected/) is enabled, or when you set it yourself. + +- **Type:** string + +### `user.email` + +Email address of the user. + +- **Type:** string + +### `user.name` + +Username of the user. + +- **Type:** string + +### `server.address` + +Server address. Backend SDKs attach this. + +- **Type:** string + + diff --git a/docs/get-started/guides/custom-spans.mdx b/docs/get-started/guides/custom-spans.mdx index 1118953c03cf7..44d06cc77c932 100644 --- a/docs/get-started/guides/custom-spans.mdx +++ b/docs/get-started/guides/custom-spans.mdx @@ -89,7 +89,7 @@ span.finish() transaction.finish() ``` -Numeric attributes become metrics you can aggregate with `sum()`, `avg()`, `p90()` in [Trace Explorer](https://sentry.io/orgredirect/organizations/:orgslug/explore/traces/). +Numeric attributes become metrics you can aggregate with `sum()`, `avg()`, `p90()` in [Explore → Traces](https://sentry.io/orgredirect/organizations/:orgslug/explore/traces/). ## Where to Add Spans @@ -769,4 +769,4 @@ transaction.finish() ## Next Steps -Explore the [Trace Explorer product walkthrough](/product/trace-explorer/) to learn more about the Sentry interface and discover additional tips. +See [Traces and Spans](/product/trace-explorer/) for how to query this data in Explore, and [Explore](/product/explore/) for the controls shared with other datasets. diff --git a/docs/get-started/guides/querying-traces.mdx b/docs/get-started/guides/querying-traces.mdx index e2fcaccf4a955..f9b58a99be446 100644 --- a/docs/get-started/guides/querying-traces.mdx +++ b/docs/get-started/guides/querying-traces.mdx @@ -92,5 +92,5 @@ To see an example of querying traces, check out how to query your slowest endpoi ## Next Steps -Explore the [Trace Explorer product walkthrough guides](/product/trace-explorer/) to learn more about the Sentry interface and discover additional tips. +See [Traces and Spans](/product/trace-explorer/) for how to query this data in Explore, and [Explore](/product/explore/) for the controls shared with other datasets. diff --git a/docs/product/dashboards/index.mdx b/docs/product/dashboards/index.mdx index b2b11ee040df5..625dc8bf98d80 100644 --- a/docs/product/dashboards/index.mdx +++ b/docs/product/dashboards/index.mdx @@ -39,7 +39,7 @@ You can make [custom dashboards](/product/dashboards/custom-dashboards/) by dupl ## Open Dashboard Widgets in Explore and Issues -Each dashboard [widget](/product/dashboards/widget-builder/) has an ellipsis that opens a context menu. From here, depending on the type of data the widget shows, you can open the widget in different explorers: [Errors](/product/errors/), [Traces](/product/trace-explorer/), [Logs](/product/logs/), [Session Replays](/product/session-replay/web/), and [Metrics](/product/metrics/) to get more information. +Each dashboard [widget](/product/dashboards/widget-builder/) has an ellipsis that opens a context menu. From here, depending on the type of data the widget shows, you can open the widget in [Explore](/product/explore/): [Errors](/product/errors/), [Traces](/product/trace-explorer/), [Logs](/product/logs/), [Session Replays](/product/session-replay/web/), and [Metrics](/product/metrics/). ## Widget Viewer diff --git a/docs/product/dashboards/widget-builder/index.mdx b/docs/product/dashboards/widget-builder/index.mdx index feb02e0922512..cac9c83eb1b57 100644 --- a/docs/product/dashboards/widget-builder/index.mdx +++ b/docs/product/dashboards/widget-builder/index.mdx @@ -40,7 +40,7 @@ Choosing "Logs" allows you to query and aggregate structured log data from your - Logs filtered by severity level or custom attributes - Trends in application state or business events -You can create log-based widgets from [Logs Explorer](/product/logs/) queries. +You can create log-based widgets from [Explore → Logs](/product/logs/) queries. ### Application Metrics @@ -71,7 +71,7 @@ Choosing "Releases (sessions, crash rates)" allows you to query properties speci ### Transactions (Deprecated) -Transactions are deprecated in favor of spans. Use the [Spans](#spans) dataset for new widgets, or explore performance data in [Trace Explorer](/product/trace-explorer/). +Transactions are deprecated in favor of spans. Use the [Spans](#spans) dataset for new widgets, or query performance data in [Explore → Traces](/product/trace-explorer/). Choosing "Transactions" allows you to query and aggregate transaction events. This data is comprised of events that track the performance of operations in your application. diff --git a/docs/product/drains/openrouter.mdx b/docs/product/drains/openrouter.mdx index cf5c240e4e83c..c520f886908d9 100644 --- a/docs/product/drains/openrouter.mdx +++ b/docs/product/drains/openrouter.mdx @@ -55,4 +55,4 @@ ___DSN___ ## Step 5: Verify traces in Sentry -Make an API request through OpenRouter and view the trace in Sentry's [Trace Explorer](/product/trace-explorer/). It may take a few minutes for traces to appear. +Make an API request through OpenRouter and view the trace in [Explore → Traces](/product/trace-explorer/). It may take a few minutes for traces to appear. diff --git a/docs/product/errors/index.mdx b/docs/product/errors/index.mdx index fde6fc8a9e296..0eb8776565579 100644 --- a/docs/product/errors/index.mdx +++ b/docs/product/errors/index.mdx @@ -9,13 +9,9 @@ description: >- ## Overview -The [**Errors**](https://sentry.io/orgredirect/organizations/:orgslug/explore/errors/homepage/) page lets you query all of your error event metadata across projects and environments. You can build custom queries with flexible filters, group and stack results, visualize trends over time, and save queries for reuse by your team. +Errors are a dataset in [Explore](/product/explore/). The [**Errors**](https://sentry.io/orgredirect/organizations/:orgslug/explore/errors/) page queries error event metadata across projects and environments. Build a query with filters, group and stack results, and chart trends over time. -While [Issues](/product/issues/) groups related error events for triage and resolution, the Errors page gives you a powerful way to ask questions across all your error data at once, surfacing patterns and trends that individual issues may not reveal. - - - Your plan type determines your query window: Developer: 7 days | Team: 14 days | Business: 30 days. - +[Issues](/product/issues/) groups related error events for triage. Use Errors to look across all of those events at once, including patterns that a single issue does not show. The [query window](/product/explore/#query-window) depends on your plan. ## Searching and Filtering @@ -34,9 +30,7 @@ Use `OR` and `AND` between filters. Note that `OR` cannot be used between aggreg You can search multiple values for the same key by putting them in a list. For example, `x:[value1, value2]` returns the same results as `x:value1 OR x:value2`. Learn more about [Multiple Values on the Same Key](/concepts/search/#multiple-values-on-the-same-key). -### Filter by Project, Environment, and Date Range - -Use the common filters at the top of the page to scope your query by project, environment, and date range. +Project, environment, and date range filters at the top of the page scope the query. See [Page Filters](/product/explore/#page-filters). ### Tag Summary Filters @@ -101,7 +95,6 @@ Click a column header to sort. A down arrow sorts descending, an up arrow sorts You can save any of your queries by clicking the **Save As** button in the top right. Name your query, and you can then update it or find it later in the All or Starred Queries sections. - ### Add to Dashboard Queries can be added to [custom dashboards](/product/dashboards/custom-dashboards/) as widgets. Open the context menu on the query card or within the query results view and click "Add to Dashboard". Name your widget, select the target dashboard, and save. @@ -112,7 +105,7 @@ Customize your default view by configuring a query with specific columns, charts ### Export CSV -Click "Export Data" to download a CSV file of the results. For large exports, you'll receive an email with the download link. The results are limited to 10 million rows or 1 GB, whichever comes first. +Click **Export** to download a CSV of the results. For large exports, you'll receive an email with the download link. The results are limited to 10 million rows or 1 GB, whichever comes first. Other datasets use different formats and limits. See [Save a Query](/product/explore/#save-a-query). The download includes a `SHA1` checksum you can use to verify integrity: diff --git a/docs/product/explore/dropped-data.mdx b/docs/product/explore/dropped-data.mdx new file mode 100644 index 0000000000000..0f30339ca24b2 --- /dev/null +++ b/docs/product/explore/dropped-data.mdx @@ -0,0 +1,1857 @@ +--- +title: Investigate Dropped Data in Sentry +sidebar_title: Dropped Data +sidebar_order: 1 +description: >- + Learn how to investigate and troubleshoot dropped data in Sentry. +--- + + + +When data is ingested into Sentry, it can be dropped intentionally or unintentionally for a number of reasons. Sample rate (most commonly on purpose), queue overflow, inbound filters, and invalid or malformed data are some top examples for why data might be dropped. + +## Troubleshooting Dropped Data +Traces, Logs, and Application Metrics charts in [Explore](/product/explore/) can show data that Sentry did not store. Hover over the dropped data line at the bottom of the chart to see the summary. Click on the line to see the details and troubleshoot. + +The dropped data line leaves out data you chose to drop: everything in [Client Sampled](#category-client-sampled) and [Inbound Filters](#category-inbound-filters), plus [Disallowed Origin](#disallowed-origin), [Missing Signature](#missing-signature), and [DSN Rate Limit](#dsn-rate-limit). These reasons still appear in the details list. + +Below are all the possible reasons why data might be dropped. They correspond with the title you will see when exploring dropped data in Sentry. + +Each reason includes what happened, why it happens, and what to change so less data is dropped. Reasons marked **Legacy** are no longer reported by current Sentry ingestion, so you'll only see them in older data. + +### Category: Client Sampled + +The SDK dropped the data on purpose, because of your configuration or an SDK default. In Sentry, these reasons currently appear under **Client Discard**. + +#### Dropped by Before Send + +Reason code: `before_send`. + +Your [`beforeSend`](/platform-redirect/?next=/configuration/options/#beforeSend) function omitted the event. If that was not intentional, check your Sentry config. + +Before JavaScript SDK v11, spans dropped by [`ignoreSpans`](/platform-redirect/?next=/configuration/options/#ignoreSpans) are also reported under this reason. Starting with v11, they're reported as [Dropped by Ignored Spans](#dropped-by-ignored-spans). + +- **Short:** Event dropped by your before send function. See [`beforeSend`](/platform-redirect/?next=/configuration/options/#beforeSend). +- **Causes:** + - Your before-send filter is behaving as written. + - Before JavaScript SDK v11, [`ignoreSpans`](/platform-redirect/?next=/configuration/options/#ignoreSpans) omitted spans before they were sent. + - Application code in a before-send hook returned `false` or `null`. +- **Actions:** + - Update [`ignoreSpans`](/platform-redirect/?next=/configuration/options/#ignoreSpans) if it is blocking spans you want to receive. + - Correct before-send logic that is omitting spans unintentionally. + +#### Dropped by Ignored Spans + +Reason code: `ignored`. + +Spans matched an ignore rule in your SDK configuration and were not sent. See [`ignoreSpans`](/platform-redirect/?next=/configuration/options/#ignoreSpans). + +{/* TODO: Update this copy when SDK versions that emit ignored are widely adopted. */} + +This reason is only reported in span-first mode, which is the default starting with JavaScript SDK v11. In earlier versions, ignored spans are reported as [Dropped by Before Send](#dropped-by-before-send). + +- **Short:** Span dropped by your ignored spans configuration. See [`ignoreSpans`](/platform-redirect/?next=/configuration/options/#ignoreSpans). +- **Causes:** + - [`ignoreSpans`](/platform-redirect/?next=/configuration/options/#ignoreSpans) omitted specific spans before they were sent to Sentry. +- **Actions:** + - Update [`ignoreSpans`](/platform-redirect/?next=/configuration/options/#ignoreSpans) if it is blocking spans you want to receive. + +#### Dropped by Sample Rate + +Reason code: `sample_rate`. + +Events were dropped because of the sample rate configured in the SDK. + +- **Short:** Event dropped by your configured sample rate. +- **Causes:** + - The sample rate in your SDK config. See [`tracesSampleRate`](/platform-redirect/?next=/configuration/options/#tracesSampleRate). +- **Actions:** + - Raise the sample rate if you want more events sampled. + +#### Missing Parent Span + +Reason code: `no_parent_span`. + +Your SDK skipped a span because no parent span was active when it started. For automatically traced `fetch` and XHR requests, this is default SDK behavior. + +- **Short:** Span skipped because no parent span was active. +- **Causes:** + - A `fetch` or XHR request ran while no span was active. The JavaScript SDK skips those request spans by default. + - Your code started a span with the `onlyIfParent` option while no parent span was active. +- **Actions:** + - For automatic `fetch` and XHR spans, you usually don't need to do anything. + - Wrap the work in a parent span if you need it traced. + +#### Event Processor + +Reason code: `event_processor`. + +Your SDK dropped data in an event processor, a step that can change or discard data before it's sent. This includes filters you configure, your own custom event processors, and built-in ones like the Dedupe integration. + +- **Short:** Dropped by an SDK event processor. +- **Causes:** + - In JavaScript, the event matched your [`ignoreErrors`](/platform-redirect/?next=/configuration/options/#ignoreErrors) or [`ignoreTransactions`](/platform-redirect/?next=/configuration/options/#ignoreTransactions) filter, or a custom event processor you added discarded it. + - A built-in default dropped it. For example, the Dedupe integration removed a duplicate, or the JavaScript SDK filtered a known noisy error or an error with no message, type, or stack trace. + - In the Cocoa SDK, a profile had fewer than two samples. +- **Actions:** + - If the drops are unexpected, review your `ignoreErrors`, `ignoreTransactions`, and custom event processors. + - If you need that data, turn off the Dedupe integration or the JavaScript SDK's default filters in your SDK setup. + - For Cocoa profiles with too few samples, you usually don't need to do anything. + +### Category: Client Discard + +The SDK dropped the data before it left your application. + +#### SDK Backpressure Drop + +Reason code: `backpressure`. + +Your SDK detected that it was under load and reduced trace sampling so telemetry processing would not add pressure on your application. The discarded spans never left your application. + +- **Short:** SDK reduced trace sampling under load. +- **Causes:** + - A slow or degraded network path to Sentry, so telemetry builds up faster than the SDK can send it. + - The application is producing an unusually large amount of tracing data, such as a traffic spike or an N+1 query that generates many spans. + - The application or runtime is under resource pressure, so the SDK cannot process and send telemetry quickly enough. +- **Actions:** + - Check for unusual increases in application traffic or span volume around the time backpressure occurred. + - Look for instrumentation that produces unexpectedly large numbers of spans, such as N+1 queries, tight loops, or high-frequency operations. + +#### SDK Queue Overflow + +Reason code: `queue_overflow`. + +Your application is generating events faster than the SDK can buffer and send them. The SDK allows a limited number of operations in flight at once. Beyond that, new events are dropped immediately rather than queued. + +- **Short:** SDK's send queue was full. +- **Causes:** + - Application code sending events in a tight loop, for example an exception inside a `while` loop. + - Requests to Sentry are slow or hanging. A proxy, firewall, misconfigured Relay, or a request without a timeout can cause this. +- **Actions:** + - Confirm that requests to Sentry are completing. + - Look for suspect code, including async work that does not finish inside [`beforeSend`](/platform-redirect/?next=/configuration/options/#beforeSend) filters. + - If this volume of events is expected, [contact Sentry support](https://www.sentry.help/en/). + +#### SDK Buffer Overflow + +Reason code: `buffer_overflow`. + +A fixed-size in-memory buffer in the SDK reached its limit and dropped data. This is most often a session replay that exceeded its size cap. + +- **Short:** SDK buffer filled before data could be sent. +- **Causes:** + - A replay grew larger than the maximum replay buffer before the SDK sent the final replay to Sentry. +- **Actions:** + - For replays, record less. Use [block or ignore](/platforms/javascript/session-replay/privacy/#blocking) to skip high-churn elements, `blockAllMedia` for heavy media, [`mutationLimit`](/platforms/javascript/session-replay/configuration/#mutation-limits) to cap mutation storms from animations or infinite scroll, and [`maxReplayDuration`](/platforms/javascript/session-replay/configuration/#general-integration-configuration) to shorten sessions. If canvas recording is enabled, lower its sampling rate and quality. + +#### Unretried Network Error + +Reason code: `network_error`. + +The request failed without a response. Ad blockers and browser extensions are a common cause. + +- **Short:** Request failed before reaching Sentry. +- **Causes:** + - **Browser:** Ad blockers, browser extensions, and similar client-side blockers. + - **Browser:** A CORS misconfiguration, the user being offline, or the page unloading before the request completes. + - **Server:** No outbound network access from the host or container, an egress firewall, a DNS failure, TLS errors from an intercepting proxy, or proxy settings the SDK is not using. +- **Actions:** + - For ad blockers, route events through your own domain with the [`tunnel` option](/platforms/javascript/troubleshooting/#using-the-tunnel-option). + - For browsers, confirm in devtools that requests to your ingest domain are not blocked, and check your CORS configuration. + - For servers, verify outbound connectivity to your ingest domain from the host or container. + +#### SDK Send Failure + +Reason code: `send_error`. + +The event reached Sentry and Sentry rejected it with an error status. + +- **Short:** Sentry rejected the event with an error response. +- **Causes:** + - Large `extra` or `contexts` data on events, such as full configuration objects or API responses, which can produce a `413`. + - Large attachments. +- **Actions:** + - Enable debug mode in your SDK and look for `Sentry responded with status code 413`. The log identifies which events were rejected. + - Reduce the size of those events. Trim large objects in [`beforeSend`](/platform-redirect/?next=/configuration/options/#beforeSend), and lower `maxValueLength`, `normalizeDepth`, or `maxBreadcrumbs` as needed. + +#### Cache Overflow + +Reason code: `cache_overflow`. + +Your SDK deleted data it had cached offline, usually the oldest items once the cache reached its limit. The offline cache holds data the SDK could not send yet, so long offline periods can fill it. + +- **Short:** SDK's offline cache was full. +- **Causes:** + - In the Java and Cocoa SDKs, the offline cache reached its `maxCacheItems` limit, so the oldest items were deleted. + - In the .NET SDK, sending a cached item failed with an unexpected error. +- **Actions:** + - Increase [`maxCacheItems`](/platform-redirect/?next=/configuration/options/#maxCacheItems) in your SDK options to keep more data while offline. + - Confirm the device can reach Sentry so cached data is sent before the cache fills. + +#### Internal SDK Error + +Reason code: `internal_sdk_error`. + +Your SDK dropped data because of an error inside the SDK itself, such as a Session Replay buffer or web worker failure, or a failure building the request to Sentry. + +- **Short:** SDK hit an internal error. +- **Causes:** + - In JavaScript, the Session Replay event buffer failed, for example because its web worker crashed. + - In Python, the async transport was called with no running event loop. This is often caused by app shutdown timing rather than an SDK bug. + - In Go, the SDK failed to build the payload or HTTP request to send to Sentry. +- **Actions:** + - Update to the latest version of your SDK. + - If you use Python's async transport, check whether the drops happen while your app is shutting down. + - [Contact Sentry support](https://www.sentry.help/en/) if it continues. + +#### Insufficient Data + +Reason code: `insufficient_data`. + +Your SDK dropped data that didn't have enough content to send, such as a profile with too few samples. This is often expected for very short operations. + +- **Short:** Not enough data to send. +- **Causes:** + - In the Python SDK, a profile captured fewer than two samples, usually because the profiled operation was very short. + - In the Cocoa SDK, a session replay could not be packaged for sending. + - In the Cocoa SDK, a user feedback submission was invalid. +- **Actions:** + - For very short profiled operations, you usually don't need to do anything. + - Update the Cocoa SDK if replays or feedback are being dropped. + - [Contact Sentry support](https://www.sentry.help/en/) if it continues. + +#### Failed SDK Validation + +Reason code: `invalid`. + +Your SDK dropped data that failed its own checks before sending, such as a replay that ran too long, a child span left open when its parent ended, or a malformed log or metric. The SDK made this decision, not Sentry's servers. + +- **Short:** Data failed the SDK's validation checks. +- **Causes:** + - In JavaScript, a child span was still open when its parent span ended. + - In JavaScript, a session replay passed its maximum duration by the time it was sent, often because the browser was suspended. + - In .NET, a structured log's message template failed to format, or a metric had an empty name or an unsupported value type. +- **Actions:** + - End child spans before ending their parent span. + - For overlong replays after a suspended browser, you usually don't need to do anything. + - Fix log message templates that fail to format, and metrics with an empty name or unsupported value type. + +#### Callback Error + +Reason code: `callback_error`. + +Your SDK dropped data because one of your callbacks, such as `beforeSend`, `tracesSampler`, or a custom event processor, threw an error while handling it. + +- **Short:** An SDK callback threw an error. +- **Causes:** + - A [`beforeSend`](/platform-redirect/?next=/configuration/options/#beforeSend) callback, or a similar hook for transactions, replays, feedback, logs, or metrics, threw an error. + - A [`tracesSampler`](/platform-redirect/?next=/configuration/options/#tracesSampler) function threw an error while making a sampling decision. + - A custom event processor threw an error while processing the event. +- **Actions:** + - Find the callback that threw and fix the error. An error in any of these callbacks drops the data. + +#### SDK Rate-Limit Backoff + +Reason code: `ratelimit_backoff`. + +Your SDK discarded data locally while backing off, usually because Sentry had earlier told it to pause sending that data type. The real cause is whatever triggered that original limit. + +- **Short:** SDK backed off due to a rate limit. +- **Causes:** + - Your organization ran out of quota for that data type, or [spike protection](#spike-protection) started during a sudden surge. + - Your [DSN rate limit](#dsn-rate-limit), your [project abuse limit](#project-abuse-limit), or a [generic rate limit](#generic-rate-limit) was hit. + - The SDK's own internal rate limiter dropped the data. +- **Actions:** + - Find which limit triggered the backoff, such as quota, spike protection, or a DSN rate limit, and fix it there. + - Reduce traffic, adjust sampling, or increase your quota so you stay within your limits. + - Avoid sudden event spikes, such as errors sent in a tight loop. + +### Category: Invalid or Malformed + +Sentry received the payload and could not accept it. + +#### Sentry Processing Error + +Reason code: `internal`. + +This indicates a bug or an infrastructure problem during ingestion. During healthy operation this count should be zero. + +- **Short:** Sentry failed to process the event. +- **Causes:** + - A problem in Sentry's ingestion service. +- **Actions:** + - Check the [Sentry status page](https://status.sentry.io/) for an ongoing incident. + - [Contact Sentry support](https://www.sentry.help/en/) if this happens at a high rate. + +#### Invalid Trace Context + +Reason code: `invalid_dsc`. + +The trace ID in the metadata header did not match the trace ID on the spans. + +- **Short:** Trace header did not match the spans sent. +- **Causes:** + - A custom implementation of Sentry's transport protocol. + - An outdated SDK. +- **Actions:** + - If you use an official Sentry SDK, upgrade to the latest version. This is not fixable through configuration. + - [Contact Sentry support](https://www.sentry.help/en/) if this continues after the upgrade. + +#### Missing Trace Context + +Reason code: `missing_dsc`. + +The envelope contained spans and no trace header. + +- **Short:** Envelope was missing the required trace header. +- **Causes:** + - An outdated SDK. + - A custom implementation of Sentry's transport protocol. +- **Actions:** + - If you use an official Sentry SDK, upgrade to the latest version. [Contact Sentry support](https://www.sentry.help/en/) if it continues. + - If you are not running a custom SDK and upgrading does not help, [contact Sentry support](https://www.sentry.help/en/). + +#### Malformed JSON Payload + +Reason code: `invalid_json`. + +Sentry could not parse the event that was sent. + +- **Short:** Event rejected due to invalid JSON. +- **Causes:** + - A truncated or incomplete payload. + - Unescaped control characters or non-UTF-8 bytes in string fields. + - A mismatch between the body encoding and the declared `Content-Encoding`. +- **Actions:** + - If you send payloads directly, log the raw body on failure and parse it locally. Confirm that envelope item length headers match the actual byte lengths. + - If you use an official Sentry SDK, upgrade to the latest version. [Contact Sentry support](https://www.sentry.help/en/) if it continues. + +#### Invalid Transaction Data + +Reason code: `invalid_transaction`. + +The transaction was valid JSON, but Sentry could not accept its contents. + +- **Short:** Transaction contained invalid data. +- **Causes:** + - Timestamps outside the accepted ingestion window. + - A negative duration, where the end timestamp is before the start timestamp. +- **Actions:** + - Verify clock synchronization (NTP) on the hosts that send the data. [Clock skew](/concepts/key-terms/tracing/distributed-tracing/#clock-skew) across machines can produce timestamps Sentry rejects. + - Check whether the affected transactions are backdated. Sentry does not ingest transactions older than the accepted window. See [How far back can errors and transactions be backdated?](https://www.sentry.help/en/articles/13964214-how-far-back-can-errors-and-transactions-be-backdated-when-uploaded-to-sentry) + +#### Invalid Timestamp + +Reason code: `timestamp`. + +Sentry dropped data because its timestamp was older than its retention period, or because a span had a missing start or end time, or an end time before its start. Only logs, spans, application metrics, and replays are dropped for an old timestamp. Future timestamps are shifted rather than dropped, and error events are never dropped for their timestamp. + +- **Short:** Event timestamp was too far in the past or future. +- **Causes:** + - Device or server clocks are set so far in the past that the data looks older than the retention period. + - Span instrumentation records a missing start or end time, or an end time earlier than the start time. + - A backlog in Sentry's ingestion pipeline held the data for more than 24 hours before it could be processed. +- **Actions:** + - Check that device and server clocks are set correctly. + - Make sure span instrumentation sets both a start and an end time, with the end after the start. + - [Contact Sentry support](https://www.sentry.help/en/) if drops spike with no clock or span problem on your side, since it may be an ingestion backlog. + +#### Disallowed Origin + +Reason code: `cors`. + +The request's `Origin` header, or its `Referer` header when there is no `Origin`, didn't match any entry in your project's [Allowed Domains](/concepts/data-management/filtering/#allowed-domains). Requests that send neither header always pass. Because this is a setting you control, it's left out of the dropped data line. + +- **Short:** Origin not in project's Allowed Domains. +- **Causes:** + - Your app runs on a domain that isn't in Allowed Domains, such as a new staging or production domain. + - A non-browser client sends a `Referer` header that doesn't match Allowed Domains. + - Allowed Domains is empty, which rejects every request that sends an `Origin` or `Referer`. +- **Actions:** + - Add the expected origin to your project's Allowed Domains. + - To accept data from any origin, set Allowed Domains back to `*`, which is the default. + - If you don't recognize the origin, leave the setting as is. The filter is working as intended. + +#### Invalid or Disabled Project + +Reason code: `project_id`. + +Sentry rejected the data because the project ID in your DSN didn't match its key, or because the project is disabled or the client key is disabled or deleted. Drops caused by a disabled project or key likely won't appear in your organization's stats. Only the ID mismatch case does. + +- **Short:** DSN mismatch or disabled project or key. +- **Causes:** + - The DSN's project ID doesn't belong to its key, for example because the DSN was mistyped or edited by hand. + - The client key in the DSN was disabled or deleted. + - The project the DSN points to was disabled. +- **Actions:** + - Copy the active DSN exactly as shown in [Client Keys (DSN)](https://sentry.io/orgredirect/organizations/:orgslug/settings/projects/:projectId/keys/). + - If you disabled the key or project on purpose, remove its DSN from any apps still using it. + +#### Invalid Event ID + +Reason code: `invalid_event_id`. + +Your SDK or upload code sent an item with a malformed or missing event ID, so Sentry couldn't accept it. This happens with attachments, user reports, and replays sent without an event ID, or with an upload whose `sentry[event_id]` form field can't be parsed. + +- **Short:** Event ID was malformed or missing. +- **Causes:** + - An outdated or custom SDK sends attachments, user reports, or replays without an event ID. + - Custom upload code sets a `sentry[event_id]` form field that isn't a valid event ID. +- **Actions:** + - Update your Sentry SDK to the latest version. + - If you upload files with custom code, set `sentry[event_id]` to a valid event ID. + +#### Request Too Large + +Reason code: `request_too_large`. + +Sentry rejected a whole request that was over the endpoint's size limit, or a batch of logs, spans, or metrics that needed more parsing work than Sentry allows. This is separate from the `too_large:` reasons, which drop individual items rather than the whole request. + +- **Short:** Request exceeded a size or parsing limit. +- **Causes:** + - A request is over the endpoint's size limit, for example an upload with oversized attachments. + - A batch of logs, spans, or metrics needs more parsing work than Sentry allows. +- **Actions:** + - Check for a matching `too_large:attachment` drop, which means oversized attachments caused the request to fail. + - Reduce attachment sizes or send less data per request. + - Send logs, spans, and metrics in smaller batches. + +#### Feature Disabled + +Reason code: `feature_disabled`. + +Sentry dropped data that relies on a feature that isn't enabled for your organization or project, such as PlayStation ingestion, resumable minidump uploads, or logs sent over OpenTelemetry (OTLP). Sentry controls these features, so you can't turn them on yourself. + +- **Short:** Feature not enabled for org or project. +- **Causes:** + - Your app sends data to the PlayStation endpoint before PlayStation ingestion is enabled for your organization. + - Your app sends logs over OTLP before log ingestion is enabled for your organization. + - Your app uses resumable minidump uploads before they're enabled for your project. +- **Actions:** + - Stop sending that data type if you don't need it. + - [Contact Sentry support](https://www.sentry.help/en/) if you expected the feature to be available. + +#### Duplicate ID + +Reason code: `duplicate`. + +A span was dropped because another span in the same envelope (the bundle of data an SDK sends in one request) had the same span ID. Sentry keeps the later span and drops the earlier one. + +- **Short:** Span ID repeated in the same envelope. +- **Causes:** + - Custom instrumentation reuses span IDs or generates them in a way that isn't unique. + - The same span is sent more than once in a single envelope. +- **Actions:** + - Make sure every span gets a unique span ID. + - Check custom instrumentation or exporters for code that sends the same span twice. + +#### Duplicate Envelope Item + +Reason code: `duplicate_item`. + +An envelope held more than one event or check-in, repeated or mixed log or span batches, repeated metric batches, or an invalid mix of replay items. Only the extra events and check-ins are dropped. For logs, spans, metrics, and replays, every item of that type in the envelope is dropped. + +- **Short:** Envelope had duplicate or mixed items. +- **Causes:** + - An outdated or custom SDK puts more than one event or check-in into one envelope. + - Custom code puts repeated or mixed log or span batches, or repeated metric batches, into one envelope. + - An envelope contains an invalid mix of replay items. +- **Actions:** + - Update your Sentry SDK to the latest version. + - If you build envelopes yourself, send at most one event or check-in, and at most one batch each of logs, spans, and metrics, per envelope. + +#### Unsupported Envelope Item + +Reason code: `invalid_envelope`. + +Sentry dropped an item that was not allowed or supported in the envelope it arrived in. Envelopes are the container format SDKs use to send events and related data to Sentry. + +- **Short:** Envelope item was not allowed or supported. +- **Causes:** + - Extra items in an error envelope that aren't supported alongside the error. These make up the counts you see. + - An outdated SDK putting items into an envelope that doesn't support them. + - Custom code that builds envelopes by hand with unknown item types. These are dropped but add nothing to the counts. +- **Actions:** + - Update your SDK. + - Fix any custom code that builds envelopes so it only includes supported items. + +#### No Data + +Reason code: `no_data`. + +Sentry dropped a span, log, or application metric because nothing valid was left after checking it against the expected format. This often happens when a required field is missing, so the whole item is removed. + +- **Short:** No valid data was left after validation. +- **Causes:** + - A span, log, or metric is missing a required field, which removes it during validation. + - An outdated SDK sends spans, logs, or metrics that don't match the expected format. +- **Actions:** + - Update your SDK. + - Check custom span, log, or metric instrumentation for missing required fields. + +#### Invalid Span + +Reason code: `invalid_span`. + +Sentry dropped a span that was missing required fields or had an invalid span ID or segment ID. This also covers spans taken from transactions that could not be converted. + +- **Short:** Span was missing fields or had a bad ID. +- **Causes:** + - Manual span instrumentation that leaves out the span ID or another required field. + - A span with an invalid segment ID. + - An outdated SDK sending spans without the required fields. +- **Actions:** + - Update your SDK. + - Fix manual span instrumentation so every span has a valid span ID, a valid segment ID, and its required fields. + +#### Invalid Log + +Reason code: `invalid_log`. + +Sentry dropped a log that was missing a required field, such as its timestamp or level, after normalization. Normalization is the step where Sentry cleans up incoming data before storing it. + +- **Short:** Log was missing a required field. +- **Causes:** + - An outdated SDK sending logs without a required field. + - Custom log ingestion code that leaves out the timestamp or level. +- **Actions:** + - Update your SDK. + - Fix custom log ingestion so every log includes a timestamp and level. + +#### Invalid Metric + +Reason code: `invalid_trace_metric`. + +Sentry dropped an application metric that had an empty name, an unknown or missing type, a non-numeric value, or a missing required field. This applies to [Application Metrics](/product/metrics/), not legacy custom metrics. + +- **Short:** Metric had no name or a bad type or value. +- **Causes:** + - A metric sent with a missing or blank name. + - A metric with no type, or a type other than counter, gauge, or distribution. + - A metric with a non-numeric value. +- **Actions:** + - Give every metric a non-empty name. + - Use counter, gauge, or distribution types with numeric values. + +#### Invalid Check-In + +Reason code: `invalid_check_in`. + +Sentry dropped a [cron monitor](/product/monitors-and-alerts/monitors/crons/) check-in that had an empty monitor slug or an environment name longer than 64 characters. Slugs longer than 50 characters are shortened automatically, so only an empty slug is rejected. + +- **Short:** Check-in had a bad slug or environment. +- **Causes:** + - A check-in sent without a monitor slug. + - A check-in with an environment name longer than 64 characters. +- **Actions:** + - Set a monitor slug on every check-in. + - Shorten the environment name to 64 characters or fewer. + +#### Invalid Span Attachment + +Reason code: `invalid_span_attachment`. + +Sentry dropped a span attachment that had no span ID, or that pointed to a span not sent in the same envelope. A span attachment has to arrive together with the span it belongs to. + +- **Short:** Span attachment had no matching span. +- **Causes:** + - A span attachment sent without a span ID. + - A span attachment sent in a different envelope from its span. +- **Actions:** + - Update your SDK. + - If you send span attachments yourself, set the span ID and include the span in the same envelope. + +#### Invalid Trace Attachment + +Reason code: `invalid_trace_attachment`. + +Sentry dropped a trace attachment whose `meta_length` header was missing or larger than the attachment itself, or that lacked required metadata such as its trace ID or content type. + +- **Short:** Trace attachment metadata was invalid. +- **Causes:** + - A trace attachment with a missing `meta_length` header, or one larger than the payload. + - A trace attachment missing required metadata, such as its trace ID or content type. +- **Actions:** + - Update your SDK. + - If you build trace attachments yourself, set a correct `meta_length` header and include the trace ID and content type. + +#### Invalid Replay + +Reason code: `invalid_replay`. + +Sentry dropped a [session replay](/product/session-replay/) event that was not valid JSON, was missing its `replay_id` or `segment_id`, or had invalid error or trace IDs. A `segment_id` that's too large is also rejected. + +- **Short:** Replay event was malformed or missing IDs. +- **Causes:** + - A replay event missing its `replay_id` or `segment_id`, or with invalid error or trace IDs. + - A replay event that isn't valid JSON, including one bundled with a mobile replay video. +- **Actions:** + - Update the Replay SDK. + +#### Empty Replay Event + +Reason code: `invalid_replay_no_payload`. + +Sentry dropped a replay event that parsed correctly but contained no data, for example a JSON `null`. + +- **Short:** Replay event contained no data. +- **Causes:** + - An SDK sending a replay event with empty content, such as JSON `null`. +- **Actions:** + - Update the Replay SDK. + +#### Replay Scrubbing Failed + +Reason code: `invalid_replay_pii_scrubber_failed`. + +Sentry dropped a replay because applying data scrubbing rules to the replay event failed. This isn't expected to happen in practice, so it points to a problem on Sentry's side rather than with your data. + +- **Short:** PII scrubbing of the replay event failed. +- **Causes:** + - An unexpected failure inside Sentry while scrubbing sensitive data from the replay event. +- **Actions:** + - [Contact Sentry support](https://www.sentry.help/en/) if it continues. + +#### Invalid Replay Recording + +Reason code: `invalid_replay_recording`. + +Sentry couldn't parse or decompress a replay recording while scrubbing it for sensitive data, so the recording was dropped. This only happens when Sentry scrubs replay recordings for your project, which requires your project to have data scrubbing rules or settings. + +- **Short:** Replay recording could not be parsed. +- **Causes:** + - A replay recording that isn't valid JSON. + - A replay recording with broken compression. + - A replay recording with an empty body or missing headers. +- **Actions:** + - Update the Replay SDK. + +#### Invalid Replay Video + +Reason code: `invalid_replay_video`. + +Sentry dropped a mobile replay video that couldn't be decoded or was empty. These videos arrive as a single bundle of the replay event, recording, and video. A broken replay event inside the bundle is reported as [Invalid Replay](#invalid-replay) instead. + +- **Short:** Replay video was empty or undecodable. +- **Causes:** + - A replay video bundle that couldn't be decoded. + - A replay video bundle with an empty video. +- **Actions:** + - Update the mobile Replay SDK. + +#### Replay Missing Recording + +Reason code: `invalid_replay_missing_recording`. + +Sentry dropped a replay event that was sent without its recording in the same envelope. Recordings sent on their own are still accepted, but a replay event must come with its recording. + +- **Short:** Replay event arrived without its recording. +- **Causes:** + - An SDK sending a replay event and its recording in separate envelopes. +- **Actions:** + - Update the Replay SDK so the event and recording are sent together. + +#### Missing Event Payload + +Reason code: `no_event_payload`. + +Sentry received a crash upload but couldn't build an event from it, or received a profile without the transaction it belongs to. Without that primary data, there was nothing to ingest. + +- **Short:** Crash or profile was missing its event. +- **Causes:** + - A crash upload whose items couldn't be turned into an event. + - A profile sent without its transaction in the same envelope. +- **Actions:** + - Check the SDK or crash reporter sending the crash upload. + - Send each profile in the same envelope as its transaction. + +#### Unprocessable Crash Payload + +Reason code: `payload`. + +Sentry couldn't process a Nintendo Switch crash or a PlayStation crash dump that your app sent, for example because the file was corrupt, cut off, or badly compressed. + +- **Short:** Console crash data could not be processed. +- **Causes:** + - A Nintendo Switch crash that's corrupt, cut off, or contains unexpected values. + - A PlayStation crash dump that's corrupt and can't be read. + - Crash data that's badly compressed and fails to decompress. +- **Actions:** + - Check the SDK or tool that sends your Switch or PlayStation crashes. + - Confirm the crash files it uploads are complete and not corrupted. + +#### Missing Minidump Upload + +Reason code: `missing_minidump_upload`. + +Sentry rejected a minidump upload because the request didn't include a minidump file. This only happens with multipart form uploads, and any other attachments or breadcrumbs in the same upload are dropped under this reason too. + +- **Short:** Minidump upload had no minidump file. +- **Causes:** + - The multipart upload didn't include the crash file at all. + - The crash file was sent under a form field other than `upload_file_minidump`, so Sentry didn't recognize it as the minidump. +- **Actions:** + - Send the crash file in the `upload_file_minidump` form field. + - Or send the raw minidump as the request body with the content type `application/octet-stream` or `application/x-dmp`. + +#### Invalid Minidump + +Reason code: `invalid_minidump`. + +Sentry rejected a minidump because the file didn't start with a valid minidump header. Large minidumps whose compressed file is corrupt are also reported this way. Corrupt compression on other minidumps is reported as [Invalid Compression](#invalid-compression). + +- **Short:** Minidump lacked a valid file header. +- **Causes:** + - The uploaded file isn't a minidump, or it was modified before upload. + - A large minidump was uploaded compressed, and the compressed file was corrupt. +- **Actions:** + - Check that your crash reporter uploads the unmodified minidump file. + - If you compress minidumps before upload, confirm the compressed files are intact. + +#### Unreadable Request Body + +Reason code: `invalid_body`. + +Sentry couldn't read the body of a minidump uploaded directly rather than as multipart form data, for example because the stream was cut off. Each failed upload is counted as a single error as a best-effort estimate. + +- **Short:** Minidump upload body could not be read. +- **Causes:** + - A raw minidump upload stream that was cut off before it finished. + - A proxy between the crash reporter and Sentry that cut off or changed the upload. + - Possibly, a compressed upload (HTTP `Content-Encoding`) that Sentry couldn't decode. +- **Actions:** + - Check that the crash reporter sends the complete minidump. + - Check any proxy between the crash reporter and Sentry for cut-off or changed requests. + +#### Invalid Compression + +Reason code: `invalid_compression`. + +Sentry couldn't decompress a minidump or an Unreal Engine crash report your app sent. For minidumps, Sentry detects the format (gzip, zstd, bzip2, or xz) from the file header. Large minidumps that fail to decompress are reported as [Invalid Minidump](#invalid-minidump) instead. + +- **Short:** Crash file could not be decompressed. +- **Causes:** + - A minidump whose gzip, zstd, bzip2, or xz data is corrupt or incomplete. + - An Unreal crash report whose compression is invalid. +- **Actions:** + - Check the crash reporter or tool sending the file. + - For minidumps, make sure the file is valid gzip, zstd, bzip2, or xz data. + +#### Invalid Multipart Upload + +Reason code: `invalid_multipart`. + +Sentry couldn't parse a multipart form-data upload, such as a minidump or PlayStation crash report. Each failed upload is counted as a single error as a best-effort estimate. + +- **Short:** Multipart upload could not be parsed. +- **Causes:** + - A crash reporter or upload client sending a malformed multipart body. + - An upload with a missing or invalid multipart boundary. +- **Actions:** + - Check the crash reporter or upload client. + - Make sure uploads are valid multipart form data with a correct boundary. + +#### Nesting Too Deep + +Reason code: `nesting_too_deep`. + +Sentry dropped a crash report because its form-data keys (like `sentry[a][b]...`) were nested more than 15 levels deep. This applies to Breakpad- or Crashpad-style uploads that send event fields as form data. + +- **Short:** Form-data keys nested over 15 levels deep. +- **Causes:** + - A crash reporter sending event fields as bracketed form keys nested more than 15 levels after `sentry`. +- **Actions:** + - Flatten the fields your crash reporter sends so keys stay within 15 levels. + +#### Invalid MessagePack + +Reason code: `invalid_msgpack`. + +Sentry couldn't decode the event or breadcrumbs attached to a native crash. These are sent in MessagePack, a compact binary format. + +- **Short:** Crash event or breadcrumbs failed to parse. +- **Causes:** + - An outdated native SDK or crash reporter sending malformed MessagePack in the `__sentry-event`, `__sentry-breadcrumb1`, or `__sentry-breadcrumb2` fields. + - MessagePack data nested more than 128 levels deep, which likely also fails to decode. +- **Actions:** + - Update the native SDK or crash reporter. + - If you attach these fields yourself, make sure they contain valid MessagePack. + +#### Invalid OTLP Protobuf + +Reason code: `invalid_proto`. + +Sentry couldn't decode an OpenTelemetry (OTLP) payload for traces or logs sent in protobuf binary encoding. JSON-encoded OTLP payloads that fail to parse are reported as [Malformed JSON Payload](#malformed-json-payload) instead. + +- **Short:** OTLP protobuf payload could not be decoded. +- **Causes:** + - An OpenTelemetry exporter whose protocol or encoding settings are misconfigured. + - A malformed protobuf payload sent to Sentry's OTLP traces or logs endpoint. +- **Actions:** + - Check your OpenTelemetry exporter's protocol and encoding settings. + - Confirm the data sent to the OTLP traces or logs endpoint is valid OTLP protobuf. + +#### Invalid Unreal Report + +Reason code: `invalid_unreal_report`. + +**Legacy:** This reason was defined for unreadable Unreal Engine crash reports, but Sentry never recorded it as a dropped event, so it shouldn't appear in your stats. Unreadable Unreal crash reports are recorded as [Unreal Processing Failed](#unreal-processing-failed) instead. + +- **Short:** Unreal report unreadable; not recorded. +- **Causes:** + - A short-lived, feature-gated version of Sentry's Unreal endpoint returned this error to the client but never recorded a dropped event. +- **Actions:** + - You don't need to do anything for this reason. + - For real Unreal crash report failures, see [Unreal Processing Failed](#unreal-processing-failed), [Invalid Compression](#invalid-compression), and [Unreal Crash Report Too Large](#unreal-crash-report-too-large). + +#### Unreal Processing Failed + +Reason code: `process_unreal`. + +Sentry couldn't extract an Unreal Engine crash report from the upload during processing, so the crash was dropped. This is recorded by Sentry's servers or by self-hosted Sentry, never by a Relay you run in front of Sentry. + +- **Short:** Unreal crash report couldn't be read. +- **Causes:** + - The Unreal Engine Crash Reporter sent an incomplete or corrupted report. + - The upload sent to the Unreal endpoint isn't a valid Unreal crash report. +- **Actions:** + - Check that the Unreal Engine Crash Reporter sends a complete, valid report. + - For badly compressed or oversized Unreal reports, see [Invalid Compression](#invalid-compression) and [Unreal Crash Report Too Large](#unreal-crash-report-too-large). + +#### Missing PlayStation Dump + +Reason code: `missing_prosperodump_upload`. + +Sentry rejected a PlayStation crash upload because it didn't include a `.prosperodmp` core dump file. Sentry recognizes the dump only by a filename ending in `.prosperodmp`, and any other files in the upload are dropped with it. + +- **Short:** PlayStation upload had no .prosperodmp. +- **Causes:** + - The crash upload didn't include the core dump file. + - The dump was attached with a filename that doesn't end in `.prosperodmp`. +- **Actions:** + - Make sure the upload includes the core dump file. + - Check that the dump's filename ends in `.prosperodmp`. + +#### Invalid PlayStation Dump + +Reason code: `invalid_prosperodump`. + +Sentry rejected a PlayStation crash dump because the `.prosperodmp` file didn't start with an ELF or LZ4 header. This check only looks at the start of the file. A dump that fails later during processing is reported as [Unprocessable Crash Payload](#unprocessable-crash-payload) instead. + +- **Short:** PlayStation dump had an invalid header. +- **Causes:** + - The `.prosperodmp` file was modified before upload and its header was damaged. + - A file that isn't a PlayStation core dump was uploaded with a `.prosperodmp` filename. +- **Actions:** + - Check that the `.prosperodmp` file is an unmodified core dump. + - Use the `.prosperodmp` extension only for PlayStation core dump files. + +#### Invalid Security Report + +Reason code: `security_report`. + +Sentry rejected a Content Security Policy (CSP) report because its JSON didn't match the expected report format. Browsers and extensions generate these reports, so you rarely control the payload. + +- **Short:** CSP report didn't match expected format. +- **Causes:** + - The CSP report body had a shape Sentry didn't recognize. + - Sentry couldn't work out which CSP directive was violated. +- **Actions:** + - Check what is posting to your security endpoint. + - Treat occasional drops as expected noise, since browsers and extensions generate these reports. + +#### Unrecognized Security Report Type + +Reason code: `security_report_type`. + +Sentry couldn't tell what kind of security report it received because the JSON had neither a `csp-report` key nor a `type` field. This is the shape of legacy Expect-CT, HPKP, and Expect-Staple reports, and only CSP reports are accepted. + +- **Short:** Security report type wasn't recognized. +- **Causes:** + - Your site still sends legacy Expect-CT, HPKP (`Public-Key-Pins`), or Expect-Staple reports to Sentry. + - An older Relay in front of Sentry forwarded a security report that wasn't CSP. + - A Sentry ingestion change shipped in mid-September 2026, so you may see a step change in volume from then. +- **Actions:** + - Remove legacy `Expect-CT` or `Public-Key-Pins` `report-uri` headers that point at Sentry. + - Send only CSP reports to your security endpoint. + +#### Unsupported Protocol Version + +Reason code: `auth_version`. + +**Legacy:** Sentry no longer reports this reason, so it only appears in historical data. It was recorded when an SDK sent an unsupported Sentry protocol version in its auth header. Today those requests are rejected with an HTTP `400` and no dropped data record. + +- **Short:** Legacy: unsupported protocol version. +- **Causes:** + - An SDK sent an auth header with a Sentry protocol version that Sentry didn't support. +- **Actions:** + - No action is needed for historical data. + - If the SDK that sent this data is still in use, update it to the latest version. + +#### Unsupported Content Type + +Reason code: `content_type`. + +**Legacy:** Sentry no longer reports this reason, so it only appears in historical data. It was recorded when a request's `Content-Type` wasn't allowed for the endpoint it was sent to. + +- **Short:** Legacy: unsupported content type. +- **Causes:** + - A request was sent with a `Content-Type` the endpoint didn't accept. +- **Actions:** + - No action is needed for historical data. + - If you send data with custom code, use the content type the endpoint expects. + +#### Empty Request Body + +Reason code: `empty_body`. + +**Legacy:** Sentry received a request with an empty body, so there was nothing to ingest. This reason isn't reported today, because Sentry rejects empty requests with an HTTP `400` error before recording them. + +- **Short:** Request body was empty. +- **Causes:** + - An SDK, or a proxy forwarding requests to Sentry, sending requests with no body. +- **Actions:** + - You usually don't need to do anything, since this reason isn't expected to appear. + - If requests to Sentry fail with HTTP `400` errors, check the SDK and any proxy forwarding them. + +#### Transaction Attachment + +Reason code: `transaction_attachment`. + +**Legacy:** Sentry no longer reports this reason, so it only appears in historical data. It was recorded when an attachment sent alongside a transaction was dropped while an internal Sentry option disallowed it. That option has since been removed. + +- **Short:** Legacy: attachment sent with transaction. +- **Causes:** + - Your SDK sent an attachment with a transaction while Sentry had transaction attachments turned off on its side. +- **Actions:** + - You don't need to do anything. Sentry no longer drops attachments for this reason. + +#### Dynamic Sampling (Legacy) + +Reason code: `transaction_sampled`. + +**Legacy:** Sentry no longer reports this reason, so it only appears in historical data. It was recorded when [dynamic sampling](/organization/dynamic-sampling/) dropped a transaction under the rules in effect at the time. Current sampling drops are reported as [Dynamic Sampling](#dynamic-sampling) under Inbound Filters. Because this is expected sampling, it's left out of the dropped data line. + +- **Short:** Legacy: dropped by dynamic sampling. +- **Causes:** + - A transaction was dropped by the dynamic sampling rules in effect at the time. +- **Actions:** + - No action is needed for historical data. + - For current dynamic sampling drops, see [Dynamic Sampling](#dynamic-sampling). + +#### Internal Envelope + +Reason code: `internal_envelope`. + +**Legacy:** Sentry never records this reason in your stats. It only returns an HTTP `400` error to the client. It applies when an envelope sent to the regular envelope or store endpoint contains internal-only integration items, which only Sentry's own integration endpoints, such as OTLP and Vercel, create. + +- **Short:** Envelope had internal-only items. +- **Causes:** + - A client or proxy sent internal integration items to the regular envelope or store endpoint. +- **Actions:** + - Send that data to its integration endpoint, such as OTLP, instead. + - Check any proxy or custom client that forwards envelopes to Sentry. + +#### Project Config Unreadable + +Reason code: `project_state`. + +**Legacy:** Sentry couldn't read this project's configuration, so it dropped the data. Current Sentry no longer reports this reason. It can only come from very old Relays you run yourself. + +- **Short:** Project config couldn't be read. +- **Causes:** + - A very old Relay couldn't parse the project configuration it received from Sentry. + - A Sentry-side bug or infrastructure problem, not something in your setup. +- **Actions:** + - If you run your own Relays, upgrade any very old versions. + - [Contact Sentry support](https://www.sentry.help/en/) if it continues. + +#### Data Scrubbing Config Error + +Reason code: `project_state_pii`. + +**Legacy:** Sentry couldn't convert this project's data scrubbing settings into a usable configuration, so it dropped the data. Current Sentry can no longer fail this way. It can only come from old Relays. + +- **Short:** Data scrubbing config failed to convert. +- **Causes:** + - A regular expression in the project's data scrubbing settings failed to compile during conversion. + - An old Relay processed the data. Current versions can't hit this error. +- **Actions:** + - Check your [Security & Privacy](https://sentry.io/orgredirect/organizations/:orgslug/settings/security-and-privacy/) data scrubbing settings for invalid regular expressions. + - If you run your own Relays, upgrade any old versions. + - [Contact Sentry support](https://www.sentry.help/en/) if it continues. + +#### Project Unavailable + +Reason code: `project_unavailable`. + +Sentry couldn't load the project's configuration in time, so it rejected a minidump or PlayStation crash upload. This is a Sentry-side infrastructure issue, and your SDK may retry the upload. + +- **Short:** Project config couldn't load in time. +- **Causes:** + - Sentry's infrastructure couldn't provide the project configuration in time when a crash upload arrived. +- **Actions:** + - You usually don't need to do anything, since the SDK may retry the upload. + - [Contact Sentry support](https://www.sentry.help/en/) if it continues. + +#### Queue Failed + +Reason code: `queue_failed`. + +**Legacy:** This reason is defined for when Sentry's ingestion queue is full or shutting down, but those failures are always recorded as [Sentry Processing Error](#sentry-processing-error) instead. You shouldn't see it in your stats. + +- **Short:** Sentry queue full; shown as internal. +- **Causes:** + - Sentry's ingestion queue was full, shutting down, or out of memory, and the drop was recorded under `internal`. +- **Actions:** + - Look under [Sentry Processing Error](#sentry-processing-error) for queue-related drops instead. + - [Contact Sentry support](https://www.sentry.help/en/) if those drops continue, since queue failures are a Sentry-side issue. + +#### Upload Failed + +Reason code: `upload_failed`. + +Sentry failed to save an attachment or crash file to its storage, so the data was dropped. If a minidump fails to save, the whole crash upload is rejected. A failed extra attachment is dropped on its own. + +- **Short:** Sentry couldn't store an attachment. +- **Causes:** + - Sentry's attachment storage returned an error during the upload. + - Sentry's attachment storage was shedding load and refused the upload. +- **Actions:** + - You don't need to do anything for occasional drops, since this is a Sentry-side issue. + - [Contact Sentry support](https://www.sentry.help/en/) if it continues. + +#### Invalid Signature + +Reason code: `invalid_signature`. + +Sentry rejected data signed by a [Relay](/product/relay/) that isn't registered with your organization, or whose signature had expired. This check only runs when your organization has **Ingest Through Trusted Relays Only** turned on. + +- **Short:** Relay signature unknown or expired. +- **Causes:** + - The Relay's public key isn't registered with your organization. + - The Relay's clock is wrong, so its signatures look expired. +- **Actions:** + - [Register the Relay's public key](/product/relay/getting-started/#registering-relay-with-sentry) in your organization's [Relay settings](https://sentry.io/orgredirect/organizations/:orgslug/settings/relay/). + - Check that the Relay's system clock is accurate. + +#### Missing Signature + +Reason code: `missing_signature`. + +Your organization only accepts data through trusted [Relays](/product/relay/), so data sent directly without a Relay signature was rejected. This is the **Ingest Through Trusted Relays Only** setting working as intended, so it's left out of the dropped data line. + +- **Short:** Unsigned data bypassed trusted Relays. +- **Causes:** + - Some SDKs or DSNs send data straight to Sentry instead of through your Relay. + - Your organization turned on **Ingest Through Trusted Relays Only**, which rejects all unsigned direct traffic by design. +- **Actions:** + - Route all SDKs through your trusted Relay. + - If you don't need this restriction, turn off **Ingest Through Trusted Relays Only** in your organization's [Relay settings](https://sentry.io/orgredirect/organizations/:orgslug/settings/relay/). + +#### Event Payload Too Large + +Reason code: `too_large:event`. + +The event exceeded the maximum payload size. Other item types have their own reason codes, such as `too_large:log` or `too_large:span`, and attachments are broken down by attachment type, such as `too_large:attachment:minidump`. Each one is listed below. + +- **Short:** The event exceeded maximum payload size. +- **Causes:** + - Very deep stack traces, typically from recursion or stack-overflow errors. + - Too much data in `contexts` (for example, set with `setContext`) or added as `extra`. +- **Actions:** + - Trim the payload in [`beforeSend`](/platform-redirect/?next=/configuration/options/#beforeSend). That lets you drop the largest fields and still keep the event. + +#### Log Payload Too Large + +Reason code: `too_large:log`. + +The log exceeded the maximum payload size. + +- **Short:** The log event exceeded maximum payload size. +- **Causes:** + - Large attributes or messages, such as request bodies or application configuration. +- **Actions:** + - Trim the payload in [`beforeSendLog`](/platform-redirect/?next=/configuration/options/#beforeSendLog). + - Do not attach an entire large JSON payload as log attributes. Pick the fields you need. + +#### Span Payload Too Large + +Reason code: `too_large:span`. + +The span exceeded the maximum payload size. + +- **Short:** The span event exceeded maximum payload size. +- **Causes:** + - Large span attributes, such as a full request body instead of individual HTTP fields. + - Large context windows from AI agents attached to spans. +- **Actions:** + - Trim the payload in [`beforeSendSpan`](/platform-redirect/?next=/configuration/options/#beforeSendSpan). + - Use attachments instead of attributes for large payload data, such as images or videos. + +#### Application Metric Payload Too Large + +Reason code: `too_large:trace_metric`. + +The metric event exceeded the maximum payload size. + +- **Short:** The application metric event exceeded maximum payload size. +- **Causes:** + - Large metric attributes, such as a full request body instead of individual fields. +- **Actions:** + - Audit attributes on application metrics. Set the specific parameters you need, not an entire HTTP request object. + +#### Transaction Payload Too Large + +Reason code: `too_large:transaction`. + +The transaction exceeded the maximum payload size. Transactions carry their spans inline, so size usually comes from span count rather than one large field. + +- **Short:** The transaction exceeded maximum payload size. +- **Causes:** + - A very high number of spans on one transaction. + - Long span descriptions, large span attributes, or both. +- **Actions:** + - Trim the payload in [`beforeSendTransaction`](/platform-redirect/?next=/configuration/options/#beforeSendTransaction). + - Reduce span volume at the source. Address N+1 query patterns, or narrow auto-instrumentation that creates a span per database call. + +#### Profile Payload Too Large + +Reason code: `too_large:profile`. + +The profile exceeded the maximum payload size. + +- **Short:** The profile event exceeded maximum payload size. +- **Causes:** + - A long-running transaction profile with many samples or deep stacks. +- **Actions:** + - Profile shorter operations, or lower your profile sample rate. + +#### Profile Chunk Too Large + +Reason code: `too_large:profile_chunk`. + +Sentry rejected a continuous [profiling](/product/profiling/) chunk because it was over the profile size limit (50 MiB by default), or because it was sent in the same envelope (one SDK upload) as another profile or profile chunk. The whole envelope is rejected. + +- **Short:** Profile chunk over size or count limit. +- **Causes:** + - A single profile chunk is larger than the 50 MiB profile size limit. + - More than one profile or profile chunk was sent in the same envelope, where only one is allowed. +- **Actions:** + - Update your SDK to the latest version. + - [Contact Sentry support](https://www.sentry.help/en/) if it continues after updating. + +#### Replay Event Too Large + +Reason code: `too_large:replay_event`. + +Sentry rejected a replay's metadata event because it was over the event size limit (1 MiB by default), or because it was sent in the same envelope (one SDK upload) as another event. The whole envelope is rejected, including the replay recording sent with it, so that replay segment is lost. + +- **Short:** Replay metadata event over size limit. +- **Causes:** + - The replay event carried more than 1 MiB of data, for example from custom data added to it. + - The replay event was sent in the same envelope as another event, such as an error, transaction, or user feedback. +- **Actions:** + - Reduce custom data added to replay events. + - Update your SDK to the latest version if it continues. + +#### Replay Recording Too Large + +Reason code: `too_large:replay_recording`. + +Sentry dropped a replay segment because its recording was over 10 MiB compressed (the default limit), because more than one recording was sent in the same envelope (one SDK upload), or because the replay event, recording, and video together reached 15 MiB. Oversized mobile video segments can also show up under this reason. + +- **Short:** Replay recording over size limit. +- **Causes:** + - Very large or rapidly changing page elements made the recorded segment too big. + - More than one replay recording was sent in the same envelope. + - On mobile, a segment's replay event, recording, and video together reached the 15 MiB combined limit. +- **Actions:** + - [Block or ignore](/platforms/javascript/session-replay/privacy/#blocking) very large or rapidly changing page elements in your replay setup. + - Update your SDK to the latest version if it continues. + +#### Replay Video Too Large + +Reason code: `too_large:replay_video`. + +Sentry rejected a mobile replay segment because its video was over the size limit (10 MiB compressed by default), or because more than one video was sent in the same envelope (one SDK upload). Normal segments are far below this limit, so this likely points to an SDK problem or an unusual segment. + +- **Short:** Mobile replay video over size limit. +- **Causes:** + - An SDK problem or an unusual segment produced a video far larger than normal. + - More than one replay video was sent in the same envelope. +- **Actions:** + - Update your mobile SDK to the latest version. + - [Contact Sentry support](https://www.sentry.help/en/) if it continues after updating. + +#### Check-In Too Large + +Reason code: `too_large:check_in`. + +Sentry rejected a cron monitor check-in because it was over the check-in size limit (100 KiB by default), or because the envelope (one SDK upload) held more than one check-in. The whole envelope is rejected. + +- **Short:** Cron check-in over size or count limit. +- **Causes:** + - The check-in payload was larger than the 100 KiB limit. + - More than one check-in was sent in a single envelope. +- **Actions:** + - Keep each check-in payload under 100 KiB. + - Send one check-in per request. + +#### Session Update Too Large + +Reason code: `too_large:session`. + +Sentry rejected release health session updates because the envelope (one SDK upload) was over the session size limit (10 MiB by default) or held more than 100 session items. The whole envelope is rejected. + +- **Short:** Too many or too large session updates. +- **Causes:** + - More than 100 session updates, or more than 10 MiB of them, were sent in one envelope. + - Session updates and session aggregates in the same envelope together crossed the shared size or count limit. +- **Actions:** + - Send fewer session updates per envelope. + +#### Session Aggregates Too Large + +Reason code: `too_large:sessions`. + +Sentry rejected pre-aggregated release health sessions, which server-mode SDKs send, because the envelope (one SDK upload) was over the shared session size limit (10 MiB by default) or held more than 100 session items. The whole envelope is rejected. + +- **Short:** Too many or too large session aggregates. +- **Causes:** + - A server-mode SDK sent more than 100 session aggregate items, or more than 10 MiB of them, in one envelope. + - Session aggregates and session updates in the same envelope together crossed the shared size or count limit. +- **Actions:** + - Send fewer session aggregates per envelope. + +#### Legacy User Feedback Too Large + +Reason code: `too_large:user_report`. + +Sentry rejected an envelope (one SDK upload) because a user report from the older user feedback API pushed it over the attachment size or count limits it shares with attachments. User reports are small, so the attachments sent with it are usually what caused the overflow. + +- **Short:** User report hit shared attachment limits. +- **Causes:** + - Attachments in the same envelope were too large or too many (defaults are 200 MiB per item, 30 items, and 200 MiB total), and the user report tipped the envelope over. +- **Actions:** + - Send fewer or smaller attachments with the user report. + +#### User Feedback Too Large + +Reason code: `too_large:user_report_v2`. + +Sentry rejected [user feedback](/product/user-feedback/) because it was over the event size limit (1 MiB by default), or because it was sent in the same envelope (one SDK upload) as another event. Feedback screenshots are separate attachments and don't count toward this check. + +- **Short:** User feedback over event size limit. +- **Causes:** + - The feedback carried too much context or extra data. + - The feedback was sent in the same envelope as another event, such as an error, transaction, or replay event. +- **Actions:** + - Reduce context and extra data on feedback. + - Update your SDK to the latest version if it continues. + +#### Security Event Too Large + +Reason code: `too_large:security`. + +Sentry rejected a Content Security Policy (CSP) event because it was over the event size limit (1 MiB by default), or because it was sent in the same envelope (one upload) as another event. Sentry's own endpoints already cap these reports, so this usually comes from a downstream [Relay](/product/relay/) forwarding an oversized CSP event. + +- **Short:** Forwarded CSP event over size limit. +- **Causes:** + - A downstream Relay, such as one you run, forwarded a CSP event larger than the event size limit. + - The CSP event was sent in the same envelope as another event. +- **Actions:** + - Check the size limits configured on any Relay you run. + - [Contact Sentry support](https://www.sentry.help/en/) if it continues. + +#### Security Report Too Large + +Reason code: `too_large:raw_security`. + +Sentry rejected a browser security report, such as a CSP violation, because it was larger than the event size limit (1 MiB by default). The security report endpoint already caps reports at this limit, so this only happens when a raw report is sent directly inside an envelope (one upload), for example by your own client or by a Relay running in proxy mode. + +- **Short:** Browser security report over size limit. +- **Causes:** + - A client or a Relay running in proxy mode sent a raw security report directly, and it was over the event size limit. + - The security report was sent in the same envelope as another event. +- **Actions:** + - You usually don't need to do anything. These reports are browser-generated and this is very rare. + - If you send reports through your own client or Relay, send one report per envelope. + +#### Unreal Crash Report Too Large + +Reason code: `too_large:unreal_report`. + +Sentry rejected an Unreal Engine crash report because it was over the shared attachment limits (200 MiB per item, 30 items, and 200 MiB total by default), or because it grew past 200 MiB once unpacked. These drops are counted as errors. + +- **Short:** Unreal crash report over size limit. +- **Causes:** + - The crash report bundles large logs or other files. + - Other attachments in the same envelope (one upload) pushed it over the shared attachment limits. + - The report is over 200 MiB once unpacked, even though its upload was smaller. +- **Actions:** + - Reduce the logs and files included in crash reports. + - Send fewer or smaller attachments with the crash report. + +#### Form Data Too Large + +Reason code: `too_large:form_data`. + +Sentry rejected a multipart crash upload, such as a minidump upload, because its non-file form fields together were over the event size limit (1 MiB by default). Form data has no data category of its own, so the drop is recorded against the other items in the upload, such as the minidump. + +- **Short:** Crash upload form fields over size limit. +- **Causes:** + - Too much event data was sent in the upload's form fields, such as the `sentry` JSON field or `sentry[...]` fields. + - Form data was sent in the same envelope (one upload) as another event. +- **Actions:** + - Send less event data in the upload's form fields. + +#### Client Report Too Large + +Reason code: `too_large:client_report`. + +Sentry rejected an envelope (one SDK upload) because the SDK's client report, its summary of data it dropped, was over the size or count limits. A lone client report records nothing here, so this only appears when other items in the same envelope were dropped with it. It points to an SDK problem rather than your data. + +- **Short:** SDK's client report exceeded its limits. +- **Causes:** + - An SDK problem produced an oversized client report, or too many client reports in one envelope. +- **Actions:** + - Update your SDK to the latest version. + - [Contact Sentry support](https://www.sentry.help/en/) if it continues after updating. + +#### Legacy Custom Metrics Too Large + +Reason code: `too_large:statsd`. + +**Legacy:** Sentry rejected custom metrics sent in the old statsd format because they were over the size limit. Sentry no longer accepts this format. + +- **Short:** Legacy statsd metrics over size limit. +- **Causes:** + - Your SDK sent custom metrics in the statsd format with a payload over the size limit. +- **Actions:** + - Migrate to [Application Metrics](/product/metrics/). + - No action is needed for historical data. + +#### Metric Buckets Too Large + +Reason code: `too_large:metric_buckets`. + +Sentry rejected metric buckets sent by a downstream [Relay](/product/relay/) (Sentry's ingestion service, which some customers run themselves) because they were over the size limit (1 MiB by default), or because more than one was sent in the same envelope (one upload). SDKs never send metric buckets, so this comes from Relay-to-Relay traffic, and many of these rejections record no count. + +- **Short:** Relay metric buckets over size limit. +- **Causes:** + - The sending Relay's batches were larger than the receiving limit. A Relay batches up to about 5 MB by default, while the receiving default is 1 MiB. + - More than one metric buckets item was sent in the same envelope. +- **Actions:** + - Check the version and configuration of the Relay that sent the data. + - [Contact Sentry support](https://www.sentry.help/en/) if it continues. + +#### Integration Payload Too Large + +Reason code: `too_large:integration`. + +Sentry rejected an OpenTelemetry (OTLP), Vercel log drain, or Network Error Logging (NEL) payload because it was over the size limit (12 MiB by default). Those endpoints usually refuse oversized requests before this check, so this reason needs an envelope (one upload) that carries the integration data directly, or more than one item of the same kind, and is rare. + +- **Short:** OTLP, Vercel, or NEL payload too large. +- **Causes:** + - Integration data sent directly in an envelope was larger than 12 MiB, such as a large exporter or log drain batch. + - An envelope carried more than one integration item of the same kind, logs or spans. +- **Actions:** + - Send smaller batches from your exporter or drain. + - If you build envelopes yourself, include at most one integration logs item and one spans item per envelope. + +#### Unknown Item Too Large + +Reason code: `too_large:unknown`. + +**Legacy:** Sentry rejected an item of a type that Relay (Sentry's ingestion service) didn't recognize because it was over the size limit. Current Relay versions no longer report this reason, so it only appears in historical data or from older Relays, such as ones you run yourself. + +- **Short:** Unrecognized item type over size limit. +- **Causes:** + - An older Relay received an item of a type it didn't recognize that was larger than 12 MiB. +- **Actions:** + - Update your SDK and any Relay you run to current versions. + - No action is needed for historical data. + +#### Attachment Too Large + +Reason code: `too_large:attachment:attachment`. + +Sentry rejected an envelope (one SDK upload) because an attachment was over the size limit, or because there were too many attachments. The whole envelope is rejected, including the event the attachments belong to. + +- **Short:** Attachment over size or count limit. +- **Causes:** + - A single attachment is larger than the 200 MiB default limit. + - The envelope held more than 30 attachments, or more than 200 MiB of attachments in total. + - A multipart upload's attachments together went over the total size limit, whatever their type. +- **Actions:** + - Send fewer or smaller attachments. + +#### Minidump Too Large + +Reason code: `too_large:attachment:minidump`. + +Sentry rejected a crash minidump because it was over the attachment size limit, which is checked on upload and again after decompression. + +- **Short:** Minidump over attachment size limit. +- **Causes:** + - The minidump captures a lot of memory, making it too large once decompressed. + - Other attachments sent with the minidump pushed it over the shared attachment limits. +- **Actions:** + - Capture smaller minidumps, for example without full memory. + - Send fewer or smaller attachments with the minidump. + +#### Apple Crash Report Too Large + +Reason code: `too_large:attachment:apple_crash_report`. + +Sentry rejected an envelope because an Apple crash report attachment was over the attachment size or count limits. These limits are shared, so other attachments sent with the crash may be what pushed it over. + +- **Short:** Apple crash report hit attachment limits. +- **Causes:** + - The Apple crash report attachment itself is too large. + - Other attachments sent with the crash pushed the envelope over the shared limits. +- **Actions:** + - Send fewer or smaller attachments with the crash. + +#### Crash Event Payload Too Large + +Reason code: `too_large:attachment:event_payload`. + +Sentry rejected the event data attached to a native crash upload because it was over the event size limit (1 MiB by default). Native crash uploads from sentry-native, Crashpad, and Breakpad send this data, and Unreal crash files can contain it too. + +- **Short:** Native crash event data over size limit. +- **Causes:** + - The crash event carries too much context, tags, or extra data. +- **Actions:** + - Reduce context, tags, and extra data on crash events. + +#### Crash Breadcrumbs Too Large + +Reason code: `too_large:attachment:breadcrumbs`. + +Sentry rejected the breadcrumbs file attached to a native crash upload because it was over the event size limit (1 MiB by default). + +- **Short:** Native crash breadcrumbs over size limit. +- **Causes:** + - Too many breadcrumbs were recorded before the crash. + - Individual breadcrumbs carry large amounts of data. +- **Actions:** + - Lower [`maxBreadcrumbs`](/platform-redirect/?next=/configuration/options/#maxBreadcrumbs) in your SDK options. + - Reduce the data attached to each breadcrumb. + +#### PlayStation Crash Dump Too Large + +Reason code: `too_large:attachment:prosperodump`. + +Sentry rejected a PlayStation crash dump because it was over the attachment size limit once decompressed, or because it and the attachments sent with it went over the attachment limits on upload. + +- **Short:** PlayStation crash dump over size limit. +- **Causes:** + - The crash dump is too large after decompression. + - Other attachments sent with the dump pushed it over the shared attachment limits. +- **Actions:** + - Reduce the data included in the dump. + - Send fewer or smaller attachments with the dump. + +#### Unreal Context Too Large + +Reason code: `too_large:attachment:unreal_context`. + +Sentry rejected an Unreal Engine crash context attachment because it was over the attachment size or count limits. Sentry normally creates this file itself when unpacking an Unreal crash report, so this only appears when a client sends the context attachment directly. + +- **Short:** Unreal context over attachment limits. +- **Causes:** + - A client sent the Unreal context attachment directly, and it was too large. + - Other attachments sent with it pushed the total over the shared limits. +- **Actions:** + - Send fewer or smaller crash attachments. + +#### Unreal Crash Logs Too Large + +Reason code: `too_large:attachment:unreal_logs`. + +Sentry rejected an Unreal Engine crash log attachment because it was over the attachment size or count limits. Sentry normally extracts these logs itself when unpacking an Unreal crash report, so this only appears when a client sends the log attachment directly. + +- **Short:** Unreal crash logs over attachment limits. +- **Causes:** + - A client sent the Unreal crash log attachment directly with too much log output. + - Other attachments sent with it pushed the total over the shared limits. +- **Actions:** + - Reduce log output included in crash reports. + - Send fewer or smaller other attachments with the logs. + +#### View Hierarchy Too Large + +Reason code: `too_large:attachment:view_hierarchy`. + +Sentry rejected an event because its view hierarchy attachment, which mobile SDKs send when view hierarchy capture is turned on, was over the attachment size or count limits. With a 200 MiB per-attachment default, the shared count or total limit is the more likely trigger. + +- **Short:** View hierarchy over attachment limits. +- **Causes:** + - The event's attachments together went over the shared count or total size limit, and the view hierarchy was the one that crossed it. + - The view hierarchy attachment itself is unusually large. +- **Actions:** + - Send fewer or smaller attachments with each event. + +#### Switch Dying Message Too Large + +Reason code: `too_large:attachment:nnswitch_dying_message`. + +Sentry rejected an envelope because a Nintendo Switch dying message attachment was over the attachment size or count limits. The dying message has no count of its own, so the drop is recorded against the error event and other attachments. + +- **Short:** Switch dying message hit attachment limit. +- **Causes:** + - The dying message attachment itself is too large. + - Other attachments sent with it pushed the envelope over the shared limits. +- **Actions:** + - Send fewer or smaller attachments. + +### Category: Rate Limited + +Sentry throttled requests or dropped events after they arrived. + +#### Generic Rate Limit + +Reason code: `generic`. + +Your requests were throttled by Sentry's edge protection, not by a quota. The limit applies to a single DSN key and to all data types, for the duration Sentry returned in `Retry-After`. + +- **Short:** Your requests across all event types were rate limited. +- **Causes:** + - A very high request rate from one DSN key. A runaway loop, or a retry storm after a batch of failures, is a common cause. + - A project with legitimately high traffic hitting the rate limit. +- **Actions:** + - Look for a loop or retry storm. Check whether the burst lines up with a deploy. + - If this volume is expected, [contact Sentry support](https://www.sentry.help/en/) or your account manager. + +#### Project Abuse Limit + +Reason code: `project_abuse_limit`. + +Your project exceeded Sentry's abuse limit for a data type. This is a short-window rate limit. It is not your billing quota and it is not spike protection. + +- **Short:** Your events exceeded the project abuse limit. +- **Causes:** + - A very high rate of one telemetry type on a project. An error emitted in a tight loop can trigger this. + - A project with legitimately high traffic hitting the abuse limit. +- **Actions:** + - Look for a loop or retry storm. Check whether the burst lines up with a deploy. + - If this volume is expected, [contact Sentry support](https://www.sentry.help/en/) or your account manager. + +#### Spike Protection + +Reason code: `smart_rate_limit`. + +[Spike protection](/pricing/quotas/spike-protection/) detected a sudden increase in event volume for this project and dropped events so the spike would not consume your quota. + +- **Short:** Spike protection dropped events to preserve your quota. See [Spike Protection](/pricing/quotas/spike-protection/). +- **Causes:** + - A sudden increase in volume for one project. + - A low-volume or newly created project. Thresholds are derived partly from recent history. + - A real traffic spike, such as a badly behaved bot. +- **Actions:** + - Find what caused the spike. Sort the project's issues by event count over the affected window, and check whether it lines up with a deploy. + - Turn spike protection on or off per project in settings. See [Spike Protection](/pricing/quotas/spike-protection/). + +#### Quota Exceeded + +Reason code: `usage_exceeded`, or a per-category code such as `error_usage_exceeded` or `span_usage_exceeded`. + +Your organization's [quota](/pricing/quotas/) for this data category was fully consumed, and no pay-as-you-go budget remained. The prefix names the data category, such as error, transaction, span, or replay. The bare `usage_exceeded` code is the older, all-category version. When a project hits its [spend allocation](/pricing/quotas/spend-allocation/), the code is `project_quota__usage_exceeded`. + +- **Short:** Your organization hit its quota for this event type. +- **Causes:** + - Reserved monthly volume for this category was consumed, and your pay-as-you-go budget was used up. + - Newly enabled instrumentation started sending a category you had not budgeted for. + - A project hit its spend allocation limit. +- **Actions:** + - Raise your pay-as-you-go budget in [Subscription settings](https://sentry.io/orgredirect/organizations/:orgslug/settings/billing/overview/) if the growth is expected. See [quotas](/pricing/quotas/). + - Lower your sampling rates or add [inbound filters](/concepts/data-management/filtering/) so the same overrun does not happen next period. + +#### Internal Rate Limit + +Reason code: `rate_limited`. + +Sentry dropped data that went over one of its internal rate limits. This covers attachments over the per-project save limit, cron check-ins over the per-monitor limit, and Seer scanner and autofix runs that Sentry starts automatically. + +- **Short:** Over an internal Sentry rate limit. +- **Causes:** + - Your project saved more attachments than Sentry's per-project attachment save limit allows. + - A cron monitor sent more check-ins than allowed. By default, that's 6 per minute for each project, monitor, and environment combination. + - Automatic Seer scanner or autofix runs went over their limit. Sentry starts these runs, so they aren't data your application sent. +- **Actions:** + - Lower the volume of attachments your project sends. + - Reduce how often each cron monitor checks in. + - These limits aren't configurable. [Contact Sentry support](https://www.sentry.help/en/) if it continues. + +#### DSN Rate Limit + +Reason code: `key_quota`. + +Sentry dropped events because they went over the [rate limit set on the project's client key (DSN)](/pricing/quotas/manage-event-stream-guide/#rate-limiting). The limit covers errors and security reports, such as CSP reports. Because this is a setting you control, it's left out of the dropped data line. + +- **Short:** Exceeded the DSN rate limit. +- **Causes:** + - A rate limit is set on the client key, and your application sent more errors or security reports than it allows. + - Security reports, such as CSP reports, count toward the same limit as errors. +- **Actions:** + - Raise or remove the rate limit in [Client Keys (DSN)](https://sentry.io/orgredirect/organizations/:orgslug/settings/projects/:projectId/keys/). + - Find what is sending the extra errors or security reports if the volume is higher than expected. + +### Category: Inbound Filters + +Sentry dropped the data on purpose when it arrived, usually because of a [project inbound filter](/concepts/data-management/filtering/). Filtered events do not count toward quota. + +#### Filtered Transaction + +Reason code: `filtered-transaction`. + +The transaction name matched Sentry's [health check filter](/concepts/data-management/filtering/#transactions-coming-from-health-check), which drops endpoints such as `/health`, `/healthz`, `/ping`, and `/ready`. This filter is on by default. + +- **Short:** Transaction matched the default health check filter. See [health check filtering](/concepts/data-management/filtering/#transactions-coming-from-health-check). +- **Causes:** + - The health check filter is enabled by default on Sentry projects. +- **Actions:** + - Turn the filter off in [Inbound Filters](https://sentry.io/orgredirect/organizations/:orgslug/settings/projects/:projectId/filters/data-filters/) if you want these transactions. + +#### Error Message Filter + +Reason code: `error-message`. + +The event matched a custom glob in your error-message filter. See [custom filtering](/concepts/data-management/filtering/#how-custom-filtering-works). + +- **Short:** Event message matched one of your custom filters. See [custom filtering](/concepts/data-management/filtering/#how-custom-filtering-works). +- **Causes:** + - A filter you configured. +- **Actions:** + - If events you expect are missing, review the glob in [Inbound Filters](https://sentry.io/orgredirect/organizations/:orgslug/settings/projects/:projectId/filters/data-filters/). + +#### Release Version Filter + +Reason code: `release-version`. + +The event's release matched a custom release filter. See [custom filtering](/concepts/data-management/filtering/#how-custom-filtering-works). + +- **Short:** Event release matched one of your custom filters. See [custom filtering](/concepts/data-management/filtering/#how-custom-filtering-works). +- **Causes:** + - A filter you configured. +- **Actions:** + - If events you expect are missing, review the release rule in [Inbound Filters](https://sentry.io/orgredirect/organizations/:orgslug/settings/projects/:projectId/filters/data-filters/). + +#### IP Address Filter + +Reason code: `ip-address`. + +The event matched an IP range in a custom filter. See [IP address filters](/concepts/data-management/filtering/#ip-addresses). + +- **Short:** Event IP address matched one of your custom filters. See [IP address filters](/concepts/data-management/filtering/#ip-addresses). +- **Causes:** + - A filter you configured. +- **Actions:** + - If events you expect are missing, review the IP rule in [Inbound Filters](https://sentry.io/orgredirect/organizations/:orgslug/settings/projects/:projectId/filters/data-filters/). + +#### Legacy Browser Filter + +Reason code: `legacy-browsers`. + +The browser matched the [legacy browser filter](/concepts/data-management/filtering/#legacy-browser-filters). That filter drops events from older browsers that tend to produce broken telemetry. + +- **Short:** Browser matched your legacy browser filter. See [legacy browser filters](/concepts/data-management/filtering/#legacy-browser-filters). +- **Causes:** + - Bots spoofing old user agents. + - People connecting from old browsers, such as a kiosk that still runs an old browser. +- **Actions:** + - If the dropped browsers are ones your users actually use, review the legacy browser list in [Inbound Filters](https://sentry.io/orgredirect/organizations/:orgslug/settings/projects/:projectId/filters/data-filters/) and turn individual browsers off. + +#### Web Crawler Filter + +Reason code: `web-crawlers`. + +The user agent matched [Sentry's list of known web crawlers](/concepts/data-management/filtering/#web-crawler-errors). + +- **Short:** User agent matched Sentry's known crawler list. See [web crawler filters](/concepts/data-management/filtering/#web-crawler-errors). +- **Causes:** + - Bot traffic to your site. + - A user agent that matches the generic patterns. Any agent containing "bot" or "spider" as a word is filtered. +- **Actions:** + - Leave the filter on when you do not need crawler errors. + - To capture crawler-triggered errors, turn the filter off under [Inbound Filters](https://sentry.io/orgredirect/organizations/:orgslug/settings/projects/:projectId/filters/data-filters/). + +#### Localhost Filter + +Reason code: `localhost`. + +The data was sent from `localhost` and the project's localhost inbound filter is turned on. This includes events from `127.0.0.1`, `::1`, `localhost` URLs, `file://` URLs, and `*.localhost` hosts. + +- **Short:** Event was sent from a local address. +- **Causes:** + - You sent events from local development or testing while the localhost filter was on. It's off by default, so someone turned it on. + - Events came from requests whose `Host` or `X-Forwarded-Host` header was `localhost` or `127.0.0.1`. + - Events came from pages loaded from `file://` URLs or `*.localhost` hosts. +- **Actions:** + - You usually don't need to do anything. This is the filter working as intended. + - To keep these events, turn off the localhost filter in [Inbound Filters](https://sentry.io/orgredirect/organizations/:orgslug/settings/projects/:projectId/filters/data-filters/). + +#### Browser Extensions Filter + +Reason code: `browser-extensions`. + +The error matched Sentry's list of errors known to be caused by browser extensions. See [browser extension errors](/concepts/data-management/filtering/#browser-extension-errors). This filter is turned on automatically for new projects with a JavaScript platform. + +- **Short:** Error came from a browser extension. +- **Causes:** + - A browser extension installed by one of your users threw an error that your SDK captured. + - The browser extension filter is on, which is the default for new projects created with a JavaScript platform. +- **Actions:** + - You usually don't need to do anything. This is the filter working as intended. + - To capture these errors, turn off the filter in [Inbound Filters](https://sentry.io/orgredirect/organizations/:orgslug/settings/projects/:projectId/filters/data-filters/). + +#### React Hydration Errors Filter + +Reason code: `react-hydration-errors`. + +The error is a React hydration error, which the hydration errors inbound filter removes by default. The filter matches messages containing React's error-decoder links for hydration error codes 418, 419, 421, 422, 423, and 425. + +- **Short:** Error was a React hydration error. +- **Causes:** + - Your React app threw hydration errors while the filter was on, which is the default. +- **Actions:** + - You usually don't need to do anything. This is the filter working as intended. + - To capture these errors, turn off **Filter out hydration errors** in [Inbound Filters](https://sentry.io/orgredirect/organizations/:orgslug/settings/projects/:projectId/filters/data-filters/). + +#### ChunkLoadError Filter + +Reason code: `chunk-load-error`. + +The error is a `ChunkLoadError`, raised when the browser fails to load a JavaScript chunk. The ChunkLoadError filter is on by default. + +- **Short:** Error was a ChunkLoadError. +- **Causes:** + - You redeployed while users still had an old version of the page open. + - Your app raised Webpack "Loading chunk" or Turbopack "Failed to load chunk" errors while the filter was on, which is the default. +- **Actions:** + - You usually don't need to do anything. This is the filter working as intended. + - To capture these errors, turn off **Filter out ChunkLoadError(s)** in [Inbound Filters](https://sentry.io/orgredirect/organizations/:orgslug/settings/projects/:projectId/filters/data-filters/). + +#### Sentry-Managed Error Filter + +Reason code: `custom-error`. + +The error matched a filter that Sentry manages for known malicious payloads, such as fake `npx` setup commands. These aren't real application errors, and there's no project setting for this filter. + +- **Short:** Error matched a known malicious payload. +- **Causes:** + - Errors were sent with a known malicious payload, such as a fake `npx @...` setup command, in the exception type, value, or log message. +- **Actions:** + - You don't need to do anything. This filter removes malicious attempts, not real errors. + - [Contact Sentry support](https://www.sentry.help/en/) if you believe real errors are being dropped. + +#### Log Message Filter + +Reason code: `log-message`. + +The log's message matched a pattern in the project's [Log Message filter](/concepts/data-management/filtering/#log-message). + +- **Short:** Log message matched an inbound filter. +- **Causes:** + - The Log Message filter has a pattern that matches these logs. + - A pattern is broader than intended and also matches logs you meant to keep. +- **Actions:** + - Review the Log Message patterns in [Inbound Filters](https://sentry.io/orgredirect/organizations/:orgslug/settings/projects/:projectId/filters/data-filters/). + - Edit or remove the matching pattern to keep these logs. + +#### Application Metric Name Filter + +Reason code: `trace-metric-name`. + +The metric's name matched a pattern in the project's [Application Metrics filter](/concepts/data-management/filtering/#application-metrics). + +- **Short:** Metric name matched an inbound filter. +- **Causes:** + - The Application Metrics filter has a pattern that matches these metric names. + - A pattern is broader than intended and also matches metrics you meant to keep. +- **Actions:** + - Review the Application Metrics patterns in [Inbound Filters](https://sentry.io/orgredirect/organizations/:orgslug/settings/projects/:projectId/filters/data-filters/). + - Edit or remove the matching pattern to keep these metrics. + +#### Custom Inbound Filter + +Reason code: `custom-inbound-filter:`, where `` is the filter's ID. + +The data matched one of the project's custom inbound filters. Stats groups all custom filters together. + +- **Short:** Matched a custom inbound filter. +- **Causes:** + - A custom inbound filter matches this data on conditions such as error type or message, log message, metric name, release, or user country. + - A filter's conditions or data types (errors, spans, logs, metrics, or all of them) are broader than intended. +- **Actions:** + - Use the ID after the colon to find which custom filter matched. + - Edit or turn off that filter in [Inbound Filters](https://sentry.io/orgredirect/organizations/:orgslug/settings/projects/:projectId/filters/data-filters/) to keep this data. + +#### Invalid CSP Report + +Reason code: `invalid-csp`. + +A Content Security Policy (CSP) report was filtered because its blocked, source, or document URI matched the project's ignored sources. Sentry also uses this reason for browser reports whose type isn't `csp-violation`, which it doesn't support. + +- **Short:** CSP report ignored or unsupported. +- **Causes:** + - The report's URI matched Sentry's default ignored sources, such as `chrome-extension://`, `moz-extension://`, or `safari-extension://` URLs. This list is on by default. + - The report's URI matched one of the project's additional ignored sources. + - The browser sent a Reporting API report whose type isn't `csp-violation`. Sentry doesn't support these, and no setting can change that. +- **Actions:** + - For reports from browser extensions, you usually don't need to do anything. + - To keep these reports, turn off **Use default ignored sources** or edit **Additional ignored sources** in **Project Settings > Security Headers > CSP**. + +#### Dynamic Sampling + +Reason code: `Sampled:`, where the rule IDs identify the sampling rules that applied. + +[Dynamic sampling](/organization/dynamic-sampling/) dropped the data to keep a representative sample. + +- **Short:** Dropped by a dynamic sampling rule. +- **Causes:** + - Your organization's or project's dynamic sampling settings. +- **Actions:** + - To keep more data, raise the target sample rate in your [dynamic sampling](/organization/dynamic-sampling/) settings. + +#### Discarded Transaction + +Reason code: `discarded`. + +Sentry discarded the transaction event after extracting its spans, so the transaction's data is kept as spans instead. A Sentry-side setting controls this, not your project. Attachments sent with the transaction are dropped and reported under this reason too. + +- **Short:** Transaction kept as spans instead. +- **Causes:** + - Sentry turned on span-based storage of transactions for your organization, which it has done for many organizations. + - Your SDK sent attachments with a transaction, so they were dropped with it and counted under this reason. + - Span extraction was rate limited, but the transaction was still discarded. +- **Actions:** + - You usually don't need to do anything. Look for this data as spans. + - If the spans are missing too, check [Stats](/product/stats/) for rate-limited spans. + - [Contact Sentry support](https://www.sentry.help/en/) if attachments sent with transactions are missing. + +#### Denied Metric Name + +Reason code: `denied-name`. + +**Legacy:** Metrics were dropped because their name was on the project's block list in Sentry's retired custom metrics product. This reason is no longer reported and only appears in historical data. + +- **Short:** Legacy: metric name was on a block list. +- **Causes:** + - A metric name was blocked in the custom metrics product, which has since been retired. +- **Actions:** + - You don't need to do anything. The block list no longer exists, so there's nothing to unblock. + +#### Unsupported Metric Namespace + +Reason code: `disabled-namespace`. + +Sentry dropped metrics sent to a namespace it doesn't support. It only accepts its own namespaces, such as sessions, spans, and transactions, and no longer accepts custom metrics. This is an intentional drop on Sentry's side and almost never shows up in Stats. + +- **Short:** Metrics sent to an unsupported namespace. +- **Causes:** + - Your code still sends custom metrics, a product Sentry has removed. +- **Actions:** + - Remove the custom metric calls from your code, or move to [Application Metrics](/product/metrics/). diff --git a/docs/product/explore/img/Trace_explorer_ingestion_delay.png b/docs/product/explore/img/Trace_explorer_ingestion_delay.png new file mode 100644 index 0000000000000000000000000000000000000000..7d5785f35620289f4c26e8410365d392696c7a5c GIT binary patch literal 101783 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⁡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 G|NjNCOU)_( literal 0 HcmV?d00001 diff --git a/docs/product/explore/index.mdx b/docs/product/explore/index.mdx new file mode 100644 index 0000000000000..9a4ab1c21dec2 --- /dev/null +++ b/docs/product/explore/index.mdx @@ -0,0 +1,94 @@ +--- +title: Explore +sidebar_order: 190 +sidebar_section: debug +description: >- + Query and browse traces, logs, metrics, errors, replays, and all datasets from one + place in Sentry. +--- + +[Explore](https://sentry.io/orgredirect/organizations/:orgslug/explore/) is where you query and browse data in Sentry. [Issues](/product/issues/) group related errors so you can proactively triage and solve them. In Explore, filter a dataset, chart the results, and save queries in order to track trends in your application, and turn them into [dashboards](/product/dashboards/), [monitors](/product/monitors-and-alerts/monitors/), and [alerts](/product/monitors-and-alerts/alerts/). + +## Get Started in Explore + +Pick a [dataset](#data-types) from the sidebar. **Starred Queries** can also be found in the sidebar. + +You can query each dataset separately, using the same query language and controls. Or, if you select [Traces](https://sentry.io/orgredirect/organizations/:orgslug/explore/traces), you can add Logs and Application Metrics to your query builder. + +### Page Filters + +The **Project**, **Environment**, and **Time Range** filters at the top of the page scope every query on that dataset. + +### Search + +The search bar filters the current dataset. [Search syntax](/concepts/search/) is the same across search in Sentry. Attribute names depend on the dataset, and any customizations you've set through your platform SDK. See [Searchable Properties](/concepts/search/searchable-properties/) for more details on properties for each dataset. + +### Charts + +**Traces**, **Logs**, and **Metrics** have a visualization section to configure an aggregate (such as `count()`, `avg()`, or `p95()`), a **Group By**, and a **Sorty By** to split the chart's data representation. + +On **Errors**, set the **Interval**, **Display**, and **Y-Axis** on the chart. + +You will also see a representation of dropped data at the bottom of the chart for Traces, Logs, Metrics, and Errors. Click on the line to explore more details and troubleshoot. + +### Table + +**Traces**, **Logs**, and **Errors** have table views that can be customized to show different columns. All tables represent the data that is being queried, and is being displayed in the chart. + +Switch between a samples table and an aggregates table to move between the chart and individual events. + +### Save a Query + +**Save as** stores the current query. Saved queries are listed under **All Queries** in the Explore sidebar. Star a query to pin it under **Starred Queries**. Anyone in the organization with Explore access can open a saved query. + +From the *Save as* menu you can, add the query to a [dashboard](/product/dashboards/) as a widget, or create a [monitor](/product/monitors-and-alerts/monitors/) to turn the query parameters into [Issues](/product/issues/). The exact menu items depend on the dataset. On Errors, you can also set a query as the default view for the Errors page. + +Exporting data downloads the rows in the current results table. File format and row limits depend on the dataset. + +### Query Window + +Your plan limits how far back a query can look: Developer, 7 days | Team, 14 days | Business, 30 days. + +### Ingestion Delay + +Newly sent spans, logs, and metrics can take a short time to show up. Sentry estimates this delay for your organization, so the most recent part of a chart may be marked incomplete. Hover an incomplete bucket to see roughly when its data should settle. Counts there can go up as the rest of the data arrives. + +![Incomplete chart data tooltip](./img/Trace_explorer_ingestion_delay.png) + +This estimate is not a guarantee. Data sent late from your application is not included in the estimate, so events can still arrive after a bucket is marked settled. + +## Data Types + +### Traces + +Use [Traces](/product/trace-explorer/) to follow a request across services and query span attributes. Search span or trace samples, aggregate duration, and compare a time range to the baseline. Traces can also join logs and metrics from the same trace. + +Open [Explore → Traces](https://sentry.io/orgredirect/organizations/:orgslug/explore/traces/). + +### Logs + +Use [Logs](/product/logs/) for structured log lines. Search the message, filter on severity or custom attributes, and open related traces from a log line. + +Open [Explore → Logs](https://sentry.io/orgredirect/organizations/:orgslug/explore/logs/). + +### Metrics + +Use [Application Metrics](/product/metrics/) for counters, gauges, and distributions you send from code, such as `checkout.failed` or `queue.depth`. Chart a metric, group it, and open a sample to see the related traces. + +Open [Explore → Metrics](https://sentry.io/orgredirect/organizations/:orgslug/explore/metrics/). + +### Errors + +Use [Errors](/product/errors/) to query error events across projects. This is separate from Issues. Issues group events for triaging and solving known problems. Errors lets you count, group, and chart the underlying events, discovering patterns and trends in your application. + +Open [Explore → Errors](https://sentry.io/orgredirect/organizations/:orgslug/explore/errors/). + +## Also in Explore + +Profiles, Replays, Releases, and Agents also have Explore pages. They each have more unique functionalities for exploring the data. + +- [Profiles](/product/profiling/) shows the slowest functions and aggregate flame graphs. Open [Explore → Profiles](https://sentry.io/orgredirect/organizations/:orgslug/explore/profiles/). +- [Session Replay](/product/session-replay/) lists user sessions you can filter and watch. Open [Explore → Replays](https://sentry.io/orgredirect/organizations/:orgslug/explore/replays/). +- [Releases](/product/releases/) shows adoption, crash-free sessions, and the commits in a deploy. Open [Explore → Releases](https://sentry.io/orgredirect/organizations/:orgslug/explore/releases/). +- [Agents](/product/agents/) shows conversations, agent traces, and LLM calls. Open [Explore → Agents](https://sentry.io/orgredirect/organizations/:orgslug/explore/agents/). + diff --git a/docs/product/index.mdx b/docs/product/index.mdx index ded78e8dd36d6..af7677acb1d21 100644 --- a/docs/product/index.mdx +++ b/docs/product/index.mdx @@ -28,11 +28,17 @@ Monitor your mobile app build sizes for regressions before they reach users. ## Debug +### [Explore](/product/explore/) +Query and browse traces, logs, metrics, and errors from one sidebar. Saved queries remain in the sidebar when you switch datasets. Profiles, replays, releases, and agents are in the same place. + ### [Traces and Spans](/product/trace-explorer/) -Follow a request from your frontend through your backend and across services. Sentry auto-instruments common frameworks and lets you search, filter, and aggregate span data in the [Trace Explorer](/product/trace-explorer/). +Follow a request from your frontend through your backend and across services. Search, filter, and aggregate span data in [Explore → Traces](/product/trace-explorer/). + +### [Errors](/product/errors/) +Query error events across projects. [Issues](/product/issues/) groups those events for triage. Count, group, and chart the events in [Errors](/product/errors/). ### [Logs](/product/logs/) -Structured logs that live alongside your errors and traces — not in a separate tool. Search by severity, filter by properties, and click from a log line straight into the trace that produced it. [Set up Logs](/product/logs/getting-started/) +Structured logs that live alongside your errors and traces, not in a separate tool. Search by severity, filter by properties, and open the trace from a log line in [Explore → Logs](/product/logs/). [Set up Logs](/product/logs/getting-started/) ### [Agents](/product/agents/) Trace and debug agent workflows, conversations, and MCP servers. Sentry captures LLM calls, tool executions, token usage, and errors alongside the rest of your application telemetry. [Learn more →](/product/agents/) @@ -44,7 +50,7 @@ Watch video-like reproductions of user sessions on [web](/product/session-replay Go beyond "this endpoint is slow" to "this function on line 42 is slow". Continuous profiling captures CPU profiles in production so you can find hot paths without custom instrumentation. ### [Application Metrics](/product/metrics/) -Send counters, gauges, and distributions from your code to track signals like `email.sent`, `checkout.failed`, or `queue.depth`. Every metric is trace-connected. Click from a spike directly into the related traces and errors. +Send counters, gauges, and distributions from your code to track signals like `email.sent`, `checkout.failed`, or `queue.depth`. Every metric is trace-connected. Open a spike from [Explore → Metrics](/product/metrics/) and go straight to the related traces and errors. ### [Log and Trace Drains](/product/drains/) Forward logs and traces to Sentry from platforms like [Vercel](/product/drains/vercel/), [Cloudflare](/product/drains/cloudflare/), and [Heroku](/product/drains/heroku/) without modifying your application code. diff --git a/docs/product/logs/index.mdx b/docs/product/logs/index.mdx index 7dda832ec09e6..ab49b9a62bdfd 100644 --- a/docs/product/logs/index.mdx +++ b/docs/product/logs/index.mdx @@ -10,7 +10,7 @@ og_image: /og-images/product-explore-logs.png ## Overview -With Structured Logs, you can send text-based log information from your applications, whether frontend or backend, to Sentry. +With Structured Logs, you can send text-based log information from your applications, whether frontend or backend, to Sentry. Learn more about how to [Explore](/product/explore/) and [Query](/product/logs/#viewing-and-searching-logs) logs in Sentry. @@ -47,7 +47,7 @@ Raw text search is case sensitive and allows you to search for specific strings ![Raw Text Logs Search](./img/LogSearchRawText.png) **Default Properties Search** -You can also search using the default properties (like `severity`) or [additional custom properties](/concepts/search/searchable-properties/) that you've added to your log entries. +You can also search using the default properties (like `severity`) or [additional custom properties](/concepts/search/searchable-properties/logs/) that you've added to your log entries. ![Property Logs Search](./img/LogSearchTags.png) @@ -103,7 +103,7 @@ To pin or un-pin a log, click the push pin icon that appears when you hover over ## Visualizing Log Data -The Logs Explorer includes a **Visualize** panel under **Advanced** that controls the charts displayed above the log table. +The **Visualize** panel under **Advanced** controls the charts above the log table. ### Configuring Charts @@ -126,7 +126,7 @@ Use the aggregates view to identify high-volume log sources, compare payload siz ## Query Volumes -When the number of logs returned by a query is too high, there are a couple of changes to the logs explorer functionality. To reduce query volumes, consider [filtering logs](/concepts/data-management/filtering/#logs-filtering) or refining your [search query](/concepts/search/) with more specific criteria. +When a query returns too many logs, a few behaviors change in Explore. To reduce the volume, [filter logs](/concepts/data-management/filtering/#logs-filtering) or narrow the [search query](/concepts/search/). - Auto-refresh will be disabled. - Data shown in the chart will be extrapolated from a sampled amount of the complete dataset. @@ -157,11 +157,9 @@ Sentry's trace-connected logs enable a seamless debugging workflow that connects Instead of jumping between different tools and trying to correlate timestamps, trace-connected logs give you a **single flow**: Log search → log entry → trace → root cause. -## Log-based Alerts and Dashboard widgets +## Save Log Queries -You can create [Alerts](/product/monitors-and-alerts/alerts/) and [dashboard widgets](/product/dashboards/widget-builder/) based on your log queries. - -Learn more about [Alerts](/product/monitors-and-alerts/alerts/) and [custom dashboards](/product/dashboards/custom-dashboards/). +**Save as** stores the log query, adds a [dashboard widget](/product/dashboards/widget-builder/), or creates a [monitor](/product/monitors-and-alerts/monitors/). Saved and starred queries are shared across Explore. See [Save a Query](/product/explore/#save-a-query). ![Log Queries](./img/LogQueries.png) diff --git a/docs/product/metrics/index.mdx b/docs/product/metrics/index.mdx index 7f643920a9ae4..d1dac885087b2 100644 --- a/docs/product/metrics/index.mdx +++ b/docs/product/metrics/index.mdx @@ -10,7 +10,7 @@ og_image: /og-images/product-explore-metrics.png ## Overview -With Sentry's Application Metrics, you can send [counters](#counters), [gauges](#gauges), and [distributions](#distributions) from your code to track application health signals like `email.sent`, `checkout.failed`, or `queue.depth`. What makes Sentry's Application Metrics unique is that every metric event is **trace-connected**, meaning you can click directly into the related traces, logs, and errors when something looks off. +With Sentry's Application Metrics, you can send [counters](#counters), [gauges](#gauges), and [distributions](#distributions) from your code to track application health signals like `email.sent`, `checkout.failed`, or `queue.depth`. What makes Sentry's Application Metrics unique is that every metric event is **trace-connected**, meaning you can click directly into the related traces, logs, and errors when something looks off. Learn more about querying and exploring Application Metrics in [Explore](/product/explore/). @@ -66,7 +66,7 @@ Distributions record numeric values to compute statistical aggregates. ## Viewing and Exploring Application Metrics -Each metric query in the Explorer is displayed as its own block (labeled **A**, **B**, **C**, etc.) with a chart on the left and a data panel on the right. See [multiple metrics and equations](#multiple-metrics-and-equations) for more. Each block includes: +Each metric query has its own block (labeled **A**, **B**, **C**, etc.) with a chart on the left and a data panel on the right. See [multiple metrics and equations](#multiple-metrics-and-equations) for more. Each block includes: - **Metric selector** — choose the metric name (like `cart.add`, `chat.open`) - **Agg** — select the aggregation function (examples:`sum`, `avg`, `p95`) @@ -103,7 +103,7 @@ When you notice a spike or dip in the Aggregates view, switch to Samples to dril ### Multiple Metrics and Equations -You can compare several metrics side-by-side in a single Explorer view and derive new values from them without leaving the page: +Compare several metrics side-by-side in one view and derive new values from them without leaving the page: - Click **Add Metric** to add another metric query to the page. Each query gets its own panel and a short label (`A`, `B`, `C`, …) so you can reference it elsewhere. You can reorder queries by dragging their panels, and add up to 26 queries at once. - Click **Add Equation** to create a calculated series that references existing metric labels — for example, `A / B` to compute a ratio between two counters, or `A - B` to subtract a baseline from a current value. Equations appear alongside your metric queries and can be added to dashboards and monitors alongside the underlying metrics. @@ -125,9 +125,9 @@ This example demonstrates how threshold filters split one source metric into buc ## Turning Metrics Into Monitors -Any metric query you build in the Explorer can be turned into a [Monitor](/product/monitors-and-alerts/monitors/) so you get notified when its behavior changes. +Turn a metric query into a [Monitor](/product/monitors-and-alerts/monitors/) so you get notified when its behavior changes. Saved queries themselves are covered in [Explore](/product/explore/#save-a-query). -- From the **Metrics Explorer**, open **Save As → Monitor for** and choose the metric/aggregate you want to monitor. Sentry will pre-fill the Monitor with the metric, aggregate, filters, group-by, and time interval from your current query. +- From [Explore → Metrics](https://sentry.io/orgredirect/organizations/:orgslug/explore/metrics/), open **Save As → Monitor for** and choose the metric or aggregate you want to monitor. Sentry pre-fills the monitor with the metric, aggregate, filters, group-by, and time interval from your current query. When creating a [Monitor](/product/monitors-and-alerts/monitors/), **Application Metrics** is available as a dataset alongside Errors, Spans, Logs, and Releases, and there's a dedicated **Application Metrics** template in the Monitor form to get you started quickly. The Monitor detects threshold breaches, percentage changes, or dynamic anomalies on the metric and creates an issue when conditions are met — which you can then route through [Alerts](/product/monitors-and-alerts/alerts/) to Slack, PagerDuty, email, and more. @@ -135,7 +135,7 @@ When creating a [Monitor](/product/monitors-and-alerts/monitors/), **Application You can pin any metric query as a widget on a [Dashboard](/product/dashboards/) for longer-term tracking: -- From the Metrics Explorer, open **Save As → Dashboard widget** and choose the metric query you want to visualize. +- From [Explore → Metrics](https://sentry.io/orgredirect/organizations/:orgslug/explore/metrics/), open **Save As → Dashboard widget** and choose the metric query you want to visualize. - If you have multiple metric queries on the page, you can add them individually or pick **All Metrics** to create a single widget containing all of them. ## Saving Queries @@ -167,6 +167,8 @@ Application Metrics are typically sampled at 100% while traces are usually sampl ## Metric Attributes +Search these fields in Explore → Metrics with the keys in [Metric Properties](/concepts/search/searchable-properties/metrics/). + Each metric event automatically includes: | **Field** | **Description** | diff --git a/docs/product/monitors-and-alerts/monitors/uptime-monitoring/uptime-tracing.mdx b/docs/product/monitors-and-alerts/monitors/uptime-monitoring/uptime-tracing.mdx index 9b2ba878cc11e..ea8aabf4b611b 100644 --- a/docs/product/monitors-and-alerts/monitors/uptime-monitoring/uptime-tracing.mdx +++ b/docs/product/monitors-and-alerts/monitors/uptime-monitoring/uptime-tracing.mdx @@ -32,7 +32,7 @@ Sentry-Trace: 32d4011600324838afcd666edadc1d09-8d5ca7419a02ca36 ## Tracing Errors -Error tracing is enabled by default for uptime checks. When downtime is detected, an [Uptime Issue](/product/issues/issue-details/uptime-issues/) is created. You can then go to Sentry's [**Trace Explorer**](/product/trace-explorer/) page to view any related errors. +Error tracing is enabled by default for uptime checks. When downtime is detected, an [Uptime Issue](/product/issues/issue-details/uptime-issues/) is created. You can then go to [**Explore → Traces**](/product/trace-explorer/) to view any related errors. Because uptime requests won't override your SDK’s error sampling rate, some errors may not appear in traces if that rate is set to below 1. diff --git a/docs/product/profiling/index.mdx b/docs/product/profiling/index.mdx index 7813da7ab7c38..8e99f705c6812 100644 --- a/docs/product/profiling/index.mdx +++ b/docs/product/profiling/index.mdx @@ -45,7 +45,7 @@ Sentry supports profiling for both backend and frontend use cases with two produ ## Profiling Page -On the [**Profiling**](https://sentry.io/orgredirect/organizations/:orgslug/profiling/) page, you’ll find high level metrics on the slowest functions in the selected project(s), as well as any functions that have regressed or improved in performance within the selected time range. +Open [**Profiles**](https://sentry.io/orgredirect/organizations/:orgslug/explore/profiles/) from [Explore](/product/explore/). On that page, you’ll find high level metrics on the slowest functions in the selected project(s), as well as any functions that have regressed or improved in performance within the selected time range. ![Slowest Functions and Most Regressed Functions on the Profiling page](./img/profiling-page-functions.png) diff --git a/docs/product/releases/index.mdx b/docs/product/releases/index.mdx index b7a9c70ce2e46..2c865873a5440 100644 --- a/docs/product/releases/index.mdx +++ b/docs/product/releases/index.mdx @@ -15,7 +15,7 @@ If you're looking for the latest Sentry SDK release details, head on over to -A _release_ is a version of your code deployed to an environment. When you notify Sentry about a release, you can easily identify new [issues](/product/issues/) and regressions, determine whether an issue was resolved, and monitor the health of your newly deployed app. The **Releases** page provides a visualization of your releases. It presents adoption of releases from the past 24 hours and provides a high-level view of: +A _release_ is a version of your code deployed to an environment. When you notify Sentry about a release, you can easily identify new [issues](/product/issues/) and regressions, determine whether an issue was resolved, and monitor the health of your newly deployed app. Open the **Releases** page from [Explore](https://sentry.io/orgredirect/organizations/:orgslug/explore/releases/). It presents adoption of releases from the past 24 hours and provides a high-level view of: - Each release version (a short version of the release name without the hash) - The associated project diff --git a/docs/product/sentry-basics/performance-monitoring.mdx b/docs/product/sentry-basics/performance-monitoring.mdx index 022dde6dfb4fe..ead55e6e52743 100644 --- a/docs/product/sentry-basics/performance-monitoring.mdx +++ b/docs/product/sentry-basics/performance-monitoring.mdx @@ -38,9 +38,9 @@ These appear alongside error issues in your [Issues](/product/issues/) feed, so ### Trace Explorer -The [Trace Explorer](/product/trace-explorer/) lets you query all your span data by any attribute. Find the p95 duration of a specific endpoint, identify which user segments are experiencing slowdowns, or compare a time window against your baseline to isolate regressions. +[Trace Explorer](/product/trace-explorer/) queries span data by any attribute. Find the p95 duration of a specific endpoint, identify which user segments are experiencing slowdowns, or compare a time window against your baseline to isolate regressions. -You can also group span durations by [custom span attributes](/product/trace-explorer/#aggregating-span-attributes) to compare operations, such as p95 checkout duration by payment provider, and use these queries in [dashboards](/product/dashboards/) and [alerts](/product/monitors-and-alerts/alerts/). +You can also group span durations by [custom span attributes](/product/trace-explorer/#aggregating-span-attributes) to compare operations, such as p95 checkout duration by payment provider, and use these queries in [dashboards](/product/dashboards/) and [monitors](/product/monitors-and-alerts/monitors/). Page filters and saved queries are covered in [Explore](/product/explore/).
diff --git a/docs/product/session-replay/index.mdx b/docs/product/session-replay/index.mdx index d230773753f44..2afd16c9d2502 100644 --- a/docs/product/session-replay/index.mdx +++ b/docs/product/session-replay/index.mdx @@ -7,6 +7,8 @@ description: "Watch video-like reproductions of real user sessions to debug erro Session Replay gives you video-like reproductions of real user sessions so you can see exactly what a user did before, during, and after a bug or performance issue. Instead of guessing from stack traces and logs alone, you can watch the experience unfold — clicks, navigations, network requests, console output, and errors — all in context and synced to a timeline. +Open replays from [Explore](https://sentry.io/orgredirect/organizations/:orgslug/explore/replays/). + **Why it matters:** - **Reproduce issues without asking users** — See the exact sequence of actions that led to an error, a rage click, or a slow transaction, without needing to reproduce it locally. diff --git a/docs/product/trace-explorer/index.mdx b/docs/product/trace-explorer/index.mdx index 08bb34ab6793c..99b1fa5e5d746 100644 --- a/docs/product/trace-explorer/index.mdx +++ b/docs/product/trace-explorer/index.mdx @@ -8,7 +8,7 @@ description: >- og_image: /og-images/product-explore-trace-explorer.png --- -The [**Trace Explorer**](https://sentry.io/orgredirect/organizations/:orgslug/traces/) in Sentry is designed to make performance investigation easier and more intuitive. You can now explore span samples, visualize span attributes, and aggregate your data with flexible queries and filters. This guide will walk you through the key concepts and features of the Trace Explorer. +[**Trace Explorer**](https://sentry.io/orgredirect/organizations/:orgslug/traces/) in Sentry is designed to make performance investigation easier and more intuitive. You can explore span samples, visualize span attributes, and aggregate your data with flexible queries and filters. This guide will walk you through the key concepts and features of Trace Explorer. To learn more about Explore as a whole, see [Explore](/product/explore/). ![Trace Explorer Screenshot](./img/Trace_Explorer_home.png) @@ -39,22 +39,16 @@ You can group span durations by custom span attributes to investigate patterns, - **Finding problematic API calls**: Aggregate by `http.url` and filter where `avg.(span.duration) > 2s` to identify slow external API calls. - **Database query analysis**: Aggregate by `db.query` and sort by `avg(span.duration)` to find inefficient queries. -With these tools, the new Trace Explorer gives you powerful ways to understand your application's performance, identify bottlenecks, and make informed optimizations. - ### Agent Tracing -Set up Agent Tracing to capture traces for agents in Trace Explorer. [agent traces](/product/agents/) include model calls, tool executions, and token usage, so you can use the same search and aggregation tools when debugging agents. +Set up Agent Tracing to capture traces for agents in Trace Explorer. [Agent traces](/product/agents/) include model calls, tool executions, and token usage, so you can use the same search and aggregation tools when debugging agents. - **Finding slow agent runs**: Search for `span.op:gen_ai.invoke_agent` and visualize `p90(span.duration)` grouped by `gen_ai.agent.name` to compare traces for agents. - **Debugging tool calls**: Search for `span.op:gen_ai.execute_tool` and visualize `avg(span.duration)` grouped by `gen_ai.tool.name` to find tools that stall your agent. - - You plan type determines your query window: Developer: 7 days | Team: 14 days | Business: 30 days. - - ## Browsing Span and Trace Samples -Trace Explorer allows you to browse span and trace samples and inspect them. Here's how: +Browse span and trace samples, then inspect a single span or trace: 1. **Search for Samples**: - Use the search bar to filter results based on default or custom attributes, tags, and strings like `http.request_method is "GET` @@ -70,7 +64,7 @@ Trace Explorer allows you to browse span and trace samples and inspect them. Her ## Visualizing Span Attributes -Trace Explorer makes it easy to visualize metrics aggregated from any span attribute. +The Visualize section charts an aggregate of any span attribute. 1. **Set Up Visualization**: - Use the **Visualize** section to add metrics like `avg(span.duration)` or `p90(span.duration)` to the same chart by clicking **Add Series** or a different chart by clicking the **+** icon. @@ -86,7 +80,7 @@ The line chart updates dynamically as you apply filters, helping you track trend ## Aggregating Span Data -Dive deeper into your data with aggregation capabilities in Trace Explorer. +The Aggregates tab groups span data so you can compare patterns instead of reading individual spans. 1. Click into the **Aggregates** tab. @@ -114,7 +108,7 @@ This helps you quickly identify whether a latency spike, error surge, or other a ### How to Use Attribute Comparison -- On the Trace Explorer page, begin by dragging across a chart's timeline to narrow down to the time range that you want to compare. You will see an option to `Compare Attribute Breakdowns`. +- On the Traces page, drag across a chart's timeline to narrow down to the time range that you want to compare. You will see an option to `Compare Attribute Breakdowns`. - When you click on `Compare Attribute Breakdowns`, the attribute comparison charts below will load with the baseline and time range differences. Purple bars on the left are the time range values, and gray bars on the right are the baseline values. **Note:** Clicking anywhere else on the page while in *compare attributes* mode will stop the comparison and reset to baseline. @@ -169,12 +163,12 @@ Spans, logs, and application metrics are supported as join targets. ### How to Use Cross-Event Querying -1. In [Trace Explorer](https://sentry.io/orgredirect/organizations/:orgslug/traces/), click the **Plus (+)** button next to the search bar. +1. In [Traces](https://sentry.io/orgredirect/organizations/:orgslug/explore/traces/), click the **Plus (+)** button next to the search bar. 2. Choose the event type you want to join on: **Spans**, **Logs**, or **Metrics**. 3. If you chose **Metrics**, pick the specific metric you want to join on (for example, `checkout.duration`). 4. Add filters for that event type, such as `severity:error` on a logs join, `db.query:"SELECT *"` on a spans join, or `value > 5000` on a metrics join. -Trace Explorer returns spans whose trace also contains at least one event matching your join filter. +Traces returns spans whose trace also contains at least one event matching your join filter. ### Example: Backend Services That Logged Errors @@ -190,18 +184,18 @@ The span results now include only traces that also contain at least one error lo [Application Metrics](/product/metrics/) are typically sampled at 100%, while traces are sampled at a much lower rate, so a specific metric sample often won't have a trace attached to it. Joining on **Application Metrics** lets you search directly for traces that contain a matching metric event, giving you a comparable trace for the pattern you're investigating: -1. In Trace Explorer, click the **Plus (+)** next to the search bar and choose **Application Metrics**. +1. In Traces, click the **Plus (+)** next to the search bar and choose **Application Metrics**. 2. Pick the metric you want to trace back (for example, `checkout.duration`). 3. Add filters that match the pattern you're investigating — for example, `value > 5000` for slow checkouts, or a custom attribute like `region:eu` to scope by segment. 4. Pick a trace from the results. It contains at least one event of that metric matching your filter, giving you the same debugging context (spans, logs, related errors) as a trace directly attached to the metric sample would. -## Create Alerts and Dashboard Widgets From Queries or Compare Queries +## Save As Functionality -You can create Alerts and Dashboard widgets from your queries by clicking the "Save As" button: +**Save as** stores the query, adds a dashboard widget, or creates a monitor. Saved and starred queries are shared across Explore. See [Save a Query](/product/explore/#save-a-query). ![Trace Explorer Screenshot =800x](./img/trace_explorer_save.png) -You can also run side-by-side comparisons of different queries to analyze changes or differences in span data. +Run side-by-side comparisons of different queries to analyze changes in span data. Open compare from **Save as**. ## Practical Examples @@ -278,7 +272,7 @@ Since each span was sampled with different weights, Sentry extrapolates the **co 10 + 2 = 12 estimated spans ``` -Trace Explorer will display **Count: 12**. +Traces displays **Count: 12**. ### Sums @@ -288,7 +282,7 @@ Similarly, Sentry incorporates the weight into **sum**: 10 * 100ms + 2 * 200ms = 1.4s ``` -Trace Explorer will display **Sum: 1.4ms**. +Traces displays **Sum: 1.4ms**. ### Averages and Percentiles @@ -308,12 +302,12 @@ If your sampling rate is **too low** for an accurate extrapolation (for example, ![Trace Explorer Warning](./img/Trace_explorer_low_samples.png) -Even if you sample your spans, **Trace Explorer's extrapolation gives you reasonably accurate answers** for counts, averages, and percentiles -- without you needing to do anything extra. +Even if you sample your spans, extrapolation gives you reasonably accurate answers for counts, averages, and percentiles. You don't need to do anything extra. ### When to Turn Off Extrapolation While extrapolation is usually helpful, if you are exclusively looking to confirm your sampling usage or look exclusively at sampled data, you can turn off extrapolation. -You can disable extrapolation using the settings icon above charts in tools like Trace Explorer. +Disable extrapolation with the settings icon above the chart when you want the numbers to reflect only the spans Sentry stored. ### How to Tweak Client Side Sampling to Find More Samples @@ -327,10 +321,4 @@ For example, you might sample your checkout flow at 100% to catch any issues, wh To configure `tracesSampler` for your SDK, see the tracing options in your SDK's [configuration documentation](/platform-redirect/?next=/configuration/options/). -## Ingestion Delay - -Newly sent spans can take a short time to show up in Sentry. Sentry estimates this delay for your organization, so the most recent part of a chart may be marked as incomplete. Hover over an incomplete bucket to see roughly when its data should settle. Counts there may go up as the rest of the data arrives. This also applies to logs and metrics. - -![Incomplete chart data tooltip](./img/Trace_explorer_ingestion_delay.png) - -This estimate is not a guarantee. Some delays, such as data sent late from your application, can't be measured, so data may still arrive after buckets are marked as settled. +Recent spans, logs, and metrics can show up as incomplete while ingestion catches up. See [Ingestion Delay](/product/explore/#ingestion-delay). diff --git a/includes/ai-dashboards/ai-spans-view.mdx b/includes/ai-dashboards/ai-spans-view.mdx index e42b9e9156a3c..26f5aa7ffba3c 100644 --- a/includes/ai-dashboards/ai-spans-view.mdx +++ b/includes/ai-dashboards/ai-spans-view.mdx @@ -1,4 +1,4 @@ -When you click on a trace, you'll be taken to the Trace Explorer with the **AI Spans** tab selected. This view shows an abbreviated trace focused on AI-related spans: +When you click on a trace, you'll be taken to Explore → Traces with the **AI Spans** tab selected. This view shows an abbreviated trace focused on AI-related spans: ![AI Spans View =900x](./img/agent-ai-spans-view.png) diff --git a/includes/ai-dashboards/overview.mdx b/includes/ai-dashboards/overview.mdx index 44651f62f710d..6b31730879c85 100644 --- a/includes/ai-dashboards/overview.mdx +++ b/includes/ai-dashboards/overview.mdx @@ -17,4 +17,4 @@ Click into any model listed under widgets to get to the Models dashboard. Click Below these widgets is a traces table showing trace ID, agents, root duration, errors, LLM calls, tool calls, total tokens, total cost, and timestamp. -Click on any trace to open the [AI Spans view](#ai-spans-view) in Trace Explorer. +Click on any trace to open the [AI Spans view](#ai-spans-view) in Explore → Traces. diff --git a/redirects.js b/redirects.js index 7e728c5e52388..5d7fecaad69f5 100644 --- a/redirects.js +++ b/redirects.js @@ -2173,14 +2173,6 @@ const userDocsRedirects = [ source: '/product/explore/logs/:path*', destination: '/product/logs/:path*', }, - { - source: '/product/explore', - destination: '/product/trace-explorer/', - }, - { - source: '/product/explore/', - destination: '/product/trace-explorer/', - }, { source: '/platforms/javascript/best-practices/browser-extensions/', destination: '/platforms/javascript/best-practices/shared-environments/', From fe396afaad09a165537c917d8f6cc9cc740d246e Mon Sep 17 00:00:00 2001 From: "sentry-api-schema-updater[bot]" <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> Date: Wed, 21 Oct 2026 17:06:42 +0000 Subject: [PATCH 031/127] Bump API schema to e8dba7a5 (#20144) Co-authored-by: sentry-api-schema-updater[bot] <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> --- src/build/resolveOpenAPI.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/resolveOpenAPI.ts b/src/build/resolveOpenAPI.ts index 327243ba7287d..01c970a4b97c0 100644 --- a/src/build/resolveOpenAPI.ts +++ b/src/build/resolveOpenAPI.ts @@ -6,7 +6,7 @@ import {DeRefedOpenAPI, Parameter} from './open-api/types'; // SENTRY_API_SCHEMA_SHA is used in the sentry-docs GHA workflow in getsentry/sentry-api-schema. // DO NOT change variable name unless you change it in the sentry-docs GHA workflow in getsentry/sentry-api-schema. -const SENTRY_API_SCHEMA_SHA = '90906f9663c1ec6f0710730e3b4423cca08202b2'; +const SENTRY_API_SCHEMA_SHA = 'e8dba7a51eb02705ffc062baf3f581856f6c684e'; const activeEnv = process.env.GATSBY_ENV || process.env.NODE_ENV || 'development'; From 39f102db4441cfa62301da33837bc03ab8026d51 Mon Sep 17 00:00:00 2001 From: "sentry-api-schema-updater[bot]" <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> Date: Wed, 21 Oct 2026 17:10:36 +0000 Subject: [PATCH 032/127] Bump API schema to f3f06b3a (#20145) Co-authored-by: sentry-api-schema-updater[bot] <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> --- src/build/resolveOpenAPI.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/resolveOpenAPI.ts b/src/build/resolveOpenAPI.ts index 01c970a4b97c0..2f38466e8363e 100644 --- a/src/build/resolveOpenAPI.ts +++ b/src/build/resolveOpenAPI.ts @@ -6,7 +6,7 @@ import {DeRefedOpenAPI, Parameter} from './open-api/types'; // SENTRY_API_SCHEMA_SHA is used in the sentry-docs GHA workflow in getsentry/sentry-api-schema. // DO NOT change variable name unless you change it in the sentry-docs GHA workflow in getsentry/sentry-api-schema. -const SENTRY_API_SCHEMA_SHA = 'e8dba7a51eb02705ffc062baf3f581856f6c684e'; +const SENTRY_API_SCHEMA_SHA = 'f3f06b3a01c75e64f3939a23337cd82421dae305'; const activeEnv = process.env.GATSBY_ENV || process.env.NODE_ENV || 'development'; From 1bac9507810c1e67992d4a46d85fc6b8a11107d4 Mon Sep 17 00:00:00 2001 From: "sentry-api-schema-updater[bot]" <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> Date: Wed, 21 Oct 2026 17:12:12 +0000 Subject: [PATCH 033/127] Bump API schema to 9697fe8e (#20146) Co-authored-by: sentry-api-schema-updater[bot] <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> --- src/build/resolveOpenAPI.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/resolveOpenAPI.ts b/src/build/resolveOpenAPI.ts index 2f38466e8363e..a252fd79e36a9 100644 --- a/src/build/resolveOpenAPI.ts +++ b/src/build/resolveOpenAPI.ts @@ -6,7 +6,7 @@ import {DeRefedOpenAPI, Parameter} from './open-api/types'; // SENTRY_API_SCHEMA_SHA is used in the sentry-docs GHA workflow in getsentry/sentry-api-schema. // DO NOT change variable name unless you change it in the sentry-docs GHA workflow in getsentry/sentry-api-schema. -const SENTRY_API_SCHEMA_SHA = 'f3f06b3a01c75e64f3939a23337cd82421dae305'; +const SENTRY_API_SCHEMA_SHA = '9697fe8e47db0be556069ad3c6dd9a8195d1db4a'; const activeEnv = process.env.GATSBY_ENV || process.env.NODE_ENV || 'development'; From 3c5e7cca9cf4e467e4b158145b0fc719e596259d Mon Sep 17 00:00:00 2001 From: "sentry-api-schema-updater[bot]" <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> Date: Wed, 21 Oct 2026 17:15:52 +0000 Subject: [PATCH 034/127] Bump API schema to 4331a7d3 (#20147) Co-authored-by: sentry-api-schema-updater[bot] <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> --- src/build/resolveOpenAPI.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/resolveOpenAPI.ts b/src/build/resolveOpenAPI.ts index a252fd79e36a9..cd7467ef46b04 100644 --- a/src/build/resolveOpenAPI.ts +++ b/src/build/resolveOpenAPI.ts @@ -6,7 +6,7 @@ import {DeRefedOpenAPI, Parameter} from './open-api/types'; // SENTRY_API_SCHEMA_SHA is used in the sentry-docs GHA workflow in getsentry/sentry-api-schema. // DO NOT change variable name unless you change it in the sentry-docs GHA workflow in getsentry/sentry-api-schema. -const SENTRY_API_SCHEMA_SHA = '9697fe8e47db0be556069ad3c6dd9a8195d1db4a'; +const SENTRY_API_SCHEMA_SHA = '4331a7d368437d5e67dc508b6d98ddb9234117e1'; const activeEnv = process.env.GATSBY_ENV || process.env.NODE_ENV || 'development'; From d17048d5102db55416e1cd821a773f1cce906fa5 Mon Sep 17 00:00:00 2001 From: "sentry-api-schema-updater[bot]" <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> Date: Wed, 21 Oct 2026 17:16:52 +0000 Subject: [PATCH 035/127] Bump API schema to 82d40817 (#20148) Co-authored-by: sentry-api-schema-updater[bot] <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> --- src/build/resolveOpenAPI.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/resolveOpenAPI.ts b/src/build/resolveOpenAPI.ts index cd7467ef46b04..3f976e9296247 100644 --- a/src/build/resolveOpenAPI.ts +++ b/src/build/resolveOpenAPI.ts @@ -6,7 +6,7 @@ import {DeRefedOpenAPI, Parameter} from './open-api/types'; // SENTRY_API_SCHEMA_SHA is used in the sentry-docs GHA workflow in getsentry/sentry-api-schema. // DO NOT change variable name unless you change it in the sentry-docs GHA workflow in getsentry/sentry-api-schema. -const SENTRY_API_SCHEMA_SHA = '4331a7d368437d5e67dc508b6d98ddb9234117e1'; +const SENTRY_API_SCHEMA_SHA = '82d40817d1b7cf04851dc7bdc6d26cca862503fe'; const activeEnv = process.env.GATSBY_ENV || process.env.NODE_ENV || 'development'; From 1c5b4c92e60bbf6434642e37c8c7519a7fe6d65f Mon Sep 17 00:00:00 2001 From: "sentry-api-schema-updater[bot]" <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> Date: Wed, 21 Oct 2026 17:20:01 +0000 Subject: [PATCH 036/127] Bump API schema to 35fcbf58 (#20149) Co-authored-by: sentry-api-schema-updater[bot] <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> --- src/build/resolveOpenAPI.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/resolveOpenAPI.ts b/src/build/resolveOpenAPI.ts index 3f976e9296247..7758577c8bea4 100644 --- a/src/build/resolveOpenAPI.ts +++ b/src/build/resolveOpenAPI.ts @@ -6,7 +6,7 @@ import {DeRefedOpenAPI, Parameter} from './open-api/types'; // SENTRY_API_SCHEMA_SHA is used in the sentry-docs GHA workflow in getsentry/sentry-api-schema. // DO NOT change variable name unless you change it in the sentry-docs GHA workflow in getsentry/sentry-api-schema. -const SENTRY_API_SCHEMA_SHA = '82d40817d1b7cf04851dc7bdc6d26cca862503fe'; +const SENTRY_API_SCHEMA_SHA = '35fcbf58e32fe7ecb5b7fce5dcd6fb5c29f07374'; const activeEnv = process.env.GATSBY_ENV || process.env.NODE_ENV || 'development'; From 14991c77d70dca8df9658d8d8f2eaace4b55d711 Mon Sep 17 00:00:00 2001 From: Alex Krawiec Date: Wed, 21 Oct 2026 11:26:06 -0700 Subject: [PATCH 037/127] docs(integrations): Consolidate code mappings onto one page (#20037) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## DESCRIBE YOUR PR Code mapping setup is moving out of the integration configuration tab and into project and repository settings. This PR consolidates the docs to match. Today the setup walkthrough is copied under every SCM integration and again under Suspect Commits. Every copy describes the old **Settings > Integrations > Configure > Code Mappings** tab and the old **Stack Trace Root** / **Source Code Root** field names. This replaces those copies with one canonical page and short provider-specific links. - Add `/integrations/source-code-mgmt/code-mappings/` covering what code mappings do, both new entry points, the path fields, how to pick prefixes, editing, automatic mappings, bulk upload, and platform exceptions - Replace the duplicated setup on the GitHub, GitLab, Bitbucket, Azure DevOps, Perforce, and Cursor Origin pages, keeping each provider's `#stack-trace-linking` anchor and provider-specific behavior - Trim Suspect Commits to suspect-commit behavior and drop the stale Arcade demo - Rename **Stack Trace Root** to **Stack trace prefix** and **Source Code Root** to **Repository prefix** on the Java, Godot, and Cursor Origin pages (the CLI JSON keys `stackRoot` and `sourceRoot` are unchanged) - Repoint code mapping links on SCM Source Context, Ownership Rules, Web Vitals, Go source context and troubleshooting, and the CLI page - List the new page under Features on the Source Code Management index - Add three screenshots of the new UI: the Connected Repositories panel, the organization Repositories page, and the connect modal - Delete the stale configure-modal include and five duplicated copies of the native stack trace screenshot No redirects are needed: the old content lived at anchors on pages that still exist, and every one of those anchors is preserved. ### Note for reviewers Per the spec, this is written as though `organizations:code-mappings-refactor` is fully rolled out and the integration **Code Mappings** tab is gone. The Vercel preview will describe UI that may not match production yet. ## IS YOUR CHANGE URGENT? Help us prioritize incoming PRs by letting us know when the change needs to go live. Select exactly one option. For deadlines, replace `YYYY-MM-DD` with the due date. You can update this information later by editing the PR description. - [ ] Urgent deadline (GA date, etc.): YYYY-MM-DD - [ ] Other deadline: YYYY-MM-DD - [x] No deadline: Not urgent, can wait up to 1 week+ ## SLA - Teamwork makes the dream work, so please add a reviewer to your PRs. - Please give the docs team up to 1 week to review your PR unless you've supplied a deadline. Thanks in advance for your help! ## PRE-MERGE CHECKLIST _Make sure you've checked the following before merging your changes:_ - [ ] Checked Vercel preview for correctness, including links - [ ] PR was reviewed and approved by any necessary SMEs (subject matter experts) - [ ] PR was reviewed and approved by a member of the [Sentry docs team](https://github.com/orgs/getsentry/teams/docs) 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 5 --- docs/cli/code-mappings.mdx | 2 +- .../source-code-mgmt/azure-devops/index.mdx | 46 +------- .../img/code-mappings-stacktrace-native.png | Bin 101153 -> 0 bytes .../source-code-mgmt/bitbucket/index.mdx | 47 +------- .../img/code-mappings-connect-modal.png | Bin 0 -> 221361 bytes .../code-mappings-connected-repositories.png | Bin 0 -> 171212 bytes .../code-mappings-repositories-settings.png | Bin 0 -> 152705 bytes .../img/code-mappings-stacktrace-native.png | Bin .../source-code-mgmt/code-mappings/index.mdx | 100 ++++++++++++++++++ .../source-code-mgmt/cursor-origin/index.mdx | 18 +--- .../img/code-mappings-stacktrace-native.png | Bin 101153 -> 0 bytes .../source-code-mgmt/github/index.mdx | 54 +--------- .../img/code-mappings-stacktrace-native.png | Bin 101153 -> 0 bytes .../source-code-mgmt/gitlab/index.mdx | 47 +------- docs/integrations/source-code-mgmt/index.mdx | 1 + .../source-code-mgmt/perforce/index.mdx | 26 +---- .../source-code-mgmt/source-context/index.mdx | 2 +- .../go/common/source-context/index.mdx | 2 +- docs/platforms/go/common/troubleshooting.mdx | 2 +- .../godot/configuration/source-context.mdx | 6 +- .../java/common/source-context/index.mdx | 8 +- .../performance-issues/web-vitals/index.mdx | 2 +- docs/product/issues/ownership-rules/index.mdx | 6 +- .../img/code-mappings-stacktrace-native.png | Bin 101153 -> 0 bytes docs/product/issues/suspect-commits/index.mdx | 59 +---------- .../code-mappings-configure-modal.md | 1 - .../img/code-mappings-configure-modal.png | Bin 50726 -> 0 bytes 27 files changed, 133 insertions(+), 296 deletions(-) delete mode 100644 docs/integrations/source-code-mgmt/bitbucket/img/code-mappings-stacktrace-native.png create mode 100644 docs/integrations/source-code-mgmt/code-mappings/img/code-mappings-connect-modal.png create mode 100644 docs/integrations/source-code-mgmt/code-mappings/img/code-mappings-connected-repositories.png create mode 100644 docs/integrations/source-code-mgmt/code-mappings/img/code-mappings-repositories-settings.png rename docs/integrations/source-code-mgmt/{azure-devops => code-mappings}/img/code-mappings-stacktrace-native.png (100%) create mode 100644 docs/integrations/source-code-mgmt/code-mappings/index.mdx delete mode 100644 docs/integrations/source-code-mgmt/github/img/code-mappings-stacktrace-native.png delete mode 100644 docs/integrations/source-code-mgmt/gitlab/img/code-mappings-stacktrace-native.png delete mode 100644 docs/product/issues/suspect-commits/img/code-mappings-stacktrace-native.png delete mode 100644 includes/common-imgs/code-mappings-configure-modal.md delete mode 100644 includes/common-imgs/img/code-mappings-configure-modal.png diff --git a/docs/cli/code-mappings.mdx b/docs/cli/code-mappings.mdx index be4f0e7000cc8..5c65918fc8e81 100644 --- a/docs/cli/code-mappings.mdx +++ b/docs/cli/code-mappings.mdx @@ -10,7 +10,7 @@ _Available in version 3.3.4 of Sentry CLI_ Code mappings link stack trace paths to source code paths in your repository. They enable features like [source context](/platforms/java/source-context/), [suspect commits](/product/issues/suspect-commits/), [stack trace linking](/integrations/source-code-mgmt/github/#stack-trace-linking), and [code owners](/product/issues/ownership-rules/). -You can [manage code mappings through the Sentry web UI](/product/issues/suspect-commits/#set-up-code-mappings), or upload them in bulk using Sentry CLI. It is also possible to upload code mappings automatically in your CI process to keep them in sync with your repository structure. +You can [manage code mappings through the Sentry web UI](/integrations/source-code-mgmt/code-mappings/), or upload them in bulk using Sentry CLI. It is also possible to upload code mappings automatically in your CI process to keep them in sync with your repository structure. ## Permissions diff --git a/docs/integrations/source-code-mgmt/azure-devops/index.mdx b/docs/integrations/source-code-mgmt/azure-devops/index.mdx index 12771010540ff..54d3e45c20c82 100644 --- a/docs/integrations/source-code-mgmt/azure-devops/index.mdx +++ b/docs/integrations/source-code-mgmt/azure-devops/index.mdx @@ -112,51 +112,9 @@ When Sentry sees this, we’ll automatically annotate the matching issue with re ### Stack Trace Linking -Stack trace linking takes you from a file in your Sentry stack trace to that same file in your source code. If you have commit tracking set up in Sentry, we can take you to the exact version (using the commit associated with the event) of the source code when the error occurred. Otherwise we'll link you to the current state of the source code (using the default branch). +Stack trace linking takes you from a file in your Sentry stack trace to the same file in Azure DevOps. If you've set up commit tracking, Sentry links to the version of the file from the commit associated with the event. Otherwise, it links to the branch set in your code mapping. -1. Navigate to [**Settings > Integrations**](https://sentry.io/orgredirect/organizations/:orgslug/settings/integrations/) > **Azure DevOps > Configurations**. - -1. Click "Configure" (the gear icon) next to your Azure DevOps Instance. - -1. Click the "Code Mappings" tab. - -1. Set up a code mapping for each project you want to have stack trace linking. To create a new code mapping, click "Add Mapping". - -1. Fill out the form, then click "Save Changes". Each form field is described below: - - **Project** (required): This is the Sentry project. - - **Repo** (required): This is the Azure DevOps project associated with the Sentry project above. If you have more than one Azure DevOps project being used per Sentry project, you'll need multiple code mappings. - - **Branch** (required): This is the default branch of your code we fall back to if you do not have commit tracking set up. - - **Stack Trace Root** and **Source Code Root** (optional): See below for information on determining these values. - -#### Stack Trace Root and Source Code Root - - - -The following information is only valid for platforms which use traditional file paths. Platforms with package names require additional steps. For **Java**, read more in the [page on source context](/platforms/java/source-context/#setting-up-code-mappings). - - - -First, navigate to a stack trace that you wish to map. Find an **In App** frame, which is denoted by a bubble on the right side of the frame. The filename will be shown as the first piece of text at the left hand side of the frame header. In this example, it is `src/main.py`. - - - -For certain native platforms, the stack trace will look different. In cases like these, you can find the absolute path by hovering over the filename. - -![Highlighting where in the UI to find the file path for native stack traces](./img/code-mappings-stacktrace-native.png) - -If you aren’t sure, you can look at the event JSON by clicking on the `{}` button in the event header. Find the text in the frame's `filename` or `abs_path`. - - - -Next, locate the file seen in the stack trace with your source code provider (e.g. GitHub). In this example, the path is `flask/src/main.py` (`empower` is ignored since it is the name of the repo). - - - -Compare the file path from the stack trace with the path found in your source repository. In this example, the `src/` folder in the stack trace matches the `flask/src` folder in the source code. Using that information, set the **Stack Trace Root** to `src/` and the **Source Code Root** to `flask/src/`. This tells Sentry to replace all file paths beginning in `src/` with `flask/src/` when searching for the source code. - -For best results, we recommend always providing a non-empty value for the **Stack Trace Root** when possible. - - +To set up stack trace linking, [add a code mapping](/integrations/source-code-mgmt/code-mappings/) for each Sentry project and Azure DevOps repository you want to link. ### Source Context diff --git a/docs/integrations/source-code-mgmt/bitbucket/img/code-mappings-stacktrace-native.png b/docs/integrations/source-code-mgmt/bitbucket/img/code-mappings-stacktrace-native.png deleted file mode 100644 index 0628a8cb9fe70dea77fde60b8bb53e475cf71778..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101153 zcmc$GV{~O*(`|4%Hah9>#7U=P+jhER+qP}n>e#kBwr$($_~zmJjd8zs+@JT?K6}-| zUR8^;W}OgOX%ToBEEo_F5O^_BL3t1mfG7wEXbBX=M+)YI&F_zwPLm(X_R3O{?0Qxf z)H?cBx(3wF7SB^TjEYbPPlM4yXLiAjo9%38p{*hJLT z*5JFV^bb8(Gd(taLLP1yPG|Oy3M>rlb%4$m=9YHs&Rm3l*316!`;TNALg1fS?9I3c zm8E2X0#>#LKxS%MYFa{W7$B#uz9GB3pzz;?Ki;?qjqUBN*=cB;oSdkg7^tmmjcDlD z*w|=j>1pWcsXlU0*|}KS>o`+c+7bOx#b0#@8rbRCnpoSLSXl!9s8dJR%E6wCknlqe z{JU}kXOsWbZfW;-_dgUt^M{0nj+&O{&+LD^vCEn`87e<*_H zZ%urtl;&TZe!To^6$8r;Q`mm!oHv4|^TS@CcJd+IxxmDu?VlugLI2m%eAh~sjK zcjFOV#or5y@|xm@#fOjd_r%yeO75->Z!_88co!-(hQfF>+S{Nqn)@9ORo}lIA;W4cUR5?v$70y zUiL9Lv#oP@bB4$$V-?%mL;p#Bd36X)9P8FU@ zPxTpxsa~Cl$!s}xTz7_X)t=^G`+X>Sw}8_n9v>Y#{j&sM7^u<l>~4s8S}5ToyrVUNPm ziL^Kv86>Kv5rM4wcnQqU9}LdeGW|FYY@p zdXc~Dc%`Ybgp68)JbrVgZyz=tgDze#$eZm3ceTjAG%+cH6Ts_67S(fsb!m*pa45`w zVHLqkDE+iK4J@Yu`DvK*?+~{KOct9;m1cB8d^eXWW4f3Z0%;6&Xtg&HE^OQPG%Ig{ z+0Qg9e^J9Qn6MLhmCgdoWJ-4JXe=-{163$wZMo#JBbu9pW%4 zQ#%=0_A=-1VSy%+D*R)OabbX@NJ;*2;7eK5TnuA|m{}-d7*4m=D>(%29adNS^lXjV zgUZ-?pmlWzHa=W)U0vOBU+?hJqt*9wtERH}ct#w_nMY-+tJb<+4-eICOsS#Vwx7Nn z_lgsf9j9L_OTH`kN7W`IB(YVR-d+rsi2o8Phwzz=XH;!|NlQhalThB6D)%)q;|J>2 zHwbKolZ$R6lFHAA;3U=Sqa>3`VoSL-;OF_a5vH~q)AO-Aky5b{L~P&V=f>;=$^MWO z%=o#xhbFrngO>6c+G?aL8w88BEK5?)0L4nBG3`}h#CW{<`&fyg7d~4&@jwQrU6~|} zl2%~mW<+q`Kl@$=qECT+rh1P4o}V=SsQXG%8P)GFY2iDNA7kPg@&I-yu=%-@M}=?- zlPtG=AuM`xS`GW9M|lZJF<6!iCCw*{Mr^lf2Nvq`4ze=00Ydbc+qxCG+v^%z*DV^F znRJ(0P6zjEb;n+%N9Pyod_F#0 zC%Y@El(Ja|@7E|}DLi2XW69HBgH+!3V8kUw%MzTjI@*t3U@;a{4_vAY>n@R>*KT1Xe@c!35kr?f3cx0GDH`WP!}#}JtM9;E{yG-&D~Nj_B*5% zwPxWc^|68lsb<1+%pi(GgNf5&;S z=Hytu-ORYvmg?k41I2V_cKhv=gkxKC%_=KH5+HnuW-=!Tr3nwU?$T-Vm^^FxfI1@MRAr4>U1^xt`aBpna;Y(>F!xTg4FG7C(q_|P`5%;t4FN`}*B()*( z)X~ZLVr!vO>?2_=G|aQ`Mf|ZIl^7@cFQ`=2m#)0J=!Uo-?E$rhWc`X zmDX<#sgCE1ecv-b$9Q>nz6e(UrNdQ-f38IoQmg2mZ#|I@e2v`kewkpi@a2udva9Ytc?1qU$RC{4Xgp$Kll*PsxUK(UG5%RX{9yTM!wEAHqTRxVfuk?jfG5lwZTq zajOvuaPlNyd;nj+l7Ds(uRNsXegio^HsHdstGzke%p|fM)uu+huAGqnPTzZBGg;+{ zw$_+LETFKuQpq7s_b0D<|sh}h-Et*eUfnOkheKHlH z3wc|>{hEs#1P&U9ltpNoYU$ZA%fTG`1b@6!6h=fqL)=R?bCrjRHuN>AyXTpWnaQ7J zmWCqa$QEI`i95N)a{HDpJc6ZLpVP?^5sQ^E zk?<$~n4vg(qPU5A0SY%6K@MMAJ58y^vL*2^IV6q0kAp=4ymnYe^Bubv-d_6WmQeFDC5D6=hMGPy5D9SWOe)XyKp8Xg?fHxP^u&lagV?p{JTgp4*EGcH=-8|>J6pRH{(WgcOO%Vc;}lGFz+tV{3}2zjw}6I{ah%Hw`4g?m%~R=n z4tJUU&;(81ZXR0b_O+(-5X$h-P`*Ky@*SUu(y`s+C-p4RgKfrVmgUWgA2?a=zrU0U z8p;_LF?BVY9ax$iL}js#=jwgNNP>FPEStZ&zC$sPQB-8!N#~>N(4=x{dmk4;!$a=J zq>g8=+_TG!%aGvX^I>#5hdV|$$>2#xEfVsUP*x@%OXZl6qyC=U+pE9aVnRvPY)tp~ zP-UoaJghInqGfiEL4M=W=7H1M`TK?Pc%~5%mm`%I8F`CQZ=P|v#swRf-CBA32o7g9 z%WyPPTEk_ariNa%_E=3^LZT2a{b9El)ugNI&Gzv0)LgOHJg+U?U2#FAdfSN9;X={N zYbd^vsiRP`7L8~is&LA{-D+#uvP9w1`~Jy_<;sJlQ~I+kh|j6GnDma_TwK2tmV}>5 zM7_fef~He?lt;|z%^e2io~QRu*b2If_E%)76lS^Lq_LAm7`f0BtHCNhggGT0z8LZb z`e_FL$@E{(_xMN>7j0J^(M69gkGK71Rx{4r`-jy;C-GxtzYkw0jKA(6&lDEWm^5r* z`=k6|Dk!_RXi@j`HnKO7dScdEZr!O8Qooeg5j1Uxh9~bWE}4n9Md3EbISY&>IAg^{5Xgoc z$(26RB?2TfZ{cnaf&|z|@Jlzms91ZCPw|(X{BPK#_YBY_?d^?Fa#>1sefL1Y`GdZ| z58;mh@wATy7>>Fsi1>edD|d}JzE?O8kB=st0Zkoi*gsKo$}av;$lPur74;zYIYSJF zG4GM64Z;Ur3jHD`REc*(@Az?%2M!>s`%F)kbQWq~o&^ zs{Ja$IS;Xmwl_TPnPyou=uoW>N2=aHln$XbHwlhJ{5UhpFL;BMMBExg_T3QZq1!tp z$^cHfJ7`$Mgz-Wxhe9os#_p__Hn5VaJ~#3$&@Pn7tLvGOkG4zitWi02@fwbh%W_J!iuv1gy zgN+C(ka*@G6@!GtR86CWcaP@Kg{k) z>HC59xDkL76so1Q+RFF?SMU(sj>r&KRT8uyW>tSZBnn-D6yaP60R`01i%k*?$7RvA0tMt;I@|r_tr46Q2r#=TU?}`M+Uhb7&s)DpaQ3 zPbhO7zF^7vDeOj^tq4271;ESba89glris6VU5D8&QrHY(N7aGlW^3Le{Sj zham!wh9PL^!%tQXa;n!MsxZh%tUxtah`VethJk1ns1#DnVJ^dM>w)wg z?k3iTNW3D&)rM!^1;Vwx>{mJK3vgy;+L$s3CpD3~9IVdcjPXo@au`xlV)#%C!wY}+ z4B!Ywak%^Y3i#sWE*$3d*%+PRkdh!Zp_%95H#YLJ@^*s?446Gcaxq$8db{d5?$U)^ zoo2m}QiCgSMq>_|M#ba`ixwh;LiQ?yxa^GinZJ8HgNux!e5Z|vr6z}+NFh6GwkLIN zFkk&z67>fDG?n8QWU@R;!5_LgMX!4cb;P*w(6zR^QjT3pWXn1(4lHeFkW5sc&>kRX zo<+sH8)#v>F`TZzZ8g~hRv;cMsRmwSJHg@TO~*qsb_*l~x6<=5Az^(c+?}77S_v5S z70)Fr_576_@9UH9TLKP|4?jx^)dI6nYN6IJ;xaruiqiNR5=VARoI z$?B7=YP;nkDLSX{BD#O~@`XdEE*g6g2L($~Ny{nVHiy?b;MyvkrU+xQxifeKk_n!> za7hF9TrB0w5

kQb%AHs_T5rtCNUMDO>YsklA%r^jzfgjB1BSp=4#q5%@IHE^<5& zNTvJykPjZtGsxd$nuC}cYoGosyOxI!vCy2J&Z(G~7u(s%gZee+7M`-6cQYJ|gC7`r z@cfngJh_*X!XTgP`f&W22w}MGQ!UBZDBBEFwd|xwdf$~57QMh{A7Y=>esVE5HZa}s zJQMQD#O1ebt#^XgBezbkBqE6>&+ZCk*J3?fU5f7W=eM;;2P4xQ6RsoXZ&a&#+K0E0 zfdE-eM*?()v@lpGh{pKAWNVfFEcHa!?#U2H9Z&%r)ab83X|P3jKn3m5>1W&EA-Ez! zZJ@R`$&0mj$|6CNa!(3*Q53M-5sAVYS4?Ug$(J-p!|l>X9&A_I141dza?L}?B{nUC zOb~WDvnNKwkSJZE1Vl=lbNp}4LQX3*j+#WP42IYv+;L8 zD*q2euNYd-g8q57`|Uc}&u^GKI_ZAE?pNQg z%-1G8({F7Uh{DzO_`{LSutqZ&SyYAZZEpyaRABmO%SA|7Utxr^MI!N}nNN(`o zqF~cM)PCIE-Jec`S39bWN}8%?(LAGfD+=L-@*xHb0dS1vc3Mv%>iqn)3k7%1d!Jp_ zTtu)uTQ^yyQ{06u`U9`Lno}oADmh2GW$!~9cU^@=F@w=%B5Tj|D?YhK1M!NO;wWI+J z2%*_91Iku$r(7_Vovch8!x~Zw%uQb6&VrQ=*s zv22NniTzz4&d08|fp~NGaR^yAZU83pVDjSjHJp4s?cDs+bf_O!#yq-p@c0@t-4*yD zGpkGA3Krh45F)VXLM=O9A%@2W3%7CuXA+b&_)e6Fm~p3sFf;_S+8#(gJwZ+dU}%z` zm1(Hm%ZbWjN@cJoTwh-=?&(MOA};mgGWG_73~B$MC|KJo!Fl^Op=E#W9&`Hs8lcn^ z*O-8g^~yFc6{foTa7pEv*Ge(gA`Q@)Ivs8RqA-> z5DtS;;&K5?f3qLhGAboSK$sj(L>8;!6GYBSc&|C9)!VZLm+V*3F|1q4(6CT_m3y5;_)r9GXlzF3>>|qsi#5JDWrOJ-D+8A5hc8;5 zbNQ?IN8=UJiP(q`Kc_l=mPIMOOvS$-9(-s`hgSM zC2Lc%j!g}luMqWvqKcwl{B!~HQRpPr8vO4z%%#~#GW(N0&UmyFIu5aWTp%^jD;Vhv z3#ZgB+mLALEE}HfP5qneer{Ml$f{4JgWSNn6S4IiV*$?@Vz#@PkmqIJ?OSbo&CL;q zk-sN8%0wsox;{mCE6_F#-X0lo32tKf!j^JOFxGl0rH{V&9{FwQg8%BJeO^Qqgn{d} zm8_Zqi_DPADt~mXEs`-D&)S9BhiSwzy1BmJPg*kxiP;_-VcnODbn}IrJhdx;x{CRw z@4t5G>njc}j#8w2dA%|Qs?}{7nWkIaB+BDH${T8w(9d0geH^?@M; z3ZHbk$*l(`j=EvF{?nB&-m(db&jM@?A(F>h^jqbLIIxP;rc24QAEr70MC5Yd$KNB| z*bN}rvpPexGK7poWDG#WrH?O=O!-BW#N-3axN&%k*ikt-CgW8<+c9DL_>8@OYTMQJ@h`hXU~QZ7Lw*J@O3V+VvLmioo-!M||N& z?VQ?A@47-{zLLZZ8Hnwb0;z^a!Uy;$HCilDSYjvHjKa3U%ZV}Simiob8y0R7b4rs?(etv2x`o*oc7&lZD14xSGSyfN1%omq8;>-aF8k>Rn~l^ zojc#E>yKw9-^SJ=m8pY=KuO>RLCKvZGq8rSk3oA=ctx;a&_A$6L;y{|SCIX&3MT7} z;fnmCMbo@`YvI?lX_nw(22w__571N4mwd3 zbZ!FJe46sju088(um;f|CDk8&VWuWC^zhhVV3VaPX{Z--Fb`eJiwM+(&f&HY zpE|ebP&Ad%!FLlTA7l16Z8Vh_PB_MuxOF*i`F6;cSb)jdNapFv(oDJo09u`Mn+bl!2RtKR>&5Qn0yC8O)Y{*GT#D$P|s}Qmh*6x6X$2gUH1wnR3Y%=ZBkJW+R}r(GUsAK zELTlAM*PcvJ@R;vCG-0H;1urtGuu%&_nf{H4kz$PT!RA~n80P=afG9C zYAvdl5Vu_;h+fTairv7Z_43;iX|6!8|anPJTiu)zG*A8=x8b0dv zT<(hl_r;6dVWpS5kEZ9ALd+G7dY$YK;GkD`^UdMP+zE;GiBM9yOpgdcpDA5$BkNkd z;q8~1m2*RSy`8|Z?QuIi$N<5zaHIEI!h;hk8%d-fLb)F+8hNL(C8H@UVayC-zMEyT zXx~)Zx^VahLF}W0qA>eil>M}WQ$TAD`i$PGZRBZd5tiF%Y0hz$=M0q_C>t>{S+eFm zYo*mgk>cky@dx==geAtA0(h?5awsuckQZ6EClP&CHHlg8!m!W!e&1>9P6{+bVp2C ze$AdewFSv1dh5Pyw%pzr+})C_8rD}R(An5sekC6|XArV+C*t{TSk`N`)8MzULmH8r zFrsAhlI&d2B@-qQA=bH>{>UFlFb}P6(_ga^WOLO0xYlIJ07*iHfl+0`P(aw~XkbkV zZ3G56Trj&+Tn~kM;G4?6vp+jSE70$r0FS7~EWeR^VB*nS5 zgEe{EKHBZE`KHa`41wMh!&^R;p%+#5q|2q{4$2te=f6zFz@@fr7@wdxc)U58$*6m( zJ%rEDaJs*wdTkfB>odc_99pKFMB9OKTPlrSeacE~G@Et>XT`q+jc2L5uGUS>SXEQ|8>C4X1s= zq}Y;BO~cl4Xg`0)dN9}<3AXVw;E`Ml1F1zfAbZ>!X3@59>gD8<{M>ub+Rrc~nZ}}- zEFMjfERSiB*$4B*&U~ooDT=aNnk$2~I+y%Qv z^iE13YXwksdVtM0o#sX70$_3FS7TT)u^>oMED%pKhRd z*zH#utqSK#l{jjGB>aaeTON-V_bovOynkW9Kz(av7*!9pbh-^ zHKx*Ifk8TY5q4&Jglt4cUa8527WKe9nyOo&Z;m;yFG6J~FOa|}{lV!DyMmOqNC8VP zSrroyF#=n~PL$UTTT{%Ur#Gx81B(OPicb>cnlKRS*%RPZRH9Mjgz|1|G@>6pk8qRv$hrgR`S#2bdDpw!~f$ew(Ew)!-Wh_PqQpMQBH_z`!YtQG} zd}tI9pA^+}4P!;>_ds;fp5wBMs;+vS?llx-BR0P6)Dm-nOSK!>^Feqdlyf*5Sf}UK z<;LpX;34o{et~_l)WB=wVaLtMh}ZMgl)UOO&zTtj^U81 zhl4RhC_4x#I~`2K(C2P4gNQOSOf8o!euR^OP^@u8tclAl*5h38qO`t8WnDJ*RLA;u1J0>b7mBv?FSu z;G2f3Vl4iLjWjuhbXn(PVikmS2L-m8(nLg>_3K5~rc};0FINLvb-fl8bk)h)tj7bY z$Ae8*aI7x3rb6}Az+zw{aBOu0zR=u@f;I;Xthgjh>zRY4Lfk%d$0|9ysG?zn{oI=f zKA8986F{0q*h)zG)e|@2(utym_iCyl)QSOOJD1b5|L~!@RD!&ZaB`^h2a$i!fBhh2>}<3M=hNg|mtfWHc-(|>lHFD_MclNgDX2e{Qs%Ce08K88 z!oU%3;G_y&t|3O7mZAyZ4c#bqRCwl=5kNQLS65cpOeLFB!xVdFW$mJ}pZ^|kAG9#u zR-vwAw3M#0`mm5A51oP?01J+L9g#dX*=s&j9SK;|`{@JWxlAwN(9lpZYCQTZ)K6Am z1R1E>N)4VA*XLufMl5m>SvJWenAjpqKz;!p--DSL!1}ej9AX$bnh2Du{2{beZ&S6; zQzGNo*qVWKrXF#TC0M@EHaT3n=2vF^W5HVe`Q)sYvXShK^0- zmAm@JG>`DuPsH!u*!u&KI(!`z^LGqg*^r^|=SCO#pq&!O6|oGmk6y4Zva zhnNpO#H6#+1`)fqlI4UQ>TxImoM5{zt3p$=OuWc;C8o4EgE|8mV4Y8p`DxX(<(Ww` zGMWA-_<7&+9o#hrI`k}mVF@d1wOIBBRiHPUh;_;lvUc-i3z5jEkJ_JnoC0^L*AL!M z@!*l?e+H8;2o?d8t$V3FkiV_zMou7Dc^7KBB8ciS)hd5PC zO_nb^j*HE3W(98|@3oZiP|mZLvY|U{+A-lCQU{=l02!xR=d*r5NHOxauo4bq=b@7pbCv6Ae`ktp$-YOtYM9 zUTsD9wze{>GP{SPUkvR{E9+AYIePQSk?I4iwW{JqfKiu3tIYA{Fi%xTzvJg(iiaPi znYo7XBaf=rw~Z*onS}XA|B&~55d6Ih1tB1e)Qd%A72E`%AD19(RpCM!HQ#CAvFN?O zQc{|1-NKSnF|{kM^LSh)-F9=}FQ_go^EjR@3KS2_kbmQ>t4EwWeS!BJ8y^&cnBciV zX}?-tp>CKhtI@mLD;zl**zl?|)MH3oCfxYll*?!}yv?3vq2|b#yKB){y4vb^U-L9M z{=j{1C3B&1;IUG{>`MISCbA3(cC0(YJ?@wIFUjZw11yV_?O7we?UXDWa&P>>7Z)dg z=xqB{DvK!ryjMZYniUXSyD}7)fTNc^-BB`^#Phgm*Yf)sR`r#2jLRFhbANx&)GPhs zJI;@(jHT+9>*W!sti-B@!NyRrW<0K!!x{98xvw=h@y+$j4Y~NXJc_NrrcE*RM6~C{ z5SgS9`}{vw$_z|Ug=qWjxJre8IaZv)T{C#e17A=)?zb@PyGg=??k|Qc(^$;&)he6Q zsFS_exSnzc$a!css#hc?+WD0TpxJwCm+t;qcdN3!nWzJ zSF~O;sWt7|fCvrtMF`k|>wJ-`}c+1yG@LOg?b;U?Jd;nhvXYkC&3-}*&)lymVKFaLd7pX=B| z!eQy6=}l9$`UP9X>a9$xRjg`kc$B&HSi9b4&G6}r#_M7+vSr6TyW;)fq!9O<{Rl@A z&4ATw-QYGu?YvL`avSGayZaHRPO)P@yI-NtJ?)NF%gbvk%T{B}y6+5NFyyuIB`f)j%`vGVe zzb;3lKTI6`l1QAq@VW_aI!SI@Kd4!^d(XIi4eFH8qW7tK2}6%n&^z|VO}`2YKmOpZ zm`ArcTCPZmY)4M@Td|B>jA1v*8!JP}gsDnLy=*2i8on5Je+{Mched_^UO;NSv{3ex zXxXykip677RyKeiE!ydJ`f%G0*(tDvtP^=Ru8fX`#;%_C;RcoTa=os!pE+BYnwfZu zl#h*^v77UswDWR}35>wx$M?KL&~Uu#yWQt8YrU#d=qMVbAjRaJ{5Y_3RlzTeN0xIO z$xOWCQ>k)hdEQUz)mhv)y6#)aO#K$yIV>J{57z%Nc&B+a_Z4Py2|x37APcjV?siee zi!zklDS2dk?Dvj4&$8D_l1*^x^D63GvhXkSev>JU536ST{Xr#$ zC4SU~h)oy2Pm?Nvyqb=wj?ADf>-CkUG&>H*xh`D{InQH{$1C@It(9%s^J$B| zWj7QSx3gM%qjNsc)pK>6csy9H=P*#MGKLowU5}oM)rfj5l_A6NVv(|$ zu>fJQ`%7o>3|Z|jox~41NS$XNkDwx7vDlUKj+m$0GbyKaH%bx` zQjQ)RIJqpk37{id|(Q?Gy2KOa6fpPz4(#ebP%39Kgck>n-Nn&Bc zHbUEJk10vcyp!AhEJ6ty+96hqPFd8LcI~DsV>WAM{lV`-R$7`Gmm_u)d4FFy;;~^P zs40qyzxNgQ%+pLSvclxgna1jdEbF^_%GIdK@UK;bkgV|{EJGyE=t!frlxRk)ri7s2 z+}_YvQy>U@zc71V^~xN=D`KlR{8n|{FFwGbW|p;h`S98HmVc_Ck~P4Q5p&Q-{h}c7 zOWkEGf0nF)MZ;-{>UNF8Q?yjc^F*}K?%DEsCmBtaWpS*d)5F7K1Uv}N-u#%S3g5u! zfZdY_SYGW3u18Vms`fEsUNf$+nH-7p?Yvji&y%e*I}^@d-!xX)ctj2I4eHFE@lrW0 z2=j4eFk%OL7kLZ0ISE&Dtob_Hl|yt{io`$oD_{MiKH5-DVT7{f&|lQPi3>!)m;6FT zAK>2f-t9&nv*t<7_F($d7lr@fZWX~fT4vYc={!gA1K5aOJ~}_P(ldlp$SNnJ7hw>m zYDM88Y?Bi+3ZfAT2?@nA7C6-rH9%G@K=q@ai)LzDM$XM%%s26*seWFQ`D5YoiHzjU z^{dOI9?Yfo>BeneSM~f?%QJ+VL&mjsg|MA_TClyGqT-Usb6~!;SU1<#C<@>o(HF#E ztEkzoO?%_m#9w|O*X~Of_CW3&?Hy?CB_n#}Y`knG%_fQ5<~(^5_9U}7$!n-Mog?`f zKX&(Q=-KL*_l_Q}k*WSb$a1eL>)tGTd*i~%gSeg;9kg{w7Opgt#8ux4l79RxrkBF1 zBD~h}43kJC5|!<=?w<8imoQ%s9}S0`IDi7@a%_SUSXMdlnM#vajpZzRLDMrMfsBPM zmdRg1)*8v+#{h4)^p~TQ-3e-PpwS-=)PuJ-5gP^9_p_+O?u)m0?x$l5g6{Dj9g(3- zHlUWwjw1)j)Sz78f+XO&gUMvcX?5ovW3PiO`F_cKu4Pu_P^DxhtGH^7f70NsnTa-A z?lyn+1BJgLp5~SKJO7-P$DqJ!EVc^mpzb&oQGT4LHORhsxSIzISK)xDeTHmdVA4oL|Bs?}(@ERFbn`s{FDU5UwPpWWl2OG_!l z?fGu^yiZEQQh;!`#S*Y){5IY@g)TvpV9Wb>^(#xuu?fzHc4&N9=OK5D-VVvP=;`+p zEdi74eCtx9?%ZTOpR;IL4^$YG!Ferjdr^Gjcuu zG}dGZ6tBi{&lw2PyD?&2fQw}G58P!51<3n4#Q`ZyEoFkM4M*}}-e$yLTUKQh-h%bkla`xJR zapIZx7<__R?)x?{a4@@5zh|~h?RpX#zgvqUp<^Ui^UenmBlg~~x|3@fB2o;}#4nOU z{e%`US{N7*NxU-p;M?A|YQ6frJzitS4;+V3%#eze!2!fFTD23K7Fkhld~e=>LKU3` z#Yhm=t;wy{4S83(7{DU!-JX&D>{D7?%Y(Ku3q`+)8TO_gD|V-Gt=~5ijA?$Ozj&ix z0yLsNRvpq#pOxIG_vB37ZLovI#xz8(?kk?njvrb}KDfG;oHxJX%5Hx{3k?Vk&5qvb z7{qfx*|!=kXtvxfUs%7k>+=+OXy^8aN2@p>v3|BB-)MeE2m!yja?6@?Lr^8sqUm5p zf;E^5U#2tio^m;$iM=t546|LCAX)9U=JvrZqiMBhf1GeSY;?CE=pPf{dF@b_uwE)b zv|FkU@gn^BYj+*Z)&EO$bQSOL*g*pm%?^S?G~rxldC%gx#zGiVzKy?9k zowS>)`!duQaamSHqF%Q7LK5UMde4%e$Duz7OQ?Qws#u%rMt$L=K=fVvwUsxNFh|97LHUS}y2-B2YPtXsVxiTdFKDKwP!2I#g8h=J3@O}hB z!~*!{U%_8gHN>{7ee> zKclaF3<*K@pfcTnVy?7e)2aI(c-v33I|`v}yemAGhTWig*MjGqb53vK&){4JO@Z|nnOeT=Lbt_7aTqGo&ujZq=Wtsao5$w-+L0$yNvb$$EU>HJjBv ziTy-5;^aB5+aB%4C1V%Q;}%V-gDAkR{daol2?@*kc5yHy{1@PW^TiqBQ4D?)_xf6+ zdla+#2{-e~Q$6+(K_*3i!dlHOb<6#1$AoDL~L~2(kV{$k7Dj)Jz(=-yX1U*4A^rZBc;l+~ek-Vc$3h)WC`zYdrCLtXt7Jreq%g-PVur{uZ)=FayRMT@7{_2(D( zR3;|~uG{u3c^9@)rY5jL877*dGW4i`7za>cTlr8)7Y>j4A3k{BQL{K*ruR&KoA*8Y z7rU>0L9iJXazQ-h5DW+qsyV4Rb6YjonqrQBNJBR>&DUr&B)U6VNplqvMk?5O-6Gm3 zt#2>pp*=xBV@Bk80)Mg{6S0!mPflCTdpER=*MBIC2vcsW=u3eP$B zHlky|^^ZF<(jJD|Ml$zgy-G$=mv+xq%AA|xV-lr0*33i>F8aU2Mt(3Q3uDdhP0Bhi z|B1uM?jhQgYaIFn>K&T4M1Q%4BS7{(h0nD=xc%D5^AqF!331@UDAP5vL!+I~)9ZCl zyyY&n^{52aD*NF5rAC11YI&q`hLYwj%=2lJ=BQ)EYjY8!*24a5S*Req{l33+QKUIE z5~qTL_UZxSO)QD3BaxcRisJS0VSI^jzLj++ht43rNaz3#e$@ zgjl)=n@E&^(f)*vXx+T?uQ_LZ51ee%bYnsQiut2eQwY1~RvgNb1f`4bHH{n%S3e$(sPXi3{cbD> zm9bqXvJ(rfA7;g(^%2CNLVB|)!=tBUp=i9N2b_XGUL_7kxbA%PEKYwXnaa0Rjv$p z&~1M9v0idUBw2w37tD1i>jr)3Ikp(xi;qIQ(j*uY1 z!%%2ktPG!KP5>X%l09cg)EJ+`XtmtJN90P1cgarywNx7fc?~kf?NaWTn^{Wj63ydC=;i-qaIsh*?Fw;oCM*95%BJpo@x(WZms7uU;}XDPX3cfVPX ztDEW0H}NHvrEPj9Ygw-f8FCWZd0_0H@E3z+yxt$kGr#}K>&C=TeE$ayhFIrzpm~hC zlBVf;uF!HdZ?@N>I!3Kk$SXTgtgQRbe*sV>3yEw;*}SnKq~oM~kUjp~g1f#5W%uPl z0>!>MS#swlm>hS*rqF`$=?sGH&dilkN@elHa2&54I?H1j80^Yc7SV=oM|zmrLa^;hDrbF%(6w5&Z5#s#i*T0yJ{8}V}$P>zAEjg{n z5gY+3pl34sJ11QR#RroQ++?7jU9!Y~deBAy8U{^EG0fY(8hd!J=Y+C31_BIhw_lso z;H7EwDhTCF%wTDj$Wa?k=IaqLDO2H^!^-WB%b)s z?C4BJn`PrK6yj3sI(u=>{Ime*IV)Lw_R$JSR!dE3Zi76dn8rqo2uv11(fB;QdX11{ zj>L+;;csIiK#3lA3vRJxHo5bA1Qr)R`;4rlzM;MZ8OQk~GJ((w_)A}(-s`f|bPgV~ zE_r~6{}fXh6rVYQ-l6)2^$8QB=eBZf=v((NlKm>O+D^~|_Xj}k_N8;i7iXo~yI6U{ z`2syOG&0X}tp%CAU8FhA^z^61L}4)lslLVN4fe)Or~%M>y#d%UnV;( z%V*^mZ?Li+7FR&K#K=9TqcbzF!*n`H1#RJW)8bm{VoEsfoS-a=35%c3y%`l$=UE_P=l-IDJaZL|WW zWXS~Yw7T<=E&-1B`-_mBF&8RnKbD(jg~2zPHv16mfd9kOR|Z76b!`(vcgfI0cMKsN zLxXe)64Kq>-7&O;G}4G5HApuI5+dCt-O}MV=RD{Ae&4m%zSp(Z-Yc%{pR|1hU|4{+ zCT54Whrd3*-kq4MGf{uz0@JD!H;T9-{Xv2~E&+P0Aunp6*NgZb+%7FqqauYZ{(O99 zOPQ`CM9O*`9d$&NEhX2Oo+)Y@;I!Nn@ntlQX<0sG{u}90OzZUhA@09RT~BWS`DajX zq5uz3$N(;Au6K3_w!F~Vytlh@EXKsIKfSqy0#yrC(j@!wj{n^V`Y(E>*J(vhiWVgd zS)z9uZaqaep=Yk@P~o3w%J>s_Y{Y*H;9Y<0tmmQ(V*2taDK8_v0L_97FfAgol50E( z)95fS3!O+JU4X*K!^RZormThT^BCq!gnQkkS^0!+ zqos~ucJb>h=7DAuOkLR7)4t6Itc>K=GEex%y%S*zuqS@vD}qC2ovN`AdEhSj_wJ3t zO_l3c|n=iTpvad#HEIN&hLg1C~MP({o zPj`>W@gL`-vN(#5oK4sO%eH#Cjy7_bv32mARSHnRRePz$Dh5WK6S(|DF^Ncevi6!g zhFas_$ftL-R4E2w3dptMAo%FniTl{DH}tr%a3u ze!(y9m$eAbXQL{j4zt?C((o2_3a! zdaaS7P{g+&SnUGN0YpNI06AibfoJ6X&8YQP3s8-IV%Srh_1A$_389Lx0^n{rq?j`@}AwE@*QMeI|`Tgy(p(c)YSo#0j zU2TZ~V(4$DYTZ@LbbE;?V-O+Jdz`tP_RwyzXF)frwm;vo7+qk|e=M8(I`LKxgkI_7 zpE^$aU0DsR8Rz1yJ!eCyl!`(+E;>>OBt!1pd`793zop1A>FT!UnaXIH$HTs4Z`48u zsJV*z#T`yPMFM$Dj2vIim%9~Bb^g3nFKjU~Od%;RG=BWyuh;gWQFQVzWm^E>fyOv8 z-Vo-Z({R-F2i+%utUiC6 zx%whTzc=7`Ze@jI-j!I$|3Tv3GzXhFES78(v)E^$jG2w;XK{Tf8;UX!KI#xY^X})6 zzgcTf8@dvtVbBG}1>9D4o9pDo$(NJEj)hhWvU^LNVY%M3#6K$DnKyfgRSzG#gYF;N z;h7o?HaZK}zbN3H3Fo#e)Nd~z9E1=~aKqX0R*H)(3CnP56j~gYhPYH(HBFqmU~F(S zW(B|8C9hg79y@&xM#%i*#y8d5vJcVpnV6P_8#=!Z-WbU3MgWKUXu+|EmOj zO>qee7fULT&NWiaS`KAJ?CGg(W^zXcon0sqa!oMXo(20V6_uK0EY-Uic8r=%?Cx5`kH>9=uJ`rJS8D%Kw&?XMsNxV|bSP1KsGeEkfF9nWT)lS<+`^&5TFS5FE zEQ4?u+Sex?C&%k|C`-1gfabk^`poZk>05PPGI(Xz|4nr(H*7+9%cF>I)o8ihfyRuV zCg0k#&&O%~MDqh86E+qffW9@ukjJzLIgAB6uNg-c=x|NIpf>2SKX!RPw)p+p*| z*VD{rAzW-_9Ss zmNw&Ge+}|kt7oojm#ey4MtO;nIgDE)&!Uf%!IKdY7Ag9ViByvE#NZyRFb#qV`*IQmZgxH@gOp}4*l8W69uC`L6!YKWp+!FL6YSNR_GPu)jmDV5bhmsQTCGJo zfO8Kx^E)nQ!0-uk@~r`SFm_k(k7l^)(W2vPsA`aM~_s3lNHd$45`f-_#I~-x--j#7LvH;Td1XO zzw*kmkz$sUt_k`;i!e(sGUMmxSCTDz4G)A5ISVN9eobBvvUr@@eQT_Ocb>>fvb#$e zQuEQ`6V(}u=erYB0fZGHqa4yNf(I@gCnEmG72RdrIj+Kkw?Oj*AY<6hruOzw!~#g@ z6}DB^QJ3LC6?4JnO#~ zy6f)A)}i(|GP2|*sHDD_a?kR0`^1XtE>%;g#rurROeK6>1?yQXQlr3v0X(pq1pe{W zCF4Bd3Zy8wo(MZOvjHBG7@Q>ubNbTpTT8(^_QwT0_MwzVI;?CWB_3FPf#Ce*>EwOW zar&3Y5lHB~$*eQSOb)hhm~oVbHBjVlh}kW1p0))D`!ryKD@XVDg+gJ*?4EIb>?v&T zl|k3`n&JLGHA9@8JJy<$py$l_cUF$$etwVJAs9pDDr7SSXl^HH^Vou0Lbd(U^HgggY37%1S2P_B~ISz%i3Pa^MY`?EorjSqGxJ{LG zq&k~MhrI+}5OrW=<&Z4gHOPX^iX|4lV)8)`b!;YHUm1$&Q2ED(ECIs)iS6?*ZQ#6H zlq~f6I5fb7NTAg=h8gO`_JdAg9GZPNUwhSd&~EM3evi7ifkNhjj7K{@6b|ja`tuDW zRn4Y8ddyv*hZ%{A9T~prik(7io827ewn!jZMoZ=)V+H9Ta5*E#z6hWqQumnri0P*G zS!B?y{vE%4aZ&2C?;NE79A2h_r0hT7TF$~?p>u}rX2@b z&KTkU)g1?%m}?Gm@hEySpEdB&`z1FNDOzBqF%2<@0m}Sn__aeM%@)DYV)$m)WwNo@ z3NSsfnXNl?{)7ZR9<4RZUc}-nF(db@+&%B=IkuTV<#2oXk!U}$EPkK#1d)$fzWj1s zGTaYaa+3W7eZq3U2Z_CyhQo}us50_%6mD01NC$_8F1`6OSv0?=dXn>%IVa+&f1k_d z??Jz)*&v)wL(P;n#UG|}D1l&vRat~w#k>~)qd5oyTw>_xdFpM_uMolRgZJ~(f9HaR zKH;@ezM&;2H5eki@+HdM%TOTZbdF-42oIYoFB6-{4Q~3Q6`vIJo0dq zKh_yT#$inDc{75)1x0dQwZkbIE28257l%&cOGWe@`$7eH_=4YM&-1ZmSX<>Uy4}~U z4sOGiL@1T$_feqXixa*)A8%6OH88IcUR8#5>R%FhN340R{P=cm;l*_C)$8%Q?1Eg@ zNlHtczAEPSKnwYyXlzUe>`ENUSL~4Ii$vZ=$)#JlW%BE^upYh2h-ZDSEV6eh^&7+0 zH3+cA#?7FdA4C#TqftIwTQ_aI*wpZ%+9dSfh?C|^gM6k)h2V5~nDQFe{Or65WPGre zs148@^pR{m8MY?fFO%)~g|>J3_zs5>y_f>dS(NFDh3;dzrT)6!uwpH7ikMKeiA1w< zmEFe&BzenC!lHa0_K2g1FB7@Y=-CXfAXVX(0n@qUqGBQu_Ua-daO`;GoXV6hgIMfcwD*$>5Y;XI;JR5#j!v1Ew4)*ITXq3>FtCOb#mR}#Y zjG$9Ht&Q!Bf}vi&IJV`Ht<&wRY4xUmH;ck%3TdhESbDu3t1;~T=r|KJl7BDQb**U( z<(3DlI&-Fms5%#L_Ffb6c|giyG{pxDmSEAy(7v*-h%!Z*L{p++v;LrOMr2$1w6C;1 zI5rjI6|CGPhLpUU2hfFeaGA9l<>dDBP`hVx_U*9xMeEB(2{PJ+chGMN`9ky>;a#f8 zUa}q|1UqJeo;xQyu|X8*alcdON3a_4+w30~l4qveC#Ad@y&+Ij$&79R_>D>Kf*+a? zJ|xj9xKhGs1#W~Ez6jt%ypOr1@mTDNsumWe{k*u>4BnkIZ*?0u?Drt15mSHtd6hAp zoIeAvpw#xwmPl`~ALaYWOfzvsTJ@zrbvG^(A}K4&uTP6t4e>5_(Dm{_mE#w62y^=@ zVSg02ZetoD#a#|Zh&k5;%Tna3x!@1HKi#tjy;rS0Cbm`nde58m3P&u%bxUbjVS%qxod5B%o1z#Y(+^7e2o=uMir>?L05K-T4m4bsmudbOwHPTNS}~QN-={Hu z_3WXp4Y7x6>(1Nn#`v#9p&37wnG{OGI}J8v{+ur5PCNL(%JvFA`ONL4hTPT>Q}4*p zIFD4U*t;_dUol)`{Qd-_a!BTjlP{O59famW zjR^NBC^UT}wI{C8;txL0iakPZlnzgiE=q@w*Q&ZyYw2{zOCMsg8GvJ@3iN&=u7Nyk zdPX{jJ%G~Zg^Ez)gX5%1I_jWsUfd+U0lq%;SGD0bgUXTxtkqx`AU9h{LpU@;YLCWl z!`eo0G@-SZM^4!KsIT(X%Co#GkcrQ4^KJpJ)D-wR71hzJ9oNsilZE9@$XlkAFrH|p zXy7%#Q{IN^qR7-%B`fRQuKNUySEcDs#9;(K`k@#p1KycND?Lt!vTIT=h%o*(27RtK z^6wrjtFIIpRM|{H`;}o@drEvm=;c6yfy#yrmu1A=!B}SOx|mLjQowtdkchdV8(CPp zuq1CyE~j(m*jJr1ZI3!N5oo-ZD~{a88^F@UrorG8gja81AshHsAFZUkDR(2x0pT#l zh2K0$l;!8d~Q*W8CEA74UMyX93A#6SM;Dv zp%#68YDLQShAJE)WeSk9eXpmjRv_?UJ*WTP7@yTj;Bk{8o|L85wLm3Ns`mE8+Uqz~ zJwR|{yRMUNFVTWw%gFFdtipi34JvSwnd@}p!(ON4@fiWH!@@0S4jg@i(5gK(MAjdn zT8EnN7VOr!otx?a^WQ+)6HJ(us7zjUH7-$&NPb@PSbeEKO`_BjUi@N{URWwVa4W;| zo>|YZIKjwg;>BE3#HNWcl?H76RUmO6j@|lk4q~Belj%L$|fq>wn=l1%3(^j9jh*75T^@HU37B=)7Uo`xG?POgOpN4Ms!iB> z2K=GVGb$p`5w!fUN;reDhp=b*3hZPg6Ml!*dWcdH;j&O~|53#v zaI|?(S=E)>WfAt~)Mw>3o6&7xf%a!kza=7i3WX0ylZg>19E>iRoIEz-?{k_WKy^&$BC+N&QBXh{7I3xJ%N#c0e0EN;@6W_TYgI`7r!FbEy!x)Lmf!g z#$Ys7sBhMw3jw}9CEFNT3St&Xo5qeV$fb#(V+AOM^pTKBVSb)G1;U}sTYHc6_W}2C zuLr51*~325g3*|z#Hgn?DTT7GxD*wD8w#hab3_6REn~&h2j%| z{AJW0>H(xW$#KH?6P7DtrjGg_ZO`EBWp&UXj|DR-!;MFP1!`;OfOhf2f^AGO&SpQd zlG4iS@OQA1lCKl(RP(P#RQ4Xffah6a@!sx2SkRi%HMopw9u1t38L^hk^H;@Ai@hPvIDeT*qG~ zwEXlU95(}{`ZnaE+;>RdDw${`)-LI)wB}Q=4Je09;L!kMGgnn2$I0!)Wg)+JuFzx^ z`P12Aw7$!kxxeg4vF&{ApS9V9A>8BIAlW#EP>+6vr9*wbzN;VL-5T11B&s8bwC!h? zn4w%EMU(0t7Xj^rLUj<_;9ayPwzjsQqAN@13~4LG_jAqfT|P`>dS-z8!m>$i9XC<# zPvSp|x$ASibjMO5(by2t17wv1gCXIvJj3#(wXrsLm{x=MKl$kYi6?eqI?(9Pr4%&=pgNNg^Ac zq28Nf(PN}zLNysxOz27tl^Mt^WkCPsm8;n*WvtW)STQZRuZk zW=Z`dCixIgjx*`+NquolCGJ+~i2#mIhEYLbYAXEOerU6w{3h`B+?Qvgd<%P`kh}yf zhn&65AQf#@lbV!7-^n|erTjyWC-!U@bs~Dqwgs2lX5KO7U*;X|fq8h&wEbvwY78|h zOlq?s5<|)`dg>8?I7cQL9`9WzPuOTBN3hAZxXW7a0&W&%UOLqDbctQa21Gf<)Y}Gm zv^kkKj5G>opEjW$K)`URt4OM89qW-P44zIDW|zBrC;Wp!vYz+5N{Tz|H=N@Qhie2R z_kd+LD~F0C6^y+Br19?e!%W7eHPVK4=>;`FQ1M*XRPU={R6*Yeojym@dWTEaigDP%L#*pdszOzfZBaO1Tjqv;IhWDYNpxETeG3 zdx?OA9N&w~Xf*&4(NNUyIz}_%h5k1qDOuf?Ox?#Bm5N131_QD~=n@jx7m89PQhrD> z97F>$h;d(Cjnv7PmN8Axc9ndK1dYc4IOG}x9UT`%x~)MalxVQ>@U0?U-EZm5R$iLmpH646ch z@wg|^sZ%S-;7O^pvojL|2KS)tLGjlIWWL&C5BhMN3YeFBuCl}^P(bDMZ!9CyC zc&n!eyhPpQzev?!W??U?4J$Tl3>h{fBS5|gV_ki02#5!d$)Nx}Q$5TS;oHU)4Ikm; z#$jRCz6P0Ut4$0Q$~N|dt2TGa)(5fgenZL=vuZG)8%>*3Q`0e;1TPOWik(dgfw?QfC`Rs`M;B-uEZOpUvfD|PjntvKNa_nL$ zC|pXnL9X5(h{2rENeA4S%U_)k zY$}UZwOd$8qbMFrPjqsF4##Eb1KuInw7x8@myaf!jHo2$0+}F`3|vfypak_1G~&2$ zmL)F*LJSd=KS0f|o8N}Y2%%*O?#(wbx(03fBZZlD7g!FlbiGVL;X9O_B~2#8Y57od zWT!}21O~sYY)BgvN5Yj;K93vUdPqEr+ldLsgGv_gle`ZnUN@V?{J!1A3&8;Pdjn=` z$S_b5PdC;?k%&Ze8{_ea?8IG*h0c-kh~a0!Gsa?Zz6{inq1P9%#0D;|pIonoC?+=* z7?qxW-#*zMzV!qT!I0=tU|+T|AhL}i?^m_f*AR~x(L!zORVZBHgwuIy_H!IuugITp9pEm3v!sk$u?b0 zSyl9iJ%WL?us}V0Diy8@TPQ1%59zivvO55k1cO{Ucy-~dLF8owG%*jn-DH5q-Q#3^ z94kkg{tY9PaK=cYGEJq_DCo%_2CU0;y#(taAAxF=ekb7;VMNqQO%6A*8{GHRk>#)8 zhuBOAYabPbW)-AvNl%C7kWN*hxP@iW8X0-lGZ3O;*ni39iBU#6QjrbWAtE4&)-|`a zG&p^|w#5e>%C-Z3j7BmNIF9~fi%(-IX~J(LmE9AC($(KtZByGT2yHwZyZ$*H9uGjw zhDZZN`?v%(Tzb#~@CAumuN3LYl|Y_9F))m|+-sQlbcn|R4SP8B zCsL9#u(uB>&i8CC-@1^a&td#W36#4eA+Mc4IbRr{_?4- zPadUFCbw{XhH$U|(dqNJEr5Q5Ua_JiR{RXOABfs5y@xa#*Rl2V^7)?wol!x zi?jaJ-~I!Jyd}88k2Af}v{zZC7+H-FJ;AvGQ5mK_EvwMiHMOotm2HvKpeAlq9vYy5 zBr*r=-TD5+z~IIDX|eY^sH8fSyw^E<6Vt8Jv~n_gwEyJe@~*qg35i|$g7qolX4DP# zS|^Gh8E>q49W#r`v_$AfAa=Y#3Wf&7^%f#(smWlO!&+ln%HN_O!twbGT7`OQE{%x+ z2}Nucp&z2aGx3i8A0UF@?WN&Rq*xh)Itg?g2#e^-4F2%&+DnfBTGs1~8T~J|)ETwZ z8Q>!g1^mcp&#EiuJ&O9S$H`CEJLH2!8bP~=N&+93i){mXexM;{5D+OQJ<4PLQ|$zA zv@b%<5oHQ}03U=ERp}3*#V3pD*@9#dMq=&ypBF<&4wKx;*DB<_!t`le%Mho{&4Y@V zgjFO!uh3TvH=xK~n2N7}vDg8i*;2dRt)&P8QkjD6jn6r?ca%+(QFk%EJ008lx9vjvm3Xdjb-+U#uZT%XR%(0uUy`z@O_s_D5>Qbr^FcVK zchO@qG`Key5$)(Ai@w684VVY4@*U%2GyMB0a}vBUsMPXODk)$-BqXE(=Mf?*%fwIF zsZ{)yw1q=hB+)|_PsISc+K-xCJ1+7u^;A|vEEKWS{7h2|QuGw1A8l>>Zh@##7*A%! zuBo`96*R*aI#UR0V!3p7=fee(!StW`OD-aCoJCW<(y_4p;=d3(v=sSk`zNBd7d$1^ zt0D&Mj6_s_PpymQ+_mD`#}Bt&;UWv$$x=7DBk(LKx`n+(q8NC%FNp_t?)$On_Xd92 zxRm5)qXnx?Q1nI?6d{rYi>J@FO4#N)v#iS_>XHJZF}0@@F+Q~VIh!SXQ>-KrB)ZX^ zH{xbHuH$EmjU)r`91Q;bw80f)$ib017MnvB$&)JZP(cqmhc^>yjSyrAZ0e^OeUS_} zHhbqj-KG_|5(8746?ugO5+cwci{6WaFI8--bX%?PiBDAqvH}3>5^+HWMcFR zW?-X>Q;5xy3Ir~IN$kqs=gzSkqRHfR~IR?mW7YyXr?p@4jGoKim&X9c6fgDPkR@Yw{f9up z!#`{nrvKWUiT7+Pe&y>$JL{yC>YEmw3Yh=1#=orEZs(PJG_6=MePZjyzS`=ubf(t+ zpf|siYF(D2IjMF#{-^2ohxebg02c(LNLmEKwSe67#-0m6Mew?#VyWXhvO1 z+SX>&e;8RZh*oCF8`1lUN1T1vqk!>^uT-1LGJb;D&|;9J@h`yw+?Q`GyfhxJnbu3v z(Ps*fVShX$eyQwjU_Lf9`-+Hz<7o-TiouP{IY$`fu{SCYCp$rqn0suY(Y5B&j{-?d zZ-VsKu>$pJT`4R4oja1%wpmVrJsp62JQd0C#GYy$5mmy;52n#*FR$^bC#g`3kQLF! zr$Rk>L>32Vegj0lU%%zcT3J);KSr6yxsGDR6j59hOZSF4eJ|#PKK;J5alZ$lHsx|0 zCOjBPc*uC&O|KOfyemb4-f+3wylm7FDOUf=YtH8p(dbF9Th(&2V79Iz`D8{}(^3q^8sx%-KYU6H8O z=*=_PI}Ri-X60j=YQgiVJ_GQ(gQ^@WI4<`==R@6p!$i9qRD!*Jwujtl*olgFUz6mv zy5g?iiimh;ucHL-;U0^tggpBEO)a0`Ii9A;XQ#{+kb86<9~xQVoP6XB+Pn5H}^;Yxe@ObX+)_B8R; zpGj8uI2@?S4nY2{ojFh9(NgRL>C7>AetkYz6EFjuO>F|O^ia_lDEz( zb&KQ@l<)!#FFr@xaXvL2xYVd6$AuE7%QGJGE$x&7hRFkFT{hy1BidoXPph&tigqH4 z1#dk5B3sC3`)+oEAE@0jdV~0Ce(B9FuQLxAbf37soSr^k?UH%DrAguT@kK%b5Ejh1 zo`%49NgL+^Dk&d3Z;-@ECe)_i0ag40U6`qUeSb3YvBAzg1b|O<@eH zfL&v3F54X6V=iw$i$bTxZpexxc{|(Wh5C3!{f|}2WW?2xiGYw}1=%n1r56j{9cuSa zp>y)q?)8^A;hs~J!fu^PIjgeu!njZA$HMbcU+UB~c6-d&(Mf6piAY{a9c5R>CShwZ z@w=SXYN_eKlYZsC_f3kqmY0G^gr$*hYYql_VxJ2+ERtS13s!xq&X*9?8m2)l^`4QB z`iV5>7}k?>Y{#ThG}^b*eHr)F&N(CKnxeJ{xtkv3L|BS!dopetk4d^KfULClw|+JH z!^r-H!4udgMe%N=uSsswRCtf~Lz@Swjq1@gxbTYqV_(rsgjy+km~~Ve-yT~MuFRf( z71?&!S9I$n(7DF?+i)`W1&;Q9xmhZ9JAFQjneAM1$(Zm>Mx%y(CW+|m5S8wA^hV?fuRE>&lleGl6{X9%#R zV~9oosqWssZgTM5Jysvf ze!E}2?S6LHiErY+XCxB};oPDmJXTs2TAoyOZyhkeoJ$KgSTlXx4h>`W)&?67j4@WV zs~-HStfoJ{NZs<0zx%d!(`d9iZ+3bZaZ9nI`+n=wM;;dt8SGp9HAx-Eamg$uI!BZbF^u#T zhY)~)AX`zaNrUxQW2dh^LAmw05Y?~A-Zcwr!cOg9#rYL?y)b&p@GG`!&KLP!c{~pO zU;RB3)n%WBa3nwh-Qwjs1kX=*{&)RlN74QeicbkgPF>XXUFR%yj#!zWjhe`X_Ky&p z^>Z=VR;?ccbXo8BNRa&Fj2*Uq)GkiX1t%AZQVZph-?1LA5KD4S;ZBp&p??%+$}4a5 zMqAgC%ii}q7ro3%rfBIr_ah`9r@?*kwMFbjvfK5z6pE!#QJ@S=ep(y?G!N9jlN%+CLy0q}!fhbPU2sal zS=|l#GibTrkree2ULc!MzAWyde4{hm#USr#eBOZf$LDXHhoO(yqltIupSC}*4)?m^ znT=fk1{jjE3zr;~b(5hYm&iC7Hlg{Zs)mE`5BL9Usqak7fw&|-@HYOO4G=Z^DfAdM z0QN(g;q}NC*Yc(&1MtLp->-e_y6S8LwmLDA{;qnyB;Ko{UfSu=CU?jib{Pq3DxJIf z^8kx+fiOtne{_=SSF{u8!EV%Ok4^~}L zaXYE&?*mtrnYX*`qGzS#r(L&ql_r|pM^4S+e5BiBB8zW*#hn*|s*{NYW9`mA#2l(Q~NIg?jn`)#2(s5&=;Xy2&o7}p&h9Maj;|L0G|L@iXqO$Kc z!YFZ2b?zD_I$K6#w!6k^x$rV&QzYi~QQW8F4cL}PWk@qzkohq|fkkQJh4Yv41r%?c ztJL_Os6#Ud!e!}KeGE_V2IdJNmFJ(`*_VoIY5;nwuL8(VEq%YoNC2DkjFi-`-7;-h zqU|aikvEq%mDZ~@1@R9Vz3>45M2HkVJ^+;uX_1c^`}bJ70}%jK3`sg=!I_|m)70Iy z{Iuk`-0FhRn1=>2Z1ac6BBEG3Durw9eBJzo#Gr$jg*>o^7iK6!0YKB~rPUv!Vu-SS zs8=C(95jQU0b}g6VAS^kmz~r$Kse`=bB|S$+oyMZ5nR#B`Wad zVJgv}NY|#H=FvIy-y@1BYaftKEL2*mcqC{j!(=STYX+o>nqwaz9u(x6_}NB1l1Tg& z(~{9eAy_!Jwnl=DGb$vg-3-T%i0K*n;XtIn>e;T5e2%ril0JQ8$`_rf3a94J1<2j{ z`xK=d85j_QY~vVI0hL!t^%}TXI?%4>N$INpP^WAc_iChOcQebpw59GdX zZg#F9`I?Q0g%p4;!G;1ain2fnN1aCqVO#ph{~|)Q^Uuv^h1s2$I~u5bPXIRki;!LIr`SMB3>Kk0RRevg5IwJOy;sZBPUk*}HvVE#&C3GWP7ZLdwj$ zexCEz=rB-ybn&_)4)Ufc4l`Xw51uQ-#!mcEg}pT@JOGmW78PdsHTEsg@N%RW1VaBqgH(6D`FIwH{M9lAM58mq}e^y49xlwsxFnH(?AEtrNeLYSb0i0f|5YDQYe};nmX-m(|8^h zPKLt&pig+xcTjWq&}frrA>qKYxz_KL8SRY?bhUc>J>O;A=uc}pWm1+S%Kvao zO^F0F@*?_}hKOoOmyC;)%@IaJhWz+>n3^DK*pBjN97#g&Xp? zB7zdtP*=or1;XCfsd}@JAUBu^T%Z9=%8qCgZqq9&J>#9rt-Gb-dn7M;+c{fEm*zIM z78+a9g%a5FxJQ_LG+0$WcMf;{z=|D?-|$cnj|Ks3n54f5Q?hbyUp)y`p#)8Xz zXs%1a;wUP%^$+7)x*i!aOrAW(oIiHQ$d~Hau-`MD8psnDwb@t{aZT{eQ-!M43RcaFu4WPZ8+g{868D>V=<`@at$AYum- z)0+!tVfx6LZdkn%2lB;?cEPWS`2x$ zJm^@K%&YnhsM4ScG!5cs zxLfl7MKqx^rKZfexi;nC5X(NSrtmj_S;B2`*rOc68O@qZY%up(tIFtqBAJ3ffH*OX z|K>WpM?CTP=WtTd@q{+nlK$(V)d9qRhdDPqR}RkS-4aPUFa?DKQBUGdlSI` zUeg#37~5ov+AS0gV^qfdPblAB5=6*9Cgy*pDjF4O6-_1ghR6K)q8ySjgDntavD>&G zsmRvm^;R*h_+nv17Z)EO1>NZEf2`00@po2?rwQ5Ht-UQ4QR_aF*P=QcVfhCP|0=`} zCH6UI9}&zbdm$u$S(`6c6_gi=w|VF`uL! z#*0*caqtug+fpKCHn$D++E&fe62;9^)KsWH#`qV94EVmb03}byofHIpF0KEQ+Se96 zdlA==F>fzLc#7I|y#bBU4C9gC0wcgUgU-Yejp~Hzm;Snn)gZ~QwYj0F`{fbh2wBaF zrm~Z``UBQAy`V+kI0V!-NN*T%7O_lR|5i@NWi9vAtXDGIsSfK^(oGBQW6+;V&$Mx5 zByj@V8()fu;^ZVJ()D3eOdPBd*2ZBi)0EFg6LwSwv0H?tRpnerH?OOiCVZB?cPLqy zgs4w*;IfDJ^vG^NSPaDY!!1pvxta<8Z&pzSk%08VmH0;NQ2Zrv)CRaw>ga*JNoROK zh!7aJRTv~=Bxi_8rS{8L#0#)~0~4U)6~Q=U++s)S=_)NvC%6Atd8vj|maJAbQt6sC z$p1@F)9r-{69-4@H$|AEd>Pt07oTDg1t4#o!-I~!KyCQ77V?1?tU=)EZ>4Lnq*tE* zU&pAUT1p4324_!L@MMxNmAxwG@V`2M?FEPgksYds8g>7x5#c>k@={=$34GJ@Ptn>f z)1;`@sEcME3z%PJb{lav{=lZ}e(efr_&HgHS;2QEdFt#6L9qxtxYjsn8PPm`? z@(7jH-h3L^(XVLKS@~StUW-Wl5eT6*qg8Wr-(W|A+N|X^F7tg^M>CYBa&f$Xf{>bG zG|Qp$JF#jNKli^n8fG<5+0~MyTl~*wAu_{9=oT)6`~Oi1i9|q^WBP$}`?lOB3*7Y6 zF(#E98T=WeT!FgK5XGYviH+zubwGwTS5-RFP1^5g;dqil=e+TgvHOd zgzc}h5{mBH=Uo`k3OZB4oY|L0;CjK8y^c5B6(MyTN9nc$zEj>K+EVNed3Zi8=wls_ zqsrgf{b$(^2%`-R#b=P&U>ak@{6}y9!ICxL+cXFWT+G3u*TehlDS&IzNmKhyrMuD|6^(%(;$={rUZ zv0>u#{6vqj`8r!OeIfL7zQh;WAIud@%QTBz^oq7-3w(i{Hg+MVIv`6mwH z{|xs(ql~6QTD8f!-oP?^yAz8$jDQ`%Rl)BMv?fpTllg!xw?p$wpx*`?J@xR?e}!|7 zGR~@^5E1Y2kIaMEgRy()hDtohh=|^PT{d<>Sb=0NpK{vjqlv(<9r4wH$WVr&_kZTe z5&l`a*KD?$);H8-P(lb=UuK0ifP%>gyxO4FNPAja*$4$UX1jNbqdc;ZpoRyK|0< zh+UfZ&0Y;L&@{nQ0cx9sZ{dLb-H3oud~RrD$%0o2?#4vW^{MTHvuZ8TeX&(N_m8yB z$Z0laJqCnFNEEW^*C?YK7Y3UWc*cswbB^I|MrxfN!TeK4ZIlvvNW40FISUhQUmx1q zRC{$v=DS=G){0tanwE4F%cg?a#%ftth(wv}e>i}c+R}$EnvuR^sDo(A@R5|EnzYCq zJJ89dg7W$(qp_n2a6!SqY?rwyqi@)m{8`QM8VStIpBpn0jb1BJEsn{3+?l>a?Q3@8 zE&4|F`L4Cintb_@*Ck~@s*b3Gy592U#_IEPa8gQi(lP2hakf9BJlgv5%I2esiFYe^ zS?6ctX0#w(>o*=)QPJ0R&>pf|nzJu{-CquWzY(^5WB75IMP$xaT@>a#7-jWqWkGto zQK72j;jj&sqpb)h>F0NvV4$`f`1ZN{KHpuw0X>!cWp|auz1r5xii(C53?WpdAGW%a&FHBuul|}jl$h+zcBLtT(14rCJ6t9Gcq=qC0fG^99X*7ZPV+Jy8IGcgXXi ziSs^^P8yfc$3Pd4D9Ff^a_ISNH@EzDXz-;9gYQr{O#$r9kbeNc)kZ?Df>dY}5vtboFJUqlEQ3{&(>Pr1- zd2DXa_PEAvo=II-TiR-ya}nGU_wno9ix~wur^K0A=?bE)XT?_RG^H0r!@`62{u)|F z%I!X6iS1-!Ol;e>?VI=e-uH)l|2nHzuUcKFtGaqu z@8|PuLPJqu(dk@@8yW_(v4v8eg3d%8p@Z>^JgO|WPu2Gd_?mHlU*EKbO~;R__a|ge zZ>n}a6`Sd14=hiH5lr#x_=`74CubarBdnbum8^nfpUYf0ws<1rX^7Z)0~ftg;*ri9 zs;cRr85Oe|7v-xuQODy!;o(j-A(_tl?zp(ahtB7edH(SUkNZPwJ8t3!^{)T{+oX<{ zBAH|2m-|Sawuz`4?xVTv_MCB}=)=D8){hg1G)^aascfF1tk&j|An&JWo2jyoEy(4! zJCd+n+&ZQ7Q4F85eG*L$P~lj-`Jde5Hk259-okbfHMrw1Ee$PQA6xrzo~0 zPJAx^xQJ;*-K88i{X>dq9AD~^eKuBXLl3FAt^+Yo{{!)akz_^% z@hdC!cI(K2o7ON(OUwM|^_LKlNJ8PCNq1u|y>o7xtb2?)KcgXFzvXAXz9H<3!|70@ zBxgaZjb%czS#}s-EZlyN0k&oGrU(siG1GJ-HGX_)mAemfs|o173b{qCHyh!;>n?B7 z0C~8a71b4u&y>5dMoQBW_P?O)cDO`~Zj!$F3tDJkd)c)`(H?WdJ~&7yQ}c23)rt63 z4z9x^Iu_&vy}Bi_aB=u@j78SOlPrX(n?5{2!NFZB><;a_O(o#0Ij~MnxkY=wt2Ofn zEi)cGj}n@&g;<>?e)6^=Eo$=;=+ocL#GL~b)VU6$zAR@lR;yxtJ@VC&$$iafb&Uj7 z=jS7kSzaU)i;DyL!3U6N>DqtL^eCJvwWOxYz$cI91@^iMV=a=MI~=52@lbP7geq66 z^|QW_I9~lVT7I8n6vh%37F`oPib#SlZ)1=}yd8r?sE%%KHR;~F+gdU1!1_t*C^stW ze^ByVh=v`2n9ik-zA=)3M{>5WRuz z#qW^S`8u)jji_aPz{nwj-N)=ot3c1Uz&adGg2uq`f(prYdupfdu)lyejd|h{K*r5cQ`?&Gp&ji|`JExH)097c(GqnM8LX4WmhmJK3wD{f=zeJAne&g1wz0e5 zkUJqRUrreB>CEHH6MiQDPvMUDZ4F9kw4?q80%dGO!$xb8GHIomr#fsJHnxPMD(zAz z*otz}+b7W#)9D0p$M;c4rQvd}8MD8;u;!hw)?5HSNB>e<+PR3UIHPcCZpySzk8DwN zs>q@(vyyVKb@A*P=YbZfvP5?;DJMk0vQHp~)mm4hx>dc;1cNP^$O(lA@YRtdEvv5VJhYZk^UW-lce9DvofX?~i!NmR~#$~(0ENx9f8Q7_>j`zl_RsxYbS;-zk+NOE0rjY?c2pncP zp3e12q|NU#3}FR}Fau6a<@pfqLSHVlt;eO*Yus@sR$WRT>U?{E_^=g?%)GK*pVr7F z9UY(s*hfzOx7T=yOn~{-pXSKNad?^O;0y1+_nDCxsAe%rMKT#iwG}@bz$Yhh`Y)cY zm3}7fi`wbckSfY56Lwxy!)mqY*O(iy)UvqlzbCx`L^bB8r@tTJ9tGa~esjBroOj;3 zFRX2gLn7jom|Jx&VEJ9^_=NTspuz6IZ4Ei0u}latU>cohMCwz*QBjDgSitP)1Og&Svs?X*c}7 zc;5m~OW^Y}aoIlXze|rW1O6$YsMotuZ?LJaF)D3O=X0SnGUT#2P__B=vJ85Xk^{;8 zxjutHMt+a3h8mYT-^~ev3S|!twb(qUEjx;GZ z8O!Y6sBgz0B<$W8gum7K=1M0~5yv=;Xb69JM zZg@8bWG@xXu?EBC%{Ug7`~O0esdZ`Lgh46EzT@|NY-KVVI(D;U$`pFy60T2X$2mU6 z!&s_058ZRTdqw1K`Jfm0Q*rw&&_1@?N1oPd_=|S`_=zA5=v4nauP5M;0E(%vPU>Fy zcrPL4jw0d?R;T%EylnY{b+>23N0@A&@J9C$uQNQ7&2AV+z1a-aqQ-ElTWesh_4k;m zwdT-HM;Eoy!;e-OdCnEHi3|Z@GknjRBW>DIx~&UGUIvX;U-_AMGkgm!$#lM0mXzBs zpr`pNf!{^%hVAZ*Wwhp|2M5rHOGK7(nfIr-JI#c@eqj!h&u-mr!9z)}TCBaC$+bAs zB!j(zFWwrEj(LnWS?h9yDGe}XbQGR;QAy#8(y89$=N}?@U9C&cxw!6N6Uj=blUjLs zGm!9AK0NR7_H(5wTWbm>k82mjLr*9e7@!XrO{#MQO&i6biUze?Z2S*zZETo z7fmOmiVzJcJw5aPxH%ZT`YAC2z0m5p2FC4hO4?APHuYNYdS3md?keJn^WBf?v8ReZ zw@7v6P+A;PORv^y|J8E&{+-dt{9#H%=gI+BWQn!k$%heZV)HAg;uskc;t|~&#q`&% z=2+1I&cpfEAH^m@;>~6Trjpzmbdl1weIM>fuFe#@dRWuPYyI;Y z=ir!t8$q4?&QprdJoXSF!1QEAi$Dn5x;^3e*!` zZ@Stj;9g2&0iE09#hFM}SdTbB+FQ??1f9Ubl*0w%(*pG`(K4Q}r>-$ZU5$*V3Eih* zy?wB4(J(eH=5K8nf&_a}05}9f46(4}_dvS?H2<5xUqMqhOkTm1l6ay#ol9el?Ps&y zEfd8&P(U1%eEZB6*avfFa02w1wI!6n*m60wa?%gp$lWvTl{??dZeoTI@!yE$p=bbr zRBOjtURV}i^xU)B9>AEVY@X5O1orwMT=9HK0_v`}&9viS`l-@@`N_pUAvlM8GN zvu-!BaoVQ2&1X&dHw@lqe1W&*LhS2O)lsPpsoCt92kplAx(FHJJB4M_=Ja12ludNimpPO zXDbfAZw!xRxJWUrD7#F1er{4qk#?g-1HdOgdqGvsC)llE*Pfk|rpV#j#m@z~kLZjdrMlpCZaW^2cZ6O0H~Z#wte(*gff0Ev9KYUWUCB`|&G2p_LBvF}V2zweif1kpzQQne$}>mj`I07I!SX6dVg{ z>-i$ZeOcEi;`Z%=8BE60J*$&P*(1D6#iySnH^}E zJ5zQEo8&2MA|GLkg{s^;`~~W1gNt!+xCNp*TzSv$yl*oCuiwWK-d;D}c`CLXKh7@R zW6xQJ=KGB+f*^y!WIeWIvi3aKQlZ@@If34`n^^sZ@%$VjzEQ4#C8}Ij+=d*p2dvyz@q{#0F45=blS5x(OK@GgXteoLKVa?W*pYcV}c|$Y(lZb?` z0YXBlu7$KC7LNehe3N%WG6rqtbZ1ZR7@kpf+K!|Nx8qBzv`Izt*u1FfuPy$25=-8e~{cVp4|us(BiGrb=dw^Da-VjZ3P`yhtFt%NQ4e z4++kU81Vnh2P|D!$?f^2Oy6xPIIavl!QK2k+{@;b!q3tML8s7zxb~k9ubsFsT}lse z;x#62*x!7|42Lh2X^2R##O*v8zA0(*(lu3DU`Ou2NrMOb#ZI9fyH!<`s4N6|TnxnP zHLXWZl-oXOewkVLIMNcvIO5jzNX$kbWsDvaW7bMOxvaiK5nfNZIq|xSS$;nP-Y5^a z!1urp2y~1bzc&8BgekAsCLQDoEt4Fl*%d>K#S68cj9#vGBa7xz zXwGOqPT!}IK5+Td$G#Sw!RwrM=`kw=gSG+)DC}3s_ObX-vW1o&G0a+uh>R{cVlA>O zDhVi*+%aer&gO6kOS?MRj!H;^6LD#!H4Rdfs-aqGv(WEidgy~7%8GGT6R-o&a_ z1clevM?uR|&r&O5yxhQQ?cnO(4>Q*+L?DJe+NH0I!SuzLsX?#~Qk@hhK@f-@iu4{; z5*LO24qQXkSwp=8!͹`KKOIROgxCX$-;Zj$1PG)~8 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 diff --git a/docs/integrations/source-code-mgmt/bitbucket/index.mdx b/docs/integrations/source-code-mgmt/bitbucket/index.mdx index 61d72271bc850..c8479c565125e 100644 --- a/docs/integrations/source-code-mgmt/bitbucket/index.mdx +++ b/docs/integrations/source-code-mgmt/bitbucket/index.mdx @@ -177,52 +177,9 @@ When Sentry sees this, we’ll automatically annotate the matching issue with re ### Stack Trace Linking -Stack trace linking takes you from a file in your Sentry stack trace to that same file in your source code. If you have commit tracking set up in Sentry, we can take you to the exact version (using the commit associated with the event) of the source code when the error occurred. Otherwise we'll link you to the current state of the source code (using the default branch). +Stack trace linking takes you from a file in your Sentry stack trace to the same file in Bitbucket. If you've set up commit tracking, Sentry links to the version of the file from the commit associated with the event. Otherwise, it links to the branch set in your code mapping. -1. Navigate to [**Settings > Integrations**](https://sentry.io/orgredirect/organizations/:orgslug/settings/integrations/) > **Bitbucket > Configurations**. - -1. Click "Configure" (the gear icon) next to your Bitbucket Instance. - -1. Click the "Code Mappings" tab. - -1. Set up a code mapping for each project you want to have stack trace linking. To create a new code mapping, click "Add Mapping". - -1. Fill out the form, then click "Save Changes". Each form field is described below: - - - **Project** (required): This is the Sentry project. - - **Repo** (required): This is the Bitbucket project associated with the Sentry project above. If you have more than one Bitbucket project being used per Sentry project, you'll need multiple code mappings. - - **Branch** (required): This is the default branch of your code we fall back to if you do not have commit tracking set up. - - **Stack Trace Root** and **Source Code Root** (optional): See below for information on determining these values. - -#### Stack Trace Root and Source Code Root - - - -The following information is only valid for platforms which use traditional file paths. Platforms with package names require additional steps. For **Java**, read more in the [page on source context](/platforms/java/source-context/#setting-up-code-mappings). - - - -First, navigate to a stack trace that you wish to map. Find an **In App** frame, which is denoted by a bubble on the right side of the frame. The filename will be shown as the first piece of text at the left hand side of the frame header. In this example, it is `src/main.py`. - - - -For certain native platforms, the stack trace will look different. In cases like these, you can find the absolute path by hovering over the filename. - -![Highlighting where in the UI to find the file path for native stack traces](./img/code-mappings-stacktrace-native.png) - -If you aren’t sure, you can look at the event JSON by clicking on the `{}` button in the event header. Find the text in the frame's `filename` or `abs_path`. - - - -Next, locate the file seen in the stack trace with your source code provider (e.g. GitHub). In this example, the path is `flask/src/main.py` (`empower` is ignored since it is the name of the repo). - - - -Compare the file path from the stack trace with the path found in your source repository. In this example, the `src/` folder in the stack trace matches the `flask/src` folder in the source code. Using that information, set the **Stack Trace Root** to `src/` and the **Source Code Root** to `flask/src/`. This tells Sentry to replace all file paths beginning in `src/` with `flask/src/` when searching for the source code. - -For best results, we recommend always providing a non-empty value for the **Stack Trace Root** when possible. - - +To set up stack trace linking, [add a code mapping](/integrations/source-code-mgmt/code-mappings/) for each Sentry project and Bitbucket repository you want to link. ### Source Context diff --git a/docs/integrations/source-code-mgmt/code-mappings/img/code-mappings-connect-modal.png b/docs/integrations/source-code-mgmt/code-mappings/img/code-mappings-connect-modal.png new file mode 100644 index 0000000000000000000000000000000000000000..903275831e7639843078af8777c33169bc8486be GIT binary patch literal 221361 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 z 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≪!zNa;j=^VWh&FP=CQ&KLi2 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%0A&~=3Zik^>8{1`wQgnim-$D0^uiH@BT&i{}6n{*Y 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 z%0Dq{qL1h_mC(zWh51>*P0O!RR=0xo58n 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 literal 0 HcmV?d00001 diff --git a/docs/integrations/source-code-mgmt/code-mappings/img/code-mappings-connected-repositories.png b/docs/integrations/source-code-mgmt/code-mappings/img/code-mappings-connected-repositories.png new file mode 100644 index 0000000000000000000000000000000000000000..529e46359a07b25e7259cabc94e07c60a3a3ae67 GIT binary patch literal 171212 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

e<9A#o!+wE`jT|Vozj59zo$sIOr4;Kb)+(n_q` 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­~d_0b<9(^eko)I-16#ZU32}srKd%El!O9` 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

*Bm}eI`yPdhNmR)ZPo57p z+JWfi{J($w&t;xbVcni{6&K&RWDhqkBXkuicXlugG`?jVXe>FG?!vrR-t^|g*5&uw z_;`MG+m)yNi3Rijy}kc@6ByC%s3U)~PIx=847crKXKnI#nZC|+Hx*XlV#C+zzyF>8 z`n)vRi!)KK;J}7G(30*|9CX`V-{PvG0b?twkM9TZ+M@W|FaY0c%xmA@Z_Lc%+^_6i zHRGjdtQqH^rR~3O!K*-q241;;dxHOcTO)Xs|NG^C8@c}-uzwqlKXLiLLGt(6;{O{YTz?fH(jE)H TZg~9{@RE~Oma33=7xaGs=HwnQ literal 0 HcmV?d00001 diff --git a/docs/integrations/source-code-mgmt/code-mappings/img/code-mappings-repositories-settings.png b/docs/integrations/source-code-mgmt/code-mappings/img/code-mappings-repositories-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..89af05075fb46d6b79510d526760a758d47d68ea GIT binary patch literal 152705 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%0A=IYi3O-FvX5NC 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 literal 0 HcmV?d00001 diff --git a/docs/integrations/source-code-mgmt/azure-devops/img/code-mappings-stacktrace-native.png b/docs/integrations/source-code-mgmt/code-mappings/img/code-mappings-stacktrace-native.png similarity index 100% rename from docs/integrations/source-code-mgmt/azure-devops/img/code-mappings-stacktrace-native.png rename to docs/integrations/source-code-mgmt/code-mappings/img/code-mappings-stacktrace-native.png diff --git a/docs/integrations/source-code-mgmt/code-mappings/index.mdx b/docs/integrations/source-code-mgmt/code-mappings/index.mdx new file mode 100644 index 0000000000000..2c967e33e44f5 --- /dev/null +++ b/docs/integrations/source-code-mgmt/code-mappings/index.mdx @@ -0,0 +1,100 @@ +--- +title: Code Mappings +sidebar_order: 90 +description: >- + Map file paths in your stack traces to files in your repository to power + stack trace linking, suspect commits, SCM source context, and Code Owners. +--- + +Code mappings enable Sentry to turn a file path from a stack frame into a path in one of your repos. + +Code mappings power the following features: + +- **Stack trace linking**: Open the file from a stack frame in your source code provider. See the integration docs for [GitHub](/integrations/source-code-mgmt/github/#stack-trace-linking), [GitLab](/integrations/source-code-mgmt/gitlab/#stack-trace-linking), [Bitbucket](/integrations/source-code-mgmt/bitbucket/#stack-trace-linking), [Azure DevOps](/integrations/source-code-mgmt/azure-devops/#stack-trace-linking), [Perforce](/integrations/source-code-mgmt/perforce/#stack-trace-linking), and [Cursor Origin](/integrations/source-code-mgmt/cursor-origin/#stack-trace-linking) for provider-specific instructions. +- **[Suspect commits](/product/issues/suspect-commits/)**: Find the most recent code change in a stack trace. +- **[SCM source context](/integrations/source-code-mgmt/source-context/)**: Fetch the lines around a frame from your repo when the event doesn't include them. +- **[Code Owners](/product/issues/ownership-rules/#code-owners)**: Import a CODEOWNERS file and sync it to stack trace paths. + +To get started with code mappings, install a [source code management integration](/integrations/source-code-mgmt/) and add the repo you want to map. This page covers path configuration only; installation, commit tracking, and resolving issues via commit are discussed in detail on each integration's page. + +## Where to Configure Code Mappings + +A code mapping connects a Sentry project to a single repo, with one or more paths. You can create a connection from either the project or the repo; both open the same modal. + +- **From a project**: Go to your project's [**General Settings**](https://sentry.io/orgredirect/organizations/:orgslug/settings/projects/:projectId/), find **Connected Repositories**, and click on **Connect repository**. The project will already be selected. + + ![The Connected Repositories panel in a project's General Settings, with the Connect repository button highlighted](./img/code-mappings-connected-repositories.png) + +- **From a repo**: Go to [**Settings > Repositories**](https://sentry.io/orgredirect/organizations/:orgslug/settings/repos/) and click **+** on the repo's row. The repo will already be selected. To change an existing connection, click the project's chip on the repo's row. + + ![The Repositories page in organization settings, with the plus button on a repository row highlighted](./img/code-mappings-repositories-settings.png) + +To map more than one path between the same project and repo, click on **Add another path**. When you save, Sentry will apply every path in the connection at once. + +If a project uses code from more than one repo, create a separate connection for each one. + +## Path Fields + +Each path in a connection has three fields: + +- **Branch**: The branch Sentry uses when the event isn't associated with a release commit. If you've set up [commit tracking](/product/releases/associate-commits/), Sentry will use the release's commit instead. +- **Stack trace prefix**: The beginning of the file path as it appears in your stack trace. Previously this field was named **Stack Trace Root**. +- **Repository prefix**: The path that replaces the stack trace prefix when Sentry looks up the file in your repo. Previously this field was named **Source Code Root**. + +![The Connect a repository modal, showing the Branch, Stack trace prefix, and Repository prefix fields above an example preview](./img/code-mappings-connect-modal.png) + +As you fill in the prefixes, **Example preview** shows how a sample path from your stack trace will be rewritten to point at your repo. + +An empty **Stack trace prefix** will match every file in the stack trace. If a project has more than one path, set a specific prefix for each so that Sentry knows which path applies to which files. + +## Find Your Prefixes + + + +These steps only apply to platforms that use file paths in stack traces. Platforms that use package names require extra steps. See [Platform-Specific Paths](#platform-specific-paths). + + + +Open a stack trace you want to map, then find an **In App** frame. In App frames have a label on the right side of the frame. The filename is the first text on the left side of the frame header. For this example, the filename is `src/main.py`. + + + +Stack traces from some native platforms may look different. Hover over the filename to see the absolute path. + +![Where to find the file path in a native stack trace](./img/code-mappings-stacktrace-native.png) + +If you're unsure of which path to use, click `{}` in the event header to open the event JSON and find the frame's `filename` or `abs_path`. + + + +Next, find the same file in your repo. In this example, the path is `flask/src/main.py`. Leave out the repo name (`empower`). + + + +Compare the two paths. Here, `src/` in the stack trace matches `flask/src/` in the repo, so set: + +- **Stack trace prefix**: `src/` +- **Repository prefix**: `flask/src/` + +Sentry then replaces `src/` with `flask/src/` at the start of every matching stack trace path when it looks up the file. + +## How to Edit a Code Mapping + +To edit a connection, you can access it from either entry point. The modal opens with the project and repo locked and the existing paths all filled in. From here, you can change paths, add paths, and save your changes. + +If a path is used by a [Code Owners](/product/issues/ownership-rules/#code-owners) import, you can't change its prefixes until you remove that Code Owners import. + +## Automatic Code Mappings + +If your organization has the [GitHub integration](/integrations/source-code-mgmt/github/) installed, Sentry tries to create code mappings automatically for JavaScript, Python, Java, PHP, Ruby, Go, C#, and Kotlin projects. You can still add or edit mappings yourself. + +## Bulk Upload + +To create several code mappings in one go, upload them with the [Sentry CLI](/cli/code-mappings/). The CLI's JSON format uses `stackRoot` for the stack trace prefix and `sourceRoot` for the repository prefix. + +## Platform-Specific Paths + +Some platforms don't put repository-style file paths in their stack traces: + +- **Java**: Stack traces use package names. See [Java Source Context](/platforms/java/source-context/#setting-up-code-mappings) to work out the prefixes. +- **Godot**: Stack traces use `res://` paths. See [Godot Source Context](/platforms/godot/configuration/source-context/). diff --git a/docs/integrations/source-code-mgmt/cursor-origin/index.mdx b/docs/integrations/source-code-mgmt/cursor-origin/index.mdx index c62a86a3996fa..8cb6113c1ec65 100644 --- a/docs/integrations/source-code-mgmt/cursor-origin/index.mdx +++ b/docs/integrations/source-code-mgmt/cursor-origin/index.mdx @@ -32,19 +32,7 @@ If you have added [Seer](/product/ai-in-sentry/seer/) to your organization, you Stack trace linking takes you from a stack frame in Sentry to the corresponding file and line in Origin. With commit tracking configured, Sentry can link to the version associated with the event's release. Otherwise, it uses the branch configured in your code mapping. -1. Go to [**Settings > Integrations**](https://sentry.io/orgredirect/organizations/:orgslug/settings/integrations/) and open your **Cursor Origin** installation's configuration. -2. Select the **Code Mappings** tab, then click **Add Mapping**. -3. Fill out the mapping: - - **Project**: The Sentry project whose stack traces you want to link. - - **Repo**: The Origin repository containing the project's source code. - - **Branch**: The fallback branch to use when release commit information isn't available. - - **Stack Trace Root**: The path prefix shown in your stack traces. - - **Source Code Root**: The corresponding path prefix in your repository. -4. Click **Save Changes**. Add a mapping for each project and repository combination you need. - -For example, if a stack frame shows `src/main.py` but the repository path is `backend/src/main.py`, set **Stack Trace Root** to `src/` and **Source Code Root** to `backend/src/`. - -For platforms that use package names instead of file paths, additional configuration may be required. For Java, see [setting up code mappings](/platforms/java/source-context/#setting-up-code-mappings). +To set up stack trace linking, [add a code mapping](/integrations/source-code-mgmt/code-mappings/) for each Sentry project and Origin repository you want to link. ### Code Owners @@ -60,7 +48,7 @@ Import your Origin CODEOWNERS file to automatically assign Sentry issues based o /frontend/ frontend-owner@example.com ``` -1. Set up [code mappings](#stack-trace-linking) for your project. +1. Set up [code mappings](/integrations/source-code-mgmt/code-mappings/) for your project. 2. Add a CODEOWNERS file to your repository at `CODEOWNERS`, `.github/CODEOWNERS`, or `docs/CODEOWNERS`. 3. Go to your project's [**Ownership Rules**](https://sentry.io/orgredirect/organizations/:orgslug/settings/projects/:projectId/ownership/) settings and import the CODEOWNERS file, selecting the code mapping to apply. During import, Sentry uses the first file it finds in the order listed above. @@ -90,6 +78,6 @@ Sentry adds a reference to the commit or pull request on the matching issue. Whe If a repository is missing, check that the Origin installation has access to it, then refresh the integration's configuration in Sentry. -If a stack trace link points to the wrong file, compare the frame's file path with the path in Origin and check your code mapping's **Stack Trace Root**, **Source Code Root**, and **Branch**. +If a stack trace link points to the wrong file, compare the frame's file path with the path in Origin and check your code mapping's **Stack trace prefix**, **Repository prefix**, and **Branch**. If CODEOWNERS rules don't assign issues, confirm that the email addresses belong to users in your Sentry organization, that those users have project access, and that the selected code mapping matches the stack trace paths. diff --git a/docs/integrations/source-code-mgmt/github/img/code-mappings-stacktrace-native.png b/docs/integrations/source-code-mgmt/github/img/code-mappings-stacktrace-native.png deleted file mode 100644 index 0628a8cb9fe70dea77fde60b8bb53e475cf71778..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101153 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͹`KKOIROgxCX$-;Zj$1PG)~8 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 diff --git a/docs/integrations/source-code-mgmt/github/index.mdx b/docs/integrations/source-code-mgmt/github/index.mdx index be919509b7be7..33bf62cee8457 100644 --- a/docs/integrations/source-code-mgmt/github/index.mdx +++ b/docs/integrations/source-code-mgmt/github/index.mdx @@ -417,7 +417,7 @@ When a pull request is opened, Sentry will parse the filenames and function name Sentry will comment on the pull request with up to five issues per file that were first seen within the past 90 days and were last seen within the past 14 days. -This feature requires [code mappings](/product/issues/suspect-commits/#2-set-up-code-mappings) and is currently only supported for Python, JavaScript/TypeScript, PHP, and Ruby files. If you're using a different language, [let us know on this GitHub ticket](https://github.com/getsentry/sentry/issues/69824). For JavaScript/TypeScript, please ensure that you've unminified your code by [setting up source maps](/platforms/javascript/sourcemaps/). +This feature requires [code mappings](/integrations/source-code-mgmt/code-mappings/) and is currently only supported for Python, JavaScript/TypeScript, PHP, and Ruby files. If you're using a different language, [let us know on this GitHub ticket](https://github.com/getsentry/sentry/issues/69824). For JavaScript/TypeScript, please ensure that you've unminified your code by [setting up source maps](/platforms/javascript/sourcemaps/). ### Missing Member Detection @@ -437,57 +437,9 @@ By default, this feature is automatically enabled once your GitHub integration h ### Stack Trace Linking - - -Sentry will automatically try to set up code mappings on JavaScript, Python, Java, PHP, Ruby, Go, C#, and Kotlin for organizations with the GitHub integration installed. If your project uses a different SDK, you can add code mappings manually. You can also [upload code mappings in bulk via the CLI](/cli/code-mappings/). - - - -Stack trace linking takes you from a file in your Sentry stack trace to that same file in your source code. If you have commit tracking set up in Sentry, we can take you to the exact version (using the commit associated with the event) of the source code when the error occurred. Otherwise we'll link you to the current state of the source code (using the default **branch**). - -1. Navigate to [**Settings > Integrations**](https://sentry.io/orgredirect/organizations/:orgslug/settings/integrations/) > **GitHub > Configurations**. - -1. Click the "Configure" button next to your GitHub Instance. - -1. Click the **Code Mappings** tab. - -1. Set up a code mapping for each project for which you want to enable stack trace linking. To create a new code mapping, click **Add Mapping**. - -1. Fill out the form, then click **Save Changes**. Each form field is described below: - - **Project** (required): This is the Sentry project. - - **Repo** (required): This is the GitHub repository associated with the Sentry project above. If you have more than one GitHub repository being used per Sentry project, you'll need multiple code mappings. - - **Branch** (required): This is the default branch of your code we fall back to if you do not have commit tracking set up. - - **Stack Trace Root** and **Source Code Root** (optional): See below for information on determining these values. - -#### Stack Trace Root and Source Code Root - - - -The following information is only valid for platforms which use traditional file paths. Platforms with package names require additional steps. For **Java**, read more in the [page on source context](/platforms/java/source-context/#setting-up-code-mappings). - - - -First, navigate to a stack trace that you wish to map. Find an **In App** frame, which is denoted by a bubble on the right side of the frame. The filename will be shown as the first piece of text at the left hand side of the frame header. In this example, it is `src/main.py`. - - - -For certain native platforms, the stack trace will look different. In cases like these, you can find the absolute path by hovering over the filename. - -![Highlighting where in the UI to find the file path for native stack traces](./img/code-mappings-stacktrace-native.png) - -If you aren't sure, you can look at the event JSON by clicking on the `{}` button in the event header. Find the text in the frame's `filename` or `abs_path`. - - - -Next, locate the file seen in the stack trace with your source code provider (e.g. GitHub). In this example, the path is `flask/src/main.py` (`empower` is ignored since it is the name of the repo). - - - -Compare the file path from the stack trace with the path found in your source repository. In this example, the `src/` folder in the stack trace matches the `flask/src` folder in the source code. Using that information, set the **Stack Trace Root** to `src/` and the **Source Code Root** to `flask/src/`. This tells Sentry to replace all file paths beginning in `src/` with `flask/src/` when searching for the source code. - -For best results, we recommend always providing a non-empty value for the **Stack Trace Root** when possible. +Stack trace linking takes you from a file in your Sentry stack trace to the same file in GitHub. If you've set up commit tracking, Sentry links to the version of the file from the commit associated with the event. Otherwise, it links to the branch set in your code mapping. - +To set up stack trace linking, [add a code mapping](/integrations/source-code-mgmt/code-mappings/) for each Sentry project and GitHub repository you want to link. ### Source Context diff --git a/docs/integrations/source-code-mgmt/gitlab/img/code-mappings-stacktrace-native.png b/docs/integrations/source-code-mgmt/gitlab/img/code-mappings-stacktrace-native.png deleted file mode 100644 index 0628a8cb9fe70dea77fde60b8bb53e475cf71778..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101153 zcmc$GV{~O*(`|4%Hah9>#7U=P+jhER+qP}n>e#kBwr$($_~zmJjd8zs+@JT?K6}-| zUR8^;W}OgOX%ToBEEo_F5O^_BL3t1mfG7wEXbBX=M+)YI&F_zwPLm(X_R3O{?0Qxf z)H?cBx(3wF7SB^TjEYbPPlM4yXLiAjo9%38p{*hJLT z*5JFV^bb8(Gd(taLLP1yPG|Oy3M>rlb%4$m=9YHs&Rm3l*316!`;TNALg1fS?9I3c zm8E2X0#>#LKxS%MYFa{W7$B#uz9GB3pzz;?Ki;?qjqUBN*=cB;oSdkg7^tmmjcDlD z*w|=j>1pWcsXlU0*|}KS>o`+c+7bOx#b0#@8rbRCnpoSLSXl!9s8dJR%E6wCknlqe z{JU}kXOsWbZfW;-_dgUt^M{0nj+&O{&+LD^vCEn`87e<*_H zZ%urtl;&TZe!To^6$8r;Q`mm!oHv4|^TS@CcJd+IxxmDu?VlugLI2m%eAh~sjK zcjFOV#or5y@|xm@#fOjd_r%yeO75->Z!_88co!-(hQfF>+S{Nqn)@9ORo}lIA;W4cUR5?v$70y zUiL9Lv#oP@bB4$$V-?%mL;p#Bd36X)9P8FU@ zPxTpxsa~Cl$!s}xTz7_X)t=^G`+X>Sw}8_n9v>Y#{j&sM7^u<l>~4s8S}5ToyrVUNPm ziL^Kv86>Kv5rM4wcnQqU9}LdeGW|FYY@p zdXc~Dc%`Ybgp68)JbrVgZyz=tgDze#$eZm3ceTjAG%+cH6Ts_67S(fsb!m*pa45`w zVHLqkDE+iK4J@Yu`DvK*?+~{KOct9;m1cB8d^eXWW4f3Z0%;6&Xtg&HE^OQPG%Ig{ z+0Qg9e^J9Qn6MLhmCgdoWJ-4JXe=-{163$wZMo#JBbu9pW%4 zQ#%=0_A=-1VSy%+D*R)OabbX@NJ;*2;7eK5TnuA|m{}-d7*4m=D>(%29adNS^lXjV zgUZ-?pmlWzHa=W)U0vOBU+?hJqt*9wtERH}ct#w_nMY-+tJb<+4-eICOsS#Vwx7Nn z_lgsf9j9L_OTH`kN7W`IB(YVR-d+rsi2o8Phwzz=XH;!|NlQhalThB6D)%)q;|J>2 zHwbKolZ$R6lFHAA;3U=Sqa>3`VoSL-;OF_a5vH~q)AO-Aky5b{L~P&V=f>;=$^MWO z%=o#xhbFrngO>6c+G?aL8w88BEK5?)0L4nBG3`}h#CW{<`&fyg7d~4&@jwQrU6~|} zl2%~mW<+q`Kl@$=qECT+rh1P4o}V=SsQXG%8P)GFY2iDNA7kPg@&I-yu=%-@M}=?- zlPtG=AuM`xS`GW9M|lZJF<6!iCCw*{Mr^lf2Nvq`4ze=00Ydbc+qxCG+v^%z*DV^F znRJ(0P6zjEb;n+%N9Pyod_F#0 zC%Y@El(Ja|@7E|}DLi2XW69HBgH+!3V8kUw%MzTjI@*t3U@;a{4_vAY>n@R>*KT1Xe@c!35kr?f3cx0GDH`WP!}#}JtM9;E{yG-&D~Nj_B*5% zwPxWc^|68lsb<1+%pi(GgNf5&;S z=Hytu-ORYvmg?k41I2V_cKhv=gkxKC%_=KH5+HnuW-=!Tr3nwU?$T-Vm^^FxfI1@MRAr4>U1^xt`aBpna;Y(>F!xTg4FG7C(q_|P`5%;t4FN`}*B()*( z)X~ZLVr!vO>?2_=G|aQ`Mf|ZIl^7@cFQ`=2m#)0J=!Uo-?E$rhWc`X zmDX<#sgCE1ecv-b$9Q>nz6e(UrNdQ-f38IoQmg2mZ#|I@e2v`kewkpi@a2udva9Ytc?1qU$RC{4Xgp$Kll*PsxUK(UG5%RX{9yTM!wEAHqTRxVfuk?jfG5lwZTq zajOvuaPlNyd;nj+l7Ds(uRNsXegio^HsHdstGzke%p|fM)uu+huAGqnPTzZBGg;+{ zw$_+LETFKuQpq7s_b0D<|sh}h-Et*eUfnOkheKHlH z3wc|>{hEs#1P&U9ltpNoYU$ZA%fTG`1b@6!6h=fqL)=R?bCrjRHuN>AyXTpWnaQ7J zmWCqa$QEI`i95N)a{HDpJc6ZLpVP?^5sQ^E zk?<$~n4vg(qPU5A0SY%6K@MMAJ58y^vL*2^IV6q0kAp=4ymnYe^Bubv-d_6WmQeFDC5D6=hMGPy5D9SWOe)XyKp8Xg?fHxP^u&lagV?p{JTgp4*EGcH=-8|>J6pRH{(WgcOO%Vc;}lGFz+tV{3}2zjw}6I{ah%Hw`4g?m%~R=n z4tJUU&;(81ZXR0b_O+(-5X$h-P`*Ky@*SUu(y`s+C-p4RgKfrVmgUWgA2?a=zrU0U z8p;_LF?BVY9ax$iL}js#=jwgNNP>FPEStZ&zC$sPQB-8!N#~>N(4=x{dmk4;!$a=J zq>g8=+_TG!%aGvX^I>#5hdV|$$>2#xEfVsUP*x@%OXZl6qyC=U+pE9aVnRvPY)tp~ zP-UoaJghInqGfiEL4M=W=7H1M`TK?Pc%~5%mm`%I8F`CQZ=P|v#swRf-CBA32o7g9 z%WyPPTEk_ariNa%_E=3^LZT2a{b9El)ugNI&Gzv0)LgOHJg+U?U2#FAdfSN9;X={N zYbd^vsiRP`7L8~is&LA{-D+#uvP9w1`~Jy_<;sJlQ~I+kh|j6GnDma_TwK2tmV}>5 zM7_fef~He?lt;|z%^e2io~QRu*b2If_E%)76lS^Lq_LAm7`f0BtHCNhggGT0z8LZb z`e_FL$@E{(_xMN>7j0J^(M69gkGK71Rx{4r`-jy;C-GxtzYkw0jKA(6&lDEWm^5r* z`=k6|Dk!_RXi@j`HnKO7dScdEZr!O8Qooeg5j1Uxh9~bWE}4n9Md3EbISY&>IAg^{5Xgoc z$(26RB?2TfZ{cnaf&|z|@Jlzms91ZCPw|(X{BPK#_YBY_?d^?Fa#>1sefL1Y`GdZ| z58;mh@wATy7>>Fsi1>edD|d}JzE?O8kB=st0Zkoi*gsKo$}av;$lPur74;zYIYSJF zG4GM64Z;Ur3jHD`REc*(@Az?%2M!>s`%F)kbQWq~o&^ zs{Ja$IS;Xmwl_TPnPyou=uoW>N2=aHln$XbHwlhJ{5UhpFL;BMMBExg_T3QZq1!tp z$^cHfJ7`$Mgz-Wxhe9os#_p__Hn5VaJ~#3$&@Pn7tLvGOkG4zitWi02@fwbh%W_J!iuv1gy zgN+C(ka*@G6@!GtR86CWcaP@Kg{k) z>HC59xDkL76so1Q+RFF?SMU(sj>r&KRT8uyW>tSZBnn-D6yaP60R`01i%k*?$7RvA0tMt;I@|r_tr46Q2r#=TU?}`M+Uhb7&s)DpaQ3 zPbhO7zF^7vDeOj^tq4271;ESba89glris6VU5D8&QrHY(N7aGlW^3Le{Sj zham!wh9PL^!%tQXa;n!MsxZh%tUxtah`VethJk1ns1#DnVJ^dM>w)wg z?k3iTNW3D&)rM!^1;Vwx>{mJK3vgy;+L$s3CpD3~9IVdcjPXo@au`xlV)#%C!wY}+ z4B!Ywak%^Y3i#sWE*$3d*%+PRkdh!Zp_%95H#YLJ@^*s?446Gcaxq$8db{d5?$U)^ zoo2m}QiCgSMq>_|M#ba`ixwh;LiQ?yxa^GinZJ8HgNux!e5Z|vr6z}+NFh6GwkLIN zFkk&z67>fDG?n8QWU@R;!5_LgMX!4cb;P*w(6zR^QjT3pWXn1(4lHeFkW5sc&>kRX zo<+sH8)#v>F`TZzZ8g~hRv;cMsRmwSJHg@TO~*qsb_*l~x6<=5Az^(c+?}77S_v5S z70)Fr_576_@9UH9TLKP|4?jx^)dI6nYN6IJ;xaruiqiNR5=VARoI z$?B7=YP;nkDLSX{BD#O~@`XdEE*g6g2L($~Ny{nVHiy?b;MyvkrU+xQxifeKk_n!> za7hF9TrB0w5

kQb%AHs_T5rtCNUMDO>YsklA%r^jzfgjB1BSp=4#q5%@IHE^<5& zNTvJykPjZtGsxd$nuC}cYoGosyOxI!vCy2J&Z(G~7u(s%gZee+7M`-6cQYJ|gC7`r z@cfngJh_*X!XTgP`f&W22w}MGQ!UBZDBBEFwd|xwdf$~57QMh{A7Y=>esVE5HZa}s zJQMQD#O1ebt#^XgBezbkBqE6>&+ZCk*J3?fU5f7W=eM;;2P4xQ6RsoXZ&a&#+K0E0 zfdE-eM*?()v@lpGh{pKAWNVfFEcHa!?#U2H9Z&%r)ab83X|P3jKn3m5>1W&EA-Ez! zZJ@R`$&0mj$|6CNa!(3*Q53M-5sAVYS4?Ug$(J-p!|l>X9&A_I141dza?L}?B{nUC zOb~WDvnNKwkSJZE1Vl=lbNp}4LQX3*j+#WP42IYv+;L8 zD*q2euNYd-g8q57`|Uc}&u^GKI_ZAE?pNQg z%-1G8({F7Uh{DzO_`{LSutqZ&SyYAZZEpyaRABmO%SA|7Utxr^MI!N}nNN(`o zqF~cM)PCIE-Jec`S39bWN}8%?(LAGfD+=L-@*xHb0dS1vc3Mv%>iqn)3k7%1d!Jp_ zTtu)uTQ^yyQ{06u`U9`Lno}oADmh2GW$!~9cU^@=F@w=%B5Tj|D?YhK1M!NO;wWI+J z2%*_91Iku$r(7_Vovch8!x~Zw%uQb6&VrQ=*s zv22NniTzz4&d08|fp~NGaR^yAZU83pVDjSjHJp4s?cDs+bf_O!#yq-p@c0@t-4*yD zGpkGA3Krh45F)VXLM=O9A%@2W3%7CuXA+b&_)e6Fm~p3sFf;_S+8#(gJwZ+dU}%z` zm1(Hm%ZbWjN@cJoTwh-=?&(MOA};mgGWG_73~B$MC|KJo!Fl^Op=E#W9&`Hs8lcn^ z*O-8g^~yFc6{foTa7pEv*Ge(gA`Q@)Ivs8RqA-> z5DtS;;&K5?f3qLhGAboSK$sj(L>8;!6GYBSc&|C9)!VZLm+V*3F|1q4(6CT_m3y5;_)r9GXlzF3>>|qsi#5JDWrOJ-D+8A5hc8;5 zbNQ?IN8=UJiP(q`Kc_l=mPIMOOvS$-9(-s`hgSM zC2Lc%j!g}luMqWvqKcwl{B!~HQRpPr8vO4z%%#~#GW(N0&UmyFIu5aWTp%^jD;Vhv z3#ZgB+mLALEE}HfP5qneer{Ml$f{4JgWSNn6S4IiV*$?@Vz#@PkmqIJ?OSbo&CL;q zk-sN8%0wsox;{mCE6_F#-X0lo32tKf!j^JOFxGl0rH{V&9{FwQg8%BJeO^Qqgn{d} zm8_Zqi_DPADt~mXEs`-D&)S9BhiSwzy1BmJPg*kxiP;_-VcnODbn}IrJhdx;x{CRw z@4t5G>njc}j#8w2dA%|Qs?}{7nWkIaB+BDH${T8w(9d0geH^?@M; z3ZHbk$*l(`j=EvF{?nB&-m(db&jM@?A(F>h^jqbLIIxP;rc24QAEr70MC5Yd$KNB| z*bN}rvpPexGK7poWDG#WrH?O=O!-BW#N-3axN&%k*ikt-CgW8<+c9DL_>8@OYTMQJ@h`hXU~QZ7Lw*J@O3V+VvLmioo-!M||N& z?VQ?A@47-{zLLZZ8Hnwb0;z^a!Uy;$HCilDSYjvHjKa3U%ZV}Simiob8y0R7b4rs?(etv2x`o*oc7&lZD14xSGSyfN1%omq8;>-aF8k>Rn~l^ zojc#E>yKw9-^SJ=m8pY=KuO>RLCKvZGq8rSk3oA=ctx;a&_A$6L;y{|SCIX&3MT7} z;fnmCMbo@`YvI?lX_nw(22w__571N4mwd3 zbZ!FJe46sju088(um;f|CDk8&VWuWC^zhhVV3VaPX{Z--Fb`eJiwM+(&f&HY zpE|ebP&Ad%!FLlTA7l16Z8Vh_PB_MuxOF*i`F6;cSb)jdNapFv(oDJo09u`Mn+bl!2RtKR>&5Qn0yC8O)Y{*GT#D$P|s}Qmh*6x6X$2gUH1wnR3Y%=ZBkJW+R}r(GUsAK zELTlAM*PcvJ@R;vCG-0H;1urtGuu%&_nf{H4kz$PT!RA~n80P=afG9C zYAvdl5Vu_;h+fTairv7Z_43;iX|6!8|anPJTiu)zG*A8=x8b0dv zT<(hl_r;6dVWpS5kEZ9ALd+G7dY$YK;GkD`^UdMP+zE;GiBM9yOpgdcpDA5$BkNkd z;q8~1m2*RSy`8|Z?QuIi$N<5zaHIEI!h;hk8%d-fLb)F+8hNL(C8H@UVayC-zMEyT zXx~)Zx^VahLF}W0qA>eil>M}WQ$TAD`i$PGZRBZd5tiF%Y0hz$=M0q_C>t>{S+eFm zYo*mgk>cky@dx==geAtA0(h?5awsuckQZ6EClP&CHHlg8!m!W!e&1>9P6{+bVp2C ze$AdewFSv1dh5Pyw%pzr+})C_8rD}R(An5sekC6|XArV+C*t{TSk`N`)8MzULmH8r zFrsAhlI&d2B@-qQA=bH>{>UFlFb}P6(_ga^WOLO0xYlIJ07*iHfl+0`P(aw~XkbkV zZ3G56Trj&+Tn~kM;G4?6vp+jSE70$r0FS7~EWeR^VB*nS5 zgEe{EKHBZE`KHa`41wMh!&^R;p%+#5q|2q{4$2te=f6zFz@@fr7@wdxc)U58$*6m( zJ%rEDaJs*wdTkfB>odc_99pKFMB9OKTPlrSeacE~G@Et>XT`q+jc2L5uGUS>SXEQ|8>C4X1s= zq}Y;BO~cl4Xg`0)dN9}<3AXVw;E`Ml1F1zfAbZ>!X3@59>gD8<{M>ub+Rrc~nZ}}- zEFMjfERSiB*$4B*&U~ooDT=aNnk$2~I+y%Qv z^iE13YXwksdVtM0o#sX70$_3FS7TT)u^>oMED%pKhRd z*zH#utqSK#l{jjGB>aaeTON-V_bovOynkW9Kz(av7*!9pbh-^ zHKx*Ifk8TY5q4&Jglt4cUa8527WKe9nyOo&Z;m;yFG6J~FOa|}{lV!DyMmOqNC8VP zSrroyF#=n~PL$UTTT{%Ur#Gx81B(OPicb>cnlKRS*%RPZRH9Mjgz|1|G@>6pk8qRv$hrgR`S#2bdDpw!~f$ew(Ew)!-Wh_PqQpMQBH_z`!YtQG} zd}tI9pA^+}4P!;>_ds;fp5wBMs;+vS?llx-BR0P6)Dm-nOSK!>^Feqdlyf*5Sf}UK z<;LpX;34o{et~_l)WB=wVaLtMh}ZMgl)UOO&zTtj^U81 zhl4RhC_4x#I~`2K(C2P4gNQOSOf8o!euR^OP^@u8tclAl*5h38qO`t8WnDJ*RLA;u1J0>b7mBv?FSu z;G2f3Vl4iLjWjuhbXn(PVikmS2L-m8(nLg>_3K5~rc};0FINLvb-fl8bk)h)tj7bY z$Ae8*aI7x3rb6}Az+zw{aBOu0zR=u@f;I;Xthgjh>zRY4Lfk%d$0|9ysG?zn{oI=f zKA8986F{0q*h)zG)e|@2(utym_iCyl)QSOOJD1b5|L~!@RD!&ZaB`^h2a$i!fBhh2>}<3M=hNg|mtfWHc-(|>lHFD_MclNgDX2e{Qs%Ce08K88 z!oU%3;G_y&t|3O7mZAyZ4c#bqRCwl=5kNQLS65cpOeLFB!xVdFW$mJ}pZ^|kAG9#u zR-vwAw3M#0`mm5A51oP?01J+L9g#dX*=s&j9SK;|`{@JWxlAwN(9lpZYCQTZ)K6Am z1R1E>N)4VA*XLufMl5m>SvJWenAjpqKz;!p--DSL!1}ej9AX$bnh2Du{2{beZ&S6; zQzGNo*qVWKrXF#TC0M@EHaT3n=2vF^W5HVe`Q)sYvXShK^0- zmAm@JG>`DuPsH!u*!u&KI(!`z^LGqg*^r^|=SCO#pq&!O6|oGmk6y4Zva zhnNpO#H6#+1`)fqlI4UQ>TxImoM5{zt3p$=OuWc;C8o4EgE|8mV4Y8p`DxX(<(Ww` zGMWA-_<7&+9o#hrI`k}mVF@d1wOIBBRiHPUh;_;lvUc-i3z5jEkJ_JnoC0^L*AL!M z@!*l?e+H8;2o?d8t$V3FkiV_zMou7Dc^7KBB8ciS)hd5PC zO_nb^j*HE3W(98|@3oZiP|mZLvY|U{+A-lCQU{=l02!xR=d*r5NHOxauo4bq=b@7pbCv6Ae`ktp$-YOtYM9 zUTsD9wze{>GP{SPUkvR{E9+AYIePQSk?I4iwW{JqfKiu3tIYA{Fi%xTzvJg(iiaPi znYo7XBaf=rw~Z*onS}XA|B&~55d6Ih1tB1e)Qd%A72E`%AD19(RpCM!HQ#CAvFN?O zQc{|1-NKSnF|{kM^LSh)-F9=}FQ_go^EjR@3KS2_kbmQ>t4EwWeS!BJ8y^&cnBciV zX}?-tp>CKhtI@mLD;zl**zl?|)MH3oCfxYll*?!}yv?3vq2|b#yKB){y4vb^U-L9M z{=j{1C3B&1;IUG{>`MISCbA3(cC0(YJ?@wIFUjZw11yV_?O7we?UXDWa&P>>7Z)dg z=xqB{DvK!ryjMZYniUXSyD}7)fTNc^-BB`^#Phgm*Yf)sR`r#2jLRFhbANx&)GPhs zJI;@(jHT+9>*W!sti-B@!NyRrW<0K!!x{98xvw=h@y+$j4Y~NXJc_NrrcE*RM6~C{ z5SgS9`}{vw$_z|Ug=qWjxJre8IaZv)T{C#e17A=)?zb@PyGg=??k|Qc(^$;&)he6Q zsFS_exSnzc$a!css#hc?+WD0TpxJwCm+t;qcdN3!nWzJ zSF~O;sWt7|fCvrtMF`k|>wJ-`}c+1yG@LOg?b;U?Jd;nhvXYkC&3-}*&)lymVKFaLd7pX=B| z!eQy6=}l9$`UP9X>a9$xRjg`kc$B&HSi9b4&G6}r#_M7+vSr6TyW;)fq!9O<{Rl@A z&4ATw-QYGu?YvL`avSGayZaHRPO)P@yI-NtJ?)NF%gbvk%T{B}y6+5NFyyuIB`f)j%`vGVe zzb;3lKTI6`l1QAq@VW_aI!SI@Kd4!^d(XIi4eFH8qW7tK2}6%n&^z|VO}`2YKmOpZ zm`ArcTCPZmY)4M@Td|B>jA1v*8!JP}gsDnLy=*2i8on5Je+{Mched_^UO;NSv{3ex zXxXykip677RyKeiE!ydJ`f%G0*(tDvtP^=Ru8fX`#;%_C;RcoTa=os!pE+BYnwfZu zl#h*^v77UswDWR}35>wx$M?KL&~Uu#yWQt8YrU#d=qMVbAjRaJ{5Y_3RlzTeN0xIO z$xOWCQ>k)hdEQUz)mhv)y6#)aO#K$yIV>J{57z%Nc&B+a_Z4Py2|x37APcjV?siee zi!zklDS2dk?Dvj4&$8D_l1*^x^D63GvhXkSev>JU536ST{Xr#$ zC4SU~h)oy2Pm?Nvyqb=wj?ADf>-CkUG&>H*xh`D{InQH{$1C@It(9%s^J$B| zWj7QSx3gM%qjNsc)pK>6csy9H=P*#MGKLowU5}oM)rfj5l_A6NVv(|$ zu>fJQ`%7o>3|Z|jox~41NS$XNkDwx7vDlUKj+m$0GbyKaH%bx` zQjQ)RIJqpk37{id|(Q?Gy2KOa6fpPz4(#ebP%39Kgck>n-Nn&Bc zHbUEJk10vcyp!AhEJ6ty+96hqPFd8LcI~DsV>WAM{lV`-R$7`Gmm_u)d4FFy;;~^P zs40qyzxNgQ%+pLSvclxgna1jdEbF^_%GIdK@UK;bkgV|{EJGyE=t!frlxRk)ri7s2 z+}_YvQy>U@zc71V^~xN=D`KlR{8n|{FFwGbW|p;h`S98HmVc_Ck~P4Q5p&Q-{h}c7 zOWkEGf0nF)MZ;-{>UNF8Q?yjc^F*}K?%DEsCmBtaWpS*d)5F7K1Uv}N-u#%S3g5u! zfZdY_SYGW3u18Vms`fEsUNf$+nH-7p?Yvji&y%e*I}^@d-!xX)ctj2I4eHFE@lrW0 z2=j4eFk%OL7kLZ0ISE&Dtob_Hl|yt{io`$oD_{MiKH5-DVT7{f&|lQPi3>!)m;6FT zAK>2f-t9&nv*t<7_F($d7lr@fZWX~fT4vYc={!gA1K5aOJ~}_P(ldlp$SNnJ7hw>m zYDM88Y?Bi+3ZfAT2?@nA7C6-rH9%G@K=q@ai)LzDM$XM%%s26*seWFQ`D5YoiHzjU z^{dOI9?Yfo>BeneSM~f?%QJ+VL&mjsg|MA_TClyGqT-Usb6~!;SU1<#C<@>o(HF#E ztEkzoO?%_m#9w|O*X~Of_CW3&?Hy?CB_n#}Y`knG%_fQ5<~(^5_9U}7$!n-Mog?`f zKX&(Q=-KL*_l_Q}k*WSb$a1eL>)tGTd*i~%gSeg;9kg{w7Opgt#8ux4l79RxrkBF1 zBD~h}43kJC5|!<=?w<8imoQ%s9}S0`IDi7@a%_SUSXMdlnM#vajpZzRLDMrMfsBPM zmdRg1)*8v+#{h4)^p~TQ-3e-PpwS-=)PuJ-5gP^9_p_+O?u)m0?x$l5g6{Dj9g(3- zHlUWwjw1)j)Sz78f+XO&gUMvcX?5ovW3PiO`F_cKu4Pu_P^DxhtGH^7f70NsnTa-A z?lyn+1BJgLp5~SKJO7-P$DqJ!EVc^mpzb&oQGT4LHORhsxSIzISK)xDeTHmdVA4oL|Bs?}(@ERFbn`s{FDU5UwPpWWl2OG_!l z?fGu^yiZEQQh;!`#S*Y){5IY@g)TvpV9Wb>^(#xuu?fzHc4&N9=OK5D-VVvP=;`+p zEdi74eCtx9?%ZTOpR;IL4^$YG!Ferjdr^Gjcuu zG}dGZ6tBi{&lw2PyD?&2fQw}G58P!51<3n4#Q`ZyEoFkM4M*}}-e$yLTUKQh-h%bkla`xJR zapIZx7<__R?)x?{a4@@5zh|~h?RpX#zgvqUp<^Ui^UenmBlg~~x|3@fB2o;}#4nOU z{e%`US{N7*NxU-p;M?A|YQ6frJzitS4;+V3%#eze!2!fFTD23K7Fkhld~e=>LKU3` z#Yhm=t;wy{4S83(7{DU!-JX&D>{D7?%Y(Ku3q`+)8TO_gD|V-Gt=~5ijA?$Ozj&ix z0yLsNRvpq#pOxIG_vB37ZLovI#xz8(?kk?njvrb}KDfG;oHxJX%5Hx{3k?Vk&5qvb z7{qfx*|!=kXtvxfUs%7k>+=+OXy^8aN2@p>v3|BB-)MeE2m!yja?6@?Lr^8sqUm5p zf;E^5U#2tio^m;$iM=t546|LCAX)9U=JvrZqiMBhf1GeSY;?CE=pPf{dF@b_uwE)b zv|FkU@gn^BYj+*Z)&EO$bQSOL*g*pm%?^S?G~rxldC%gx#zGiVzKy?9k zowS>)`!duQaamSHqF%Q7LK5UMde4%e$Duz7OQ?Qws#u%rMt$L=K=fVvwUsxNFh|97LHUS}y2-B2YPtXsVxiTdFKDKwP!2I#g8h=J3@O}hB z!~*!{U%_8gHN>{7ee> zKclaF3<*K@pfcTnVy?7e)2aI(c-v33I|`v}yemAGhTWig*MjGqb53vK&){4JO@Z|nnOeT=Lbt_7aTqGo&ujZq=Wtsao5$w-+L0$yNvb$$EU>HJjBv ziTy-5;^aB5+aB%4C1V%Q;}%V-gDAkR{daol2?@*kc5yHy{1@PW^TiqBQ4D?)_xf6+ zdla+#2{-e~Q$6+(K_*3i!dlHOb<6#1$AoDL~L~2(kV{$k7Dj)Jz(=-yX1U*4A^rZBc;l+~ek-Vc$3h)WC`zYdrCLtXt7Jreq%g-PVur{uZ)=FayRMT@7{_2(D( zR3;|~uG{u3c^9@)rY5jL877*dGW4i`7za>cTlr8)7Y>j4A3k{BQL{K*ruR&KoA*8Y z7rU>0L9iJXazQ-h5DW+qsyV4Rb6YjonqrQBNJBR>&DUr&B)U6VNplqvMk?5O-6Gm3 zt#2>pp*=xBV@Bk80)Mg{6S0!mPflCTdpER=*MBIC2vcsW=u3eP$B zHlky|^^ZF<(jJD|Ml$zgy-G$=mv+xq%AA|xV-lr0*33i>F8aU2Mt(3Q3uDdhP0Bhi z|B1uM?jhQgYaIFn>K&T4M1Q%4BS7{(h0nD=xc%D5^AqF!331@UDAP5vL!+I~)9ZCl zyyY&n^{52aD*NF5rAC11YI&q`hLYwj%=2lJ=BQ)EYjY8!*24a5S*Req{l33+QKUIE z5~qTL_UZxSO)QD3BaxcRisJS0VSI^jzLj++ht43rNaz3#e$@ zgjl)=n@E&^(f)*vXx+T?uQ_LZ51ee%bYnsQiut2eQwY1~RvgNb1f`4bHH{n%S3e$(sPXi3{cbD> zm9bqXvJ(rfA7;g(^%2CNLVB|)!=tBUp=i9N2b_XGUL_7kxbA%PEKYwXnaa0Rjv$p z&~1M9v0idUBw2w37tD1i>jr)3Ikp(xi;qIQ(j*uY1 z!%%2ktPG!KP5>X%l09cg)EJ+`XtmtJN90P1cgarywNx7fc?~kf?NaWTn^{Wj63ydC=;i-qaIsh*?Fw;oCM*95%BJpo@x(WZms7uU;}XDPX3cfVPX ztDEW0H}NHvrEPj9Ygw-f8FCWZd0_0H@E3z+yxt$kGr#}K>&C=TeE$ayhFIrzpm~hC zlBVf;uF!HdZ?@N>I!3Kk$SXTgtgQRbe*sV>3yEw;*}SnKq~oM~kUjp~g1f#5W%uPl z0>!>MS#swlm>hS*rqF`$=?sGH&dilkN@elHa2&54I?H1j80^Yc7SV=oM|zmrLa^;hDrbF%(6w5&Z5#s#i*T0yJ{8}V}$P>zAEjg{n z5gY+3pl34sJ11QR#RroQ++?7jU9!Y~deBAy8U{^EG0fY(8hd!J=Y+C31_BIhw_lso z;H7EwDhTCF%wTDj$Wa?k=IaqLDO2H^!^-WB%b)s z?C4BJn`PrK6yj3sI(u=>{Ime*IV)Lw_R$JSR!dE3Zi76dn8rqo2uv11(fB;QdX11{ zj>L+;;csIiK#3lA3vRJxHo5bA1Qr)R`;4rlzM;MZ8OQk~GJ((w_)A}(-s`f|bPgV~ zE_r~6{}fXh6rVYQ-l6)2^$8QB=eBZf=v((NlKm>O+D^~|_Xj}k_N8;i7iXo~yI6U{ z`2syOG&0X}tp%CAU8FhA^z^61L}4)lslLVN4fe)Or~%M>y#d%UnV;( z%V*^mZ?Li+7FR&K#K=9TqcbzF!*n`H1#RJW)8bm{VoEsfoS-a=35%c3y%`l$=UE_P=l-IDJaZL|WW zWXS~Yw7T<=E&-1B`-_mBF&8RnKbD(jg~2zPHv16mfd9kOR|Z76b!`(vcgfI0cMKsN zLxXe)64Kq>-7&O;G}4G5HApuI5+dCt-O}MV=RD{Ae&4m%zSp(Z-Yc%{pR|1hU|4{+ zCT54Whrd3*-kq4MGf{uz0@JD!H;T9-{Xv2~E&+P0Aunp6*NgZb+%7FqqauYZ{(O99 zOPQ`CM9O*`9d$&NEhX2Oo+)Y@;I!Nn@ntlQX<0sG{u}90OzZUhA@09RT~BWS`DajX zq5uz3$N(;Au6K3_w!F~Vytlh@EXKsIKfSqy0#yrC(j@!wj{n^V`Y(E>*J(vhiWVgd zS)z9uZaqaep=Yk@P~o3w%J>s_Y{Y*H;9Y<0tmmQ(V*2taDK8_v0L_97FfAgol50E( z)95fS3!O+JU4X*K!^RZormThT^BCq!gnQkkS^0!+ zqos~ucJb>h=7DAuOkLR7)4t6Itc>K=GEex%y%S*zuqS@vD}qC2ovN`AdEhSj_wJ3t zO_l3c|n=iTpvad#HEIN&hLg1C~MP({o zPj`>W@gL`-vN(#5oK4sO%eH#Cjy7_bv32mARSHnRRePz$Dh5WK6S(|DF^Ncevi6!g zhFas_$ftL-R4E2w3dptMAo%FniTl{DH}tr%a3u ze!(y9m$eAbXQL{j4zt?C((o2_3a! zdaaS7P{g+&SnUGN0YpNI06AibfoJ6X&8YQP3s8-IV%Srh_1A$_389Lx0^n{rq?j`@}AwE@*QMeI|`Tgy(p(c)YSo#0j zU2TZ~V(4$DYTZ@LbbE;?V-O+Jdz`tP_RwyzXF)frwm;vo7+qk|e=M8(I`LKxgkI_7 zpE^$aU0DsR8Rz1yJ!eCyl!`(+E;>>OBt!1pd`793zop1A>FT!UnaXIH$HTs4Z`48u zsJV*z#T`yPMFM$Dj2vIim%9~Bb^g3nFKjU~Od%;RG=BWyuh;gWQFQVzWm^E>fyOv8 z-Vo-Z({R-F2i+%utUiC6 zx%whTzc=7`Ze@jI-j!I$|3Tv3GzXhFES78(v)E^$jG2w;XK{Tf8;UX!KI#xY^X})6 zzgcTf8@dvtVbBG}1>9D4o9pDo$(NJEj)hhWvU^LNVY%M3#6K$DnKyfgRSzG#gYF;N z;h7o?HaZK}zbN3H3Fo#e)Nd~z9E1=~aKqX0R*H)(3CnP56j~gYhPYH(HBFqmU~F(S zW(B|8C9hg79y@&xM#%i*#y8d5vJcVpnV6P_8#=!Z-WbU3MgWKUXu+|EmOj zO>qee7fULT&NWiaS`KAJ?CGg(W^zXcon0sqa!oMXo(20V6_uK0EY-Uic8r=%?Cx5`kH>9=uJ`rJS8D%Kw&?XMsNxV|bSP1KsGeEkfF9nWT)lS<+`^&5TFS5FE zEQ4?u+Sex?C&%k|C`-1gfabk^`poZk>05PPGI(Xz|4nr(H*7+9%cF>I)o8ihfyRuV zCg0k#&&O%~MDqh86E+qffW9@ukjJzLIgAB6uNg-c=x|NIpf>2SKX!RPw)p+p*| z*VD{rAzW-_9Ss zmNw&Ge+}|kt7oojm#ey4MtO;nIgDE)&!Uf%!IKdY7Ag9ViByvE#NZyRFb#qV`*IQmZgxH@gOp}4*l8W69uC`L6!YKWp+!FL6YSNR_GPu)jmDV5bhmsQTCGJo zfO8Kx^E)nQ!0-uk@~r`SFm_k(k7l^)(W2vPsA`aM~_s3lNHd$45`f-_#I~-x--j#7LvH;Td1XO zzw*kmkz$sUt_k`;i!e(sGUMmxSCTDz4G)A5ISVN9eobBvvUr@@eQT_Ocb>>fvb#$e zQuEQ`6V(}u=erYB0fZGHqa4yNf(I@gCnEmG72RdrIj+Kkw?Oj*AY<6hruOzw!~#g@ z6}DB^QJ3LC6?4JnO#~ zy6f)A)}i(|GP2|*sHDD_a?kR0`^1XtE>%;g#rurROeK6>1?yQXQlr3v0X(pq1pe{W zCF4Bd3Zy8wo(MZOvjHBG7@Q>ubNbTpTT8(^_QwT0_MwzVI;?CWB_3FPf#Ce*>EwOW zar&3Y5lHB~$*eQSOb)hhm~oVbHBjVlh}kW1p0))D`!ryKD@XVDg+gJ*?4EIb>?v&T zl|k3`n&JLGHA9@8JJy<$py$l_cUF$$etwVJAs9pDDr7SSXl^HH^Vou0Lbd(U^HgggY37%1S2P_B~ISz%i3Pa^MY`?EorjSqGxJ{LG zq&k~MhrI+}5OrW=<&Z4gHOPX^iX|4lV)8)`b!;YHUm1$&Q2ED(ECIs)iS6?*ZQ#6H zlq~f6I5fb7NTAg=h8gO`_JdAg9GZPNUwhSd&~EM3evi7ifkNhjj7K{@6b|ja`tuDW zRn4Y8ddyv*hZ%{A9T~prik(7io827ewn!jZMoZ=)V+H9Ta5*E#z6hWqQumnri0P*G zS!B?y{vE%4aZ&2C?;NE79A2h_r0hT7TF$~?p>u}rX2@b z&KTkU)g1?%m}?Gm@hEySpEdB&`z1FNDOzBqF%2<@0m}Sn__aeM%@)DYV)$m)WwNo@ z3NSsfnXNl?{)7ZR9<4RZUc}-nF(db@+&%B=IkuTV<#2oXk!U}$EPkK#1d)$fzWj1s zGTaYaa+3W7eZq3U2Z_CyhQo}us50_%6mD01NC$_8F1`6OSv0?=dXn>%IVa+&f1k_d z??Jz)*&v)wL(P;n#UG|}D1l&vRat~w#k>~)qd5oyTw>_xdFpM_uMolRgZJ~(f9HaR zKH;@ezM&;2H5eki@+HdM%TOTZbdF-42oIYoFB6-{4Q~3Q6`vIJo0dq zKh_yT#$inDc{75)1x0dQwZkbIE28257l%&cOGWe@`$7eH_=4YM&-1ZmSX<>Uy4}~U z4sOGiL@1T$_feqXixa*)A8%6OH88IcUR8#5>R%FhN340R{P=cm;l*_C)$8%Q?1Eg@ zNlHtczAEPSKnwYyXlzUe>`ENUSL~4Ii$vZ=$)#JlW%BE^upYh2h-ZDSEV6eh^&7+0 zH3+cA#?7FdA4C#TqftIwTQ_aI*wpZ%+9dSfh?C|^gM6k)h2V5~nDQFe{Or65WPGre zs148@^pR{m8MY?fFO%)~g|>J3_zs5>y_f>dS(NFDh3;dzrT)6!uwpH7ikMKeiA1w< zmEFe&BzenC!lHa0_K2g1FB7@Y=-CXfAXVX(0n@qUqGBQu_Ua-daO`;GoXV6hgIMfcwD*$>5Y;XI;JR5#j!v1Ew4)*ITXq3>FtCOb#mR}#Y zjG$9Ht&Q!Bf}vi&IJV`Ht<&wRY4xUmH;ck%3TdhESbDu3t1;~T=r|KJl7BDQb**U( z<(3DlI&-Fms5%#L_Ffb6c|giyG{pxDmSEAy(7v*-h%!Z*L{p++v;LrOMr2$1w6C;1 zI5rjI6|CGPhLpUU2hfFeaGA9l<>dDBP`hVx_U*9xMeEB(2{PJ+chGMN`9ky>;a#f8 zUa}q|1UqJeo;xQyu|X8*alcdON3a_4+w30~l4qveC#Ad@y&+Ij$&79R_>D>Kf*+a? zJ|xj9xKhGs1#W~Ez6jt%ypOr1@mTDNsumWe{k*u>4BnkIZ*?0u?Drt15mSHtd6hAp zoIeAvpw#xwmPl`~ALaYWOfzvsTJ@zrbvG^(A}K4&uTP6t4e>5_(Dm{_mE#w62y^=@ zVSg02ZetoD#a#|Zh&k5;%Tna3x!@1HKi#tjy;rS0Cbm`nde58m3P&u%bxUbjVS%qxod5B%o1z#Y(+^7e2o=uMir>?L05K-T4m4bsmudbOwHPTNS}~QN-={Hu z_3WXp4Y7x6>(1Nn#`v#9p&37wnG{OGI}J8v{+ur5PCNL(%JvFA`ONL4hTPT>Q}4*p zIFD4U*t;_dUol)`{Qd-_a!BTjlP{O59famW zjR^NBC^UT}wI{C8;txL0iakPZlnzgiE=q@w*Q&ZyYw2{zOCMsg8GvJ@3iN&=u7Nyk zdPX{jJ%G~Zg^Ez)gX5%1I_jWsUfd+U0lq%;SGD0bgUXTxtkqx`AU9h{LpU@;YLCWl z!`eo0G@-SZM^4!KsIT(X%Co#GkcrQ4^KJpJ)D-wR71hzJ9oNsilZE9@$XlkAFrH|p zXy7%#Q{IN^qR7-%B`fRQuKNUySEcDs#9;(K`k@#p1KycND?Lt!vTIT=h%o*(27RtK z^6wrjtFIIpRM|{H`;}o@drEvm=;c6yfy#yrmu1A=!B}SOx|mLjQowtdkchdV8(CPp zuq1CyE~j(m*jJr1ZI3!N5oo-ZD~{a88^F@UrorG8gja81AshHsAFZUkDR(2x0pT#l zh2K0$l;!8d~Q*W8CEA74UMyX93A#6SM;Dv zp%#68YDLQShAJE)WeSk9eXpmjRv_?UJ*WTP7@yTj;Bk{8o|L85wLm3Ns`mE8+Uqz~ zJwR|{yRMUNFVTWw%gFFdtipi34JvSwnd@}p!(ON4@fiWH!@@0S4jg@i(5gK(MAjdn zT8EnN7VOr!otx?a^WQ+)6HJ(us7zjUH7-$&NPb@PSbeEKO`_BjUi@N{URWwVa4W;| zo>|YZIKjwg;>BE3#HNWcl?H76RUmO6j@|lk4q~Belj%L$|fq>wn=l1%3(^j9jh*75T^@HU37B=)7Uo`xG?POgOpN4Ms!iB> z2K=GVGb$p`5w!fUN;reDhp=b*3hZPg6Ml!*dWcdH;j&O~|53#v zaI|?(S=E)>WfAt~)Mw>3o6&7xf%a!kza=7i3WX0ylZg>19E>iRoIEz-?{k_WKy^&$BC+N&QBXh{7I3xJ%N#c0e0EN;@6W_TYgI`7r!FbEy!x)Lmf!g z#$Ys7sBhMw3jw}9CEFNT3St&Xo5qeV$fb#(V+AOM^pTKBVSb)G1;U}sTYHc6_W}2C zuLr51*~325g3*|z#Hgn?DTT7GxD*wD8w#hab3_6REn~&h2j%| z{AJW0>H(xW$#KH?6P7DtrjGg_ZO`EBWp&UXj|DR-!;MFP1!`;OfOhf2f^AGO&SpQd zlG4iS@OQA1lCKl(RP(P#RQ4Xffah6a@!sx2SkRi%HMopw9u1t38L^hk^H;@Ai@hPvIDeT*qG~ zwEXlU95(}{`ZnaE+;>RdDw${`)-LI)wB}Q=4Je09;L!kMGgnn2$I0!)Wg)+JuFzx^ z`P12Aw7$!kxxeg4vF&{ApS9V9A>8BIAlW#EP>+6vr9*wbzN;VL-5T11B&s8bwC!h? zn4w%EMU(0t7Xj^rLUj<_;9ayPwzjsQqAN@13~4LG_jAqfT|P`>dS-z8!m>$i9XC<# zPvSp|x$ASibjMO5(by2t17wv1gCXIvJj3#(wXrsLm{x=MKl$kYi6?eqI?(9Pr4%&=pgNNg^Ac zq28Nf(PN}zLNysxOz27tl^Mt^WkCPsm8;n*WvtW)STQZRuZk zW=Z`dCixIgjx*`+NquolCGJ+~i2#mIhEYLbYAXEOerU6w{3h`B+?Qvgd<%P`kh}yf zhn&65AQf#@lbV!7-^n|erTjyWC-!U@bs~Dqwgs2lX5KO7U*;X|fq8h&wEbvwY78|h zOlq?s5<|)`dg>8?I7cQL9`9WzPuOTBN3hAZxXW7a0&W&%UOLqDbctQa21Gf<)Y}Gm zv^kkKj5G>opEjW$K)`URt4OM89qW-P44zIDW|zBrC;Wp!vYz+5N{Tz|H=N@Qhie2R z_kd+LD~F0C6^y+Br19?e!%W7eHPVK4=>;`FQ1M*XRPU={R6*Yeojym@dWTEaigDP%L#*pdszOzfZBaO1Tjqv;IhWDYNpxETeG3 zdx?OA9N&w~Xf*&4(NNUyIz}_%h5k1qDOuf?Ox?#Bm5N131_QD~=n@jx7m89PQhrD> z97F>$h;d(Cjnv7PmN8Axc9ndK1dYc4IOG}x9UT`%x~)MalxVQ>@U0?U-EZm5R$iLmpH646ch z@wg|^sZ%S-;7O^pvojL|2KS)tLGjlIWWL&C5BhMN3YeFBuCl}^P(bDMZ!9CyC zc&n!eyhPpQzev?!W??U?4J$Tl3>h{fBS5|gV_ki02#5!d$)Nx}Q$5TS;oHU)4Ikm; z#$jRCz6P0Ut4$0Q$~N|dt2TGa)(5fgenZL=vuZG)8%>*3Q`0e;1TPOWik(dgfw?QfC`Rs`M;B-uEZOpUvfD|PjntvKNa_nL$ zC|pXnL9X5(h{2rENeA4S%U_)k zY$}UZwOd$8qbMFrPjqsF4##Eb1KuInw7x8@myaf!jHo2$0+}F`3|vfypak_1G~&2$ zmL)F*LJSd=KS0f|o8N}Y2%%*O?#(wbx(03fBZZlD7g!FlbiGVL;X9O_B~2#8Y57od zWT!}21O~sYY)BgvN5Yj;K93vUdPqEr+ldLsgGv_gle`ZnUN@V?{J!1A3&8;Pdjn=` z$S_b5PdC;?k%&Ze8{_ea?8IG*h0c-kh~a0!Gsa?Zz6{inq1P9%#0D;|pIonoC?+=* z7?qxW-#*zMzV!qT!I0=tU|+T|AhL}i?^m_f*AR~x(L!zORVZBHgwuIy_H!IuugITp9pEm3v!sk$u?b0 zSyl9iJ%WL?us}V0Diy8@TPQ1%59zivvO55k1cO{Ucy-~dLF8owG%*jn-DH5q-Q#3^ z94kkg{tY9PaK=cYGEJq_DCo%_2CU0;y#(taAAxF=ekb7;VMNqQO%6A*8{GHRk>#)8 zhuBOAYabPbW)-AvNl%C7kWN*hxP@iW8X0-lGZ3O;*ni39iBU#6QjrbWAtE4&)-|`a zG&p^|w#5e>%C-Z3j7BmNIF9~fi%(-IX~J(LmE9AC($(KtZByGT2yHwZyZ$*H9uGjw zhDZZN`?v%(Tzb#~@CAumuN3LYl|Y_9F))m|+-sQlbcn|R4SP8B zCsL9#u(uB>&i8CC-@1^a&td#W36#4eA+Mc4IbRr{_?4- zPadUFCbw{XhH$U|(dqNJEr5Q5Ua_JiR{RXOABfs5y@xa#*Rl2V^7)?wol!x zi?jaJ-~I!Jyd}88k2Af}v{zZC7+H-FJ;AvGQ5mK_EvwMiHMOotm2HvKpeAlq9vYy5 zBr*r=-TD5+z~IIDX|eY^sH8fSyw^E<6Vt8Jv~n_gwEyJe@~*qg35i|$g7qolX4DP# zS|^Gh8E>q49W#r`v_$AfAa=Y#3Wf&7^%f#(smWlO!&+ln%HN_O!twbGT7`OQE{%x+ z2}Nucp&z2aGx3i8A0UF@?WN&Rq*xh)Itg?g2#e^-4F2%&+DnfBTGs1~8T~J|)ETwZ z8Q>!g1^mcp&#EiuJ&O9S$H`CEJLH2!8bP~=N&+93i){mXexM;{5D+OQJ<4PLQ|$zA zv@b%<5oHQ}03U=ERp}3*#V3pD*@9#dMq=&ypBF<&4wKx;*DB<_!t`le%Mho{&4Y@V zgjFO!uh3TvH=xK~n2N7}vDg8i*;2dRt)&P8QkjD6jn6r?ca%+(QFk%EJ008lx9vjvm3Xdjb-+U#uZT%XR%(0uUy`z@O_s_D5>Qbr^FcVK zchO@qG`Key5$)(Ai@w684VVY4@*U%2GyMB0a}vBUsMPXODk)$-BqXE(=Mf?*%fwIF zsZ{)yw1q=hB+)|_PsISc+K-xCJ1+7u^;A|vEEKWS{7h2|QuGw1A8l>>Zh@##7*A%! zuBo`96*R*aI#UR0V!3p7=fee(!StW`OD-aCoJCW<(y_4p;=d3(v=sSk`zNBd7d$1^ zt0D&Mj6_s_PpymQ+_mD`#}Bt&;UWv$$x=7DBk(LKx`n+(q8NC%FNp_t?)$On_Xd92 zxRm5)qXnx?Q1nI?6d{rYi>J@FO4#N)v#iS_>XHJZF}0@@F+Q~VIh!SXQ>-KrB)ZX^ zH{xbHuH$EmjU)r`91Q;bw80f)$ib017MnvB$&)JZP(cqmhc^>yjSyrAZ0e^OeUS_} zHhbqj-KG_|5(8746?ugO5+cwci{6WaFI8--bX%?PiBDAqvH}3>5^+HWMcFR zW?-X>Q;5xy3Ir~IN$kqs=gzSkqRHfR~IR?mW7YyXr?p@4jGoKim&X9c6fgDPkR@Yw{f9up z!#`{nrvKWUiT7+Pe&y>$JL{yC>YEmw3Yh=1#=orEZs(PJG_6=MePZjyzS`=ubf(t+ zpf|siYF(D2IjMF#{-^2ohxebg02c(LNLmEKwSe67#-0m6Mew?#VyWXhvO1 z+SX>&e;8RZh*oCF8`1lUN1T1vqk!>^uT-1LGJb;D&|;9J@h`yw+?Q`GyfhxJnbu3v z(Ps*fVShX$eyQwjU_Lf9`-+Hz<7o-TiouP{IY$`fu{SCYCp$rqn0suY(Y5B&j{-?d zZ-VsKu>$pJT`4R4oja1%wpmVrJsp62JQd0C#GYy$5mmy;52n#*FR$^bC#g`3kQLF! zr$Rk>L>32Vegj0lU%%zcT3J);KSr6yxsGDR6j59hOZSF4eJ|#PKK;J5alZ$lHsx|0 zCOjBPc*uC&O|KOfyemb4-f+3wylm7FDOUf=YtH8p(dbF9Th(&2V79Iz`D8{}(^3q^8sx%-KYU6H8O z=*=_PI}Ri-X60j=YQgiVJ_GQ(gQ^@WI4<`==R@6p!$i9qRD!*Jwujtl*olgFUz6mv zy5g?iiimh;ucHL-;U0^tggpBEO)a0`Ii9A;XQ#{+kb86<9~xQVoP6XB+Pn5H}^;Yxe@ObX+)_B8R; zpGj8uI2@?S4nY2{ojFh9(NgRL>C7>AetkYz6EFjuO>F|O^ia_lDEz( zb&KQ@l<)!#FFr@xaXvL2xYVd6$AuE7%QGJGE$x&7hRFkFT{hy1BidoXPph&tigqH4 z1#dk5B3sC3`)+oEAE@0jdV~0Ce(B9FuQLxAbf37soSr^k?UH%DrAguT@kK%b5Ejh1 zo`%49NgL+^Dk&d3Z;-@ECe)_i0ag40U6`qUeSb3YvBAzg1b|O<@eH zfL&v3F54X6V=iw$i$bTxZpexxc{|(Wh5C3!{f|}2WW?2xiGYw}1=%n1r56j{9cuSa zp>y)q?)8^A;hs~J!fu^PIjgeu!njZA$HMbcU+UB~c6-d&(Mf6piAY{a9c5R>CShwZ z@w=SXYN_eKlYZsC_f3kqmY0G^gr$*hYYql_VxJ2+ERtS13s!xq&X*9?8m2)l^`4QB z`iV5>7}k?>Y{#ThG}^b*eHr)F&N(CKnxeJ{xtkv3L|BS!dopetk4d^KfULClw|+JH z!^r-H!4udgMe%N=uSsswRCtf~Lz@Swjq1@gxbTYqV_(rsgjy+km~~Ve-yT~MuFRf( z71?&!S9I$n(7DF?+i)`W1&;Q9xmhZ9JAFQjneAM1$(Zm>Mx%y(CW+|m5S8wA^hV?fuRE>&lleGl6{X9%#R zV~9oosqWssZgTM5Jysvf ze!E}2?S6LHiErY+XCxB};oPDmJXTs2TAoyOZyhkeoJ$KgSTlXx4h>`W)&?67j4@WV zs~-HStfoJ{NZs<0zx%d!(`d9iZ+3bZaZ9nI`+n=wM;;dt8SGp9HAx-Eamg$uI!BZbF^u#T zhY)~)AX`zaNrUxQW2dh^LAmw05Y?~A-Zcwr!cOg9#rYL?y)b&p@GG`!&KLP!c{~pO zU;RB3)n%WBa3nwh-Qwjs1kX=*{&)RlN74QeicbkgPF>XXUFR%yj#!zWjhe`X_Ky&p z^>Z=VR;?ccbXo8BNRa&Fj2*Uq)GkiX1t%AZQVZph-?1LA5KD4S;ZBp&p??%+$}4a5 zMqAgC%ii}q7ro3%rfBIr_ah`9r@?*kwMFbjvfK5z6pE!#QJ@S=ep(y?G!N9jlN%+CLy0q}!fhbPU2sal zS=|l#GibTrkree2ULc!MzAWyde4{hm#USr#eBOZf$LDXHhoO(yqltIupSC}*4)?m^ znT=fk1{jjE3zr;~b(5hYm&iC7Hlg{Zs)mE`5BL9Usqak7fw&|-@HYOO4G=Z^DfAdM z0QN(g;q}NC*Yc(&1MtLp->-e_y6S8LwmLDA{;qnyB;Ko{UfSu=CU?jib{Pq3DxJIf z^8kx+fiOtne{_=SSF{u8!EV%Ok4^~}L zaXYE&?*mtrnYX*`qGzS#r(L&ql_r|pM^4S+e5BiBB8zW*#hn*|s*{NYW9`mA#2l(Q~NIg?jn`)#2(s5&=;Xy2&o7}p&h9Maj;|L0G|L@iXqO$Kc z!YFZ2b?zD_I$K6#w!6k^x$rV&QzYi~QQW8F4cL}PWk@qzkohq|fkkQJh4Yv41r%?c ztJL_Os6#Ud!e!}KeGE_V2IdJNmFJ(`*_VoIY5;nwuL8(VEq%YoNC2DkjFi-`-7;-h zqU|aikvEq%mDZ~@1@R9Vz3>45M2HkVJ^+;uX_1c^`}bJ70}%jK3`sg=!I_|m)70Iy z{Iuk`-0FhRn1=>2Z1ac6BBEG3Durw9eBJzo#Gr$jg*>o^7iK6!0YKB~rPUv!Vu-SS zs8=C(95jQU0b}g6VAS^kmz~r$Kse`=bB|S$+oyMZ5nR#B`Wad zVJgv}NY|#H=FvIy-y@1BYaftKEL2*mcqC{j!(=STYX+o>nqwaz9u(x6_}NB1l1Tg& z(~{9eAy_!Jwnl=DGb$vg-3-T%i0K*n;XtIn>e;T5e2%ril0JQ8$`_rf3a94J1<2j{ z`xK=d85j_QY~vVI0hL!t^%}TXI?%4>N$INpP^WAc_iChOcQebpw59GdX zZg#F9`I?Q0g%p4;!G;1ain2fnN1aCqVO#ph{~|)Q^Uuv^h1s2$I~u5bPXIRki;!LIr`SMB3>Kk0RRevg5IwJOy;sZBPUk*}HvVE#&C3GWP7ZLdwj$ zexCEz=rB-ybn&_)4)Ufc4l`Xw51uQ-#!mcEg}pT@JOGmW78PdsHTEsg@N%RW1VaBqgH(6D`FIwH{M9lAM58mq}e^y49xlwsxFnH(?AEtrNeLYSb0i0f|5YDQYe};nmX-m(|8^h zPKLt&pig+xcTjWq&}frrA>qKYxz_KL8SRY?bhUc>J>O;A=uc}pWm1+S%Kvao zO^F0F@*?_}hKOoOmyC;)%@IaJhWz+>n3^DK*pBjN97#g&Xp? zB7zdtP*=or1;XCfsd}@JAUBu^T%Z9=%8qCgZqq9&J>#9rt-Gb-dn7M;+c{fEm*zIM z78+a9g%a5FxJQ_LG+0$WcMf;{z=|D?-|$cnj|Ks3n54f5Q?hbyUp)y`p#)8Xz zXs%1a;wUP%^$+7)x*i!aOrAW(oIiHQ$d~Hau-`MD8psnDwb@t{aZT{eQ-!M43RcaFu4WPZ8+g{868D>V=<`@at$AYum- z)0+!tVfx6LZdkn%2lB;?cEPWS`2x$ zJm^@K%&YnhsM4ScG!5cs zxLfl7MKqx^rKZfexi;nC5X(NSrtmj_S;B2`*rOc68O@qZY%up(tIFtqBAJ3ffH*OX z|K>WpM?CTP=WtTd@q{+nlK$(V)d9qRhdDPqR}RkS-4aPUFa?DKQBUGdlSI` zUeg#37~5ov+AS0gV^qfdPblAB5=6*9Cgy*pDjF4O6-_1ghR6K)q8ySjgDntavD>&G zsmRvm^;R*h_+nv17Z)EO1>NZEf2`00@po2?rwQ5Ht-UQ4QR_aF*P=QcVfhCP|0=`} zCH6UI9}&zbdm$u$S(`6c6_gi=w|VF`uL! z#*0*caqtug+fpKCHn$D++E&fe62;9^)KsWH#`qV94EVmb03}byofHIpF0KEQ+Se96 zdlA==F>fzLc#7I|y#bBU4C9gC0wcgUgU-Yejp~Hzm;Snn)gZ~QwYj0F`{fbh2wBaF zrm~Z``UBQAy`V+kI0V!-NN*T%7O_lR|5i@NWi9vAtXDGIsSfK^(oGBQW6+;V&$Mx5 zByj@V8()fu;^ZVJ()D3eOdPBd*2ZBi)0EFg6LwSwv0H?tRpnerH?OOiCVZB?cPLqy zgs4w*;IfDJ^vG^NSPaDY!!1pvxta<8Z&pzSk%08VmH0;NQ2Zrv)CRaw>ga*JNoROK zh!7aJRTv~=Bxi_8rS{8L#0#)~0~4U)6~Q=U++s)S=_)NvC%6Atd8vj|maJAbQt6sC z$p1@F)9r-{69-4@H$|AEd>Pt07oTDg1t4#o!-I~!KyCQ77V?1?tU=)EZ>4Lnq*tE* zU&pAUT1p4324_!L@MMxNmAxwG@V`2M?FEPgksYds8g>7x5#c>k@={=$34GJ@Ptn>f z)1;`@sEcME3z%PJb{lav{=lZ}e(efr_&HgHS;2QEdFt#6L9qxtxYjsn8PPm`? z@(7jH-h3L^(XVLKS@~StUW-Wl5eT6*qg8Wr-(W|A+N|X^F7tg^M>CYBa&f$Xf{>bG zG|Qp$JF#jNKli^n8fG<5+0~MyTl~*wAu_{9=oT)6`~Oi1i9|q^WBP$}`?lOB3*7Y6 zF(#E98T=WeT!FgK5XGYviH+zubwGwTS5-RFP1^5g;dqil=e+TgvHOd zgzc}h5{mBH=Uo`k3OZB4oY|L0;CjK8y^c5B6(MyTN9nc$zEj>K+EVNed3Zi8=wls_ zqsrgf{b$(^2%`-R#b=P&U>ak@{6}y9!ICxL+cXFWT+G3u*TehlDS&IzNmKhyrMuD|6^(%(;$={rUZ zv0>u#{6vqj`8r!OeIfL7zQh;WAIud@%QTBz^oq7-3w(i{Hg+MVIv`6mwH z{|xs(ql~6QTD8f!-oP?^yAz8$jDQ`%Rl)BMv?fpTllg!xw?p$wpx*`?J@xR?e}!|7 zGR~@^5E1Y2kIaMEgRy()hDtohh=|^PT{d<>Sb=0NpK{vjqlv(<9r4wH$WVr&_kZTe z5&l`a*KD?$);H8-P(lb=UuK0ifP%>gyxO4FNPAja*$4$UX1jNbqdc;ZpoRyK|0< zh+UfZ&0Y;L&@{nQ0cx9sZ{dLb-H3oud~RrD$%0o2?#4vW^{MTHvuZ8TeX&(N_m8yB z$Z0laJqCnFNEEW^*C?YK7Y3UWc*cswbB^I|MrxfN!TeK4ZIlvvNW40FISUhQUmx1q zRC{$v=DS=G){0tanwE4F%cg?a#%ftth(wv}e>i}c+R}$EnvuR^sDo(A@R5|EnzYCq zJJ89dg7W$(qp_n2a6!SqY?rwyqi@)m{8`QM8VStIpBpn0jb1BJEsn{3+?l>a?Q3@8 zE&4|F`L4Cintb_@*Ck~@s*b3Gy592U#_IEPa8gQi(lP2hakf9BJlgv5%I2esiFYe^ zS?6ctX0#w(>o*=)QPJ0R&>pf|nzJu{-CquWzY(^5WB75IMP$xaT@>a#7-jWqWkGto zQK72j;jj&sqpb)h>F0NvV4$`f`1ZN{KHpuw0X>!cWp|auz1r5xii(C53?WpdAGW%a&FHBuul|}jl$h+zcBLtT(14rCJ6t9Gcq=qC0fG^99X*7ZPV+Jy8IGcgXXi ziSs^^P8yfc$3Pd4D9Ff^a_ISNH@EzDXz-;9gYQr{O#$r9kbeNc)kZ?Df>dY}5vtboFJUqlEQ3{&(>Pr1- zd2DXa_PEAvo=II-TiR-ya}nGU_wno9ix~wur^K0A=?bE)XT?_RG^H0r!@`62{u)|F z%I!X6iS1-!Ol;e>?VI=e-uH)l|2nHzuUcKFtGaqu z@8|PuLPJqu(dk@@8yW_(v4v8eg3d%8p@Z>^JgO|WPu2Gd_?mHlU*EKbO~;R__a|ge zZ>n}a6`Sd14=hiH5lr#x_=`74CubarBdnbum8^nfpUYf0ws<1rX^7Z)0~ftg;*ri9 zs;cRr85Oe|7v-xuQODy!;o(j-A(_tl?zp(ahtB7edH(SUkNZPwJ8t3!^{)T{+oX<{ zBAH|2m-|Sawuz`4?xVTv_MCB}=)=D8){hg1G)^aascfF1tk&j|An&JWo2jyoEy(4! zJCd+n+&ZQ7Q4F85eG*L$P~lj-`Jde5Hk259-okbfHMrw1Ee$PQA6xrzo~0 zPJAx^xQJ;*-K88i{X>dq9AD~^eKuBXLl3FAt^+Yo{{!)akz_^% z@hdC!cI(K2o7ON(OUwM|^_LKlNJ8PCNq1u|y>o7xtb2?)KcgXFzvXAXz9H<3!|70@ zBxgaZjb%czS#}s-EZlyN0k&oGrU(siG1GJ-HGX_)mAemfs|o173b{qCHyh!;>n?B7 z0C~8a71b4u&y>5dMoQBW_P?O)cDO`~Zj!$F3tDJkd)c)`(H?WdJ~&7yQ}c23)rt63 z4z9x^Iu_&vy}Bi_aB=u@j78SOlPrX(n?5{2!NFZB><;a_O(o#0Ij~MnxkY=wt2Ofn zEi)cGj}n@&g;<>?e)6^=Eo$=;=+ocL#GL~b)VU6$zAR@lR;yxtJ@VC&$$iafb&Uj7 z=jS7kSzaU)i;DyL!3U6N>DqtL^eCJvwWOxYz$cI91@^iMV=a=MI~=52@lbP7geq66 z^|QW_I9~lVT7I8n6vh%37F`oPib#SlZ)1=}yd8r?sE%%KHR;~F+gdU1!1_t*C^stW ze^ByVh=v`2n9ik-zA=)3M{>5WRuz z#qW^S`8u)jji_aPz{nwj-N)=ot3c1Uz&adGg2uq`f(prYdupfdu)lyejd|h{K*r5cQ`?&Gp&ji|`JExH)097c(GqnM8LX4WmhmJK3wD{f=zeJAne&g1wz0e5 zkUJqRUrreB>CEHH6MiQDPvMUDZ4F9kw4?q80%dGO!$xb8GHIomr#fsJHnxPMD(zAz z*otz}+b7W#)9D0p$M;c4rQvd}8MD8;u;!hw)?5HSNB>e<+PR3UIHPcCZpySzk8DwN zs>q@(vyyVKb@A*P=YbZfvP5?;DJMk0vQHp~)mm4hx>dc;1cNP^$O(lA@YRtdEvv5VJhYZk^UW-lce9DvofX?~i!NmR~#$~(0ENx9f8Q7_>j`zl_RsxYbS;-zk+NOE0rjY?c2pncP zp3e12q|NU#3}FR}Fau6a<@pfqLSHVlt;eO*Yus@sR$WRT>U?{E_^=g?%)GK*pVr7F z9UY(s*hfzOx7T=yOn~{-pXSKNad?^O;0y1+_nDCxsAe%rMKT#iwG}@bz$Yhh`Y)cY zm3}7fi`wbckSfY56Lwxy!)mqY*O(iy)UvqlzbCx`L^bB8r@tTJ9tGa~esjBroOj;3 zFRX2gLn7jom|Jx&VEJ9^_=NTspuz6IZ4Ei0u}latU>cohMCwz*QBjDgSitP)1Og&Svs?X*c}7 zc;5m~OW^Y}aoIlXze|rW1O6$YsMotuZ?LJaF)D3O=X0SnGUT#2P__B=vJ85Xk^{;8 zxjutHMt+a3h8mYT-^~ev3S|!twb(qUEjx;GZ z8O!Y6sBgz0B<$W8gum7K=1M0~5yv=;Xb69JM zZg@8bWG@xXu?EBC%{Ug7`~O0esdZ`Lgh46EzT@|NY-KVVI(D;U$`pFy60T2X$2mU6 z!&s_058ZRTdqw1K`Jfm0Q*rw&&_1@?N1oPd_=|S`_=zA5=v4nauP5M;0E(%vPU>Fy zcrPL4jw0d?R;T%EylnY{b+>23N0@A&@J9C$uQNQ7&2AV+z1a-aqQ-ElTWesh_4k;m zwdT-HM;Eoy!;e-OdCnEHi3|Z@GknjRBW>DIx~&UGUIvX;U-_AMGkgm!$#lM0mXzBs zpr`pNf!{^%hVAZ*Wwhp|2M5rHOGK7(nfIr-JI#c@eqj!h&u-mr!9z)}TCBaC$+bAs zB!j(zFWwrEj(LnWS?h9yDGe}XbQGR;QAy#8(y89$=N}?@U9C&cxw!6N6Uj=blUjLs zGm!9AK0NR7_H(5wTWbm>k82mjLr*9e7@!XrO{#MQO&i6biUze?Z2S*zZETo z7fmOmiVzJcJw5aPxH%ZT`YAC2z0m5p2FC4hO4?APHuYNYdS3md?keJn^WBf?v8ReZ zw@7v6P+A;PORv^y|J8E&{+-dt{9#H%=gI+BWQn!k$%heZV)HAg;uskc;t|~&#q`&% z=2+1I&cpfEAH^m@;>~6Trjpzmbdl1weIM>fuFe#@dRWuPYyI;Y z=ir!t8$q4?&QprdJoXSF!1QEAi$Dn5x;^3e*!` zZ@Stj;9g2&0iE09#hFM}SdTbB+FQ??1f9Ubl*0w%(*pG`(K4Q}r>-$ZU5$*V3Eih* zy?wB4(J(eH=5K8nf&_a}05}9f46(4}_dvS?H2<5xUqMqhOkTm1l6ay#ol9el?Ps&y zEfd8&P(U1%eEZB6*avfFa02w1wI!6n*m60wa?%gp$lWvTl{??dZeoTI@!yE$p=bbr zRBOjtURV}i^xU)B9>AEVY@X5O1orwMT=9HK0_v`}&9viS`l-@@`N_pUAvlM8GN zvu-!BaoVQ2&1X&dHw@lqe1W&*LhS2O)lsPpsoCt92kplAx(FHJJB4M_=Ja12ludNimpPO zXDbfAZw!xRxJWUrD7#F1er{4qk#?g-1HdOgdqGvsC)llE*Pfk|rpV#j#m@z~kLZjdrMlpCZaW^2cZ6O0H~Z#wte(*gff0Ev9KYUWUCB`|&G2p_LBvF}V2zweif1kpzQQne$}>mj`I07I!SX6dVg{ z>-i$ZeOcEi;`Z%=8BE60J*$&P*(1D6#iySnH^}E zJ5zQEo8&2MA|GLkg{s^;`~~W1gNt!+xCNp*TzSv$yl*oCuiwWK-d;D}c`CLXKh7@R zW6xQJ=KGB+f*^y!WIeWIvi3aKQlZ@@If34`n^^sZ@%$VjzEQ4#C8}Ij+=d*p2dvyz@q{#0F45=blS5x(OK@GgXteoLKVa?W*pYcV}c|$Y(lZb?` z0YXBlu7$KC7LNehe3N%WG6rqtbZ1ZR7@kpf+K!|Nx8qBzv`Izt*u1FfuPy$25=-8e~{cVp4|us(BiGrb=dw^Da-VjZ3P`yhtFt%NQ4e z4++kU81Vnh2P|D!$?f^2Oy6xPIIavl!QK2k+{@;b!q3tML8s7zxb~k9ubsFsT}lse z;x#62*x!7|42Lh2X^2R##O*v8zA0(*(lu3DU`Ou2NrMOb#ZI9fyH!<`s4N6|TnxnP zHLXWZl-oXOewkVLIMNcvIO5jzNX$kbWsDvaW7bMOxvaiK5nfNZIq|xSS$;nP-Y5^a z!1urp2y~1bzc&8BgekAsCLQDoEt4Fl*%d>K#S68cj9#vGBa7xz zXwGOqPT!}IK5+Td$G#Sw!RwrM=`kw=gSG+)DC}3s_ObX-vW1o&G0a+uh>R{cVlA>O zDhVi*+%aer&gO6kOS?MRj!H;^6LD#!H4Rdfs-aqGv(WEidgy~7%8GGT6R-o&a_ z1clevM?uR|&r&O5yxhQQ?cnO(4>Q*+L?DJe+NH0I!SuzLsX?#~Qk@hhK@f-@iu4{; z5*LO24qQXkSwp=8!͹`KKOIROgxCX$-;Zj$1PG)~8 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 diff --git a/docs/integrations/source-code-mgmt/gitlab/index.mdx b/docs/integrations/source-code-mgmt/gitlab/index.mdx index 4c718b7d7b82f..cae3640f8e8ce 100644 --- a/docs/integrations/source-code-mgmt/gitlab/index.mdx +++ b/docs/integrations/source-code-mgmt/gitlab/index.mdx @@ -126,52 +126,9 @@ A `` may look something like 'BACKEND-C' in the image below. ### Stack Trace Linking -Stack trace linking takes you from a file in your Sentry stack trace to that same file in your source code. If you have commit tracking set up in Sentry, we can take you to the exact version (using the commit associated with the event) of the source code when the error occurred. Otherwise we'll link you to the current state of the source code (using the default **branch**). +Stack trace linking takes you from a file in your Sentry stack trace to the same file in GitLab. If you've set up commit tracking, Sentry links to the version of the file from the commit associated with the event. Otherwise, it links to the branch set in your code mapping. -1. Navigate to [**Settings > Integrations**](https://sentry.io/orgredirect/organizations/:orgslug/settings/integrations/) > **GitLab > Configurations**. - -1. Click the "Configure" button next to your GitLab Instance. - -1. Click the **Code Mappings** tab. - -1. Set up a code mapping for each project for which you want to enable stack trace linking. To create a new code mapping, click **Add Mapping**. - -1. Fill out the form, then click **Save Changes**. Each form field is described below: - - - **Project** (required): This is the Sentry project. - - **Repo** (required): This is the GitLab project associated with the Sentry project above. If you have more than one GitLab project being used per Sentry project, you'll need multiple code mappings. - - **Branch** (required): This is the default branch of your code we fall back to if you do not have commit tracking set up. - - **Stack Trace Root** and **Source Code Root** (optional): See below for information on determining these values. - -#### Stack Trace Root and Source Code Root - - - -The following information is only valid for platforms which use traditional file paths. Platforms with package names (such as **Java**, **Cocoa**, and **Flutter**) require additional steps. - - - -First, navigate to a stack trace that you wish to map. Find an **In App** frame, which is denoted by a bubble on the right side of the frame. The filename will be shown as the first piece of text at the left hand side of the frame header. In this example, it is `src/main.py`. - - - -For certain native platforms, the stack trace will look different. In cases like these, you can find the absolute path by hovering over the filename. - -![Highlighting where in the UI to find the file path for native stack traces =600x](./img/code-mappings-stacktrace-native.png) - -If you aren’t sure, you can look at the event JSON by clicking on the `{}` button in the event header. Find the text in the frame's `filename` or `abs_path`. - - - -Next, locate the file seen in the stack trace with your source code provider (e.g. GitHub). In this example, the path is `flask/src/main.py` (`empower` is ignored since it is the name of the repo). - - - -Compare the file path from the stack trace with the path found in your source repository. In this example, the `src/` folder in the stack trace matches the `flask/src` folder in the source code. Using that information, set the **Stack Trace Root** to `src/` and the **Source Code Root** to `flask/src/`. This tells Sentry to replace all file paths beginning in `src/` with `flask/src/` when searching for the source code. - -For best results, we recommend always providing a non-empty value for the **Stack Trace Root** when possible. - - +To set up stack trace linking, [add a code mapping](/integrations/source-code-mgmt/code-mappings/) for each Sentry project and GitLab repository you want to link. ### Source Context diff --git a/docs/integrations/source-code-mgmt/index.mdx b/docs/integrations/source-code-mgmt/index.mdx index 79759458d9550..37c525ae0e26e 100644 --- a/docs/integrations/source-code-mgmt/index.mdx +++ b/docs/integrations/source-code-mgmt/index.mdx @@ -14,4 +14,5 @@ description: "Learn more about Sentry's source code management integrations." ## Features +- [Code Mappings](/integrations/source-code-mgmt/code-mappings/) — map stack-trace file paths to files in your repository. Required for stack trace linking, suspect commits, SCM source context, and Code Owners. - [SCM Source Context](/integrations/source-code-mgmt/source-context/) — render source lines around each stack-trace frame on demand from your SCM provider, for events that don't carry inline source context. diff --git a/docs/integrations/source-code-mgmt/perforce/index.mdx b/docs/integrations/source-code-mgmt/perforce/index.mdx index 57e730d93b2a3..588e94fa211b4 100644 --- a/docs/integrations/source-code-mgmt/perforce/index.mdx +++ b/docs/integrations/source-code-mgmt/perforce/index.mdx @@ -89,34 +89,14 @@ If you have a P4 Code Review (Swarm) URL configured, links will open in the Swar #### Setting Up Code Mappings -1. Navigate to [**Settings > Integrations**](https://sentry.io/orgredirect/organizations/:orgslug/settings/integrations/) > **Perforce > Configurations**. +To set up stack trace linking, [add a code mapping](/integrations/source-code-mgmt/code-mappings/) for each Sentry project and Perforce depot you want to link. For Perforce, **Branch** is the stream name. It's optional, because streams are part of the depot path. -2. Click the gear icon next to your Perforce instance, then click the **Code Mappings** tab. + -3. Click **Add Mapping** and fill out the form: - - - **Project** (required): The Sentry project to map. - - **Repo** (required): The Perforce depot associated with this project. - - **Branch**: Stream name (optional for Perforce — streams are part of the depot path). - - **Stack Trace Root** and **Source Code Root** (optional): See below. - -#### Stack Trace Root and Source Code Root - - - -The following information is only valid for platforms which use traditional file paths. Platforms with package names require additional steps. +If the stack trace shows `src/main.cpp` and the depot path is `//depot/project/src/main.cpp`, set **Stack trace prefix** to `src/` and **Repository prefix** to `project/src/`. Sentry then replaces `src/` with `project/src/` when it looks up files in your depot. -Find an **In App** frame in your stack trace. The filename (e.g., `src/main.cpp`) is shown in the frame header. Compare this to the path in your Perforce depot (e.g., `//depot/project/src/main.cpp`). - -If the stack trace shows `src/main.cpp` and the depot path is `//depot/project/src/main.cpp`, set: - -- **Stack Trace Root**: `src/` -- **Source Code Root**: `project/src/` - -This tells Sentry to replace `src/` with `project/src/` when locating source files in your depot. - ### Source Context If your events don't carry inline source context (for example, native crashes or releases built without source maps), you can have Sentry fetch the surrounding lines from your Perforce depot on demand and render them in the issue stack trace. See [SCM Source Context](/integrations/source-code-mgmt/source-context/) for setup and access details. diff --git a/docs/integrations/source-code-mgmt/source-context/index.mdx b/docs/integrations/source-code-mgmt/source-context/index.mdx index eece6468faf35..7db70ca5c39bd 100644 --- a/docs/integrations/source-code-mgmt/source-context/index.mdx +++ b/docs/integrations/source-code-mgmt/source-context/index.mdx @@ -20,7 +20,7 @@ This is the same context view you see on events that *do* carry inline source, b - [GitHub / GitHub Enterprise](/integrations/source-code-mgmt/github/) - [GitLab](/integrations/source-code-mgmt/gitlab/) - [Perforce](/integrations/source-code-mgmt/perforce/) -- A code mapping configured for each project where you want SCM source context. See the **Stack Trace Linking** section of your provider's page for setup instructions. +- A code mapping configured for each project where you want SCM source context. See [Code Mappings](/integrations/source-code-mgmt/code-mappings/) for setup instructions. ## Enable diff --git a/docs/platforms/go/common/source-context/index.mdx b/docs/platforms/go/common/source-context/index.mdx index 7b7b4fce2f267..ac6488a8def74 100644 --- a/docs/platforms/go/common/source-context/index.mdx +++ b/docs/platforms/go/common/source-context/index.mdx @@ -14,7 +14,7 @@ For Go, source context is provided through [SCM Source Context](/integrations/so To use source context with Go: 1. Set up a supported SCM integration. -2. Configure code mappings for your project. +2. Configure [code mappings](/integrations/source-code-mgmt/code-mappings/) for your project. 3. Enable source context for the project. For setup details, see [SCM Source Context](/integrations/source-code-mgmt/source-context/). diff --git a/docs/platforms/go/common/troubleshooting.mdx b/docs/platforms/go/common/troubleshooting.mdx index e5f8ce9dd4f7d..300c9388ef7f5 100644 --- a/docs/platforms/go/common/troubleshooting.mdx +++ b/docs/platforms/go/common/troubleshooting.mdx @@ -21,7 +21,7 @@ If your Go stack traces are missing source lines, the most common cause is that Check that: - your project has a supported SCM integration installed -- your code mappings point to the correct repository paths +- your [code mappings](/integrations/source-code-mgmt/code-mappings/) point to the correct repository paths - source context is enabled for the project - the event is associated with a release or branch that Sentry can resolve through your code mappings diff --git a/docs/platforms/godot/configuration/source-context.mdx b/docs/platforms/godot/configuration/source-context.mdx index 4f42f2322ec55..c172d52380811 100644 --- a/docs/platforms/godot/configuration/source-context.mdx +++ b/docs/platforms/godot/configuration/source-context.mdx @@ -18,8 +18,8 @@ This works for frames in any language — GDScript, To set it up: 1. Install a [supported SCM integration](/integrations/source-code-mgmt/source-context/#prerequisites) for your Sentry organization. -2. Add a code mapping for your project — see the **Stack Trace Linking** section of your SCM provider's docs for the full walkthrough. - - GDScript frames reference scripts by their `res://` path, so set the **Stack Trace Root** to `res://` and the **Source Code Root** to the repository directory containing your `project.godot` — for example, `project/` if your Godot project lives in the `project` folder, or leave it empty if it sits at the repository root. +2. Add a code mapping for your project — see [Code Mappings](/integrations/source-code-mgmt/code-mappings/) for the full walkthrough. + - GDScript frames reference scripts by their `res://` path, so set the **Stack trace prefix** to `res://` and the **Repository prefix** to the repository directory containing your `project.godot` — for example, `project/` if your Godot project lives in the `project` folder, or leave it empty if it sits at the repository root. - C# and native frames use regular file paths, so map them with their own code mappings based on the paths you see in your stack traces. 3. Turn on **Enable SCM Source Context** under your project's **Settings > [General Settings](https://sentry.io/orgredirect/organizations/:orgslug/settings/projects/:projectId/) > Client Security**. @@ -41,7 +41,7 @@ This doesn't work for GDScript, which has no debug information files. If frames show no source context with SCM fetching, check that: -- For GDScript frames, the code mapping's stack trace root is `res://` and its source root points to the directory containing `project.godot` in your repository. +- For GDScript frames, the code mapping's stack trace prefix is `res://` and its repository prefix points to the directory containing `project.godot` in your repository. - **Enable SCM Source Context** is turned on in your [project settings](https://sentry.io/orgredirect/organizations/:orgslug/settings/projects/:projectId/). - The SCM integration is installed and has access to the repository. - The event is associated with a release whose commit Sentry can resolve — otherwise Sentry falls back to the default branch, which may not match the shipped code. diff --git a/docs/platforms/java/common/source-context/index.mdx b/docs/platforms/java/common/source-context/index.mdx index 512741add4860..2310616e77ee9 100644 --- a/docs/platforms/java/common/source-context/index.mdx +++ b/docs/platforms/java/common/source-context/index.mdx @@ -10,9 +10,9 @@ og_image: /og-images/platforms-java-common-source-context.png ## Setting Up Code Mappings -To use suspect commits and stack trace linking, you'll need to set up a code mapping. This is a mapping between the source code in your repository and the source code in your stack traces. You can [set up code mappings manually in the Sentry UI](/product/issues/suspect-commits/#set-up-code-mappings) or [upload code mappings in bulk via Sentry CLI](/cli/code-mappings/). We recommend using the CLI if your project has many modules. +To use suspect commits and stack trace linking, you'll need to set up a code mapping. This is a mapping between the source code in your repository and the source code in your stack traces. You can [set up code mappings manually in the Sentry UI](/integrations/source-code-mgmt/code-mappings/) or [upload code mappings in bulk via Sentry CLI](/cli/code-mappings/). We recommend using the CLI if your project has many modules. -Use the following steps to determine the correct **Stack Trace Root** **Source Code Root** while setting up your code mapping: +Use the following steps to determine the correct **Stack trace prefix** and **Repository prefix** while setting up your code mapping: First, navigate to a stack trace that you wish to map. Find an **In App** frame, which is denoted by a bubble on the right side of the frame. The Java module will be shown as the first piece of text on the left-hand side of the frame header. Hovering over the module will display the file's absolute path. In the screenshot below, the model is `com.example.vu.android.MainActivity` and the absolute file path is `MainActivity.java`. @@ -20,6 +20,6 @@ First, navigate to a stack trace that you wish to map. Find an **In App** frame, Next, calculate the derived file path. Take the frame `module` and replace all `.` characters with `/`. Then, replace the last item (`MainActivity` in this example) with the absolute path found earlier (`MainActivity.java`). In this example, the derived file path is `com/example/vu/android/MainActivity.java`. -Finally, compare the derived with the path found in your source repository. In this example, the `com/example/vu/android/` folder may match the `src/com/example/vu/android/` folder in the source code. Using that information, set the **Stack Trace Root** to `com/example/vu/android/` and the **Source Code Root** to `src/com/example/vu/android/`. This tells Sentry to replace all file paths beginning in `com/example/vu/android/` with `src/com/example/vu/android/` when searching for the source code. +Finally, compare the derived with the path found in your source repository. In this example, the `com/example/vu/android/` folder may match the `src/com/example/vu/android/` folder in the source code. Using that information, set the **Stack trace prefix** to `com/example/vu/android/` and the **Repository prefix** to `src/com/example/vu/android/`. This tells Sentry to replace all file paths beginning in `com/example/vu/android/` with `src/com/example/vu/android/` when searching for the source code. -Because Sentry will use the first matching code mapping, it is recommended to always provide a non-empty value for the **Stack Trace Root** when possible. An empty value in the **Stack Trace Root** will match all file paths, which will work poorly if multiple code mappings are required. +Because Sentry will use the first matching code mapping, it is recommended to always provide a non-empty value for the **Stack trace prefix** when possible. An empty value in the **Stack trace prefix** will match all file paths, which will work poorly if multiple code mappings are required. diff --git a/docs/product/issues/issue-details/performance-issues/web-vitals/index.mdx b/docs/product/issues/issue-details/performance-issues/web-vitals/index.mdx index e3db4bfb71fd7..d2b22541df28c 100644 --- a/docs/product/issues/issue-details/performance-issues/web-vitals/index.mdx +++ b/docs/product/issues/issue-details/performance-issues/web-vitals/index.mdx @@ -24,7 +24,7 @@ The detector for this performance issue runs on a schedule and checks the 7 day The following additional criteria must hold true: - You must have [Seer](/product/ai-in-sentry/seer/) enabled on your Sentry account. -- You must have a [GitHub code mapping](/integrations/source-code-mgmt/github/) configured for your project. +- You must have a [GitHub code mapping](/integrations/source-code-mgmt/code-mappings/) configured for your project. - There must be at least `10` sample spans for the given vital (_this value is [configurable](/product/issues/issue-details/performance-issues/#configuration)_). - There must be no issues currently open for the same Web Vitals metrics on the page being evaluated. diff --git a/docs/product/issues/ownership-rules/index.mdx b/docs/product/issues/ownership-rules/index.mdx index 7aa9b06aa3fa1..a5076a5f9c3fa 100644 --- a/docs/product/issues/ownership-rules/index.mdx +++ b/docs/product/issues/ownership-rules/index.mdx @@ -70,7 +70,7 @@ To grant a user access to a project, the user must be a member of a team with ac -You can import your CODEOWNERS file and use it alongside your ownership rules to assign Sentry issues. This requires **code mappings** from [stack trace linking](/integrations/source-code-mgmt/github/#stack-trace-linking) to be configured first, so Sentry can map file paths between your build output and your repository. +You can import your CODEOWNERS file and use it alongside your ownership rules to assign Sentry issues. This requires [code mappings](/integrations/source-code-mgmt/code-mappings/) to be configured first, so Sentry can map file paths between your build output and your repository. For example, you may build your program in a `dist/` folder that doesn't appear in your CODEOWNERS file, but does appear in your stack traces. Code mappings let Sentry normalize these file paths so CODEOWNERS rules match correctly. @@ -94,7 +94,7 @@ For Azure DevOps, Bitbucket, and Bitbucket Server, use Sentry user email address ### Setting Up Code Owners -1. Set up [code mappings](/integrations/source-code-mgmt/github/#stack-trace-linking) for your project. +1. Set up [code mappings](/integrations/source-code-mgmt/code-mappings/) for your project. 2. Import your CODEOWNERS file from your project's [Ownership Rules](https://sentry.io/orgredirect/organizations/:orgslug/settings/projects/:projectId/ownership/) settings and select the code mapping to apply. 3. If your CODEOWNERS file uses usernames or team names, configure [external team/user mappings](#external-teamuser-mappings) to map your source control identities to Sentry users and teams. Email addresses are matched directly to users in your Sentry organization. @@ -218,6 +218,6 @@ Ensure that all teams and users referenced in your rules have the correct access ### Code owners rules aren't matching -- Verify that [code mappings](/integrations/source-code-mgmt/github/#stack-trace-linking) are configured correctly for your project. +- Verify that [code mappings](/integrations/source-code-mgmt/code-mappings/) are configured correctly for your project. - Check that [external team/user mappings](#external-teamuser-mappings) are set up. Rules with unmapped teams or users are silently ignored. - CODEOWNERS files over 3MB are not supported. Consolidate rules using wildcards. diff --git a/docs/product/issues/suspect-commits/img/code-mappings-stacktrace-native.png b/docs/product/issues/suspect-commits/img/code-mappings-stacktrace-native.png deleted file mode 100644 index 0628a8cb9fe70dea77fde60b8bb53e475cf71778..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101153 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͹`KKOIROgxCX$-;Zj$1PG)~8 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 diff --git a/docs/product/issues/suspect-commits/index.mdx b/docs/product/issues/suspect-commits/index.mdx index 23a643edb999d..7a6c996651a88 100644 --- a/docs/product/issues/suspect-commits/index.mdx +++ b/docs/product/issues/suspect-commits/index.mdx @@ -41,64 +41,9 @@ In [sentry.io](https://sentry.io): ### Set Up Code Mappings - +Suspect commits need a code mapping for each project, so Sentry can match the files in your stack traces to files in your repository. To set one up, see [Code Mappings](/integrations/source-code-mgmt/code-mappings/). -Sentry will automatically try to set up code mappings on JavaScript, Python, Java, PHP, Ruby, Go, C#, and Kotlin projects for organizations with the GitHub integration installed. However, you can still manually add code mappings if you choose to do so. Support for other languages and other source code integrations are planned. - -You can also upload code mappings in bulk using the [Sentry CLI](/cli/code-mappings/). - - - -1. Go to [**Settings > Integrations**](https://sentry.io/orgredirect/organizations/:orgslug/settings/integrations/) **> [Your SCM Integration] (e.g. GitHub) > Configurations**. -1. Click the "Configure" button. -1. Click the "Code Mappings" tab. -1. Set up a code mapping for each project for which you want to enable suspect commits. To create a new code mapping, click **Add Mapping**. -1. Fill out the form, then click **Save Changes**. Each form field is described below. - -#### Code Mapping Form Fields - -- **Project** (required) - The Sentry project. -- **Repo** (required) - The GitHub or GitLab repository associated with the Sentry project above. If you have more than one repository being used per Sentry project, you'll need multiple code mappings. -- **Branch** (required) - The default branch of your code we fall back to if you don't have commit tracking set up. -- **Stack Trace Root** and **Source Code Root** (optional) - See below for information on determining these values. - -#### Stack Trace Root and Source Code Root - - - -The following information is only valid for platforms that use traditional file paths. Platforms with package names require additional steps. For **Java**, read more on the [page on source context](/platforms/java/source-context/#setting-up-code-mappings). - - - -First, navigate to a stack trace that you wish to map. Find an **In App** frame, which is denoted by a bubble on the right side of the frame. The filename will be shown as the first piece of text at the left-hand side of the frame header. In this example, it is `src/main.py`. - - - -For certain native platforms, the stack trace will look different. In cases like these, you can find the absolute path by hovering over the filename. - -![Highlighting where in the UI to find the file path for native stack traces](./img/code-mappings-stacktrace-native.png) - -If you aren’t sure, you can look at the event JSON by clicking on the `{}` button in the event header. Find the text in the frame's `filename` or `abs_path`. - - - -Next, locate the file seen in the stack trace with your source code provider (e.g. GitHub). In this example, the path is `flask/src/main.py` (`empower` is ignored since it is the name of the repo). - - - -Compare the file path from the stack trace with the path found in your source repository. In this example, the `src/` folder in the stack trace matches the `flask/src/` folder in the source code. Using that information, set the **Stack Trace Root** to `src/` and the **Source Code Root** to `flask/src/`. This tells Sentry to replace all file paths beginning in `src/` with `flask/src/` when searching for the source code. - -For best results, we recommend always providing a non-empty value for the **Stack Trace Root** when possible. - - - -The first frame in the stack trace is considered suspect when looking at them top-down. If the first frame is not in-app, the next frame is considered suspect. - -### UI Walkthrough - -Follow along with the interactive demo below to see how to integrate your GitHub account and repository. - - +When looking at the stack trace from the top down, Sentry considers the first frame suspect. If the first frame isn't in-app, Sentry considers the next frame suspect. ## How It Works diff --git a/includes/common-imgs/code-mappings-configure-modal.md b/includes/common-imgs/code-mappings-configure-modal.md deleted file mode 100644 index 7f9519f8371f4..0000000000000 --- a/includes/common-imgs/code-mappings-configure-modal.md +++ /dev/null @@ -1 +0,0 @@ -![](./img/code-mappings-configure-modal.png) diff --git a/includes/common-imgs/img/code-mappings-configure-modal.png b/includes/common-imgs/img/code-mappings-configure-modal.png deleted file mode 100644 index 7c75a8ef4c32c1d6c0410c33765e5d4d1f05e066..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50726 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 Date: Wed, 21 Oct 2026 11:30:02 -0700 Subject: [PATCH 038/127] feat(docs): Apply new quick start template to JavaScript quick start guides (#19983) ## DESCRIBE YOUR PR Applies the quick start template from #19295 (Ember) to the rest of the JavaScript quick starts: - **Browser:** plain JavaScript (`/platforms/javascript/`), React, Vue, Svelte, Solid, SolidStart, Gatsby, Capacitor, Electron, Wasm - **Wizard-based:** Next.js. The wizard flow stays, and the manual config shows every option. - **Server and runtime:** Azure Functions, Bun, Cloudflare, Deno, Effect, Elysia, Firebase, GCP Functions, Hono, NestJS, Nitro Changes on each page: - Removes the onboarding option checkboxes and `___PRODUCT_OPTION___` markers. - Configure names every feature the SDK supports. The init snippet includes all of them by default, with a "The snippet also turns on" list and a note that unwanted options can be removed. - Adds **Send Logs** and **Send Application Metrics** as their own steps, with logging integrations (console, Consola, Pino, Winston) recommended only where they're documented for that SDK. Capacitor has no Metrics step because it doesn't support Application Metrics. - Keeps framework-specific setup (routing, error handlers, middleware, instrumentation, source maps, data collection) under Configure. Verify is reduced to one test error. - Removes "(Optional)" from headings. Tunneling moves to Next Steps for browser SDKs. Next Steps is trimmed. Features are listed per SDK. Profiling appears only where the guide offered it, and Session Replay and User Feedback appear only on browser SDKs. **Plain JavaScript page:** `/platforms/javascript/` is rendered from `platform-includes/getting-started-complete/javascript.mdx`, which only that page uses. Its init snippet (npm, Loader and CDN tabs) and Verify snippet are written inline in that file, so the shared `getting-started-config` and `getting-started-verify` snippets other pages use are unchanged. The CDN tab now loads the full bundle (`bundle.tracing.replay.feedback.logs.metrics.min.js`), because the old tracing-only bundle doesn't include Session Replay or User Feedback. javascript.nextjs has been added to includes/quick-start-features-expandable.mdx and includes/quick-start-locate-data-expandable.mdx. ## IS YOUR CHANGE URGENT? - [ ] Urgent deadline (GA date, etc.): YYYY-MM-DD - [ ] Other deadline: YYYY-MM-DD - [x] No deadline: Not urgent, can wait up to 1 week+ ## PRE-MERGE CHECKLIST - [ ] Checked Vercel preview for correctness, including links - [ ] PR was reviewed and approved by any necessary SMEs (subject matter experts) - [ ] PR was reviewed and approved by a member of the [Sentry docs team](https://github.com/orgs/getsentry/teams/docs) via **shannon.anahata**. -- [View Junior Session](https://junior-prod.sentry.dev/conversations/slack%3AD0BB8KQT6MU%3A1792013336.218129) [[Sentry]](https://sentry.sentry.io/explore/conversations/slack%3AD0BB8KQT6MU%3A1792013336.218129/?project=4510944073809921) --------- Co-authored-by: sentry-junior[bot] <264270552+sentry-junior[bot]@users.noreply.github.com> Co-authored-by: Shannon Anahata Co-authored-by: inventarSarah Co-authored-by: Shannon Anahata --- .../javascript/guides/astro/index.mdx | 201 ++++++- .../guides/azure-functions/index.mdx | 127 ++--- .../platforms/javascript/guides/bun/index.mdx | 107 ++-- .../javascript/guides/capacitor/index.mdx | 501 +++++++++++------- .../javascript/guides/cloudflare/index.mdx | 110 ++-- .../javascript/guides/deno/index.mdx | 103 ++-- .../javascript/guides/effect/index.mdx | 178 ++----- .../javascript/guides/electron/index.mdx | 149 ++---- .../javascript/guides/elysia/index.mdx | 108 ++-- .../javascript/guides/ember/index.mdx | 38 +- .../javascript/guides/express/index.mdx | 2 +- .../javascript/guides/fastify/index.mdx | 2 +- .../javascript/guides/firebase/index.mdx | 138 ++--- .../javascript/guides/gatsby/index.mdx | 127 ++--- .../javascript/guides/gcp-functions/index.mdx | 175 +++--- .../javascript/guides/hapi/index.mdx | 2 +- .../javascript/guides/hono/index.mdx | 120 +++-- .../platforms/javascript/guides/koa/index.mdx | 2 +- .../javascript/guides/nestjs/index.mdx | 83 ++- .../javascript/guides/nextjs/index.mdx | 292 +++++----- .../javascript/guides/nitro/index.mdx | 141 +++-- .../javascript/guides/node/index.mdx | 2 +- .../javascript/guides/react-router/index.mdx | 175 +----- .../guides/react-router/manual-setup.mdx | 266 ++++------ .../javascript/guides/react/index.mdx | 239 +++------ .../javascript/guides/solid/index.mdx | 133 ++--- .../javascript/guides/solidstart/index.mdx | 181 ++----- .../javascript/guides/svelte/index.mdx | 179 ++----- .../platforms/javascript/guides/vue/index.mdx | 189 +++---- .../javascript/guides/wasm/index.mdx | 152 ++---- includes/quick-start-features-expandable.mdx | 2 +- .../quick-start-locate-data-expandable.mdx | 2 +- .../getting-started-complete/javascript.mdx | 204 ++++++- .../javascript.node.mdx | 42 +- .../getting-started-install/javascript.mdx | 5 +- .../javascript.node.mdx | 20 - .../getting-started-logs/javascript.mdx | 16 + .../getting-started-metrics/javascript.mdx | 13 + .../getting-started-node/javascript.mdx | 49 +- .../javascript.express.mdx | 35 +- .../javascript.fastify.mdx | 35 +- .../javascript.hapi.mdx | 39 +- .../getting-started-verify/javascript.koa.mdx | 39 +- .../javascript.node.mdx | 37 +- .../javascript.react-router.mdx | 2 +- 45 files changed, 1976 insertions(+), 2786 deletions(-) create mode 100644 platform-includes/getting-started-logs/javascript.mdx create mode 100644 platform-includes/getting-started-metrics/javascript.mdx diff --git a/docs/platforms/javascript/guides/astro/index.mdx b/docs/platforms/javascript/guides/astro/index.mdx index 79f9f86d22fd2..85729298541b1 100644 --- a/docs/platforms/javascript/guides/astro/index.mdx +++ b/docs/platforms/javascript/guides/astro/index.mdx @@ -1,6 +1,6 @@ --- title: Astro -description: Learn how to manually set up Sentry in your Astro app and capture your first errors. +description: Learn how to manually set up Sentry in your Astro app and capture your first events. sdk: sentry.javascript.astro categories: - browser @@ -18,11 +18,7 @@ You need: -This SDK currently only works on Node runtimes, such as Node adapter or Vercel -with Lambda functions. If you use Cloudflare Workers or Cloudflare Pages, refer to our [Astro on -Cloudflare guide](/platforms/javascript/guides/cloudflare/frameworks/astro/). -Other non-Node runtimes, like Vercel's Edge runtime, are currently **not -supported**. +This SDK currently only works on Node runtimes, such as Node adapter or Vercel with Lambda functions. If you use Cloudflare Workers or Cloudflare Pages, refer to our [Astro on Cloudflare guide](/platforms/javascript/guides/cloudflare/frameworks/astro/). Other non-Node runtimes, like Vercel's Edge runtime, are currently **not supported**. @@ -30,20 +26,191 @@ supported**. ## Install -Choose the features you want to configure, and this guide will show you how: +### Install the Sentry SDK - +Install the Sentry integration using the `astro` CLI, then install the Profiling package using your preferred package manager: + +```bash {tabTitle:npm} +npx astro add @sentry/astro +npm install @sentry/profiling-node +``` + +```bash {tabTitle:yarn} +yarn astro add @sentry/astro +yarn add @sentry/profiling-node +``` + +```bash {tabTitle:pnpm} +pnpm astro add @sentry/astro +pnpm add @sentry/profiling-node +``` + +## Configure + +**Error Monitoring** starts working as soon as you call `Sentry.init()`. **Logs** and **Application Metrics** need no extra configuration, and you'll learn how to send them in steps [#3](#send-logs) and [#4](#send-application-metrics-). +This guide also enables **Tracing**, **Profiling**, **Session Replay**, and **User Feedback**. - +### Initialize the SDK + +To configure Sentry on your app's client-side and server-side, create a `sentry.client.config.(ts|js)` and `sentry.server.config.(ts|js)` file in the root of your project. +Use the tabs in the code box below to view the client and server configuration snippets. + +The snippets also turn on: + +- Tracing: via `tracesSampleRate` +- Profiling: via `nodeProfilingIntegration()` and `profileSessionSampleRate` +- Session Replay: via `replayIntegration()`, sampled with `replaysSessionSampleRate` and `replaysOnErrorSampleRate` +- User Feedback: via `feedbackIntegration()` + +Don't need a feature? Remove its integration and options from the snippets. + +```typescript {tabTitle:Client config}{filename:sentry.client.config.ts} +import * as Sentry from "@sentry/astro"; + +Sentry.init({ + dsn: "___PUBLIC_DSN___", + integrations: [ + // enables automatic instrumentation + Sentry.browserTracingIntegration(), + // enables Session Replay + Sentry.replayIntegration(), + // enables User Feedback + Sentry.feedbackIntegration({ colorScheme: "system" }), + ], + + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. + tracesSampleRate: 1.0, + + // Capture replays for 10% of all sessions, + // plus for 100% of sessions with an error + // Requires Sentry.replayIntegration() + replaysSessionSampleRate: 0.1, + replaysOnErrorSampleRate: 1.0, +}); +``` + +```typescript {tabTitle:Server config}{filename:sentry.server.config.ts} +import * as Sentry from "@sentry/astro"; +import { nodeProfilingIntegration } from "@sentry/profiling-node"; + +Sentry.init({ + dsn: "___PUBLIC_DSN___", + // enables Node Profiling + integrations: [nodeProfilingIntegration()], + + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. + tracesSampleRate: 1.0, + + // Enables Profiling. + // Set to 1.0 to profile every session. + // We recommend reducing this value in production. + profileSessionSampleRate: 1.0, +}); +``` + +### Register the Sentry Integration + +Add the Sentry integration to your `astro.config.mjs`: + +```javascript {filename:astro.config.mjs} +import { defineConfig } from "astro/config"; +import sentry from "@sentry/astro"; + +export default defineConfig({ + integrations: [sentry()], +}); +``` + +### Add Readable Stack Traces With Source Maps + +To upload source maps for clear error stack traces, add your Sentry auth token, organization, and project slugs in the `sentry` options inside `astro.config.mjs`: + +```javascript {filename:astro.config.mjs} +import { defineConfig } from "astro/config"; +import sentry from "@sentry/astro"; + +export default defineConfig({ + integrations: [ + sentry({ + org: "___ORG_SLUG___", + project: "___PROJECT_SLUG___", + // store your auth token in an environment variable + authToken: process.env.SENTRY_AUTH_TOKEN, + }), + ], +}); +``` + +To keep your auth token secure, set the `SENTRY_AUTH_TOKEN` environment variable in your build environment: + + + +```bash {filename:.env.sentry-build-plugin} +SENTRY_AUTH_TOKEN=___ORG_AUTH_TOKEN___ +``` + + + +### Control the Data You Send to Sentry + + + +## Send Logs + + + +If you already use `console`, capture those calls as Sentry Logs with `consoleLoggingIntegration`. +We also provide integrations for: +- Consola +- Pino + +## Send Application Metrics + + + +On Node.js, `nodeRuntimeMetricsIntegration` also collects runtime health metrics automatically. + +## Verify Your Setup + +Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. + +Add this button to a page in your Astro app and click it to send a test error: + +```astro + + + +``` + +### View Captured Data in Sentry + +Now, head over to your project on [Sentry.io](https://sentry.io) to view the collected data (it takes a couple of moments for the data to appear). + + + +## Next Steps + +At this point, you should have integrated Sentry into your Astro application. Here's what to explore next: + +- Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup +- Set up Agent Tracing to monitor your AI systems +- Set up tunneling to avoid ad blockers blocking Sentry events + + + +- Find various topics in Troubleshooting +- [Get support](https://www.sentry.help/en/) + + diff --git a/docs/platforms/javascript/guides/azure-functions/index.mdx b/docs/platforms/javascript/guides/azure-functions/index.mdx index 731574513496e..a03dbef012ccd 100644 --- a/docs/platforms/javascript/guides/azure-functions/index.mdx +++ b/docs/platforms/javascript/guides/azure-functions/index.mdx @@ -1,6 +1,6 @@ --- title: Azure Functions -description: Learn how to manually set up Sentry in your Azure Functions and capture your first errors. +description: Learn how to manually set up Sentry in your Azure Functions and capture your first events. sdk: sentry.javascript.node fallbackGuide: javascript.node categories: @@ -15,14 +15,6 @@ categories: ## Install -Choose the features you want to configure, and this guide will show you how: - - - - - ### Install the Sentry SDK Run the command for your preferred package manager to add `@sentry/node` as a runtime dependency to your application: @@ -31,37 +23,36 @@ Run the command for your preferred package manager to add `@sentry/node` as a ru ## Configure +**Error Monitoring** starts working as soon as you call `Sentry.init()`. **Logs** and **Application Metrics** need no extra configuration, and you'll learn how to send them in steps [#3](#send-logs) and [#4](#send-application-metrics-). +This guide also enables **Tracing** and **Profiling**. + + + +The snippet also turns on: + +- Tracing: via `tracesSampleRate` +- Profiling: via `profileSessionSampleRate` and `nodeProfilingIntegration()` + +Don't need a feature? Remove its integration and options from the snippet. + Make sure to initialize Sentry at the top of your function file before importing any other modules: ```javascript {tabTitle:async} const Sentry = require("@sentry/node"); -// ___PRODUCT_OPTION_START___ profiling const { nodeProfilingIntegration } = require("@sentry/profiling-node"); - -// ___PRODUCT_OPTION_END___ profiling Sentry.init({ dsn: "___PUBLIC_DSN___", - // ___PRODUCT_OPTION_START___ profiling - integrations: [nodeProfilingIntegration()], - // ___PRODUCT_OPTION_END___ profiling - // ___PRODUCT_OPTION_START___ performance - - // Add Performance Monitoring by setting tracesSampleRate - // Set tracesSampleRate to 1.0 to capture 100% of transactions - // We recommend adjusting this value in production - // Learn more at - // https://docs.sentry.io/platforms/javascript/configuration/options/#traces-sample-rate + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. tracesSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ performance - // ___PRODUCT_OPTION_START___ profiling - // Enable profiling for a percentage of sessions - // Learn more at - // https://docs.sentry.io/platforms/javascript/configuration/options/#profileSessionSampleRate + // Enables Profiling. + // Set to 1.0 to profile every session. + // We recommend reducing this value in production. profileSessionSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ profiling }); // your function code @@ -92,80 +83,48 @@ module.exports = async function (context, req) { }; ``` -### Add Readable Stack Traces With Source Maps (Optional) +### Add Readable Stack Traces With Source Maps -### Control the Data You Send to Sentry (Optional) +### Control the Data You Send to Sentry -## Step 4: Verify Your Setup +## Send Logs -Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. + -### Issues +If you're already logging with another library, use an integration to capture those logs as Sentry Logs automatically: +- `consoleLoggingIntegration` for `console` calls +- Consola +- Pino -Let's verify that Sentry captures errors and creates issues in your Sentry project. Add an intentional error in your function: +## Send Application Metrics -```javascript {tabTitle:async} -const Sentry = require("@sentry/node"); - -module.exports = async function (context, req) { - try { - // This function does not exist, triggering an error - await notExistFunction(); - } catch (e) { - Sentry.withScope((scope) => { - scope.setSDKProcessingMetadata({ request: req }); - Sentry.captureException(e); - }); - } + - // Wait for the event to be sent before the function execution ends - await Sentry.flush(2000); +On Node.js, `nodeRuntimeMetricsIntegration` also collects runtime health metrics automatically. - context.res = { - status: 500, - body: "Test error sent to Sentry.", - }; -}; -``` +## Verify Your Setup - -### Tracing +Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. -To test tracing, update your function to include a custom span: +Add an intentional error in your function and flush the event before the function execution ends: ```javascript {tabTitle:async} const Sentry = require("@sentry/node"); module.exports = async function (context, req) { - await Sentry.startSpan({ name: "My Custom Span", op: "task" }, async () => { - // Simulate some work - await new Promise((resolve) => setTimeout(resolve, 100)); - }); - - // Wait for the event to be sent before the function execution ends - await Sentry.flush(2000); - - context.res = { - status: 200, - body: "Hello world!", - }; + try { + throw new Error("Sentry Test Error"); + } catch (error) { + Sentry.captureException(error); + await Sentry.flush(2000); + } }; ``` - - - - - - - - - - ### View Captured Data in Sentry Now, head over to your project on [Sentry.io](https://sentry.io/) to view the collected data (it takes a couple of moments for the data to appear). @@ -174,14 +133,10 @@ Now, head over to your project on [Sentry.io](https://sentry.io/) to view the co ## Next Steps -At this point, you should have integrated Sentry into your Azure Function and should already be sending data to your Sentry project. - -Now's a good time to customize your setup and look into more advanced topics. Our next recommended steps for you are: +At this point, you should have integrated Sentry into your Azure Functions application. Here's what to explore next: - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup -- Continue to customize your configuration -- Learn how to manually capture errors -- Get familiar with [Sentry's product features](/) like tracing, insights, and alerts +- Set up Agent Tracing to monitor your AI systems - Find various topics in Troubleshooting diff --git a/docs/platforms/javascript/guides/bun/index.mdx b/docs/platforms/javascript/guides/bun/index.mdx index ba7b0ba8e49a6..953542c895b9e 100644 --- a/docs/platforms/javascript/guides/bun/index.mdx +++ b/docs/platforms/javascript/guides/bun/index.mdx @@ -1,6 +1,6 @@ --- title: Bun -description: Learn how to manually set up Sentry in your Bun app and capture your first errors. +description: Learn how to manually set up Sentry in your Bun app and capture your first events. sdk: sentry.javascript.bun categories: - server @@ -13,14 +13,6 @@ categories: ## Install -Choose the features you want to configure, and this guide will show you how: - - - - - ### Install the SDK Use the Bun package manager to add the Sentry SDK to your application: @@ -31,10 +23,21 @@ bun add @sentry/bun ## Configure +**Error Monitoring** starts working as soon as you call `Sentry.init()`. **Logs** and **Application Metrics** need no extra configuration, and you'll learn how to send them in steps [#3](#send-logs) and [#4](#send-application-metrics-). +This guide also enables **Tracing**. + + + ### Initialize the Sentry SDK Sentry should be initialized as early in your app as possible. -Create a file named `instrument.js` in the root directory of your project and add the following code: +Create a file named `instrument.js` in the root directory of your project and add the code snippet shown below. + +The snippet also turns on: + +- Tracing: via `tracesSampleRate` + +Don't need a feature? Remove its integration and options from the snippet. ```javascript {filename: instrument.js} import * as Sentry from "@sentry/bun"; @@ -42,16 +45,10 @@ import * as Sentry from "@sentry/bun"; // Ensure to call this before importing any other modules! Sentry.init({ dsn: "___PUBLIC_DSN___", - - // ___PRODUCT_OPTION_START___ performance - - // Add Performance Monitoring by setting tracesSampleRate - // Set tracesSampleRate to 1.0 to capture 100% of transactions - // We recommend adjusting this value in production - // Learn more at - // https://docs.sentry.io/platforms/javascript/configuration/options/#traces-sample-rate + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. tracesSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ performance }); ``` @@ -84,64 +81,40 @@ bun --preload ./instrument.js app.js bun --preload ./instrument.js dist/app.js ``` -### Add Readable Stack Traces With Source Maps (Optional) +### Add Readable Stack Traces With Source Maps -### Control the Data You Send to Sentry (Optional) +### Control the Data You Send to Sentry -## Verify Your Setup - -Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. +## Send Logs -### Issues + -First, let's verify that Sentry captures errors and creates issues in your Sentry project. Add the following code snippet to your main application file, which will call an undefined function, triggering an error that Sentry will capture: +If you're already logging with another library, use an integration to capture those logs as Sentry Logs automatically: +- `consoleLoggingIntegration` for `console` calls +- Consola +- Pino -```javascript -setTimeout(() => { - try { - foo(); - } catch (e) { - Sentry.captureException(e); - } -}, 99); -``` +## Send Application Metrics - -### Tracing - -To test your tracing configuration, update the previous code snippet by starting a trace to measure the time it takes for the execution of your code: - -```javascript -Sentry.startSpan( - { - op: "test", - name: "My First Test Transaction", - }, - () => { - setTimeout(() => { - try { - foo(); - } catch (e) { - Sentry.captureException(e); - } - }, 99); - } -); -``` + - +For Bun, `bunRuntimeMetricsIntegration` also collects runtime health metrics automatically. - +## Verify Your Setup - +Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. - +Add an intentional error to your main application file: - +```javascript +setTimeout(() => { + throw new Error("Sentry Test Error"); +}, 0); +``` ### View Captured Data in Sentry @@ -151,16 +124,10 @@ Finally, head over to your project on [Sentry.io](https://sentry.io/) to view th ## Next Steps -At this point, you should have integrated Sentry into your Bun application, which should already be sending data to your Sentry project. - -Now's a good time to customize your setup and look into more advanced topics. -Our next recommended steps for you are: +At this point, you should have integrated Sentry into your Bun application. Here's what to explore next: - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup -- Extend Sentry to your frontend using one of our [frontend SDKs](/) -- Learn how to manually capture errors -- Continue to customize your configuration -- Get familiar with [Sentry's product features](/product/) like tracing, insights, and alerts +- Set up Agent Tracing to monitor your AI systems diff --git a/docs/platforms/javascript/guides/capacitor/index.mdx b/docs/platforms/javascript/guides/capacitor/index.mdx index 7b8dab639d01e..247d52ff163d8 100644 --- a/docs/platforms/javascript/guides/capacitor/index.mdx +++ b/docs/platforms/javascript/guides/capacitor/index.mdx @@ -1,6 +1,6 @@ --- title: Capacitor -description: Learn how to set up Sentry in your Capacitor application, capture your first errors and traces, and view them in Sentry. +description: Learn how to set up Sentry in your Capacitor application, capture your first events and traces, and view them in Sentry. sdk: sentry.javascript.capacitor categories: - browser @@ -48,16 +48,8 @@ Both frameworks are fully compatible with the current and beta versions of Sentr ## Configure -Choose the features you want to configure, and this guide will show you how: - - +**Error Monitoring** starts working as soon as you call `Sentry.init()`. **Logs** need no extra configuration, and you'll learn how to send them in step [#3](#send-logs). +This guide also enables **Tracing**, **Session Replay**, and **User Feedback**. @@ -65,201 +57,359 @@ Choose the features you want to configure, and this guide will show you how: Initialize Sentry as early as possible in your application's lifecycle. -If you're using Angular, React, Vue, or Nuxt, make sure to forward the `init` method from the framework's Sentry SDK, as you can see in these code snippets. If you're following the vanilla setup, you don't need to do this. - - - -### Add Readable Stack Traces With Source Maps (Optional) - - - -### Provide Native Debug Information for iOS (Optional) - -You need to provide debug information to Sentry to make the stack-trace information for native crashes on iOS easier to understand. You can provide debug information by [uploading dSYM files](/platforms/javascript/guides/capacitor/dsym/). - -### Control the Data You Send to Sentry (Optional) - - - -## Verify - -Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. +The snippets also turn on: -### Issues +- Tracing: via `tracesSampleRate` +- Session Replay: via `replayIntegration()`, sampled with `replaysSessionSampleRate` and `replaysOnErrorSampleRate` +- User Feedback: via `feedbackIntegration()` -To verify that Sentry captures errors and creates issues in your Sentry project, add the following test button and logic. +Don't need a feature? Remove its integration and options from the snippet. - - Open the page in a browser and click the button to trigger a frontend error. - - - +If you're using Angular, React, Vue, or Nuxt, make sure to forward the `init` method from the framework's Sentry SDK, as you can see in these code snippets. If you're following the vanilla setup, you don't need to do this. -```javascript {tabTitle: Angular 12, 13, 14+} {mdExpandTabs} -@Component({ - selector: "app-root", - template: ` - - ` +```typescript {tabTitle: Angular 14+} {mdExpandTabs} {filename: app.module.ts} +import * as Sentry from "@sentry/capacitor"; +import * as SentryAngular from "@sentry/angular"; + +Sentry.init( + { + dsn: "___PUBLIC_DSN___", + + // Set your release version, such as "getsentry@1.0.0" + release: "my-project-name@", + // Set your dist version, such as "1" + dist: "", + integrations: [ + // Enables automatic instrumentation + Sentry.browserTracingIntegration(), + // enables Session Replay + Sentry.replayIntegration(), + // enables User Feedback + Sentry.feedbackIntegration({ + // Additional integration configuration goes in here + colorScheme: "system", + }), + ], + + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. + tracesSampleRate: 1.0, + + // Limit which URLs receive trace propagation + tracePropagationTargets: ["localhost", /^https:\/\/yourserver\.io\/api/], + + // Capture replays for 10% of all sessions, + // plus for 100% of sessions with an error + // Requires Sentry.replayIntegration() + replaysSessionSampleRate: 0.1, + replaysOnErrorSampleRate: 1.0, + }, + // Forward the init method from @sentry/angular + SentryAngular.init +); + +@NgModule({ + providers: [ + { + provide: ErrorHandler, + // Attach the Sentry ErrorHandler + useValue: SentryAngular.createErrorHandler(), + }, + { + provide: SentryAngular.TraceService, + deps: [Router], + }, + { + provide: APP_INITIALIZER, + useFactory: () => () => {}, + deps: [SentryAngular.TraceService], + multi: true, + }, + ], }) -class AppComponent { - // ... - throwError(): void { - throw new Error("Sentry Test Error"); - } -} ``` -```javascript {tabTitle: React} - +```typescript {tabTitle: Angular 12, 13} {filename: app.module.ts} +// Requires @sentry/capacitor V0. +import * as Sentry from "@sentry/capacitor"; +import * as SentryAngular from "@sentry/angular-ivy"; + +Sentry.init( + { + dsn: "___PUBLIC_DSN___", + + // Set your release version, such as "getsentry@1.0.0" + release: "my-project-name@", + // Set your dist version, such as "1" + dist: "", + integrations: [ + // Enables automatic instrumentation + new Sentry.BrowserTracing(), + // enables Session Replay + new Sentry.Replay(), + // enables User Feedback + Sentry.feedbackIntegration({ + // Additional integration configuration goes in here + colorScheme: "system", + }), + ], + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. + tracesSampleRate: 1.0, + + // Limit which URLs receive trace propagation + tracePropagationTargets: ["localhost", /^https:\/\/yourserver\.io\/api/], + + // Capture replays for 10% of all sessions, + // plus for 100% of sessions with an error + // Requires Sentry.replayIntegration() + replaysSessionSampleRate: 0.1, + replaysOnErrorSampleRate: 1.0, + }, + // Forward the init method from @sentry/angular + SentryAngular.init +); + +@NgModule({ + providers: [ + { + provide: ErrorHandler, + // Attach the Sentry ErrorHandler + useValue: SentryAngular.createErrorHandler(), + }, + { + provide: SentryAngular.TraceService, + deps: [Router], + }, + { + provide: APP_INITIALIZER, + useFactory: () => () => {}, + deps: [SentryAngular.TraceService], + multi: true, + }, + ], +}) ``` -```javascript {tabTitle: Vue} - - -export default { - // ... - methods: { - throwError() { - throw new Error('Sentry Error'); - } - } -}; +```typescript {tabTitle: React} {filename: index.tsx} +import * as Sentry from "@sentry/capacitor"; +import * as SentryReact from "@sentry/react"; + +Sentry.init( + { + dsn: "___PUBLIC_DSN___", + + // Set your release version, such as "getsentry@1.0.0" + release: "my-project-name@", + // Set your dist version, such as "1" + dist: "", + integrations: [ + // Enables automatic instrumentation + Sentry.browserTracingIntegration(), + // enables Session Replay + Sentry.replayIntegration(), + // enables User Feedback + Sentry.feedbackIntegration({ + // Additional integration configuration goes in here + colorScheme: "system", + }), + ], + + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. + tracesSampleRate: 1.0, + + // Limit which URLs receive trace propagation + tracePropagationTargets: ["localhost", /^https:\/\/yourserver\.io\/api/], + + // Capture replays for 10% of all sessions, + // plus for 100% of sessions with an error + // Requires Sentry.replayIntegration() + replaysSessionSampleRate: 0.1, + replaysOnErrorSampleRate: 1.0, + }, + // Forward the init method from @sentry/react + SentryReact.init +); ``` -```html {tabTitle: Nuxt} - - - +```typescript {tabTitle: Vue} {filename: main.ts} +import * as Sentry from "@sentry/capacitor"; +import * as SentryVue from "@sentry/vue"; +import { createApp } from "vue"; + +const app = createApp(App); + +Sentry.init( + { + dsn: "___PUBLIC_DSN___", + + // Vue specific settings. + siblingOptions: { + vueOptions: { + app: app, + attachErrorHandler: false, + attachProps: true, + }, + }, + + // Set your release version, such as "getsentry@1.0.0" + release: "my-project-name@", + // Set your dist version, such as "1" + dist: "", + integrations: [ + // Enables automatic instrumentation + Sentry.browserTracingIntegration(), + // enables Session Replay + Sentry.replayIntegration(), + // enables User Feedback + Sentry.feedbackIntegration({ + // Additional integration configuration goes in here + colorScheme: "system", + }), + ], + + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. + tracesSampleRate: 1.0, + + // Limit which URLs receive trace propagation + tracePropagationTargets: ["localhost", /^https:\/\/yourserver\.io\/api/], + + // Capture replays for 10% of all sessions, + // plus for 100% of sessions with an error + // Requires Sentry.replayIntegration() + replaysSessionSampleRate: 0.1, + replaysOnErrorSampleRate: 1.0, + }, + + // Forward the init method from @sentry/vue + SentryVue.init +); ``` -```html {tabTitle: Other} - - - +```typescript {tabTitle: Nuxt} {filename: sentry.client.config.ts} +import * as Sentry from "@sentry/capacitor"; +import * as SentryNuxt from "@sentry/nuxt"; + +Sentry.init( + { + dsn: "___PUBLIC_DSN___", + // Set your release version, such as "getsentry@1.0.0" + release: "my-project-name@", + // Set your dist version, such as "1" + dist: "", + integrations: [ + // Enables automatic instrumentation + Sentry.browserTracingIntegration(), + // enables Session Replay + Sentry.replayIntegration(), + // enables User Feedback + Sentry.feedbackIntegration({ + // Additional integration configuration goes in here + colorScheme: "system", + }), + ], + + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. + tracesSampleRate: 1.0, + + // Limit which URLs receive trace propagation + tracePropagationTargets: ["localhost", /^https:\/\/yourserver\.io\/api/], + + // Capture replays for 10% of all sessions, + // plus for 100% of sessions with an error + // Requires Sentry.replayIntegration() + replaysSessionSampleRate: 0.1, + replaysOnErrorSampleRate: 1.0, + }, + + // Forward the init method from @sentry/nuxt + SentryNuxt.init +); ``` - +```javascript {tabTitle: Other} {filename: main.(ts|js)} +import * as Sentry from "@sentry/capacitor"; +import { feedbackIntegration } from "@sentry/browser"; + +Sentry.init({ + dsn: "___PUBLIC_DSN___", + + // Set your release version, such as "getsentry@1.0.0" + release: "my-project-name@", + // Set your dist version, such as "1" + dist: "", + integrations: [ + // Enables automatic instrumentation + Sentry.browserTracingIntegration(), + // enables Session Replay + Sentry.replayIntegration(), + // enables User Feedback + feedbackIntegration({ + // Additional integration configuration goes in here + colorScheme: "system", + }), + ], + + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. + tracesSampleRate: 1.0, + + // Limit which URLs receive trace propagation + tracePropagationTargets: ["localhost", /^https:\/\/yourserver\.io\/api/], + + // Capture replays for 10% of all sessions, + // plus for 100% of sessions with an error + // Requires Sentry.replayIntegration() + replaysSessionSampleRate: 0.1, + replaysOnErrorSampleRate: 1.0, +}); +``` -### Tracing +### Add Readable Stack Traces With Source Maps -To test your tracing configuration, update the previous code snippet and wrap the error in a custom span. -Then, open the page in a browser and click the button to trigger a frontend error and trace. + -```javascript {tabTitle: Angular 12, 13, 14+} {mdExpandTabs} -import * as Sentry from "@sentry/capacitor"; +### Provide Native Debug Information for iOS -@Component({ - selector: "app-root", - template: ` - - ` -}) -class AppComponent { - // ... - throwError(): void { - Sentry.startSpan({ op: "test", name: "Example Frontend Span" }, () => { - throw new Error("Sentry Test Error"); - }); - } -} -``` +You need to provide debug information to Sentry to make the stack-trace information for native crashes on iOS easier to understand. You can provide debug information by [uploading dSYM files](/platforms/javascript/guides/capacitor/dsym/). -```javascript {tabTitle: React} -import * as Sentry from "@sentry/capacitor"; +### Control the Data You Send to Sentry -; -``` + -```javascript {tabTitle: Vue} -import * as Sentry from "@sentry/capacitor"; +## Send Logs - - -export default { - // ... - methods: { - throwError() { - Sentry.startSpan({ op: "test", name: "Example Frontend Span" }, async () => { - throw new Error("Sentry Error"); - }); - } - } -}; -``` + -```html {tabTitle: Nuxt} - +If you already use `console`, capture those calls as Sentry Logs with `consoleLoggingIntegration`. - -``` +Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. -```html {tabTitle: Other} - +Add a test button to an existing page. Clicking it throws an error that Sentry captures: - ``` - - - - - - - - ### View Captured Data in Sentry Now, head over to your project on [Sentry.io](https://sentry.io/) to view the collected data (it takes a couple of moments for the data to appear). @@ -268,15 +418,10 @@ Now, head over to your project on [Sentry.io](https://sentry.io/) to view the co ## Next Steps -At this point, you should have integrated Sentry into your Capacitor application and should already be sending data to your Sentry project. - -Now's a good time to customize your setup and look into more advanced topics. Our next recommended steps for you are: +At this point, you should have integrated Sentry into your Capacitor application. Here's what to explore next: - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup - Learn how to use Sentry with Ionic -- Continue to customize your configuration -- Learn how to manually capture errors -- Make use of framework-specific features, such as [Angular](/platforms/javascript/guides/angular/features/), [Vue](/platforms/javascript/guides/vue/features/), [React](/platforms/javascript/guides/react/features/), or [Nuxt](/platforms/javascript/guides/nuxt/features/) - Find various topics in Troubleshooting diff --git a/docs/platforms/javascript/guides/cloudflare/index.mdx b/docs/platforms/javascript/guides/cloudflare/index.mdx index b82a9bc7d03ae..76049c2c54552 100644 --- a/docs/platforms/javascript/guides/cloudflare/index.mdx +++ b/docs/platforms/javascript/guides/cloudflare/index.mdx @@ -1,6 +1,6 @@ --- title: Cloudflare -description: "Learn how to manually set up Sentry for Cloudflare Workers and capture your first errors." +description: "Learn how to manually set up Sentry for Cloudflare Workers and capture your first events." sdk: sentry.javascript.cloudflare categories: - server @@ -34,14 +34,6 @@ If you're using any of the listed frameworks, follow their specific setup instru ## Install -Choose the features you want to configure, and this guide will show you how: - - - - - ### Install the Sentry SDK Run the command for your preferred package manager to add the Sentry SDK to your application: @@ -50,6 +42,11 @@ Run the command for your preferred package manager to add the Sentry SDK to your ## Configure +**Error Monitoring** starts working as soon as you configure Sentry. **Logs** and **Application Metrics** need no extra configuration, and you'll learn how to send them in steps [#3](#send-logs) and [#4](#send-application-metrics-). +This guide also enables **Tracing**. + + + This guide sets Sentry up through Vite, which is what we recommend for Cloudflare Workers. The plugin does the wiring at build time, so your Worker code stays untouched. @@ -94,18 +91,22 @@ Create an `instrument.server.ts` file next to your Worker entry, the file that ` The name is fixed. The plugin looks for `instrument.server` with a `.ts`, `.mts`, `.js`, `.mjs` or `.cjs` extension, and passes its default export to `withSentry`. Use `defineCloudflareOptions` to get the options type-checked. +The snippet also turns on: + +- Tracing: via `tracesSampleRate` + +Don't need a feature? Remove its integration and options from the snippet. + ```typescript {filename:src/instrument.server.ts} import { defineCloudflareOptions } from "@sentry/cloudflare"; export default defineCloudflareOptions((env) => ({ dsn: "___PUBLIC_DSN___", - // ___PRODUCT_OPTION_START___ performance - // Set tracesSampleRate to 1.0 to capture 100% of spans for tracing. - // Learn more at - // https://docs.sentry.io/platforms/javascript/guides/cloudflare/configuration/options/#tracesSampleRate + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. tracesSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ performance })); ``` @@ -115,104 +116,65 @@ If you don't add an `instrument.server.*` file, the SDK reads its configuration -### Add Readable Stack Traces With Source Maps (Optional) +### Add Readable Stack Traces With Source Maps -### Control the Data You Send to Sentry (Optional) +### Control the Data You Send to Sentry -## Verify Your Setup +### Known Limitations -Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. +#### Span Durations -### Issues +Server-side spans will display `0ms` for their durations. In the Cloudflare Workers runtime, `performance.now()` and `Date.now()` only advance after I/O occurs. CPU-bound operations will show zero duration. This is a security measure Cloudflare implements to [mitigate against timing attacks](https://developers.cloudflare.com/workers/runtime-apis/performance/). -First, let's make sure Sentry is correctly capturing errors and creating issues in your project. +This is expected behavior in the Cloudflare Workers environment and affects all frameworks deployed to Cloudflare Workers, including Next.js, Astro, Remix, and others. -Add the following code snippet to your main worker file to create a `/debug-sentry` route that triggers an error when called: -```javascript {filename:index.js} -export default { - async fetch(request) { - const url = new URL(request.url); +## Send Logs - if (url.pathname === "/debug-sentry") { - throw new Error("My first Sentry error!"); - } + - // Your existing routes and logic here... - return new Response("..."); - }, -}; -``` +If you're already logging with `console` or Consola, you can capture those logs with our console integrations. + +## Send Application Metrics + + - -### Tracing -To test your tracing configuration, update the previous code snippet by starting a trace to measure the time it takes to run your code. +## Verify Your Setup + +Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. -```javascript {filename:index.js} -import * as Sentry from "@sentry/cloudflare"; +Add a route to your Worker that throws an error: +```javascript export default { async fetch(request) { const url = new URL(request.url); if (url.pathname === "/debug-sentry") { - await Sentry.startSpan( - { - op: "test", - name: "My First Test Span", - }, - async () => { - await new Promise((resolve) => setTimeout(resolve, 100)); // Wait for 100ms - throw new Error("My first Sentry error!"); - } - ); + throw new Error("Sentry Test Error"); } - // Your existing routes and logic here... return new Response("..."); }, }; ``` - - - - - - - - - - ### View Captured Data in Sentry Now, head over to your project on [Sentry.io](https://sentry.io) to view the collected data (it takes a couple of moments for the data to appear). -## Known Limitations - -### Span Durations - -Server-side spans will display `0ms` for their durations. In the Cloudflare Workers runtime, `performance.now()` and `Date.now()` only advance after I/O occurs. CPU-bound operations will show zero duration. This is a security measure Cloudflare implements to [mitigate against timing attacks](https://developers.cloudflare.com/workers/runtime-apis/performance/). - -This is expected behavior in the Cloudflare Workers environment and affects all frameworks deployed to Cloudflare Workers, including Next.js, Astro, Remix, and others. - ## Next Steps -At this point, you should have integrated Sentry and should already be sending data to your Sentry project. - -Now's a good time to customize your setup and look into more advanced topics. Our next recommended steps for you are: +At this point, you should have integrated Sentry into your Cloudflare Worker. Here's what to explore next: - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup -- Learn how to [manually capture errors](/platforms/javascript/guides/cloudflare/usage/) -- Continue to [customize your configuration](/platforms/javascript/guides/cloudflare/configuration/) -- Make use of [Cloudflare-specific features](/platforms/javascript/guides/cloudflare/features/) -- Get familiar with [Sentry's product features](/product/) like tracing, insights, and alerts +- Set up Agent Tracing to monitor your AI systems diff --git a/docs/platforms/javascript/guides/deno/index.mdx b/docs/platforms/javascript/guides/deno/index.mdx index 24d90265ac49e..41329f9bb689a 100644 --- a/docs/platforms/javascript/guides/deno/index.mdx +++ b/docs/platforms/javascript/guides/deno/index.mdx @@ -1,6 +1,6 @@ --- title: Deno -description: Learn how to manually set up Sentry in your Deno app and capture your first errors. +description: Learn how to manually set up Sentry in your Deno app and capture your first events. sdk: sentry.javascript.deno categories: - server @@ -19,14 +19,6 @@ This SDK is currently in **beta**. Beta features are still in progress and may h ## Install -Choose the features you want to configure, and this guide will show you how: - - - - - ### Import the Sentry SDK Import the Sentry Deno SDK directly from the npm registry, before importing any other modules: @@ -49,9 +41,20 @@ The Sentry import hook, which you load when you [start your app](#start-your-app ## Configure +**Error Monitoring** starts working as soon as you call `Sentry.init()`. **Logs** and **Application Metrics** need no extra configuration, and you'll learn how to send them in steps [#3](#send-logs) and [#4](#send-application-metrics-). +This guide also enables **Tracing**. + + + ### Initialize the Sentry SDK -Initialize Sentry as early as possible in your app: +Initialize Sentry as early as possible in your app. + +The snippet also turns on: + +- Tracing: via `tracesSampleRate` + +Don't need a feature? Remove its integration and options from the snippet. ```javascript {filename: main.ts} import * as Sentry from "___SDK_PACKAGE___"; @@ -59,16 +62,10 @@ import * as Sentry from "___SDK_PACKAGE___"; Sentry.init({ dsn: "___PUBLIC_DSN___", - - // ___PRODUCT_OPTION_START___ performance - - // Set tracesSampleRate to 1.0 to capture 100% - // of transactions for performance monitoring. - // We recommend adjusting this value in production - // Learn more at - // https://docs.sentry.io/platforms/javascript/configuration/options/#traces-sample-rate + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. tracesSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ performance }); ``` @@ -101,64 +98,37 @@ If you omit `--allow-sys`, the SDK sends events without that data and prints no -### Add Readable Stack Traces With Source Maps (Optional) +### Add Readable Stack Traces With Source Maps -### Control the Data You Send to Sentry (Optional) +### Control the Data You Send to Sentry -## Verify Your Setup +## Send Logs -Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. + -### Issues +If you're already logging with `console` or Consola, you can capture those logs with our console integrations. -First, let's verify that Sentry captures errors and creates issues in your Sentry project. Add the following code snippet to your main application file, which will call an undefined function, triggering an error that Sentry will capture: +## Send Application Metrics -```javascript -setTimeout(() => { - try { - foo(); - } catch (e) { - Sentry.captureException(e); - } -}, 99); -``` - - -### Tracing - -To test your tracing configuration, update the previous code snippet by starting a trace to measure the time it takes for the execution of your code: - -```javascript -Sentry.startSpan( - { - op: "test", - name: "My First Test Transaction", - }, - () => { - setTimeout(() => { - try { - foo(); - } catch (e) { - Sentry.captureException(e); - } - }, 99); - } -); -``` + - +For Deno, `denoRuntimeMetricsIntegration` also collects runtime health metrics automatically. - +## Verify Your Setup - +Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. - +Add an intentional error to your application: - +```javascript +setTimeout(() => { + throw new Error("Sentry Test Error"); +}, 0); +``` ### View Captured Data in Sentry @@ -168,15 +138,10 @@ Finally, head over to your project on [Sentry.io](https://sentry.io/) to view th ## Next Steps -At this point, you should have integrated Sentry into your Deno application and should already be sending data to your Sentry project. - -Now's a good time to customize your setup and look into more advanced topics. Our next recommended steps for you are: +At this point, you should have integrated Sentry into your Deno application. Here's what to explore next: - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup -- Extend Sentry to your frontend using one of our [frontend SDKs](/) -- Learn how to manually capture errors -- Continue to customize your configuration -- Get familiar with [Sentry's product features](/product/) like tracing, insights, and alerts +- Set up Agent Tracing to monitor your AI systems diff --git a/docs/platforms/javascript/guides/effect/index.mdx b/docs/platforms/javascript/guides/effect/index.mdx index 9c91a891e8b69..382fb41e82640 100644 --- a/docs/platforms/javascript/guides/effect/index.mdx +++ b/docs/platforms/javascript/guides/effect/index.mdx @@ -1,7 +1,7 @@ --- title: Effect sdk: sentry.javascript.effect -description: Learn how to set up and configure Sentry in your Effect application, capture your first errors, and view them in Sentry. +description: Learn how to set up and configure Sentry in your Effect application, capture your first events and view them in Sentry. categories: - browser - server @@ -24,14 +24,6 @@ This guide will show you how to integrate Sentry into your [Effect](https://effe ## Install -Choose the features you want to configure, and this guide will show you how: - - - - - ### Install the Sentry SDK Run the command for your preferred package manager to add the Sentry SDK to your application. @@ -50,6 +42,11 @@ pnpm add @sentry/effect ## Configure +**Error Monitoring** starts working as soon as you provide `Sentry.effectLayer()`. **Logs** and **Application Metrics** need no extra SDK configuration. To forward Effect-native logs and metrics, use the Sentry Effect logger and metrics layers shown in this guide. You'll learn how to send them in steps [#3](#send-logs) and [#4](#send-application-metrics-). +This guide also enables **Tracing**. + + + The SDK provides an `effectLayer` that initializes Sentry. You can compose it with additional Effect layers to enable tracing, logging, and metrics. The `effectLayer`, `SentryEffectTracer`, `SentryEffectLogger`, and `SentryEffectMetricsLayer` exports are the same for Effect v3 and v4. The only difference between versions is how you compose layers for tracing and logging, which is covered in the snippets below. ### Effect v3 @@ -61,43 +58,38 @@ The SDK provides an `effectLayer` that initializes Sentry. You can compose it wi In both cases, use `Layer.setTracer` to configure tracing and `Logger.replace` to configure logging. +The snippets also turn on: + +- Tracing: via `tracesSampleRate` and the Effect tracer layer +- Logs: via `SentryEffectLogger` +- Application Metrics: via `SentryEffectMetricsLayer` + +Don't need a feature? Remove its layer and options from the snippet. + ```typescript {tabTitle: Server} {filename: main.ts} import * as Sentry from "@sentry/effect"; import { NodeRuntime } from "@effect/platform-node"; -// ___PRODUCT_OPTION_START___ logs import * as Logger from "effect/Logger"; -// ___PRODUCT_OPTION_END___ logs import * as Layer from "effect/Layer"; import { HttpLive } from "./Http.js"; const SentryLive = Layer.mergeAll( Sentry.effectLayer({ dsn: "___PUBLIC_DSN___", - // ___PRODUCT_OPTION_START___ performance - - // Set tracesSampleRate to 1.0 to capture 100% - // of transactions for tracing. - // We recommend adjusting this value in production. - // Learn more at - // https://docs.sentry.io/platforms/javascript/configuration/options/#traces-sample-rate + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. tracesSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ performance }), - // ___PRODUCT_OPTION_START___ performance // Enable Effect tracing Layer.setTracer(Sentry.SentryEffectTracer), - // ___PRODUCT_OPTION_END___ performance - // ___PRODUCT_OPTION_START___ logs // Forward Effect logs to Sentry Logger.replace(Logger.defaultLogger, Sentry.SentryEffectLogger), - // ___PRODUCT_OPTION_END___ logs - // ___PRODUCT_OPTION_START___ metrics // Forward Effect metrics to Sentry Sentry.SentryEffectMetricsLayer - // ___PRODUCT_OPTION_END___ metrics ); const MainLive = HttpLive.pipe(Layer.provide(SentryLive)); @@ -107,35 +99,24 @@ MainLive.pipe(Layer.launch, NodeRuntime.runMain); ```typescript {tabTitle: Client} {filename: main.ts} import * as Sentry from "@sentry/effect"; -// ___PRODUCT_OPTION_START___ logs import { Logger } from "effect"; -// ___PRODUCT_OPTION_END___ logs import { Layer } from "effect"; const SentryLive = Layer.mergeAll( Sentry.effectLayer({ dsn: "___PUBLIC_DSN___", - // ___PRODUCT_OPTION_START___ performance - - // Set tracesSampleRate to 1.0 to capture 100% - // of transactions for tracing. - // We recommend adjusting this value in production. - // Learn more at - // https://docs.sentry.io/platforms/javascript/configuration/options/#traces-sample-rate + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. tracesSampleRate: 1.0, integrations: [Sentry.browserTracingIntegration()], - // ___PRODUCT_OPTION_END___ performance }), - // ___PRODUCT_OPTION_START___ performance // Enable Effect tracing for the browser Layer.setTracer(Sentry.SentryEffectTracer), - // ___PRODUCT_OPTION_END___ performance - // ___PRODUCT_OPTION_START___ logs // Forward Effect logs to Sentry Logger.replace(Logger.defaultLogger, Sentry.SentryEffectLogger) - // ___PRODUCT_OPTION_END___ logs ); const MainLive = YourAppLayer.pipe(Layer.provide(SentryLive)); @@ -152,41 +133,28 @@ With SDK version 10.75.0 or higher, `effectLayer` also registers a Sentry `Error ```typescript {tabTitle: Server} {filename: main.ts} import * as Sentry from "@sentry/effect"; import { NodeRuntime } from "@effect/platform-node"; -// ___PRODUCT_OPTION_START___ logs import * as Logger from "effect/Logger"; -// ___PRODUCT_OPTION_END___ logs import * as Layer from "effect/Layer"; -// ___PRODUCT_OPTION_START___ performance import * as Tracer from "effect/Tracer"; -// ___PRODUCT_OPTION_END___ performance import { HttpLive } from "./Http.js"; const SentryLive = Layer.mergeAll( Sentry.effectLayer({ dsn: "___PUBLIC_DSN___", - // ___PRODUCT_OPTION_START___ performance - - // Set tracesSampleRate to 1.0 to capture 100% - // of transactions for tracing. - // We recommend adjusting this value in production. + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. tracesSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ performance }), - // ___PRODUCT_OPTION_START___ performance // Enable Effect tracing Layer.succeed(Tracer.Tracer, Sentry.SentryEffectTracer), - // ___PRODUCT_OPTION_END___ performance - // ___PRODUCT_OPTION_START___ logs // Forward Effect logs to Sentry Logger.layer([Sentry.SentryEffectLogger]), - // ___PRODUCT_OPTION_END___ logs - // ___PRODUCT_OPTION_START___ metrics // Forward Effect metrics to Sentry Sentry.SentryEffectMetricsLayer - // ___PRODUCT_OPTION_END___ metrics ); const MainLive = HttpLive.pipe(Layer.provide(SentryLive)); @@ -196,129 +164,73 @@ MainLive.pipe(Layer.launch, NodeRuntime.runMain); ```typescript {tabTitle: Client} {filename: main.ts} import * as Sentry from "@sentry/effect"; -// ___PRODUCT_OPTION_START___ logs import * as Logger from "effect/Logger"; -// ___PRODUCT_OPTION_END___ logs import * as Layer from "effect/Layer"; -// ___PRODUCT_OPTION_START___ performance import * as Tracer from "effect/Tracer"; -// ___PRODUCT_OPTION_END___ performance const SentryLive = Layer.mergeAll( Sentry.effectLayer({ dsn: "___PUBLIC_DSN___", - // ___PRODUCT_OPTION_START___ performance - - // Set tracesSampleRate to 1.0 to capture 100% - // of transactions for tracing. - // We recommend adjusting this value in production. + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. tracesSampleRate: 1.0, integrations: [Sentry.browserTracingIntegration()], - // ___PRODUCT_OPTION_END___ performance }), - // ___PRODUCT_OPTION_START___ performance // Enable Effect tracing Layer.succeed(Tracer.Tracer, Sentry.SentryEffectTracer), - // ___PRODUCT_OPTION_END___ performance - // ___PRODUCT_OPTION_START___ logs // Forward Effect logs to Sentry Logger.layer([Sentry.SentryEffectLogger]) - // ___PRODUCT_OPTION_END___ logs ); const MainLive = YourAppLayer.pipe(Layer.provide(SentryLive)); ``` -### Add Readable Stack Traces With Source Maps (Optional) +### Add Readable Stack Traces With Source Maps -### Control the Data You Send to Sentry (Optional) +### Control the Data You Send to Sentry -## Verify - -Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. +## Send Logs -### Issues +The Effect logger layer forwards `Effect.log` messages to Sentry. The v3 and v4 layer setup is included in the configuration snippets above. -To verify that Sentry captures errors and creates issues in your Sentry project, add a test error: +See Set Up Logs for logging methods and message formatting. ```typescript import { Effect } from "effect"; -import * as Sentry from "@sentry/effect"; const program = Effect.gen(function* () { - yield* Effect.fail(new Error("Sentry Test Error")); -}); - -// Run with your layer that includes Sentry.effectLayer -``` - - -### Tracing - -To test your tracing configuration, update the previous code snippet to create a custom span: - -```typescript -import { Effect } from "effect"; -import * as Sentry from "@sentry/effect"; - -const program = Effect.gen(function* () { - yield* Effect.gen(function* () { - // Simulate some work - yield* Effect.sleep("100 millis"); - yield* Effect.fail(new Error("Sentry Test Error")); - }).pipe( - Effect.withSpan("My First Test Transaction", { - attributes: { op: "test" }, - }) + yield* Effect.log("User example action completed"); + yield* Effect.logWarning("Slow operation detected").pipe( + Effect.annotateLogs({ operation: "data_fetch", duration: "3500ms" }) ); }); ``` - +## Send Application Metrics + + - +## Verify Your Setup -### Logs +Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. -To verify that Sentry catches your logs, add some log statements to your application: +Run an Effect that fails using the layer that includes `Sentry.effectLayer()`: ```typescript import { Effect } from "effect"; -import * as Sentry from "@sentry/effect"; - -const program = Effect.gen(function* () { - yield* Effect.log("User example action completed"); - yield* Effect.logWarning("Slow operation detected").pipe( - Effect.annotateLogs({ - operation: "data_fetch", - duration: "3500ms", - }) - ); +const program = Effect.fail(new Error("Sentry Test Error")); - yield* Effect.logError("Validation failed").pipe( - Effect.annotateLogs({ - field: "email", - reason: "Invalid email", - }) - ); -}); +// Run with your layer that includes Sentry.effectLayer(). ``` - - - - - - - - ### View Captured Data in Sentry Now, head over to your project on [Sentry.io](https://sentry.io/) to view the collected data (it takes a couple of moments for the data to appear). @@ -327,10 +239,10 @@ Now, head over to your project on [Sentry.io](https://sentry.io/) to view the co ## Next Steps +At this point, you should have integrated Sentry into your Effect application. Here's what to explore next: + - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup -- Learn how to [manually capture errors](/platforms/javascript/guides/effect/usage/) -- Continue to [customize your configuration](/platforms/javascript/guides/effect/configuration/) -- Get familiar with [Sentry's product features](/product/) like tracing, insights, and alerts +- Set up Agent Tracing to monitor your AI systems diff --git a/docs/platforms/javascript/guides/electron/index.mdx b/docs/platforms/javascript/guides/electron/index.mdx index acd7adcda290e..9d867f486fc7e 100644 --- a/docs/platforms/javascript/guides/electron/index.mdx +++ b/docs/platforms/javascript/guides/electron/index.mdx @@ -1,6 +1,6 @@ --- title: Electron -description: "Learn how to manually set up Sentry in your Electron app and capture your first errors." +description: "Learn how to manually set up Sentry in your Electron app and capture your first events." sdk: sentry.javascript.electron categories: - desktop @@ -30,40 +30,36 @@ pnpm add @sentry/electron ## Configure -Choose the features you want to configure, and this guide will show you how: - - +**Error Monitoring** starts working as soon as you call `Sentry.init()`. **Logs** and **Application Metrics** need no extra configuration, and you'll learn how to send them in steps [#3](#send-logs) and [#4](#send-application-metrics-). +This guide also enables **Tracing**, **Session Replay**, and **User Feedback**. You should initialize the SDK in both the `main` process and every `renderer` process you spawn. +Don't need a feature? Remove its integration and options from the respective snippet. ### Configure the Main Process -Initialize the SDK in your Electron `main` process as early as possible: +Initialize the SDK in your Electron `main` process as early as possible. + +The main process snippets also turns on: + +- Tracing: via `tracesSampleRate` and `startupTracingIntegration()` ```javascript import * as Sentry from "@sentry/electron/main"; Sentry.init({ dsn: "___PUBLIC_DSN___", - // ___PRODUCT_OPTION_START___ performance - // Set tracesSampleRate to 1.0 to capture 100% - // of transactions for performance monitoring. - // We recommend adjusting this value in production - // Learn more at - // https://docs.sentry.io/platforms/javascript/configuration/options/#traces-sample-rate + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. tracesSampleRate: 1.0, - integrations: [Sentry.startupTracingIntegration()], - // ___PRODUCT_OPTION_END___ performance + integrations: [ + // Enables startup tracing in the main process + Sentry.startupTracingIntegration(), + ], }); ``` @@ -71,42 +67,38 @@ Sentry.init({ Initialize the SDK in your Electron renderer processes as early as possible. All renderer events are sent through the main process so passing `dsn`, `release` or `environment` to renderer `init` will have no effect. +The renderer process snippet also turns on: + +- Tracing: via `tracesSampleRate` and `browserTracingIntegration()` +- Session Replay: via `replayIntegration()`, sampled with `replaysSessionSampleRate` and `replaysOnErrorSampleRate` +- User Feedback: via `feedbackIntegration()` + ```javascript import * as Sentry from "@sentry/electron/renderer"; Sentry.init({ integrations: [ - // ___PRODUCT_OPTION_START___ performance + // enables automatic instrumentation Sentry.browserTracingIntegration(), - // ___PRODUCT_OPTION_END___ performance - // ___PRODUCT_OPTION_START___ session-replay + // enables Session Replay Sentry.replayIntegration(), - // ___PRODUCT_OPTION_END___ session-replay - // ___PRODUCT_OPTION_START___ user-feedback + // enables User Feedback Sentry.feedbackIntegration({ - // Additional SDK configuration goes in here, for example: + // Additional integration configuration goes in here colorScheme: "system", }), - // ___PRODUCT_OPTION_END___ user-feedback ], - // ___PRODUCT_OPTION_START___ performance - // Set tracesSampleRate to 1.0 to capture 100% - // of transactions for performance monitoring. - // We recommend adjusting this value in production - // Learn more at - // https://docs.sentry.io/platforms/javascript/configuration/options/#traces-sample-rate + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. tracesSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ performance - // ___PRODUCT_OPTION_START___ session-replay - // Capture Replay for 10% of all sessions, + // Capture replays for 10% of all sessions, // plus for 100% of sessions with an error - // Learn more at - // https://docs.sentry.io/platforms/javascript/session-replay/configuration/#general-integration-configuration + // Requires Sentry.replayIntegration() replaysSessionSampleRate: 0.1, replaysOnErrorSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ session-replay }); ``` @@ -166,81 +158,39 @@ init( ); ``` -### Add Readable Stack Traces With Source Maps (Optional) +### Add Readable Stack Traces With Source Maps -### Control the Data You Send to Sentry (Optional) +### Control the Data You Send to Sentry -## Verify Your Setup - -Let's test your setup and confirm that Sentry is working correctly. - -### Issues - -**Main process error** - -Add an event listener that throws an error in your main process: - -```javascript -import { app } from "electron"; -import * as Sentry from "@sentry/electron/main"; - -app.on("ready", () => { - throw new Error("Sentry test error in main process"); -}); -``` - -**Renderer process error** +## Send Logs -Add a test button in one of your HTML pages: + -```html {filename: index.html} - - - -``` +If you're already logging with another library, use an integration to capture those logs as Sentry Logs automatically: +- `consoleLoggingIntegration` for `console` calls +- Consola +- Pino -Then, in your renderer, add the following: +## Send Application Metrics - - Finally, start your app and trigger two errors that Sentry will capture: one from the - main process and one from the renderer. - + -```javascript -document.getElementById("testError").addEventListener("click", () => { - throw new Error("Sentry test error in renderer process"); -}); -``` - - -### Tracing +## Verify Your Setup -To test tracing in your renderer, start a trace to measure the time it takes to execute your code. +Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. -Then, start your app and trigger two errors that Sentry will capture: one from the main process and one from the renderer. It will also start a trace with the defined name. +Add a test button to one of your renderer pages. Clicking it throws an error that Sentry captures: ```javascript document.getElementById("testError").addEventListener("click", () => { - Sentry.startSpan({ op: "test", name: "Renderer test span" }, () => { - throw new Error("Sentry test error in renderer process"); - }); + throw new Error("Sentry Test Error"); }); ``` - - - - - - - - - - ### View Captured Data in Sentry Now, head over to your project on [Sentry.io](https://sentry.io/) to view the collected data (it takes a couple of moments for the data to appear). @@ -249,15 +199,10 @@ Now, head over to your project on [Sentry.io](https://sentry.io/) to view the co ## Next Steps -At this point, you should have integrated Sentry into your Electron application and should already be sending data to your Sentry project. - -Now's a good time to customize your setup and look into more advanced topics. Our next recommended steps for you are: +At this point, you should have integrated Sentry into your Electron application. Here's what to explore next: - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup -- Continue to customize your configuration -- Learn how to manually capture errors -- Make use of Electron-specific features -- Get familiar with [Sentry's product features](/product/) like tracing, insights, and alerts +- Explore Electron-specific features diff --git a/docs/platforms/javascript/guides/elysia/index.mdx b/docs/platforms/javascript/guides/elysia/index.mdx index 7e1cf220de0a0..562cf1f120bea 100644 --- a/docs/platforms/javascript/guides/elysia/index.mdx +++ b/docs/platforms/javascript/guides/elysia/index.mdx @@ -1,6 +1,6 @@ --- title: Elysia -description: Learn how to set up Sentry in your Elysia app to capture errors and monitor performance. +description: Learn how to set up Sentry in your Elysia app and capture your first events. sdk: sentry.javascript.elysia fallbackGuide: javascript.bun categories: @@ -27,23 +27,10 @@ You need: ## Install -Choose the features you want to configure, and this guide will show you how: - - - - - ### Install the Sentry SDK Run the command for your runtime and preferred package manager to add the Sentry SDK to your application: - - You do **not** need `@elysiajs/opentelemetry`. The `@sentry/elysia` SDK - handles all instrumentation natively. - - ```bash {tabTitle:Bun} {mdExpandTabs} bun add @sentry/elysia ``` @@ -56,25 +43,36 @@ yarn add @sentry/elysia @elysiajs/node pnpm add @sentry/elysia @elysiajs/node ``` + + You do **not** need `@elysiajs/opentelemetry`. The `@sentry/elysia` SDK + handles all instrumentation natively. + + ## Configure +**Error Monitoring** starts working as soon as you call `Sentry.init()`. **Logs** and **Application Metrics** need no extra configuration, and you'll learn how to send them in steps [#3](#send-logs) and [#4](#send-application-metrics-). +This guide also enables **Tracing**. + + + Call `Sentry.init()` before creating your Elysia app, then wrap the app with `Sentry.withElysia()` before defining routes. +The snippet also turns on: + +- Tracing: via `tracesSampleRate` + +Don't need a feature? Remove its integration and options from the snippet. + ```javascript {tabTitle:Bun} {mdExpandTabs} {filename: index.ts} import * as Sentry from "@sentry/elysia"; import { Elysia } from "elysia"; Sentry.init({ dsn: "___PUBLIC_DSN___", - // ___PRODUCT_OPTION_START___ performance - - // Set tracesSampleRate to 1.0 to capture 100% - // of transactions for tracing. - // We recommend adjusting this value in production - // Learn more at - // https://docs.sentry.io/platforms/javascript/guides/elysia/configuration/options/#tracesSampleRate + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. tracesSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ performance }); // withElysia returns the app instance, so you can chain routes directly @@ -90,15 +88,10 @@ import { node } from "@elysiajs/node"; Sentry.init({ dsn: "___PUBLIC_DSN___", - // ___PRODUCT_OPTION_START___ performance - - // Set tracesSampleRate to 1.0 to capture 100% - // of transactions for tracing. - // We recommend adjusting this value in production - // Learn more at - // https://docs.sentry.io/platforms/javascript/guides/elysia/configuration/options/#tracesSampleRate + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. tracesSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ performance }); // withElysia returns the app instance, so you can chain routes directly @@ -107,7 +100,7 @@ const app = Sentry.withElysia(new Elysia({ adapter: node() })) .listen(3000); ``` -### Customize Automatic Error Capturing (Optional) +### Customize Automatic Error Capturing The SDK captures 5xx errors automatically via a global `onError` hook. Client errors (3xx/4xx) are not captured by default. You can customize which errors are captured using the `shouldHandleError` option. @@ -121,59 +114,36 @@ const app = Sentry.withElysia(new Elysia(), { }); ``` -### Add Readable Stack Traces With Source Maps (Optional) +### Add Readable Stack Traces With Source Maps -### Control the Data You Send to Sentry (Optional) +### Control the Data You Send to Sentry -## Verify Your Setup +## Send Logs -Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. + -### Issues +If you're already logging with `console` or Consola, you can capture those logs with our console integrations. -First, let's verify that Sentry captures errors and creates issues in your Sentry project. Add the following route to your app, which triggers an error that Sentry will capture: +## Send Application Metrics -```javascript -app.get("/debug-sentry", () => { - throw new Error("My first Sentry error!"); -}); -``` + - +## Verify Your Setup -### Tracing +Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. -To test your tracing configuration, update the previous code snippet by starting a trace to measure the time it takes for the execution of your code: +Add a route to your app that throws an error: ```javascript -app.get("/debug-sentry", async () => { - await Sentry.startSpan( - { - op: "test", - name: "My First Test Transaction", - }, - async () => { - await new Promise((resolve) => setTimeout(resolve, 100)); - throw new Error("My first Sentry error!"); - } - ); +app.get("/debug-sentry", () => { + throw new Error("Sentry Test Error"); }); ``` - - - - - - - - - - ### View Captured Data in Sentry Finally, head over to your project on [Sentry.io](https://sentry.io/) to view the collected data (it takes a couple of moments for the data to appear). @@ -182,10 +152,10 @@ Finally, head over to your project on [Sentry.io](https://sentry.io/) to view th ## Next Steps +At this point, you should have integrated Sentry into your Elysia application. Here's what to explore next: + - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup -- Learn how to manually capture errors -- Continue to customize your configuration -- Get familiar with [Sentry's product features](/product/) like tracing, insights, and alerts +- Set up Agent Tracing to monitor your AI systems diff --git a/docs/platforms/javascript/guides/ember/index.mdx b/docs/platforms/javascript/guides/ember/index.mdx index ba92dfd4ed7fa..4a12916733b9e 100644 --- a/docs/platforms/javascript/guides/ember/index.mdx +++ b/docs/platforms/javascript/guides/ember/index.mdx @@ -106,44 +106,13 @@ export default { initialize }; ## Send Logs -Use `Sentry.logger` to send logs at different levels, such as `info`, `warn`, or `error`. -You can pass any attributes you want and search or filter by them later. + -If you're already logging with `console` or [Consola](https://github.com/unjs/consola), you can capture those logs with our console integrations. - -See Set Up Logs for all available logging methods and the syntax for formatting messages. - -```javascript -Sentry.logger.info("User example action completed"); - -Sentry.logger.warn("Slow operation detected", { - operation: "data_fetch", - duration: 3500, -}); - -Sentry.logger.error("Validation failed", { - form_field: "email", - reason: "Invalid email", -}); -``` +If you're already logging with `console` or Consola, you can capture those logs with our console integrations. ## Send Application Metrics -Use `Sentry.metrics` to send counters, gauges, and distributions from your app to Sentry. -You can pass any attributes you want and search or filter by them later. - -See Set Up Metrics for all available metric types and configuration options. - -```javascript -Sentry.metrics.count("checkout.failed", 1); - -Sentry.metrics.gauge("time_since_refresh", 4, { unit: "hour" }); - -Sentry.metrics.distribution("api_latency", 187, { - unit: "millisecond", - attributes: { endpoint: "/api/orders" }, -}); -``` + ## Verify Your Setup @@ -185,7 +154,6 @@ Now, head over to your project on [Sentry.io](https://sentry.io) to view the col At this point, you should have integrated Sentry into your Ember application. Here's what to explore next: - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup -- Set up Agent Tracing to monitor your AI systems - Set up tunneling to avoid ad blockers from blocking Sentry events diff --git a/docs/platforms/javascript/guides/express/index.mdx b/docs/platforms/javascript/guides/express/index.mdx index c495ee6e41d74..059dcbfb2b745 100644 --- a/docs/platforms/javascript/guides/express/index.mdx +++ b/docs/platforms/javascript/guides/express/index.mdx @@ -1,6 +1,6 @@ --- title: Express -description: "Learn how to manually set up Sentry in your Express app and capture your first errors." +description: "Learn how to manually set up Sentry in your Express app and capture your first events." sdk: sentry.javascript.node fallbackGuide: javascript.node categories: diff --git a/docs/platforms/javascript/guides/fastify/index.mdx b/docs/platforms/javascript/guides/fastify/index.mdx index d7aecbc64fde8..8635ad6a08605 100644 --- a/docs/platforms/javascript/guides/fastify/index.mdx +++ b/docs/platforms/javascript/guides/fastify/index.mdx @@ -1,6 +1,6 @@ --- title: Fastify -description: "Learn how to manually set up Sentry in your Fastify app and capture your first errors." +description: "Learn how to manually set up Sentry in your Fastify app and capture your first events." sdk: sentry.javascript.node fallbackGuide: javascript.node categories: diff --git a/docs/platforms/javascript/guides/firebase/index.mdx b/docs/platforms/javascript/guides/firebase/index.mdx index 62a9a51256449..0f9e4c37744ae 100644 --- a/docs/platforms/javascript/guides/firebase/index.mdx +++ b/docs/platforms/javascript/guides/firebase/index.mdx @@ -1,6 +1,6 @@ --- title: Cloud Functions for Firebase -description: Learn how to set up Sentry in your Cloud Functions for Firebase project and capture your first errors. +description: Learn how to set up Sentry in your Cloud Functions for Firebase project and capture your first events. sdk: sentry.javascript.node fallbackGuide: javascript.node categories: @@ -28,36 +28,10 @@ This integration is enabled by default, so you get automatic performance monitor ## Install -Choose the features you want to configure, and this guide will show you how: - - - - - ### Install the Sentry SDK Run the command for your preferred package manager to add the Sentry SDK to your Firebase Functions project: - - -```bash {tabTitle:npm} -npm install @sentry/node --save -``` - -```bash {tabTitle:yarn} -yarn add @sentry/node -``` - -```bash {tabTitle:pnpm} -pnpm add @sentry/node -``` - - - - - ```bash {tabTitle:npm} npm install @sentry/node @sentry/profiling-node --save ``` @@ -70,46 +44,41 @@ yarn add @sentry/node @sentry/profiling-node pnpm add @sentry/node @sentry/profiling-node ``` - - ## Configure +**Error Monitoring** starts working as soon as you call `Sentry.init()`. **Logs** and **Application Metrics** need no extra configuration, and you'll learn how to send them in steps [#3](#send-logs) and [#4](#send-application-metrics-). +This guide also enables **Tracing** and **Profiling**. + + + Create an initialization file (for example, `instrument.js`) that imports and initializes Sentry. +The snippet also turns on: + +- Tracing: via `tracesSampleRate` +- Profiling: via `profileSessionSampleRate`, `profileLifecycle`, and the profiling integration + +Don't need a feature? Remove its integration and options from the snippet. + ```javascript {filename:instrument.js} const Sentry = require("@sentry/node"); -// ___PRODUCT_OPTION_START___ profiling const { nodeProfilingIntegration } = require("@sentry/profiling-node"); -// ___PRODUCT_OPTION_END___ profiling Sentry.init({ dsn: "___PUBLIC_DSN___", - - // ___PRODUCT_OPTION_START___ profiling - integrations: [ - // Add our Profiling integration + // enables Profiling nodeProfilingIntegration(), ], - // ___PRODUCT_OPTION_END___ profiling - // ___PRODUCT_OPTION_START___ performance - - // Add Tracing by setting tracesSampleRate - // Set tracesSampleRate to 1.0 to capture 100% of transactions - // We recommend adjusting this value in production - // Learn more at - // https://docs.sentry.io/platforms/javascript/configuration/options/#traces-sample-rate + + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. tracesSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ performance - // ___PRODUCT_OPTION_START___ profiling - // Enable profiling for a percentage of sessions - // Learn more at - // https://docs.sentry.io/platforms/javascript/configuration/options/#profileSessionSampleRate + // Enables Profiling for every session. profileSessionSampleRate: 1.0, - // Profile automatically while there's an active sampled span profileLifecycle: "trace", - // ___PRODUCT_OPTION_END___ profiling }); ``` @@ -142,68 +111,48 @@ exports.onUserCreated = onDocumentCreated("users/{userId}", async (event) => { }); ``` -### Add Readable Stack Traces With Source Maps (Optional) +### Add Readable Stack Traces With Source Maps -### Control the Data You Send to Sentry (Optional) +### Control the Data You Send to Sentry -## Verify Your Setup +## Send Logs -Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. + -### Issues +If you're already logging with another library, use an integration to capture those logs as Sentry Logs automatically: +- `consoleLoggingIntegration` for `console` calls +- Consola +- Pino -Add a test function that throws an error to verify Sentry is capturing errors: +## Send Application Metrics -```javascript {filename:index.js} -require("./instrument"); // Import Sentry initialization first -const { onRequest } = require("firebase-functions/https"); - -exports.testSentry = onRequest(async (request, response) => { - throw new Error("Sentry Test Error - This is intentional!"); -}); -``` + -Deploy your functions and trigger the test endpoint: +On Node.js, `nodeRuntimeMetricsIntegration` also collects runtime health metrics automatically. -```bash -firebase deploy --only functions -curl https://-.cloudfunctions.net/testSentry -``` - - +## Verify Your Setup -### Tracing +Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. -Firebase Functions are automatically instrumented for tracing. You can also create custom spans: +Add a test function that throws an error, deploy your functions, and trigger the test endpoint: ```javascript {filename:index.js} require("./instrument"); -const Sentry = require("@sentry/node"); const { onRequest } = require("firebase-functions/https"); -exports.tracedFunction = onRequest(async (request, response) => { - await Sentry.startSpan({ op: "task", name: "My Custom Task" }, async () => { - // Simulate some work - await new Promise((resolve) => setTimeout(resolve, 100)); - }); - - response.send("Done!"); +exports.testSentry = onRequest(async () => { + throw new Error("Sentry Test Error"); }); ``` - - - - - - - - - +```bash +firebase deploy --only functions +curl https://-.cloudfunctions.net/testSentry +``` ### View Captured Data in Sentry @@ -213,14 +162,11 @@ Now, head over to your project on [Sentry.io](https://sentry.io/) to view the co ## Next Steps -At this point, you should have integrated Sentry into your Cloud Functions for Firebase project. - -Now's a good time to customize your setup and look into more advanced topics: +At this point, you should have integrated Sentry into your Cloud Functions for Firebase application. Here's what to explore next: - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup -- Continue to customize your configuration -- Learn how to manually capture errors -- Get familiar with [Sentry's product features](/product/) like tracing, insights, and alerts +- Set up Agent Tracing to monitor your AI systems +- Explore Tracing to learn how to inspect application performance diff --git a/docs/platforms/javascript/guides/gatsby/index.mdx b/docs/platforms/javascript/guides/gatsby/index.mdx index 1e077dfe392fd..ec585fdbbe0d2 100644 --- a/docs/platforms/javascript/guides/gatsby/index.mdx +++ b/docs/platforms/javascript/guides/gatsby/index.mdx @@ -1,7 +1,7 @@ --- title: Gatsby sdk: "sentry.javascript.gatsby" -description: "Learn how to set up Sentry in your Gatsby application, capture your first errors and traces, and view them in Sentry." +description: "Learn how to set up Sentry in your Gatsby application and capture your first events." categories: - browser - browser-only @@ -19,7 +19,7 @@ Run the command for your preferred package manager to add the Sentry SDK to your -`@sentry/gatsby` is a wrapper around the `@sentry/react` package, with additional Gatsby-specific functionality. This means that you can import all methods available in the `@sentry/react` package from `@sentry/gatsby`. +`@sentry/gatsby` is a wrapper around the `@sentry/react` package, with additional Gatsby-specific functionality. You can import all methods available in `@sentry/react` from `@sentry/gatsby`. @@ -56,7 +56,7 @@ const config: GatsbyConfig = { plugins: [ // ... { - resolve: "@sentry/gatsby" + resolve: "@sentry/gatsby", }, ], }; @@ -66,131 +66,92 @@ export default config; ## Configure -Choose the features you want to configure, and this guide will show you how: - - +**Error Monitoring** starts working as soon as you call `Sentry.init()`. **Logs** and **Application Metrics** need no extra configuration, and you'll learn how to send them in steps [#3](#send-logs) and [#4](#send-application-metrics-). +This guide also enables **Tracing**, **Session Replay**, and **User Feedback**. -### Initialize the Sentry SDK +### Initialize the SDK + +Initialize Sentry as early as possible in your application. Create a `sentry.config.(js|ts)` file in your project root and add the following code. + +The snippet also turns on: + +- Tracing: via `browserTracingIntegration()` and `tracesSampleRate` +- Session Replay: via `replayIntegration()`, sampled with `replaysSessionSampleRate` and `replaysOnErrorSampleRate` +- User Feedback: via `feedbackIntegration()` -Initialize Sentry as early as possible in your application. For this, create a new file `sentry.config.(js|ts)` in your project root and add the following: +Don't need a feature? Remove its integration and options from the snippet. ```javascript {filename:sentry.config.(js|ts)} import * as Sentry from "@sentry/gatsby"; Sentry.init({ dsn: "___PUBLIC_DSN___", - integrations: [ - // ___PRODUCT_OPTION_START___ performance + // enables automatic instrumentation Sentry.browserTracingIntegration(), - // ___PRODUCT_OPTION_END___ performance - // ___PRODUCT_OPTION_START___ session-replay + // enables Session Replay Sentry.replayIntegration(), - // ___PRODUCT_OPTION_END___ session-replay - // ___PRODUCT_OPTION_START___ user-feedback + // enables User Feedback Sentry.feedbackIntegration({ - // Additional SDK configuration goes in here, for example: + // Additional integration configuration goes in here colorScheme: "system", }), - // ___PRODUCT_OPTION_END___ user-feedback ], - // ___PRODUCT_OPTION_START___ performance - // Set tracesSampleRate to 1.0 to capture 100% - // of transactions for tracing. - // We recommend adjusting this value in production - // Learn more at - // https://docs.sentry.io/platforms/javascript/configuration/options/#traces-sample-rate + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. tracesSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ performance - // ___PRODUCT_OPTION_START___ session-replay - // Capture Replay for 10% of all sessions, + // Set trace propagation targets for your API requests + tracePropagationTargets: ["localhost", /^https:\/\/yourserver\.io\/api/], + + // Capture replays for 10% of all sessions, // plus for 100% of sessions with an error - // Learn more at - // https://docs.sentry.io/platforms/javascript/session-replay/configuration/#general-integration-configuration + // Requires Sentry.replayIntegration() replaysSessionSampleRate: 0.1, replaysOnErrorSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ session-replay }); ``` -### Add Readable Stack Traces With Source Maps (Optional) +### Add Readable Stack Traces With Source Maps -### Avoid Ad Blockers With Tunneling (Optional) - - - -### Control the Data You Send to Sentry (Optional) +### Control the Data You Send to Sentry -## Verify Your Setup - -Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. - -### Issues +## Send Logs -To verify that Sentry captures errors and creates issues in your Sentry project, add the following test button to one of your pages. + - - Then, open the page in a browser and click the button to trigger a frontend - error. - +If you're already logging with `console` or Consola, you can capture those logs with our console integrations. - +## Send Application Metrics -```javascript {filename:index.(jsx|tsx)} - -``` + - -### Tracing +## Verify Your Setup -To test your tracing configuration, update the previous code snippet and wrap the error in a custom span. +Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. -Then, open the page in a browser and click the button to trigger a frontend error and trace. +Add a test button to one of your pages. Clicking it will trigger an error for Sentry to capture. ```javascript {filename:index.(jsx|tsx)} ``` - - - - - - - - - + ### View Captured Data in Sentry @@ -200,16 +161,14 @@ Now, head over to your project on [Sentry.io](https://sentry.io/) to view the co ## Next Steps -At this point, you should have integrated Sentry into your Gatsby application and should already be sending data to your Sentry project. - -Now's a good time to customize your setup and look into more advanced topics. Our next recommended steps for you are: +At this point, you should have integrated Sentry into your Gatsby application. Here's what to explore next: - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup -- Extend Sentry to your backend using one of our [SDKs](/) -- Continue to customize your configuration -- Learn how to manually capture errors +- Set up Agent Tracing to monitor your AI systems +- Set up tunneling to avoid ad blockers from blocking Sentry events + - Find various topics in Troubleshooting - [Get support](https://www.sentry.help/en/) diff --git a/docs/platforms/javascript/guides/gcp-functions/index.mdx b/docs/platforms/javascript/guides/gcp-functions/index.mdx index 614ddfa02ed63..e75d73a0e3621 100644 --- a/docs/platforms/javascript/guides/gcp-functions/index.mdx +++ b/docs/platforms/javascript/guides/gcp-functions/index.mdx @@ -1,6 +1,6 @@ --- title: Google Cloud Functions -description: "Learn how to manually set up Sentry in your Google Cloud Functions and capture your first errors." +description: "Learn how to manually set up Sentry in your Google Cloud Functions and capture your first events." sdk: sentry.javascript.google-cloud-serverless fallbackGuide: javascript.node categories: @@ -26,14 +26,6 @@ categories: ## Install -Choose the features you want to configure, and this guide will show you how: - - - - - ### Install the Sentry SDK Run the command for your preferred package manager to add the Sentry SDK to your application: @@ -42,98 +34,128 @@ Run the command for your preferred package manager to add the Sentry SDK to your ## Configure -Make sure to initialize Sentry at the top of your function code and wrap each function with the appropriate helper. Select the tab that matches the kind of function you're using (HTTP, Background, or CloudEvent): - - +**Error Monitoring** starts working as soon as you call `Sentry.init()`. **Logs** and **Application Metrics** need no extra configuration, and you'll learn how to send them in steps [#3](#send-logs) and [#4](#send-application-metrics-). +This guide also enables **Tracing** and **Profiling**. -### Add Readable Stack Traces With Source Maps (Optional) - - - -### Control the Data You Send to Sentry (Optional) + - +Make sure to initialize Sentry at the top of your function code and wrap each function with the appropriate helper. -## Verify Your Setup +The snippet also turns on: -Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. +- Tracing: via `tracesSampleRate` +- Profiling: via `profileSessionSampleRate`, `profileLifecycle`, and the profiling integration -### Issues +Don't need a feature? Remove its integration and options from the snippet. -Let's verify that Sentry captures errors and creates issues in your Sentry project. Add an intentional error in your function: +Select the tab that matches the kind of function you're using (HTTP, Background, or CloudEvent): ```javascript {tabTitle:Http functions} {mdExpandTabs} +const Sentry = require("@sentry/google-cloud-serverless"); +const { nodeProfilingIntegration } = require("@sentry/profiling-node"); + +Sentry.init({ + dsn: "___PUBLIC_DSN___", + integrations: [ + // enables Profiling + nodeProfilingIntegration(), + ], + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. + tracesSampleRate: 1.0, + // Enables Profiling for every session. + profileSessionSampleRate: 1.0, + profileLifecycle: "trace", +}); + exports.helloHttp = Sentry.wrapHttpFunction((req, res) => { - throw new Error("Sentry Test Error - This is intentional!"); + throw new Error("oh, hello there!"); }); ``` ```javascript {tabTitle:Background functions} -exports.helloBackground = Sentry.wrapEventFunction( - (data, context, callback) => { - throw new Error("Sentry Test Error - This is intentional!"); - } -); +const Sentry = require("@sentry/google-cloud-serverless"); +const { nodeProfilingIntegration } = require("@sentry/profiling-node"); + +Sentry.init({ + dsn: "___PUBLIC_DSN___", + integrations: [ + // enables Profiling + nodeProfilingIntegration(), + ], + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. + tracesSampleRate: 1.0, + // Enables Profiling for every session. + profileSessionSampleRate: 1.0, + profileLifecycle: "trace", +}); + +exports.helloEvents = Sentry.wrapEventFunction((data, context, callback) => { + throw new Error("oh, hello there!"); +}); ``` ```javascript {tabTitle:CloudEvent functions} +const Sentry = require("@sentry/google-cloud-serverless"); +const { nodeProfilingIntegration } = require("@sentry/profiling-node"); + +Sentry.init({ + dsn: "___PUBLIC_DSN___", + integrations: [ + // enables Profiling + nodeProfilingIntegration(), + ], + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. + tracesSampleRate: 1.0, + // Enables Profiling for every session. + profileSessionSampleRate: 1.0, + profileLifecycle: "trace", +}); + exports.helloEvents = Sentry.wrapCloudEventFunction((context, callback) => { - throw new Error("Sentry Test Error - This is intentional!"); + throw new Error("oh, hello there!"); }); ``` - -### Tracing +### Add Readable Stack Traces With Source Maps + + -To test tracing, wrap your code in a span: +### Control the Data You Send to Sentry -```javascript {tabTitle:Http functions} {mdExpandTabs} -exports.helloHttp = Sentry.wrapHttpFunction(async (req, res) => { - await Sentry.startSpan( - { op: "test", name: "My First Test Transaction" }, - async () => { - // Simulate some work - await new Promise((resolve) => setTimeout(resolve, 100)); - } - ); - - res.status(200).send("Success!"); -}); -``` + -```javascript {tabTitle:Background functions} -exports.helloBackground = Sentry.wrapEventFunction(async (data, context) => { - await Sentry.startSpan( - { op: "test", name: "My First Test Transaction" }, - async () => { - // Simulate some work - await new Promise((resolve) => setTimeout(resolve, 100)); - } - ); -}); -``` +## Send Logs -```javascript {tabTitle:CloudEvent functions} -exports.helloEvent = Sentry.wrapCloudEventFunction(async (context) => { - await Sentry.startSpan( - { op: "test", name: "My First Test Transaction" }, - async () => { - // Simulate some work - await new Promise((resolve) => setTimeout(resolve, 100)); - } - ); -}); -``` + + +If you're already logging with another library, use an integration to capture those logs as Sentry Logs automatically: +- `consoleLoggingIntegration` for `console` calls +- Consola +- Pino + +## Send Application Metrics - + - +On Node.js, `nodeRuntimeMetricsIntegration` also collects runtime health metrics automatically. + +## Verify Your Setup - +Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. - +Add an intentional error to a wrapped function, then invoke it to verify that Sentry captures the error: - +```javascript +exports.helloHttp = Sentry.wrapHttpFunction((req, res) => { + throw new Error("Sentry Test Error"); +}); +``` ### View Captured Data in Sentry @@ -143,14 +165,11 @@ Now, head over to your project on [Sentry.io](https://sentry.io/) to view the co ## Next Steps -At this point, you should have integrated Sentry into your Google Cloud Platform functions, which should already be sending data to your Sentry project. - -Now's a good time to customize your setup and look into more advanced topics. Our next recommended steps for you are: +At this point, you should have integrated Sentry into your Google Cloud Functions application. Here's what to explore next: - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup -- Continue to customize your configuration -- Learn how to manually capture errors -- Get familiar with [Sentry's product features](/product/) like tracing, insights, and alerts +- Set up Agent Tracing to monitor your AI systems +- Explore Tracing to learn how to inspect application performance diff --git a/docs/platforms/javascript/guides/hapi/index.mdx b/docs/platforms/javascript/guides/hapi/index.mdx index d7196e2d78d27..9c3a092676880 100644 --- a/docs/platforms/javascript/guides/hapi/index.mdx +++ b/docs/platforms/javascript/guides/hapi/index.mdx @@ -1,6 +1,6 @@ --- title: Hapi -description: "Learn how to manually set up Sentry in your Hapi app and capture your first errors." +description: "Learn how to manually set up Sentry in your Hapi app and capture your first events." sdk: sentry.javascript.node fallbackGuide: javascript.node categories: diff --git a/docs/platforms/javascript/guides/hono/index.mdx b/docs/platforms/javascript/guides/hono/index.mdx index e6dc2483d43e7..6dde32ed42f7b 100644 --- a/docs/platforms/javascript/guides/hono/index.mdx +++ b/docs/platforms/javascript/guides/hono/index.mdx @@ -1,6 +1,6 @@ --- title: Hono -description: "Learn how to set up Sentry in your Hono app and capture your first errors." +description: "Learn how to set up Sentry in your Hono app and capture your first events." sdk: sentry.javascript.hono fallbackGuide: javascript.node categories: @@ -26,14 +26,6 @@ The community middleware `@hono/sentry` has been deprecated in favor of `@sentry ## Install -Choose the features you want to configure, and this guide will show you how: - - - - - ### Install the Sentry SDK Install the `@sentry/hono` package: @@ -70,8 +62,6 @@ npm install @sentry/bun deno add npm:@sentry/deno ``` - - ### Install the Profiling Package (Node.js Only) Profiling is only available for the Node.js runtime. Install the `@sentry/profiling-node` package: @@ -88,10 +78,13 @@ yarn add @sentry/profiling-node pnpm add @sentry/profiling-node ``` - - ## Configure +**Error Monitoring** starts working as soon as you configure the `sentry()` middleware or call `Sentry.init()` for Node.js. **Logs** and **Application Metrics** need no extra configuration, and you'll learn how to send them in steps [#3](#send-logs) and [#4](#send-application-metrics-). +This guide also enables **Tracing** and **Profiling**. Profiling is available only when you use the Node.js runtime. + + + If you're deploying to Cloudflare Workers, set the `nodejs_compat` compatibility flag. The SDK needs `AsyncLocalStorage`, which requires this flag. @@ -112,38 +105,34 @@ compatibility_flags = ["nodejs_compat"] Node.js requires Sentry to initialize before your application loads so it can instrument third-party libraries (like database clients). Create a separate initialization file: +The snippet also turns on: + +- Tracing: via `tracesSampleRate` +- Profiling: via `profileSessionSampleRate`, `profileLifecycle`, and `nodeProfilingIntegration()` + +Don't need a feature? Remove its integration and options from the snippet. + ```typescript {filename:instrument.mjs} // IMPORTANT: import from `@sentry/hono/node`, not `@sentry/node` import * as Sentry from "@sentry/hono/node"; -// ___PRODUCT_OPTION_START___ profiling import { nodeProfilingIntegration } from "@sentry/profiling-node"; -// ___PRODUCT_OPTION_END___ profiling Sentry.init({ dsn: "___PUBLIC_DSN___", - // ___PRODUCT_OPTION_START___ profiling + integrations: [ + // enables Profiling + nodeProfilingIntegration(), + ], - integrations: [nodeProfilingIntegration()], - // ___PRODUCT_OPTION_END___ profiling - // ___PRODUCT_OPTION_START___ performance - - // Set tracesSampleRate to 1.0 to capture 100% - // of spans for tracing. - // We recommend adjusting this value in production - // Learn more at - // https://docs.sentry.io/platforms/javascript/guides/hono/configuration/options/#tracesSampleRate + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. tracesSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ performance - // ___PRODUCT_OPTION_START___ profiling - // Enable profiling for a percentage of sessions - // Learn more at - // https://docs.sentry.io/platforms/javascript/configuration/options/#profileSessionSampleRate + // Enables Profiling for every session. profileSessionSampleRate: 1.0, - // Profile automatically while there's an active sampled span profileLifecycle: "trace", - // ___PRODUCT_OPTION_END___ profiling }); ``` @@ -165,6 +154,10 @@ Add the `sentry()` middleware as early as possible in your Hono app. Before continuing, make sure you've completed the runtime-specific steps above: **Cloudflare Workers** users need to enable Node.js compatibility, and **Node.js** users need to create the instrument file. Since Node.js initializes Sentry in that file, the middleware doesn't take any options. +For Cloudflare Workers, Bun, and Deno, the snippet also turns on: + +- Tracing: via `tracesSampleRate` + ```typescript {tabTitle:Cloudflare Workers} {filename:index.ts} {mdExpandTabs} import { Hono } from "hono"; import { sentry } from "@sentry/hono/cloudflare"; @@ -175,12 +168,10 @@ app.use( sentry(app, { dsn: "___PUBLIC_DSN___", - // ___PRODUCT_OPTION_START___ performance - - // Set tracesSampleRate to 1.0 to capture 100% - // of spans for tracing. + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. tracesSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ performance }) ); @@ -213,12 +204,10 @@ app.use( sentry(app, { dsn: "___PUBLIC_DSN___", - // ___PRODUCT_OPTION_START___ performance - - // Set tracesSampleRate to 1.0 to capture 100% - // of spans for tracing. + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. tracesSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ performance }) ); @@ -237,12 +226,10 @@ app.use( sentry(app, { dsn: "___PUBLIC_DSN___", - // ___PRODUCT_OPTION_START___ performance - - // Set tracesSampleRate to 1.0 to capture 100% - // of spans for tracing. + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. tracesSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ performance }) ); @@ -276,17 +263,42 @@ By default, Sentry captures exceptions from Hono's `onError` handler, excluding To control which errors are captured, use the `shouldHandleError` option. -### Add Readable Stack Traces With Source Maps (Optional) +### Add Readable Stack Traces With Source Maps -### Control the Data You Send to Sentry (Optional) +### Control the Data You Send to Sentry +## Send Logs + + + +If you're already logging with another library, use an integration to capture those logs as Sentry Logs automatically: +- Node.js and Bun: `consoleLoggingIntegration` for `console` calls, Consola, and Pino +- Deno and Cloudflare Workers: `consoleLoggingIntegration` for `console` calls + +## Send Application Metrics + + + +You can also collect runtime health metrics automatically with the following integrations: +- Node.js: `nodeRuntimeMetricsIntegration` +- Bun: [`bunRuntimeMetricsIntegration`](/platforms/javascript/guides/bun/configuration/integrations/bunruntimemetrics/) +- Deno: [`denoRuntimeMetricsIntegration`](/platforms/javascript/guides/deno/configuration/integrations/denoruntimemetrics/) + ## Verify Your Setup - +Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. + +Add a test route to your Hono app that throws an error, then request `/debug-sentry` to trigger it: + +```typescript +app.get("/debug-sentry", () => { + throw new Error("Sentry Test Error"); +}); +``` ### View Captured Data in Sentry @@ -296,15 +308,11 @@ Now, head over to your project on [Sentry.io](https://sentry.io/) to view the co ## Next Steps -At this point, you should have Sentry integrated into your Hono application and already be sending data to your Sentry project. - -Now's a good time to customize your setup and look into more advanced topics: +At this point, you should have integrated Sentry into your Hono application. Here's what to explore next: - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup -- Learn how to manually capture errors +- Set up Agent Tracing to monitor your AI systems - Explore Hono-specific features like custom error filtering -- Continue to customize your configuration -- Get familiar with [Sentry's product features](/product/) like tracing, insights, and alerts diff --git a/docs/platforms/javascript/guides/koa/index.mdx b/docs/platforms/javascript/guides/koa/index.mdx index f8c201fc2708a..61f9b6d2450cb 100644 --- a/docs/platforms/javascript/guides/koa/index.mdx +++ b/docs/platforms/javascript/guides/koa/index.mdx @@ -1,6 +1,6 @@ --- title: Koa -description: "Learn how to manually set up Sentry in your Koa app and capture your first errors." +description: "Learn how to manually set up Sentry in your Koa app and capture your first events." sdk: sentry.javascript.node fallbackGuide: javascript.node categories: diff --git a/docs/platforms/javascript/guides/nestjs/index.mdx b/docs/platforms/javascript/guides/nestjs/index.mdx index 9a8aef2cc21a2..2b12390bc90f7 100644 --- a/docs/platforms/javascript/guides/nestjs/index.mdx +++ b/docs/platforms/javascript/guides/nestjs/index.mdx @@ -1,6 +1,6 @@ --- title: Nest.js -description: "Learn how to set up Sentry in your Nest.js app and capture your first errors." +description: "Learn how to set up Sentry in your Nest.js app and capture your first events." sdk: sentry.javascript.nestjs fallbackGuide: javascript.node categories: @@ -16,14 +16,6 @@ categories: ## Install -Choose the features you want to configure, and this guide will show you how: - - - - - ### Install the Sentry SDK Run the command for your preferred package manager to add the Sentry SDK to your application: @@ -32,11 +24,42 @@ Run the command for your preferred package manager to add the Sentry SDK to your ## Configure +**Error Monitoring** starts working as soon as you call `Sentry.init()`. **Logs** and **Application Metrics** need no extra configuration, and you'll learn how to send them in steps [#5](#send-logs) and [#6](#send-application-metrics-). +This guide also enables **Tracing** and **Profiling**. + + + ### Initialize the Sentry SDK -To import and initialize Sentry, create a file named `instrument.ts` in the root directory of your project and add the following code: +To import and initialize Sentry, create a file named `instrument.ts` in the root directory of your project and add the code snippet shown below. + +The snippet also turns on: + +- Tracing: via `tracesSampleRate` +- Profiling: via `profileSessionSampleRate`, `profileLifecycle`, and the profiling integration - +Don't need a feature? Remove its integration and options from the snippet. + +```typescript {filename: instrument.ts} +import * as Sentry from "@sentry/nestjs"; +import { nodeProfilingIntegration } from "@sentry/profiling-node"; + +// Ensure to call this before requiring any other modules! +Sentry.init({ + dsn: "___PUBLIC_DSN___", + integrations: [ + // enables Profiling + nodeProfilingIntegration(), + ], + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. + tracesSampleRate: 1.0, + // Enables Profiling for every session. + profileSessionSampleRate: 1.0, + profileLifecycle: "trace", +}); +``` ### Apply Instrumentation to Your App @@ -76,8 +99,11 @@ import { AppService } from "./app.service"; }) export class AppModule {} ``` +### Control the Data You Send to Sentry + + -### Add Readable Stack Traces With Source Maps (Optional) +### Add Readable Stack Traces With Source Maps @@ -85,19 +111,34 @@ export class AppModule {} -## Isolate Async Context for Background Jobs (Optional) +## Isolate Async Context for Background Jobs Sentry automatically isolates background jobs using `@Cron()`, `@Interval()`, `@Timeout()`, `@OnEvent()`, and BullMQ `@Processor()` handlers. For other background tasks, wrap your handlers with `Sentry.withIsolationScope()` to prevent breadcrumbs and tags from leaking into unrelated events. See Isolate Background Job Scopes for details and code examples. -## Control the Data You Send to Sentry (Optional) +## Send Logs - + + +If you're already logging with another library, use an integration to capture those logs as Sentry Logs automatically: +- `consoleLoggingIntegration` for `console` calls +- Consola +- Pino + +## Send Application Metrics + + + +On Node.js, `nodeRuntimeMetricsIntegration` also collects runtime health metrics automatically. ## Verify Your Setup Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. - +Add an intentional error to a NestJS route handler and make a request to it: + +```typescript +throw new Error("Sentry Test Error"); +``` ### View Captured Data in Sentry @@ -107,20 +148,14 @@ Now, head over to your project on [Sentry.io](https://sentry.io/) to view the co ## Next Steps -At this point, you should have integrated Sentry into your Nest.js application and should already be sending data to your Sentry project. - -Now's a good time to customize your setup and look into more advanced topics. -Our next recommended steps for you are: +At this point, you should have integrated Sentry into your Nest.js application. Here's what to explore next: - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup +- Set up Agent Tracing to monitor your AI systems - Extend Sentry to your frontend using one of our [frontend SDKs](/) -- Learn how to [manually capture errors](/platforms/javascript/guides/nestjs/usage/) -- Continue to [customize your configuration](/platforms/javascript/guides/nestjs/configuration/) -- Get familiar with [Sentry's product features](/product/) like tracing, insights, and alerts -- Check out alternative installation methods - Find various topics in Troubleshooting - [Get support](https://www.sentry.help/en/) diff --git a/docs/platforms/javascript/guides/nextjs/index.mdx b/docs/platforms/javascript/guides/nextjs/index.mdx index af4d15d83054b..d5a6b14c9e06d 100644 --- a/docs/platforms/javascript/guides/nextjs/index.mdx +++ b/docs/platforms/javascript/guides/nextjs/index.mdx @@ -1,6 +1,6 @@ --- title: "Next.js" -description: Learn how to set up and configure Sentry in your Next.js application using the installation wizard, capture your first errors, logs and traces and view them in Sentry. +description: Learn how to set up Sentry in your Next.js application using the installation wizard and capture your first events. sdk: sentry.javascript.nextjs categories: - browser @@ -11,60 +11,75 @@ categories: - + ## Install -Run the Sentry wizard to automatically configure Sentry in your Next.js application: +### Run the Installation Wizard + +Run the Sentry wizard to automatically install the SDK and configure Sentry in your Next.js application: ```bash npx @sentry/wizard@latest -i nextjs ``` -The wizard will prompt you to select features. Choose the ones you want to enable: - - +The wizard asks whether you want to enable **Tracing** and **Session Replay**, route browser requests through your server to avoid ad blockers, and create an example page. To match the configuration in this guide, answer **Yes** to each. Prefer to set things up yourself? Check out the [Manual Setup](/platforms/javascript/guides/nextjs/manual-setup/) guide. -## What the Wizard Created +## Configure + +**Error Monitoring** starts working as soon as you call `Sentry.init()`. **Logs** and **Application Metrics** need no extra configuration, and you'll learn how to send them in steps [#3](#send-logs) and [#4](#send-application-metrics-). +This guide also enables **Tracing**, **Session Replay**, and **User Feedback**. + + + +### Initialize the SDK -The wizard configured Sentry for all Next.js runtime environments and created files to test your setup. +Next.js runs code in different environments, so the wizard creates a separate initialization file for each in your project's root directory (or `src` folder): -### SDK Initialization +- `instrumentation-client.ts`: runs in the browser +- `sentry.server.config.ts`: runs in the Node.js runtime +- `sentry.edge.config.ts`: runs in the Edge runtime -Next.js runs code in different environments. The wizard creates separate initialization files for each: +Use the tabs in the code box below to view each file. -- **Client** (`instrumentation-client.ts`) — Runs in the browser -- **Server** (`sentry.server.config.ts`) — Runs in Node.js -- **Edge** (`sentry.edge.config.ts`) — Runs in edge runtimes +The snippets also turn on: + +- Tracing: via `tracesSampleRate` in all three files +- Session Replay: via `replayIntegration()`, sampled with `replaysSessionSampleRate` and `replaysOnErrorSampleRate` +- User Feedback: via `feedbackIntegration()`. The wizard doesn't add this integration, so add it to `instrumentation-client.ts` yourself. + +Don't need a feature? Remove its integration and options from the snippets. ```typescript {tabTitle:Client} {mdExpandTabs} {filename:instrumentation-client.ts} import * as Sentry from "@sentry/nextjs"; Sentry.init({ dsn: "___PUBLIC_DSN___", - - // ___PRODUCT_OPTION_START___ performance - tracesSampleRate: process.env.NODE_ENV === "development" ? 1.0 : 0.1, - // ___PRODUCT_OPTION_END___ performance - // ___PRODUCT_OPTION_START___ session-replay - replaysSessionSampleRate: 0.1, - replaysOnErrorSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ session-replay integrations: [ - // ___PRODUCT_OPTION_START___ session-replay + // enables Session Replay Sentry.replayIntegration(), - // ___PRODUCT_OPTION_END___ session-replay + // enables User Feedback + Sentry.feedbackIntegration({ + // Additional integration configuration goes in here + colorScheme: "system", + }), ], + + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. + tracesSampleRate: 1.0, + + // Capture replays for 10% of all sessions, + // plus for 100% of sessions with an error + // Requires Sentry.replayIntegration() + replaysSessionSampleRate: 0.1, + replaysOnErrorSampleRate: 1.0, }); +// Instruments client-side navigations export const onRouterTransitionStart = Sentry.captureRouterTransitionStart; ``` @@ -74,9 +89,10 @@ import * as Sentry from "@sentry/nextjs"; Sentry.init({ dsn: "___PUBLIC_DSN___", - // ___PRODUCT_OPTION_START___ performance - tracesSampleRate: process.env.NODE_ENV === "development" ? 1.0 : 0.1, - // ___PRODUCT_OPTION_END___ performance + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. + tracesSampleRate: 1.0, }); ``` @@ -86,21 +102,16 @@ import * as Sentry from "@sentry/nextjs"; Sentry.init({ dsn: "___PUBLIC_DSN___", - // ___PRODUCT_OPTION_START___ performance - tracesSampleRate: process.env.NODE_ENV === "development" ? 1.0 : 0.1, - // ___PRODUCT_OPTION_END___ performance + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. + tracesSampleRate: 1.0, }); ``` - - -The example above samples 100% of traces in development and 10% in production. Monitor your [usage stats](https://sentry.io/orgredirect/organizations/:orgslug/settings/stats/?dataCategory=spans) and adjust `tracesSampleRate` based on your traffic volume. Learn more about [sampling configuration](/platforms/javascript/guides/nextjs/configuration/sampling/). - - - -### Server-Side Registration +### Register the Server-Side Configuration -The `instrumentation.ts` file registers your server and edge configurations with Next.js. +The wizard creates a [Next.js instrumentation file](https://nextjs.org/docs/app/guides/instrumentation) named `instrumentation.ts`. It loads your server and edge configurations, and exports `onRequestError` to capture errors from Server Components, route handlers, and middleware. ```typescript {filename:instrumentation.ts} import * as Sentry from "@sentry/nextjs"; @@ -109,6 +120,7 @@ export async function register() { if (process.env.NEXT_RUNTIME === "nodejs") { await import("./sentry.server.config"); } + if (process.env.NEXT_RUNTIME === "edge") { await import("./sentry.edge.config"); } @@ -117,173 +129,129 @@ export async function register() { export const onRequestError = Sentry.captureRequestError; ``` -### Next.js Configuration +### Capture React Render Errors + +If you use the App Router, the wizard adds Sentry to `app/global-error.tsx` to capture React rendering errors. If you use the Pages Router, it adds Sentry to `pages/_error.tsx` instead. + + -Your `next.config.ts` is wrapped with `withSentryConfig` to enable source map uploads, tunneling (to avoid ad-blockers), and other build-time features. +### Apply Instrumentation to Your App + +The wizard wraps your Next.js configuration with `withSentryConfig`. This instruments your app at build time, uploads source maps, and, if you said yes in the wizard, routes browser requests to Sentry through your server to avoid ad blockers. ```typescript {filename:next.config.ts} +import type { NextConfig } from "next"; import { withSentryConfig } from "@sentry/nextjs/config"; +const nextConfig: NextConfig = { + // Your existing Next.js configuration +}; + export default withSentryConfig(nextConfig, { org: "___ORG_SLUG___", project: "___PROJECT_SLUG___", - // Upload source maps for readable stack traces - authToken: process.env.SENTRY_AUTH_TOKEN, - - // Route Sentry requests through your server (avoids ad-blockers) - tunnelRoute: "/sentry-tunnel", - + // Only print logs for uploading source maps in CI silent: !process.env.CI, -}); -``` -### Error Handling + // Upload a larger set of source maps for prettier stack traces (increases build time) + widenClientFileUpload: true, -The wizard creates `app/global-error.tsx` to capture React rendering errors in your App Router application. - -```tsx {filename:app/global-error.tsx} -"use client"; - -import * as Sentry from "@sentry/nextjs"; -import { useEffect } from "react"; - -export default function GlobalError({ - error, -}: { - error: Error & { digest?: string }; -}) { - useEffect(() => { - Sentry.captureException(error); - }, [error]); - - return ( - - -

Something went wrong!

- - - ); -} + // Route browser requests to Sentry through a Next.js rewrite to avoid ad blockers. + // This can increase your server load as well as your hosting bill. + tunnelRoute: "/monitoring", +}); ``` -### Source Maps +### Add Readable Stack Traces With Source Maps -The wizard creates `.env.sentry-build-plugin` with your auth token for source map uploads. This file is automatically added to `.gitignore`. +The wizard stores your auth token in `.env.sentry-build-plugin` and adds the file to `.gitignore`. The Sentry build plugin uses this token to upload source maps when you build your app locally. -For CI/CD, set the `SENTRY_AUTH_TOKEN` environment variable in your build system. +For CI/CD builds, set the `SENTRY_AUTH_TOKEN` environment variable in your build system instead. -```bash {tabTitle:Local Development} {filename:.env.sentry-build-plugin} -SENTRY_AUTH_TOKEN=sntrys_eyJ... -``` + -```bash {tabTitle:CI/CD} -# Set as environment variable in your CI/CD system -SENTRY_AUTH_TOKEN=sntrys_eyJ... +```bash {filename:.env.sentry-build-plugin} +SENTRY_AUTH_TOKEN=___ORG_AUTH_TOKEN___ ``` -### Example Page - -The wizard creates `/sentry-example-page` with a button that triggers a test error. Use this to verify your setup. - -``` -app/ -├── sentry-example-page/ -│ └── page.tsx # Test page with error button -└── api/ - └── sentry-example-api/ - └── route.ts # Test API route -``` - -## Control the Data You Send to Sentry (Optional) +### Control the Data You Send to Sentry -## Verify Your Setup - - - -The example page tests all your enabled features with a single action: - -1. Start your dev server: - -```bash -npm run dev -``` - -2. Visit [localhost:3000/sentry-example-page](http://localhost:3000/sentry-example-page) +## Send Logs -3. Click **"Throw Sample Error"** + -### Check Your Data in Sentry +If you're already logging with another library, use an integration to capture those logs as Sentry Logs automatically: -**Errors** — [Open Issues](https://sentry.io/orgredirect/organizations/:orgslug/issues/) +- `consoleLoggingIntegration` for `console` calls +- Consola +- Pino +- Winston -You should see "This is a test error" with a full stack trace pointing to your source code. +## Send Application Metrics - + -**Tracing** — [Open Traces](https://sentry.io/orgredirect/organizations/:orgslug/explore/traces/) +In the Node.js runtime, `nodeRuntimeMetricsIntegration` also collects runtime health metrics automatically. -You should see the page load trace and the button click span. Learn more about custom spans. - - +## Verify Your Setup - +Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. -**Session Replay** — [Open Replays](https://sentry.io/orgredirect/organizations/:orgslug/replays/) +The wizard created an example page that sends a test error from both your frontend and your backend: -Watch a video-like recording of your session, including the moment the error occurred. Learn more about Session Replay configuration. +1. Start your development server: - + ```bash + npm run dev + ``` - +2. Open [localhost:3000/sentry-example-page](http://localhost:3000/sentry-example-page) in your browser. +3. Click **Throw Sample Error**. -**Logs** — [Open Logs](https://sentry.io/orgredirect/organizations/:orgslug/explore/logs/) +If you skipped the example page, add a test button to one of your pages instead. Clicking it will trigger an error for Sentry to capture. -See structured log entries from your application. You can send logs from anywhere: +```tsx {filename:app/page.tsx} +"use client"; -```typescript -Sentry.logger.info("User action", { userId: "123" }); -Sentry.logger.warn("Slow response", { duration: 5000 }); -Sentry.logger.error("Operation failed", { reason: "timeout" }); +export default function Page() { + return ( + + ); +} ``` -Learn more about Logs configuration. + - +### View Captured Data in Sentry -**Application Metrics** — [Open Metrics](https://sentry.io/orgredirect/organizations/:orgslug/explore/metrics/) +Now, head over to your project on [Sentry.io](https://sentry.io/) to view the collected data (it takes a couple of moments for the data to appear). -Track and analyze custom application metrics to understand trends and patterns in your app's performance and behavior over time: + -```typescript -Sentry.metrics.count("checkout.failed", 1); -Sentry.metrics.gauge("queue.depth", 42); -Sentry.metrics.distribution("api_latency", 187, { - unit: "millisecond", -}); -``` +## Next Steps + +At this point, you should have integrated Sentry into your Next.js application. Here's what to explore next: -Learn more about Application Metrics. +- Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup +- Set up Agent Tracing to monitor agents built with the Vercel AI SDK, LangChain, and more +- Set up tunneling to avoid ad blockers blocking Sentry events, if you didn't enable it in the wizard - + - If you encountered issues with our installation wizard, try [setting up Sentry manually](/platforms/javascript/guides/nextjs/manual-setup/) -- Check [Troubleshooting](/platforms/javascript/guides/nextjs/troubleshooting/) for common issues -- [Get support](https://sentry.io/support/) +- Find various topics in Troubleshooting +- [Get support](https://www.sentry.help/en/) -## Next Steps - -You've successfully integrated Sentry into your Next.js application! Here's what to explore next: - -- Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup -- [Logs Integrations](/platforms/javascript/guides/nextjs/logs/#integrations) - Connect popular logging libraries like Pino, Winston, and Bunyan -- [Distributed Tracing](/platforms/javascript/guides/nextjs/tracing/distributed-tracing/) - Trace requests across services and microservices -- [Agent Tracing](/platforms/javascript/guides/nextjs/agent-tracing/) - Monitor agents built with Vercel AI SDK, LangChain, and more -- [Connect GitHub + Seer](/integrations/source-code-mgmt/github/#installing-github) - Enable AI-powered [root cause analysis](/product/ai-in-sentry/seer/) by connecting your GitHub repository -- [Configuration Options](/platforms/javascript/guides/nextjs/configuration/) - Explore extended SDK configuration options - - + diff --git a/docs/platforms/javascript/guides/nitro/index.mdx b/docs/platforms/javascript/guides/nitro/index.mdx index 9c6e727ddcfd7..35f5abe881f79 100644 --- a/docs/platforms/javascript/guides/nitro/index.mdx +++ b/docs/platforms/javascript/guides/nitro/index.mdx @@ -1,6 +1,6 @@ --- title: Nitro -description: Learn how to set up Sentry in your Nitro app to capture errors and monitor performance. +description: Learn how to set up Sentry in your Nitro app, capture your first events, and monitor performance. sdk: sentry.javascript.nitro fallbackGuide: javascript.node categories: @@ -20,20 +20,12 @@ You need: - A Sentry [account](https://sentry.io/signup/) and [project](/product/projects/) - A Nitro application (`3.0.260415-beta` or newer) -- Node.js 20.19.0+ +- Node.js `20.19.0+` ## Install -Choose the features you want to configure, and this guide will show you how: - - - - - ### Install the Sentry SDK Run the command for your preferred package manager to add the Sentry SDK to your application: @@ -50,8 +42,17 @@ yarn add @sentry/nitro pnpm add @sentry/nitro ``` + +The SDK is a wrapper around `@sentry/node` and re-exports its full API. All Node.js instrumentation from `@sentry/node` (HTTP clients, databases, etc.) works out of the box, and the Nitro-specific tracing channels add parameterized routes and middleware spans on top. + + ## Configure +**Error Monitoring** starts working as soon as you call `Sentry.init()`. **Logs** and **Application Metrics** need no extra configuration, and you'll learn how to send them in steps [#4](#send-logs) and [#5](#send-application-metrics-). +This guide also enables **Tracing**. + + + The Nitro SDK is configured in two places: a build-time wrapper that registers a Nitro module, and a runtime file that initializes the SDK before your server starts. ### Configure the Nitro Build @@ -112,20 +113,21 @@ SENTRY_AUTH_TOKEN=___ORG_AUTH_TOKEN___ Create an `instrument.mjs` file in your project root: +The snippet also turns on: + +- Tracing: via `tracesSampleRate` + +Don't need a feature? Remove its options from the snippet. + ```javascript {filename: instrument.mjs} import * as Sentry from "@sentry/nitro"; Sentry.init({ dsn: "___PUBLIC_DSN___", - // ___PRODUCT_OPTION_START___ performance - - // Set tracesSampleRate to 1.0 to capture 100% - // of transactions for tracing. - // We recommend adjusting this value in production - // Learn more at - // https://docs.sentry.io/platforms/javascript/guides/nitro/configuration/options/#tracesSampleRate + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. tracesSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ performance }); ``` @@ -147,67 +149,11 @@ Load the instrumentation file with Node's `--import` flag before any Nitro comma } ``` -### Control the Data You Send to Sentry (Optional) +### Control the Data You Send to Sentry -## Verify Your Setup - -Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. - -### Issues - -Add a test route that throws an error, then open `/debug-sentry` in your browser (or `curl` it) to trigger the error: - -```javascript {filename: server/routes/debug-sentry.ts} -import { defineHandler } from "nitro/h3"; - -export default defineHandler(() => { - throw new Error("My first Sentry error!"); -}); -``` - - - -### Tracing - -To verify tracing, add a handler that starts a manual span: - -```javascript {filename: server/routes/debug-sentry.ts} -import { defineHandler } from "nitro/h3"; -import * as Sentry from "@sentry/nitro"; - -export default defineHandler(async () => { - await Sentry.startSpan( - { - op: "test", - name: "My First Test Transaction", - }, - async () => { - await new Promise((resolve) => setTimeout(resolve, 100)); - throw new Error("My first Sentry error!"); - } - ); -}); -``` - - - - - - - - - - - -### View Captured Data in Sentry - -Finally, head over to your project on [Sentry.io](https://sentry.io/) to view the collected data (it takes a couple of moments for the data to appear). - - - -## Features +## Automatic Instrumentation ### Automatic Error Capturing @@ -250,16 +196,49 @@ export default defineHandler(() => { }); ``` -## Runtime Behavior -The SDK is a wrapper around `@sentry/node` and re-exports its full API. All Node.js instrumentation from `@sentry/node` (HTTP clients, databases, etc.) works out of the box, and the Nitro-specific tracing channels add parameterized routes and middleware spans on top. +## Send Logs + + + +If you're already logging with another library, use an integration to capture those logs as Sentry Logs automatically: +- `consoleLoggingIntegration` for `console` calls +- Consola +- Pino + +## Send Application Metrics + + + +On Node.js, `nodeRuntimeMetricsIntegration` also collects runtime health metrics automatically. + +## Verify Your Setup + +Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. + +Add a test route that throws an error, then open `/debug-sentry` in your browser to trigger the error: + +```javascript {filename: server/routes/debug-sentry.ts} +import { defineHandler } from "nitro/h3"; + +export default defineHandler(() => { + throw new Error("Sentry Test Error"); +}); +``` + +### View Captured Data in Sentry + +Finally, head over to your project on [Sentry.io](https://sentry.io/) to view the collected data (it takes a couple of moments for the data to appear). + + ## Next Steps +At this point, you should have integrated Sentry into your Nitro application. Here's what to explore next: + - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup -- Learn how to manually capture errors -- Continue to customize your configuration -- Get familiar with [Sentry's product features](/product/) like tracing, insights, and alerts +- Set up Agent Tracing to monitor your AI systems +- Explore Tracing to learn how to inspect application performance diff --git a/docs/platforms/javascript/guides/node/index.mdx b/docs/platforms/javascript/guides/node/index.mdx index 69db24d7d47bf..989e9c7935797 100644 --- a/docs/platforms/javascript/guides/node/index.mdx +++ b/docs/platforms/javascript/guides/node/index.mdx @@ -1,6 +1,6 @@ --- title: Node.js -description: "Learn how to manually set up Sentry in your Node.js app and capture your first errors." +description: "Learn how to manually set up Sentry in your Node.js app and capture your first events." sdk: sentry.javascript.node categories: - server diff --git a/docs/platforms/javascript/guides/react-router/index.mdx b/docs/platforms/javascript/guides/react-router/index.mdx index 23739a6ab86c5..27fcb45648a80 100644 --- a/docs/platforms/javascript/guides/react-router/index.mdx +++ b/docs/platforms/javascript/guides/react-router/index.mdx @@ -1,6 +1,6 @@ --- title: React Router Framework -description: Learn how to set up and configure Sentry in your React Router application (v7.15+) using the installation wizard, capture your first errors, and view them in Sentry. +description: Learn how to set up and configure Sentry in your React Router application (v7.15+) using the installation wizard, capture your first events, and view them in Sentry. sdk: sentry.javascript.react-router categories: - browser @@ -28,162 +28,49 @@ If you're using React Router in data or declarative mode, follow the instruction + + -## Configure - -If you prefer to configure Sentry manually, here are the configuration files the wizard would create: -In addition to capturing errors, you can monitor interactions between multiple services or applications by [enabling tracing](/concepts/key-terms/tracing/). You can also get to the root of an error or performance issue faster, by watching a video-like reproduction of a user session with [session replay](/product/session-replay/web/). +## Control the Data You Send to Sentry -Select which Sentry features you'd like to install in addition to Error Monitoring to get the corresponding installation and configuration instructions below. + - +## Send Logs - + -### Client-Side Configuration - -The wizard creates a client configuration file that initializes the Sentry SDK in your browser. - -The configuration includes your DSN (Data Source Name), which connects your app to your Sentry project, and enables the features you selected during installation. - -```tsx {tabTitle:Client} {filename:entry.client.tsx} -import * as Sentry from "@sentry/react-router"; -import { startTransition, StrictMode } from "react"; -import { hydrateRoot } from "react-dom/client"; -import { HydratedRouter } from "react-router/dom"; - -Sentry.init({ - dsn: "___PUBLIC_DSN___", - - integrations: [ - // ___PRODUCT_OPTION_START___ performance - // Registers and configures the Tracing integration, - // which automatically instruments your application to monitor its - // performance, including custom React Router routing instrumentation - Sentry.reactRouterTracingIntegration(), - // ___PRODUCT_OPTION_END___ performance - // ___PRODUCT_OPTION_START___ session-replay - // Registers the Replay integration, - // which automatically captures Session Replays - Sentry.replayIntegration(), - // ___PRODUCT_OPTION_END___ session-replay - // ___PRODUCT_OPTION_START___ user-feedback - Sentry.feedbackIntegration({ - // Additional SDK configuration goes in here, for example: - colorScheme: "system", - }), - // ___PRODUCT_OPTION_END___ user-feedback - ], - // ___PRODUCT_OPTION_START___ performance - - // Set tracesSampleRate to 1.0 to capture 100% - // of transactions for tracing. - // We recommend adjusting this value in production - // Learn more at - // https://docs.sentry.io/platforms/javascript/guides/react-router/configuration/options/#traces-sample-rate - tracesSampleRate: 1.0, - - // Set `tracePropagationTargets` to declare which URL(s) should have trace propagation enabled - tracePropagationTargets: [/^\//, /^https:\/\/yourserver\.io\/api/], - // ___PRODUCT_OPTION_END___ performance - // ___PRODUCT_OPTION_START___ session-replay - - // Capture Replay for 10% of all sessions, - // plus 100% of sessions with an error - // Learn more at - // https://docs.sentry.io/platforms/javascript/guides/react-router/session-replay/configuration/#general-integration-configuration - replaysSessionSampleRate: 0.1, - replaysOnErrorSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ session-replay -}); - -startTransition(() => { - hydrateRoot( - document, - - - - ); -}); -``` +If you already use `console`, capture those calls as Sentry Logs with `consoleLoggingIntegration`. +We also provide integrations for: +- Consola +- Pino -### Server-Side Configuration - -The wizard also creates a server configuration file for Node.js runtime. - -For more advanced configuration options or to set up Sentry manually, check out our [manual setup guide](/platforms/javascript/guides/react-router/manual-setup/). - -```js {tabTitle:Server} {filename:instrument.server.mjs} -import * as Sentry from "@sentry/react-router"; -// ___PRODUCT_OPTION_START___ profiling -import { nodeProfilingIntegration } from "@sentry/profiling-node"; -// ___PRODUCT_OPTION_END___ profiling - -Sentry.init({ - dsn: "___PUBLIC_DSN___", - - // ___PRODUCT_OPTION_START___ profiling - - // Add our Profiling integration - integrations: [nodeProfilingIntegration()], - // ___PRODUCT_OPTION_END___ profiling - // ___PRODUCT_OPTION_START___ performance - // Set tracesSampleRate to 1.0 to capture 100% - // of transactions for tracing. - // We recommend adjusting this value in production - // Learn more at - // https://docs.sentry.io/platforms/javascript/guides/react-router/configuration/options/#tracesSampleRate - tracesSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ performance - // ___PRODUCT_OPTION_START___ profiling - // Enable profiling for a percentage of sessions - // Learn more at - // https://docs.sentry.io/platforms/javascript/configuration/options/#profileSessionSampleRate - profileSessionSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ profiling -}); -``` +## Send Application Metrics -### Control the Data You Send to Sentry (Optional) + - +On Node.js, `nodeRuntimeMetricsIntegration` also collects runtime health metrics automatically. ## Verify Your Setup -The `sentry init` command checks the integration files it creates or modifies before it finishes. To confirm runtime events are reaching Sentry, start your React Router app, exercise the parts of your app that should send events, and then check your Sentry project. - -If you used the React Router Framework Mode installation wizard instead, you can also verify your setup with the example page it creates: - -1. Open the example page `/sentry-example-page` in your browser. For most React Router applications, this will be at localhost. -2. Observe the example page with a button that triggers test errors. +The `sentry init` command checks the integration files it creates or modifies before it finishes. To confirm runtime events are reaching Sentry, add a test button to your app and click it: + +```tsx + +``` -Clicking the button triggers an error that Sentry captures for you. The example also demonstrates how to test performance tracing. - - - -If you used the React Router Framework Mode installation wizard, explore the example files' code in your project to understand what's happening after your button click. - - - - - ### View Captured Data in Sentry Now, head over to your project on [Sentry.io](https://sentry.io) to view the collected data (it takes a couple of moments for the data to appear). @@ -192,15 +79,11 @@ Now, head over to your project on [Sentry.io](https://sentry.io) to view the col ## Next Steps -At this point, you should have integrated Sentry into your React Router Framework application and should already be sending data to your Sentry project. - -Now's a good time to customize your setup and look into more advanced topics. -Our next recommended steps for you are: +At this point, you should have integrated Sentry into your React Router Framework application. Here's what to explore next: - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup -- Learn how to manually capture errors -- Continue to customize your configuration -- Get familiar with [Sentry's product features](/product/) like tracing, insights, and alerts +- Set up tunneling to avoid ad blockers blocking Sentry events +- Read the manual setup guide for advanced configuration diff --git a/docs/platforms/javascript/guides/react-router/manual-setup.mdx b/docs/platforms/javascript/guides/react-router/manual-setup.mdx index 37848cd2a98a0..aec0eda1e8064 100644 --- a/docs/platforms/javascript/guides/react-router/manual-setup.mdx +++ b/docs/platforms/javascript/guides/react-router/manual-setup.mdx @@ -1,7 +1,7 @@ --- title: "Manual Setup" sidebar_order: 1 -description: "Learn how to manually set up Sentry in your React Router app (v7.15+) and capture your first errors." +description: "Learn how to manually set up Sentry in your React Router app (v7.15+) and capture your first events." --- @@ -12,29 +12,8 @@ description: "Learn how to manually set up Sentry in your React Router app (v7.1 ## Install -Choose the features you want to configure, and this guide will show you how: - - - - - -### Install the Sentry SDK - Run the command for your preferred package manager to add the SDK package to your application: - - ```bash {tabTitle:npm} npm install @sentry/react-router @sentry/profiling-node ``` @@ -47,24 +26,13 @@ yarn add @sentry/react-router @sentry/profiling-node pnpm add @sentry/react-router @sentry/profiling-node ``` - - - - ```bash {tabTitle:npm} - npm install @sentry/react-router - ``` - -```bash {tabTitle:yarn} -yarn add @sentry/react-router -``` +## Configure -```bash {tabTitle:pnpm} -pnpm add @sentry/react-router -``` - +**Error Monitoring** starts working as soon as you call `Sentry.init()`. **Logs** and **Application Metrics** need no extra configuration, and you'll learn how to send them in steps [#3](#send-logs) and [#4](#send-application-metrics-). +This guide also enables **Tracing**, **Profiling**, **Session Replay**, and **User Feedback**. -## Configure + ### Expose Entry Point Files @@ -78,58 +46,54 @@ npx react-router reveal Initialize Sentry in your `entry.client.tsx` file. +The snippet also turns on: + +- Tracing: via `tracesSampleRate` and `reactRouterTracingIntegration()` +- Session Replay: via `replayIntegration()`, sampled with `replaysSessionSampleRate` and `replaysOnErrorSampleRate` +- User Feedback: via `feedbackIntegration()` + +Don't need a feature? Remove its integration and options from the snippet. + The `sentryOnError` handler integrates with React Router's [`onError` hook](https://reactrouter.com/how-to/error-reporting) to automatically capture and report client-side errors to Sentry. -```tsx {diff} {filename: entry.client.tsx} -+import * as Sentry from "@sentry/react-router"; - import { startTransition, StrictMode } from "react"; - import { hydrateRoot } from "react-dom/client"; - import { HydratedRouter } from "react-router/dom"; - -+Sentry.init({ -+ dsn: "___PUBLIC_DSN___", -+ -+ integrations: [ -+ // ___PRODUCT_OPTION_START___ performance -+ // Registers and configures the Tracing integration, -+ // which automatically instruments your application to monitor its -+ // performance, including custom React Router routing instrumentation -+ Sentry.reactRouterTracingIntegration(), -+ // ___PRODUCT_OPTION_END___ performance -+ // ___PRODUCT_OPTION_START___ session-replay -+ // Registers the Replay integration, -+ // which automatically captures Session Replays -+ Sentry.replayIntegration(), -+ // ___PRODUCT_OPTION_END___ session-replay -+ // ___PRODUCT_OPTION_START___ user-feedback -+ Sentry.feedbackIntegration({ -+ // Additional SDK configuration goes in here, for example: -+ colorScheme: "system", -+ }), -+ // ___PRODUCT_OPTION_END___ user-feedback -+ ], -+ // ___PRODUCT_OPTION_START___ performance -+ -+ // Set tracesSampleRate to 1.0 to capture 100% -+ // of transactions for tracing. -+ // We recommend adjusting this value in production -+ // Learn more at -+ // https://docs.sentry.io/platforms/javascript/guides/react-router/configuration/options/#traces-sample-rate -+ tracesSampleRate: 1.0, -+ -+ // Set `tracePropagationTargets` to declare which URL(s) should have trace propagation enabled -+ tracePropagationTargets: [/^\//, /^https:\/\/yourserver\.io\/api/], -+ // ___PRODUCT_OPTION_END___ performance -+ // ___PRODUCT_OPTION_START___ session-replay -+ -+ // Capture Replay for 10% of all sessions, -+ // plus 100% of sessions with an error -+ // Learn more at -+ // https://docs.sentry.io/platforms/javascript/guides/react-router/session-replay/configuration/#general-integration-configuration -+ replaysSessionSampleRate: 0.1, -+ replaysOnErrorSampleRate: 1.0, -+ // ___PRODUCT_OPTION_END___ session-replay -+}); +```tsx {filename: entry.client.tsx} +import * as Sentry from "@sentry/react-router"; +import { startTransition, StrictMode } from "react"; +import { hydrateRoot } from "react-dom/client"; +import { HydratedRouter } from "react-router/dom"; + +Sentry.init({ + dsn: "___PUBLIC_DSN___", + + integrations: [ + // Registers and configures the Tracing integration, + // which automatically instruments your application to monitor its + // performance, including custom React Router routing instrumentation + Sentry.reactRouterTracingIntegration(), + // Registers the Replay integration, + // which automatically captures Session Replays + Sentry.replayIntegration(), + // Registers the User Feedback integration + Sentry.feedbackIntegration({ + // Additional SDK configuration goes in here, for example: + colorScheme: "system", + }), + ], + + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. + tracesSampleRate: 1.0, + + // Set `tracePropagationTargets` to declare which URL(s) should have trace propagation enabled + tracePropagationTargets: [/^\//, /^https:\/\/yourserver\.io\/api/], + + // Capture replays for 10% of all sessions, + // plus for 100% of sessions with an error + // Requires Sentry.replayIntegration() + replaysSessionSampleRate: 0.1, + replaysOnErrorSampleRate: 1.0, +}); startTransition(() => { hydrateRoot( @@ -156,36 +120,30 @@ On unsupported Node versions, you'll only lose auto-instrumentation for lower-le -First, create a file called `instrument.server.mjs` in the root of your project to initialize Sentry: +First, create a file called `instrument.server.mjs` in the root of your project to initialize Sentry. + +The snippet also turns on: + +- Tracing: via `tracesSampleRate` +- Profiling: via `nodeProfilingIntegration()` and `profileSessionSampleRate` + +Don't need a feature? Remove its integration and options from the snippet. ```js {filename: instrument.server.mjs} import * as Sentry from "@sentry/react-router"; -// ___PRODUCT_OPTION_START___ profiling import { nodeProfilingIntegration } from "@sentry/profiling-node"; -// ___PRODUCT_OPTION_END___ profiling Sentry.init({ dsn: "___PUBLIC_DSN___", - - // ___PRODUCT_OPTION_START___ profiling - - // Add our Profiling integration + // Enables Profiling integrations: [nodeProfilingIntegration()], - // ___PRODUCT_OPTION_END___ profiling - // ___PRODUCT_OPTION_START___ performance - // Set tracesSampleRate to 1.0 to capture 100% - // of transactions for tracing. - // We recommend adjusting this value in production - // Learn more at - // https://docs.sentry.io/platforms/javascript/guides/react-router/configuration/options/#tracesSampleRate + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. tracesSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ performance - // ___PRODUCT_OPTION_START___ profiling - // Enable profiling for a percentage of sessions - // Learn more at - // https://docs.sentry.io/platforms/javascript/configuration/options/#profileSessionSampleRate + // Enables Profiling for all sessions. + // We recommend reducing this value in production. profileSessionSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ profiling }); ``` @@ -399,7 +357,7 @@ When you import the instrumentation file directly instead of using the `--import -### Add Readable Stack Traces With Source Maps (Optional) +### Add Readable Stack Traces With Source Maps The stack traces in your Sentry errors probably won't look like your actual code without unminifying them. To fix this, upload your source maps to Sentry. @@ -453,77 +411,41 @@ export default { } satisfies Config; ``` -### Avoid Ad Blockers With Tunneling (Optional) - - - -### Control the Data You Send to Sentry (Optional) +### Control the Data You Send to Sentry -## Verify Your Setup - -Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. - -### Issues - -To verify that Sentry captures errors and creates issues in your Sentry project, throw an error in a loader. - - - Then, open the route in your browser and you should trigger an error. - - - - -```tsx {filename: error.tsx} -import type { Route } from "./+types/example-page"; +## Send Logs -export async function loader() { - throw new Error("My first Sentry error!"); -} + -export default function ExamplePage() { - return
Loading this page will throw an error
; -} -``` +If you already use `console`, capture those calls as Sentry Logs with `consoleLoggingIntegration`. +We also provide integrations for: +- Consola +- Pino - -### Tracing +## Send Application Metrics -To test your tracing configuration, update the previous code snippet by starting a trace to measure the time it takes for the execution of your code. + -Then, open the route in your browser. You should start a trace and trigger an error. +On Node.js, `nodeRuntimeMetricsIntegration` also collects runtime health metrics automatically. -```tsx {filename: error.tsx} -import * as Sentry from "@sentry/react-router"; -import type { Route } from "./+types/example-page"; - -export async function loader() { - return Sentry.startSpan( - { - op: "test", - name: "My First Test Transaction", - }, - () => { - throw new Error("My first Sentry error!"); - } - ); -} +## Verify Your Setup -export default function ExamplePage() { - return
Loading this page will throw an error
; -} +The `sentry init` command checks the integration files it creates or modifies before it finishes. To confirm runtime events are reaching Sentry, add a test button to your app and click it: + +```tsx + ``` -
- - - - - - - - + ### View Captured Data in Sentry @@ -533,15 +455,11 @@ Now, head over to your project on [Sentry.io](https://sentry.io) to view the col ## Next Steps -At this point, you should have integrated Sentry into your React Router Framework application and should already be sending data to your Sentry project. - -Now's a good time to customize your setup and look into more advanced topics. -Our next recommended steps for you are: +At this point, you should have integrated Sentry into your React Router Framework application. Here's what to explore next: - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup -- Learn how to manually capture errors -- Continue to customize your configuration -- Get familiar with [Sentry's product features](/product/) like tracing, insights, and alerts +- Set up tunneling to avoid ad blockers blocking Sentry events +- Set up Agent Tracing to monitor your AI systems diff --git a/docs/platforms/javascript/guides/react/index.mdx b/docs/platforms/javascript/guides/react/index.mdx index 37adc2d852321..f44073a9ba55a 100644 --- a/docs/platforms/javascript/guides/react/index.mdx +++ b/docs/platforms/javascript/guides/react/index.mdx @@ -1,6 +1,6 @@ --- title: React -description: "Learn how to set up Sentry in your React application, capture your first errors and traces, and view them in Sentry." +description: "Learn how to set up Sentry in your React application and capture your first events." sdk: sentry.javascript.react categories: - browser @@ -23,11 +23,11 @@ This guide is for client-side React applications (SPAs) built with tools like Vi - + ## Install -Install the Sentry SDK using your preferred package manager: +Run the command for your preferred package manager to add the Sentry SDK to your application: ```bash {tabTitle:npm} npm install @sentry/react --save @@ -43,68 +43,53 @@ pnpm add @sentry/react ## Configure -Choose the features you want to configure: - - +**Error Monitoring** starts working as soon as you call `Sentry.init()`. **Logs** and **Application Metrics** need no extra configuration, and you'll learn how to send them in steps [#3](#send-logs) and [#4](#send-application-metrics-). +This guide also enables **Tracing**, **Session Replay**, and **User Feedback**. -### Initialize the Sentry SDK +### Initialize the SDK + +Create a file in your project's root directory (for example, `instrument.js`) and add your Sentry configuration. Import this file **before** any other imports in your application entry point. + +The snippet also turns on: -Create a file in your project's root directory (e.g., `instrument.js`) and add your Sentry configuration. +- Tracing: via `browserTracingIntegration()` and `tracesSampleRate`; `tracePropagationTargets` controls which API requests receive trace headers +- Session Replay: via `replayIntegration()`, sampled with `replaysSessionSampleRate` and `replaysOnErrorSampleRate` +- User Feedback: via `feedbackIntegration()` -This file must be imported **before** any other imports in your application entry point. +Don't need a feature? Remove its integration and options from the snippet. ```javascript {filename:instrument.js} import * as Sentry from "@sentry/react"; Sentry.init({ dsn: "___PUBLIC_DSN___", - integrations: [ - // ___PRODUCT_OPTION_START___ performance - // If you're using react router, use the integration for your react router version instead. - // Learn more at - // https://docs.sentry.io/platforms/javascript/guides/react/configuration/integrations/react-router/ + // enables automatic instrumentation Sentry.browserTracingIntegration(), - // ___PRODUCT_OPTION_END___ performance - // ___PRODUCT_OPTION_START___ session-replay + // enables Session Replay Sentry.replayIntegration(), - // ___PRODUCT_OPTION_END___ session-replay - // ___PRODUCT_OPTION_START___ user-feedback + // enables User Feedback Sentry.feedbackIntegration({ - // Additional SDK configuration goes in here, for example: + // Additional integration configuration goes in here colorScheme: "system", }), - // ___PRODUCT_OPTION_END___ user-feedback ], - // ___PRODUCT_OPTION_START___ performance - // Set tracesSampleRate to 1.0 to capture 100% - // of transactions for tracing. - // Learn more at - // https://docs.sentry.io/platforms/javascript/configuration/options/#traces-sample-rate + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. tracesSampleRate: 1.0, - // Set `tracePropagationTargets` to control for which URLs trace propagation should be enabled + // Set trace propagation targets for your API requests tracePropagationTargets: [/^\//, /^https:\/\/yourserver\.io\/api/], - // ___PRODUCT_OPTION_END___ performance - // ___PRODUCT_OPTION_START___ session-replay - // Capture Replay for 10% of all sessions, + // Capture replays for 10% of all sessions, // plus for 100% of sessions with an error - // Learn more at - // https://docs.sentry.io/platforms/javascript/session-replay/configuration/#general-integration-configuration + // Requires Sentry.replayIntegration() replaysSessionSampleRate: 0.1, replaysOnErrorSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ session-replay }); ``` @@ -113,7 +98,6 @@ Sentry.init({ Import your Sentry configuration as the **first import** in your application entry point, then render your app. ```javascript {filename:main.jsx} -// Sentry initialization should be imported first! import "./instrument"; import App from "./App"; import { createRoot } from "react-dom/client"; @@ -135,13 +119,13 @@ import * as Sentry from "@sentry/react"; const container = document.getElementById("app"); const root = createRoot(container, { - // Callback called when an error is thrown and not caught by an ErrorBoundary. + // Called when an error is thrown and not caught by an ErrorBoundary. onUncaughtError: Sentry.reactErrorHandler((error, errorInfo) => { console.warn("Uncaught error", error, errorInfo.componentStack); }), - // Callback called when React catches an error in an ErrorBoundary. + // Called when React catches an error in an ErrorBoundary. onCaughtError: Sentry.reactErrorHandler(), - // Callback called when React automatically recovers from errors. + // Called when React automatically recovers from errors. onRecoverableError: Sentry.reactErrorHandler(), }); root.render(); @@ -182,19 +166,17 @@ Run the Sentry wizard to configure source map uploads for your bundler: npx @sentry/wizard@latest -i sourcemaps ``` - - -### Set Up Routing (Optional) +### Set Up Routing If you're using client-side routing, configure Sentry to capture navigation events for better performance insights. -Select your router: - - [React Router v7](/platforms/javascript/guides/react/features/react-router/v7/) - [React Router v6](/platforms/javascript/guides/react/features/react-router/v6/) - [Older versions](/platforms/javascript/guides/react/features/react-router/) - [TanStack Router](/platforms/javascript/guides/react/features/tanstack-router/) +When using React Router, replace `browserTracingIntegration()` with the integration for your router version. For example: + ```javascript {filename:instrument.js} import React from "react"; import * as Sentry from "@sentry/react"; @@ -208,6 +190,7 @@ import { Sentry.init({ dsn: "___PUBLIC_DSN___", integrations: [ + // enables automatic instrumentation for React Router v7 Sentry.reactRouterV7BrowserTracingIntegration({ useEffect: React.useEffect, useLocation, @@ -215,81 +198,59 @@ Sentry.init({ createRoutesFromChildren, matchRoutes, }), + // enables Session Replay + Sentry.replayIntegration(), + // enables User Feedback + Sentry.feedbackIntegration({ + colorScheme: "system", + }), ], -}); -``` - + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. + tracesSampleRate: 1.0, + tracePropagationTargets: [/^\\//, /^https:\\/\\/yourserver\\.io\\/api/], -### Capture Redux State Data (Optional) + // Capture replays for 10% of all sessions, + // plus for 100% of sessions with an error + // Requires Sentry.replayIntegration() + replaysSessionSampleRate: 0.1, + replaysOnErrorSampleRate: 1.0, +}); +``` -Capture Redux state and actions with your errors using `Sentry.createReduxEnhancer`. +### Capture Redux State Data -Learn more about [Redux integration options](/platforms/javascript/guides/react/features/redux/). +Capture Redux state and actions with your errors using `Sentry.createReduxEnhancer`. Learn more about [Redux integration options](/platforms/javascript/guides/react/features/redux/). ```javascript {filename:store.js} import { createStore, compose } from "redux"; import * as Sentry from "@sentry/react"; const sentryEnhancer = Sentry.createReduxEnhancer(); - const store = createStore(rootReducer, compose(sentryEnhancer)); ``` -### Avoid Ad Blockers With Tunneling (Optional) - -Some ad blockers prevent Sentry events from being sent. Use the `tunnel` option to route events through your server. - -Learn more about [setting up tunneling](/platforms/javascript/guides/react/troubleshooting/#using-the-tunnel-option). - -```javascript {filename:instrument.js} -Sentry.init({ - dsn: "___PUBLIC_DSN___", - tunnel: "/tunnel", -}); -``` - -### Control the Data You Send to Sentry (Optional) +### Control the Data You Send to Sentry -## Verify Your Setup - - - -Add a test button to trigger an error, then check Sentry to confirm it's working. - -**Errors** — [Open Issues](https://sentry.io/orgredirect/organizations/:orgslug/issues/) - -You should see "Sentry Test Error" with a stack trace pointing to your source code (if source maps are configured). - - - -**Tracing** — [Open Traces](https://sentry.io/orgredirect/organizations/:orgslug/explore/traces/) +## Send Logs -You should see page load traces and the test span. Learn more about custom instrumentation. + - +If you're already logging with `console` or Consola, you can capture those logs with our console integrations. - +## Send Application Metrics -**Session Replay** — [Open Replays](https://sentry.io/orgredirect/organizations/:orgslug/replays/) + -Watch a video-like recording of your session, including the moment the error occurred. Learn more about Session Replay configuration. - - - - - -**Logs** — [Open Logs](https://sentry.io/orgredirect/organizations/:orgslug/explore/logs/) - -See structured log entries from your application. Learn more about Logs configuration. - - +## Verify Your Setup -**Application Metrics** — [Open Metrics](https://sentry.io/orgredirect/organizations/:orgslug/explore/metrics/) +Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. -Track and analyze custom application metrics to understand trends and patterns in your app's performance and behavior over time. Learn more about Application Metrics. +Add a test button to one of your components. Clicking it will trigger an error for Sentry to capture. ```javascript {filename:App.jsx} ``` - - -To test tracing, wrap the error in a span: - -```javascript - -``` - - - - - -Send logs from anywhere in your app: - -```javascript -Sentry.logger.info("User action", { userId: "123" }); -Sentry.logger.warn("Slow response", { duration: 5000 }); -Sentry.logger.error("Operation failed", { reason: "timeout" }); -``` - - + -Track metrics from anywhere in your app: +### View Captured Data in Sentry -```javascript -Sentry.metrics.count("checkout.failed", 1); -Sentry.metrics.gauge("queue.depth", 42); -Sentry.metrics.distribution("api_latency", 187, { - unit: "millisecond", -}); -``` +Now, head over to your project on [Sentry.io](https://sentry.io) to view the collected data (it takes a couple of moments for the data to appear). - + -**1. Enable debug mode** to see SDK activity in the console: - -```javascript {filename:instrument.js} -Sentry.init({ - dsn: "___PUBLIC_DSN___", - debug: true, -}); -``` +## Next Steps -**2. Check your DSN** — Ensure it's correctly copied from your [Sentry project settings](https://sentry.io/orgredirect/organizations/:orgslug/settings/projects/:projectId/keys/). +At this point, you should have integrated Sentry into your React application. Here's what to explore next: -**3. Disable ad blockers** — Some ad blockers prevent Sentry from sending events. See [tunneling](#avoid-ad-blockers-with-tunneling-optional) for a workaround. +- Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup +- Set up tunneling to avoid ad blockers from blocking Sentry events +- Explore React-specific features -**4. Check your quota** — View your [usage stats](https://sentry.io/orgredirect/organizations/:orgslug/stats/) to ensure you haven't exceeded your plan limits. + -For more help, see the Troubleshooting page. +- Find various topics in Troubleshooting +- [Get support](https://www.sentry.help/en/) -## Next Steps - -You've successfully integrated Sentry into your React application! Here's what to explore next: - -- Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup -- [Session Replay](/platforms/javascript/guides/react/session-replay/) — Watch video-like reproductions of user sessions to debug errors in context -- [Distributed Tracing](/platforms/javascript/guides/react/tracing/distributed-tracing/) — Trace requests from your React frontend to backend services -- [Connect GitHub + Seer](/integrations/source-code-mgmt/github/#installing-github) — Enable AI-powered [root cause analysis](/product/ai-in-sentry/seer/) by connecting your repository -- [Logs](/platforms/javascript/guides/react/logs/) — Send structured logs correlated with errors and traces -- [Metrics](/platforms/javascript/guides/react/metrics/) — Track custom counters, gauges, and distributions to monitor application health - - +
diff --git a/docs/platforms/javascript/guides/solid/index.mdx b/docs/platforms/javascript/guides/solid/index.mdx index edc1ad31136b1..4cfd9c1810a37 100644 --- a/docs/platforms/javascript/guides/solid/index.mdx +++ b/docs/platforms/javascript/guides/solid/index.mdx @@ -1,7 +1,7 @@ --- title: Solid sdk: sentry.javascript.solid -description: Learn how to manually set up Sentry in your Solid app and capture your first errors. +description: "Learn how to manually set up Sentry in your Solid app and capture your first events." categories: - browser - browser-only @@ -35,72 +35,59 @@ pnpm add @sentry/solid ## Configure -Choose the features you want to configure, and this guide will show you how: - - +**Error Monitoring** starts working as soon as you call `Sentry.init()`. **Logs** and **Application Metrics** need no extra configuration, and you'll learn how to send them in steps [#3](#send-logs) and [#4](#send-application-metrics-). +This guide also enables **Tracing**, **Session Replay**, and **User Feedback**. -### Initialize the Sentry SDK +### Initialize the SDK + +Initialize Sentry as early as possible in your application, for example, in your `index.(jsx|tsx)` file. + +The snippet also turns on: + +- Tracing: via `solidRouterBrowserTracingIntegration()` and `tracesSampleRate` +- Session Replay: via `replayIntegration()`, sampled with `replaysSessionSampleRate` and `replaysOnErrorSampleRate` +- User Feedback: via `feedbackIntegration()` -Initialize Sentry as early as possible in your application, for example, in your `index.(jsx|tsx)` file: +Don't need a feature? Remove its integration and options from the snippet. -```javascript {filename: index.jsx} +```javascript {filename:index.jsx} import * as Sentry from "@sentry/solid"; -// ___PRODUCT_OPTION_START___ performance import { solidRouterBrowserTracingIntegration } from "@sentry/solid/solidrouter"; -// ___PRODUCT_OPTION_END___ performance import { render } from "solid-js/web"; import { DEV } from "solid-js"; import App from "./app"; -// this will only initialize your Sentry client in production builds. +// Initialize Sentry only in production builds. if (!DEV) { Sentry.init({ dsn: "___PUBLIC_DSN___", - integrations: [ - // ___PRODUCT_OPTION_START___ performance + // enables automatic instrumentation for Solid Router solidRouterBrowserTracingIntegration(), - // ___PRODUCT_OPTION_END___ performance - // ___PRODUCT_OPTION_START___ session-replay + // enables Session Replay Sentry.replayIntegration(), - // ___PRODUCT_OPTION_END___ session-replay - // ___PRODUCT_OPTION_START___ user-feedback + // enables User Feedback Sentry.feedbackIntegration({ - // Additional SDK configuration goes in here, for example: + // Additional integration configuration goes in here colorScheme: "system", }), - // ___PRODUCT_OPTION_END___ user-feedback ], - // ___PRODUCT_OPTION_START___ performance - // Set tracesSampleRate to 1.0 to capture 100% - // of transactions for tracing. - // We recommend adjusting this value in production - // Learn more at - // https://docs.sentry.io/platforms/javascript/configuration/options/#traces-sample-rate + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. tracesSampleRate: 1.0, - // Set `tracePropagationTargets` to control for which URLs trace propagation should be enabled + // Set trace propagation targets for your API requests tracePropagationTargets: ["localhost", /^https:\/\/yourserver\.io\/api/], - // ___PRODUCT_OPTION_END___ performance - // ___PRODUCT_OPTION_START___ session-replay - // Capture Replay for 10% of all sessions, - // plus 100% of sessions with an error - // Learn more at - // https://docs.sentry.io/platforms/javascript/session-replay/configuration/#general-integration-configuration + // Capture replays for 10% of all sessions, + // plus for 100% of sessions with an error + // Requires Sentry.replayIntegration() replaysSessionSampleRate: 0.1, replaysOnErrorSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ session-replay }); } @@ -117,75 +104,42 @@ To automatically report exceptions from inside a component tree to Sentry, wrap -### Add Readable Stack Traces With Source Maps (Optional) +### Add Readable Stack Traces With Source Maps -### Avoid Ad Blockers With Tunneling (Optional) - - - -### Control the Data You Send to Sentry (Optional) +### Control the Data You Send to Sentry -## Verify Your Setup - -Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. - -### Issues +## Send Logs -To verify that Sentry captures errors and creates issues in your Sentry project, add the following test button to one of your pages. + - - Then, open the page in a browser and click the button to trigger a frontend - error. - +If you're already logging with `console` or Consola, you can capture those logs with our console integrations. - +## Send Application Metrics -```javascript - -``` + - -### Tracing +## Verify Your Setup -To test your tracing configuration, update the previous code snippet to start a trace to measure the time it takes for the execution of your code. +Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. -Then, open the page in a browser and click the button to trigger a frontend error and trace. +Add a test button to one of your components. Clicking it will trigger an error for Sentry to capture. ```javascript ``` - - - - - - - - - + ### View Captured Data in Sentry @@ -195,17 +149,14 @@ Now, head over to your project on [Sentry.io](https://sentry.io/) to view the co ## Next Steps -At this point, you should have integrated Sentry into your Solid application and should already be sending data to your Sentry project. - -Now's a good time to customize your setup and look into more advanced topics. Our next recommended steps for you are: +At this point, you should have integrated Sentry into your Solid application. Here's what to explore next: - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup -- Extend Sentry to your backend using one of our [SDKs](/) -- Continue to customize your configuration -- Make use of Solid-specific features -- Learn how to manually capture errors +- Set up tunneling to avoid ad blockers from blocking Sentry events +- Explore Solid-specific features + - Find various topics in Troubleshooting - [Get support](https://www.sentry.help/en/) diff --git a/docs/platforms/javascript/guides/solidstart/index.mdx b/docs/platforms/javascript/guides/solidstart/index.mdx index df59fca4df5dc..f7c7a9f1baade 100644 --- a/docs/platforms/javascript/guides/solidstart/index.mdx +++ b/docs/platforms/javascript/guides/solidstart/index.mdx @@ -1,6 +1,6 @@ --- title: SolidStart -description: Learn how to set up Sentry in your SolidStart application and capture your first errors. +description: Learn how to set up Sentry in your SolidStart application and capture your first events. sdk: sentry.javascript.solidstart categories: - browser @@ -24,19 +24,6 @@ This SDK is currently in **beta**. Beta features are still in progress and may h ## Install -Choose the features you want to configure, and this guide will show you how: - - - - - ### Install the Sentry SDK Run the command for your preferred package manager to add the Sentry SDK to your application: @@ -55,6 +42,11 @@ pnpm add @sentry/solidstart ## Configure +**Error Monitoring** starts working as soon as you call `Sentry.init()`. **Logs** and **Application Metrics** need no extra configuration, and you'll learn how to send them in steps [#3](#send-logs) and [#4](#send-application-metrics-). +This guide also enables **Tracing**, **Session Replay**, and **User Feedback**. + + + You need to initialize and configure the Sentry SDK in two places: the client side and the server side. @@ -65,57 +57,47 @@ The examples in this guide will use TypeScript with a `src` folder structure. Ma ### Configure Client-Side Sentry -Import and initialize the Sentry SDK in your `/src/entry-client.tsx` file. +Import and initialize the Sentry SDK in your `/src/entry-client.tsx` file. If you use Solid Router, add its tracing integration as shown below and wrap your router in the next step. + +The snippet also turns on: - - If you're using Solid Router, make sure to import and add the - `solidRouterBrowserTracingIntegration` to enable tracing in your app. - +- Tracing: via `tracesSampleRate` and `solidRouterBrowserTracingIntegration()` if you're using Solid Router +- Session Replay: via `replayIntegration()`, sampled with `replaysSessionSampleRate` and `replaysOnErrorSampleRate` +- User Feedback: via `feedbackIntegration()` + +Don't need a feature? Remove its integration and options from the snippet. ```jsx {filename:src/entry-client.tsx} import * as Sentry from "@sentry/solidstart"; -// ___PRODUCT_OPTION_START___ performance // import solidRouterBrowserTracingIntegration if you're using Solid Router import { solidRouterBrowserTracingIntegration } from "@sentry/solidstart/solidrouter"; -// ___PRODUCT_OPTION_END___ performance import { mount, StartClient } from "@solidjs/start/client"; Sentry.init({ dsn: "___PUBLIC_DSN___", integrations: [ - // ___PRODUCT_OPTION_START___ performance // add solidRouterBrowserTracingIntegration if you're using Solid Router + // enables automatic instrumentation solidRouterBrowserTracingIntegration(), - // ___PRODUCT_OPTION_END___ performance - // ___PRODUCT_OPTION_START___ session-replay - // Replay may only be enabled for the client-side + // enables Session Replay Sentry.replayIntegration(), - // ___PRODUCT_OPTION_END___ session-replay - // ___PRODUCT_OPTION_START___ user-feedback + // enables User Feedback Sentry.feedbackIntegration({ - // Additional SDK configuration goes in here, for example: + // Additional integration configuration goes in here colorScheme: "system", }), - // ___PRODUCT_OPTION_END___ user-feedback ], - // ___PRODUCT_OPTION_START___ performance - // Set tracesSampleRate to 1.0 to capture 100% - // of transactions for tracing. - // We recommend adjusting this value in production - // Learn more at - // https://docs.sentry.io/platforms/javascript/configuration/options/#traces-sample-rate + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. tracesSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ performance - // ___PRODUCT_OPTION_START___ session-replay - // Capture Replay for 10% of all sessions, + // Capture replays for 10% of all sessions, // plus for 100% of sessions with an error - // Learn more at - // https://docs.sentry.io/platforms/javascript/session-replay/configuration/#general-integration-configuration + // Requires Sentry.replayIntegration() replaysSessionSampleRate: 0.1, replaysOnErrorSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ session-replay }); mount(() => , document.getElementById("app")); @@ -125,6 +107,10 @@ mount(() => , document.getElementById("app")); Initialize Sentry on the server. On SolidStart 2, do this in a Nitro startup plugin, which runs once when the server starts. On SolidStart 1, create an `instrument.server.ts` file in your `src` folder. +The snippet also turns on: + +- Tracing: via `tracesSampleRate` + ```typescript {tabTitle:SolidStart 2} {filename:server/plugins/sentry.ts} {mdExpandTabs} import * as Sentry from "@sentry/solidstart"; import { definePlugin } from "nitro"; @@ -132,15 +118,11 @@ import { definePlugin } from "nitro"; export default definePlugin(() => { Sentry.init({ dsn: "___PUBLIC_DSN___", - // ___PRODUCT_OPTION_START___ performance - // Set tracesSampleRate to 1.0 to capture 100% - // of transactions for tracing. - // We recommend adjusting this value in production - // Learn more at - // https://docs.sentry.io/platforms/javascript/configuration/options/#traces-sample-rate + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. tracesSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ performance }); }); ``` @@ -150,15 +132,11 @@ import * as Sentry from "@sentry/solidstart"; Sentry.init({ dsn: "___PUBLIC_DSN___", - // ___PRODUCT_OPTION_START___ performance - // Set tracesSampleRate to 1.0 to capture 100% - // of transactions for tracing. - // We recommend adjusting this value in production - // Learn more at - // https://docs.sentry.io/platforms/javascript/configuration/options/#traces-sample-rate + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. tracesSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ performance }); ``` @@ -218,8 +196,6 @@ export default defineConfig( ); ``` - - ### Configure Solid Router If you're using Solid Router and the Sentry `solidRouterBrowserTracingIntegration` integration, wrap your Solid Router with `withSentryRouterRouting` to enable Sentry to collect navigation spans: @@ -240,8 +216,6 @@ export default function App() { } ``` - - ### Run Your Application On SolidStart 2, the Vite plugin instruments your dependencies at build time, so the server needs no preload flag. Build with `vite build` and start the output directly. @@ -284,7 +258,7 @@ To automatically report exceptions from inside a component tree to Sentry, wrap -### Add Readable Stack Traces With Source Maps (Optional) +### Add Readable Stack Traces With Source Maps To upload source maps for clear error stack traces, add your Sentry auth token, organization, and project slug to the Sentry plugin in your build config: @@ -345,87 +319,44 @@ SENTRY_AUTH_TOKEN="___ORG_AUTH_TOKEN___" -### Avoid Ad Blockers With Tunneling (Optional) - - - -### Control the Data You Send to Sentry (Optional) +### Control the Data You Send to Sentry -## Verify Your Setup - -Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. +## Send Logs -### Issues + -To verify that Sentry captures errors and creates issues in your Sentry project, add a test button to an existing page or create a new one. +If you already use `console`, capture those calls as Sentry Logs with `consoleLoggingIntegration`. +We also provide integrations for: +- Consola +- Pino - - Then, open the page in a browser and click the button to trigger a frontend - error. - - - +## Send Application Metrics -```javascript - -``` + - -### Tracing +On Node.js, `nodeRuntimeMetricsIntegration` also collects runtime health metrics automatically. -To test tracing, create a test API route like `src/routes/sentry-test.tsx`: +## Verify Your Setup -```javascript {filename:sentry-test.tsx} -export async function GET() { - throw new Error("Sentry Example API Route Error"); -} -``` +Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. -Next, update your test button to call this route and throw an error if the response isn't `ok`. +Add a test button to an existing page. Clicking it throws an error that Sentry captures: -Then, open the page in the browser and click the button to trigger a frontend error, an error in the API route, and a trace to measure the time it takes for the API request to complete. + -```javascript +```jsx ``` - - - - - - - - - - ### View Captured Data in Sentry Now, head over to your project on [Sentry.io](https://sentry.io) to view the collected data (it takes a couple of moments for the data to appear). @@ -434,15 +365,11 @@ Now, head over to your project on [Sentry.io](https://sentry.io) to view the col ## Next Steps -At this point, you should have integrated Sentry into your SolidStart application and should already be sending data to your Sentry project. - -Now's a good time to customize your setup and look into more advanced topics. Our next recommended steps for you are: +At this point, you should have integrated Sentry into your SolidStart application. Here's what to explore next: - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup -- Learn how to manually capture errors -- Continue to customize your configuration -- Learn how to make use of SolidStart-specific features -- Get familiar with [Sentry's product features](/) like tracing, insights, and alerts +- Set up Agent Tracing to monitor your AI systems +- Set up tunneling to avoid ad blockers blocking Sentry events diff --git a/docs/platforms/javascript/guides/svelte/index.mdx b/docs/platforms/javascript/guides/svelte/index.mdx index ec01e656bc2b6..1931db3436219 100644 --- a/docs/platforms/javascript/guides/svelte/index.mdx +++ b/docs/platforms/javascript/guides/svelte/index.mdx @@ -1,6 +1,6 @@ --- title: Svelte -description: "Learn how to manually set up Sentry in your Svelte app and capture your first errors." +description: "Learn how to manually set up Sentry in your Svelte app and capture your first events." sdk: sentry.javascript.svelte categories: - browser @@ -33,67 +33,56 @@ pnpm add @sentry/svelte ## Configure -Choose the features you want to configure, and this guide will show you how: - - +**Error Monitoring** starts working as soon as you call `Sentry.init()`. **Logs** and **Application Metrics** need no extra configuration, and you'll learn how to send them in steps [#3](#send-logs) and [#4](#send-application-metrics-). +This guide also enables **Tracing**, **Session Replay**, and **User Feedback**. -To use the SDK, initialize it in your Svelte entry point before bootstrapping your app. In a typical Svelte project, that is your `main.js` or `main.ts` file. +### Initialize the SDK + +Initialize the SDK in your Svelte entry point before bootstrapping your app. In a typical project, that is your `main.js` or `main.ts` file. + +The snippet also turns on: + +- Tracing: via `browserTracingIntegration()` and `tracesSampleRate` +- Session Replay: via `replayIntegration()`, sampled with `replaysSessionSampleRate` and `replaysOnErrorSampleRate` +- User Feedback: via `feedbackIntegration()` + +Don't need a feature? Remove its integration and options from the snippet. ```javascript {tabTitle: Svelte v5+} {mdExpandTabs} {filename: main.js} import { mount } from "svelte"; import "./app.css"; import App from "./App.svelte"; - import * as Sentry from "@sentry/svelte"; -// Initialize the Sentry SDK here Sentry.init({ dsn: "___PUBLIC_DSN___", - integrations: [ - // ___PRODUCT_OPTION_START___ performance + // enables automatic instrumentation Sentry.browserTracingIntegration(), - // ___PRODUCT_OPTION_END___ performance - // ___PRODUCT_OPTION_START___ session-replay + // enables Session Replay Sentry.replayIntegration(), - // ___PRODUCT_OPTION_END___ session-replay - // ___PRODUCT_OPTION_START___ user-feedback + // enables User Feedback Sentry.feedbackIntegration({ - // Additional SDK configuration goes in here, for example: + // Additional integration configuration goes in here colorScheme: "system", }), - // ___PRODUCT_OPTION_END___ user-feedback ], - // ___PRODUCT_OPTION_START___ performance - // Set tracesSampleRate to 1.0 to capture 100% - // of transactions for tracing. - // We recommend adjusting this value in production - // Learn more at - // https://docs.sentry.io/platforms/javascript/configuration/options/#traces-sample-rate + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. tracesSampleRate: 1.0, - // Set `tracePropagationTargets` to control for which URLs trace propagation should be enabled + // Set trace propagation targets for your API requests tracePropagationTargets: ["localhost", /^https:\/\/yourserver\.io\/api/], - // ___PRODUCT_OPTION_END___ performance - // ___PRODUCT_OPTION_START___ session-replay - // Capture Replay for 10% of all sessions, - // plus 100% of sessions with an error - // Learn more at - // https://docs.sentry.io/platforms/javascript/session-replay/configuration/#general-integration-configuration + // Capture replays for 10% of all sessions, + // plus for 100% of sessions with an error + // Requires Sentry.replayIntegration() replaysSessionSampleRate: 0.1, replaysOnErrorSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ session-replay }); const app = mount(App, { @@ -106,47 +95,35 @@ export default app; ```javascript {tabTitle: Svelte v3-v4} {filename: main.js} import "./app.css"; import App from "./App.svelte"; - import * as Sentry from "@sentry/svelte"; -// Initialize the Sentry SDK here Sentry.init({ dsn: "___PUBLIC_DSN___", integrations: [ - // ___PRODUCT_OPTION_START___ performance + // enables Tracing Sentry.browserTracingIntegration(), - // ___PRODUCT_OPTION_END___ performance - // ___PRODUCT_OPTION_START___ session-replay + // enables Session Replay Sentry.replayIntegration(), - // ___PRODUCT_OPTION_END___ session-replay - // ___PRODUCT_OPTION_START___ user-feedback + // enables User Feedback Sentry.feedbackIntegration({ - // Additional SDK configuration goes in here, for example: + // Additional integration configuration goes in here colorScheme: "system", }), - // ___PRODUCT_OPTION_END___ user-feedback ], - // ___PRODUCT_OPTION_START___ performance - // Set tracesSampleRate to 1.0 to capture 100% - // of transactions for tracing. - // We recommend adjusting this value in production - // Learn more at - // https://docs.sentry.io/platforms/javascript/configuration/options/#traces-sample-rate + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. tracesSampleRate: 1.0, - // Set `tracePropagationTargets` to control for which URLs trace propagation should be enabled + // Set trace propagation targets for your API requests tracePropagationTargets: ["localhost", /^https:\/\/yourserver\.io\/api/], - // ___PRODUCT_OPTION_END___ performance - // ___PRODUCT_OPTION_START___ session-replay - // Capture Replay for 10% of all sessions, - // plus 100% of sessions with an error - // Learn more at - // https://docs.sentry.io/platforms/javascript/session-replay/configuration/#general-integration-configuration + // Capture replays for 10% of all sessions, + // plus for 100% of sessions with an error + // Requires Sentry.replayIntegration() replaysSessionSampleRate: 0.1, replaysOnErrorSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ session-replay }); const app = new App({ @@ -156,31 +133,29 @@ const app = new App({ export default app; ``` -### Add Readable Stack Traces With Source Maps (Optional) +### Add Readable Stack Traces With Source Maps -### Avoid Ad Blockers With Tunneling (Optional) +### Control the Data You Send to Sentry - + -### Control the Data You Send to Sentry (Optional) +## Send Logs - + -## Verify Your Setup +If you're already logging with `console` or Consola, you can capture those logs with our console integrations. -Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. +## Send Application Metrics -### Issues + -To verify that Sentry captures errors and creates issues in your Sentry project, add the following test button to one of your pages, which will trigger an error that Sentry will capture when you click it. +## Verify Your Setup - - Open the page in a browser and click the button to trigger a frontend error. - +Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. - +Add a test button to one of your components. Clicking it will trigger an error for Sentry to capture. ```jsx {tabTitle:Svelte v5+} {mdExpandTabs} {filename:SomeComponent.svelte} -``` - -```jsx {tabTitle:Svelte v3/v4} {filename:SomeComponent.svelte} - -``` - - - - - - - - - - + - ### View Captured Data in Sentry Now, head over to your project on [Sentry.io](https://sentry.io/) to view the collected data (it takes a couple of moments for the data to appear). @@ -260,15 +189,11 @@ Now, head over to your project on [Sentry.io](https://sentry.io/) to view the co ## Next Steps -At this point, you should have integrated Sentry into your Svelte application and should already be sending data to your Sentry project. - -Now's a good time to customize your setup and look into more advanced topics. Our next recommended steps for you are: +At this point, you should have integrated Sentry into your Svelte application. Here's what to explore next: - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup -- Extend Sentry to your backend using one of our [SDKs](/) -- Continue to customize your configuration -- Make use of Svelte-specific features -- Learn how to manually capture errors +- Set up tunneling to avoid ad blockers from blocking Sentry events +- Explore Svelte-specific features @@ -277,6 +202,4 @@ Now's a good time to customize your setup and look into more advanced topics. Ou - - diff --git a/docs/platforms/javascript/guides/vue/index.mdx b/docs/platforms/javascript/guides/vue/index.mdx index 0485d8531af7a..fe85f766b3816 100644 --- a/docs/platforms/javascript/guides/vue/index.mdx +++ b/docs/platforms/javascript/guides/vue/index.mdx @@ -1,6 +1,6 @@ --- title: Vue -description: "Learn how to manually set up Sentry in your Vue app and capture your first errors." +description: "Learn how to manually set up Sentry in your Vue app and capture your first events." sdk: sentry.javascript.vue categories: - browser @@ -29,28 +29,30 @@ pnpm add @sentry/vue ## Configure -Choose the features you want to configure, and this guide will show you how: - - +**Error Monitoring** starts working as soon as you call `Sentry.init()`. **Logs** and **Application Metrics** need no extra configuration, and you'll learn how to send them in steps [#3](#send-logs) and [#4](#send-application-metrics-). +This guide also enables **Tracing**, **Session Replay**, and **User Feedback**. -To initialize Sentry in your Vue application, add the following code snippet to your `main.js`. +### Initialize the SDK + +To initialize Sentry in your Vue application, add the code shown below to your `main.js`. + +The snippet also turns on: + +- Tracing: via `browserTracingIntegration()` and `tracesSampleRate` +- Session Replay: via `replayIntegration()`, sampled with `replaysSessionSampleRate` and `replaysOnErrorSampleRate` +- User Feedback: via `feedbackIntegration()` + +Don't need a feature? Remove its integration and options from the snippet. -If you're creating more than one Vue 3 app within your application, check out how to initialize the SDK for [multiple apps](./features/multiple-apps/). +If you're creating more than one Vue 3 app within your application, see how to initialize the SDK for [multiple apps](./features/multiple-apps/). -```javascript {tabTitle:Vue 3} {filename:main.js} {3, 12-34} +```javascript {tabTitle:Vue 3} {filename:main.js} import { createApp } from "vue"; import { createRouter } from "vue-router"; import * as Sentry from "@sentry/vue"; @@ -65,49 +67,38 @@ const router = createRouter({ Sentry.init({ app, dsn: "___PUBLIC_DSN___", - integrations: [ - // ___PRODUCT_OPTION_START___ performance + // enables automatic instrumentation Sentry.browserTracingIntegration({ router }), - // ___PRODUCT_OPTION_END___ performance - // ___PRODUCT_OPTION_START___ session-replay + // enables Session Replay Sentry.replayIntegration(), - // ___PRODUCT_OPTION_END___ session-replay - // ___PRODUCT_OPTION_START___ user-feedback + // enables User Feedback Sentry.feedbackIntegration({ - // Additional SDK configuration goes in here, for example: + // Additional integration configuration goes in here colorScheme: "system", }), - // ___PRODUCT_OPTION_END___ user-feedback ], - // ___PRODUCT_OPTION_START___ performance - // Set tracesSampleRate to 1.0 to capture 100% - // of transactions for tracing. - // We recommend adjusting this value in production - // Learn more at - // https://docs.sentry.io/platforms/javascript/configuration/options/#traces-sample-rate + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. tracesSampleRate: 1.0, - // Set `tracePropagationTargets` to control for which URLs trace propagation should be enabled + // Set trace propagation targets for your API requests tracePropagationTargets: ["localhost", /^https:\/\/yourserver\.io\/api/], - // ___PRODUCT_OPTION_END___ performance - // ___PRODUCT_OPTION_START___ session-replay - // Capture Replay for 10% of all sessions, + // Capture replays for 10% of all sessions, // plus for 100% of sessions with an error - // Learn more at - // https://docs.sentry.io/platforms/javascript/session-replay/configuration/#general-integration-configuration + // Requires Sentry.replayIntegration() replaysSessionSampleRate: 0.1, replaysOnErrorSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ session-replay }); app.use(router); app.mount("#app"); ``` -```javascript {tabTitle:Vue 2} {filename:main.js} {3, 11-35} +```javascript {tabTitle:Vue 2} {filename:main.js} import Vue from "vue"; import Router from "vue-router"; import * as Sentry from "@sentry/vue"; @@ -122,40 +113,30 @@ Sentry.init({ Vue, dsn: "___PUBLIC_DSN___", integrations: [ - // ___PRODUCT_OPTION_START___ performance + // enables Tracing Sentry.browserTracingIntegration({ router }), - // ___PRODUCT_OPTION_END___ performance - // ___PRODUCT_OPTION_START___ session-replay + // enables Session Replay Sentry.replayIntegration(), - // ___PRODUCT_OPTION_END___ session-replay - // ___PRODUCT_OPTION_START___ user-feedback + // enables User Feedback Sentry.feedbackIntegration({ - // Additional SDK configuration goes in here, for example: + // Additional integration configuration goes in here colorScheme: "system", }), - // ___PRODUCT_OPTION_END___ user-feedback ], - // ___PRODUCT_OPTION_START___ performance - // Set tracesSampleRate to 1.0 to capture 100% - // of transactions for tracing. - // We recommend adjusting this value in production - // Learn more at - // https://docs.sentry.io/platforms/javascript/configuration/options/#traces-sample-rate + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. tracesSampleRate: 1.0, - // Set `tracePropagationTargets` to control for which URLs trace propagation should be enabled + // Set trace propagation targets for your API requests tracePropagationTargets: ["localhost", /^https:\/\/yourserver\.io\/api/], - // ___PRODUCT_OPTION_END___ performance - // ___PRODUCT_OPTION_START___ session-replay - // Capture Replay for 10% of all sessions, + // Capture replays for 10% of all sessions, // plus for 100% of sessions with an error - // Learn more at - // https://docs.sentry.io/platforms/javascript/session-replay/configuration/#general-integration-configuration + // Requires Sentry.replayIntegration() replaysSessionSampleRate: 0.1, replaysOnErrorSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ session-replay }); // ... @@ -166,17 +147,16 @@ new Vue({ }).$mount("#app"); ``` -### Configuration for Late-Defined Vue Apps +### Configure Late-Defined Vue Apps -If your Vue application is not defined from the start, you can add error monitoring for Vue-specific errors later on. -To manually add the integration for late-defined Vue applications, update your `main.js` file: +If your Vue application is not defined from the start, add error monitoring for Vue-specific errors later. To manually add the integration for a late-defined Vue application, update your `main.js` file: ```javascript {filename:main.js} import * as Sentry from "@sentry/vue"; Sentry.init({ dsn: "...", - // Filter out default `Vue` integration + // Filter out the default Vue integration integrations: (integrations) => integrations.filter((integration) => integration.name !== "Vue"), }); @@ -189,100 +169,57 @@ const app = createApp({ Sentry.addIntegration(Sentry.vueIntegration({ app })); ``` -### Configuration for Pinia - -To capture Pinia state data, use `Sentry.createSentryPiniaPlugin()` and add it to your Pinia store instance. +### Configure Pinia -Learn more about the [Pinia Plugin](./features/pinia/) and its options. +To capture Pinia state data, use `Sentry.createSentryPiniaPlugin()` and add it to your Pinia store instance. Learn more about the [Pinia Plugin](./features/pinia/) and its options. ```javascript import { createPinia } from "pinia"; import { createSentryPiniaPlugin } from "@sentry/vue"; const pinia = createPinia(); - pinia.use(createSentryPiniaPlugin()); ``` -### Add Readable Stack Traces With Source Maps (Optional) +### Add Readable Stack Traces With Source Maps -### Avoid Ad Blockers With Tunneling (Optional) - - - -### Control the Data You Send to Sentry (Optional) +### Control the Data You Send to Sentry -## Verify Your Setup - -Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. +## Send Logs -### Issues + -To verify that Sentry is capturing errors and creating issues in your Sentry project, add the following test button to one of your pages, which will trigger an error that Sentry will capture when you click it. +If you're already logging with `console` or Consola, you can capture those logs with our console integrations. - - Then, open the page in a browser and click the button to trigger a frontend - error. - - - - -```javascript {filename:App.vue} -// ... - -// ... +## Send Application Metrics -export default { - // ... - methods: { - throwError() { - throw new Error('Sentry Error'); - } - } -}; -``` + - -### Tracing +## Verify Your Setup -To test your tracing configuration, update the previous code snippet to start a performance trace to measure the time it takes for your code to execute. +Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. -Then, open the page in a browser and click the button to trigger a frontend error and performance trace. +Add a test button to one of your pages. Clicking it will trigger an error for Sentry to capture. ```javascript {filename:App.vue} -// ... -// ... + ``` - - - - - - - - - + ### View Captured Data in Sentry @@ -292,15 +229,11 @@ Now, head over to your project on [Sentry.io](https://sentry.io/) to view the co ## Next Steps -At this point, you should have integrated Sentry into your Vue application and should already be sending data to your Sentry project. - -Now's a good time to customize your setup and look into more advanced topics. Our next recommended steps for you are: +At this point, you should have integrated Sentry into your Vue application. Here's what to explore next: - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup -- Extend Sentry to your backend using one of our [SDKs](/) -- Continue to customize your configuration -- Make use of Vue-specific features -- Learn how to manually capture errors +- Set up tunneling to avoid ad blockers from blocking Sentry events +- Explore Vue-specific features diff --git a/docs/platforms/javascript/guides/wasm/index.mdx b/docs/platforms/javascript/guides/wasm/index.mdx index 3514cc7d4182a..a16cd93d5e3e8 100644 --- a/docs/platforms/javascript/guides/wasm/index.mdx +++ b/docs/platforms/javascript/guides/wasm/index.mdx @@ -1,7 +1,7 @@ --- title: Wasm sdk: sentry.javascript.wasm -description: "Learn how to manually set up Sentry in your JavaScript application with WebAssembly modules and capture your first errors." +description: "Learn how to manually set up Sentry in your JavaScript application with WebAssembly modules and capture your first events." keywords: ["wasm", "webassembly"] categories: - browser @@ -21,14 +21,6 @@ categories: ## Install -Choose the features you want to configure, and this guide will show you how: - - - - - ### Install the Sentry SDK Run the command for your preferred package manager to add the Sentry SDK to your application: @@ -47,7 +39,18 @@ pnpm add @sentry/browser @sentry/wasm ## Configure -To use the SDK, initialize it in your application's entry point before loading your WebAssembly modules. Sentry's Wasm integration enhances the Browser SDK and allows it to provide more detailed debug information for WebAssembly modules, including Debug IDs, Debug Files, Code IDs, Code Files and memory addresses. +**Error Monitoring** starts working as soon as you call `Sentry.init()`. **Logs** and **Application Metrics** need no extra configuration, and you'll learn how to send them in steps [#3](#send-logs) and [#4](#send-application-metrics-). +This guide also enables **Tracing**. + + + +To use the SDK, initialize it in your application's entry point before loading your WebAssembly modules. Sentry's Wasm integration enhances the Browser SDK and adds debug information for WebAssembly modules. + +The snippet also turns on: + +- Tracing: via `tracesSampleRate` and `browserTracingIntegration()` + +Don't need a feature? Remove its integration and options from the snippet. ```javascript import * as Sentry from "@sentry/browser"; @@ -57,137 +60,49 @@ Sentry.init({ dsn: "___PUBLIC_DSN___", integrations: [ - // ___PRODUCT_OPTION_START___ performance + // enables automatic instrumentation Sentry.browserTracingIntegration(), - // ___PRODUCT_OPTION_END___ performance wasmIntegration(), ], - // ___PRODUCT_OPTION_START___ performance - // Set tracesSampleRate to 1.0 to capture 100% - // of transactions for tracing. - // We recommend adjusting this value in production - // Learn more at - // https://docs.sentry.io/platforms/javascript/guides/wasm/configuration/options/#tracesSampleRate + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. tracesSampleRate: 1.0, // Set `tracePropagationTargets` to control for which URLs trace propagation should be enabled tracePropagationTargets: ["localhost", /^https:\/\/yourserver\.io\/api/], - // ___PRODUCT_OPTION_END___ performance }); ``` -### Control the Data You Send to Sentry (Optional) +### Control the Data You Send to Sentry -## Verify Your Setup - -Let's test your setup and confirm that Sentry is working correctly and sending data from your WebAssembly modules to your Sentry project. - -### Issues +## Send Logs -To verify that Sentry captures errors from WebAssembly modules and creates issues in your Sentry project, add a function to your WebAssembly module that you can then call to cause an error (for example, division by zero). + -Here's what this could look like in Rust: +If you already use `console`, capture those calls as Sentry Logs with `consoleLoggingIntegration`. -```rust -#[no_mangle] -pub extern "C" fn divide(a: i32, b: i32) -> i32 { - // This will cause a division by zero trap when b is 0 - a / b -} -``` - -Then add a button to one of your app pages that, when pressed, calls the WebAssembly function to throw an error. Here's a simple HTML button: - - - -```html - -``` +## Send Application Metrics -Here's the JavaScript that calls the WebAssembly function. Make sure that you adjust it for your JavaScript framework. Note that, depending on how you compile modules, you can either call the function directly or access it through the WebAssembly API. + - - Open your app in the browser and click the button you just created to trigger - an error in your WebAssembly module. - - -```javascript -function testWasmError() { - try { - // Assuming you already have your WebAssembly module loaded as 'wasmModule' - // Replace this with your actual WebAssembly module instance - - // depending on how your module is compiled, call function directly - const result = wasmModule.divide(10, 0); - // or via WebAssembly API - //const result = wasmModule.instance.exports.divide(10, 0); - } catch (e) { - Sentry.captureException(e); - } -} -``` - - -### Tracing - -To test your tracing configuration, add a function to your WebAssembly module that does some calculations. Here's what it could look like in Rust: - -```rust -#[no_mangle] -pub extern "C" fn compute_intensive_function(iterations: i32) -> i32 { - // Add some computation to make tracing more visible - let mut sum = 0; - for i in 0..iterations * 1000 { - sum += i; - } - sum -} -``` - -Next, add a new button to your app: +## Verify Your Setup -```html - -``` +Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. -Finally, create the JavaScript function that wraps your WebAssembly function calls in a Sentry span to measure the execution time. Again, make sure to adapt the code to fit your setup: +Call a WebAssembly function that triggers a trap, then capture the exception: ```javascript -function testWasmTracing() { - Sentry.startSpan({ op: "test", name: "Example Span" }, () => { - try { - // Assuming you already have your WebAssembly module loaded as 'wasmModule' - // Replace this with your actual WebAssembly module instance - - // depending on how your module is compiled, call function directly - const result = wasmModule.compute_intensive_function(1000); - // or via WebAssembly API - // const result = wasmModule.instance.exports.compute_intensive_function(1000); - console.log("Result:", result); - } catch (e) { - Sentry.captureException(e); - } - }); +try { + wasmModule.divide(10, 0); +} catch (error) { + Sentry.captureException(error); } ``` - - - - - - - - - - ### View Captured Data in Sentry Now, head over to your project on [Sentry.io](https://sentry.io/) to view the collected data (it takes a couple of moments for the data to appear). @@ -196,14 +111,9 @@ Now, head over to your project on [Sentry.io](https://sentry.io/) to view the co ## Next Steps -At this point, you should have integrated Sentry into your JavaScript application with WebAssembly modules and should already be sending data to your Sentry project. - -Now's a good time to customize your setup and look into more advanced topics. Our next recommended steps for you are: +At this point, you should have integrated Sentry into your JavaScript application with WebAssembly modules. Here's what to explore next: - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup -- Instrument your frontend and backend using our [SDKs](/) -- Continue to [customize your configuration](/platforms/javascript/guides/wasm/configuration/) -- Learn how to [manually capture errors](/platforms/javascript/guides/wasm/usage/) diff --git a/includes/quick-start-features-expandable.mdx b/includes/quick-start-features-expandable.mdx index 87832820c0cbf..ecb0e0d90b374 100644 --- a/includes/quick-start-features-expandable.mdx +++ b/includes/quick-start-features-expandable.mdx @@ -18,7 +18,7 @@ import { FeatureInfo } from "sentry-docs/components/featureInfo"; /> - + - + -Choose the features you want to configure, and this guide will show you how: - - - @@ -19,47 +8,208 @@ Choose the features you want to configure, and this guide will show you how: ## Configure -### Initialize the Sentry SDK +**Error Monitoring** starts working as soon as you call `Sentry.init()`. **Logs** and **Application Metrics** need no extra configuration, and you'll learn how to send them in steps [#3](#send-logs) and [#4](#send-application-metrics-). +This guide also enables **Tracing**, **Session Replay**, and **User Feedback**. - + -### Add Readable Stack Traces With Source Maps (Optional) +### Initialize the SDK - +Initialize Sentry as early as possible in your application's lifecycle. Use the tab that matches how you installed the SDK (npm, Loader, or CDN). -### Avoid Ad Blockers With Tunneling (Optional) +The snippet also turns on: - +- Tracing: via `browserTracingIntegration()` and `tracesSampleRate` +- Session Replay: via `replayIntegration()`, sampled with `replaysSessionSampleRate` and `replaysOnErrorSampleRate` +- User Feedback: via `feedbackIntegration()` -### Control the Data You Send to Sentry (Optional) + + +Remove its integration and options from the `Sentry.init` snippet. Depending on how you installed the SDK, you may need one more step: +- **npm:** No additional steps. +- **Loader script:** Also turn off the feature in your Sentry project settings, then replace the loader script in your project with the updated one. +- **CDN bundle:** Also switch to a bundle that includes only the features you need. See the list of available bundles. + + + +```javascript {tabTitle:npm} +import * as Sentry from "@sentry/browser"; + +Sentry.init({ + dsn: "___PUBLIC_DSN___", + + // Alternatively, use `process.env.npm_package_version` for a dynamic release version + // if your build tool supports it. + release: "my-project-name@2.3.12", + integrations: [ + // enables automatic instrumentation + Sentry.browserTracingIntegration(), + // enables Session Replay + Sentry.replayIntegration(), + // enables User Feedback + Sentry.feedbackIntegration({ + // Additional integration configuration goes in here + colorScheme: "system", + }), + ], + + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. + tracesSampleRate: 1.0, + + // Set trace propagation targets for your API requests + tracePropagationTargets: ["localhost", /^https:\/\/yourserver\.io\/api/], + + // Capture replays for 10% of all sessions, + // plus for 100% of sessions with an error + // Requires Sentry.replayIntegration() + replaysSessionSampleRate: 0.1, + replaysOnErrorSampleRate: 1.0, +}); +``` + +```html {tabTitle:Loader} + + + +``` + +```html {tabTitle:CDN} + + + +``` + +### Add Readable Stack Traces With Source Maps + + + +### Control the Data You Send to Sentry +## Send Logs + + + +If you're already logging with `console` or [Consola](https://github.com/unjs/consola), you can capture those logs with our console integrations. + + +## Send Application Metrics + + + ## Verify Your Setup - +Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. + +Add a test button to one of your pages. Open the page in a browser and click the button to trigger an error for Sentry to capture. + +```html + + + +``` + + ### View Captured Data in Sentry -Now, head over to your project on [Sentry.io](https://sentry.io) to view the collected data (it takes a couple of moments for the data to appear). +Now, head over to your project on [Sentry.io](https://sentry.io/) to view the collected data (it takes a couple of moments for the data to appear). ## Next Steps -At this point, you should have integrated Sentry into your JavaScript application and should already be sending data to your Sentry project. - -Now's a good time to customize your setup and look into more advanced topics. Our next recommended steps for you are: +At this point, you should have integrated Sentry into your JavaScript application. Here's what to explore next: - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup - Extend Sentry to your backend using one of our [SDKs](/) -- Learn how to [manually capture errors](/platforms/javascript/usage/) -- Continue to [customize your configuration](/platforms/javascript/configuration/) -- Get familiar with [Sentry's product features](/product/) like tracing, insights, and alerts +- Set up tunneling to avoid ad blockers from blocking Sentry events -- Find various support topics in troubleshooting +- Find various topics in Troubleshooting - [Get support](https://www.sentry.help/en/) diff --git a/platform-includes/getting-started-config/javascript.node.mdx b/platform-includes/getting-started-config/javascript.node.mdx index 334bd8776680e..f3797829ad2b4 100644 --- a/platform-includes/getting-started-config/javascript.node.mdx +++ b/platform-includes/getting-started-config/javascript.node.mdx @@ -1,69 +1,43 @@ ```javascript {tabTitle:CommonJS} {filename: instrument.js} const Sentry = require("@sentry/node"); -// ___PRODUCT_OPTION_START___ profiling const { nodeProfilingIntegration } = require("@sentry/profiling-node"); -// ___PRODUCT_OPTION_END___ profiling - Sentry.init({ dsn: "___PUBLIC_DSN___", - // ___PRODUCT_OPTION_START___ profiling integrations: [ // Add our Profiling integration nodeProfilingIntegration(), ], - // ___PRODUCT_OPTION_END___ profiling - // ___PRODUCT_OPTION_START___ performance - // Set tracesSampleRate to 1.0 to capture 100% - // of transactions for tracing. - // We recommend adjusting this value in production - // Learn more at - // https://docs.sentry.io/platforms/javascript/guides/node/configuration/options/#tracesSampleRate + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. tracesSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ performance - // ___PRODUCT_OPTION_START___ profiling - // Enable profiling for a percentage of sessions - // Learn more at - // https://docs.sentry.io/platforms/javascript/configuration/options/#profileSessionSampleRate + // Enables Profiling for every session. profileSessionSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ profiling }); ``` ```javascript {tabTitle:ESM} {filename: instrument.mjs} import * as Sentry from "@sentry/node"; -// ___PRODUCT_OPTION_START___ profiling import { nodeProfilingIntegration } from "@sentry/profiling-node"; -// ___PRODUCT_OPTION_END___ profiling // Ensure to call this before importing any other modules! Sentry.init({ dsn: "___PUBLIC_DSN___", - // ___PRODUCT_OPTION_START___ profiling - integrations: [ // Add our Profiling integration nodeProfilingIntegration(), ], - // ___PRODUCT_OPTION_END___ profiling - // ___PRODUCT_OPTION_START___ performance - // Set tracesSampleRate to 1.0 to capture 100% - // of transactions for tracing. - // We recommend adjusting this value in production - // Learn more at - // https://docs.sentry.io/platforms/javascript/guides/node/configuration/options/#tracesSampleRate + // Enables Tracing. + // Set to 1.0 to capture 100% of spans for tracing. + // We recommend reducing this value in production. tracesSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ performance - // ___PRODUCT_OPTION_START___ profiling - // Enable profiling for a percentage of sessions - // Learn more at - // https://docs.sentry.io/platforms/javascript/configuration/options/#profileSessionSampleRate + // Enables Profiling for every session. profileSessionSampleRate: 1.0, - // ___PRODUCT_OPTION_END___ profiling }); ``` diff --git a/platform-includes/getting-started-install/javascript.mdx b/platform-includes/getting-started-install/javascript.mdx index bb50e9730ce62..088d66987dda2 100644 --- a/platform-includes/getting-started-install/javascript.mdx +++ b/platform-includes/getting-started-install/javascript.mdx @@ -20,12 +20,11 @@ pnpm add @sentry/browser In Sentry, go to **Settings > Projects > (select project) > SDK Setup > [Loader Script](https://sentry.io/orgredirect/organizations/:orgslug/settings/projects/:projectId/loader-script/)**. -Enable the features you want (for example, Tracing or Session Replay), copy the script tag, and place it before all other scripts in your app. +Enable Tracing, Session Replay, Logs and Metrics, and User Feedback. Then, copy the script tag and place it before all other scripts in your app. #### Option 3: CDN Bundle -Sentry provides different bundles that include specific feature combinations. Go to our list of [available bundles](/platforms/javascript/install/loader/#cdn) and copy the one that fits your needs. -Next, place the script tag before all other scripts in your app. +Sentry provides bundles with different feature combinations. In this guide, we'll use the [full bundle with all features](/platforms/javascript/install/loader/#full-bundle-with-all-features). Copy the script tag and place it before all other scripts in your app. If you're updating your Sentry SDK to the latest version, check out our diff --git a/platform-includes/getting-started-install/javascript.node.mdx b/platform-includes/getting-started-install/javascript.node.mdx index d0c4e2e161466..36392fd8f473a 100644 --- a/platform-includes/getting-started-install/javascript.node.mdx +++ b/platform-includes/getting-started-install/javascript.node.mdx @@ -1,21 +1,3 @@ - - -```bash {tabTitle:npm} -npm install @sentry/node -``` - -```bash {tabTitle:yarn} -yarn add @sentry/node -``` - -```bash {tabTitle:pnpm} -pnpm add @sentry/node -``` - - - - - ```bash {tabTitle:npm} npm install @sentry/node @sentry/profiling-node --save ``` @@ -27,5 +9,3 @@ yarn add @sentry/node @sentry/profiling-node ```bash {tabTitle:pnpm} pnpm add @sentry/node @sentry/profiling-node ``` - - diff --git a/platform-includes/getting-started-logs/javascript.mdx b/platform-includes/getting-started-logs/javascript.mdx new file mode 100644 index 0000000000000..36d41f2a986c9 --- /dev/null +++ b/platform-includes/getting-started-logs/javascript.mdx @@ -0,0 +1,16 @@ +Use `Sentry.logger` to send logs at different levels, such as `info`, `warn`, or `error`. You can pass any attributes you want and search or filter by them later. +See Set Up Logs for all available logging methods and the syntax for formatting messages. + +```javascript +Sentry.logger.info("User example action completed"); + +Sentry.logger.warn("Slow operation detected", { + operation: "data_fetch", + duration: 3500, +}); + +Sentry.logger.error("Validation failed", { + form_field: "email", + reason: "Invalid email", +}); +``` diff --git a/platform-includes/getting-started-metrics/javascript.mdx b/platform-includes/getting-started-metrics/javascript.mdx new file mode 100644 index 0000000000000..1b54adb67bdf3 --- /dev/null +++ b/platform-includes/getting-started-metrics/javascript.mdx @@ -0,0 +1,13 @@ +Use `Sentry.metrics` to send counters, gauges, and distributions from your app to Sentry. You can pass any attributes you want and search or filter by them later. +See Set Up Metrics for all available metric types and configuration options. + +```javascript +Sentry.metrics.count("checkout.failed", 1); + +Sentry.metrics.gauge("time_since_refresh", 4, { unit: "hour" }); + +Sentry.metrics.distribution("api_latency", 187, { + unit: "millisecond", + attributes: { endpoint: "/api/orders" }, +}); +``` diff --git a/platform-includes/getting-started-node/javascript.mdx b/platform-includes/getting-started-node/javascript.mdx index 6b1a0e27256a2..6494a33f2dd07 100644 --- a/platform-includes/getting-started-node/javascript.mdx +++ b/platform-includes/getting-started-node/javascript.mdx @@ -4,25 +4,24 @@ ## Install -Choose the features you want to configure, and this guide will show you how: - - - - - -### Install the Sentry SDK - Run the command for your preferred package manager to add the Sentry SDK to your application: ## Configure +**Error Monitoring** starts working as soon as you call `Sentry.init()`. **Logs** and **Application Metrics** need no extra configuration, and you'll learn how to send them in steps [#3](#send-logs) and [#4](#send-application-metrics-). +This guide also enables **Tracing** and **Profiling**. + + + ### Initialize the Sentry SDK -To import and initialize Sentry, create a file named `instrument.(js|mjs)` in the root directory of your project and add the following code: +To import and initialize Sentry, create a file named `instrument.(js|mjs)` in the root directory of your project and add the code shown below. + +The snippet also turns on: +- Tracing: via `tracesSampleRate` +- Profiling: via `profileSessionSampleRate` and `nodeProfilingIntegration()` @@ -40,14 +39,29 @@ If you are using a bundler like vite, you can also -### Add Readable Stack Traces With Source Maps (Optional) +### Add Readable Stack Traces With Source Maps -### Control the Data You Send to Sentry (Optional) +### Control the Data You Send to Sentry +## Send Logs + + + +If you're already logging with another library, use an integration to capture those logs as Sentry Logs automatically: +- `consoleLoggingIntegration` for `console` calls +- Consola +- Pino + +## Send Application Metrics + + + +On Node.js, `nodeRuntimeMetricsIntegration` also collects runtime health metrics automatically. + ## Verify Your Setup Let's test your setup and confirm that Sentry is working correctly and sending data to your Sentry project. @@ -62,16 +76,11 @@ Finally, head over to your project on [Sentry.io](https://sentry.io/) to view th ## Next Steps -At this point, you should have integrated Sentry into your application, which should already be sending data to your Sentry project. - -Now's a good time to customize your setup and look into more advanced topics. -Our next recommended steps for you are: +At this point, you should have integrated Sentry into your Nest.js application. Here's what to explore next: - Explore [practical guides](/get-started/guides/) on what to monitor, log, track, and investigate after setup - Extend Sentry to your frontend using one of our [frontend SDKs](/) -- Learn how to manually capture errors -- Continue to customize your configuration -- Get familiar with [Sentry's product features](/product/) like tracing, insights, and alerts +- Set up Agent Tracing to monitor your AI systems diff --git a/platform-includes/getting-started-verify/javascript.express.mdx b/platform-includes/getting-started-verify/javascript.express.mdx index 8b44eea158599..912a0045585aa 100644 --- a/platform-includes/getting-started-verify/javascript.express.mdx +++ b/platform-includes/getting-started-verify/javascript.express.mdx @@ -1,40 +1,7 @@ -### Issues - -First, let's make sure Sentry is correctly capturing errors and creating issues in your project. Add the following code snippet to your main application file; it defines a route that will deliberately trigger an error when called: +Add an intentional error to your main application file that Sentry will capture: ```javascript app.get("/debug-sentry", function mainHandler(req, res) { throw new Error("My first Sentry error!"); }); ``` - - - -### Tracing - -To test your tracing configuration, update the previous code snippet by starting a trace to measure the time it takes for the execution of your code: - -```javascript -app.get("/debug-sentry", async (req, res) => { - await Sentry.startSpan( - { - op: "test", - name: "My First Test Transaction", - }, - async () => { - await new Promise((resolve) => setTimeout(resolve, 100)); - throw new Error("My first Sentry error!"); - } - ); -}); -``` - - - - - - - - - - diff --git a/platform-includes/getting-started-verify/javascript.fastify.mdx b/platform-includes/getting-started-verify/javascript.fastify.mdx index 32b69ad9f29d8..912a0045585aa 100644 --- a/platform-includes/getting-started-verify/javascript.fastify.mdx +++ b/platform-includes/getting-started-verify/javascript.fastify.mdx @@ -1,40 +1,7 @@ -### Issues - -First, let's make sure Sentry is correctly capturing errors and creating issues in your project. Add the following code snippet to your main application file; it defines a route that will deliberately trigger an error when called: +Add an intentional error to your main application file that Sentry will capture: ```javascript app.get("/debug-sentry", function mainHandler(req, res) { throw new Error("My first Sentry error!"); }); ``` - - - -### Tracing - -To test your tracing configuration, update the previous code snippet by starting a trace to measure the time it takes for the execution of your code: - -```javascript -app.get("/debug-sentry", async (request, reply) => { - await Sentry.startSpan( - { - op: "test", - name: "My First Test Transaction", - }, - async () => { - await new Promise((resolve) => setTimeout(resolve, 100)); // Wait for 100ms - throw new Error("My first Sentry error!"); - } - ); -}); -``` - - - - - - - - - - diff --git a/platform-includes/getting-started-verify/javascript.hapi.mdx b/platform-includes/getting-started-verify/javascript.hapi.mdx index 7502f98762e10..403e85ec1969c 100644 --- a/platform-includes/getting-started-verify/javascript.hapi.mdx +++ b/platform-includes/getting-started-verify/javascript.hapi.mdx @@ -1,6 +1,4 @@ -### Issues - -First, let's make sure Sentry is correctly capturing errors and creating issues in your project. Add the following code snippet to your main application file; it defines a route that will deliberately trigger an error when called: +Add an intentional error to your main application file that Sentry will capture: ```javascript server.route({ @@ -11,38 +9,3 @@ server.route({ }, }); ``` - - - -### Tracing - -To test your tracing configuration, update the previous code snippet by starting a trace to measure the time it takes for the execution of your code: - -```javascript -server.route({ - method: "GET", - path: "/debug-sentry", - handler: async (request, h) => { - await Sentry.startSpan( - { - op: "test", - name: "My First Test Transaction", - }, - async () => { - await new Promise((resolve) => setTimeout(resolve, 100)); - throw new Error("My first Sentry error!"); - } - ); - }, -}); -``` - - - - - - - - - - diff --git a/platform-includes/getting-started-verify/javascript.koa.mdx b/platform-includes/getting-started-verify/javascript.koa.mdx index 00cf86c161385..41bc1d6228248 100644 --- a/platform-includes/getting-started-verify/javascript.koa.mdx +++ b/platform-includes/getting-started-verify/javascript.koa.mdx @@ -1,6 +1,4 @@ -### Issues - -To check that Sentry captures errors, add this middleware before your other middleware in your main application file. Then visit `/debug-sentry` to trigger a test error: +Add this middleware before your other middleware in your main application file. Then visit `/debug-sentry` to trigger a test error: ```javascript app.use(async (ctx, next) => { @@ -10,38 +8,3 @@ app.use(async (ctx, next) => { await next(); }); ``` - - -### Tracing - -To test your tracing configuration, update the previous code snippet by starting a trace to measure the time it takes for the execution of your code: - -```javascript -app.use(async (ctx, next) => { - if (ctx.path !== "/debug-sentry") { - await next(); - return; - } - - await Sentry.startSpan( - { - op: "test", - name: "My First Test Transaction", - }, - async () => { - await new Promise((resolve) => setTimeout(resolve, 100)); - throw new Error("My first Sentry error!"); - } - ); -}); -``` - - - - - - - - - - diff --git a/platform-includes/getting-started-verify/javascript.node.mdx b/platform-includes/getting-started-verify/javascript.node.mdx index dd3623dd571e7..736f01a457988 100644 --- a/platform-includes/getting-started-verify/javascript.node.mdx +++ b/platform-includes/getting-started-verify/javascript.node.mdx @@ -1,6 +1,4 @@ -### Issues - -First, let's verify that Sentry captures errors and creates issues in your Sentry project. Add the following code snippet to your main application file, which will call an undefined function, triggering an error that Sentry will capture: +Add an intentional error to your main application file that Sentry will capture: ```javascript setTimeout(() => { @@ -11,36 +9,3 @@ setTimeout(() => { } }, 99); ``` - - -### Tracing - -To test your tracing configuration, update the previous code snippet by starting a performance trace to measure the time it takes for the execution of your code: - -```javascript -Sentry.startSpan( - { - op: "test", - name: "My First Test Transaction", - }, - () => { - setTimeout(() => { - try { - foo(); - } catch (e) { - Sentry.captureException(e); - } - }, 99); - } -); -``` - - - - - - - - - - diff --git a/platform-includes/sentry-init/install-command/javascript.react-router.mdx b/platform-includes/sentry-init/install-command/javascript.react-router.mdx index 18b0452388fa3..923a812e3b83e 100644 --- a/platform-includes/sentry-init/install-command/javascript.react-router.mdx +++ b/platform-includes/sentry-init/install-command/javascript.react-router.mdx @@ -1,6 +1,6 @@ Run the Sentry init command in your project directory to automatically configure Sentry in your React Router v7 Framework Mode application. -The command guides you through setup and asks which optional Sentry features you want to enable beyond error monitoring. +The command guides you through setup and asks which optional Sentry features you want to enable beyond error monitoring. **Logs** and **Application Metrics** need no extra configuration, and you'll learn how to send them in steps [#3](#send-logs) and [#4](#send-application-metrics-). ```bash npx sentry@latest init From 9728d2b9663071e4e7b1e9565bb1c6ea73f3936c Mon Sep 17 00:00:00 2001 From: "sentry-junior[bot]" <264270552+sentry-junior[bot]@users.noreply.github.com> Date: Wed, 21 Oct 2026 15:06:12 -0400 Subject: [PATCH 039/127] chore(codeowners): Use combined @getsentry/replay team (#20117) Replay is consolidating `@getsentry/replay-frontend` and `@getsentry/replay-backend` into a single `@getsentry/replay` team. The only references here are in commented-out session replay entries; this updates them so they're correct if they get re-enabled. via **George Gritsouk**. -- [View Junior Session](https://junior-prod.sentry.dev/conversations/slack%3AD0AR76A9F5G%3A1792532905.460029) [[Sentry]](https://sentry.sentry.io/explore/conversations/slack%3AD0AR76A9F5G%3A1792532905.460029/?project=4510944073809921) Co-authored-by: sentry-junior[bot] <264270552+sentry-junior[bot]@users.noreply.github.com> Co-authored-by: George Gritsouk --- .github/CODEOWNERS | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 632f554df70a5..bc7683093e93a 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -37,8 +37,8 @@ # ###### Replays ####### -# /docs/product/explore/session-replay/web @getsentry/replay-sdk-web @getsentry/replay-frontend @getsentry/replay-backend -# /docs/product/explore/session-replay/mobile @getsentry/replay-sdk-mobile @getsentry/replay-frontend @getsentry/replay-sdk-mobile +# /docs/product/explore/session-replay/web @getsentry/replay-sdk-web @getsentry/replay +# /docs/product/explore/session-replay/mobile @getsentry/replay-sdk-mobile @getsentry/replay @getsentry/replay-sdk-mobile # /includes/session-replay-web-report-bug.mdx @getsentry/replay-sdk-web # /platform-includes/session-replay/ @getsentry/replay-sdk-web @getsentry/replay-sdk-mobile # /docs/platforms/javascript/common/session-replay/ @getsentry/replay-sdk-web From 9eb3e5c937bbcfdccf59941e8f4085193bb3f0cb Mon Sep 17 00:00:00 2001 From: "sentry-api-schema-updater[bot]" <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> Date: Wed, 21 Oct 2026 20:30:15 +0000 Subject: [PATCH 040/127] Bump API schema to 277e2b11 (#20152) Co-authored-by: sentry-api-schema-updater[bot] <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> --- src/build/resolveOpenAPI.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/resolveOpenAPI.ts b/src/build/resolveOpenAPI.ts index 7758577c8bea4..5c06b8a07426e 100644 --- a/src/build/resolveOpenAPI.ts +++ b/src/build/resolveOpenAPI.ts @@ -6,7 +6,7 @@ import {DeRefedOpenAPI, Parameter} from './open-api/types'; // SENTRY_API_SCHEMA_SHA is used in the sentry-docs GHA workflow in getsentry/sentry-api-schema. // DO NOT change variable name unless you change it in the sentry-docs GHA workflow in getsentry/sentry-api-schema. -const SENTRY_API_SCHEMA_SHA = '35fcbf58e32fe7ecb5b7fce5dcd6fb5c29f07374'; +const SENTRY_API_SCHEMA_SHA = '277e2b1129ac7b38d92c94c030adb42680ea1f1a'; const activeEnv = process.env.GATSBY_ENV || process.env.NODE_ENV || 'development'; From a91908fe95b4ff708ce1ff16ae57b508cc22d2a1 Mon Sep 17 00:00:00 2001 From: "sentry-api-schema-updater[bot]" <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> Date: Wed, 21 Oct 2026 20:33:55 +0000 Subject: [PATCH 041/127] Bump API schema to 65ff00aa (#20153) Co-authored-by: sentry-api-schema-updater[bot] <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> --- src/build/resolveOpenAPI.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/resolveOpenAPI.ts b/src/build/resolveOpenAPI.ts index 5c06b8a07426e..d8dbeec5ada76 100644 --- a/src/build/resolveOpenAPI.ts +++ b/src/build/resolveOpenAPI.ts @@ -6,7 +6,7 @@ import {DeRefedOpenAPI, Parameter} from './open-api/types'; // SENTRY_API_SCHEMA_SHA is used in the sentry-docs GHA workflow in getsentry/sentry-api-schema. // DO NOT change variable name unless you change it in the sentry-docs GHA workflow in getsentry/sentry-api-schema. -const SENTRY_API_SCHEMA_SHA = '277e2b1129ac7b38d92c94c030adb42680ea1f1a'; +const SENTRY_API_SCHEMA_SHA = '65ff00aa7938f8af012a122564d7f2c4af07fc96'; const activeEnv = process.env.GATSBY_ENV || process.env.NODE_ENV || 'development'; From 330727b2fde6716083f6d229c2e86939466b36e8 Mon Sep 17 00:00:00 2001 From: "sentry-api-schema-updater[bot]" <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> Date: Wed, 21 Oct 2026 20:41:55 +0000 Subject: [PATCH 042/127] Bump API schema to c7d6eef6 (#20154) Co-authored-by: sentry-api-schema-updater[bot] <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> --- src/build/resolveOpenAPI.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/resolveOpenAPI.ts b/src/build/resolveOpenAPI.ts index d8dbeec5ada76..4ea44ec1157c4 100644 --- a/src/build/resolveOpenAPI.ts +++ b/src/build/resolveOpenAPI.ts @@ -6,7 +6,7 @@ import {DeRefedOpenAPI, Parameter} from './open-api/types'; // SENTRY_API_SCHEMA_SHA is used in the sentry-docs GHA workflow in getsentry/sentry-api-schema. // DO NOT change variable name unless you change it in the sentry-docs GHA workflow in getsentry/sentry-api-schema. -const SENTRY_API_SCHEMA_SHA = '65ff00aa7938f8af012a122564d7f2c4af07fc96'; +const SENTRY_API_SCHEMA_SHA = 'c7d6eef63fc8e86a4b0d5d89c70936b8ace49501'; const activeEnv = process.env.GATSBY_ENV || process.env.NODE_ENV || 'development'; From 5aa82449a102214b685127b8ec93a87ee16bff3b Mon Sep 17 00:00:00 2001 From: "sentry-api-schema-updater[bot]" <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> Date: Wed, 21 Oct 2026 20:45:15 +0000 Subject: [PATCH 043/127] Bump API schema to 56b2ed5c (#20155) Co-authored-by: sentry-api-schema-updater[bot] <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> --- src/build/resolveOpenAPI.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/resolveOpenAPI.ts b/src/build/resolveOpenAPI.ts index 4ea44ec1157c4..e2afb27791f39 100644 --- a/src/build/resolveOpenAPI.ts +++ b/src/build/resolveOpenAPI.ts @@ -6,7 +6,7 @@ import {DeRefedOpenAPI, Parameter} from './open-api/types'; // SENTRY_API_SCHEMA_SHA is used in the sentry-docs GHA workflow in getsentry/sentry-api-schema. // DO NOT change variable name unless you change it in the sentry-docs GHA workflow in getsentry/sentry-api-schema. -const SENTRY_API_SCHEMA_SHA = 'c7d6eef63fc8e86a4b0d5d89c70936b8ace49501'; +const SENTRY_API_SCHEMA_SHA = '56b2ed5c9b373d330e9e3d2525f00b7a7def74ca'; const activeEnv = process.env.GATSBY_ENV || process.env.NODE_ENV || 'development'; From a3acb511a8e82ea2a67d96ae1b883a07042f64ae Mon Sep 17 00:00:00 2001 From: "sentry-api-schema-updater[bot]" <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> Date: Wed, 21 Oct 2026 20:54:23 +0000 Subject: [PATCH 044/127] Bump API schema to 51baedb1 (#20156) Co-authored-by: sentry-api-schema-updater[bot] <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> --- src/build/resolveOpenAPI.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/resolveOpenAPI.ts b/src/build/resolveOpenAPI.ts index e2afb27791f39..a9e4227ba4252 100644 --- a/src/build/resolveOpenAPI.ts +++ b/src/build/resolveOpenAPI.ts @@ -6,7 +6,7 @@ import {DeRefedOpenAPI, Parameter} from './open-api/types'; // SENTRY_API_SCHEMA_SHA is used in the sentry-docs GHA workflow in getsentry/sentry-api-schema. // DO NOT change variable name unless you change it in the sentry-docs GHA workflow in getsentry/sentry-api-schema. -const SENTRY_API_SCHEMA_SHA = '56b2ed5c9b373d330e9e3d2525f00b7a7def74ca'; +const SENTRY_API_SCHEMA_SHA = '51baedb1eb329f5dcac74e8d6bd8e81283788b99'; const activeEnv = process.env.GATSBY_ENV || process.env.NODE_ENV || 'development'; From b9d191354583775a685d1a5054dbce30457f3183 Mon Sep 17 00:00:00 2001 From: "sentry-api-schema-updater[bot]" <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> Date: Wed, 21 Oct 2026 20:58:10 +0000 Subject: [PATCH 045/127] Bump API schema to e3ee5395 (#20157) Co-authored-by: sentry-api-schema-updater[bot] <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> --- src/build/resolveOpenAPI.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/resolveOpenAPI.ts b/src/build/resolveOpenAPI.ts index a9e4227ba4252..aa72d8dce24d0 100644 --- a/src/build/resolveOpenAPI.ts +++ b/src/build/resolveOpenAPI.ts @@ -6,7 +6,7 @@ import {DeRefedOpenAPI, Parameter} from './open-api/types'; // SENTRY_API_SCHEMA_SHA is used in the sentry-docs GHA workflow in getsentry/sentry-api-schema. // DO NOT change variable name unless you change it in the sentry-docs GHA workflow in getsentry/sentry-api-schema. -const SENTRY_API_SCHEMA_SHA = '51baedb1eb329f5dcac74e8d6bd8e81283788b99'; +const SENTRY_API_SCHEMA_SHA = 'e3ee5395745a4d2ac5476aa76cab180b40ca429b'; const activeEnv = process.env.GATSBY_ENV || process.env.NODE_ENV || 'development'; From 92406c9049f836492b14a39343d85277a8ab1daf Mon Sep 17 00:00:00 2001 From: "sentry-junior[bot]" <264270552+sentry-junior[bot]@users.noreply.github.com> Date: Wed, 21 Oct 2026 15:30:44 -0700 Subject: [PATCH 046/127] build(node): Bump Node to 22.23.4 (#20150) ## DESCRIBE YOUR PR Bumps `volta.node` from 22.16.0 to 22.23.4. CI reads it through `node-version-file: package.json`. Node 22.23.4 is the October 2026 security release for the eMudhra/emSign CA compromise. It updates the bundled root store to NSS 3.131.1 and rejects TLS chains that contain the compromised keys. An exact pin doesn't pick that up on its own. Refs VULN-3216. Release notes: https://nodejs.org/en/blog/vulnerability/october-2026-security-releases ## IS YOUR CHANGE URGENT? - [x] Urgent deadline (GA date, etc.): 2026-10-23 - [ ] Other deadline: YYYY-MM-DD - [ ] No deadline: Not urgent, can wait up to 1 week+ via **Geoff Goldsmith**. -- [View Junior Session](https://junior-prod.sentry.dev/conversations/slack%3AD0AU0K3PXU4%3A1792602908.092969) [[Sentry]](https://sentry.sentry.io/explore/conversations/slack%3AD0AU0K3PXU4%3A1792602908.092969/?project=4510944073809921) Co-authored-by: sentry-junior[bot] <264270552+sentry-junior[bot]@users.noreply.github.com> Co-authored-by: Geoff Goldsmith --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e278217c5085e..e077145a96ce0 100644 --- a/package.json +++ b/package.json @@ -201,7 +201,7 @@ }, "packageManager": "pnpm@10.30.0", "volta": { - "node": "22.16.0", + "node": "22.23.4", "pnpm": "10.30.0" } } From 67a59cd86d37adf0f9e01060455c37f825f8f2ba Mon Sep 17 00:00:00 2001 From: "sentry-junior[bot]" <264270552+sentry-junior[bot]@users.noreply.github.com> Date: Wed, 21 Oct 2026 16:12:55 -0700 Subject: [PATCH 047/127] docs(uptime): Document redirect limit for uptime checks (#20160) ## DESCRIBE YOUR PR Notes that uptime checks follow up to 9 redirects and fail with a "Too many redirects" error past that. The uptime checker uses its HTTP client's default redirect policy (`Policy::limited(10)`, which counts the original request), so a check makes at most 10 requests. Refs NEW-708. ## IS YOUR CHANGE URGENT? - [ ] Urgent deadline (GA date, etc.): YYYY-MM-DD - [ ] Other deadline: YYYY-MM-DD - [x] No deadline: Not urgent, can wait up to 1 week+ ## PRE-MERGE CHECKLIST - [ ] Checked Vercel preview for correctness, including links - [ ] PR was reviewed and approved by any necessary SMEs (subject matter experts) - [ ] PR was reviewed and approved by a member of the [Sentry docs team](https://github.com/orgs/getsentry/teams/docs) via **matt.duncan**. -- [View Junior Session](https://junior-prod.sentry.dev/conversations/slack%3AC0C8Z02BG5Q%3A1792623107.389889) [[Sentry]](https://sentry.sentry.io/explore/conversations/slack%3AC0C8Z02BG5Q%3A1792623107.389889/?project=4510944073809921) Co-authored-by: sentry-junior[bot] <264270552+sentry-junior[bot]@users.noreply.github.com> Co-authored-by: Matt Duncan --- .../monitors-and-alerts/monitors/uptime-monitoring/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/product/monitors-and-alerts/monitors/uptime-monitoring/index.mdx b/docs/product/monitors-and-alerts/monitors/uptime-monitoring/index.mdx index 00c825e643155..4b71be7851800 100644 --- a/docs/product/monitors-and-alerts/monitors/uptime-monitoring/index.mdx +++ b/docs/product/monitors-and-alerts/monitors/uptime-monitoring/index.mdx @@ -58,7 +58,7 @@ Our uptime monitoring system verifies the availability of your URLs by performin 1. **Successful Response (2xx Status Codes):** By default, the URL must return an HTTP status code in the 200–299 range, indicating a successful request. You can customize this behavior with [custom verification](#verification) (early access). -2. **Automatic Handling of Redirects (3xx Status Codes):** Sentry will follow redirects for URLs returning an HTTP status code in the 300–399 range and verify that the final destination URL returns a successful response. This ensures that redirects won't falsely create downtime issues. +2. **Automatic Handling of Redirects (3xx Status Codes):** Sentry will follow redirects for URLs returning an HTTP status code in the 300–399 range and verify that the final destination URL returns a successful response. This ensures that redirects won't falsely create downtime issues. Sentry follows up to 9 redirects. If the URL redirects more times than that, the check fails. 3. **Timeout Setting:** Each request has a timeout threshold of 10 seconds. If the server doesn't respond within this period, the check will be marked as a failure, indicating a potential downtime or performance issues. From 269bae70448125a909e945516406bf19aa209e26 Mon Sep 17 00:00:00 2001 From: "sentry-api-schema-updater[bot]" <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> Date: Thu, 22 Oct 2026 07:43:27 +0000 Subject: [PATCH 048/127] Bump API schema to f45d69fe (#20164) Co-authored-by: sentry-api-schema-updater[bot] <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> --- src/build/resolveOpenAPI.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/resolveOpenAPI.ts b/src/build/resolveOpenAPI.ts index aa72d8dce24d0..023d59e63c882 100644 --- a/src/build/resolveOpenAPI.ts +++ b/src/build/resolveOpenAPI.ts @@ -6,7 +6,7 @@ import {DeRefedOpenAPI, Parameter} from './open-api/types'; // SENTRY_API_SCHEMA_SHA is used in the sentry-docs GHA workflow in getsentry/sentry-api-schema. // DO NOT change variable name unless you change it in the sentry-docs GHA workflow in getsentry/sentry-api-schema. -const SENTRY_API_SCHEMA_SHA = 'e3ee5395745a4d2ac5476aa76cab180b40ca429b'; +const SENTRY_API_SCHEMA_SHA = 'f45d69fef3d4e16a9fcd9b53385629596425ce63'; const activeEnv = process.env.GATSBY_ENV || process.env.NODE_ENV || 'development'; From 5af5ec23e7d4f4163002bf6619128c007db68b00 Mon Sep 17 00:00:00 2001 From: "sentry-api-schema-updater[bot]" <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> Date: Thu, 22 Oct 2026 07:47:07 +0000 Subject: [PATCH 049/127] Bump API schema to 79c193f9 (#20165) Co-authored-by: sentry-api-schema-updater[bot] <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> --- src/build/resolveOpenAPI.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/resolveOpenAPI.ts b/src/build/resolveOpenAPI.ts index 023d59e63c882..9e6150816b6b1 100644 --- a/src/build/resolveOpenAPI.ts +++ b/src/build/resolveOpenAPI.ts @@ -6,7 +6,7 @@ import {DeRefedOpenAPI, Parameter} from './open-api/types'; // SENTRY_API_SCHEMA_SHA is used in the sentry-docs GHA workflow in getsentry/sentry-api-schema. // DO NOT change variable name unless you change it in the sentry-docs GHA workflow in getsentry/sentry-api-schema. -const SENTRY_API_SCHEMA_SHA = 'f45d69fef3d4e16a9fcd9b53385629596425ce63'; +const SENTRY_API_SCHEMA_SHA = '79c193f94e660ee1fb4ba071707b21beebf41820'; const activeEnv = process.env.GATSBY_ENV || process.env.NODE_ENV || 'development'; From 57dd39672dc19e48882c18480ee34df2b2c1bcc3 Mon Sep 17 00:00:00 2001 From: Dan Fuller Date: Thu, 22 Oct 2026 00:50:12 -0700 Subject: [PATCH 050/127] docs(crons): Add arq setup for Python (#20056) ## DESCRIBE YOUR PR Adds an arq section to the Python Crons setup page: turning on `monitor_cron_jobs`, how the slug is picked, and which cron jobs are monitored. SDK PR: https://github.com/getsentry/sentry-python/pull/8051 Merge after the SDK release that includes it. ## IS YOUR CHANGE URGENT? Help us prioritize incoming PRs by letting us know when the change needs to go live. Select exactly one option. For deadlines, replace `YYYY-MM-DD` with the due date. You can update this information later by editing the PR description. - [ ] Urgent deadline (GA date, etc.): YYYY-MM-DD - [ ] Other deadline: YYYY-MM-DD - [x] No deadline: Not urgent, can wait up to 1 week+ --------- Co-authored-by: Claude --- platform-includes/crons/setup/python.mdx | 37 ++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/platform-includes/crons/setup/python.mdx b/platform-includes/crons/setup/python.mdx index 27e90b390e83e..da9fad0b17800 100644 --- a/platform-includes/crons/setup/python.mdx +++ b/platform-includes/crons/setup/python.mdx @@ -2,6 +2,43 @@ If you're using **Celery Beat** to run your periodic tasks, have a look at our [Celery Beat Auto Discovery documentation](/platforms/python/integrations/celery/crons/). +### arq + + + +Crons monitoring for arq ships in version `2.73.0` of `sentry-sdk`. + + + +If you're using [arq](/platforms/python/integrations/arq/), set `monitor_cron_jobs=True` to capture check-ins for the cron jobs in your worker's `cron_jobs`: + +```python +import sentry_sdk +from sentry_sdk.integrations.arq import ArqIntegration + +sentry_sdk.init( + dsn="___PUBLIC_DSN___", + integrations=[ + ArqIntegration( + monitor_cron_jobs=True, + # optional: regular expressions for cron jobs to skip + exclude_cron_jobs=["cleanup"], + ), + ], +) +``` + +```python +from arq import cron + +class WorkerSettings: + cron_jobs = [ + cron(send_report, hour=9, minute=0), + ] +``` + +The monitor slug is the cron job's `name`, without arq's `cron:` prefix, so the example above reports to `send_report`. Sentry creates the monitor from the job's `month`, `day`, `weekday`, `hour`, and `minute` in the worker's `timezone`. Cron jobs aren't monitored when their schedule can't be expressed in the Crons schedule format (for example, a job that runs every 10 seconds), when they set both `day` and `weekday`, or when the worker's time zone has a fixed offset that isn't a whole number of hours. + ## Job Monitoring Use the Python SDK to monitor and notify you if your periodic task is missed (or doesn't start when expected), if it fails due to a problem in the runtime (such as an error), or if it fails by exceeding its maximum runtime. From 20fd09ed41690094cc343da2b8d59a920caea245 Mon Sep 17 00:00:00 2001 From: "sentry-api-schema-updater[bot]" <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> Date: Thu, 22 Oct 2026 08:23:47 +0000 Subject: [PATCH 051/127] Bump API schema to 8f61c4a4 (#20166) Co-authored-by: sentry-api-schema-updater[bot] <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> --- src/build/resolveOpenAPI.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/resolveOpenAPI.ts b/src/build/resolveOpenAPI.ts index 9e6150816b6b1..722596bdbc24f 100644 --- a/src/build/resolveOpenAPI.ts +++ b/src/build/resolveOpenAPI.ts @@ -6,7 +6,7 @@ import {DeRefedOpenAPI, Parameter} from './open-api/types'; // SENTRY_API_SCHEMA_SHA is used in the sentry-docs GHA workflow in getsentry/sentry-api-schema. // DO NOT change variable name unless you change it in the sentry-docs GHA workflow in getsentry/sentry-api-schema. -const SENTRY_API_SCHEMA_SHA = '79c193f94e660ee1fb4ba071707b21beebf41820'; +const SENTRY_API_SCHEMA_SHA = '8f61c4a4135238b9bb1eba94780f7c8beeb8e6e9'; const activeEnv = process.env.GATSBY_ENV || process.env.NODE_ENV || 'development'; From cf9a67c4aad9209f7ca35f775896ad7b23498430 Mon Sep 17 00:00:00 2001 From: "sentry-api-schema-updater[bot]" <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> Date: Thu, 22 Oct 2026 08:26:51 +0000 Subject: [PATCH 052/127] Bump API schema to c4a364de (#20167) Co-authored-by: sentry-api-schema-updater[bot] <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> --- src/build/resolveOpenAPI.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/resolveOpenAPI.ts b/src/build/resolveOpenAPI.ts index 722596bdbc24f..730b59e07f66d 100644 --- a/src/build/resolveOpenAPI.ts +++ b/src/build/resolveOpenAPI.ts @@ -6,7 +6,7 @@ import {DeRefedOpenAPI, Parameter} from './open-api/types'; // SENTRY_API_SCHEMA_SHA is used in the sentry-docs GHA workflow in getsentry/sentry-api-schema. // DO NOT change variable name unless you change it in the sentry-docs GHA workflow in getsentry/sentry-api-schema. -const SENTRY_API_SCHEMA_SHA = '8f61c4a4135238b9bb1eba94780f7c8beeb8e6e9'; +const SENTRY_API_SCHEMA_SHA = 'c4a364deccd2e15cade8b000566ba9fdaf130620'; const activeEnv = process.env.GATSBY_ENV || process.env.NODE_ENV || 'development'; From 7beb2937d6d2fb57e259fb9888b99f82f8308789 Mon Sep 17 00:00:00 2001 From: Dan Fuller Date: Thu, 22 Oct 2026 01:32:03 -0700 Subject: [PATCH 053/127] docs(crons): Add Huey setup for Python (#20057) ## DESCRIBE YOUR PR Adds a Huey section to the Python Crons setup page: turning on `monitor_periodic_tasks`, how the slug is picked, and which periodic tasks are monitored. SDK PR: https://github.com/getsentry/sentry-python/pull/8052 Stacked on https://github.com/getsentry/sentry-docs/pull/20056. Merge after the SDK release that includes it. ## IS YOUR CHANGE URGENT? Help us prioritize incoming PRs by letting us know when the change needs to go live. Select exactly one option. For deadlines, replace `YYYY-MM-DD` with the due date. You can update this information later by editing the PR description. - [ ] Urgent deadline (GA date, etc.): YYYY-MM-DD - [ ] Other deadline: YYYY-MM-DD - [x] No deadline: Not urgent, can wait up to 1 week+ --------- Co-authored-by: Claude Co-authored-by: Ivana Kellyer --- platform-includes/crons/setup/python.mdx | 36 ++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/platform-includes/crons/setup/python.mdx b/platform-includes/crons/setup/python.mdx index da9fad0b17800..2e0d48548ad82 100644 --- a/platform-includes/crons/setup/python.mdx +++ b/platform-includes/crons/setup/python.mdx @@ -39,6 +39,42 @@ class WorkerSettings: The monitor slug is the cron job's `name`, without arq's `cron:` prefix, so the example above reports to `send_report`. Sentry creates the monitor from the job's `month`, `day`, `weekday`, `hour`, and `minute` in the worker's `timezone`. Cron jobs aren't monitored when their schedule can't be expressed in the Crons schedule format (for example, a job that runs every 10 seconds), when they set both `day` and `weekday`, or when the worker's time zone has a fixed offset that isn't a whole number of hours. +### Huey + + + +Crons monitoring for Huey ships in version `2.73.0` of `sentry-sdk`. + + + +If you're using [Huey](/platforms/python/integrations/huey/), set `monitor_periodic_tasks=True` to capture check-ins for your periodic tasks: + +```python +import sentry_sdk +from sentry_sdk.integrations.huey import HueyIntegration + +sentry_sdk.init( + dsn="___PUBLIC_DSN___", + integrations=[ + HueyIntegration( + monitor_periodic_tasks=True, + # optional: regular expressions for periodic tasks to skip + exclude_periodic_tasks=["cleanup"], + ), + ], +) +``` + +```python +from huey import crontab + +@huey.periodic_task(crontab(minute="0", hour="9")) +def send_report(): + ... +``` + +The monitor slug is the task's name, which defaults to the function name. Sentry creates the monitor from the task's `crontab()` schedule in UTC. Periodic tasks aren't monitored when they use a custom schedule function, when their crontab sets both `day` and `day_of_week`, or when the Huey instance is created with `utc=False`. + ## Job Monitoring Use the Python SDK to monitor and notify you if your periodic task is missed (or doesn't start when expected), if it fails due to a problem in the runtime (such as an error), or if it fails by exceeding its maximum runtime. From 92ea6752671f56bbc9411c7fd247dae54095535b Mon Sep 17 00:00:00 2001 From: "sentry-api-schema-updater[bot]" <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> Date: Thu, 22 Oct 2026 08:57:23 +0000 Subject: [PATCH 054/127] Bump API schema to 2da92393 (#20168) Co-authored-by: sentry-api-schema-updater[bot] <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> --- src/build/resolveOpenAPI.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/resolveOpenAPI.ts b/src/build/resolveOpenAPI.ts index 730b59e07f66d..f2c558b8b0c13 100644 --- a/src/build/resolveOpenAPI.ts +++ b/src/build/resolveOpenAPI.ts @@ -6,7 +6,7 @@ import {DeRefedOpenAPI, Parameter} from './open-api/types'; // SENTRY_API_SCHEMA_SHA is used in the sentry-docs GHA workflow in getsentry/sentry-api-schema. // DO NOT change variable name unless you change it in the sentry-docs GHA workflow in getsentry/sentry-api-schema. -const SENTRY_API_SCHEMA_SHA = 'c4a364deccd2e15cade8b000566ba9fdaf130620'; +const SENTRY_API_SCHEMA_SHA = '2da92393a8df8d787586395181346cd56b59a84b'; const activeEnv = process.env.GATSBY_ENV || process.env.NODE_ENV || 'development'; From 3a864da0b677fd71d757d1f53abf57bf90ba3a6d Mon Sep 17 00:00:00 2001 From: "sentry-api-schema-updater[bot]" <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> Date: Thu, 22 Oct 2026 09:00:48 +0000 Subject: [PATCH 055/127] Bump API schema to 6bb07ed1 (#20169) Co-authored-by: sentry-api-schema-updater[bot] <271575301+sentry-api-schema-updater[bot]@users.noreply.github.com> --- src/build/resolveOpenAPI.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/resolveOpenAPI.ts b/src/build/resolveOpenAPI.ts index f2c558b8b0c13..9c9bb5f7d08ab 100644 --- a/src/build/resolveOpenAPI.ts +++ b/src/build/resolveOpenAPI.ts @@ -6,7 +6,7 @@ import {DeRefedOpenAPI, Parameter} from './open-api/types'; // SENTRY_API_SCHEMA_SHA is used in the sentry-docs GHA workflow in getsentry/sentry-api-schema. // DO NOT change variable name unless you change it in the sentry-docs GHA workflow in getsentry/sentry-api-schema. -const SENTRY_API_SCHEMA_SHA = '2da92393a8df8d787586395181346cd56b59a84b'; +const SENTRY_API_SCHEMA_SHA = '6bb07ed16c36af37f8f821e1d1e3c9e48d219d77'; const activeEnv = process.env.GATSBY_ENV || process.env.NODE_ENV || 'development'; From 24fdeaa3f64b0c11ceaeb54d59ef7c00407005fd Mon Sep 17 00:00:00 2001 From: Dan Fuller Date: Thu, 22 Oct 2026 03:02:33 -0700 Subject: [PATCH 056/127] docs(crons): Add RQ setup for Python (#20058) ## DESCRIBE YOUR PR Adds an RQ section to the Python Crons setup page: turning on `monitor_cron_jobs` for rq-scheduler jobs, how the slug is picked, and which jobs are monitored. SDK PR: https://github.com/getsentry/sentry-python/pull/8053 Stacked on https://github.com/getsentry/sentry-docs/pull/20057. Merge after the SDK release that includes it. ## IS YOUR CHANGE URGENT? Help us prioritize incoming PRs by letting us know when the change needs to go live. Select exactly one option. For deadlines, replace `YYYY-MM-DD` with the due date. You can update this information later by editing the PR description. - [ ] Urgent deadline (GA date, etc.): YYYY-MM-DD - [ ] Other deadline: YYYY-MM-DD - [x] No deadline: Not urgent, can wait up to 1 week+ --------- Co-authored-by: Claude Co-authored-by: Ivana Kellyer --- platform-includes/crons/setup/python.mdx | 33 ++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/platform-includes/crons/setup/python.mdx b/platform-includes/crons/setup/python.mdx index 2e0d48548ad82..37075d8587eee 100644 --- a/platform-includes/crons/setup/python.mdx +++ b/platform-includes/crons/setup/python.mdx @@ -75,6 +75,39 @@ def send_report(): The monitor slug is the task's name, which defaults to the function name. Sentry creates the monitor from the task's `crontab()` schedule in UTC. Periodic tasks aren't monitored when they use a custom schedule function, when their crontab sets both `day` and `day_of_week`, or when the Huey instance is created with `utc=False`. +### RQ + + + +Crons monitoring for RQ ships in version `2.73.0` of `sentry-sdk`. + + + +If you're using [RQ](/platforms/python/integrations/rq/) with [rq-scheduler](https://github.com/rq/rq-scheduler), set `monitor_cron_jobs=True` in your workers to capture check-ins for recurring jobs: + +```python +import sentry_sdk +from sentry_sdk.integrations.rq import RqIntegration + +sentry_sdk.init( + dsn="___PUBLIC_DSN___", + integrations=[ + RqIntegration( + monitor_cron_jobs=True, + # optional: regular expressions for jobs to skip + exclude_cron_jobs=["cleanup"], + ), + ], +) +``` + +```python +scheduler.cron("0 9 * * *", func=send_report, id="send-report") +scheduler.schedule(datetime.now(timezone.utc), sync_accounts, interval=600, id="sync-accounts") +``` + +The monitor slug is the job's `id`. Without an `id`, rq-scheduler generates a new one each time the job is scheduled, so the SDK uses the function's import path instead. Sentry creates the monitor from `cron()` jobs and from `schedule()` jobs whose `interval` is a whole number of minutes. rq-scheduler runs cron strings in the system's local time, so `cron()` jobs are only monitored when the worker's time zone is UTC. Jobs whose schedule can't be expressed in the Crons schedule format (for example, a job that runs every 10 seconds), jobs with `repeat`, and one-off jobs from `enqueue_at` and `enqueue_in` aren't monitored. + ## Job Monitoring Use the Python SDK to monitor and notify you if your periodic task is missed (or doesn't start when expected), if it fails due to a problem in the runtime (such as an error), or if it fails by exceeding its maximum runtime. From ddb6cbbb5d12e996386fb695591266ad0bdc5dfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Peer=20St=C3=B6cklmair?= Date: Thu, 22 Oct 2026 12:43:27 +0200 Subject: [PATCH 057/127] docs(span-links): Add `message_origin` link type for queues (#20023) ## DESCRIBE YOUR PR This adds the `message_origin` link type to the span links page. A queue consumer span uses it to link to the producer span that published the message, like `cache_origin` does for cached values. The BullMQ integration of the JavaScript SDK sets it first (getsentry/sentry-javascript#21777), and the conventions added it in getsentry/sentry-conventions#724. ## IS YOUR CHANGE URGENT? Help us prioritize incoming PRs by letting us know when the change needs to go live. Select exactly one option. For deadlines, replace `YYYY-MM-DD` with the due date. You can update this information later by editing the PR description. - [ ] Urgent deadline (GA date, etc.): YYYY-MM-DD - [ ] Other deadline: YYYY-MM-DD - [x] No deadline: Not urgent, can wait up to 1 week+ ## SLA - Teamwork makes the dream work, so please add a reviewer to your PRs. - Please give the docs team up to 1 week to review your PR unless you've supplied a deadline. Thanks in advance for your help! ## PRE-MERGE CHECKLIST _Make sure you've checked the following before merging your changes:_ - [ ] Checked Vercel preview for correctness, including links - [ ] PR was reviewed and approved by any necessary SMEs (subject matter experts) - [ ] PR was reviewed and approved by a member of the [Sentry docs team](https://github.com/orgs/getsentry/teams/docs) ## LEGAL BOILERPLATE Look, I get it. The entity doing business as "Sentry" was incorporated in the State of Delaware in 2015 as Functional Software, Inc. and is gonna need some rights from me in order to utilize my contributions in this here PR. So here's the deal: I retain all rights, title and interest in and to my contributions, and by keeping this boilerplate intact I confirm that Sentry can use, modify, copy, and redistribute my contributions, under Sentry's choice of terms. ## EXTRA RESOURCES - [Sentry Docs contributor guide](https://docs.sentry.io/contributing/) --------- Co-authored-by: Claude Opus 5.5 --- .../sdk/telemetry/traces/span-links.mdx | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/develop-docs/sdk/telemetry/traces/span-links.mdx b/develop-docs/sdk/telemetry/traces/span-links.mdx index eea20abe92c47..02de4768affa8 100644 --- a/develop-docs/sdk/telemetry/traces/span-links.mdx +++ b/develop-docs/sdk/telemetry/traces/span-links.mdx @@ -147,6 +147,7 @@ Any string can be used, but these types have predefined meanings: |--------------------|--------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------| | "previous_trace" | Linking e.g. a navigation span to the previous page load span. | Used to query linked traces. Shows a button to go to linked previous trace in the trace explorer. | | "cache_origin" | Linking a span that reads a cached value to the trace that produced that value (e.g. server-side rendering). | Used to navigate from a cache-hit span to the origin trace. | +| "message_origin" | Linking a span that processes a queue message to the span that published the message (e.g. a queue job). | Used to navigate from a consumer span to the producer trace. | ### `previous_trace` @@ -209,6 +210,35 @@ The origin trace may be negatively sampled. The link is still added, with `sampl A background revalidation (for example, stale-while-revalidate) starts its own trace rather than continuing the serving trace, and becomes the origin for future cache hits. +### `message_origin` + +When a consumer processes a message, the work often runs long after the producer published it, in another process, and with a different sampling decision. +A parent/child relationship does not fit well: a delayed or retried job keeps the producer trace open for a long time, one publish span can fan out to many consumers, and a batch can contain messages from unrelated traces, so it has no single correct parent. +If the consumer starts its own trace, then without a link, the consumer trace has no way to find the code that published the message. + +The [Queues module](/sdk/telemetry/traces/modules/queues/#distributed-tracing) continues the producer trace in the consumer where it can. +For the cases above, start a new trace in the consumer and add a `message_origin` link instead. +If the consumer continues the producer trace, do not add the link, because it would point into the same trace. + +A `message_origin` link connects the span that processes a message (for example, a `queue.process` span) to the span that published it (for example, a `queue.publish` span). "Origin" here means the producer span, not the consumer. + +Add the link to the span that processes the message: + +```ts +span.addLink({ + context: producerSpanContext, // propagated with the message + attributes: { + 'sentry.link.type': 'message_origin' + } +}) +``` + +- On publish, store the context of the publish span (for example, the `queue.publish` span: `trace_id`, `span_id`, sampling decision) with the message, for example in message metadata or headers. +- On process, read the stored context and add the link. A span that processes a batch adds one link for each distinct producer span in the batch. +- If the message has no stored context, emit the consumer span **without** a link. + +The producer trace may be negatively sampled. The link is still added, with `sampled: false` from the stored span context (same behavior as `previous_trace`). + ## Usage Example Adding span links should be possible at span start time, as well as when holding a reference to the span. From 78378e523273cc82587ebdf852124889bfcbd01f Mon Sep 17 00:00:00 2001 From: Antonis Lilis Date: Thu, 22 Oct 2026 13:57:51 +0200 Subject: [PATCH 058/127] docs(react-native): Document sentryWebViewProps for connecting WebView traces (#19659) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## DESCRIBE YOUR PR ⚠️ Should be merged after https://github.com/getsentry/sentry-react-native/pull/6794 is released Documents the new `sentryWebViewProps` helper (React Native SDK **8.32.0**) for connecting React Native traces with embedded WebViews. Updates `docs/platforms/react-native/common/configuration/webview.mdx`: - Adds a **Connect Traces** section: spread-onto-`` usage, `allowedHosts` gating (host + subdomain, case-insensitive), the requirement that the web page run a Browser SDK with `browserTracingIntegration`, the Android `onMessage` requirement + spread order, entry-pageload scope, and cross-project (same-org) trace stitching. - Removes the outdated "the SDK doesn't interact with the mobile application's web views" statement and clarifies error ownership between the native and web SDKs. Corresponding SDK PR: getsentry/sentry-react-native#6794 > **Note:** please hold merge until `@sentry/react-native` **8.232.0** is released (the page states that as the minimum version). ## IS YOUR CHANGE URGENT? - [x] No deadline: Not urgent, can wait up to 1 week+ (but hold until SDK 8.29.0 ships) ## PRE-MERGE CHECKLIST - [ ] Checked Vercel preview for correctness, including links - [ ] PR was reviewed and approved by any necessary SMEs (subject matter experts) - [ ] PR was reviewed and approved by a member of the [Sentry docs team](https://github.com/orgs/getsentry/teams/docs) ## EXTRA RESOURCES - [Sentry Docs contributor guide](https://docs.sentry.io/contributing/) 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.8 --- .../common/configuration/webview.mdx | 77 ++++++++++++++++++- 1 file changed, 73 insertions(+), 4 deletions(-) diff --git a/docs/platforms/react-native/common/configuration/webview.mdx b/docs/platforms/react-native/common/configuration/webview.mdx index 6dee56715513b..8a874f02ba0de 100644 --- a/docs/platforms/react-native/common/configuration/webview.mdx +++ b/docs/platforms/react-native/common/configuration/webview.mdx @@ -1,22 +1,91 @@ --- title: WebView -description: "Learn how to set up the Sentry React Native and Browser SDKs with React Native WebView." +description: "Learn how to connect traces and monitor errors and performance across the Sentry React Native and Browser SDKs with React Native WebView." --- -To monitor errors and performance in web views of React Native applications, you need to set up Sentry SDKs in both the mobile application and the web projects running in the web views. +To monitor errors and performance in web views of React Native applications, you set up Sentry SDKs in both the mobile application and the web projects running in the web views. You can also connect their traces, so a single distributed trace spans your React Native app and the web content it embeds. ## Application Monitoring -The Sentry React Native SDK doesn't interact with the mobile application's web views. To monitor errors and performance in the React Native part of the application follow the [Sentry React Native SDK setup instructions](/platforms/react-native/). +To monitor errors and performance in the React Native part of the application, follow the [Sentry React Native SDK setup instructions](/platforms/react-native/). The React Native SDK doesn't capture errors that happen inside a web view — those are captured by the JavaScript SDK running in the web project (see [WebView Monitoring](#webview-monitoring)). ## WebView Monitoring -To monitor errors and performance in web views choose the appropriate Sentry JavaScript SDK depending on the framework used in the web project. +To monitor errors and performance in web views, choose the appropriate Sentry JavaScript SDK depending on the framework used in the web project. - [Sentry React Native SDK](/platforms/react-native/) (if the web project uses React Native Web or Expo) - [Sentry React SDK](/platforms/javascript/guides/react/) (if the web project uses React) - [Other Sentry JavaScript SDKs](/platforms/javascript/) +## Connect Traces + + + +`sentryWebViewProps` is available from React Native SDK version `8.32.0`. + + + +Use `sentryWebViewProps` to inject the React Native app's trace into a web view. The Browser SDK running in the web page picks it up on pageload and continues the same trace, so the web page's pageload transaction and errors share the trace of your React Native app. The result is a single connected trace across the native and web parts of the user journey. + +Spread the props it returns onto your [`react-native-webview`](https://github.com/react-native-webview/react-native-webview) ``: + +```jsx +import { sentryWebViewProps } from "@sentry/react-native"; +import { WebView } from "react-native-webview"; + +; +``` + +For the connection to take effect: + +- The web page must run a Sentry [Browser SDK](/platforms/javascript/) with tracing enabled (the `browserTracingIntegration`). It continues the trace from the injected `sentry-trace` and `baggage` `` tags automatically — no additional configuration is needed on the web page. +- `allowedHosts` declares the hosts you trust to load in this WebView. A page is matched when its hostname equals an entry or is a subdomain of it (for example, `"example.com"` matches both `example.com` and `app.example.com`). Matching is case-insensitive, and the trace context is only written on matching pages. + + + +On iOS the trace tags are written before any page script runs. On **Android**, `react-native-webview` injects them asynchronously as the page starts, so they can land slightly after the page's first synchronous `` scripts. Load and initialize `@sentry/browser` the usual way — from a `