import {Layout, LayoutProps} from 'sentry/components/onboarding/gettingStartedDoc/layout'; import {ModuleProps} from 'sentry/components/onboarding/gettingStartedDoc/sdkDocumentation'; import {StepProps, StepType} from 'sentry/components/onboarding/gettingStartedDoc/step'; import {getUploadSourceMapsStep} from 'sentry/components/onboarding/gettingStartedDoc/utils'; import {t, tct} from 'sentry/locale'; import { getDefaulServerlessImports, getDefaultInitParams, getProductInitParams, getProductIntegrations, getProductSelectionMap, joinWithIndentation, } from 'sentry/utils/gettingStartedDocs/node'; interface StepsParams { importContent: string; initContent: string; installSnippet: string; sourceMapStep: StepProps; } export const steps = ({ installSnippet, importContent, initContent, sourceMapStep, }: StepsParams): LayoutProps['steps'] => [ { type: StepType.INSTALL, description: (

{tct( 'Add the Sentry Serverless SDK as a dependency to your [code:package.json]:', {code: } )}

), configurations: [ { language: 'json', code: installSnippet, }, ], }, { type: StepType.CONFIGURE, description: (

{tct('Use the Sentry SDK to wrap your functions:', { code: , })}

), configurations: [ { language: 'javascript', code: ` ${importContent} Sentry.GCPFunction.init({ ${initContent} }); // Use wrapHttpFunction to instrument your http functions exports.helloHttp = Sentry.GCPFunction.wrapHttpFunction((req, res) => { /* Your function code */ }); // Use wrapEventFunction to instrument your background functions exports.helloEvents = Sentry.GCPFunction.wrapEventFunction( (data, context, callback) => { /* Your function code */ } ); // Use wrapCloudEventFunction to instrument your CloudEvent functions exports.helloEvents = Sentry.GCPFunction.wrapCloudEventFunction( (context, callback) => { /* Your function code */ } ); `, }, ], }, sourceMapStep, { type: StepType.VERIFY, description: t( "This snippet contains an intentional error and can be used as a test to make sure that everything's working as expected." ), configurations: [ { language: 'javascript', code: ` exports.helloHttp = Sentry.GCPFunction.wrapHttpFunction((req, res) => { throw new Error("oh, hello there!"); }); `, }, ], }, ]; export function GettingStartedWithGCPFunctions({ dsn, newOrg, platformKey, activeProductSelection = [], organization, projectId, }: ModuleProps) { const productSelection = getProductSelectionMap(activeProductSelection); const installSnippet: string[] = [ 'dependencies: {', ' //...', ` "@sentry/serverless": "^7",`, ]; if (productSelection.profiling) { installSnippet.push(` "@sentry/profiling-node": "^1",`); } installSnippet.push(' //...', '}'); const imports = getDefaulServerlessImports({productSelection}); const integrations = getProductIntegrations({productSelection}); const integrationParam = integrations.length > 0 ? `integrations: [\n${joinWithIndentation(integrations)}\n],` : null; const initContent = joinWithIndentation([ ...getDefaultInitParams({dsn}), ...(integrationParam ? [integrationParam] : []), ...getProductInitParams({productSelection}), ]); return ( ); } export default GettingStartedWithGCPFunctions;