Инструментирование мобильных приложений с помощью пакета Ключ-АСТРОМ Xamarin NuGet
Инструментирование мобильных приложений с помощью пакета Ключ-АСТРОМ Xamarin NuGet в RUM Classic
Пакет Ключ-АСТРОМ Xamarin NuGet помогает автоматически инструментировать ваше приложение Xamarin с помощью ЕдиногоАгента для Android и iOS, а также предоставляет API для ручной инструментации. Пакет совместим с проектами Xamarin.iOS, Xamarin.Android и Xamarin.Forms.
Прекращение поддержки и устаревание пакета
С 1 мая 2024 года Microsoft прекратила поддержку всех SDK Xamarin. По этой причине поддержка пакета Ключ-АСТРОМ Xamarin NuGet также прекращена в мае 2024 года. В последующих версиях пакета будут только исправления ошибок и важные проблемы безопасности.
Кроме того, в соответствии с политикой поддержки Ключ-АСТРОМ, поддержка пакета полностью прекращена в мае 2025 года.
Рекомендуется обновить проекты Xamarin до .NET и использовать пакет Ключ-АСТРОМ .NET MAUI NuGet вместо устаревшего пакета Xamarin NuGet.
Поддерживаемые функции
Автоматическая инструментация
- Действия пользователя
- События жизненного цикла
- Веб-запросы
- Аварии
Ручная инструментация
- Пользовательские действия
- Веб-запросы
- Ценности
- События
- Ошибки
- Аварии
- Теги пользователей
Требования
- Для Android:
- Android версии 5.0+ (API 21+)
- Xamarin.Android SDK 10.1.x+
- Для iOS: версия iOS 12+
- Для Xamarin.Forms: .NET Standard версии 2.0 и выше
Настройка пакета
Шаг 1: Установка пакета NuGet
Добавьте пакет Ключ-АСТРОМ Xamarin NuGet во все необходимые проекты.
- В Visual Studio щелкните правой кнопкой мыши по основному проекту приложения и выберите Управление пакетами NuGet.
- Найдите пакет astromkey.OneAgent.Xamarin на nuget.org и выберите Добавить пакет.
- Установите флажки для всех проектов, в которые хотите добавить пакет.
- Выберите ОК.
Шаг 2: Создание приложения и получение файла конфигурации
Создайте новое мобильное приложение в Ключ-АСТРОМ и загрузите файл конфигурации.
- В Ключ-АСТРОМ перейдите в раздел Мобильное приложение.
- Выберите Создать мобильное приложение.
- Введите название приложения и выберите Создать мобильное приложение. Откроется страница настроек приложения.
- В настройках приложения выберите Мастер инструментирования > Xamarin.
- На шаге 2 выберите Загрузить astromkey.config.json, чтобы получить файл конфигурации.
Шаг 3: Добавление файла конфигурации в проект
Добавьте скачанный файл astromkey.config.json в свой проект.
- Android: добавьте файл в каталог
Assetsвашего Android-проекта. - iOS: добавьте файл в каталог
Resourcesвашего iOS-проекта. Перед каждой сборкой пакет автоматически создает новый файлastromkey.plistна основе параметров из конфигурационного файла.
Шаг 4: Добавление метода запуска ЕдиногоАгента
Для запуска ЕдиногоАгента используйте следующий код (общий для обеих платформ).
using Dynatrace.Xamarin; Agent.Instance.Start(); |
Шаг 5: Настройка DependencyService для Xamarin.Forms
Только для Xamarin.Forms
Для версий Xamarin.Forms 4.7.0 и выше, использующих RegisterSingleton, зарегистрируйте интерфейс при запуске в нативной части приложения Xamarin.Forms сразу после Forms.Init().
Пример для Android Forms:
using Dynatrace.Xamarin; Xamarin.Essentials.Platform.Init(this, savedInstanceState); global::Xamarin.Forms.Forms.Init(this, savedInstanceState); Xamarin.Forms.DependencyService.RegisterSingleton<IDynatrace>(Agent.Instance); LoadApplication(new App()); |
Доступ к ЕдиногоАгенту в приложении Xamarin.Forms:
using Dynatrace.Xamarin; IDynatrace dynatrace = DependencyService.Get<IDynatrace>(); |
При автоматической инструментации необходимо также применить пакет к нативным частям приложения.
Для версий Xamarin.Forms 4.6.0 и более ранних используйте обходное решение. В файле App.xaml.cs:
public partial class App : Application
{
static readonly Dictionary<Type, Func<object, object>> factories = new Dictionary<Type, Func<object, object>>();
public App()
{
InitializeComponent();
DependencyResolver.ResolveUsing((type, args) => factories.ContainsKey(type) ? factories[type].Invoke(args) : null);
IDynatrace dynatrace = DependencyService.Resolve<IDynatrace>();
dynatrace.Start(null);
}
public static void Register(Type type, Func<object, object> factory)
{
factories[type] = factory;
}
...
}
|
В части для Android:
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
protected override void OnCreate(Bundle savedInstanceState)
{
...
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
App.Register(typeof(IDynatrace), (o) => Agent.Instance);
LoadApplication(new App());
}
...
}
|
Шаг 6 (необязательно): Включение автоматической инструментации веб-запросов
Для автоматической инструментации веб-запросов используйте следующий метод. HttpMessageHandler, используемый в HttpClient, отвечает за ручную инструментацию веб-запросов.
using Dynatrace.Xamarin; var httpHandler = Agent.Instance.GetHttpMessageHandler(); var httpClient = new HttpClient(httpHandler); |
С собственным обработчиком:
using Dynatrace.Xamarin; var defaultHttpHandler = new HttpClientHandler(); var httpHandler = Agent.Instance.GetHttpMessageHandler(defaultHttpHandler); var httpClient = new HttpClient(httpHandler); |
Ручная инструментация
Запуск ЕдиногоАгента
Можно использовать ручной запуск с помощью конструктора конфигураций (Android) или словаря конфигураций (iOS).
Измените файл astromkey.config.json, чтобы отключить автозапуск:
- Android:
{
"android": {
"autoStart": {
"enabled": false
}
}
}
|
- iOS:
{
"ios": {
"DTXAutoStart": false
}
}
|
Не добавляйте дополнительные свойства в файл конфигурации, иначе сборка завершится с ошибкой.
Запустите ЕдиныйАгент вручную:
- Android:
using Dynatrace.Xamarin;
Agent.Instance.Start(new ConfigurationBuilder("<insertBeaconURL>", "<insertApplicationID>").BuildConfiguration());
|
- iOS:
using Dynatrace.Xamarin;
var configDict = new Dictionary<string, object>();
configDict.Add("DTXApplicationID", "<insertApplicationID>");
configDict.Add("DTXBeaconURL", "<insertBeaconURL>");
Agent.Instance.Start(configDict);
|
Создание пользовательских действий
Вызов EnterAction для запуска и LeaveAction для завершения пользовательского действия. Время выполнения измеряется автоматически.
using Dynatrace.Xamarin;
var myAction = Agent.Instance.EnterAction("Нажмите на подтверждение");
// Выполнить действие
myAction.LeaveAction();
|
Максимальная длина имени пользовательского действия — 250 символов.
Создание дочерних действий
Дочерние действия аналогичны родительским. При закрытии родительского все дочерние закрываются автоматически.
var myAction = Agent.Instance.EnterAction("Нажмите на подтверждение");
var mySubAction = myAction.EnterAction("Нажмите на подтверждение еще раз");
mySubAction.LeaveAction();
myAction.LeaveAction();
|
Максимальная длина имени — 250 символов. Можно создать только один уровень дочерних действий.
Отмена пользовательских действий
Вызов Cancel отменяет действие и все связанные с ним данные (значения, события, ошибки, дочерние действия).
var myAction = Agent.Instance.EnterAction("Нажмите на подтверждение");
myAction.Cancel(); // Действие отменено
|
Нельзя отменить закрытое действие и закрыть отменённое.
Инструментация веб-запросов
var webAction = Agent.Instance.EnterAction(actionName: "WebRequest Action");
string requestTag = webAction.GetRequestTag(url);
string requestTagHeader = webAction.GetRequestTagHeader();
httpClient.DefaultRequestHeaders.Add(requestTagHeader, requestTag);
WebRequestTiming timing = (WebRequestTiming)Agent.Instance.GetWebRequestTiming(requestTag, url);
timing.StartWebRequestTiming();
try
{
var response = await httpClient.GetAsync(url);
timing.StopWebRequestTiming(url, (int)response.StatusCode, response.ReasonPhrase);
}
catch (HttpRequestException)
{
timing.StopWebRequestTiming(url, -1, Exception.ToString());
}
finally
{
webAction.LeaveAction();
}
|
Сообщение значения
Метод ReportValue позволяет передавать пары «ключ-значение» типов int, double, string.
var myAction = Agent.Instance.EnterAction("Нажмите на подтверждение");
myAction.ReportValue("Тип клиента", "Золото");
myAction.LeaveAction();
|
Значения можно просмотреть на странице подробной информации о действии пользователя в разделе «Отображаемые значения».
Сообщение о событии
myAction.ReportEvent(eventName); |
Сообщение об ошибке
myAction.ReportError(errorName, errorCode); |
Сообщение о трассировке стека ошибок
Agent.Instance.ReportErrorStacktrace("Error_Class", "Error_Value", "Error_Reason", "Error_Stacktrace");
|
Сообщение о сбое
Agent.Instance.ReportCrash("CrashWithoutException", "Crash_Reason", "Crash_Stacktrace");
// или с объектом исключения
Agent.Instance.ReportCrashWithException("CrashWithExceptionObj", exception);
|
- Android: информация о сбое отправляется сразу после возникновения; иногда требуется повторное открытие приложения в течение 10 минут.
- iOS: информация отправляется при следующем запуске приложения; если пользователь не открывает приложение в течение 10 минут, отчет удаляется.
Сообщение о сбое завершает текущую пользовательскую сессию.
Сообщение о деловом событии
Функция доступна с версии Ключ-АСТРОМ SaaS 1.253+.
var attributes = new Dictionary<string, JsonValue>();
attributes.Add("event.name", "Confirmed Booking");
attributes.Add("screen", "booking-confirmation");
attributes.Add("product", "Danube Anna Hotel");
attributes.Add("amount", 358.35);
attributes.Add("currency", "USD");
attributes.Add("reviewScore", 4.8);
attributes.Add("arrivalDate", "2022-11-05");
attributes.Add("departureDate", "2022-11-15");
attributes.Add("journeyDuration", 10);
attributes.Add("adultTravelers", 2);
attributes.Add("childrenTravelers", 0);
Agent.Instance.SendBizEvent("com.easytravel.funnel.booking-finished", attributes);
|
Отметка конкретных пользователей
Присвоение уникального имени пользовательской сессии.
Agent.Instance.IdentifyUser("John Smith");
|
При автоматическом перезапуске сессии (по тайм-ауту или неактивности) метка сохраняется.
Завершение сессии
Принудительное завершение сессии и запуск новой.
Agent.Instance.EndVisit(); |
Настройка конфиденциальности данных (режим согласия)
Включение режима согласия пользователя: установите userOptIn: true (Android) или DTXUserOptIn: true (iOS) в файле конфигурации.
Получение текущих настроек:
UserPrivacyOptions currentOptions = Agent.Instance.GetUserPrivacyOptions(); bool crashOptedIn = currentOptions.CrashReportingOptedIn; DataCollectionLevel dataCollectionLevel = currentOptions.DataCollectionLevel; |
Изменение настроек:
UserPrivacyOptions options = new UserPrivacyOptions(DataCollectionLevel.Performance, false); options.DataCollectionLevel = DataCollectionLevel.UserBehavior; options.CrashReportingOptedIn = true; Agent.Instance.ApplyUserPrivacyOptions(options); |
Возможные уровни: Off, Performance, UserBehavior.
Сообщение местоположения по GPS
Agent.Instance.SetGPSLocation(latitude, longitude); |
Файл конфигурации
Файл astromkey.config.json содержит идентификатор приложения, URL-адрес маяка и другие настройки. Можно скачать из Ключ-АСТРОМ или создать вручную. Если файл отсутствует, сборка завершится ошибкой (если не используется ручной запуск).
При использовании конфигураций сборки (Debug, Release) пакет ищет файл с именем astromkey<Configuration>.config.json. Можно указать собственный путь через свойство astromkeyConfigurationFile.
Пример структуры для Android:
{
"android": {
"autoStart": {
"applicationId": "<insertApplicationID>",
"beaconUrl": "<insertBeaconURL>"
},
"userOptIn": true,
"agentBehavior": {
"startupLoadBalancing": true
}
}
}
|
Пример структуры для iOS:
{
"ios": {
"DTXApplicationId": "<insertApplicationID>",
"DTXBeaconUrl": "<insertBeaconURL>",
"DTXUserOptIn": true,
"DTXStartupLoadBalancing": true
}
}
|
Никогда не используйте точечную нотацию для конфигурационного файла. Всегда пишите в квадратных скобках.
Включение отладочных логов
Логи ЕдиногоАгента
- Android:
{
"android": {
"autoStart": { ... },
"userOptIn": true,
"debug": {
"agentLogging": true
}
}
}
|
- iOS:
{
"ios": {
"DTXApplicationId": "<insertApplicationID>",
"DTXBeaconUrl": "<insertBeaconURL>",
"DTXUserOptIn": true,
"DTXLogLevel": "ALL"
}
}
|
Отладочные логи сборки (только Android)
Установите свойство astromkeyInstrumentationLogging в true (через Directory.Build.props или .csproj), измените уровень детализации вывода сборки на Diagnostic.
Поиск неисправностей
См. раздел «Мобильные приложения: проблемы с пакетом Ключ-АСТРОМ Xamarin NuGet» в сообществе Ключ-АСТРОМ.