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')}`;