From 3ac6c86de2219d73cc546c104f30f4cd0465fdbe Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Mon, 19 Jan 2026 16:30:35 +0100 Subject: [PATCH 01/24] feat(onboarding): Add logs for .NET platforms --- .../onboarding/productSelection.tsx | 22 +++++++++++-------- static/app/data/platformCategories.tsx | 9 ++++++++ .../dotnet-aspnet/onboarding.spec.tsx | 12 ++++++++++ .../dotnet-aspnet/onboarding.tsx | 17 +++++++++++++- .../dotnet-aspnetcore/onboarding.spec.tsx | 12 ++++++++++ .../dotnet-aspnetcore/onboarding.tsx | 15 +++++++++++++ .../dotnet-awslambda/onboarding.spec.tsx | 12 ++++++++++ .../dotnet-awslambda/onboarding.tsx | 17 +++++++++++++- .../dotnet-gcpfunctions/onboarding.spec.tsx | 14 ++++++++++++ .../dotnet-gcpfunctions/onboarding.tsx | 17 +++++++++++++- .../dotnet-maui/onboarding.spec.tsx | 12 ++++++++++ .../dotnet-maui/onboarding.tsx | 15 +++++++++++++ .../dotnet-winforms/onboarding.spec.tsx | 12 ++++++++++ .../dotnet-winforms/onboarding.tsx | 15 +++++++++++++ .../dotnet-wpf/onboarding.spec.tsx | 12 ++++++++++ .../dotnet-wpf/onboarding.tsx | 15 +++++++++++++ .../dotnet-xamarin/onboarding.spec.tsx | 4 ++++ .../dotnet-xamarin/onboarding.tsx | 17 +++++++++++++- static/app/gettingStartedDocs/dotnet/logs.tsx | 22 +++++++++++++++++++ .../dotnet/onboarding.spec.tsx | 12 ++++++++++ .../gettingStartedDocs/dotnet/onboarding.tsx | 15 +++++++++++++ 21 files changed, 285 insertions(+), 13 deletions(-) create mode 100644 static/app/gettingStartedDocs/dotnet/logs.tsx diff --git a/static/app/components/onboarding/productSelection.tsx b/static/app/components/onboarding/productSelection.tsx index db880858188804..f587b33096bbac 100644 --- a/static/app/components/onboarding/productSelection.tsx +++ b/static/app/components/onboarding/productSelection.tsx @@ -92,15 +92,19 @@ export const platformProductAvailability = { 'apple-macos': [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.PROFILING], bun: [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], capacitor: [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.SESSION_REPLAY], - dotnet: [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.PROFILING], - 'dotnet-aspnet': [ProductSolution.PERFORMANCE_MONITORING], - 'dotnet-aspnetcore': [ProductSolution.PERFORMANCE_MONITORING], - 'dotnet-awslambda': [ProductSolution.PERFORMANCE_MONITORING], - 'dotnet-gcpfunctions': [ProductSolution.PERFORMANCE_MONITORING], - 'dotnet-maui': [ProductSolution.PERFORMANCE_MONITORING], - 'dotnet-winforms': [ProductSolution.PERFORMANCE_MONITORING], - 'dotnet-wpf': [ProductSolution.PERFORMANCE_MONITORING], - 'dotnet-xamarin': [ProductSolution.PERFORMANCE_MONITORING], + dotnet: [ + ProductSolution.PERFORMANCE_MONITORING, + ProductSolution.PROFILING, + ProductSolution.LOGS, + ], + 'dotnet-aspnet': [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], + 'dotnet-aspnetcore': [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], + 'dotnet-awslambda': [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], + 'dotnet-gcpfunctions': [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], + 'dotnet-maui': [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], + 'dotnet-winforms': [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], + 'dotnet-wpf': [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], + 'dotnet-xamarin': [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], dart: [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], kotlin: [ProductSolution.PERFORMANCE_MONITORING], go: [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], diff --git a/static/app/data/platformCategories.tsx b/static/app/data/platformCategories.tsx index 5a25c65d0f59a5..db5a238ae4af43 100644 --- a/static/app/data/platformCategories.tsx +++ b/static/app/data/platformCategories.tsx @@ -305,6 +305,15 @@ export const withLoggingOnboarding: Set = new Set([ 'apple-macos', 'bun', 'dart', + 'dotnet', + 'dotnet-aspnet', + 'dotnet-aspnetcore', + 'dotnet-awslambda', + 'dotnet-gcpfunctions', + 'dotnet-maui', + 'dotnet-winforms', + 'dotnet-wpf', + 'dotnet-xamarin', 'flutter', 'go', 'go-echo', diff --git a/static/app/gettingStartedDocs/dotnet-aspnet/onboarding.spec.tsx b/static/app/gettingStartedDocs/dotnet-aspnet/onboarding.spec.tsx index 454be3250381ce..96843a7744a74c 100644 --- a/static/app/gettingStartedDocs/dotnet-aspnet/onboarding.spec.tsx +++ b/static/app/gettingStartedDocs/dotnet-aspnet/onboarding.spec.tsx @@ -14,12 +14,14 @@ describe('aspnet onboarding docs', () => { version: '1.99.9', }, }, + selectedProducts: [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], }); // Renders main headings expect(screen.getByRole('heading', {name: 'Install'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Configure SDK'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Documentation'})).toBeInTheDocument(); + expect(screen.getByRole('heading', {name: 'Verify Logs'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Samples'})).toBeInTheDocument(); // Renders SDK version from registry @@ -39,4 +41,14 @@ describe('aspnet onboarding docs', () => { await screen.findByText(textWithMarkupMatcher(/o.TracesSampleRate/)) ).toBeInTheDocument(); }); + + it('renders logs onboarding docs correctly', async () => { + renderWithOnboardingLayout(docs, { + selectedProducts: [ProductSolution.LOGS], + }); + + expect( + await screen.findByText(textWithMarkupMatcher(/o.EnableLogs/)) + ).toBeInTheDocument(); + }); }); diff --git a/static/app/gettingStartedDocs/dotnet-aspnet/onboarding.tsx b/static/app/gettingStartedDocs/dotnet-aspnet/onboarding.tsx index 1854b54fe6eda7..bfa70ba82d1929 100644 --- a/static/app/gettingStartedDocs/dotnet-aspnet/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet-aspnet/onboarding.tsx @@ -4,6 +4,7 @@ import type { OnboardingConfig, } from 'sentry/components/onboarding/gettingStartedDoc/types'; import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/types'; +import {logsVerify} from 'sentry/gettingStartedDocs/dotnet/logs'; import {t, tct} from 'sentry/locale'; import {getPackageVersion} from 'sentry/utils/gettingStartedDocs/getPackageVersion'; @@ -50,6 +51,12 @@ public class MvcApplication : HttpApplication // We recommend adjusting this value in production o.TracesSampleRate = 1.0;` : '' + }${ + params.isLogsSelected + ? ` + // Enable logs to be sent to Sentry + o.EnableLogs = true;` + : '' } // If you are using EF (and installed the NuGet package): o.AddEntityFramework(); @@ -136,7 +143,7 @@ export const onboarding: OnboardingConfig = { }, ], // TODO: Add proper verify step - verify: () => [ + verify: params => [ { title: t('Documentation'), content: [ @@ -153,6 +160,14 @@ export const onboarding: OnboardingConfig = { }, ], }, + ...(params.isLogsSelected + ? [ + { + title: t('Verify Logs'), + content: [logsVerify(params)], + }, + ] + : []), { title: t('Samples'), content: [ diff --git a/static/app/gettingStartedDocs/dotnet-aspnetcore/onboarding.spec.tsx b/static/app/gettingStartedDocs/dotnet-aspnetcore/onboarding.spec.tsx index cdca3a177530c0..e4b5ce1edc12cf 100644 --- a/static/app/gettingStartedDocs/dotnet-aspnetcore/onboarding.spec.tsx +++ b/static/app/gettingStartedDocs/dotnet-aspnetcore/onboarding.spec.tsx @@ -14,6 +14,7 @@ describe('aspnetcore onboarding docs', () => { version: '1.99.9', }, }, + selectedProducts: [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], }); // Renders main headings @@ -21,6 +22,7 @@ describe('aspnetcore onboarding docs', () => { expect(screen.getByRole('heading', {name: 'Configure SDK'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Verify'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Tracing'})).toBeInTheDocument(); + expect(screen.getByRole('heading', {name: 'Verify Logs'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Samples'})).toBeInTheDocument(); // Renders SDK version from registry @@ -40,4 +42,14 @@ describe('aspnetcore onboarding docs', () => { await screen.findByText(textWithMarkupMatcher(/o.TracesSampleRate/)) ).toBeInTheDocument(); }); + + it('renders logs onboarding docs correctly', async () => { + renderWithOnboardingLayout(docs, { + selectedProducts: [ProductSolution.LOGS], + }); + + expect( + await screen.findByText(textWithMarkupMatcher(/o.EnableLogs/)) + ).toBeInTheDocument(); + }); }); diff --git a/static/app/gettingStartedDocs/dotnet-aspnetcore/onboarding.tsx b/static/app/gettingStartedDocs/dotnet-aspnetcore/onboarding.tsx index eec93af36e87b7..d88b4bb36e3f43 100644 --- a/static/app/gettingStartedDocs/dotnet-aspnetcore/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet-aspnetcore/onboarding.tsx @@ -5,6 +5,7 @@ import type { OnboardingStep, } from 'sentry/components/onboarding/gettingStartedDoc/types'; import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/types'; +import {logsVerify} from 'sentry/gettingStartedDocs/dotnet/logs'; import {t, tct} from 'sentry/locale'; import {getPackageVersion} from 'sentry/utils/gettingStartedDocs/getPackageVersion'; @@ -40,6 +41,12 @@ public static IHostBuilder CreateHostBuilder(string[] args) => // We recommend adjusting this value in production o.TracesSampleRate = 1.0;` : '' + }${ + params.isLogsSelected + ? ` + // Enable logs to be sent to Sentry + o.EnableLogs = true;` + : '' } }); });`; @@ -177,6 +184,14 @@ export const onboarding: OnboardingConfig = { }, ] satisfies OnboardingStep[]) : []), + ...(params.isLogsSelected + ? [ + { + title: t('Verify Logs'), + content: [logsVerify(params)], + }, + ] + : []), { title: t('Samples'), content: [ diff --git a/static/app/gettingStartedDocs/dotnet-awslambda/onboarding.spec.tsx b/static/app/gettingStartedDocs/dotnet-awslambda/onboarding.spec.tsx index 02268d6e32b8a9..aef7247759e1b1 100644 --- a/static/app/gettingStartedDocs/dotnet-awslambda/onboarding.spec.tsx +++ b/static/app/gettingStartedDocs/dotnet-awslambda/onboarding.spec.tsx @@ -14,12 +14,14 @@ describe('awslambda onboarding docs', () => { version: '1.99.9', }, }, + selectedProducts: [ProductSolution.LOGS], }); // Renders main headings expect(screen.getByRole('heading', {name: 'Install'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Configure SDK'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Verify'})).toBeInTheDocument(); + expect(screen.getByRole('heading', {name: 'Verify Logs'})).toBeInTheDocument(); // Renders SDK version from registry expect( @@ -38,4 +40,14 @@ describe('awslambda onboarding docs', () => { await screen.findByText(textWithMarkupMatcher(/o.TracesSampleRate/)) ).toBeInTheDocument(); }); + + it('renders logs onboarding docs correctly', async () => { + renderWithOnboardingLayout(docs, { + selectedProducts: [ProductSolution.LOGS], + }); + + expect( + await screen.findByText(textWithMarkupMatcher(/o.EnableLogs/)) + ).toBeInTheDocument(); + }); }); diff --git a/static/app/gettingStartedDocs/dotnet-awslambda/onboarding.tsx b/static/app/gettingStartedDocs/dotnet-awslambda/onboarding.tsx index 1df5ee6f5d7e5c..b700e9baf64ce5 100644 --- a/static/app/gettingStartedDocs/dotnet-awslambda/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet-awslambda/onboarding.tsx @@ -4,6 +4,7 @@ import type { OnboardingConfig, } from 'sentry/components/onboarding/gettingStartedDoc/types'; import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/types'; +import {logsVerify} from 'sentry/gettingStartedDocs/dotnet/logs'; import {t, tct} from 'sentry/locale'; import {getPackageVersion} from 'sentry/utils/gettingStartedDocs/getPackageVersion'; @@ -41,6 +42,12 @@ public class LambdaEntryPoint : Amazon.Lambda.AspNetCoreServer.APIGatewayProxyFu // We recommend adjusting this value in production. o.TracesSampleRate = 1.0;` : '' + }${ + params.isLogsSelected + ? ` + // Enable logs to be sent to Sentry + o.EnableLogs = true;` + : '' } }) .UseStartup(); @@ -126,7 +133,7 @@ export const onboarding: OnboardingConfig = { ], }, ], - verify: () => [ + verify: params => [ { type: StepType.VERIFY, content: [ @@ -161,5 +168,13 @@ export const onboarding: OnboardingConfig = { }, ], }, + ...(params.isLogsSelected + ? [ + { + title: t('Verify Logs'), + content: [logsVerify(params)], + }, + ] + : []), ], }; diff --git a/static/app/gettingStartedDocs/dotnet-gcpfunctions/onboarding.spec.tsx b/static/app/gettingStartedDocs/dotnet-gcpfunctions/onboarding.spec.tsx index 7a86e1d25f5e75..ce508d0a26e19f 100644 --- a/static/app/gettingStartedDocs/dotnet-gcpfunctions/onboarding.spec.tsx +++ b/static/app/gettingStartedDocs/dotnet-gcpfunctions/onboarding.spec.tsx @@ -2,6 +2,8 @@ import {renderWithOnboardingLayout} from 'sentry-test/onboarding/renderWithOnboa import {screen} from 'sentry-test/reactTestingLibrary'; import {textWithMarkupMatcher} from 'sentry-test/utils'; +import {ProductSolution} from 'sentry/components/onboarding/gettingStartedDoc/types'; + import docs from './index'; describe('gcpfunctions onboarding docs', () => { @@ -12,12 +14,14 @@ describe('gcpfunctions onboarding docs', () => { version: '1.99.9', }, }, + selectedProducts: [ProductSolution.LOGS], }); // Renders main headings expect(screen.getByRole('heading', {name: 'Install'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Configure SDK'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Verify'})).toBeInTheDocument(); + expect(screen.getByRole('heading', {name: 'Verify Logs'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Samples'})).toBeInTheDocument(); // Renders SDK version from registry @@ -36,4 +40,14 @@ describe('gcpfunctions onboarding docs', () => { ) ).toBeInTheDocument(); }); + + it('renders logs onboarding docs correctly', async () => { + renderWithOnboardingLayout(docs, { + selectedProducts: [ProductSolution.LOGS], + }); + + expect( + await screen.findByText(textWithMarkupMatcher(/EnableLogs/)) + ).toBeInTheDocument(); + }); }); diff --git a/static/app/gettingStartedDocs/dotnet-gcpfunctions/onboarding.tsx b/static/app/gettingStartedDocs/dotnet-gcpfunctions/onboarding.tsx index 8636849bbfa8de..7f4e16a19b1fcc 100644 --- a/static/app/gettingStartedDocs/dotnet-gcpfunctions/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet-gcpfunctions/onboarding.tsx @@ -4,6 +4,7 @@ import type { OnboardingConfig, } from 'sentry/components/onboarding/gettingStartedDoc/types'; import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/types'; +import {logsVerify} from 'sentry/gettingStartedDocs/dotnet/logs'; import {t, tct} from 'sentry/locale'; import {getPackageVersion} from 'sentry/utils/gettingStartedDocs/getPackageVersion'; @@ -58,6 +59,12 @@ const getConfigureJsonSnippet = (params: DocsParams) => ` // We recommend adjusting this value in production. "TracesSampleRate": 1` : '' + }${ + params.isLogsSelected + ? ` + // Enable logs to be sent to Sentry + "EnableLogs": true` + : '' } } }`; @@ -146,7 +153,7 @@ export const onboarding: OnboardingConfig = { ], }, ], - verify: () => [ + verify: params => [ { type: StepType.VERIFY, content: [ @@ -161,6 +168,14 @@ export const onboarding: OnboardingConfig = { }, ], }, + ...(params.isLogsSelected + ? [ + { + title: t('Verify Logs'), + content: [logsVerify(params)], + }, + ] + : []), { title: t('Samples'), content: [ diff --git a/static/app/gettingStartedDocs/dotnet-maui/onboarding.spec.tsx b/static/app/gettingStartedDocs/dotnet-maui/onboarding.spec.tsx index b2e5bb106c95e1..8168b4c4ac2cc9 100644 --- a/static/app/gettingStartedDocs/dotnet-maui/onboarding.spec.tsx +++ b/static/app/gettingStartedDocs/dotnet-maui/onboarding.spec.tsx @@ -14,6 +14,7 @@ describe('maui onboarding docs', () => { version: '1.99.9', }, }, + selectedProducts: [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], }); // Renders main headings @@ -21,6 +22,7 @@ describe('maui onboarding docs', () => { expect(screen.getByRole('heading', {name: 'Configure SDK'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Verify'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Tracing'})).toBeInTheDocument(); + expect(screen.getByRole('heading', {name: 'Verify Logs'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Sample Application'})).toBeInTheDocument(); // Renders SDK version from registry @@ -40,4 +42,14 @@ describe('maui onboarding docs', () => { await screen.findByText(textWithMarkupMatcher(/options.TracesSampleRate/)) ).toBeInTheDocument(); }); + + it('renders logs onboarding docs correctly', async () => { + renderWithOnboardingLayout(docs, { + selectedProducts: [ProductSolution.LOGS], + }); + + expect( + await screen.findByText(textWithMarkupMatcher(/options.EnableLogs/)) + ).toBeInTheDocument(); + }); }); diff --git a/static/app/gettingStartedDocs/dotnet-maui/onboarding.tsx b/static/app/gettingStartedDocs/dotnet-maui/onboarding.tsx index 027ac54907d6b7..202a972eed07f5 100644 --- a/static/app/gettingStartedDocs/dotnet-maui/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet-maui/onboarding.tsx @@ -5,6 +5,7 @@ import type { OnboardingStep, } from 'sentry/components/onboarding/gettingStartedDoc/types'; import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/types'; +import {logsVerify} from 'sentry/gettingStartedDocs/dotnet/logs'; import {t, tct} from 'sentry/locale'; import {getPackageVersion} from 'sentry/utils/gettingStartedDocs/getPackageVersion'; @@ -46,6 +47,12 @@ public static MauiApp CreateMauiApp() // We recommend adjusting this value in production. options.TracesSampleRate = 1.0;` : '' + }${ + params.isLogsSelected + ? ` + // Enable logs to be sent to Sentry + options.EnableLogs = true;` + : '' } // Other Sentry options can be set here. @@ -204,6 +211,14 @@ export const onboarding: OnboardingConfig = { }, ] satisfies OnboardingStep[]) : []), + ...(params.isLogsSelected + ? [ + { + title: t('Verify Logs'), + content: [logsVerify(params)], + }, + ] + : []), { title: t('Sample Application'), content: [ diff --git a/static/app/gettingStartedDocs/dotnet-winforms/onboarding.spec.tsx b/static/app/gettingStartedDocs/dotnet-winforms/onboarding.spec.tsx index a8daae30e306c9..ecf649896c319c 100644 --- a/static/app/gettingStartedDocs/dotnet-winforms/onboarding.spec.tsx +++ b/static/app/gettingStartedDocs/dotnet-winforms/onboarding.spec.tsx @@ -14,6 +14,7 @@ describe('winforms onboarding docs', () => { version: '1.99.9', }, }, + selectedProducts: [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], }); // Renders main headings @@ -22,6 +23,7 @@ describe('winforms onboarding docs', () => { expect(screen.getByRole('heading', {name: 'Verify'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Tracing'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Documentation'})).toBeInTheDocument(); + expect(screen.getByRole('heading', {name: 'Verify Logs'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Samples'})).toBeInTheDocument(); // Renders SDK version from registry @@ -41,4 +43,14 @@ describe('winforms onboarding docs', () => { await screen.findByText(textWithMarkupMatcher(/o.TracesSampleRate/)) ).toBeInTheDocument(); }); + + it('renders logs onboarding docs correctly', async () => { + renderWithOnboardingLayout(docs, { + selectedProducts: [ProductSolution.LOGS], + }); + + expect( + await screen.findByText(textWithMarkupMatcher(/o.EnableLogs/)) + ).toBeInTheDocument(); + }); }); diff --git a/static/app/gettingStartedDocs/dotnet-winforms/onboarding.tsx b/static/app/gettingStartedDocs/dotnet-winforms/onboarding.tsx index c8fb24560fe707..a40a9f2f38ae8a 100644 --- a/static/app/gettingStartedDocs/dotnet-winforms/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet-winforms/onboarding.tsx @@ -5,6 +5,7 @@ import type { OnboardingStep, } from 'sentry/components/onboarding/gettingStartedDoc/types'; import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/types'; +import {logsVerify} from 'sentry/gettingStartedDocs/dotnet/logs'; import {t, tct} from 'sentry/locale'; import {getPackageVersion} from 'sentry/utils/gettingStartedDocs/getPackageVersion'; @@ -37,6 +38,12 @@ static class Program // We recommend adjusting this value in production. o.TracesSampleRate = 1.0;` : '' + }${ + params.isLogsSelected + ? ` + // Enable logs to be sent to Sentry + o.EnableLogs = true;` + : '' } }); // Configure WinForms to throw exceptions so Sentry can capture them. @@ -177,6 +184,14 @@ export const onboarding: OnboardingConfig = { }, ] satisfies OnboardingStep[]) : []), + ...(params.isLogsSelected + ? [ + { + title: t('Verify Logs'), + content: [logsVerify(params)], + }, + ] + : []), { title: t('Samples'), content: [ diff --git a/static/app/gettingStartedDocs/dotnet-wpf/onboarding.spec.tsx b/static/app/gettingStartedDocs/dotnet-wpf/onboarding.spec.tsx index a9ca3500d49ef6..fc0da5db51c823 100644 --- a/static/app/gettingStartedDocs/dotnet-wpf/onboarding.spec.tsx +++ b/static/app/gettingStartedDocs/dotnet-wpf/onboarding.spec.tsx @@ -14,6 +14,7 @@ describe('wpf onboarding docs', () => { version: '1.99.9', }, }, + selectedProducts: [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], }); // Renders main headings @@ -22,6 +23,7 @@ describe('wpf onboarding docs', () => { expect(screen.getByRole('heading', {name: 'Verify'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Tracing'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Documentation'})).toBeInTheDocument(); + expect(screen.getByRole('heading', {name: 'Verify Logs'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Samples'})).toBeInTheDocument(); // Renders SDK version from registry @@ -41,4 +43,14 @@ describe('wpf onboarding docs', () => { await screen.findByText(textWithMarkupMatcher(/o.TracesSampleRate/)) ).toBeInTheDocument(); }); + + it('renders logs onboarding docs correctly', async () => { + renderWithOnboardingLayout(docs, { + selectedProducts: [ProductSolution.LOGS], + }); + + expect( + await screen.findByText(textWithMarkupMatcher(/o.EnableLogs/)) + ).toBeInTheDocument(); + }); }); diff --git a/static/app/gettingStartedDocs/dotnet-wpf/onboarding.tsx b/static/app/gettingStartedDocs/dotnet-wpf/onboarding.tsx index 979477248a423e..e5cfb167b44f59 100644 --- a/static/app/gettingStartedDocs/dotnet-wpf/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet-wpf/onboarding.tsx @@ -5,6 +5,7 @@ import type { OnboardingStep, } from 'sentry/components/onboarding/gettingStartedDoc/types'; import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/types'; +import {logsVerify} from 'sentry/gettingStartedDocs/dotnet/logs'; import {t, tct} from 'sentry/locale'; import {getPackageVersion} from 'sentry/utils/gettingStartedDocs/getPackageVersion'; @@ -36,6 +37,12 @@ public partial class App : Application // We recommend adjusting this value in production. o.TracesSampleRate = 1.0;` : '' + }${ + params.isLogsSelected + ? ` + // Enable logs to be sent to Sentry + o.EnableLogs = true;` + : '' } }); } @@ -177,6 +184,14 @@ export const onboarding: OnboardingConfig = { }, ] satisfies OnboardingStep[]) : []), + ...(params.isLogsSelected + ? [ + { + title: t('Verify Logs'), + content: [logsVerify(params)], + }, + ] + : []), { title: t('Samples'), content: [ diff --git a/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.spec.tsx b/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.spec.tsx index ca05fc9099fabe..4eabe228cfb584 100644 --- a/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.spec.tsx +++ b/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.spec.tsx @@ -2,6 +2,8 @@ import {renderWithOnboardingLayout} from 'sentry-test/onboarding/renderWithOnboa import {screen} from 'sentry-test/reactTestingLibrary'; import {textWithMarkupMatcher} from 'sentry-test/utils'; +import {ProductSolution} from 'sentry/components/onboarding/gettingStartedDoc/types'; + import docs from './index'; describe('xamarin onboarding docs', () => { @@ -12,6 +14,7 @@ describe('xamarin onboarding docs', () => { version: '1.99.9', }, }, + selectedProducts: [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], }); // Renders main headings @@ -21,6 +24,7 @@ describe('xamarin onboarding docs', () => { expect(screen.getByRole('heading', {name: 'Tracing'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Documentation'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Limitations'})).toBeInTheDocument(); + expect(screen.getByRole('heading', {name: 'Verify Logs'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Samples'})).toBeInTheDocument(); // Renders SDK version from registry diff --git a/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.tsx b/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.tsx index 532b292c5a519c..07f42b4c8dcbb1 100644 --- a/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.tsx @@ -4,6 +4,7 @@ import type { OnboardingConfig, } from 'sentry/components/onboarding/gettingStartedDoc/types'; import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/types'; +import {logsVerify} from 'sentry/gettingStartedDocs/dotnet/logs'; import {t, tct} from 'sentry/locale'; import {getPackageVersion} from 'sentry/utils/gettingStartedDocs/getPackageVersion'; @@ -35,6 +36,8 @@ public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompa // Set TracesSampleRate to 1.0 to capture 100% of transactions for tracing. // We recommend adjusting this value in production. options.TracesSampleRate = 1.0; + // Enable logs to be sent to Sentry + options.EnableLogs = true; // If you installed Sentry.Xamarin.Forms: options.AddXamarinFormsIntegration(); });`; @@ -52,6 +55,8 @@ public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsAppli // Set TracesSampleRate to 1.0 to capture 100% of transactions for tracing. // We recommend adjusting this value in production. options.TracesSampleRate = 1.0; + // Enable logs to be sent to Sentry + options.EnableLogs = true; options.AddXamarinFormsIntegration(); });`; @@ -68,6 +73,8 @@ sealed partial class App : Application // Set TracesSampleRate to 1.0 to capture 100% of transactions for tracing. // We recommend adjusting this value in production. options.TracesSampleRate = 1.0; + // Enable logs to be sent to Sentry + options.EnableLogs = true; options.AddXamarinFormsIntegration(); });`; @@ -181,7 +188,7 @@ export const onboarding: OnboardingConfig = { ], }, ], - verify: () => [ + verify: params => [ { type: StepType.VERIFY, content: [ @@ -229,6 +236,14 @@ export const onboarding: OnboardingConfig = { }, ], }, + ...(params.isLogsSelected + ? [ + { + title: t('Verify Logs'), + content: [logsVerify(params)], + }, + ] + : []), { title: t('Documentation'), content: [ diff --git a/static/app/gettingStartedDocs/dotnet/logs.tsx b/static/app/gettingStartedDocs/dotnet/logs.tsx new file mode 100644 index 00000000000000..c9d94ebdfae04d --- /dev/null +++ b/static/app/gettingStartedDocs/dotnet/logs.tsx @@ -0,0 +1,22 @@ +import { + type ContentBlock, + type DocsParams, +} from 'sentry/components/onboarding/gettingStartedDoc/types'; +import {t} from 'sentry/locale'; + +export const logsVerify = (params: DocsParams): ContentBlock => ({ + type: 'conditional', + condition: params.isLogsSelected, + content: [ + { + type: 'text', + text: t('Send test logs from your app to verify logs are arriving in Sentry.'), + }, + { + type: 'code', + language: 'dotnet', + code: `SentrySdk.Logger.LogInfo("A simple log message"); +SentrySdk.Logger.LogError("A {0} log message", "formatted");`, + }, + ], +}); diff --git a/static/app/gettingStartedDocs/dotnet/onboarding.spec.tsx b/static/app/gettingStartedDocs/dotnet/onboarding.spec.tsx index 1afd2b2e9d6ad0..50151073b5fb3b 100644 --- a/static/app/gettingStartedDocs/dotnet/onboarding.spec.tsx +++ b/static/app/gettingStartedDocs/dotnet/onboarding.spec.tsx @@ -14,6 +14,7 @@ describe('dotnet onboarding docs', () => { version: '1.99.9', }, }, + selectedProducts: [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], }); // Renders main headings @@ -21,6 +22,7 @@ describe('dotnet onboarding docs', () => { expect(screen.getByRole('heading', {name: 'Configure SDK'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Verify'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Tracing'})).toBeInTheDocument(); + expect(screen.getByRole('heading', {name: 'Verify Logs'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Samples'})).toBeInTheDocument(); // Renders SDK version from registry @@ -53,4 +55,14 @@ describe('dotnet onboarding docs', () => { await screen.findByText(textWithMarkupMatcher(/options.ProfilesSampleRate/)) ).toBeInTheDocument(); }); + + it('renders logs onboarding docs correctly', async () => { + renderWithOnboardingLayout(docs, { + selectedProducts: [ProductSolution.LOGS], + }); + + expect( + await screen.findByText(textWithMarkupMatcher(/options.EnableLogs/)) + ).toBeInTheDocument(); + }); }); diff --git a/static/app/gettingStartedDocs/dotnet/onboarding.tsx b/static/app/gettingStartedDocs/dotnet/onboarding.tsx index 5b66ae7c48029a..8b02d23cec8682 100644 --- a/static/app/gettingStartedDocs/dotnet/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet/onboarding.tsx @@ -5,6 +5,7 @@ import type { OnboardingStep, } from 'sentry/components/onboarding/gettingStartedDoc/types'; import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/types'; +import {logsVerify} from 'sentry/gettingStartedDocs/dotnet/logs'; import {t, tct} from 'sentry/locale'; import {getPackageVersion} from 'sentry/utils/gettingStartedDocs/getPackageVersion'; @@ -77,6 +78,12 @@ SentrySdk.Init(options => ));` }` : '' + }${ + params.isLogsSelected + ? ` + // Enable logs to be sent to Sentry + options.EnableLogs = true;` + : '' } });`; @@ -255,6 +262,14 @@ export const onboarding: OnboardingConfig = { }, ] satisfies OnboardingStep[]) : []), + ...(params.isLogsSelected + ? [ + { + title: t('Verify Logs'), + content: [logsVerify(params)], + }, + ] + : []), { title: t('Samples'), content: [ From eade4540f4e2d56cd93952f856569281584caf25 Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Tue, 20 Jan 2026 09:12:49 +0100 Subject: [PATCH 02/24] feat(onboarding): Logs page for .NET platforms --- .../dotnet-aspnet/index.tsx | 2 + .../dotnet-aspnetcore/index.tsx | 2 + .../dotnet-awslambda/index.tsx | 2 + .../dotnet-gcpfunctions/index.tsx | 2 + .../gettingStartedDocs/dotnet-maui/index.tsx | 2 + .../dotnet-winforms/index.tsx | 2 + .../gettingStartedDocs/dotnet-wpf/index.tsx | 2 + .../dotnet-xamarin/index.tsx | 2 + .../app/gettingStartedDocs/dotnet/index.tsx | 2 + .../gettingStartedDocs/dotnet/logs.spec.tsx | 39 +++++++++ static/app/gettingStartedDocs/dotnet/logs.tsx | 86 ++++++++++++++++++- .../dotnet/onboarding.spec.tsx | 7 +- .../gettingStartedDocs/dotnet/onboarding.tsx | 9 ++ .../app/gettingStartedDocs/dotnet/utils.tsx | 38 +++++--- 14 files changed, 183 insertions(+), 14 deletions(-) create mode 100644 static/app/gettingStartedDocs/dotnet/logs.spec.tsx diff --git a/static/app/gettingStartedDocs/dotnet-aspnet/index.tsx b/static/app/gettingStartedDocs/dotnet-aspnet/index.tsx index 418194d2ba23e5..3b848c23678231 100644 --- a/static/app/gettingStartedDocs/dotnet-aspnet/index.tsx +++ b/static/app/gettingStartedDocs/dotnet-aspnet/index.tsx @@ -1,4 +1,5 @@ import type {Docs} from 'sentry/components/onboarding/gettingStartedDoc/types'; +import {logs} from 'sentry/gettingStartedDocs/dotnet/logs'; import { feedbackOnboardingJsLoader, replayOnboardingJsLoader, @@ -12,6 +13,7 @@ const docs: Docs = { replayOnboardingJsLoader, crashReportOnboarding: crashReport, feedbackOnboardingJsLoader, + logsOnboarding: logs(), }; export default docs; diff --git a/static/app/gettingStartedDocs/dotnet-aspnetcore/index.tsx b/static/app/gettingStartedDocs/dotnet-aspnetcore/index.tsx index 418194d2ba23e5..3b848c23678231 100644 --- a/static/app/gettingStartedDocs/dotnet-aspnetcore/index.tsx +++ b/static/app/gettingStartedDocs/dotnet-aspnetcore/index.tsx @@ -1,4 +1,5 @@ import type {Docs} from 'sentry/components/onboarding/gettingStartedDoc/types'; +import {logs} from 'sentry/gettingStartedDocs/dotnet/logs'; import { feedbackOnboardingJsLoader, replayOnboardingJsLoader, @@ -12,6 +13,7 @@ const docs: Docs = { replayOnboardingJsLoader, crashReportOnboarding: crashReport, feedbackOnboardingJsLoader, + logsOnboarding: logs(), }; export default docs; diff --git a/static/app/gettingStartedDocs/dotnet-awslambda/index.tsx b/static/app/gettingStartedDocs/dotnet-awslambda/index.tsx index 5a0e27e30c0730..6a0b097c967057 100644 --- a/static/app/gettingStartedDocs/dotnet-awslambda/index.tsx +++ b/static/app/gettingStartedDocs/dotnet-awslambda/index.tsx @@ -1,5 +1,6 @@ import type {Docs} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {feedback} from 'sentry/gettingStartedDocs/dotnet/feedback'; +import {logs} from 'sentry/gettingStartedDocs/dotnet/logs'; import {crashReport} from './crashReport'; import {onboarding} from './onboarding'; @@ -8,6 +9,7 @@ const docs: Docs = { onboarding, feedbackOnboardingCrashApi: feedback, crashReportOnboarding: crashReport, + logsOnboarding: logs(), }; export default docs; diff --git a/static/app/gettingStartedDocs/dotnet-gcpfunctions/index.tsx b/static/app/gettingStartedDocs/dotnet-gcpfunctions/index.tsx index 5a0e27e30c0730..6a0b097c967057 100644 --- a/static/app/gettingStartedDocs/dotnet-gcpfunctions/index.tsx +++ b/static/app/gettingStartedDocs/dotnet-gcpfunctions/index.tsx @@ -1,5 +1,6 @@ import type {Docs} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {feedback} from 'sentry/gettingStartedDocs/dotnet/feedback'; +import {logs} from 'sentry/gettingStartedDocs/dotnet/logs'; import {crashReport} from './crashReport'; import {onboarding} from './onboarding'; @@ -8,6 +9,7 @@ const docs: Docs = { onboarding, feedbackOnboardingCrashApi: feedback, crashReportOnboarding: crashReport, + logsOnboarding: logs(), }; export default docs; diff --git a/static/app/gettingStartedDocs/dotnet-maui/index.tsx b/static/app/gettingStartedDocs/dotnet-maui/index.tsx index 5a0e27e30c0730..6a0b097c967057 100644 --- a/static/app/gettingStartedDocs/dotnet-maui/index.tsx +++ b/static/app/gettingStartedDocs/dotnet-maui/index.tsx @@ -1,5 +1,6 @@ import type {Docs} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {feedback} from 'sentry/gettingStartedDocs/dotnet/feedback'; +import {logs} from 'sentry/gettingStartedDocs/dotnet/logs'; import {crashReport} from './crashReport'; import {onboarding} from './onboarding'; @@ -8,6 +9,7 @@ const docs: Docs = { onboarding, feedbackOnboardingCrashApi: feedback, crashReportOnboarding: crashReport, + logsOnboarding: logs(), }; export default docs; diff --git a/static/app/gettingStartedDocs/dotnet-winforms/index.tsx b/static/app/gettingStartedDocs/dotnet-winforms/index.tsx index 5a0e27e30c0730..6a0b097c967057 100644 --- a/static/app/gettingStartedDocs/dotnet-winforms/index.tsx +++ b/static/app/gettingStartedDocs/dotnet-winforms/index.tsx @@ -1,5 +1,6 @@ import type {Docs} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {feedback} from 'sentry/gettingStartedDocs/dotnet/feedback'; +import {logs} from 'sentry/gettingStartedDocs/dotnet/logs'; import {crashReport} from './crashReport'; import {onboarding} from './onboarding'; @@ -8,6 +9,7 @@ const docs: Docs = { onboarding, feedbackOnboardingCrashApi: feedback, crashReportOnboarding: crashReport, + logsOnboarding: logs(), }; export default docs; diff --git a/static/app/gettingStartedDocs/dotnet-wpf/index.tsx b/static/app/gettingStartedDocs/dotnet-wpf/index.tsx index 5a0e27e30c0730..6a0b097c967057 100644 --- a/static/app/gettingStartedDocs/dotnet-wpf/index.tsx +++ b/static/app/gettingStartedDocs/dotnet-wpf/index.tsx @@ -1,5 +1,6 @@ import type {Docs} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {feedback} from 'sentry/gettingStartedDocs/dotnet/feedback'; +import {logs} from 'sentry/gettingStartedDocs/dotnet/logs'; import {crashReport} from './crashReport'; import {onboarding} from './onboarding'; @@ -8,6 +9,7 @@ const docs: Docs = { onboarding, feedbackOnboardingCrashApi: feedback, crashReportOnboarding: crashReport, + logsOnboarding: logs(), }; export default docs; diff --git a/static/app/gettingStartedDocs/dotnet-xamarin/index.tsx b/static/app/gettingStartedDocs/dotnet-xamarin/index.tsx index 5a0e27e30c0730..6a0b097c967057 100644 --- a/static/app/gettingStartedDocs/dotnet-xamarin/index.tsx +++ b/static/app/gettingStartedDocs/dotnet-xamarin/index.tsx @@ -1,5 +1,6 @@ import type {Docs} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {feedback} from 'sentry/gettingStartedDocs/dotnet/feedback'; +import {logs} from 'sentry/gettingStartedDocs/dotnet/logs'; import {crashReport} from './crashReport'; import {onboarding} from './onboarding'; @@ -8,6 +9,7 @@ const docs: Docs = { onboarding, feedbackOnboardingCrashApi: feedback, crashReportOnboarding: crashReport, + logsOnboarding: logs(), }; export default docs; diff --git a/static/app/gettingStartedDocs/dotnet/index.tsx b/static/app/gettingStartedDocs/dotnet/index.tsx index acb003a7796e8a..875387288701fb 100644 --- a/static/app/gettingStartedDocs/dotnet/index.tsx +++ b/static/app/gettingStartedDocs/dotnet/index.tsx @@ -1,4 +1,5 @@ import type {Docs} from 'sentry/components/onboarding/gettingStartedDoc/types'; +import {logs} from 'sentry/gettingStartedDocs/dotnet/logs'; import {crashReport} from './crashReport'; import {feedback} from './feedback'; @@ -10,6 +11,7 @@ const docs: Docs = { feedbackOnboardingCrashApi: feedback, crashReportOnboarding: crashReport, profilingOnboarding: profiling, + logsOnboarding: logs(), }; export default docs; diff --git a/static/app/gettingStartedDocs/dotnet/logs.spec.tsx b/static/app/gettingStartedDocs/dotnet/logs.spec.tsx new file mode 100644 index 00000000000000..26b230dccc9f1d --- /dev/null +++ b/static/app/gettingStartedDocs/dotnet/logs.spec.tsx @@ -0,0 +1,39 @@ +// Only import and test functions that don't have circular dependencies +const {logs} = jest.requireActual('sentry/gettingStartedDocs/dotnet/logs'); + +describe('logs', () => { + const mockParams = { + dsn: { + public: 'https://test@example.com/123', + }, + sourcePackageRegistries: { + isLoading: false, + }, + }; + + it('generates logs onboarding config with default parameters', () => { + const result = logs(); + + // Test install step + const installSteps = result.install(mockParams); + expect(installSteps).toHaveLength(1); + expect(installSteps[0].type).toBe('install'); + expect(installSteps[0].content).toHaveLength(2); + + // Test configure step + const configureSteps = result.configure(mockParams); + expect(configureSteps).toHaveLength(1); + expect(configureSteps[0].type).toBe('configure'); + expect(configureSteps[0].content[1].code).toContain('o.EnableLogs = true;'); + expect(configureSteps[0].content[1].code).toContain(mockParams.dsn.public); + + // Test verify step + const verifySteps = result.verify({isLogsSelected: true}); + expect(verifySteps).toHaveLength(1); + expect(verifySteps[0].type).toBe('verify'); + expect(verifySteps[0].content).toHaveLength(1); + expect(verifySteps[0].content[0].type).toBe('conditional'); + const conditionalContent = verifySteps[0].content[0].content; + expect(conditionalContent[1].code).toContain('SentrySdk.Logger.LogInfo'); + }); +}); diff --git a/static/app/gettingStartedDocs/dotnet/logs.tsx b/static/app/gettingStartedDocs/dotnet/logs.tsx index c9d94ebdfae04d..e9ed1cf3c7b98f 100644 --- a/static/app/gettingStartedDocs/dotnet/logs.tsx +++ b/static/app/gettingStartedDocs/dotnet/logs.tsx @@ -1,8 +1,15 @@ +import {ExternalLink} from 'sentry/components/core/link'; import { + StepType, type ContentBlock, type DocsParams, + type OnboardingConfig, } from 'sentry/components/onboarding/gettingStartedDoc/types'; -import {t} from 'sentry/locale'; +import { + getInstallSnippetCoreCli, + getInstallSnippetPackageManager, +} from 'sentry/gettingStartedDocs/dotnet/utils'; +import {t, tct} from 'sentry/locale'; export const logsVerify = (params: DocsParams): ContentBlock => ({ type: 'conditional', @@ -20,3 +27,80 @@ SentrySdk.Logger.LogError("A {0} log message", "formatted");`, }, ], }); + +export const logs = (): OnboardingConfig => ({ + install: params => [ + { + type: StepType.INSTALL, + content: [ + { + type: 'text', + text: tct( + 'Install our .NET SDK with a minimum version that supports logs ([code:6.0.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: (params: DocsParams) => [ + { + type: StepType.CONFIGURE, + content: [ + { + type: 'text', + text: tct( + 'Configure the Sentry SDK to capture logs by setting [code:EnableLogs=true] in your [code:SentrySdk.Init] call:', + { + code: , + } + ), + }, + { + type: 'code', + language: 'dotnet', + code: `using Sentry; + +SentrySdk.Init(o => { + o.Dsn = "${params.dsn.public}"; + // Enable logs to be sent to Sentry + o.EnableLogs = true; +});`, + }, + { + type: 'text', + text: tct( + 'For more detailed information on logging configuration, see the [link:logs documentation].', + { + link: , + } + ), + }, + ], + }, + ], + verify: (params: DocsParams) => [ + { + type: StepType.VERIFY, + description: t('Test that logs are working by sending some test logs:'), + content: [logsVerify(params)], + }, + ], +}); diff --git a/static/app/gettingStartedDocs/dotnet/onboarding.spec.tsx b/static/app/gettingStartedDocs/dotnet/onboarding.spec.tsx index 50151073b5fb3b..9c838c9d192c56 100644 --- a/static/app/gettingStartedDocs/dotnet/onboarding.spec.tsx +++ b/static/app/gettingStartedDocs/dotnet/onboarding.spec.tsx @@ -14,7 +14,11 @@ describe('dotnet onboarding docs', () => { version: '1.99.9', }, }, - selectedProducts: [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], + selectedProducts: [ + ProductSolution.PERFORMANCE_MONITORING, + ProductSolution.LOGS, + ProductSolution.METRICS, + ], }); // Renders main headings @@ -23,6 +27,7 @@ describe('dotnet onboarding docs', () => { expect(screen.getByRole('heading', {name: 'Verify'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Tracing'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Verify Logs'})).toBeInTheDocument(); + expect(screen.getByRole('heading', {name: 'Verify Metrics'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Samples'})).toBeInTheDocument(); // Renders SDK version from registry diff --git a/static/app/gettingStartedDocs/dotnet/onboarding.tsx b/static/app/gettingStartedDocs/dotnet/onboarding.tsx index 8b02d23cec8682..1d954927156271 100644 --- a/static/app/gettingStartedDocs/dotnet/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet/onboarding.tsx @@ -6,6 +6,7 @@ import type { } from 'sentry/components/onboarding/gettingStartedDoc/types'; import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {logsVerify} from 'sentry/gettingStartedDocs/dotnet/logs'; +import {metricsVerify} from 'sentry/gettingStartedDocs/dotnet/metrics'; import {t, tct} from 'sentry/locale'; import {getPackageVersion} from 'sentry/utils/gettingStartedDocs/getPackageVersion'; @@ -270,6 +271,14 @@ export const onboarding: OnboardingConfig = { }, ] : []), + ...(params.isMetricsSelected + ? [ + { + title: t('Verify Metrics'), + content: [metricsVerify(params)], + }, + ] + : []), { title: t('Samples'), content: [ diff --git a/static/app/gettingStartedDocs/dotnet/utils.tsx b/static/app/gettingStartedDocs/dotnet/utils.tsx index a9505a129e29b4..d32e27c0b697b3 100644 --- a/static/app/gettingStartedDocs/dotnet/utils.tsx +++ b/static/app/gettingStartedDocs/dotnet/utils.tsx @@ -1,16 +1,30 @@ import type {DocsParams} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {getPackageVersion} from 'sentry/utils/gettingStartedDocs/getPackageVersion'; -export const getInstallSnippetPackageManager = (params: DocsParams) => ` -Install-Package Sentry -Version ${getPackageVersion( - params, - 'sentry.dotnet', - params.isProfilingSelected ? '4.3.0' : '3.34.0' -)}`; +export const getInstallSnippetPackageManager = (params: DocsParams) => { + let version = '3.34.0'; + if (params.isLogsSelected) { + version = '6.0.0'; + } else if (params.isProfilingSelected) { + version = '4.3.0'; + } -export const getInstallSnippetCoreCli = (params: DocsParams) => ` -dotnet add package Sentry -v ${getPackageVersion( - params, - 'sentry.dotnet', - params.isProfilingSelected ? '4.3.0' : '3.34.0' -)}`; + return ` + Install-Package Sentry -Version ${getPackageVersion( + params, + 'sentry.dotnet', + version + )}`; +}; + +export const getInstallSnippetCoreCli = (params: DocsParams) => { + let version = '3.34.0'; + if (params.isLogsSelected) { + version = '6.0.0'; + } else if (params.isProfilingSelected) { + version = '4.3.0'; + } + + return ` + dotnet add package Sentry -v ${getPackageVersion(params, 'sentry.dotnet', version)}`; +}; From 02e5546d39324196fa9b2657f12bbecbee5b86d4 Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Tue, 20 Jan 2026 09:16:45 +0100 Subject: [PATCH 03/24] feat(onboarding): Add metrics for .NET platforms --- .../onboarding/productSelection.tsx | 49 ++++++++++++++++--- static/app/data/platformCategories.tsx | 9 ++++ .../dotnet-aspnet/onboarding.spec.tsx | 7 ++- .../dotnet-aspnet/onboarding.tsx | 9 ++++ .../dotnet-aspnetcore/onboarding.spec.tsx | 7 ++- .../dotnet-aspnetcore/onboarding.tsx | 9 ++++ .../dotnet-awslambda/onboarding.spec.tsx | 3 +- .../dotnet-awslambda/onboarding.tsx | 9 ++++ .../dotnet-gcpfunctions/onboarding.spec.tsx | 3 +- .../dotnet-gcpfunctions/onboarding.tsx | 9 ++++ .../dotnet-maui/onboarding.spec.tsx | 7 ++- .../dotnet-maui/onboarding.tsx | 9 ++++ .../dotnet-winforms/onboarding.spec.tsx | 7 ++- .../dotnet-winforms/onboarding.tsx | 9 ++++ .../dotnet-wpf/onboarding.spec.tsx | 7 ++- .../dotnet-wpf/onboarding.tsx | 9 ++++ .../dotnet-xamarin/onboarding.spec.tsx | 7 ++- .../dotnet-xamarin/onboarding.tsx | 9 ++++ 18 files changed, 162 insertions(+), 16 deletions(-) diff --git a/static/app/components/onboarding/productSelection.tsx b/static/app/components/onboarding/productSelection.tsx index f587b33096bbac..3b88e079e598a3 100644 --- a/static/app/components/onboarding/productSelection.tsx +++ b/static/app/components/onboarding/productSelection.tsx @@ -96,15 +96,48 @@ export const platformProductAvailability = { ProductSolution.PERFORMANCE_MONITORING, ProductSolution.PROFILING, ProductSolution.LOGS, + ProductSolution.METRICS, + ], + 'dotnet-aspnet': [ + ProductSolution.PERFORMANCE_MONITORING, + ProductSolution.LOGS, + ProductSolution.METRICS, + ], + 'dotnet-aspnetcore': [ + ProductSolution.PERFORMANCE_MONITORING, + ProductSolution.LOGS, + ProductSolution.METRICS, + ], + 'dotnet-awslambda': [ + ProductSolution.PERFORMANCE_MONITORING, + ProductSolution.LOGS, + ProductSolution.METRICS, + ], + 'dotnet-gcpfunctions': [ + ProductSolution.PERFORMANCE_MONITORING, + ProductSolution.LOGS, + ProductSolution.METRICS, + ], + 'dotnet-maui': [ + ProductSolution.PERFORMANCE_MONITORING, + ProductSolution.LOGS, + ProductSolution.METRICS, + ], + 'dotnet-winforms': [ + ProductSolution.PERFORMANCE_MONITORING, + ProductSolution.LOGS, + ProductSolution.METRICS, + ], + 'dotnet-wpf': [ + ProductSolution.PERFORMANCE_MONITORING, + ProductSolution.LOGS, + ProductSolution.METRICS, + ], + 'dotnet-xamarin': [ + ProductSolution.PERFORMANCE_MONITORING, + ProductSolution.LOGS, + ProductSolution.METRICS, ], - 'dotnet-aspnet': [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], - 'dotnet-aspnetcore': [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], - 'dotnet-awslambda': [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], - 'dotnet-gcpfunctions': [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], - 'dotnet-maui': [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], - 'dotnet-winforms': [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], - 'dotnet-wpf': [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], - 'dotnet-xamarin': [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], dart: [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], kotlin: [ProductSolution.PERFORMANCE_MONITORING], go: [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], diff --git a/static/app/data/platformCategories.tsx b/static/app/data/platformCategories.tsx index db5a238ae4af43..42c4a6776f30e3 100644 --- a/static/app/data/platformCategories.tsx +++ b/static/app/data/platformCategories.tsx @@ -392,6 +392,15 @@ export const withoutLoggingSupport: Set = new Set(['elixir']); // List of platforms that have metrics onboarding checklist content export const withMetricsOnboarding: Set = new Set([ + 'dotnet', + 'dotnet-aspnet', + 'dotnet-aspnetcore', + 'dotnet-awslambda', + 'dotnet-gcpfunctions', + 'dotnet-maui', + 'dotnet-winforms', + 'dotnet-wpf', + 'dotnet-xamarin', 'javascript', 'javascript-angular', 'javascript-astro', diff --git a/static/app/gettingStartedDocs/dotnet-aspnet/onboarding.spec.tsx b/static/app/gettingStartedDocs/dotnet-aspnet/onboarding.spec.tsx index 96843a7744a74c..de05840e3244ee 100644 --- a/static/app/gettingStartedDocs/dotnet-aspnet/onboarding.spec.tsx +++ b/static/app/gettingStartedDocs/dotnet-aspnet/onboarding.spec.tsx @@ -14,7 +14,11 @@ describe('aspnet onboarding docs', () => { version: '1.99.9', }, }, - selectedProducts: [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], + selectedProducts: [ + ProductSolution.PERFORMANCE_MONITORING, + ProductSolution.LOGS, + ProductSolution.METRICS, + ], }); // Renders main headings @@ -22,6 +26,7 @@ describe('aspnet onboarding docs', () => { expect(screen.getByRole('heading', {name: 'Configure SDK'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Documentation'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Verify Logs'})).toBeInTheDocument(); + expect(screen.getByRole('heading', {name: 'Verify Metrics'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Samples'})).toBeInTheDocument(); // Renders SDK version from registry diff --git a/static/app/gettingStartedDocs/dotnet-aspnet/onboarding.tsx b/static/app/gettingStartedDocs/dotnet-aspnet/onboarding.tsx index bfa70ba82d1929..c6b145f9521bba 100644 --- a/static/app/gettingStartedDocs/dotnet-aspnet/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet-aspnet/onboarding.tsx @@ -5,6 +5,7 @@ import type { } from 'sentry/components/onboarding/gettingStartedDoc/types'; import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {logsVerify} from 'sentry/gettingStartedDocs/dotnet/logs'; +import {metricsVerify} from 'sentry/gettingStartedDocs/dotnet/metrics'; import {t, tct} from 'sentry/locale'; import {getPackageVersion} from 'sentry/utils/gettingStartedDocs/getPackageVersion'; @@ -168,6 +169,14 @@ export const onboarding: OnboardingConfig = { }, ] : []), + ...(params.isMetricsSelected + ? [ + { + title: t('Verify Metrics'), + content: [metricsVerify(params)], + }, + ] + : []), { title: t('Samples'), content: [ diff --git a/static/app/gettingStartedDocs/dotnet-aspnetcore/onboarding.spec.tsx b/static/app/gettingStartedDocs/dotnet-aspnetcore/onboarding.spec.tsx index e4b5ce1edc12cf..282d8e66e090d0 100644 --- a/static/app/gettingStartedDocs/dotnet-aspnetcore/onboarding.spec.tsx +++ b/static/app/gettingStartedDocs/dotnet-aspnetcore/onboarding.spec.tsx @@ -14,7 +14,11 @@ describe('aspnetcore onboarding docs', () => { version: '1.99.9', }, }, - selectedProducts: [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], + selectedProducts: [ + ProductSolution.PERFORMANCE_MONITORING, + ProductSolution.LOGS, + ProductSolution.METRICS, + ], }); // Renders main headings @@ -23,6 +27,7 @@ describe('aspnetcore onboarding docs', () => { expect(screen.getByRole('heading', {name: 'Verify'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Tracing'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Verify Logs'})).toBeInTheDocument(); + expect(screen.getByRole('heading', {name: 'Verify Metrics'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Samples'})).toBeInTheDocument(); // Renders SDK version from registry diff --git a/static/app/gettingStartedDocs/dotnet-aspnetcore/onboarding.tsx b/static/app/gettingStartedDocs/dotnet-aspnetcore/onboarding.tsx index d88b4bb36e3f43..cc8cfcc3b0586d 100644 --- a/static/app/gettingStartedDocs/dotnet-aspnetcore/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet-aspnetcore/onboarding.tsx @@ -6,6 +6,7 @@ import type { } from 'sentry/components/onboarding/gettingStartedDoc/types'; import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {logsVerify} from 'sentry/gettingStartedDocs/dotnet/logs'; +import {metricsVerify} from 'sentry/gettingStartedDocs/dotnet/metrics'; import {t, tct} from 'sentry/locale'; import {getPackageVersion} from 'sentry/utils/gettingStartedDocs/getPackageVersion'; @@ -192,6 +193,14 @@ export const onboarding: OnboardingConfig = { }, ] : []), + ...(params.isMetricsSelected + ? [ + { + title: t('Verify Metrics'), + content: [metricsVerify(params)], + }, + ] + : []), { title: t('Samples'), content: [ diff --git a/static/app/gettingStartedDocs/dotnet-awslambda/onboarding.spec.tsx b/static/app/gettingStartedDocs/dotnet-awslambda/onboarding.spec.tsx index aef7247759e1b1..7d6fda10513303 100644 --- a/static/app/gettingStartedDocs/dotnet-awslambda/onboarding.spec.tsx +++ b/static/app/gettingStartedDocs/dotnet-awslambda/onboarding.spec.tsx @@ -14,7 +14,7 @@ describe('awslambda onboarding docs', () => { version: '1.99.9', }, }, - selectedProducts: [ProductSolution.LOGS], + selectedProducts: [ProductSolution.LOGS, ProductSolution.METRICS], }); // Renders main headings @@ -22,6 +22,7 @@ describe('awslambda onboarding docs', () => { expect(screen.getByRole('heading', {name: 'Configure SDK'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Verify'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Verify Logs'})).toBeInTheDocument(); + expect(screen.getByRole('heading', {name: 'Verify Metrics'})).toBeInTheDocument(); // Renders SDK version from registry expect( diff --git a/static/app/gettingStartedDocs/dotnet-awslambda/onboarding.tsx b/static/app/gettingStartedDocs/dotnet-awslambda/onboarding.tsx index b700e9baf64ce5..375927779b7ed0 100644 --- a/static/app/gettingStartedDocs/dotnet-awslambda/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet-awslambda/onboarding.tsx @@ -5,6 +5,7 @@ import type { } from 'sentry/components/onboarding/gettingStartedDoc/types'; import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {logsVerify} from 'sentry/gettingStartedDocs/dotnet/logs'; +import {metricsVerify} from 'sentry/gettingStartedDocs/dotnet/metrics'; import {t, tct} from 'sentry/locale'; import {getPackageVersion} from 'sentry/utils/gettingStartedDocs/getPackageVersion'; @@ -176,5 +177,13 @@ export const onboarding: OnboardingConfig = { }, ] : []), + ...(params.isMetricsSelected + ? [ + { + title: t('Verify Metrics'), + content: [metricsVerify(params)], + }, + ] + : []), ], }; diff --git a/static/app/gettingStartedDocs/dotnet-gcpfunctions/onboarding.spec.tsx b/static/app/gettingStartedDocs/dotnet-gcpfunctions/onboarding.spec.tsx index ce508d0a26e19f..cea09dcf1eb371 100644 --- a/static/app/gettingStartedDocs/dotnet-gcpfunctions/onboarding.spec.tsx +++ b/static/app/gettingStartedDocs/dotnet-gcpfunctions/onboarding.spec.tsx @@ -14,7 +14,7 @@ describe('gcpfunctions onboarding docs', () => { version: '1.99.9', }, }, - selectedProducts: [ProductSolution.LOGS], + selectedProducts: [ProductSolution.LOGS, ProductSolution.METRICS], }); // Renders main headings @@ -22,6 +22,7 @@ describe('gcpfunctions onboarding docs', () => { expect(screen.getByRole('heading', {name: 'Configure SDK'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Verify'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Verify Logs'})).toBeInTheDocument(); + expect(screen.getByRole('heading', {name: 'Verify Metrics'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Samples'})).toBeInTheDocument(); // Renders SDK version from registry diff --git a/static/app/gettingStartedDocs/dotnet-gcpfunctions/onboarding.tsx b/static/app/gettingStartedDocs/dotnet-gcpfunctions/onboarding.tsx index 7f4e16a19b1fcc..56c744d6bd5a37 100644 --- a/static/app/gettingStartedDocs/dotnet-gcpfunctions/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet-gcpfunctions/onboarding.tsx @@ -5,6 +5,7 @@ import type { } from 'sentry/components/onboarding/gettingStartedDoc/types'; import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {logsVerify} from 'sentry/gettingStartedDocs/dotnet/logs'; +import {metricsVerify} from 'sentry/gettingStartedDocs/dotnet/metrics'; import {t, tct} from 'sentry/locale'; import {getPackageVersion} from 'sentry/utils/gettingStartedDocs/getPackageVersion'; @@ -176,6 +177,14 @@ export const onboarding: OnboardingConfig = { }, ] : []), + ...(params.isMetricsSelected + ? [ + { + title: t('Verify Metrics'), + content: [metricsVerify(params)], + }, + ] + : []), { title: t('Samples'), content: [ diff --git a/static/app/gettingStartedDocs/dotnet-maui/onboarding.spec.tsx b/static/app/gettingStartedDocs/dotnet-maui/onboarding.spec.tsx index 8168b4c4ac2cc9..1feaf764f0cda4 100644 --- a/static/app/gettingStartedDocs/dotnet-maui/onboarding.spec.tsx +++ b/static/app/gettingStartedDocs/dotnet-maui/onboarding.spec.tsx @@ -14,7 +14,11 @@ describe('maui onboarding docs', () => { version: '1.99.9', }, }, - selectedProducts: [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], + selectedProducts: [ + ProductSolution.PERFORMANCE_MONITORING, + ProductSolution.LOGS, + ProductSolution.METRICS, + ], }); // Renders main headings @@ -23,6 +27,7 @@ describe('maui onboarding docs', () => { expect(screen.getByRole('heading', {name: 'Verify'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Tracing'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Verify Logs'})).toBeInTheDocument(); + expect(screen.getByRole('heading', {name: 'Verify Metrics'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Sample Application'})).toBeInTheDocument(); // Renders SDK version from registry diff --git a/static/app/gettingStartedDocs/dotnet-maui/onboarding.tsx b/static/app/gettingStartedDocs/dotnet-maui/onboarding.tsx index 202a972eed07f5..d3d517e852a19a 100644 --- a/static/app/gettingStartedDocs/dotnet-maui/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet-maui/onboarding.tsx @@ -6,6 +6,7 @@ import type { } from 'sentry/components/onboarding/gettingStartedDoc/types'; import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {logsVerify} from 'sentry/gettingStartedDocs/dotnet/logs'; +import {metricsVerify} from 'sentry/gettingStartedDocs/dotnet/metrics'; import {t, tct} from 'sentry/locale'; import {getPackageVersion} from 'sentry/utils/gettingStartedDocs/getPackageVersion'; @@ -219,6 +220,14 @@ export const onboarding: OnboardingConfig = { }, ] : []), + ...(params.isMetricsSelected + ? [ + { + title: t('Verify Metrics'), + content: [metricsVerify(params)], + }, + ] + : []), { title: t('Sample Application'), content: [ diff --git a/static/app/gettingStartedDocs/dotnet-winforms/onboarding.spec.tsx b/static/app/gettingStartedDocs/dotnet-winforms/onboarding.spec.tsx index ecf649896c319c..06a20defeb4ad8 100644 --- a/static/app/gettingStartedDocs/dotnet-winforms/onboarding.spec.tsx +++ b/static/app/gettingStartedDocs/dotnet-winforms/onboarding.spec.tsx @@ -14,7 +14,11 @@ describe('winforms onboarding docs', () => { version: '1.99.9', }, }, - selectedProducts: [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], + selectedProducts: [ + ProductSolution.PERFORMANCE_MONITORING, + ProductSolution.LOGS, + ProductSolution.METRICS, + ], }); // Renders main headings @@ -24,6 +28,7 @@ describe('winforms onboarding docs', () => { expect(screen.getByRole('heading', {name: 'Tracing'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Documentation'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Verify Logs'})).toBeInTheDocument(); + expect(screen.getByRole('heading', {name: 'Verify Metrics'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Samples'})).toBeInTheDocument(); // Renders SDK version from registry diff --git a/static/app/gettingStartedDocs/dotnet-winforms/onboarding.tsx b/static/app/gettingStartedDocs/dotnet-winforms/onboarding.tsx index a40a9f2f38ae8a..20ec62ac094dc3 100644 --- a/static/app/gettingStartedDocs/dotnet-winforms/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet-winforms/onboarding.tsx @@ -6,6 +6,7 @@ import type { } from 'sentry/components/onboarding/gettingStartedDoc/types'; import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {logsVerify} from 'sentry/gettingStartedDocs/dotnet/logs'; +import {metricsVerify} from 'sentry/gettingStartedDocs/dotnet/metrics'; import {t, tct} from 'sentry/locale'; import {getPackageVersion} from 'sentry/utils/gettingStartedDocs/getPackageVersion'; @@ -192,6 +193,14 @@ export const onboarding: OnboardingConfig = { }, ] : []), + ...(params.isMetricsSelected + ? [ + { + title: t('Verify Metrics'), + content: [metricsVerify(params)], + }, + ] + : []), { title: t('Samples'), content: [ diff --git a/static/app/gettingStartedDocs/dotnet-wpf/onboarding.spec.tsx b/static/app/gettingStartedDocs/dotnet-wpf/onboarding.spec.tsx index fc0da5db51c823..946ac6db6d8c6b 100644 --- a/static/app/gettingStartedDocs/dotnet-wpf/onboarding.spec.tsx +++ b/static/app/gettingStartedDocs/dotnet-wpf/onboarding.spec.tsx @@ -14,7 +14,11 @@ describe('wpf onboarding docs', () => { version: '1.99.9', }, }, - selectedProducts: [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], + selectedProducts: [ + ProductSolution.PERFORMANCE_MONITORING, + ProductSolution.LOGS, + ProductSolution.METRICS, + ], }); // Renders main headings @@ -24,6 +28,7 @@ describe('wpf onboarding docs', () => { expect(screen.getByRole('heading', {name: 'Tracing'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Documentation'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Verify Logs'})).toBeInTheDocument(); + expect(screen.getByRole('heading', {name: 'Verify Metrics'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Samples'})).toBeInTheDocument(); // Renders SDK version from registry diff --git a/static/app/gettingStartedDocs/dotnet-wpf/onboarding.tsx b/static/app/gettingStartedDocs/dotnet-wpf/onboarding.tsx index e5cfb167b44f59..03951463feaa39 100644 --- a/static/app/gettingStartedDocs/dotnet-wpf/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet-wpf/onboarding.tsx @@ -6,6 +6,7 @@ import type { } from 'sentry/components/onboarding/gettingStartedDoc/types'; import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {logsVerify} from 'sentry/gettingStartedDocs/dotnet/logs'; +import {metricsVerify} from 'sentry/gettingStartedDocs/dotnet/metrics'; import {t, tct} from 'sentry/locale'; import {getPackageVersion} from 'sentry/utils/gettingStartedDocs/getPackageVersion'; @@ -192,6 +193,14 @@ export const onboarding: OnboardingConfig = { }, ] : []), + ...(params.isMetricsSelected + ? [ + { + title: t('Verify Metrics'), + content: [metricsVerify(params)], + }, + ] + : []), { title: t('Samples'), content: [ diff --git a/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.spec.tsx b/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.spec.tsx index 4eabe228cfb584..1e5bf8ca35cc0f 100644 --- a/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.spec.tsx +++ b/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.spec.tsx @@ -14,7 +14,11 @@ describe('xamarin onboarding docs', () => { version: '1.99.9', }, }, - selectedProducts: [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], + selectedProducts: [ + ProductSolution.PERFORMANCE_MONITORING, + ProductSolution.LOGS, + ProductSolution.METRICS, + ], }); // Renders main headings @@ -25,6 +29,7 @@ describe('xamarin onboarding docs', () => { expect(screen.getByRole('heading', {name: 'Documentation'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Limitations'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Verify Logs'})).toBeInTheDocument(); + expect(screen.getByRole('heading', {name: 'Verify Metrics'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Samples'})).toBeInTheDocument(); // Renders SDK version from registry diff --git a/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.tsx b/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.tsx index 07f42b4c8dcbb1..676bc02f08ef21 100644 --- a/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.tsx @@ -5,6 +5,7 @@ import type { } from 'sentry/components/onboarding/gettingStartedDoc/types'; import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {logsVerify} from 'sentry/gettingStartedDocs/dotnet/logs'; +import {metricsVerify} from 'sentry/gettingStartedDocs/dotnet/metrics'; import {t, tct} from 'sentry/locale'; import {getPackageVersion} from 'sentry/utils/gettingStartedDocs/getPackageVersion'; @@ -244,6 +245,14 @@ export const onboarding: OnboardingConfig = { }, ] : []), + ...(params.isMetricsSelected + ? [ + { + title: t('Verify Metrics'), + content: [metricsVerify(params)], + }, + ] + : []), { title: t('Documentation'), content: [ From 04b32faf26e466ab1e27d6335ead5996fd1ddbe4 Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Tue, 20 Jan 2026 09:42:15 +0100 Subject: [PATCH 04/24] remove metrics stuff --- static/app/gettingStartedDocs/dotnet/onboarding.spec.tsx | 7 +------ static/app/gettingStartedDocs/dotnet/onboarding.tsx | 9 --------- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/static/app/gettingStartedDocs/dotnet/onboarding.spec.tsx b/static/app/gettingStartedDocs/dotnet/onboarding.spec.tsx index 9c838c9d192c56..50151073b5fb3b 100644 --- a/static/app/gettingStartedDocs/dotnet/onboarding.spec.tsx +++ b/static/app/gettingStartedDocs/dotnet/onboarding.spec.tsx @@ -14,11 +14,7 @@ describe('dotnet onboarding docs', () => { version: '1.99.9', }, }, - selectedProducts: [ - ProductSolution.PERFORMANCE_MONITORING, - ProductSolution.LOGS, - ProductSolution.METRICS, - ], + selectedProducts: [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], }); // Renders main headings @@ -27,7 +23,6 @@ describe('dotnet onboarding docs', () => { expect(screen.getByRole('heading', {name: 'Verify'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Tracing'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Verify Logs'})).toBeInTheDocument(); - expect(screen.getByRole('heading', {name: 'Verify Metrics'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Samples'})).toBeInTheDocument(); // Renders SDK version from registry diff --git a/static/app/gettingStartedDocs/dotnet/onboarding.tsx b/static/app/gettingStartedDocs/dotnet/onboarding.tsx index 1d954927156271..8b02d23cec8682 100644 --- a/static/app/gettingStartedDocs/dotnet/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet/onboarding.tsx @@ -6,7 +6,6 @@ import type { } from 'sentry/components/onboarding/gettingStartedDoc/types'; import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {logsVerify} from 'sentry/gettingStartedDocs/dotnet/logs'; -import {metricsVerify} from 'sentry/gettingStartedDocs/dotnet/metrics'; import {t, tct} from 'sentry/locale'; import {getPackageVersion} from 'sentry/utils/gettingStartedDocs/getPackageVersion'; @@ -271,14 +270,6 @@ export const onboarding: OnboardingConfig = { }, ] : []), - ...(params.isMetricsSelected - ? [ - { - title: t('Verify Metrics'), - content: [metricsVerify(params)], - }, - ] - : []), { title: t('Samples'), content: [ From 8cf15e0129b7c93425afd507219cfa2b2950929d Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Tue, 20 Jan 2026 09:44:43 +0100 Subject: [PATCH 05/24] add metrics.tsx --- .../app/gettingStartedDocs/dotnet/metrics.tsx | 41 +++++++++++++++++++ .../dotnet/onboarding.spec.tsx | 7 +--- .../gettingStartedDocs/dotnet/onboarding.tsx | 9 ---- 3 files changed, 42 insertions(+), 15 deletions(-) create mode 100644 static/app/gettingStartedDocs/dotnet/metrics.tsx diff --git a/static/app/gettingStartedDocs/dotnet/metrics.tsx b/static/app/gettingStartedDocs/dotnet/metrics.tsx new file mode 100644 index 00000000000000..bacbf8c344097d --- /dev/null +++ b/static/app/gettingStartedDocs/dotnet/metrics.tsx @@ -0,0 +1,41 @@ +import {ExternalLink} from 'sentry/components/core/link'; +import { + type ContentBlock, + type DocsParams, +} from 'sentry/components/onboarding/gettingStartedDoc/types'; +import {tct} from 'sentry/locale'; + +export const metricsVerify = (params: DocsParams): ContentBlock => ({ + type: 'conditional', + condition: params.isMetricsSelected, + content: [ + { + type: 'text', + text: tct( + 'Send test metrics from your app to verify metrics are arriving in Sentry.', + {code: } + ), + }, + { + type: 'code', + language: 'dotnet', + code: `using Sentry; + +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/onboarding.spec.tsx b/static/app/gettingStartedDocs/dotnet/onboarding.spec.tsx index 9c838c9d192c56..50151073b5fb3b 100644 --- a/static/app/gettingStartedDocs/dotnet/onboarding.spec.tsx +++ b/static/app/gettingStartedDocs/dotnet/onboarding.spec.tsx @@ -14,11 +14,7 @@ describe('dotnet onboarding docs', () => { version: '1.99.9', }, }, - selectedProducts: [ - ProductSolution.PERFORMANCE_MONITORING, - ProductSolution.LOGS, - ProductSolution.METRICS, - ], + selectedProducts: [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], }); // Renders main headings @@ -27,7 +23,6 @@ describe('dotnet onboarding docs', () => { expect(screen.getByRole('heading', {name: 'Verify'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Tracing'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Verify Logs'})).toBeInTheDocument(); - expect(screen.getByRole('heading', {name: 'Verify Metrics'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Samples'})).toBeInTheDocument(); // Renders SDK version from registry diff --git a/static/app/gettingStartedDocs/dotnet/onboarding.tsx b/static/app/gettingStartedDocs/dotnet/onboarding.tsx index 1d954927156271..8b02d23cec8682 100644 --- a/static/app/gettingStartedDocs/dotnet/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet/onboarding.tsx @@ -6,7 +6,6 @@ import type { } from 'sentry/components/onboarding/gettingStartedDoc/types'; import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {logsVerify} from 'sentry/gettingStartedDocs/dotnet/logs'; -import {metricsVerify} from 'sentry/gettingStartedDocs/dotnet/metrics'; import {t, tct} from 'sentry/locale'; import {getPackageVersion} from 'sentry/utils/gettingStartedDocs/getPackageVersion'; @@ -271,14 +270,6 @@ export const onboarding: OnboardingConfig = { }, ] : []), - ...(params.isMetricsSelected - ? [ - { - title: t('Verify Metrics'), - content: [metricsVerify(params)], - }, - ] - : []), { title: t('Samples'), content: [ From cbbb6d6e06d2ac7e09d2b7046ed88f8f3a21ccdc Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Tue, 20 Jan 2026 09:49:07 +0100 Subject: [PATCH 06/24] add comma to gcp config --- .../app/gettingStartedDocs/dotnet-gcpfunctions/onboarding.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/app/gettingStartedDocs/dotnet-gcpfunctions/onboarding.tsx b/static/app/gettingStartedDocs/dotnet-gcpfunctions/onboarding.tsx index 7f4e16a19b1fcc..f4a1fe2b736887 100644 --- a/static/app/gettingStartedDocs/dotnet-gcpfunctions/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet-gcpfunctions/onboarding.tsx @@ -61,7 +61,7 @@ const getConfigureJsonSnippet = (params: DocsParams) => ` : '' }${ params.isLogsSelected - ? ` + ? `, // Enable logs to be sent to Sentry "EnableLogs": true` : '' From 8984109b8d8717b4c4c557f48c0563cc2d1dcf94 Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Tue, 20 Jan 2026 09:51:55 +0100 Subject: [PATCH 07/24] rename logs function --- static/app/gettingStartedDocs/dotnet-aspnet/index.tsx | 4 ++-- static/app/gettingStartedDocs/dotnet-aspnetcore/index.tsx | 4 ++-- static/app/gettingStartedDocs/dotnet-awslambda/index.tsx | 4 ++-- static/app/gettingStartedDocs/dotnet-gcpfunctions/index.tsx | 4 ++-- static/app/gettingStartedDocs/dotnet-maui/index.tsx | 4 ++-- static/app/gettingStartedDocs/dotnet-winforms/index.tsx | 4 ++-- static/app/gettingStartedDocs/dotnet-wpf/index.tsx | 4 ++-- static/app/gettingStartedDocs/dotnet-xamarin/index.tsx | 4 ++-- static/app/gettingStartedDocs/dotnet/index.tsx | 4 ++-- static/app/gettingStartedDocs/dotnet/logs.spec.tsx | 4 ++-- static/app/gettingStartedDocs/dotnet/logs.tsx | 2 +- 11 files changed, 21 insertions(+), 21 deletions(-) diff --git a/static/app/gettingStartedDocs/dotnet-aspnet/index.tsx b/static/app/gettingStartedDocs/dotnet-aspnet/index.tsx index 3b848c23678231..7a1808c107bd14 100644 --- a/static/app/gettingStartedDocs/dotnet-aspnet/index.tsx +++ b/static/app/gettingStartedDocs/dotnet-aspnet/index.tsx @@ -1,5 +1,5 @@ import type {Docs} from 'sentry/components/onboarding/gettingStartedDoc/types'; -import {logs} from 'sentry/gettingStartedDocs/dotnet/logs'; +import {dotnetLogs} from 'sentry/gettingStartedDocs/dotnet/logs'; import { feedbackOnboardingJsLoader, replayOnboardingJsLoader, @@ -13,7 +13,7 @@ const docs: Docs = { replayOnboardingJsLoader, crashReportOnboarding: crashReport, feedbackOnboardingJsLoader, - logsOnboarding: logs(), + logsOnboarding: dotnetLogs(), }; export default docs; diff --git a/static/app/gettingStartedDocs/dotnet-aspnetcore/index.tsx b/static/app/gettingStartedDocs/dotnet-aspnetcore/index.tsx index 3b848c23678231..7a1808c107bd14 100644 --- a/static/app/gettingStartedDocs/dotnet-aspnetcore/index.tsx +++ b/static/app/gettingStartedDocs/dotnet-aspnetcore/index.tsx @@ -1,5 +1,5 @@ import type {Docs} from 'sentry/components/onboarding/gettingStartedDoc/types'; -import {logs} from 'sentry/gettingStartedDocs/dotnet/logs'; +import {dotnetLogs} from 'sentry/gettingStartedDocs/dotnet/logs'; import { feedbackOnboardingJsLoader, replayOnboardingJsLoader, @@ -13,7 +13,7 @@ const docs: Docs = { replayOnboardingJsLoader, crashReportOnboarding: crashReport, feedbackOnboardingJsLoader, - logsOnboarding: logs(), + logsOnboarding: dotnetLogs(), }; export default docs; diff --git a/static/app/gettingStartedDocs/dotnet-awslambda/index.tsx b/static/app/gettingStartedDocs/dotnet-awslambda/index.tsx index 6a0b097c967057..c0b0a998cf224b 100644 --- a/static/app/gettingStartedDocs/dotnet-awslambda/index.tsx +++ b/static/app/gettingStartedDocs/dotnet-awslambda/index.tsx @@ -1,6 +1,6 @@ import type {Docs} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {feedback} from 'sentry/gettingStartedDocs/dotnet/feedback'; -import {logs} from 'sentry/gettingStartedDocs/dotnet/logs'; +import {dotnetLogs} from 'sentry/gettingStartedDocs/dotnet/logs'; import {crashReport} from './crashReport'; import {onboarding} from './onboarding'; @@ -9,7 +9,7 @@ const docs: Docs = { onboarding, feedbackOnboardingCrashApi: feedback, crashReportOnboarding: crashReport, - logsOnboarding: logs(), + logsOnboarding: dotnetLogs(), }; export default docs; diff --git a/static/app/gettingStartedDocs/dotnet-gcpfunctions/index.tsx b/static/app/gettingStartedDocs/dotnet-gcpfunctions/index.tsx index 6a0b097c967057..c0b0a998cf224b 100644 --- a/static/app/gettingStartedDocs/dotnet-gcpfunctions/index.tsx +++ b/static/app/gettingStartedDocs/dotnet-gcpfunctions/index.tsx @@ -1,6 +1,6 @@ import type {Docs} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {feedback} from 'sentry/gettingStartedDocs/dotnet/feedback'; -import {logs} from 'sentry/gettingStartedDocs/dotnet/logs'; +import {dotnetLogs} from 'sentry/gettingStartedDocs/dotnet/logs'; import {crashReport} from './crashReport'; import {onboarding} from './onboarding'; @@ -9,7 +9,7 @@ const docs: Docs = { onboarding, feedbackOnboardingCrashApi: feedback, crashReportOnboarding: crashReport, - logsOnboarding: logs(), + logsOnboarding: dotnetLogs(), }; export default docs; diff --git a/static/app/gettingStartedDocs/dotnet-maui/index.tsx b/static/app/gettingStartedDocs/dotnet-maui/index.tsx index 6a0b097c967057..c0b0a998cf224b 100644 --- a/static/app/gettingStartedDocs/dotnet-maui/index.tsx +++ b/static/app/gettingStartedDocs/dotnet-maui/index.tsx @@ -1,6 +1,6 @@ import type {Docs} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {feedback} from 'sentry/gettingStartedDocs/dotnet/feedback'; -import {logs} from 'sentry/gettingStartedDocs/dotnet/logs'; +import {dotnetLogs} from 'sentry/gettingStartedDocs/dotnet/logs'; import {crashReport} from './crashReport'; import {onboarding} from './onboarding'; @@ -9,7 +9,7 @@ const docs: Docs = { onboarding, feedbackOnboardingCrashApi: feedback, crashReportOnboarding: crashReport, - logsOnboarding: logs(), + logsOnboarding: dotnetLogs(), }; export default docs; diff --git a/static/app/gettingStartedDocs/dotnet-winforms/index.tsx b/static/app/gettingStartedDocs/dotnet-winforms/index.tsx index 6a0b097c967057..c0b0a998cf224b 100644 --- a/static/app/gettingStartedDocs/dotnet-winforms/index.tsx +++ b/static/app/gettingStartedDocs/dotnet-winforms/index.tsx @@ -1,6 +1,6 @@ import type {Docs} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {feedback} from 'sentry/gettingStartedDocs/dotnet/feedback'; -import {logs} from 'sentry/gettingStartedDocs/dotnet/logs'; +import {dotnetLogs} from 'sentry/gettingStartedDocs/dotnet/logs'; import {crashReport} from './crashReport'; import {onboarding} from './onboarding'; @@ -9,7 +9,7 @@ const docs: Docs = { onboarding, feedbackOnboardingCrashApi: feedback, crashReportOnboarding: crashReport, - logsOnboarding: logs(), + logsOnboarding: dotnetLogs(), }; export default docs; diff --git a/static/app/gettingStartedDocs/dotnet-wpf/index.tsx b/static/app/gettingStartedDocs/dotnet-wpf/index.tsx index 6a0b097c967057..c0b0a998cf224b 100644 --- a/static/app/gettingStartedDocs/dotnet-wpf/index.tsx +++ b/static/app/gettingStartedDocs/dotnet-wpf/index.tsx @@ -1,6 +1,6 @@ import type {Docs} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {feedback} from 'sentry/gettingStartedDocs/dotnet/feedback'; -import {logs} from 'sentry/gettingStartedDocs/dotnet/logs'; +import {dotnetLogs} from 'sentry/gettingStartedDocs/dotnet/logs'; import {crashReport} from './crashReport'; import {onboarding} from './onboarding'; @@ -9,7 +9,7 @@ const docs: Docs = { onboarding, feedbackOnboardingCrashApi: feedback, crashReportOnboarding: crashReport, - logsOnboarding: logs(), + logsOnboarding: dotnetLogs(), }; export default docs; diff --git a/static/app/gettingStartedDocs/dotnet-xamarin/index.tsx b/static/app/gettingStartedDocs/dotnet-xamarin/index.tsx index 6a0b097c967057..c0b0a998cf224b 100644 --- a/static/app/gettingStartedDocs/dotnet-xamarin/index.tsx +++ b/static/app/gettingStartedDocs/dotnet-xamarin/index.tsx @@ -1,6 +1,6 @@ import type {Docs} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {feedback} from 'sentry/gettingStartedDocs/dotnet/feedback'; -import {logs} from 'sentry/gettingStartedDocs/dotnet/logs'; +import {dotnetLogs} from 'sentry/gettingStartedDocs/dotnet/logs'; import {crashReport} from './crashReport'; import {onboarding} from './onboarding'; @@ -9,7 +9,7 @@ const docs: Docs = { onboarding, feedbackOnboardingCrashApi: feedback, crashReportOnboarding: crashReport, - logsOnboarding: logs(), + logsOnboarding: dotnetLogs(), }; export default docs; diff --git a/static/app/gettingStartedDocs/dotnet/index.tsx b/static/app/gettingStartedDocs/dotnet/index.tsx index 875387288701fb..93cddb7d29e984 100644 --- a/static/app/gettingStartedDocs/dotnet/index.tsx +++ b/static/app/gettingStartedDocs/dotnet/index.tsx @@ -1,5 +1,5 @@ import type {Docs} from 'sentry/components/onboarding/gettingStartedDoc/types'; -import {logs} from 'sentry/gettingStartedDocs/dotnet/logs'; +import {dotnetLogs} from 'sentry/gettingStartedDocs/dotnet/logs'; import {crashReport} from './crashReport'; import {feedback} from './feedback'; @@ -11,7 +11,7 @@ const docs: Docs = { feedbackOnboardingCrashApi: feedback, crashReportOnboarding: crashReport, profilingOnboarding: profiling, - logsOnboarding: logs(), + logsOnboarding: dotnetLogs(), }; export default docs; diff --git a/static/app/gettingStartedDocs/dotnet/logs.spec.tsx b/static/app/gettingStartedDocs/dotnet/logs.spec.tsx index 26b230dccc9f1d..5d6d058d57ac72 100644 --- a/static/app/gettingStartedDocs/dotnet/logs.spec.tsx +++ b/static/app/gettingStartedDocs/dotnet/logs.spec.tsx @@ -1,5 +1,5 @@ // Only import and test functions that don't have circular dependencies -const {logs} = jest.requireActual('sentry/gettingStartedDocs/dotnet/logs'); +const {dotnetLogs} = jest.requireActual('sentry/gettingStartedDocs/dotnet/logs'); describe('logs', () => { const mockParams = { @@ -12,7 +12,7 @@ describe('logs', () => { }; it('generates logs onboarding config with default parameters', () => { - const result = logs(); + const result = dotnetLogs(); // Test install step const installSteps = result.install(mockParams); diff --git a/static/app/gettingStartedDocs/dotnet/logs.tsx b/static/app/gettingStartedDocs/dotnet/logs.tsx index e9ed1cf3c7b98f..fe71ef0220f063 100644 --- a/static/app/gettingStartedDocs/dotnet/logs.tsx +++ b/static/app/gettingStartedDocs/dotnet/logs.tsx @@ -28,7 +28,7 @@ SentrySdk.Logger.LogError("A {0} log message", "formatted");`, ], }); -export const logs = (): OnboardingConfig => ({ +export const dotnetLogs = (): OnboardingConfig => ({ install: params => [ { type: StepType.INSTALL, From da5d27efff2c67b5865fb95fc0f5bd60d1ef8007 Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Tue, 20 Jan 2026 10:00:58 +0100 Subject: [PATCH 08/24] add metricsVerify to plain dotnet onboarding --- static/app/gettingStartedDocs/dotnet/onboarding.spec.tsx | 7 ++++++- static/app/gettingStartedDocs/dotnet/onboarding.tsx | 9 +++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/static/app/gettingStartedDocs/dotnet/onboarding.spec.tsx b/static/app/gettingStartedDocs/dotnet/onboarding.spec.tsx index 50151073b5fb3b..9c838c9d192c56 100644 --- a/static/app/gettingStartedDocs/dotnet/onboarding.spec.tsx +++ b/static/app/gettingStartedDocs/dotnet/onboarding.spec.tsx @@ -14,7 +14,11 @@ describe('dotnet onboarding docs', () => { version: '1.99.9', }, }, - selectedProducts: [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], + selectedProducts: [ + ProductSolution.PERFORMANCE_MONITORING, + ProductSolution.LOGS, + ProductSolution.METRICS, + ], }); // Renders main headings @@ -23,6 +27,7 @@ describe('dotnet onboarding docs', () => { expect(screen.getByRole('heading', {name: 'Verify'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Tracing'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Verify Logs'})).toBeInTheDocument(); + expect(screen.getByRole('heading', {name: 'Verify Metrics'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Samples'})).toBeInTheDocument(); // Renders SDK version from registry diff --git a/static/app/gettingStartedDocs/dotnet/onboarding.tsx b/static/app/gettingStartedDocs/dotnet/onboarding.tsx index 8b02d23cec8682..1d954927156271 100644 --- a/static/app/gettingStartedDocs/dotnet/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet/onboarding.tsx @@ -6,6 +6,7 @@ import type { } from 'sentry/components/onboarding/gettingStartedDoc/types'; import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {logsVerify} from 'sentry/gettingStartedDocs/dotnet/logs'; +import {metricsVerify} from 'sentry/gettingStartedDocs/dotnet/metrics'; import {t, tct} from 'sentry/locale'; import {getPackageVersion} from 'sentry/utils/gettingStartedDocs/getPackageVersion'; @@ -270,6 +271,14 @@ export const onboarding: OnboardingConfig = { }, ] : []), + ...(params.isMetricsSelected + ? [ + { + title: t('Verify Metrics'), + content: [metricsVerify(params)], + }, + ] + : []), { title: t('Samples'), content: [ From 87167ed89237fb10b24b32f70ee86c62c3ebf818 Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Tue, 20 Jan 2026 10:04:39 +0100 Subject: [PATCH 09/24] remove whitespace --- static/app/gettingStartedDocs/dotnet/utils.tsx | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/static/app/gettingStartedDocs/dotnet/utils.tsx b/static/app/gettingStartedDocs/dotnet/utils.tsx index d32e27c0b697b3..309afd7d8e4bde 100644 --- a/static/app/gettingStartedDocs/dotnet/utils.tsx +++ b/static/app/gettingStartedDocs/dotnet/utils.tsx @@ -10,11 +10,7 @@ export const getInstallSnippetPackageManager = (params: DocsParams) => { } return ` - Install-Package Sentry -Version ${getPackageVersion( - params, - 'sentry.dotnet', - version - )}`; +Install-Package Sentry -Version ${getPackageVersion(params, 'sentry.dotnet', version)}`; }; export const getInstallSnippetCoreCli = (params: DocsParams) => { @@ -26,5 +22,5 @@ export const getInstallSnippetCoreCli = (params: DocsParams) => { } return ` - dotnet add package Sentry -v ${getPackageVersion(params, 'sentry.dotnet', version)}`; +dotnet add package Sentry -v ${getPackageVersion(params, 'sentry.dotnet', version)}`; }; From afdf99a3af6c52354240af8be611f478d19fd444 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20P=C3=B6lz?= <38893694+Flash0ver@users.noreply.github.com> Date: Wed, 4 Feb 2026 19:03:33 +0100 Subject: [PATCH 10/24] merge --- static/app/gettingStartedDocs/dotnet/onboarding.tsx | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/static/app/gettingStartedDocs/dotnet/onboarding.tsx b/static/app/gettingStartedDocs/dotnet/onboarding.tsx index bc76da6fdf974a..f87a9b40f91dcd 100644 --- a/static/app/gettingStartedDocs/dotnet/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet/onboarding.tsx @@ -7,6 +7,7 @@ import type { } from 'sentry/components/onboarding/gettingStartedDoc/types'; import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {logsVerify} from 'sentry/gettingStartedDocs/dotnet/logs'; +import {metricsVerify} from 'sentry/gettingStartedDocs/dotnet/metrics'; import {t, tct} from 'sentry/locale'; import {getPackageVersion} from 'sentry/utils/gettingStartedDocs/getPackageVersion'; @@ -271,6 +272,14 @@ export const onboarding: OnboardingConfig = { }, ] : []), + ...(params.isMetricsSelected + ? [ + { + title: t('Verify Metrics'), + content: [metricsVerify(params)], + }, + ] + : []), { title: t('Samples'), content: [ From 21ac46a06278d4940410304b53d172fe3f5e7a22 Mon Sep 17 00:00:00 2001 From: "getsantry[bot]" <66042841+getsantry[bot]@users.noreply.github.com> Date: Wed, 4 Feb 2026 18:05:22 +0000 Subject: [PATCH 11/24] :hammer_and_wrench: apply pre-commit fixes --- static/app/components/onboarding/productSelection.tsx | 11 ++++++----- .../gettingStartedDocs/dotnet-aspnet/onboarding.tsx | 3 ++- .../dotnet-aspnetcore/onboarding.tsx | 3 ++- .../dotnet-awslambda/onboarding.tsx | 3 ++- .../dotnet-gcpfunctions/onboarding.tsx | 3 ++- .../app/gettingStartedDocs/dotnet-maui/onboarding.tsx | 3 ++- .../gettingStartedDocs/dotnet-winforms/onboarding.tsx | 3 ++- .../app/gettingStartedDocs/dotnet-wpf/onboarding.tsx | 3 ++- static/app/gettingStartedDocs/dotnet/metrics.tsx | 3 ++- 9 files changed, 22 insertions(+), 13 deletions(-) diff --git a/static/app/components/onboarding/productSelection.tsx b/static/app/components/onboarding/productSelection.tsx index 3b88e079e598a3..a70aae8773754e 100644 --- a/static/app/components/onboarding/productSelection.tsx +++ b/static/app/components/onboarding/productSelection.tsx @@ -2,13 +2,14 @@ import type {ReactNode} from 'react'; import {useCallback, useEffect, useEffectEvent, useMemo} from 'react'; import styled from '@emotion/styled'; +import {Button} from '@sentry/scraps/button'; +import {Checkbox} from '@sentry/scraps/checkbox'; +import {Flex, Stack} from '@sentry/scraps/layout'; +import {ExternalLink} from '@sentry/scraps/link'; +import {Tooltip} from '@sentry/scraps/tooltip'; + import {openModal} from 'sentry/actionCreators/modal'; import {FeatureDisabledModal} from 'sentry/components/acl/featureDisabledModal'; -import {Button} from 'sentry/components/core/button'; -import {Checkbox} from 'sentry/components/core/checkbox'; -import {Flex, Stack} from 'sentry/components/core/layout'; -import {ExternalLink} from 'sentry/components/core/link'; -import {Tooltip} from 'sentry/components/core/tooltip'; import {ProductSolution} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {IconQuestion} from 'sentry/icons'; import {t, tct} from 'sentry/locale'; diff --git a/static/app/gettingStartedDocs/dotnet-aspnet/onboarding.tsx b/static/app/gettingStartedDocs/dotnet-aspnet/onboarding.tsx index c6b145f9521bba..cb71b06eeff95c 100644 --- a/static/app/gettingStartedDocs/dotnet-aspnet/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet-aspnet/onboarding.tsx @@ -1,4 +1,5 @@ -import {ExternalLink} from 'sentry/components/core/link'; +import {ExternalLink} from '@sentry/scraps/link'; + import type { DocsParams, OnboardingConfig, diff --git a/static/app/gettingStartedDocs/dotnet-aspnetcore/onboarding.tsx b/static/app/gettingStartedDocs/dotnet-aspnetcore/onboarding.tsx index cc8cfcc3b0586d..678b6fe7414b45 100644 --- a/static/app/gettingStartedDocs/dotnet-aspnetcore/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet-aspnetcore/onboarding.tsx @@ -1,4 +1,5 @@ -import {ExternalLink} from 'sentry/components/core/link'; +import {ExternalLink} from '@sentry/scraps/link'; + import type { DocsParams, OnboardingConfig, diff --git a/static/app/gettingStartedDocs/dotnet-awslambda/onboarding.tsx b/static/app/gettingStartedDocs/dotnet-awslambda/onboarding.tsx index 375927779b7ed0..c76a1e73ebf505 100644 --- a/static/app/gettingStartedDocs/dotnet-awslambda/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet-awslambda/onboarding.tsx @@ -1,4 +1,5 @@ -import {ExternalLink} from 'sentry/components/core/link'; +import {ExternalLink} from '@sentry/scraps/link'; + import type { DocsParams, OnboardingConfig, diff --git a/static/app/gettingStartedDocs/dotnet-gcpfunctions/onboarding.tsx b/static/app/gettingStartedDocs/dotnet-gcpfunctions/onboarding.tsx index dda381d717a9d5..ca0c106441a585 100644 --- a/static/app/gettingStartedDocs/dotnet-gcpfunctions/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet-gcpfunctions/onboarding.tsx @@ -1,4 +1,5 @@ -import {ExternalLink} from 'sentry/components/core/link'; +import {ExternalLink} from '@sentry/scraps/link'; + import type { DocsParams, OnboardingConfig, diff --git a/static/app/gettingStartedDocs/dotnet-maui/onboarding.tsx b/static/app/gettingStartedDocs/dotnet-maui/onboarding.tsx index d3d517e852a19a..1c99a2f2eb5376 100644 --- a/static/app/gettingStartedDocs/dotnet-maui/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet-maui/onboarding.tsx @@ -1,4 +1,5 @@ -import {ExternalLink} from 'sentry/components/core/link'; +import {ExternalLink} from '@sentry/scraps/link'; + import type { DocsParams, OnboardingConfig, diff --git a/static/app/gettingStartedDocs/dotnet-winforms/onboarding.tsx b/static/app/gettingStartedDocs/dotnet-winforms/onboarding.tsx index 20ec62ac094dc3..cb7525e489ade1 100644 --- a/static/app/gettingStartedDocs/dotnet-winforms/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet-winforms/onboarding.tsx @@ -1,4 +1,5 @@ -import {ExternalLink} from 'sentry/components/core/link'; +import {ExternalLink} from '@sentry/scraps/link'; + import type { DocsParams, OnboardingConfig, diff --git a/static/app/gettingStartedDocs/dotnet-wpf/onboarding.tsx b/static/app/gettingStartedDocs/dotnet-wpf/onboarding.tsx index 03951463feaa39..52e99f7e867a02 100644 --- a/static/app/gettingStartedDocs/dotnet-wpf/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet-wpf/onboarding.tsx @@ -1,4 +1,5 @@ -import {ExternalLink} from 'sentry/components/core/link'; +import {ExternalLink} from '@sentry/scraps/link'; + import type { DocsParams, OnboardingConfig, diff --git a/static/app/gettingStartedDocs/dotnet/metrics.tsx b/static/app/gettingStartedDocs/dotnet/metrics.tsx index bacbf8c344097d..befe5825ae3354 100644 --- a/static/app/gettingStartedDocs/dotnet/metrics.tsx +++ b/static/app/gettingStartedDocs/dotnet/metrics.tsx @@ -1,4 +1,5 @@ -import {ExternalLink} from 'sentry/components/core/link'; +import {ExternalLink} from '@sentry/scraps/link'; + import { type ContentBlock, type DocsParams, From 4374845551a4f97813f61415712d14bc607ec8db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20P=C3=B6lz?= <38893694+Flash0ver@users.noreply.github.com> Date: Wed, 4 Feb 2026 19:19:23 +0100 Subject: [PATCH 12/24] fix merge mistake --- .../onboarding/productSelection.tsx | 88 ++++++++++++++++--- 1 file changed, 75 insertions(+), 13 deletions(-) diff --git a/static/app/components/onboarding/productSelection.tsx b/static/app/components/onboarding/productSelection.tsx index a70aae8773754e..61329c7e5128a0 100644 --- a/static/app/components/onboarding/productSelection.tsx +++ b/static/app/components/onboarding/productSelection.tsx @@ -141,20 +141,78 @@ export const platformProductAvailability = { ], dart: [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], kotlin: [ProductSolution.PERFORMANCE_MONITORING], - go: [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], - 'go-echo': [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], - 'go-fasthttp': [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], - 'go-fiber': [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], - 'go-gin': [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], - 'go-http': [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], - 'go-iris': [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], - 'go-negroni': [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], + go: [ + ProductSolution.PERFORMANCE_MONITORING, + ProductSolution.LOGS, + ProductSolution.METRICS, + ], + 'go-echo': [ + ProductSolution.PERFORMANCE_MONITORING, + ProductSolution.LOGS, + ProductSolution.METRICS, + ], + 'go-fasthttp': [ + ProductSolution.PERFORMANCE_MONITORING, + ProductSolution.LOGS, + ProductSolution.METRICS, + ], + 'go-fiber': [ + ProductSolution.PERFORMANCE_MONITORING, + ProductSolution.LOGS, + ProductSolution.METRICS, + ], + 'go-gin': [ + ProductSolution.PERFORMANCE_MONITORING, + ProductSolution.LOGS, + ProductSolution.METRICS, + ], + 'go-http': [ + ProductSolution.PERFORMANCE_MONITORING, + ProductSolution.LOGS, + ProductSolution.METRICS, + ], + 'go-iris': [ + ProductSolution.PERFORMANCE_MONITORING, + ProductSolution.LOGS, + ProductSolution.METRICS, + ], + 'go-negroni': [ + ProductSolution.PERFORMANCE_MONITORING, + ProductSolution.LOGS, + ProductSolution.METRICS, + ], + godot: [ProductSolution.LOGS], ionic: [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.SESSION_REPLAY], - java: [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], - 'java-log4j2': [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], - 'java-logback': [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], - 'java-spring': [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], - 'java-spring-boot': [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], + java: [ + ProductSolution.PERFORMANCE_MONITORING, + ProductSolution.LOGS, + ProductSolution.METRICS, + ProductSolution.PROFILING, + ], + 'java-log4j2': [ + ProductSolution.PERFORMANCE_MONITORING, + ProductSolution.LOGS, + ProductSolution.METRICS, + ProductSolution.PROFILING, + ], + 'java-logback': [ + ProductSolution.PERFORMANCE_MONITORING, + ProductSolution.LOGS, + ProductSolution.METRICS, + ProductSolution.PROFILING, + ], + 'java-spring': [ + ProductSolution.PERFORMANCE_MONITORING, + ProductSolution.LOGS, + ProductSolution.METRICS, + ProductSolution.PROFILING, + ], + 'java-spring-boot': [ + ProductSolution.PERFORMANCE_MONITORING, + ProductSolution.LOGS, + ProductSolution.METRICS, + ProductSolution.PROFILING, + ], javascript: [ ProductSolution.PERFORMANCE_MONITORING, ProductSolution.SESSION_REPLAY, @@ -218,6 +276,7 @@ export const platformProductAvailability = { ProductSolution.LOGS, ProductSolution.METRICS, ], + native: [ProductSolution.LOGS], node: [ ProductSolution.PERFORMANCE_MONITORING, ProductSolution.PROFILING, @@ -308,6 +367,7 @@ export const platformProductAvailability = { 'php-symfony': [ ProductSolution.PERFORMANCE_MONITORING, ProductSolution.PROFILING, + ProductSolution.LOGS, ProductSolution.METRICS, ], python: [ @@ -433,6 +493,8 @@ export const platformProductAvailability = { ProductSolution.PROFILING, ProductSolution.LOGS, ], + unity: [ProductSolution.LOGS], + unreal: [ProductSolution.LOGS], } as Record; type ProductProps = { From c6af5d0fa4059742ab56b140c7a8f23c70fa817a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20P=C3=B6lz?= <38893694+Flash0ver@users.noreply.github.com> Date: Wed, 4 Feb 2026 19:54:57 +0100 Subject: [PATCH 13/24] fix(onboarding): Xamarin does not support Trace-connected Metrics --- static/app/components/onboarding/productSelection.tsx | 6 +----- static/app/data/platformCategories.tsx | 3 +-- .../gettingStartedDocs/dotnet-xamarin/onboarding.spec.tsx | 7 +------ 3 files changed, 3 insertions(+), 13 deletions(-) diff --git a/static/app/components/onboarding/productSelection.tsx b/static/app/components/onboarding/productSelection.tsx index 61329c7e5128a0..c3f0bc9fead891 100644 --- a/static/app/components/onboarding/productSelection.tsx +++ b/static/app/components/onboarding/productSelection.tsx @@ -134,11 +134,7 @@ export const platformProductAvailability = { ProductSolution.LOGS, ProductSolution.METRICS, ], - 'dotnet-xamarin': [ - ProductSolution.PERFORMANCE_MONITORING, - ProductSolution.LOGS, - ProductSolution.METRICS, - ], + 'dotnet-xamarin': [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], dart: [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], kotlin: [ProductSolution.PERFORMANCE_MONITORING], go: [ diff --git a/static/app/data/platformCategories.tsx b/static/app/data/platformCategories.tsx index d1d7a9ebd9f874..3d4e30ea7b7aee 100644 --- a/static/app/data/platformCategories.tsx +++ b/static/app/data/platformCategories.tsx @@ -412,7 +412,6 @@ export const withMetricsOnboarding: Set = new Set([ 'dotnet-maui', 'dotnet-winforms', 'dotnet-wpf', - 'dotnet-xamarin', 'go', 'go-echo', 'go-fasthttp', @@ -485,7 +484,7 @@ export const withMetricsOnboarding: Set = new Set([ ]); // List of platforms that do not have metrics support. We make use of this list in the product to not provide any Metrics -export const withoutMetricsSupport: Set = new Set([]); +export const withoutMetricsSupport: Set = new Set(['dotnet-xamarin']); export const limitedMetricsSupportPrefixes: Set = new Set([ 'android', diff --git a/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.spec.tsx b/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.spec.tsx index 1e5bf8ca35cc0f..4eabe228cfb584 100644 --- a/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.spec.tsx +++ b/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.spec.tsx @@ -14,11 +14,7 @@ describe('xamarin onboarding docs', () => { version: '1.99.9', }, }, - selectedProducts: [ - ProductSolution.PERFORMANCE_MONITORING, - ProductSolution.LOGS, - ProductSolution.METRICS, - ], + selectedProducts: [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], }); // Renders main headings @@ -29,7 +25,6 @@ describe('xamarin onboarding docs', () => { expect(screen.getByRole('heading', {name: 'Documentation'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Limitations'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Verify Logs'})).toBeInTheDocument(); - expect(screen.getByRole('heading', {name: 'Verify Metrics'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Samples'})).toBeInTheDocument(); // Renders SDK version from registry From 449e0f2d68e20121e4f82ee70514f59282bcdcb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20P=C3=B6lz?= <38893694+Flash0ver@users.noreply.github.com> Date: Thu, 5 Feb 2026 13:35:37 +0100 Subject: [PATCH 14/24] fix: link to .NET metrics docs --- static/app/gettingStartedDocs/dotnet/metrics.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/app/gettingStartedDocs/dotnet/metrics.tsx b/static/app/gettingStartedDocs/dotnet/metrics.tsx index befe5825ae3354..c0d72e07b58c2b 100644 --- a/static/app/gettingStartedDocs/dotnet/metrics.tsx +++ b/static/app/gettingStartedDocs/dotnet/metrics.tsx @@ -34,7 +34,7 @@ SentrySdk.Experimental.Metrics.EmitGauge("page_load", 15.0, SentryUnits.Duration type: 'text', text: tct('For more detailed information, see the [link:metrics documentation].', { link: ( - + ), }), }, From 25da527a82f7a455d74d323510270273cf63c081 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20P=C3=B6lz?= <38893694+Flash0ver@users.noreply.github.com> Date: Thu, 5 Feb 2026 13:39:07 +0100 Subject: [PATCH 15/24] fix: language of C# code snippet --- static/app/gettingStartedDocs/dotnet/metrics.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/app/gettingStartedDocs/dotnet/metrics.tsx b/static/app/gettingStartedDocs/dotnet/metrics.tsx index c0d72e07b58c2b..6eb575e1166605 100644 --- a/static/app/gettingStartedDocs/dotnet/metrics.tsx +++ b/static/app/gettingStartedDocs/dotnet/metrics.tsx @@ -19,7 +19,7 @@ export const metricsVerify = (params: DocsParams): ContentBlock => ({ }, { type: 'code', - language: 'dotnet', + language: 'csharp', code: `using Sentry; SentrySdk.Experimental.Metrics.EmitCounter("button_click", 5, From 0305cb9856f2a05955e2a31862f536ff0554d47e Mon Sep 17 00:00:00 2001 From: "getsantry[bot]" <66042841+getsantry[bot]@users.noreply.github.com> Date: Thu, 5 Feb 2026 12:40:59 +0000 Subject: [PATCH 16/24] :hammer_and_wrench: apply pre-commit fixes --- static/app/gettingStartedDocs/dotnet/metrics.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/static/app/gettingStartedDocs/dotnet/metrics.tsx b/static/app/gettingStartedDocs/dotnet/metrics.tsx index 6eb575e1166605..bf088487f80199 100644 --- a/static/app/gettingStartedDocs/dotnet/metrics.tsx +++ b/static/app/gettingStartedDocs/dotnet/metrics.tsx @@ -33,9 +33,7 @@ SentrySdk.Experimental.Metrics.EmitGauge("page_load", 15.0, SentryUnits.Duration { type: 'text', text: tct('For more detailed information, see the [link:metrics documentation].', { - link: ( - - ), + link: , }), }, ], From 18d157e2f2775698ecf5a33cbb260d1512a6a367 Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Fri, 6 Feb 2026 09:51:59 +0100 Subject: [PATCH 17/24] add dotnet to limitedMetricsSupportPrefixes --- static/app/data/platformCategories.tsx | 1 + static/app/gettingStartedDocs/dotnet/metrics.tsx | 7 +++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/static/app/data/platformCategories.tsx b/static/app/data/platformCategories.tsx index 3d4e30ea7b7aee..93be2702c79bba 100644 --- a/static/app/data/platformCategories.tsx +++ b/static/app/data/platformCategories.tsx @@ -491,6 +491,7 @@ export const limitedMetricsSupportPrefixes: Set = new Set([ 'apple', 'bun', 'dart', + 'dotnet', 'electron', 'go', 'java', diff --git a/static/app/gettingStartedDocs/dotnet/metrics.tsx b/static/app/gettingStartedDocs/dotnet/metrics.tsx index bf088487f80199..176d2d5bda1090 100644 --- a/static/app/gettingStartedDocs/dotnet/metrics.tsx +++ b/static/app/gettingStartedDocs/dotnet/metrics.tsx @@ -4,7 +4,7 @@ import { type ContentBlock, type DocsParams, } from 'sentry/components/onboarding/gettingStartedDoc/types'; -import {tct} from 'sentry/locale'; +import {t} from 'sentry/locale'; export const metricsVerify = (params: DocsParams): ContentBlock => ({ type: 'conditional', @@ -12,9 +12,8 @@ export const metricsVerify = (params: DocsParams): ContentBlock => ({ content: [ { type: 'text', - text: tct( - 'Send test metrics from your app to verify metrics are arriving in Sentry.', - {code: } + text: t( + 'Send test metrics from your app to verify metrics are arriving in Sentry.' ), }, { From 784ec5aee16e5ff8ad4722fbcf3a1f2f787fbe63 Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Fri, 6 Feb 2026 09:57:22 +0100 Subject: [PATCH 18/24] add missing import --- static/app/gettingStartedDocs/dotnet/metrics.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/app/gettingStartedDocs/dotnet/metrics.tsx b/static/app/gettingStartedDocs/dotnet/metrics.tsx index 176d2d5bda1090..957cde5b252b46 100644 --- a/static/app/gettingStartedDocs/dotnet/metrics.tsx +++ b/static/app/gettingStartedDocs/dotnet/metrics.tsx @@ -4,7 +4,7 @@ import { type ContentBlock, type DocsParams, } from 'sentry/components/onboarding/gettingStartedDoc/types'; -import {t} from 'sentry/locale'; +import {t, tct} from 'sentry/locale'; export const metricsVerify = (params: DocsParams): ContentBlock => ({ type: 'conditional', From d6ee5f9f92419b735d293981f320c3a6ce7ed700 Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Fri, 6 Feb 2026 10:20:18 +0100 Subject: [PATCH 19/24] move logs and metrics to verify section --- .../components/onboarding/productSelection.tsx | 6 +++++- .../dotnet-aspnet/onboarding.tsx | 18 ++---------------- .../dotnet-aspnetcore/onboarding.tsx | 18 ++---------------- .../dotnet-awslambda/onboarding.tsx | 18 ++---------------- .../dotnet-gcpfunctions/onboarding.tsx | 18 ++---------------- .../dotnet-maui/onboarding.tsx | 18 ++---------------- .../dotnet-winforms/onboarding.tsx | 18 ++---------------- .../dotnet-wpf/onboarding.tsx | 18 ++---------------- .../dotnet-xamarin/onboarding.tsx | 11 +++-------- .../gettingStartedDocs/dotnet/onboarding.tsx | 18 ++---------------- 10 files changed, 24 insertions(+), 137 deletions(-) diff --git a/static/app/components/onboarding/productSelection.tsx b/static/app/components/onboarding/productSelection.tsx index c3f0bc9fead891..61329c7e5128a0 100644 --- a/static/app/components/onboarding/productSelection.tsx +++ b/static/app/components/onboarding/productSelection.tsx @@ -134,7 +134,11 @@ export const platformProductAvailability = { ProductSolution.LOGS, ProductSolution.METRICS, ], - 'dotnet-xamarin': [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], + 'dotnet-xamarin': [ + ProductSolution.PERFORMANCE_MONITORING, + ProductSolution.LOGS, + ProductSolution.METRICS, + ], dart: [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], kotlin: [ProductSolution.PERFORMANCE_MONITORING], go: [ diff --git a/static/app/gettingStartedDocs/dotnet-aspnet/onboarding.tsx b/static/app/gettingStartedDocs/dotnet-aspnet/onboarding.tsx index cb71b06eeff95c..a4f905c597e168 100644 --- a/static/app/gettingStartedDocs/dotnet-aspnet/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet-aspnet/onboarding.tsx @@ -160,24 +160,10 @@ export const onboarding: OnboardingConfig = { } ), }, + logsVerify(params), + metricsVerify(params), ], }, - ...(params.isLogsSelected - ? [ - { - title: t('Verify Logs'), - content: [logsVerify(params)], - }, - ] - : []), - ...(params.isMetricsSelected - ? [ - { - title: t('Verify Metrics'), - content: [metricsVerify(params)], - }, - ] - : []), { title: t('Samples'), content: [ diff --git a/static/app/gettingStartedDocs/dotnet-aspnetcore/onboarding.tsx b/static/app/gettingStartedDocs/dotnet-aspnetcore/onboarding.tsx index 678b6fe7414b45..b3c515e37a01d9 100644 --- a/static/app/gettingStartedDocs/dotnet-aspnetcore/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet-aspnetcore/onboarding.tsx @@ -155,6 +155,8 @@ export const onboarding: OnboardingConfig = { } ), }, + logsVerify(params), + metricsVerify(params), ], }, ...(params.isPerformanceSelected @@ -186,22 +188,6 @@ export const onboarding: OnboardingConfig = { }, ] satisfies OnboardingStep[]) : []), - ...(params.isLogsSelected - ? [ - { - title: t('Verify Logs'), - content: [logsVerify(params)], - }, - ] - : []), - ...(params.isMetricsSelected - ? [ - { - title: t('Verify Metrics'), - content: [metricsVerify(params)], - }, - ] - : []), { title: t('Samples'), content: [ diff --git a/static/app/gettingStartedDocs/dotnet-awslambda/onboarding.tsx b/static/app/gettingStartedDocs/dotnet-awslambda/onboarding.tsx index c76a1e73ebf505..36ca19d9ac9c08 100644 --- a/static/app/gettingStartedDocs/dotnet-awslambda/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet-awslambda/onboarding.tsx @@ -157,6 +157,8 @@ export const onboarding: OnboardingConfig = { language: 'shell', code: 'curl -X GET -I https://url.of.server.aws/api/bad', }, + logsVerify(params), + metricsVerify(params), { type: 'text', text: tct( @@ -170,21 +172,5 @@ export const onboarding: OnboardingConfig = { }, ], }, - ...(params.isLogsSelected - ? [ - { - title: t('Verify Logs'), - content: [logsVerify(params)], - }, - ] - : []), - ...(params.isMetricsSelected - ? [ - { - title: t('Verify Metrics'), - content: [metricsVerify(params)], - }, - ] - : []), ], }; diff --git a/static/app/gettingStartedDocs/dotnet-gcpfunctions/onboarding.tsx b/static/app/gettingStartedDocs/dotnet-gcpfunctions/onboarding.tsx index ca0c106441a585..df7eafe29e0845 100644 --- a/static/app/gettingStartedDocs/dotnet-gcpfunctions/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet-gcpfunctions/onboarding.tsx @@ -168,24 +168,10 @@ export const onboarding: OnboardingConfig = { language: 'csharp', code: getVerifySnippet(), }, + logsVerify(params), + metricsVerify(params), ], }, - ...(params.isLogsSelected - ? [ - { - title: t('Verify Logs'), - content: [logsVerify(params)], - }, - ] - : []), - ...(params.isMetricsSelected - ? [ - { - title: t('Verify Metrics'), - content: [metricsVerify(params)], - }, - ] - : []), { title: t('Samples'), content: [ diff --git a/static/app/gettingStartedDocs/dotnet-maui/onboarding.tsx b/static/app/gettingStartedDocs/dotnet-maui/onboarding.tsx index 1c99a2f2eb5376..76bf51aff57e3b 100644 --- a/static/app/gettingStartedDocs/dotnet-maui/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet-maui/onboarding.tsx @@ -151,6 +151,8 @@ export const onboarding: OnboardingConfig = { language: 'csharp', code: 'SentrySdk.CaptureMessage("Hello Sentry");', }, + logsVerify(params), + metricsVerify(params), ], }, ...(params.isPerformanceSelected @@ -213,22 +215,6 @@ export const onboarding: OnboardingConfig = { }, ] satisfies OnboardingStep[]) : []), - ...(params.isLogsSelected - ? [ - { - title: t('Verify Logs'), - content: [logsVerify(params)], - }, - ] - : []), - ...(params.isMetricsSelected - ? [ - { - title: t('Verify Metrics'), - content: [metricsVerify(params)], - }, - ] - : []), { title: t('Sample Application'), content: [ diff --git a/static/app/gettingStartedDocs/dotnet-winforms/onboarding.tsx b/static/app/gettingStartedDocs/dotnet-winforms/onboarding.tsx index cb7525e489ade1..8d2c79fa862b24 100644 --- a/static/app/gettingStartedDocs/dotnet-winforms/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet-winforms/onboarding.tsx @@ -137,6 +137,8 @@ export const onboarding: OnboardingConfig = { language: 'csharp', code: 'SentrySdk.CaptureMessage("Hello Sentry");', }, + logsVerify(params), + metricsVerify(params), ], }, ...(params.isPerformanceSelected @@ -186,22 +188,6 @@ export const onboarding: OnboardingConfig = { }, ] satisfies OnboardingStep[]) : []), - ...(params.isLogsSelected - ? [ - { - title: t('Verify Logs'), - content: [logsVerify(params)], - }, - ] - : []), - ...(params.isMetricsSelected - ? [ - { - title: t('Verify Metrics'), - content: [metricsVerify(params)], - }, - ] - : []), { title: t('Samples'), content: [ diff --git a/static/app/gettingStartedDocs/dotnet-wpf/onboarding.tsx b/static/app/gettingStartedDocs/dotnet-wpf/onboarding.tsx index 52e99f7e867a02..a9ee6d11776aad 100644 --- a/static/app/gettingStartedDocs/dotnet-wpf/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet-wpf/onboarding.tsx @@ -137,6 +137,8 @@ export const onboarding: OnboardingConfig = { language: 'csharp', code: 'SentrySdk.CaptureMessage("Hello Sentry");', }, + logsVerify(params), + metricsVerify(params), ], }, ...(params.isPerformanceSelected @@ -186,22 +188,6 @@ export const onboarding: OnboardingConfig = { }, ] satisfies OnboardingStep[]) : []), - ...(params.isLogsSelected - ? [ - { - title: t('Verify Logs'), - content: [logsVerify(params)], - }, - ] - : []), - ...(params.isMetricsSelected - ? [ - { - title: t('Verify Metrics'), - content: [metricsVerify(params)], - }, - ] - : []), { title: t('Samples'), content: [ diff --git a/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.tsx b/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.tsx index c8e2ca0b865d9d..9aab471add23c4 100644 --- a/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.tsx @@ -6,6 +6,7 @@ import type { } from 'sentry/components/onboarding/gettingStartedDoc/types'; import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {logsVerify} from 'sentry/gettingStartedDocs/dotnet/logs'; +import {metricsVerify} from 'sentry/gettingStartedDocs/dotnet/metrics'; import {t, tct} from 'sentry/locale'; import {getPackageVersion} from 'sentry/utils/gettingStartedDocs/getPackageVersion'; @@ -232,6 +233,8 @@ export const onboarding: OnboardingConfig = { 'You might need to open the app again for the crash report to be sent to the server.' ), }, + logsVerify(params), + metricsVerify(params), ], }, { @@ -261,14 +264,6 @@ export const onboarding: OnboardingConfig = { }, ], }, - ...(params.isLogsSelected - ? [ - { - title: t('Verify Logs'), - content: [logsVerify(params)], - }, - ] - : []), { title: t('Documentation'), content: [ diff --git a/static/app/gettingStartedDocs/dotnet/onboarding.tsx b/static/app/gettingStartedDocs/dotnet/onboarding.tsx index f87a9b40f91dcd..326a9e8092a155 100644 --- a/static/app/gettingStartedDocs/dotnet/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet/onboarding.tsx @@ -231,6 +231,8 @@ export const onboarding: OnboardingConfig = { language: 'csharp', code: 'SentrySdk.CaptureMessage("Something went wrong");', }, + logsVerify(params), + metricsVerify(params), ], }, ...(params.isPerformanceSelected @@ -264,22 +266,6 @@ export const onboarding: OnboardingConfig = { }, ] satisfies OnboardingStep[]) : []), - ...(params.isLogsSelected - ? [ - { - title: t('Verify Logs'), - content: [logsVerify(params)], - }, - ] - : []), - ...(params.isMetricsSelected - ? [ - { - title: t('Verify Metrics'), - content: [metricsVerify(params)], - }, - ] - : []), { title: t('Samples'), content: [ From 19468b7a9780d4fd8ebf8ce14951be5b6286a31d Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Fri, 6 Feb 2026 10:32:40 +0100 Subject: [PATCH 20/24] remove dotnet-xamarin metrics --- static/app/components/onboarding/productSelection.tsx | 6 +----- static/app/gettingStartedDocs/dotnet-xamarin/onboarding.tsx | 2 -- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/static/app/components/onboarding/productSelection.tsx b/static/app/components/onboarding/productSelection.tsx index 61329c7e5128a0..c3f0bc9fead891 100644 --- a/static/app/components/onboarding/productSelection.tsx +++ b/static/app/components/onboarding/productSelection.tsx @@ -134,11 +134,7 @@ export const platformProductAvailability = { ProductSolution.LOGS, ProductSolution.METRICS, ], - 'dotnet-xamarin': [ - ProductSolution.PERFORMANCE_MONITORING, - ProductSolution.LOGS, - ProductSolution.METRICS, - ], + 'dotnet-xamarin': [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], dart: [ProductSolution.PERFORMANCE_MONITORING, ProductSolution.LOGS], kotlin: [ProductSolution.PERFORMANCE_MONITORING], go: [ diff --git a/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.tsx b/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.tsx index 9aab471add23c4..df1f761e23c92b 100644 --- a/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.tsx @@ -6,7 +6,6 @@ import type { } from 'sentry/components/onboarding/gettingStartedDoc/types'; import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {logsVerify} from 'sentry/gettingStartedDocs/dotnet/logs'; -import {metricsVerify} from 'sentry/gettingStartedDocs/dotnet/metrics'; import {t, tct} from 'sentry/locale'; import {getPackageVersion} from 'sentry/utils/gettingStartedDocs/getPackageVersion'; @@ -234,7 +233,6 @@ export const onboarding: OnboardingConfig = { ), }, logsVerify(params), - metricsVerify(params), ], }, { From a4c29ad71e83173d596e49c11e3c8484e99dc8d9 Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Fri, 6 Feb 2026 10:35:06 +0100 Subject: [PATCH 21/24] fix tests --- static/app/gettingStartedDocs/dotnet-aspnet/onboarding.spec.tsx | 2 -- .../gettingStartedDocs/dotnet-aspnetcore/onboarding.spec.tsx | 2 -- .../app/gettingStartedDocs/dotnet-awslambda/onboarding.spec.tsx | 2 -- .../gettingStartedDocs/dotnet-gcpfunctions/onboarding.spec.tsx | 2 -- static/app/gettingStartedDocs/dotnet-maui/onboarding.spec.tsx | 2 -- .../app/gettingStartedDocs/dotnet-winforms/onboarding.spec.tsx | 2 -- static/app/gettingStartedDocs/dotnet-wpf/onboarding.spec.tsx | 2 -- .../app/gettingStartedDocs/dotnet-xamarin/onboarding.spec.tsx | 1 - 8 files changed, 15 deletions(-) diff --git a/static/app/gettingStartedDocs/dotnet-aspnet/onboarding.spec.tsx b/static/app/gettingStartedDocs/dotnet-aspnet/onboarding.spec.tsx index de05840e3244ee..c9974ea12cdb85 100644 --- a/static/app/gettingStartedDocs/dotnet-aspnet/onboarding.spec.tsx +++ b/static/app/gettingStartedDocs/dotnet-aspnet/onboarding.spec.tsx @@ -25,8 +25,6 @@ describe('aspnet onboarding docs', () => { expect(screen.getByRole('heading', {name: 'Install'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Configure SDK'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Documentation'})).toBeInTheDocument(); - expect(screen.getByRole('heading', {name: 'Verify Logs'})).toBeInTheDocument(); - expect(screen.getByRole('heading', {name: 'Verify Metrics'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Samples'})).toBeInTheDocument(); // Renders SDK version from registry diff --git a/static/app/gettingStartedDocs/dotnet-aspnetcore/onboarding.spec.tsx b/static/app/gettingStartedDocs/dotnet-aspnetcore/onboarding.spec.tsx index 282d8e66e090d0..c949c8553076fe 100644 --- a/static/app/gettingStartedDocs/dotnet-aspnetcore/onboarding.spec.tsx +++ b/static/app/gettingStartedDocs/dotnet-aspnetcore/onboarding.spec.tsx @@ -26,8 +26,6 @@ describe('aspnetcore onboarding docs', () => { expect(screen.getByRole('heading', {name: 'Configure SDK'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Verify'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Tracing'})).toBeInTheDocument(); - expect(screen.getByRole('heading', {name: 'Verify Logs'})).toBeInTheDocument(); - expect(screen.getByRole('heading', {name: 'Verify Metrics'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Samples'})).toBeInTheDocument(); // Renders SDK version from registry diff --git a/static/app/gettingStartedDocs/dotnet-awslambda/onboarding.spec.tsx b/static/app/gettingStartedDocs/dotnet-awslambda/onboarding.spec.tsx index 7d6fda10513303..48ee869bb08f7f 100644 --- a/static/app/gettingStartedDocs/dotnet-awslambda/onboarding.spec.tsx +++ b/static/app/gettingStartedDocs/dotnet-awslambda/onboarding.spec.tsx @@ -21,8 +21,6 @@ describe('awslambda onboarding docs', () => { expect(screen.getByRole('heading', {name: 'Install'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Configure SDK'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Verify'})).toBeInTheDocument(); - expect(screen.getByRole('heading', {name: 'Verify Logs'})).toBeInTheDocument(); - expect(screen.getByRole('heading', {name: 'Verify Metrics'})).toBeInTheDocument(); // Renders SDK version from registry expect( diff --git a/static/app/gettingStartedDocs/dotnet-gcpfunctions/onboarding.spec.tsx b/static/app/gettingStartedDocs/dotnet-gcpfunctions/onboarding.spec.tsx index cea09dcf1eb371..6a36d1f252353b 100644 --- a/static/app/gettingStartedDocs/dotnet-gcpfunctions/onboarding.spec.tsx +++ b/static/app/gettingStartedDocs/dotnet-gcpfunctions/onboarding.spec.tsx @@ -21,8 +21,6 @@ describe('gcpfunctions onboarding docs', () => { expect(screen.getByRole('heading', {name: 'Install'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Configure SDK'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Verify'})).toBeInTheDocument(); - expect(screen.getByRole('heading', {name: 'Verify Logs'})).toBeInTheDocument(); - expect(screen.getByRole('heading', {name: 'Verify Metrics'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Samples'})).toBeInTheDocument(); // Renders SDK version from registry diff --git a/static/app/gettingStartedDocs/dotnet-maui/onboarding.spec.tsx b/static/app/gettingStartedDocs/dotnet-maui/onboarding.spec.tsx index 1feaf764f0cda4..553f3ece15b7cf 100644 --- a/static/app/gettingStartedDocs/dotnet-maui/onboarding.spec.tsx +++ b/static/app/gettingStartedDocs/dotnet-maui/onboarding.spec.tsx @@ -26,8 +26,6 @@ describe('maui onboarding docs', () => { expect(screen.getByRole('heading', {name: 'Configure SDK'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Verify'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Tracing'})).toBeInTheDocument(); - expect(screen.getByRole('heading', {name: 'Verify Logs'})).toBeInTheDocument(); - expect(screen.getByRole('heading', {name: 'Verify Metrics'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Sample Application'})).toBeInTheDocument(); // Renders SDK version from registry diff --git a/static/app/gettingStartedDocs/dotnet-winforms/onboarding.spec.tsx b/static/app/gettingStartedDocs/dotnet-winforms/onboarding.spec.tsx index 06a20defeb4ad8..2249034a875c45 100644 --- a/static/app/gettingStartedDocs/dotnet-winforms/onboarding.spec.tsx +++ b/static/app/gettingStartedDocs/dotnet-winforms/onboarding.spec.tsx @@ -27,8 +27,6 @@ describe('winforms onboarding docs', () => { expect(screen.getByRole('heading', {name: 'Verify'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Tracing'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Documentation'})).toBeInTheDocument(); - expect(screen.getByRole('heading', {name: 'Verify Logs'})).toBeInTheDocument(); - expect(screen.getByRole('heading', {name: 'Verify Metrics'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Samples'})).toBeInTheDocument(); // Renders SDK version from registry diff --git a/static/app/gettingStartedDocs/dotnet-wpf/onboarding.spec.tsx b/static/app/gettingStartedDocs/dotnet-wpf/onboarding.spec.tsx index 946ac6db6d8c6b..90424f48428990 100644 --- a/static/app/gettingStartedDocs/dotnet-wpf/onboarding.spec.tsx +++ b/static/app/gettingStartedDocs/dotnet-wpf/onboarding.spec.tsx @@ -27,8 +27,6 @@ describe('wpf onboarding docs', () => { expect(screen.getByRole('heading', {name: 'Verify'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Tracing'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Documentation'})).toBeInTheDocument(); - expect(screen.getByRole('heading', {name: 'Verify Logs'})).toBeInTheDocument(); - expect(screen.getByRole('heading', {name: 'Verify Metrics'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Samples'})).toBeInTheDocument(); // Renders SDK version from registry diff --git a/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.spec.tsx b/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.spec.tsx index 4eabe228cfb584..402a7bd884c04e 100644 --- a/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.spec.tsx +++ b/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.spec.tsx @@ -24,7 +24,6 @@ describe('xamarin onboarding docs', () => { expect(screen.getByRole('heading', {name: 'Tracing'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Documentation'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Limitations'})).toBeInTheDocument(); - expect(screen.getByRole('heading', {name: 'Verify Logs'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Samples'})).toBeInTheDocument(); // Renders SDK version from registry From 1ed3c842fcb42bc87faf68602f2c76d1fe5cfd5f Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Fri, 6 Feb 2026 10:36:14 +0100 Subject: [PATCH 22/24] remove assertion from dotnet tests --- static/app/gettingStartedDocs/dotnet/onboarding.spec.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/static/app/gettingStartedDocs/dotnet/onboarding.spec.tsx b/static/app/gettingStartedDocs/dotnet/onboarding.spec.tsx index 9c838c9d192c56..26a7b39e2df5b1 100644 --- a/static/app/gettingStartedDocs/dotnet/onboarding.spec.tsx +++ b/static/app/gettingStartedDocs/dotnet/onboarding.spec.tsx @@ -26,8 +26,6 @@ describe('dotnet onboarding docs', () => { expect(screen.getByRole('heading', {name: 'Configure SDK'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Verify'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Tracing'})).toBeInTheDocument(); - expect(screen.getByRole('heading', {name: 'Verify Logs'})).toBeInTheDocument(); - expect(screen.getByRole('heading', {name: 'Verify Metrics'})).toBeInTheDocument(); expect(screen.getByRole('heading', {name: 'Samples'})).toBeInTheDocument(); // Renders SDK version from registry From fd888cf3aeff9a44214bb97a84041532aea647da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20P=C3=B6lz?= <38893694+Flash0ver@users.noreply.github.com> Date: Fri, 6 Feb 2026 12:32:24 +0100 Subject: [PATCH 23/24] fix merge error --- static/app/gettingStartedDocs/dotnet-xamarin/onboarding.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.tsx b/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.tsx index 9ff30eaa3b2135..75606d44dd5ff8 100644 --- a/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.tsx +++ b/static/app/gettingStartedDocs/dotnet-xamarin/onboarding.tsx @@ -213,7 +213,6 @@ export const onboarding: OnboardingConfig = { 'You might need to open the app again for the crash report to be sent to the server.' ), }, - logsVerify(params), ], }, { From 30179425227525483c6528c18101933786b017b1 Mon Sep 17 00:00:00 2001 From: Alex Alderman Webb Date: Tue, 10 Feb 2026 18:08:16 +0100 Subject: [PATCH 24/24] feat(onboarding): Metrics page for .NET platforms (#106552) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Stefan Pölz <38893694+Flash0ver@users.noreply.github.com> --- .../dotnet-aspnet/index.tsx | 2 + .../dotnet-aspnetcore/index.tsx | 2 + .../dotnet-awslambda/index.tsx | 2 + .../dotnet-gcpfunctions/index.tsx | 2 + .../gettingStartedDocs/dotnet-maui/index.tsx | 2 + .../dotnet-winforms/index.tsx | 2 + .../gettingStartedDocs/dotnet-wpf/index.tsx | 2 + .../app/gettingStartedDocs/dotnet/index.tsx | 2 + .../dotnet/metrics.spec.tsx | 33 +++++++ .../app/gettingStartedDocs/dotnet/metrics.tsx | 85 +++++++++++++++++++ .../app/gettingStartedDocs/dotnet/utils.tsx | 6 +- 11 files changed, 138 insertions(+), 2 deletions(-) create mode 100644 static/app/gettingStartedDocs/dotnet/metrics.spec.tsx 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')}`;