From 9ffd7eed7b2a1c4b91f6c7d099a511d8303546f1 Mon Sep 17 00:00:00 2001 From: Ivana Kellyerova Date: Wed, 4 Oct 2023 15:10:07 +0200 Subject: [PATCH] Add Python integration docs for Strawberry (#8085) --------- Co-authored-by: getsantry[bot] <66042841+getsantry[bot]@users.noreply.github.com> Co-authored-by: Liza Mock --- .../python/common/integrations/index.mdx | 11 +- .../common/integrations/strawberry/index.mdx | 139 ++++++++++++++++++ 2 files changed, 145 insertions(+), 5 deletions(-) create mode 100644 src/platforms/python/common/integrations/strawberry/index.mdx diff --git a/src/platforms/python/common/integrations/index.mdx b/src/platforms/python/common/integrations/index.mdx index 51ae046864d10..b991d66a18c3e 100644 --- a/src/platforms/python/common/integrations/index.mdx +++ b/src/platforms/python/common/integrations/index.mdx @@ -65,11 +65,12 @@ The Sentry SDK uses Integrations to hook into the functionality of popular libra ## GraphQL -| | **Auto enabled** | -| ----------------------------------------------------------------------------------------------------------------- | :--------------: | -| | | -| | | -| | | +| | **Auto enabled** | +| ---------------------------------------------------------------------------------------------------------------------- | :--------------: | +| | | +| | | +| | | +| | | ## RPC diff --git a/src/platforms/python/common/integrations/strawberry/index.mdx b/src/platforms/python/common/integrations/strawberry/index.mdx new file mode 100644 index 0000000000000..98abde034cd61 --- /dev/null +++ b/src/platforms/python/common/integrations/strawberry/index.mdx @@ -0,0 +1,139 @@ +--- +title: Strawberry +description: "Learn how to import the Strawberry GraphQL integration and how it captures GraphQL errors and spans." +--- + +The Strawberry integration captures errors and operations from the +[Strawberry GraphQL library](https://strawberry.rocks/), which can then be viewed +in [Sentry](https://sentry.io). + +## Install + +To get started, install `sentry-sdk` from PyPI. + +```bash +pip install --upgrade sentry-sdk +``` + +## Configure + +Add `StrawberryIntegration()` to your `integrations` list: + + + +```python +import sentry_sdk +from sentry_sdk.integrations.strawberry import StrawberryIntegration + +sentry_sdk.init( + dsn="___PUBLIC_DSN___", + # Set traces_sample_rate to 1.0 to capture 100% + # of transactions for performance monitoring. + traces_sample_rate=1.0, + integrations=[ + # Set async_execution to True if you have at least one async resolver + StrawberryIntegration(async_execution=True), + ], +) +``` + +## Verify + +Make sure you have all the prerequisites installed: + +```bash +pip install 'strawberry-graphql[debug-server]' +pip install fastapi +``` + +Create a `schema.py` file with the below content: + +```python +import strawberry + +sentry_sdk.init(...) # same as above + +async def resolve_hello(root) -> str: + 1 / 0 + return "Hello world!" + +@strawberry.type +class Query: + hello: str = strawberry.field(resolver=resolve_hello) + +schema = strawberry.Schema(Query) +``` + +To start the web server, run: + +```bash +strawberry server schema +``` + +Navigate to [http://127.0.0.1:8000/graphql](http://127.0.0.1:8000/graphql) in your +browser. You should see the GraphiQL graphical interface. + +Type `query HelloQuery { hello }` into the query input field then press the +"Execute query" button. Your web server will be queried, which should result in an +exception due to the `ZeroDivisionError` we've snuck into the `resolve_hello` +resolver. + +This will create a `GraphQLError` in the Issues section as well as a transaction +in the Performance section of [sentry.io](https://sentry.io). It will take a couple of moments for the data to appear in [sentry.io](https://sentry.io). + +## Options + +There are several options you will get to choose from: + +### Synchronous vs. Asynchronous Execution + +Strawberry supports both synchronous and asynchronous execution of GraphQL +queries. If you have at least one async resolver, you should initialize +`StrawberryIntegration` with `async_execution=True`, otherwise set it to `False`. + +The SDK will make a best-effort guess if `async_execution` is not provided, +based on installed web frameworks. + +```python +sentry_sdk.init( + # (...) other options + integrations=[ + StrawberryIntegration(async_execution=True), # or False + ], +) +``` + +### Capturing Request and Response Bodies + +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](https://docs.sentry.io/platforms/python/configuration/options/#send-default-pii) option set to `True`. + +```python +sentry_sdk.init( + # same options as above + send_default_pii=True, +) +``` + + + +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. + + + +## Notes + +Strawberry comes with a (now deprecated) built-in +[Sentry tracing extension](https://strawberry.rocks/docs/extensions/sentry-tracing) +that this integration is built on. To prevent duplicate traces, the Sentry SDK integration will deactivate the built-in Strawberry extension if you happen to be using both. + +## Supported Versions + +- strawberry-graphql: 0.209.5+ +- Python: 3.8+