# Performance Metrics | Sentry for WinUI

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/winui/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/winui/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/winui/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/winui/tracing/instrumentation/performance-metrics.md#duration-units)

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

### [Information Units](https://docs.sentry.io/platforms/dotnet/guides/winui/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/winui/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).
