# Performance Metrics | Sentry for .NET for iOS, macOS, and Mac Catalyst

Sentry's SDKs support sending performance metrics data to Sentry. These are numeric values attached to transactions that are aggregated and displayed in Sentry.

## [Custom Measurements](https://docs.sentry.io/platforms/dotnet/guides/apple/tracing/instrumentation/performance-metrics.md#custom-measurements)

In addition to automatic performance metrics, the SDK supports setting [custom performance measurements](https://docs.sentry.io/product/insights/overview/metrics.md#custom-performance-measurements) on transactions. This allows you to define measurements that are important to your application and send them to Sentry.

To set a performance measurement, you need to supply the following:

* name (`string`)
* value (any numeric type - `float`, `integer`, etc.)
* unit (`string`, defaults to the string `none` if omitted)

Sentry supports adding arbitrary custom units, but we recommend using one of the [supported units listed below](https://docs.sentry.io/platforms/dotnet/guides/apple/tracing/instrumentation/performance-metrics.md#supported-measurement-units).

Adding custom measurements is supported in Sentry's .NET SDK, version `3.23.0` and above.

The following example shows how to set custom measurements on a `transaction`, including how obtain the current `span` and get its `transaction`. If you already have the `transaction` or `span`, you can use it directly.

```csharp
var span = SentrySdk.GetSpan();  // or hub.GetSpan()
if (span != null)
{
    var transaction = span.GetTransaction();

    // Record amount of memory used
    transaction.SetMeasurement("memory_used", 64, MeasurementUnit.Information.Megabyte);

    // Record time it took to load user profile
    transaction.SetMeasurement("user_profile_loading_time", 1.3, MeasurementUnit.Duration.Second);

    // Record number of times the screen was loaded
    transaction.SetMeasurement("screen_load_count", 4);
}
```

Currently, unit conversion is only supported once the data has already been stored. This means that, for example, `('myMeasurement', 60, 'second')` and `('myMeasurement', 3, 'minute')` would not be aggregated, but rather stored as two separate measurements. To avoid this, make sure to use a consistent unit when recording a custom measurement.

## [Supported Measurement Units](https://docs.sentry.io/platforms/dotnet/guides/apple/tracing/instrumentation/performance-metrics.md#supported-measurement-units)

Units augment measurement values by giving meaning to what otherwise might be abstract numbers. Adding units also allows Sentry to offer controls - unit conversions, filters, and so on - based on those units. For values that are unitless, you can supply an empty string or `none`.

### [Duration Units](https://docs.sentry.io/platforms/dotnet/guides/apple/tracing/instrumentation/performance-metrics.md#duration-units)

* `nanosecond`
* `microsecond`
* `millisecond`
* `second`
* `minute`
* `hour`
* `day`
* `week`

### [Information Units](https://docs.sentry.io/platforms/dotnet/guides/apple/tracing/instrumentation/performance-metrics.md#information-units)

* `bit`
* `byte`
* `kilobyte`
* `kibibyte`
* `megabyte`
* `mebibyte`
* `gigabyte`
* `gibibyte`
* `terabyte`
* `tebibyte`
* `petabyte`
* `pebibyte`
* `exabyte`
* `exbibyte`

### [Fraction Units](https://docs.sentry.io/platforms/dotnet/guides/apple/tracing/instrumentation/performance-metrics.md#fraction-units)

* `ratio`
* `percent`

If you want to explore further, you can find details about supported units in our [event ingestion documentation](https://getsentry.github.io/relay/relay_metrics/enum.MetricUnit.html).
