diff --git a/static/app/gettingStartedDocs/dotnet-aspnet/index.tsx b/static/app/gettingStartedDocs/dotnet-aspnet/index.tsx index 40e9cd5b4d6615..12f3740bd10d4e 100644 --- a/static/app/gettingStartedDocs/dotnet-aspnet/index.tsx +++ b/static/app/gettingStartedDocs/dotnet-aspnet/index.tsx @@ -1,5 +1,6 @@ import type {Docs} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {logs} from 'sentry/gettingStartedDocs/dotnet/logs'; +import {metrics} from 'sentry/gettingStartedDocs/dotnet/metrics'; import { feedbackOnboardingJsLoader, replayOnboardingJsLoader, @@ -14,6 +15,7 @@ const docs: Docs = { crashReportOnboarding: crashReport, feedbackOnboardingJsLoader, logsOnboarding: logs, + metricsOnboarding: metrics, }; export default docs; diff --git a/static/app/gettingStartedDocs/dotnet-aspnetcore/index.tsx b/static/app/gettingStartedDocs/dotnet-aspnetcore/index.tsx index 40e9cd5b4d6615..12f3740bd10d4e 100644 --- a/static/app/gettingStartedDocs/dotnet-aspnetcore/index.tsx +++ b/static/app/gettingStartedDocs/dotnet-aspnetcore/index.tsx @@ -1,5 +1,6 @@ import type {Docs} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {logs} from 'sentry/gettingStartedDocs/dotnet/logs'; +import {metrics} from 'sentry/gettingStartedDocs/dotnet/metrics'; import { feedbackOnboardingJsLoader, replayOnboardingJsLoader, @@ -14,6 +15,7 @@ const docs: Docs = { crashReportOnboarding: crashReport, feedbackOnboardingJsLoader, logsOnboarding: logs, + metricsOnboarding: metrics, }; export default docs; diff --git a/static/app/gettingStartedDocs/dotnet-awslambda/index.tsx b/static/app/gettingStartedDocs/dotnet-awslambda/index.tsx index 8ebb0527b3b6ac..1c8bba931ae851 100644 --- a/static/app/gettingStartedDocs/dotnet-awslambda/index.tsx +++ b/static/app/gettingStartedDocs/dotnet-awslambda/index.tsx @@ -1,6 +1,7 @@ import type {Docs} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {feedback} from 'sentry/gettingStartedDocs/dotnet/feedback'; import {logs} from 'sentry/gettingStartedDocs/dotnet/logs'; +import {metrics} from 'sentry/gettingStartedDocs/dotnet/metrics'; import {crashReport} from './crashReport'; import {onboarding} from './onboarding'; @@ -10,6 +11,7 @@ const docs: Docs = { feedbackOnboardingCrashApi: feedback, crashReportOnboarding: crashReport, logsOnboarding: logs, + metricsOnboarding: metrics, }; export default docs; diff --git a/static/app/gettingStartedDocs/dotnet-gcpfunctions/index.tsx b/static/app/gettingStartedDocs/dotnet-gcpfunctions/index.tsx index 8ebb0527b3b6ac..1c8bba931ae851 100644 --- a/static/app/gettingStartedDocs/dotnet-gcpfunctions/index.tsx +++ b/static/app/gettingStartedDocs/dotnet-gcpfunctions/index.tsx @@ -1,6 +1,7 @@ import type {Docs} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {feedback} from 'sentry/gettingStartedDocs/dotnet/feedback'; import {logs} from 'sentry/gettingStartedDocs/dotnet/logs'; +import {metrics} from 'sentry/gettingStartedDocs/dotnet/metrics'; import {crashReport} from './crashReport'; import {onboarding} from './onboarding'; @@ -10,6 +11,7 @@ const docs: Docs = { feedbackOnboardingCrashApi: feedback, crashReportOnboarding: crashReport, logsOnboarding: logs, + metricsOnboarding: metrics, }; export default docs; diff --git a/static/app/gettingStartedDocs/dotnet-maui/index.tsx b/static/app/gettingStartedDocs/dotnet-maui/index.tsx index 8ebb0527b3b6ac..1c8bba931ae851 100644 --- a/static/app/gettingStartedDocs/dotnet-maui/index.tsx +++ b/static/app/gettingStartedDocs/dotnet-maui/index.tsx @@ -1,6 +1,7 @@ import type {Docs} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {feedback} from 'sentry/gettingStartedDocs/dotnet/feedback'; import {logs} from 'sentry/gettingStartedDocs/dotnet/logs'; +import {metrics} from 'sentry/gettingStartedDocs/dotnet/metrics'; import {crashReport} from './crashReport'; import {onboarding} from './onboarding'; @@ -10,6 +11,7 @@ const docs: Docs = { feedbackOnboardingCrashApi: feedback, crashReportOnboarding: crashReport, logsOnboarding: logs, + metricsOnboarding: metrics, }; export default docs; diff --git a/static/app/gettingStartedDocs/dotnet-winforms/index.tsx b/static/app/gettingStartedDocs/dotnet-winforms/index.tsx index 8ebb0527b3b6ac..1c8bba931ae851 100644 --- a/static/app/gettingStartedDocs/dotnet-winforms/index.tsx +++ b/static/app/gettingStartedDocs/dotnet-winforms/index.tsx @@ -1,6 +1,7 @@ import type {Docs} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {feedback} from 'sentry/gettingStartedDocs/dotnet/feedback'; import {logs} from 'sentry/gettingStartedDocs/dotnet/logs'; +import {metrics} from 'sentry/gettingStartedDocs/dotnet/metrics'; import {crashReport} from './crashReport'; import {onboarding} from './onboarding'; @@ -10,6 +11,7 @@ const docs: Docs = { feedbackOnboardingCrashApi: feedback, crashReportOnboarding: crashReport, logsOnboarding: logs, + metricsOnboarding: metrics, }; export default docs; diff --git a/static/app/gettingStartedDocs/dotnet-wpf/index.tsx b/static/app/gettingStartedDocs/dotnet-wpf/index.tsx index 8ebb0527b3b6ac..1c8bba931ae851 100644 --- a/static/app/gettingStartedDocs/dotnet-wpf/index.tsx +++ b/static/app/gettingStartedDocs/dotnet-wpf/index.tsx @@ -1,6 +1,7 @@ import type {Docs} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {feedback} from 'sentry/gettingStartedDocs/dotnet/feedback'; import {logs} from 'sentry/gettingStartedDocs/dotnet/logs'; +import {metrics} from 'sentry/gettingStartedDocs/dotnet/metrics'; import {crashReport} from './crashReport'; import {onboarding} from './onboarding'; @@ -10,6 +11,7 @@ const docs: Docs = { feedbackOnboardingCrashApi: feedback, crashReportOnboarding: crashReport, logsOnboarding: logs, + metricsOnboarding: metrics, }; export default docs; diff --git a/static/app/gettingStartedDocs/dotnet/index.tsx b/static/app/gettingStartedDocs/dotnet/index.tsx index dcf7712ca3498b..96d485dc996f09 100644 --- a/static/app/gettingStartedDocs/dotnet/index.tsx +++ b/static/app/gettingStartedDocs/dotnet/index.tsx @@ -3,6 +3,7 @@ import type {Docs} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {crashReport} from './crashReport'; import {feedback} from './feedback'; import {logs} from './logs'; +import {metrics} from './metrics'; import {onboarding} from './onboarding'; import {profiling} from './profiling'; @@ -12,6 +13,7 @@ const docs: Docs = { crashReportOnboarding: crashReport, profilingOnboarding: profiling, logsOnboarding: logs, + metricsOnboarding: metrics, }; export default docs; diff --git a/static/app/gettingStartedDocs/dotnet/metrics.spec.tsx b/static/app/gettingStartedDocs/dotnet/metrics.spec.tsx new file mode 100644 index 00000000000000..fe2025061544eb --- /dev/null +++ b/static/app/gettingStartedDocs/dotnet/metrics.spec.tsx @@ -0,0 +1,33 @@ +import {renderWithOnboardingLayout} from 'sentry-test/onboarding/renderWithOnboardingLayout'; +import {screen} from 'sentry-test/reactTestingLibrary'; +import {textWithMarkupMatcher} from 'sentry-test/utils'; + +import {ProductSolution} from 'sentry/components/onboarding/gettingStartedDoc/types'; + +import docs from '.'; + +describe('metrics', () => { + it('dotnet metrics onboarding docs', () => { + renderWithOnboardingLayout(docs, { + selectedProducts: [ProductSolution.METRICS], + }); + + expect( + screen.getByText( + textWithMarkupMatcher(/SentrySdk\.Experimental\.Metrics\.EmitCounter/) + ) + ).toBeInTheDocument(); + }); + + it('does not render metrics configuration when metrics is not enabled', () => { + renderWithOnboardingLayout(docs, { + selectedProducts: [], + }); + + expect( + screen.queryByText( + textWithMarkupMatcher(/SentrySdk\.Experimental\.Metrics\.EmitCounter/) + ) + ).not.toBeInTheDocument(); + }); +}); diff --git a/static/app/gettingStartedDocs/dotnet/metrics.tsx b/static/app/gettingStartedDocs/dotnet/metrics.tsx index 957cde5b252b46..14ec6565fbdb8e 100644 --- a/static/app/gettingStartedDocs/dotnet/metrics.tsx +++ b/static/app/gettingStartedDocs/dotnet/metrics.tsx @@ -1,9 +1,15 @@ import {ExternalLink} from '@sentry/scraps/link'; import { + StepType, type ContentBlock, type DocsParams, + type OnboardingConfig, } from 'sentry/components/onboarding/gettingStartedDoc/types'; +import { + getInstallSnippetCoreCli, + getInstallSnippetPackageManager, +} from 'sentry/gettingStartedDocs/dotnet/utils'; import {t, tct} from 'sentry/locale'; export const metricsVerify = (params: DocsParams): ContentBlock => ({ @@ -37,3 +43,82 @@ SentrySdk.Experimental.Metrics.EmitGauge("page_load", 15.0, SentryUnits.Duration }, ], }); + +export const metrics: OnboardingConfig = { + install: params => [ + { + type: StepType.INSTALL, + content: [ + { + type: 'text', + text: tct( + 'Install our .NET SDK with a minimum version that supports metrics ([code:6.1.0] or higher).', + { + code: , + } + ), + }, + { + type: 'code', + tabs: [ + { + label: 'Package Manager', + language: 'shell', + code: getInstallSnippetPackageManager(params), + }, + { + label: '.NET Core CLI', + language: 'shell', + code: getInstallSnippetCoreCli(params), + }, + ], + }, + ], + }, + ], + configure: () => [], + verify: (params: DocsParams) => [ + { + type: StepType.VERIFY, + content: [ + { + type: 'text', + text: tct( + 'Metrics are automatically enabled in your [code:SentrySdk.Init] configuration. You can emit metrics using the [code:SentrySdk.Experimental.Metrics] API.', + { + code: , + } + ), + }, + { + type: 'code', + language: 'csharp', + code: `using Sentry; + +SentrySdk.Init(options => +{ + options.Dsn = "${params.dsn.public}"; +}); + +SentrySdk.Experimental.Metrics.EmitCounter("button_click", 5, + [new KeyValuePair("browser", "Firefox"), new KeyValuePair("app_version", "1.0.0")]); +SentrySdk.Experimental.Metrics.EmitDistribution("page_load", 15.0, SentryUnits.Duration.Millisecond, + [new KeyValuePair("page", "/home")]); +SentrySdk.Experimental.Metrics.EmitGauge("page_load", 15.0, SentryUnits.Duration.Millisecond, + [new KeyValuePair("page", "/home")]);`, + }, + { + type: 'text', + text: tct( + 'For more detailed information, see the [link:metrics documentation].', + { + link: ( + + ), + } + ), + }, + ], + }, + ], +}; diff --git a/static/app/gettingStartedDocs/dotnet/utils.tsx b/static/app/gettingStartedDocs/dotnet/utils.tsx index 1497d79f2265c6..a06806b8382782 100644 --- a/static/app/gettingStartedDocs/dotnet/utils.tsx +++ b/static/app/gettingStartedDocs/dotnet/utils.tsx @@ -1,8 +1,10 @@ import type {DocsParams} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {getPackageVersion} from 'sentry/utils/gettingStartedDocs/getPackageVersion'; +// Sentry SDK for .NET 6.1.0 adds initial experimental support for Metrics export const getInstallSnippetPackageManager = (params: DocsParams) => ` -Install-Package Sentry -Version ${getPackageVersion(params, 'sentry.dotnet', '6.0.0')}`; +Install-Package Sentry -Version ${getPackageVersion(params, 'sentry.dotnet', '6.1.0')}`; +// Sentry SDK for .NET 6.1.0 adds initial experimental support for Metrics export const getInstallSnippetCoreCli = (params: DocsParams) => ` -dotnet add package Sentry -v ${getPackageVersion(params, 'sentry.dotnet', '6.0.0')}`; +dotnet add package Sentry -v ${getPackageVersion(params, 'sentry.dotnet', '6.1.0')}`;