This is a supporting library only and you should not be installing this. This provides native binding libraries for Raygun4Maui; Raygun's Crash Reporting and Real User Monitoring Provider for MAUI .NET
$ dotnet add package Raygun4Maui.PlatformRaygun's Crash Reporting and Real User Monitoring provider for .NET MAUI
The best way to install Raygun is to use the NuGet package manager. Right-click on your project and select "Manage NuGet Packages....". Navigate to the Browse tab, then use the search box to find Raygun4Maui and install it.
To install the latest version:
dotnet add package Raygun4Maui
Alternatively, you can specify a version tag to install a specific version of the package. See Raygun4Maui NuGet Gallery page for information on available versions.
dotnet add package Raygun4Maui --version 2.0.1
Import the module by:
using Raygun4Maui;
To activate sending of unhandled exceptions and logs to Raygun, you must add Raygun4Maui to your MauiApp builder. To do so, open your main MauiProgram class (MauiProgram.cs) and change the CreateMauiApp method by adding the AddRaygun extension method:
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
...
.AddRaygun();
The default method uses the configuration service to pull in your configuration and create the Raygun client
Configuration settings can be added via an appsettings.json file. To add appsettings.json to the bundled app you should add it as an embedded resource (consult IDE specific instructions). If you do not provide one we create a default Raygun4MauiSettings object which you can change using a lambda to change the options. This must be added to the configuration before you call the .AddRaygun() method.
var a = Assembly.GetExecutingAssembly();
using var stream = a.GetManifestResourceStream("Raygun4Maui.SampleApp.appsettings.json");
builder.Configuration.AddJsonStream(stream!);
Below is an example appsettings.json file, two key notes are that you need to use Raygun4MauiSettings as the configuration will not pull it in otherwise. Additionally, the RumFeatureFlags are comma seperated so that they can be loaded in correctly as a bitwise feature flag.
{
"Raygun4MauiSettings": {
"RaygunSettings": {
"ApiKey": "paste_your_api_key_here",
"ApplicationVersion": "1.0.0",
},
"RaygunLoggerConfiguration": {
"SendDefaultTags": true,
"SendDefaultCustomData": true,
"MinLogLevel": "Debug",
"MaxLogLevel": "Critical"
},
"IgnoredViews": [
"LoginView",
"SettingsView"
],
"IgnoredUrls": [
"https://example.com/ignore"
],
"EnableRealUserMonitoring": true,
"RumFeatureFlags": "Network, Page, AppleNativeTimings"
}
}
Mentioned previously, we provide an options lambda which you can use to make in-code changes to the configuration, e.g.
.AddRaygun(options => {
options.RaygunSettings.ApiKey = "paste_your_api_key_here";
options.EnableRealUserMonitoring = true;
options.RumFeatureFlags = RumFeatures.Page | RumFeatures.Network | RumFeatures.AppleNativeTimings;
})
The AddRaygun extension method contains an overloaded method that takes a Raygun4MauiSettings options object which can be used instead of the configuration service. This contains a RaygunSettings from Raygun4Net.
Raygun4MauiSettings supports the following configurations:
RaygunSettings, such as ApiKey.SendDefaultTags (defaulted to true) adds the Log Level (e.g., Severe, Warning, etc.) and the Build Platform (e.g., Windows, Android, iOS, etc.) to reports and logs sent to Raygun.SendDefaultCustomData (defaulted to true) adds all available information in the uncaught exception as custom data on the crash report sent to Raygun.MinLogLevel and MaxLogLevel that specify the range of logging levels to be sent to Raygun.IgnoredViews a list of views to ignore when trackingIgnoredUrls a list of URLs to ignore when trackingRumApiEndpoint endpoint to where the RUM data is sentEnableRealUserMonitoring to enable RUMRumFeatureFlags a enum flag to enable specific RUM features, (e.g. RumFeatures.Page | RumFeatures.Network)To use these additional configurations, create and initialize a new RaygunLoggerConfiguration object as follows:
Raygun4MauiSettings raygunMauiSettings = new Raygun4MauiSettings {
RaygunSettings = new RaygunSettings() {
ApiKey = "paste_your_api_key_here",
},
RaygunLoggerConfiguration = new RaygunLoggerConfiguration {
SendDefaultTags = true, // defaults to true
SendDefaultCustomData = true, // defaults to true
MinLogLevel = LogLevel.Debug, // defaults to Debug
MaxLogLevel = LogLevel.Critical // defaults to Critical
}
EnableRealUserMonitoring = true, // defaults to false
RumFeatureFlags = RumFeatures.Page | RumFeatures.Network | RumFeatures.AppleNativeTimings // Enables Page, Network, and Native Apple Timings
};
The Raygun4MauiSettings are added to the service provider so that any DI dependent service can pull in the Raygun4MauiSettings and make changes. For example the application version may be obtained from an endpoint, so this can be assigned later rather than at instantiation.
As part of Raygun4Net.NetCore v10.0.0, we are moving away from the use of UserInfo and User. These are now marked as obsolete, and within the Raygun4Maui provider we no longer support this.
We now have introduced the IRaygunUserProvider, which offers a GetUser function that our crash reporting can use to get the current user.
Only having GetUser makes sense for NetCore, but since MAUI supports RUM we need a way of notifying the RUM module that a user has changed.
We therefore, provide a IRaygunMauiUserProvider interface which adds a SetUser method. With this we can notify the RUM module. There is a default implementation of this class for this provider which takes in a user with SetUser and provides this user through GetUser.
You can obtain an instance of this provider through dependency injection using IRaygunMauiUserProvider, then you can set the user by calling SetUser.
public MainPage(IRaygunMauiUserProvider userProvider) {
userProivder.SetUser(new RaygunIdentifierMessage("anonymous");
}
You can implement your own custom user provider if the default does not fit your needs. This can be done by implementing the IRaygunMauiUserProvider, specifically GetUser and SetUser.
Please note, if you create a custom implementation you must send a user changed event to the RaygunAppEventPublisher for our RUM module to be notified.
RaygunAppEventPublisher.Publish(new RaygunUserChanged
{
User = _user
});
As mentioned, we obtain this user provider by using dependency injection, so to add your instance of the user provider to the DI container we provide an extension on the app builder.
builder.AddRaygunUserProvider<CustomRaygunMauiUserProvider>();
Unhandled exceptions will be sent to Raygun automatically.
Raygun4Maui stores an instance of a RaygunMauiClient object that is initialized by the Maui builder, this can be accessed through the following code:
RaygunMauiClient.Current
This client extends the Raygun4Net.NetCore RaygunClient, as a result any features supported by the Raygun4Net.NetCore Client are supported here.
Raygun4Maui automatically sends unhandled exceptions. For manual sending, use Send or SendInBackground methods, as shown below:
try {
// Code that may fail
} catch (Exception e) {
RaygunMauiClient.Current.SendInBackground(e);
//or
RaygunMauiClient.Current.Send(e);
}
An exception needs to be thrown in order for its stack trace to be populated. If the exception is created manually no stack trace data is collected.
For additional examples on how to use the RaygunMauiClient object refer to the Raygun4Net.NetCore documentation
Raygun4Maui will automatically send any logger logs to Raygun.
To make a log entry, obtain the reference to the ILogger services that your MAUI app maintains:
ILogger logger = Handler.MauiContext.Services.GetService<ILogger<MainPage>>();
You may now use the appropriate ILogger log method from the logger object. This uses the same RaygunMauiClient object accessible from RaygunMauiClient.Current
logger.LogInformation("Raygun4Maui.SampleApp.TestLoggerErrorsSent: {MethodName} @ {Timestamp}", "TestLogInformation", DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss"));
logger.LogCritical("Raygun4Maui.SampleApp.TestLoggerErrorsSent: {MethodName} @ {Timestamp}", "TestLogCritical", DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss"));
This functionality also allows you to manually catch and log exceptions as shown below:
try {
// Code that throws exception
} catch (Exception e) {
// Example ILogger call. You can use the ILogger method and arguments of your choice.
logger.Log(LogLevel.Error, e, "Exception caught at {Timestamp}", DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss"));
}
Raygun4Maui will automatically collect information specific to the environment the application is being run in. However, there are inconsistencies between certain values across platforms.
Total physical memory and Available physical memory properties mean different things across platforms. Below is a table explaining the differences for each platform.| Platform | Total physical memory | Available physical memory |
|---|---|---|
| Mac | Total installed ram | Total memory available for user-level processes |
| iOS | Total installed ram | Total memory available for user-level processes |
| Windows | Total installed ram | Total amount of private memory used by the process at the time of the measurement. For a number of reasons this might not be the actual total memory usage |
| Android | Total amount of memory that the JVM has allocated for the application | Total amount of free memory that the JVM has available for the application to use |
| Platform | Networking support | Conditions |
|---|---|---|
| Mac | Yes | HttpClient, NSURLSession, and NSURLConnection |
| iOS | Yes | HttpClient, NSURLSession, and NSURLConnection |
| Windows | Yes | HttpClient |
| Android | Yes | HttpURLConnection (see SampleApp) |
You can optionally specify an Offline Store for crash reports when creating your Raygun4MauiClient.
When an offline store is specified, if there are any issues sending an exception to the Raygun API, a copy of the exception may be stored locally to be retried at a later date.
An exception is stored offline when one of the following conditions are met:
// This will initialize Raygun with the default Application Data Store
mauiAppBuilder.AddRaygun(options =>
{
options.UseOfflineStorage();
});
You can also define the background send strategy and store separately
// Attempt to send any offline crash reports every 30 seconds
var sendStrategy = new TimerBasedSendStrategy(TimeSpan.FromSeconds(30));
// Store crash reports in directory relative to the Application (`FileSystem.AppDataDirectory`)
var offlineStore = new RaygunMauiOfflineStore(sendStrategy);
mauiAppBuilder.AddRaygun(options =>
{
options.OfflineStore = offlineStore;
});