Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(.NET): Update migration guide for 4.x #9088

Merged
merged 9 commits into from
Feb 12, 2024
147 changes: 147 additions & 0 deletions docs/platforms/dotnet/migration/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,153 @@ sidebar_order: 8000

Upgrading includes both breaking changes and new features.

## Migrating to 4.x

### .NET Target Framework Changes

We're dropping support for some of the old target frameworks. See this [GitHub Discussion](https://github.com/getsentry/sentry-dotnet/discussions/2776) for details on why.

- Support for .NET Framework 4.6.1 has been replaced with 4.6.2 because 4.6.1 went out of support in 2022.
- Support for .NET Core 3.1 and .NET 5 has been dropped.
- Support for netstandard2.0 for Sentry.AspNetCore has been dropped.
- Support for .NET 6 on mobile (e.g: `net6.0-android`) has been replaced with .NET 7 .
<br/>Due to changes in .NET 8, it's no longer possible to maintain support for .NET 6 mobile-specific targets. As a result, we are transitioning mobile-specific TFMs from `net6.0-platform` to `net7.0-platform`. This means that mobile apps built on .NET 6 will now utilize the `Sentry` .NET 6 package, which provides .NET-only features without native/platform-specific bindings and SDKs. For more information, please refer to [this ticket](https://github.com/getsentry/sentry-dotnet/issues/2623).

- Support for MAUI Tizen has been dropped

### Sentry Self-Hosted Compatibility

If you're using `sentry.io` this change does not affect you.
This SDK version is compatible with a self-hosted version of Sentry `22.12.0` or higher. If you are using an older version of [self-hosted Sentry](https://develop.sentry.dev/self-hosted/) (aka on-premise), you will need to [upgrade](https://develop.sentry.dev/self-hosted/releases/).

### Significant Changes in Behavior

- Transaction names for ASP.NET Core are now consistently named `HTTP-VERB /path` (e.g. `GET /home`). Previously, the leading forward slash was missing for some endpoints.
- Setting `SentryOptions.Dsn` to `null` now throws `ArgumentNullException` during initialization.
- `CaptureFailedRequests` is now enabled by default.
- When `ImplicitUsings` is enabled, the `Sentry` namespace is automatically added to global usings. If you have conflicts, you can opt out by adding the following to your `csproj`:
```
<PropertyGroup>
<SentryImplicitUsings>false</SentryImplicitUsings>
</PropertyGroup>
```
- Transactions' spans are no longer automatically finished with the status `deadline_exceeded` by the transaction. This is now handled by [Relay](https://github.com/getsentry/relay).
- Customers self hosting Sentry must use version `22.12.0` or later
- The `User.IpAddress` is now set to `{{auto}}` by default, even when `sendDefaultPII` is disabled.
- To prevent sending IP addresses, use the "Prevent Storing of IP Addresses" option in the "Security & Privacy" project settings on sentry.io.
- The `DiagnosticLogger` signature for `LogWarning` now takes `exception` as the first parameter. This way, it no longer gets mixed up with `TArgs`.

### Breaking Changes

#### Changed APIs

- Class renamed from `Sentry.User` to `Sentry.SentryUser`.
- Class renamed from `Sentry.Runtime` to `Sentry.SentryRuntime`.
- Class renamed from `Sentry.Span` to `Sentry.SentrySpan`.
- Class renamed from `Sentry.Transaction` to `Sentry.SentryTransaction`.
- Class renamed from `Sentry.Constants` to `Sentry.SentryConstants`.
- Class renamed from `Sentry.Context` to `Sentry.SentryContext`.
- Class renamed from `Sentry.Package` to `Sentry.SentryPackage`.
- Class renamed from `Sentry.Request` to `Sentry.SentryRequest`.
- Class renamed from `Sentry.` to `Sentry.SentryTransaction`.
- Class renamed from `Sentry.Session` to `Sentry.SentrySession`.
- Class renamed from `Sentry.Attachment` to `Sentry.SentryAttachment`.
- Class renamed from `Sentry.Hint` to `Sentry.SentryHint`.
- Interface renamed from `Sentry.ISession` to `Sentry.SentryISession`.
- Interface renamed from `Sentry.IJsonSerializable` to `Sentry.SentryIJsonSerializable`.
- Interface renamed from `Sentry.ITransaction` to `Sentry.ITransactionTracer`.
- iOS and MacCatalyst platform-specific options renamed from `Cocoa` to `Native`.
- iOS and MacCatalyst platform-specific options from `iOS` to `Cocoa`.
- iOS platform-specific options renamed from `EnableCocoaSdkTracing` to `EnableTracing`.
- Android platform-specific options renamed from `Android` to `Native`.
- Android platform-specific options renamed from `EnableAndroidSdkTracing` and `EnableAndroidSdkBeforeSend` to `EnableTracing` and `EnableBeforeSend` respectively.
- `DebugImage` and `DebugMeta` moved to `Sentry.Protocol` namespace.
- `SentryClient.Dispose` is no longer obsolete.
- `ISentryClient.CaptureEvent` overloads have been replaced by a single method accepting optional `Hint` and `Scope` parameters. You will need to pass `hint` as a named parameter from code that calls `CaptureEvent` without passing a `scope` argument.
- `TransactionContext` and `SpanContext` constructors were updated and unified. If you're constructing instances of these classes, you will need to adjust the order in which you pass parameters to these.
```csharp
public TransactionContext(
string name,
string operation,
SpanId? spanId = null,
SpanId? parentSpanId = null,
SentryId? traceId = null,
string? description = "",
SpanStatus? status = null,
bool? isSampled = null,
bool? isParentSampled = null,
TransactionNameSource nameSource = TransactionNameSource.Custom
)
```
- The `DiagnosticLogger` signature for `LogError` and `LogFatal` now takes the `exception` as the first parameter. This way, it no longer gets mixed up with the `TArgs`. The `DiagnosticLogger` now also receives an overload for `LogError` and `LogFatal` that accepts a message only.
- `Distribution` added to `IEventLike`.
- `StackFrame`'s `ImageAddress`, `InstructionAddress`, and `FunctionId` changed to `long?`.
- `DebugImage.ImageAddress` changed to `long?`.
- Contexts now inherit from `IDictionary` rather than `ConcurrentDictionary`. The specific dictionary being used is an implementation detail.
- The method used to configure a Sentry Sink for Serilog now has an additional overload. Calling `WriteTo.Sentry()` with no arguments will no longer attempt to initialize the SDK (it has optional arguments to configure the behavior of the Sink only). If you want to initialize Sentry at the same time you configure the Sentry Sink, then you will need to use the overload of this method that accepts a DSN as the first parameter (for example, `WriteTo.Sentry("https://[email protected]:65535/2147483647")`).

#### Removed APIs

- `SentrySinkExtensions.ConfigureSentrySerilogOptions` is now internal only. If you were using this method, please use one of the `SentrySinkExtensions.Sentry` extension methods instead.
- A number of `[Obsolete]` options have been removed:
- `BeforeSend` - use `SetBeforeSend` instead.
- `BeforeSendTransaction` - use `SetBeforeSendTransaction` instead.
- `BeforeBreadcrumb` - use `SetBeforeBreadcrumb` instead.
- `CreateHttpClientHandler` - use `CreateHttpMessageHandler` instead.
- `ReportAssemblies` - use `ReportAssembliesMode` instead.
- `KeepAggregateException` - this property is no longer used and has no replacement.
- `DisableTaskUnobservedTaskExceptionCapture`- use `DisableUnobservedTaskExceptionCapture` instead.
- `DebugDiagnosticLogger` - use `TraceDiagnosticLogger` instead.
- A number of iOS/Android-specific `[Obsolete]` options have been removed:
- `Distribution` - use `SentryOptions.Distribution` instead.
- `EnableAutoPerformanceTracking` - use `SetBeforeSendTransaction` instead.
- `EnableCoreDataTracking` - use `EnableCoreDataTracing` instead.
- `EnableFileIOTracking` - use `EnableFileIOTracing` instead.
- `EnableOutOfMemoryTracking` - use `EnableWatchdogTerminationTracking` instead.
- `EnableUIViewControllerTracking` - use `EnableUIViewControllerTracing` instead.
- `StitchAsyncCode` - no longer available.
- `ProfilingTracesInterval` - no longer available.
- `ProfilingEnabled` - use `ProfilesSampleRate` instead.
- A number of obsolete types have been removed:
- `SystemClock` - use `SystemClock.Clock` instead.
- `Scope.GetSpan()` - use `Span` property instead.
- `IUserFactory` - use `ISentryUserFactory` instead.
- `SentryException.Data` - use `SentryException.Mechanism.Data` instead.
- `Runtime.Clone()` - this shouldn't have been public in the past and has no replacement.
- `AssemblyExtensions` - this shouldn't have been public in the past and has no replacement.
- `SentryDatabaseLogging.UseBreadcrumbs()` - it is called automatically and has no replacement.
- A number of interfaces have removed:
- `IHasMeasurements` - use `ISpanData` instead.
- `IHasBreadcrumbs` - use `IEventLike` instead.
- `ISpanContext` - use `ITraceContext` instead.
- `IHasTransactionNameSource` - use `ITransactionContext` instead.
- The unused `StackFrame.InstructionOffset` has been removed.
- The unused `Scope.Platform` property has been removed.
- The obsolete setter `Sentry.PlatformAbstractions.Runtime.Identifier` has been removed.
- `Sentry.Values<T>` is now internal as it is never exposed in the public API.
- The `TracePropagationTarget` class has been removed. Use the `SubstringOrRegexPattern` class instead.
- The `WithScope` and `WithScopeAsync` methods have been removed. We have discovered that these methods didn't work correctly in certain desktop contexts, especially when using a global scope.
<br/>Replace your usage of `WithScope` with overloads of `Capture*` methods:
- `SentrySdk.CaptureEvent(SentryEvent @event, Action<Scope> scopeCallback)`
- `SentrySdk.CaptureMessage(string message, Action<Scope> scopeCallback)`
- `SentrySdk.CaptureException(Exception exception, Action<Scope> scopeCallback)`

```c#
// Before
SentrySdk.WithScope(scope =>
{
scope.SetTag("key", "value");
SentrySdk.CaptureEvent(new SentryEvent());
});

// After
SentrySdk.CaptureEvent(new SentryEvent(), scope =>
{
// Configure your scope here
scope.SetTag("key", "value");
});
```

## Migrating to 3.12.0

### NuGet Changes
Expand Down
Loading