import ExternalLink from 'sentry/components/links/externalLink';
import widgetCallout from 'sentry/components/onboarding/gettingStartedDoc/feedback/widgetCallout';
import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/step';
import type {
Docs,
DocsParams,
OnboardingConfig,
} from 'sentry/components/onboarding/gettingStartedDoc/types';
import {
getCrashReportJavaScriptInstallStep,
getCrashReportModalConfigDescription,
getCrashReportModalIntroduction,
} from 'sentry/components/onboarding/gettingStartedDoc/utils/feedbackOnboarding';
import exampleSnippets from 'sentry/components/onboarding/gettingStartedDoc/utils/metricsExampleSnippets';
import {metricTagsExplanation} from 'sentry/components/onboarding/gettingStartedDoc/utils/metricsOnboarding';
import replayOnboardingJsLoader from 'sentry/gettingStartedDocs/javascript/jsLoader/jsLoader';
import {t, tct} from 'sentry/locale';
type Params = DocsParams;
const getInstallConfig = () => [
{
language: 'bash',
code: 'bun add @sentry/bun',
},
];
const getConfigureSnippet = (params: Params) => `
//...
import * as Sentry from "@sentry/bun";
Sentry.init({
dsn: "${params.dsn}",${
params.isPerformanceSelected
? `
// Performance Monitoring
tracesSampleRate: 1.0, // Capture 100% of the transactions`
: ''
}
});`;
const getVerifySnippet = () => `try {
throw new Error('Sentry Bun test');
} catch (e) {
Sentry.captureException(e);
}`;
const getMetricsConfigureSnippet = (params: DocsParams) => `
Sentry.init({
dsn: "${params.dsn}",
_experiments: {
metricsAggregator: true,
},
});`;
const onboarding: OnboardingConfig = {
install: () => [
{
type: StepType.INSTALL,
description: t(
"Sentry captures data by using an SDK within your application's runtime."
),
configurations: getInstallConfig(),
},
],
configure: params => [
{
type: StepType.CONFIGURE,
description: t(
"Initialize Sentry as early as possible in your application's lifecycle."
),
configurations: [
{
language: 'javascript',
code: getConfigureSnippet(params),
},
],
},
],
verify: () => [
{
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: getVerifySnippet(),
},
],
},
],
nextSteps: params =>
params.isPerformanceSelected
? []
: [
{
id: 'performance-monitoring',
name: t('Performance Monitoring'),
description: t(
'Track down transactions to connect the dots between 10-second page loads and poor-performing API calls or slow database queries.'
),
link: 'https://docs.sentry.io/platforms/javascript/guides/bun/performance/',
},
],
};
const customMetricsOnboarding: OnboardingConfig = {
install: () => [
{
type: StepType.INSTALL,
description: tct(
'You need a minimum version [codeVersion:7.91.0] of [codePackage:@sentry/bun].',
{
codeVersion:
,
codePackage:
,
}
),
configurations: getInstallConfig(),
},
],
configure: params => [
{
type: StepType.CONFIGURE,
description: tct(
'To enable capturing metrics, you first need to add the [codeIntegration:metricsAggregator] experiment to your [codeNamespace:Sentry.init] call in your main process.',
{
codeIntegration:
,
codeNamespace:
,
}
),
configurations: [
{
code: [
{
label: 'JavaScript',
value: 'javascript',
language: 'javascript',
code: getMetricsConfigureSnippet(params),
},
],
},
],
},
],
verify: () => [
{
type: StepType.VERIFY,
description: tct(
"Then you'll be able to add metrics as [codeCounters:counters], [codeSets:sets], [codeDistribution:distributions], and [codeGauge:gauges]. These are available under the [codeNamespace:Sentry.metrics] namespace. This API is available in both renderer and main processes.",
{
codeCounters:
,
codeSets:
,
codeDistribution:
,
codeGauge:
,
codeNamespace:
,
}
),
configurations: [
{
description: metricTagsExplanation,
},
{
description: t('Try out these examples:'),
code: [
{
label: 'Counter',
value: 'counter',
language: 'javascript',
code: exampleSnippets.javascript.counter,
},
{
label: 'Distribution',
value: 'distribution',
language: 'javascript',
code: exampleSnippets.javascript.distribution,
},
{
label: 'Set',
value: 'set',
language: 'javascript',
code: exampleSnippets.javascript.set,
},
{
label: 'Gauge',
value: 'gauge',
language: 'javascript',
code: exampleSnippets.javascript.gauge,
},
],
},
{
description: t(
'With a bit of delay you can see the data appear in the Sentry UI.'
),
},
{
description: tct(
'Learn more about metrics and how to configure them, by reading the [docsLink:docs].',
{
docsLink: (
),
}
),
},
],
},
],
};
const crashReportOnboarding: OnboardingConfig = {
introduction: () => getCrashReportModalIntroduction(),
install: (params: Params) => getCrashReportJavaScriptInstallStep(params),
configure: () => [
{
type: StepType.CONFIGURE,
description: getCrashReportModalConfigDescription({
link: 'https://docs.sentry.io/platforms/javascript/guides/bun/user-feedback/configuration/#crash-report-modal',
}),
additionalInfo: widgetCallout({
link: 'https://docs.sentry.io/platforms/javascript/guides/bun/user-feedback/#user-feedback-widget',
}),
},
],
verify: () => [],
nextSteps: () => [],
};
const docs: Docs = {
onboarding,
replayOnboardingJsLoader,
customMetricsOnboarding,
crashReportOnboarding,
};
export default docs;