import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/step'; import type { Docs, DocsParams, OnboardingConfig, } from 'sentry/components/onboarding/gettingStartedDoc/types'; import {getUploadSourceMapsStep} from 'sentry/components/onboarding/gettingStartedDoc/utils'; import { getCrashReportJavaScriptInstallStep, getCrashReportModalConfigDescription, getCrashReportModalIntroduction, } from 'sentry/components/onboarding/gettingStartedDoc/utils/feedbackOnboarding'; import {getJSServerMetricsOnboarding} from 'sentry/components/onboarding/gettingStartedDoc/utils/metricsOnboarding'; import {ProductSolution} from 'sentry/components/onboarding/productSelection'; import {t} from 'sentry/locale'; import type {ProductSelectionMap} from 'sentry/utils/gettingStartedDocs/node'; import { getDefaultNodeImports, getInstallConfig, } from 'sentry/utils/gettingStartedDocs/node'; type Params = DocsParams; const productSelection = (params: Params): ProductSelectionMap => { return { [ProductSolution.ERROR_MONITORING]: true, [ProductSolution.PROFILING]: params.isProfilingSelected, [ProductSolution.PERFORMANCE_MONITORING]: params.isPerformanceSelected, [ProductSolution.SESSION_REPLAY]: params.isReplaySelected, }; }; const getSdkSetupSnippet = (params: Params) => ` ${getDefaultNodeImports({productSelection: productSelection(params)}).join('\n')} import connect from "connect"; // Configure Sentry before doing anything else Sentry.init({ dsn: "${params.dsn}", integrations: [${ params.isProfilingSelected ? ` nodeProfilingIntegration(),` : '' } ],${ params.isPerformanceSelected ? ` // Performance Monitoring tracesSampleRate: 1.0, // Capture 100% of the transactions` : '' }${ params.isProfilingSelected ? ` // Set sampling rate for profiling - this is relative to tracesSampleRate profilesSampleRate: 1.0,` : '' } }); function mainHandler(req, res) { throw new Error("My first Sentry error!"); } function onError(err, req, res, next) { // The error id is attached to \`res.sentry\` to be returned // and optionally displayed to the user for support. res.statusCode = 500; res.end(res.sentry + "\\n"); } connect( // The request handler be the first item Sentry.Handlers.requestHandler(), connect.bodyParser(), connect.cookieParser(), mainHandler, // The error handler must be before any other error middleware Sentry.Handlers.errorHandler(), // Optional fallthrough error handler onError ).listen(3000); `; const onboarding: OnboardingConfig = { install: params => [ { type: StepType.INSTALL, description: t('Add the Sentry Node SDK as a dependency:'), configurations: getInstallConfig(params), }, ], configure: params => [ { type: StepType.CONFIGURE, description: t('Configure Sentry as a middleware:'), configurations: [ { language: 'javascript', code: getSdkSetupSnippet(params), }, ], }, getUploadSourceMapsStep({ guideLink: 'https://docs.sentry.io/platforms/node/guides/connect/sourcemaps/', ...params, }), ], verify: () => [], }; const crashReportOnboarding: OnboardingConfig = { introduction: () => getCrashReportModalIntroduction(), install: (params: Params) => getCrashReportJavaScriptInstallStep(params), configure: () => [ { type: StepType.CONFIGURE, description: getCrashReportModalConfigDescription({ link: 'https://docs.sentry.io/platforms/node/guides/connect/user-feedback/configuration/#crash-report-modal', }), }, ], verify: () => [], nextSteps: () => [], }; const docs: Docs = { onboarding, customMetricsOnboarding: getJSServerMetricsOnboarding(), crashReportOnboarding, }; export default docs;