|
@@ -2,13 +2,18 @@ import ExternalLink from 'sentry/components/links/externalLink';
|
|
import {Layout, LayoutProps} from 'sentry/components/onboarding/gettingStartedDoc/layout';
|
|
import {Layout, LayoutProps} from 'sentry/components/onboarding/gettingStartedDoc/layout';
|
|
import {ModuleProps} from 'sentry/components/onboarding/gettingStartedDoc/sdkDocumentation';
|
|
import {ModuleProps} from 'sentry/components/onboarding/gettingStartedDoc/sdkDocumentation';
|
|
import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/step';
|
|
import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/step';
|
|
|
|
+import {ProductSolution} from 'sentry/components/onboarding/productSelection';
|
|
import {t, tct} from 'sentry/locale';
|
|
import {t, tct} from 'sentry/locale';
|
|
|
|
|
|
// Configuration Start
|
|
// Configuration Start
|
|
|
|
+const performanceConfiguration = ` # Set traces_sample_rate to 1.0 to capture 100%
|
|
|
|
+ # of transactions for performance monitoring.
|
|
|
|
+ traces_sample_rate=1.0,`;
|
|
|
|
+
|
|
const introduction = (
|
|
const introduction = (
|
|
<p>
|
|
<p>
|
|
{tct(
|
|
{tct(
|
|
- 'The ASGI middleware can be used to instrument any [link:ASGI-compatible web framework] to attach request data for your events.',
|
|
|
|
|
|
+ 'The ASGI middleware can be used to instrument any bare bones ASGI application. If you have a ASGI based web framework (like FastAPI, Starlette, or others), please use the specific integration for the framework.',
|
|
{
|
|
{
|
|
link: <ExternalLink href="https://asgi.readthedocs.io/en/latest/" />,
|
|
link: <ExternalLink href="https://asgi.readthedocs.io/en/latest/" />,
|
|
}
|
|
}
|
|
@@ -17,21 +22,33 @@ const introduction = (
|
|
);
|
|
);
|
|
|
|
|
|
export const steps = ({
|
|
export const steps = ({
|
|
- dsn,
|
|
|
|
-}: Partial<Pick<ModuleProps, 'dsn'>> = {}): LayoutProps['steps'] => [
|
|
|
|
|
|
+ sentryInitContent,
|
|
|
|
+}: {
|
|
|
|
+ sentryInitContent: string;
|
|
|
|
+}): LayoutProps['steps'] => [
|
|
|
|
+ {
|
|
|
|
+ type: StepType.INSTALL,
|
|
|
|
+ description: (
|
|
|
|
+ <p>
|
|
|
|
+ {tct('Install [code:sentry-sdk] from PyPI:', {
|
|
|
|
+ code: <code />,
|
|
|
|
+ })}
|
|
|
|
+ </p>
|
|
|
|
+ ),
|
|
|
|
+ configurations: [
|
|
|
|
+ {
|
|
|
|
+ language: 'bash',
|
|
|
|
+ code: '$ pip install --upgrade sentry-sdk',
|
|
|
|
+ },
|
|
|
|
+ ],
|
|
|
|
+ },
|
|
{
|
|
{
|
|
type: StepType.CONFIGURE,
|
|
type: StepType.CONFIGURE,
|
|
description: (
|
|
description: (
|
|
<p>
|
|
<p>
|
|
- {tct(
|
|
|
|
- 'This can be used to instrument, for example [starletteLink:Starlette] or [djangoLink:Django Channels 2.0].',
|
|
|
|
- {
|
|
|
|
- starletteLink: <ExternalLink href="https://www.starlette.io/middleware/" />,
|
|
|
|
- djangoLink: (
|
|
|
|
- <ExternalLink href="https://channels.readthedocs.io/en/latest/" />
|
|
|
|
- ),
|
|
|
|
- }
|
|
|
|
- )}
|
|
|
|
|
|
+ {tct('Wrap your ASGI application with [code: SentryAsgiMiddleware]:', {
|
|
|
|
+ code: <code />,
|
|
|
|
+ })}
|
|
</p>
|
|
</p>
|
|
),
|
|
),
|
|
configurations: [
|
|
configurations: [
|
|
@@ -44,11 +61,7 @@ from sentry_sdk.integrations.asgi import SentryAsgiMiddleware
|
|
from myapp import asgi_app
|
|
from myapp import asgi_app
|
|
|
|
|
|
sentry_sdk.init(
|
|
sentry_sdk.init(
|
|
- dsn="${dsn}",
|
|
|
|
- # Set traces_sample_rate to 1.0 to capture 100%
|
|
|
|
- # of transactions for performance monitoring.
|
|
|
|
- # We recommend adjusting this value in production,
|
|
|
|
- traces_sample_rate=1.0,
|
|
|
|
|
|
+${sentryInitContent}
|
|
)
|
|
)
|
|
|
|
|
|
asgi_app = SentryAsgiMiddleware(asgi_app)
|
|
asgi_app = SentryAsgiMiddleware(asgi_app)
|
|
@@ -57,11 +70,85 @@ asgi_app = SentryAsgiMiddleware(asgi_app)
|
|
],
|
|
],
|
|
additionalInfo: t('The middleware supports both ASGI 2 and ASGI 3 transparently.'),
|
|
additionalInfo: t('The middleware supports both ASGI 2 and ASGI 3 transparently.'),
|
|
},
|
|
},
|
|
|
|
+ {
|
|
|
|
+ type: StepType.VERIFY,
|
|
|
|
+ description: (
|
|
|
|
+ <p>{t('To verify that everything is working trigger an error on purpose:')}</p>
|
|
|
|
+ ),
|
|
|
|
+ configurations: [
|
|
|
|
+ {
|
|
|
|
+ language: 'python',
|
|
|
|
+ code: `sentry_sdk.init(
|
|
|
|
+${sentryInitContent}
|
|
|
|
+)
|
|
|
|
+
|
|
|
|
+def app(scope):
|
|
|
|
+ async def get_body():
|
|
|
|
+ return f"The number is: {1/0}" # raises an error!
|
|
|
|
+
|
|
|
|
+ async def asgi(receive, send):
|
|
|
|
+ await send(
|
|
|
|
+ {
|
|
|
|
+ "type": "http.response.start",
|
|
|
|
+ "status": 200,
|
|
|
|
+ "headers": [[b"content-type", b"text/plain"]],
|
|
|
|
+ }
|
|
|
|
+ )
|
|
|
|
+ await send({"type": "http.response.body", "body": await get_body()})
|
|
|
|
+
|
|
|
|
+ return asgi
|
|
|
|
+
|
|
|
|
+app = SentryAsgiMiddleware(app)
|
|
|
|
+ `,
|
|
|
|
+ },
|
|
|
|
+ ],
|
|
|
|
+ additionalInfo: (
|
|
|
|
+ <span>
|
|
|
|
+ <p>
|
|
|
|
+ {tct(
|
|
|
|
+ 'Run your ASGI app with uvicorn ([code:uvicorn main:app --port 8000]) and point your browser to [link:http://localhost:8000]. A transaction in the Performance section of Sentry will be created.',
|
|
|
|
+ {
|
|
|
|
+ code: <code />,
|
|
|
|
+ link: <ExternalLink href="http://localhost:8000" />,
|
|
|
|
+ }
|
|
|
|
+ )}
|
|
|
|
+ </p>
|
|
|
|
+ <p>
|
|
|
|
+ {t(
|
|
|
|
+ 'Additionally, an error event will be sent to Sentry and will be connected to the transaction.'
|
|
|
|
+ )}
|
|
|
|
+ </p>
|
|
|
|
+ <p>{t('It takes a couple of moments for the data to appear in Sentry.')}</p>
|
|
|
|
+ </span>
|
|
|
|
+ ),
|
|
|
|
+ },
|
|
];
|
|
];
|
|
// Configuration End
|
|
// Configuration End
|
|
|
|
|
|
-export function GettingStartedWithASGI({dsn, ...props}: ModuleProps) {
|
|
|
|
- return <Layout steps={steps({dsn})} introduction={introduction} {...props} />;
|
|
|
|
|
|
+export function GettingStartedWithASGI({
|
|
|
|
+ dsn,
|
|
|
|
+ activeProductSelection = [],
|
|
|
|
+ ...props
|
|
|
|
+}: ModuleProps) {
|
|
|
|
+ const otherConfigs: string[] = [];
|
|
|
|
+
|
|
|
|
+ let sentryInitContent: string[] = [` dsn="${dsn}",`];
|
|
|
|
+
|
|
|
|
+ if (activeProductSelection.includes(ProductSolution.PERFORMANCE_MONITORING)) {
|
|
|
|
+ otherConfigs.push(performanceConfiguration);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ sentryInitContent = sentryInitContent.concat(otherConfigs);
|
|
|
|
+
|
|
|
|
+ return (
|
|
|
|
+ <Layout
|
|
|
|
+ introduction={introduction}
|
|
|
|
+ steps={steps({
|
|
|
|
+ sentryInitContent: sentryInitContent.join('\n'),
|
|
|
|
+ })}
|
|
|
|
+ {...props}
|
|
|
|
+ />
|
|
|
|
+ );
|
|
}
|
|
}
|
|
|
|
|
|
export default GettingStartedWithASGI;
|
|
export default GettingStartedWithASGI;
|