ENetrebin (обсуждение | вклад) (Новая страница: «Используйте OneAgent SDK для Android, чтобы сообщать дополнительные сведения о сеансах пользоват...») |
Нет описания правки |
||
(не показаны 2 промежуточные версии 1 участника) | |||
Строка 1: | Строка 1: | ||
Используйте | Используйте ЕдиныйАгент SDK для Android, чтобы сообщать дополнительные сведения о сеансах пользователей в своем мобильном приложении. ЕдиныйАгент SDK для Android позволяет создавать настраиваемые действия, сообщать об ошибках, отмечать конкретных пользователей и т. д. В разделах ниже объясняется, как включить эти возможности. | ||
Вы можете использовать | Вы можете использовать ЕдиныйАгент SDK в Java и Kotlin. | ||
== Запустить | == Запустить ЕдиныйАгент == | ||
Если вы отключили автоматический запуск с помощью <code>autoStart.enabled</code>свойства или используете автономное ручное инструментирование вместо автоматического, запустите | Если вы отключили автоматический запуск с помощью <code>autoStart.enabled</code>свойства или используете автономное ручное инструментирование вместо автоматического, запустите ЕдиныйАгент вручную в <code>Application.onCreate</code>методе. Используйте <code>astromkey.startup(Application, Configuration)</code>метод API. | ||
'''Java:''' | '''Java:''' | ||
< | <public class YourApplication extends Application { | ||
@Override | @Override | ||
Строка 13: | Строка 13: | ||
super.onCreate(); | super.onCreate(); | ||
// provide the application context as parameter | // provide the application context as parameter | ||
astromkey.startup(this, new astromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconUrl>") | |||
... // additional configuration | ... // additional configuration | ||
.buildConfiguration()); | .buildConfiguration()); | ||
Строка 19: | Строка 19: | ||
}</code> | }</code> | ||
'''Kotlin:''' | '''Kotlin:''' | ||
< | <class YourApplication : Application() { | ||
override fun onCreate() { | override fun onCreate() { | ||
super.onCreate() | super.onCreate() | ||
// provide the application context as parameter | // provide the application context as parameter | ||
astromkey.startup(this, astromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconUrl>") | |||
... // additional configuration | ... // additional configuration | ||
.buildConfiguration()) | .buildConfiguration()) | ||
} | } | ||
}</code> | }</code> | ||
Если вам нужно запустить | Если вам нужно запустить ЕдиныйАгент на более позднем этапе, используйте <code>astromkey.startup(Activity, Configuration)</code>метод API. Вы должны предоставить актив <code>Activity</code>в качестве параметра, чтобы ЕдиныйАгент мог немедленно отслеживать его. | ||
'''Java:''' | '''Java:''' | ||
< | <astromkey.startup(yourActiveActivity, new astromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconUrl>") | ||
... // additional configuration | ... // additional configuration | ||
.buildConfiguration());</code> | .buildConfiguration());</code> | ||
'''Kotlin:''' | '''Kotlin:''' | ||
< | <astromkey.startup(yourActiveActivity, astromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconUrl>") | ||
... // additional configuration | ... // additional configuration | ||
.buildConfiguration())</code> | .buildConfiguration())</code> | ||
''Запустите | ''Запустите ЕдиныйАгент в ЕдиныйАгент для Android версии 8.229 и более ранних версий.'' | ||
ЕдиныйАгент для Android версии 8.229 и более ранних версий | |||
Если вы отключили автоматический запуск с помощью <code>autoStart.enabled</code>свойства или используете автономное ручное инструментирование вместо автоматического, запустите | Если вы отключили автоматический запуск с помощью <code>autoStart.enabled</code>свойства или используете автономное ручное инструментирование вместо автоматического, запустите ЕдиныйАгент вручную в <code>Application.onCreate</code>методе. | ||
'''Java:''' | '''Java:''' | ||
< | <public class YourApplication extends Application { | ||
@Override | @Override | ||
public void onCreate() { | public void onCreate() { | ||
super.onCreate(); | super.onCreate(); | ||
astromkey.startup(this, new astromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconUrl>") | |||
... // additional configuration | ... // additional configuration | ||
.buildConfiguration()); | .buildConfiguration()); | ||
Строка 57: | Строка 57: | ||
}</code> | }</code> | ||
'''Kotlin:''' | '''Kotlin:''' | ||
< | <class YourApplication : Application() { | ||
override fun onCreate() { | override fun onCreate() { | ||
super.onCreate() | super.onCreate() | ||
astromkey.startup(this, astromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconUrl>") | |||
... // additional configuration | ... // additional configuration | ||
.buildConfiguration()) | .buildConfiguration()) | ||
} | } | ||
}</code> | }</code> | ||
Если ваше приложение поддерживает прямую загрузку, убедитесь, что <code> | Если ваше приложение поддерживает прямую загрузку, убедитесь, что <code>astromkey.startup</code>оно никогда не вызывается из компонента, поддерживающего прямую загрузку. Также см. раздел Настройка связи с ЕдиныйАгент SDK для Android , чтобы убедиться, что ЕдиныйАгент может передавать данные в кластер АппОптима. | ||
== Настроить | == Настроить ЕдиныйАгент == | ||
Используйте класс | Используйте класс astromkeyConfigurationBuilder для настройки параметров ЕдиногоАгента. | ||
'''Java:''' | '''Java:''' | ||
< | <new astromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconURL>") | ||
.withUserOptIn(true) | .withUserOptIn(true) | ||
.withCrashReporting(true) | .withCrashReporting(true) | ||
.buildConfiguration();</code> | .buildConfiguration();</code> | ||
'''Kotlin:''' | '''Kotlin:''' | ||
< | <AstromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconURL>") | ||
.withUserOptIn(true) | .withUserOptIn(true) | ||
.withCrashReporting(true) | .withCrashReporting(true) | ||
.buildConfiguration()</code> | .buildConfiguration()</code> | ||
Если вы используете комбинацию ручного и автоматического инструментирования, автоматическое инструментирование вводит вызов <code> | Если вы используете комбинацию ручного и автоматического инструментирования, автоматическое инструментирование вводит вызов <code>Astromkey.startup</code>в <code>Application.onCreate</code>метод. В этом случае введенный <code>Astromkey.startup</code>вызов вызывается перед вашим ручным <code>Astromkey.startup</code>вызовом, поэтому ваша ручная настройка игнорируется. | ||
Используйте это <code>autoStart.enabled</code>свойство, чтобы деактивировать функцию автозапуска из автоинструментации. Затем вы можете определить ручной <code> | Используйте это <code>autoStart.enabled</code>свойство, чтобы деактивировать функцию автозапуска из автоинструментации. Затем вы можете определить ручной <code>Astromkey.startup</code>вызов . В этом случае вы можете переопределить значения, предварительно настроенные из автоинструментации. | ||
== Мониторинг действий пользователя == | == Мониторинг действий пользователя == | ||
Строка 94: | Строка 94: | ||
* Прикрепите веб-запрос к действию пользователя | * Прикрепите веб-запрос к действию пользователя | ||
Пользовательские действия отличаются от действий пользователя, созданных с помощью плагина | Пользовательские действия отличаются от действий пользователя, созданных с помощью плагина Astromkey для Android Gradle. ЕдиныйАгент не добавляет автоматически дополнительные события, такие как веб-запросы, в настраиваемые действия или закрытие настраиваемых действий. Однако, когда ЕдиныйАгент завершает работу или должен начать новый сеанс, он закрывает все открытые дополнительные действия. | ||
=== Создание настраиваемых действий === | === Создание настраиваемых действий === | ||
Вы можете создавать собственные действия и дополнять их дополнительной информацией. Если настраиваемые действия не закрыты явно, | Вы можете создавать собственные действия и дополнять их дополнительной информацией. Если настраиваемые действия не закрыты явно, ЕдиныйАгент закрывает их и отправляет в кластерАппОптима. | ||
Вызов <code>enterAction</code>для запуска пользовательского действия и <code>leaveAction</code>закрытия пользовательского действия. Время измеряется автоматически. | Вызов <code>enterAction</code>для запуска пользовательского действия и <code>leaveAction</code>закрытия пользовательского действия. Время измеряется автоматически. | ||
'''Java:''' | '''Java:''' | ||
< | <// start a custom action | ||
DTXAction action = | DTXAction action = Astromkey.enterAction("Tap on Search"); | ||
// ...do some work here... | // ...do some work here... | ||
Строка 110: | Строка 110: | ||
action.leaveAction();</code> | action.leaveAction();</code> | ||
'''Kotlin:''' | '''Kotlin:''' | ||
< | <// start a custom action | ||
val action = | val action = Astromkey.enterAction("Tap on Search") | ||
// ...do some work here... | // ...do some work here... | ||
Строка 121: | Строка 121: | ||
Максимальная продолжительность пользовательского действия для мобильных устройств составляет 9 минут. | Максимальная продолжительность пользовательского действия для мобильных устройств составляет 9 минут. | ||
Если пользовательское действие занимает более 9 минут и не закрывается, такое действие отбрасывается и не сообщается | Если пользовательское действие занимает более 9 минут и не закрывается, такое действие отбрасывается и не сообщается АппОптима. | ||
=== Создание дочерних действий === | === Создание дочерних действий === | ||
Дочерние действия аналогичны родительским действиям. Когда родительское действие закрывается, | Дочерние действия аналогичны родительским действиям. Когда родительское действие закрывается, ЕдиныйАгент автоматически закрывает все дочерние действия родительского действия. | ||
Создайте дочерние действия с помощью <code> | Создайте дочерние действия с помощью <code>Astromkey.enterAction(String, DTXAction)</code>метода. | ||
'''Java:''' | '''Java:''' | ||
< | <// start a parent custom action | ||
DTXAction parentAction = | DTXAction parentAction = Astromkey.enterAction("Tap on Search"); | ||
// ...do some work here... | // ...do some work here... | ||
// start a child action | // start a child action | ||
DTXAction childAction = | DTXAction childAction = Astromkey.enterAction("Tap on Confirm", parentAction); | ||
// ...do some work here... | // ...do some work here... | ||
Строка 147: | Строка 147: | ||
parentAction.leaveAction();</code> | parentAction.leaveAction();</code> | ||
'''Kotlin:''' | '''Kotlin:''' | ||
< | <// start a parent custom action | ||
val parentAction = | val parentAction = Astromkey.enterAction("Tap on Search") | ||
// ...do some work here... | // ...do some work here... | ||
// start a child action | // start a child action | ||
val childAction = | val childAction = Astromkey.enterAction("Tap on Confirm", parentAction) | ||
// ...do some work here... | // ...do some work here... | ||
Строка 167: | Строка 167: | ||
=== Отменить дополнительные действия === | === Отменить дополнительные действия === | ||
ЕдиныйАгент для Android версии 8.231+ | |||
Если вам нужно отменить уже созданное, но еще не выполненное пользовательское действие, используйте <code>DTXAction#cancel()</code>вызов API. | Если вам нужно отменить уже созданное, но еще не выполненное пользовательское действие, используйте <code>DTXAction#cancel()</code>вызов API. | ||
Строка 174: | Строка 174: | ||
'''Java:''' | '''Java:''' | ||
< | <// create a custom action | ||
DTXAction action = | DTXAction action = Astromkey.enterAction("Tap on Purchase"); | ||
try { | try { | ||
// ...do some work here... | // ...do some work here... | ||
performWork(); | performWork(); | ||
// close the custom action. All associated data is stored and sent to | // close the custom action. All associated data is stored and sent to Astromkey | ||
action.leaveAction(); | action.leaveAction(); | ||
} | } | ||
Строка 188: | Строка 188: | ||
}</code> | }</code> | ||
'''Kotlin:''' | '''Kotlin:''' | ||
< | <// create a custom action | ||
val action = | val action = Astromkey.enterAction("Tap on Purchase") | ||
try { | try { | ||
// ...do some work here... | // ...do some work here... | ||
performWork() | performWork() | ||
// close the custom action. All associated data is stored and sent to | // close the custom action. All associated data is stored and sent to Astromkey | ||
action.leaveAction() | action.leaveAction() | ||
} catch (e: Exception) { | } catch (e: Exception) { | ||
Строка 202: | Строка 202: | ||
=== Определить состояние пользовательского действия === | === Определить состояние пользовательского действия === | ||
ЕдиныйАгент для Android версии 8.231+ | |||
Иногда полезно знать, открыто ли пользовательское действие и может ли оно использоваться для отчета о данных. | Иногда полезно знать, открыто ли пользовательское действие и может ли оно использоваться для отчета о данных. | ||
Строка 212: | Строка 212: | ||
* Завершено через <code>DTXAction#leaveAction()</code>, или | * Завершено через <code>DTXAction#leaveAction()</code>, или | ||
* Отменено через <code>DTXAction#cancel()</code>, или | * Отменено через <code>DTXAction#cancel()</code>, или | ||
* Прервано | * Прервано ЕдинымАгентом(например, при завершении работы ЕдиногоАгента) | ||
Обратите внимание, что вы не должны взаимодействовать с готовым пользовательским действием. | Обратите внимание, что вы не должны взаимодействовать с готовым пользовательским действием. | ||
Строка 226: | Строка 226: | ||
'''Java:''' | '''Java:''' | ||
< | <public boolean search(String query) { | ||
// [1a] start a parent custom action | // [1a] start a parent custom action | ||
DTXAction searchAction = | DTXAction searchAction = Astromkey.enterAction("Tap on Search"); | ||
// [2] report a value | // [2] report a value | ||
Строка 248: | Строка 248: | ||
String uniqueRequestTag = searchAction.getRequestTag(); | String uniqueRequestTag = searchAction.getRequestTag(); | ||
// [4.2] Generate a WebRequestTiming object based on the unique tag | // [4.2] Generate a WebRequestTiming object based on the unique tag | ||
WebRequestTiming timing = | WebRequestTiming timing = Astromkey.getWebRequestTiming(uniqueRequestTag); | ||
Request request = new Request.Builder() | Request request = new Request.Builder() | ||
.url(url) | .url(url) | ||
// [4.3] Place the | // [4.3] Place the Astromkey HTTP header on your web request | ||
.addHeader( | .addHeader(Astromkey.getRequestTagHeader(), uniqueRequestTag) | ||
.build(); | .build(); | ||
Строка 270: | Строка 270: | ||
// [5a] start a child action | // [5a] start a child action | ||
DTXAction parseAction = | DTXAction parseAction = Astromkey.enterAction("Parse result", searchAction); | ||
parseResult(body); | parseResult(body); | ||
Строка 290: | Строка 290: | ||
}</code> | }</code> | ||
'''Kotlin:''' | '''Kotlin:''' | ||
< | <fun search(query: String): Boolean { | ||
// [1a] start a parent custom action | // [1a] start a parent custom action | ||
val searchAction = | val searchAction = Astromkey.enterAction("Tap on Search") | ||
// [2] report a value | // [2] report a value | ||
Строка 312: | Строка 312: | ||
val uniqueRequestTag = searchAction.requestTag | val uniqueRequestTag = searchAction.requestTag | ||
// [4.2] Generate a WebRequestTiming object based on the unique tag | // [4.2] Generate a WebRequestTiming object based on the unique tag | ||
val timing = | val timing = Astromkey.getWebRequestTiming(uniqueRequestTag) | ||
val request = Request.Builder() | val request = Request.Builder() | ||
.url(url) | .url(url) | ||
// [4.3] Place the | // [4.3] Place the Astromkey HTTP header on your web request | ||
.addHeader( | .addHeader(Astromkey.getRequestTagHeader(), uniqueRequestTag) | ||
.build() | .build() | ||
Строка 335: | Строка 335: | ||
// [5a] start a child action | // [5a] start a child action | ||
val parseAction = | val parseAction = Astromkey.enterAction("Parse result", searchAction) | ||
parseResult(body) | parseResult(body) | ||
Строка 356: | Строка 356: | ||
== Отчеты о пользовательских значениях == | == Отчеты о пользовательских значениях == | ||
Используя | Используя ЕдиныйАгент SDK для Android, вы можете сообщать о событиях, значениях и ошибках. Сообщенные события, значения и ошибки, которые являются частью действия пользователя, затем отображаются в каскадном анализе действий пользователя. Сообщенные ошибки (как отдельные, так и «прикрепленные» к действию пользователя) также отображаются на странице сведений о сеансе пользователя и многомерной странице анализа действий пользователя . | ||
=== Сообщить о событии === | === Сообщить о событии === | ||
Строка 370: | Строка 370: | ||
Метод <code>reportValue</code>позволяет вам сообщать свои собственные показатели. Эти показатели должны быть частью действия пользователя. | Метод <code>reportValue</code>позволяет вам сообщать свои собственные показатели. Эти показатели должны быть частью действия пользователя. | ||
ЕдиныйАгент SDK позволяет сообщать показатели со следующими типами значений: | |||
* <code>int</code> | * <code>int</code> | ||
Строка 377: | Строка 377: | ||
* <code>string</code> | * <code>string</code> | ||
Метрики с типом <code>long</code>поддерживаются для | Метрики с типом <code>long</code>поддерживаются для ЕдиныйАгент SDK версии 8.197+. | ||
'''Java:''' | '''Java:''' | ||
< | <// report int | ||
action.reportValue("int_metrics_name", 5); | action.reportValue("int_metrics_name", 5); | ||
// report long | // report long | ||
Строка 389: | Строка 389: | ||
action.reportValue("string_metrics_name", "exampleValue");</code> | action.reportValue("string_metrics_name", "exampleValue");</code> | ||
'''Kotlin:''' | '''Kotlin:''' | ||
< | <// report int | ||
action.reportValue("int_metrics_name", 5) | action.reportValue("int_metrics_name", 5) | ||
// report long | // report long | ||
Строка 401: | Строка 401: | ||
Метод <code>reportError</code>отличается от <code>reportValue</code>метода, поскольку он конкретно идентифицируется как событие типа ошибки. | Метод <code>reportError</code>отличается от <code>reportValue</code>метода, поскольку он конкретно идентифицируется как событие типа ошибки. | ||
ЕдиныйАгент SDK позволяет вам сообщать о следующем: | |||
* Коды ошибок . Используйте <code>reportError(String, int)</code>метод. | * Коды ошибок . Используйте <code>reportError(String, int)</code>метод. | ||
Строка 410: | Строка 410: | ||
==== Ошибка в действии пользователя ==== | ==== Ошибка в действии пользователя ==== | ||
'''Java:''' | '''Java:''' | ||
< | <// report an error code | ||
action.reportError("error_code_name", -1); | action.reportError("error_code_name", -1); | ||
// report an exception | // report an exception | ||
action.reportError("exception_name", exception);</code> | action.reportError("exception_name", exception);</code> | ||
'''Kotlin:''' | '''Kotlin:''' | ||
< | <// report an error code | ||
action.reportError("error_code_name", -1) | action.reportError("error_code_name", -1) | ||
// report an exception | // report an exception | ||
Строка 421: | Строка 421: | ||
==== Автономная ошибка ==== | ==== Автономная ошибка ==== | ||
Вы можете сообщать об отдельных событиях ошибок через <code> | Вы можете сообщать об отдельных событиях ошибок через <code>Astromkey</code>класс. | ||
'''Java:''' | '''Java:''' | ||
< | <// report an error code | ||
Astromkey.reportError("error_code_name", -1); | |||
// report an exception | // report an exception | ||
Astromkey.reportError("exception_name", exception);</code> | |||
'''Kotlin:''' | '''Kotlin:''' | ||
< | <// report an error code | ||
Astromkey.reportError("error_code_name", -1) | |||
// report an exception | // report an exception | ||
Astromkey.reportError("exception_name", exception)</code> | |||
== Отчет о бизнес-событиях == | == Отчет о бизнес-событиях == | ||
ЕдиныйАгент для Android версии 8.253+ | |||
С помощью <code>sendBizEvent</code>вы можете сообщать о деловых событиях. Это автономные события, поскольку | С помощью <code>sendBizEvent</code>вы можете сообщать о деловых событиях. Это автономные события, поскольку ЕдиныйАгент отправляет их отдельно от действий пользователя или сеансов пользователя. | ||
Дополнительные сведения о бизнес-событиях см. в разделе Бизнес-аналитика в | Дополнительные сведения о бизнес-событиях см. в разделе Бизнес-аналитика в Astromkey . | ||
'''Java:''' | '''Java:''' | ||
< | <JSONObject attributes = new JSONObject(); | ||
try { | try { | ||
attributes.put("event.name", "Confirmed Booking"); | attributes.put("event.name", "Confirmed Booking"); | ||
Строка 456: | Строка 456: | ||
attributes.put("childrenTravelers", 0); | attributes.put("childrenTravelers", 0); | ||
Astromkey.sendBizEvent("com.easytravel.funnel.booking-finished", attributes); | |||
} catch (JSONException e) { | } catch (JSONException e) { | ||
// handle exception | // handle exception | ||
}</code> | }</code> | ||
'''Kotlin:''' | '''Kotlin:''' | ||
< | <try { | ||
JSONObject().apply { | JSONObject().apply { | ||
put("event.name", "Confirmed Booking") | put("event.name", "Confirmed Booking") | ||
Строка 475: | Строка 475: | ||
put("childrenTravelers", 0) | put("childrenTravelers", 0) | ||
}.also { jsonObject-> | }.also { jsonObject-> | ||
Astromkey.sendBizEvent("com.easytravel.funnel.booking-finished", jsonObject) | |||
} | } | ||
} catch (e: JSONException) { | } catch (e: JSONException) { | ||
Строка 482: | Строка 482: | ||
== Мониторинг жизненного цикла == | == Мониторинг жизненного цикла == | ||
ЕдиныйАгент для Android версии 8.223+ | |||
При мониторинге жизненного цикла | При мониторинге жизненного цикла ЕдиныйАгент собирает следующие данные: | ||
* Отображение активности : измеряет временной интервал от <code>Activity.onCreate(Bundle)</code>до <code>Activity.onPostResume()</code>и сообщает время каждого введенного состояния жизненного цикла активности. | * Отображение активности : измеряет временной интервал от <code>Activity.onCreate(Bundle)</code>до <code>Activity.onPostResume()</code>и сообщает время каждого введенного состояния жизненного цикла активности. | ||
Строка 492: | Строка 492: | ||
'''Java:''' | '''Java:''' | ||
< | <new AstromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconURL>") | ||
.withActivityMonitoring(false) | .withActivityMonitoring(false) | ||
.buildConfiguration();</code> | .buildConfiguration();</code> | ||
'''Kotlin:''' | '''Kotlin:''' | ||
< | <AstromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconURL>") | ||
.withActivityMonitoring(false) | .withActivityMonitoring(false) | ||
.buildConfiguration()</code> | .buildConfiguration()</code> | ||
== Мониторинг веб-запросов == | == Мониторинг веб-запросов == | ||
Плагин | Плагин Astromkey для Android Gradle автоматически обрабатывает большинство веб-запросов. Однако вам придется вручную обрабатывать запросы в следующих случаях: | ||
* Когда запросы стороннего фреймворка не инструментированы | * Когда запросы стороннего фреймворка не инструментированы | ||
Строка 509: | Строка 509: | ||
Для запросов HTTP(S) никогда не сочетайте автоматическую и ручную инструментацию веб-запросов. Однако вы можете использовать автоматическое инструментирование для HTTP(S)-запросов и ручное инструментирование для не-HTTP(S)-запросов . | Для запросов HTTP(S) никогда не сочетайте автоматическую и ручную инструментацию веб-запросов. Однако вы можете использовать автоматическое инструментирование для HTTP(S)-запросов и ручное инструментирование для не-HTTP(S)-запросов . | ||
Чтобы отслеживать веб-запросы, добавьте <code>x- | Чтобы отслеживать веб-запросы, добавьте <code>x-astromkey</code>заголовок HTTP с уникальным значением в веб-запрос. Это необходимо для сопоставления данных мониторинга на стороне сервера с соответствующим мобильным веб-запросом. Кроме того, необходимо измерить значения синхронизации с мобильной стороны. | ||
Мониторинг веб-запроса | Мониторинг веб-запроса | ||
Строка 515: | Строка 515: | ||
# Создайте новый уникальный тег. | # Создайте новый уникальный тег. | ||
# Создайте <code>WebRequestTiming</code>объект на основе тега. | # Создайте <code>WebRequestTiming</code>объект на основе тега. | ||
# Поместите HTTP-заголовок | # Поместите HTTP-заголовок Astromkey в свой веб-запрос. | ||
# Начать отсчет времени веб-запроса до отправки HTTP-запроса. | # Начать отсчет времени веб-запроса до отправки HTTP-запроса. | ||
# Остановить синхронизацию веб-запросов. | # Остановить синхронизацию веб-запросов. | ||
Строка 524: | Строка 524: | ||
* Запросы, прикрепленные к действию пользователя | * Запросы, прикрепленные к действию пользователя | ||
* Автономные запросы . Для этих запросов | * Автономные запросы . Для этих запросов ЕдиныйАгент автоматически пытается найти подходящее действие пользователя. Если он находит его, веб-запрос прикрепляется к действию пользователя. Веб-запрос сообщается как отдельный веб-запрос только в том случае, если не найдено подходящего действия пользователя. В настоящее время вы не можете просматривать отдельные запросы в сегментации сеансов . | ||
=== Прикрепите веб-запрос к действию пользователя === | === Прикрепите веб-запрос к действию пользователя === | ||
Строка 532: | Строка 532: | ||
'''Java:''' | '''Java:''' | ||
< | <URL url = new URL("<nowiki>https://www.example.com</nowiki>"); | ||
// First, create a custom action | // First, create a custom action | ||
DTXAction webAction = | DTXAction webAction = Astromkey.enterAction("Search request"); | ||
// [1] Generate a new unique tag associated with the user action | // [1] Generate a new unique tag associated with the user action | ||
String uniqueRequestTag = webAction.getRequestTag(); | String uniqueRequestTag = webAction.getRequestTag(); | ||
// [2] Generate a WebRequestTiming object based on the unique tag | // [2] Generate a WebRequestTiming object based on the unique tag | ||
WebRequestTiming timing = | WebRequestTiming timing = Astromkey.getWebRequestTiming(uniqueRequestTag); | ||
// Define your OkHttp request. This varies greatly depending on your implementation | // Define your OkHttp request. This varies greatly depending on your implementation | ||
Строка 547: | Строка 547: | ||
.addHeader(yourKey1, yourValue1) | .addHeader(yourKey1, yourValue1) | ||
.addHeader(yourKey2, yourValue2) | .addHeader(yourKey2, yourValue2) | ||
// [3] Place the | // [3] Place the Astromkey HTTP header on your web request | ||
.addHeader( | .addHeader(Astromkey.getRequestTagHeader(), uniqueRequestTag) | ||
.build(); | .build(); | ||
Строка 572: | Строка 572: | ||
}</code> | }</code> | ||
'''Kotlin:''' | '''Kotlin:''' | ||
< | <val url = URL("<nowiki>https://www.example.com</nowiki>") | ||
// First, create a custom action | // First, create a custom action | ||
val webAction = | val webAction = Astromkey.enterAction("Search request") | ||
// [1] Generate a new unique tag associated with the user action | // [1] Generate a new unique tag associated with the user action | ||
val uniqueRequestTag = webAction.requestTag | val uniqueRequestTag = webAction.requestTag | ||
// [2] Generate a WebRequestTiming object based on the unique tag | // [2] Generate a WebRequestTiming object based on the unique tag | ||
val timing = | val timing = Astromkey.getWebRequestTiming(uniqueRequestTag) | ||
// Define your OkHttp request. This varies greatly depending on your implementation | // Define your OkHttp request. This varies greatly depending on your implementation | ||
Строка 587: | Строка 587: | ||
.addHeader(yourKey1, yourValue1) | .addHeader(yourKey1, yourValue1) | ||
.addHeader(yourKey2, yourValue2) | .addHeader(yourKey2, yourValue2) | ||
// [3] Place the | // [3] Place the Astromkey HTTP header on your web request | ||
.addHeader( | .addHeader(Astromkey.getRequestTagHeader(), uniqueRequestTag) | ||
.build() | .build() | ||
Строка 615: | Строка 615: | ||
'''Java:''' | '''Java:''' | ||
< | <final URL url = new URL("<nowiki>https://www.example.com</nowiki>"); | ||
// First, create a custom action | // First, create a custom action | ||
final DTXAction webAction = | final DTXAction webAction = Astromkey.enterAction("Search request"); | ||
// [1] Generate a new unique tag associated with the user action | // [1] Generate a new unique tag associated with the user action | ||
String uniqueRequestTag = webAction.getRequestTag(); | String uniqueRequestTag = webAction.getRequestTag(); | ||
// [2] Generate a WebRequestTiming object based on the unique tag | // [2] Generate a WebRequestTiming object based on the unique tag | ||
final WebRequestTiming timing = | final WebRequestTiming timing = Astromkey.getWebRequestTiming(uniqueRequestTag); | ||
// Define your OkHttp request. This varies greatly depending on your implementation | // Define your OkHttp request. This varies greatly depending on your implementation | ||
Строка 630: | Строка 630: | ||
.addHeader(yourKey1, yourValue1) | .addHeader(yourKey1, yourValue1) | ||
.addHeader(yourKey2, yourValue2) | .addHeader(yourKey2, yourValue2) | ||
// [3] Place the | // [3] Place the Astromkey HTTP header on your web request | ||
.addHeader( | .addHeader(Astromkey.getRequestTagHeader(), uniqueRequestTag) | ||
.build(); | .build(); | ||
Строка 665: | Строка 665: | ||
});</code> | });</code> | ||
'''Kotlin:''' | '''Kotlin:''' | ||
< | <val url = URL("<nowiki>https://www.example.com</nowiki>") | ||
// First, create a custom action | // First, create a custom action | ||
val webAction = | val webAction = Astromkey.enterAction("Search request") | ||
// [1] Generate a new unique tag associated with the user action | // [1] Generate a new unique tag associated with the user action | ||
val uniqueRequestTag = webAction.requestTag | val uniqueRequestTag = webAction.requestTag | ||
// [2] Generate a WebRequestTiming object based on the unique tag | // [2] Generate a WebRequestTiming object based on the unique tag | ||
val timing = | val timing = Astromkey.getWebRequestTiming(uniqueRequestTag) | ||
// Define your OkHttp request. This varies greatly depending on your implementation | // Define your OkHttp request. This varies greatly depending on your implementation | ||
Строка 680: | Строка 680: | ||
.addHeader(yourKey1, yourValue1) | .addHeader(yourKey1, yourValue1) | ||
.addHeader(yourKey2, yourValue2) | .addHeader(yourKey2, yourValue2) | ||
// [3] Place the | // [3] Place the Astromkey HTTP header on your web request | ||
.addHeader( | .addHeader(Astromkey.getRequestTagHeader(), uniqueRequestTag) | ||
.build() | .build() | ||
// [4] Call startWebRequestTiming to begin the timing, and then handle the response body from the OkHttp call | // [4] Call startWebRequestTiming to begin the timing, and then handle the response body from the OkHttp call | ||
timing.startWebRequestTiming() | timing.startWebRequestTiming() | ||
client.newCall(request).enqueue( | client.newCall(request).enqueue(objectq: Callback { | ||
override fun onFailure(call: Call, e: IOException) { | override fun onFailure(call: Call, e: IOException) { | ||
// [5.2] Stop web request timing when a connection exception occurs | // [5.2] Stop web request timing when a connection exception occurs | ||
Строка 715: | Строка 715: | ||
=== Мониторинг автономного веб-запроса === | === Мониторинг автономного веб-запроса === | ||
Чтобы отслеживать веб-запрос как отдельный запрос, создайте уникальный тег с помощью <code> | Чтобы отслеживать веб-запрос как отдельный запрос, создайте уникальный тег с помощью <code>Astromkey.getRequestTag()</code>метода. | ||
В следующем примере показано, как отслеживать синхронный <code>OkHttp</code>веб-запрос. | В следующем примере показано, как отслеживать синхронный <code>OkHttp</code>веб-запрос. | ||
'''Java:''' | '''Java:''' | ||
< | <URL url = new URL("<nowiki>https://www.example.com</nowiki>"); | ||
// [1] Generate a new unique tag | // [1] Generate a new unique tag | ||
String uniqueRequestTag = | String uniqueRequestTag = Astromkey.getRequestTag(); | ||
// [2] Generate a WebRequestTiming object based on the unique tag | // [2] Generate a WebRequestTiming object based on the unique tag | ||
WebRequestTiming timing = | WebRequestTiming timing = Astromkey.getWebRequestTiming(uniqueRequestTag); | ||
// Define your OkHttp request. This varies greatly depending on your implementation | // Define your OkHttp request. This varies greatly depending on your implementation | ||
Строка 733: | Строка 733: | ||
.addHeader(yourKey1, yourValue1) | .addHeader(yourKey1, yourValue1) | ||
.addHeader(yourKey2, yourValue2) | .addHeader(yourKey2, yourValue2) | ||
// [3] Place the | // [3] Place the Astromkey HTTP header on your web request | ||
.addHeader( | .addHeader(Astromkey.getRequestTagHeader(), uniqueRequestTag) | ||
.build(); | .build(); | ||
Строка 754: | Строка 754: | ||
}</code> | }</code> | ||
'''Kotlin:''' | '''Kotlin:''' | ||
< | <val url = URL("<nowiki>https://www.example.com</nowiki>") | ||
// [1] Generate a new unique tag | // [1] Generate a new unique tag | ||
val uniqueRequestTag = | val uniqueRequestTag = Astromkey.getRequestTag() | ||
// [2] Generate a WebRequestTiming object based on the unique tag | // [2] Generate a WebRequestTiming object based on the unique tag | ||
val timing = | val timing = Astromkey.getWebRequestTiming(uniqueRequestTag) | ||
// Define your OkHttp request. This varies greatly depending on your implementation | // Define your OkHttp request. This varies greatly depending on your implementation | ||
Строка 767: | Строка 767: | ||
.addHeader(yourKey1, yourValue1) | .addHeader(yourKey1, yourValue1) | ||
.addHeader(yourKey2, yourValue2) | .addHeader(yourKey2, yourValue2) | ||
// [3] Place the | // [3] Place the Astromkey HTTP header on your web request | ||
.addHeader( | .addHeader(Astromkey.getRequestTagHeader(), uniqueRequestTag) | ||
.build() | .build() | ||
Строка 791: | Строка 791: | ||
=== Мониторинг запросов, отличных от HTTP(S) === | === Мониторинг запросов, отличных от HTTP(S) === | ||
ЕдиныйАгент для Android версии 8.249+ | |||
Мониторинг соединений WebSocket доступен начиная | Мониторинг соединений WebSocket доступен начиная с ЕдиногоАгента для Android версии 8.239. Мониторинг всех не-HTTP(S) запросов доступен начиная с ЕдиногоАгента для Android версии 8.249. | ||
ЕдиныйАгент для Android не поддерживает автоматическую обработку запросов, отличных от HTTP(S). Если вам нужно сообщить о таких запросах, как запрос WebSocket (начинается с <code>ws://</code>или <code>wss://</code>), проверьте приведенные ниже примеры кода. | |||
* Используйте <code>stopWebRequestTiming(URI requestUri, int respCode, String respPhrase)</code>метод API для ручной обработки запросов, отличных от HTTP(S). | * Используйте <code>stopWebRequestTiming(URI requestUri, int respCode, String respPhrase)</code>метод API для ручной обработки запросов, отличных от HTTP(S). | ||
Строка 804: | Строка 804: | ||
'''Java:''' | '''Java:''' | ||
< | <final URI uri = URI.create("wss://websocket.example.com"); | ||
// First, create a custom action | // First, create a custom action | ||
DTXAction webSocketAction = | DTXAction webSocketAction = Astromkey.enterAction("WebSocket"); | ||
// Generate a WebRequestTiming object based on the unique request tag | // Generate a WebRequestTiming object based on the unique request tag | ||
WebRequestTiming timing = | WebRequestTiming timing = Astromkey.getWebRequestTiming(webSocketAction.getRequestTag()); | ||
// Define your OkHttp request. This varies greatly depending on your implementation | // Define your OkHttp request. This varies greatly depending on your implementation | ||
Request request = new Request.Builder() | Request request = new Request.Builder() | ||
Строка 838: | Строка 838: | ||
});</code> | });</code> | ||
'''Kotlin:''' | '''Kotlin:''' | ||
< | <val uri = URI.create("wss://websocket.example.com") | ||
// First, create a custom action | // First, create a custom action | ||
val webSocketAction = | val webSocketAction = Astromkey.enterAction("WebSocket") | ||
// Generate a WebRequestTiming object based on the unique request tag | // Generate a WebRequestTiming object based on the unique request tag | ||
val webRequestTiming = | val webRequestTiming = Astromkey.getWebRequestTiming(webSocketAction.requestTag) | ||
// Define your OkHttp request. This varies greatly depending on your implementation | // Define your OkHttp request. This varies greatly depending on your implementation | ||
val request = Request.Builder() | val request = Request.Builder() | ||
Строка 851: | Строка 851: | ||
webRequestTiming.startWebRequestTiming() | webRequestTiming.startWebRequestTiming() | ||
val webSocket = client.newWebSocket(request, | val webSocket = client.newWebSocket(request, objectq: WebSocketListener() { | ||
override fun onClosing(webSocket: WebSocket, code: Int, reason: String) { | override fun onClosing(webSocket: WebSocket, code: Int, reason: String) { | ||
// Stop web request timing when the webSocket connection closes | // Stop web request timing when the webSocket connection closes | ||
Строка 870: | Строка 870: | ||
== Отчеты о сбоях == | == Отчеты о сбоях == | ||
ЕдиныйАгент фиксирует все необработанные исключения и ошибки и немедленно отправляет отчет о сбое на сервер. Отчет о сбое Android включает время возникновения и полную трассировку стека исключения. | |||
Вы можете отключить отчеты о сбоях, используя <code>withCrashReporting</code>метод: | Вы можете отключить отчеты о сбоях, используя <code>withCrashReporting</code>метод: | ||
'''Java:''' | '''Java:''' | ||
< | <new AstromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconURL>") | ||
.withCrashReporting(false) | .withCrashReporting(false) | ||
.buildConfiguration();</code> | .buildConfiguration();</code> | ||
'''Kotlin:''' | '''Kotlin:''' | ||
< | <AstromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconURL>") | ||
.withCrashReporting(false) | .withCrashReporting(false) | ||
.buildConfiguration()</code> | .buildConfiguration()</code> | ||
Строка 886: | Строка 886: | ||
Вы можете пометить каждого пользователя своих мобильных приложений уникальным именем пользователя. Это позволяет вам искать и фильтровать определенные сеансы пользователей и анализировать поведение отдельных пользователей с течением времени. | Вы можете пометить каждого пользователя своих мобильных приложений уникальным именем пользователя. Это позволяет вам искать и фильтровать определенные сеансы пользователей и анализировать поведение отдельных пользователей с течением времени. | ||
Следующие шаги объясняют, как пометить отдельного пользователя с помощью | Следующие шаги объясняют, как пометить отдельного пользователя с помощью АппОптима API. | ||
'''Java:''' | '''Java:''' | ||
<code> | <code>Astromkey.identifyUser("john.doe@example.com");</code> | ||
'''Kotlin:''' | '''Kotlin:''' | ||
<code> | <code>Astromkey.identifyUser("john.doe@example.com")</code> | ||
ЕдиныйАгент для Android версии 237+ | |||
ЕдиныйАгент для Android версии 237+Сеансы, разделенные из-за простоя или тайм-аута продолжительности, автоматически повторно помечаются. | |||
Когда | Когда ЕдиныйАгент завершает помеченный сеанс из-за того, что продолжительность сеанса достигла установленного предела, или из-за бездействия пользователя, последующий сеанс автоматически повторно помечается. Вам не нужно повторно предоставлять идентификационную информацию пользователя. | ||
Однако обратите внимание, что | Однако обратите внимание, что ЕдиныйАгент не повторно помечает последующий сеанс в следующих случаях: | ||
* Когда вы явно завершаете помеченный пользовательский сеанс через<code>endVisit</code> | * Когда вы явно завершаете помеченный пользовательский сеанс через<code>endVisit</code> | ||
* Когда пользователь или мобильная операционная система закрывает или принудительно останавливает приложение | * Когда пользователь или мобильная операционная система закрывает или принудительно останавливает приложение | ||
* Когда | * Когда ЕдиныйАгент завершает текущий сеанс пользователя и создает новый сеанс после изменения настроек конфиденциальности. | ||
См. Сеансы пользователей > Завершение сеанса , чтобы узнать, когда | См. Сеансы пользователей > Завершение сеанса , чтобы узнать, когда ЕдиныйАгент завершает сеанс мобильного пользователя. | ||
== Завершить сеанс == | == Завершить сеанс == | ||
Вы можете принудительно завершить сеанс с помощью | Вы можете принудительно завершить сеанс с помощью АппОптима API. Это также закрывает все открытые действия и запускает новый сеанс. | ||
'''Java:''' | '''Java:''' | ||
<code> | <code>Astromkey.endVisit();</code> | ||
'''Kotlin:''' | '''Kotlin:''' | ||
<code> | <code>Astromkey.endVisit()</code> | ||
== Настроить конфиденциальность данных == | == Настроить конфиденциальность данных == | ||
В режиме согласия пользователя для мобильных приложений вы можете динамически настраивать параметры конфиденциальности данных и создавать свои приложения в соответствии с законами и нормами о защите данных. | В режиме согласия пользователя для мобильных приложений вы можете динамически настраивать параметры конфиденциальности данных и создавать свои приложения в соответствии с законами и нормами о защите данных. | ||
Чтобы активировать режим согласия пользователя, включите <code>userOptIn</code>флаг через DSL из плагина | Чтобы активировать режим согласия пользователя, включите <code>userOptIn</code>флаг через DSL из плагина Astromkey Android Gradle или используйте <code>ConfigurationBuilder.withUserOptIn</code>метод. | ||
С помощью этого <code> | С помощью этого <code>Astromkey.applyUserPrivacyOptions</code>метода вы можете настроить параметры конфиденциальности в зависимости от решения пользователя. | ||
'''Java:''' | '''Java:''' | ||
< | <Astromkey.applyUserPrivacyOptions(UserPrivacyOptions.builder() | ||
.withDataCollectionLevel(DataCollectionLevel.USER_BEHAVIOR) | .withDataCollectionLevel(DataCollectionLevel.USER_BEHAVIOR) | ||
.withCrashReportingOptedIn(true) | .withCrashReportingOptedIn(true) | ||
Строка 928: | Строка 928: | ||
);</code> | );</code> | ||
'''Kotlin:''' | '''Kotlin:''' | ||
< | <Astromkey.applyUserPrivacyOptions(UserPrivacyOptions.builder() | ||
.withDataCollectionLevel(DataCollectionLevel.USER_BEHAVIOR) | .withDataCollectionLevel(DataCollectionLevel.USER_BEHAVIOR) | ||
.withCrashReportingOptedIn(true) | .withCrashReportingOptedIn(true) | ||
.build() | .build() | ||
)</code> | )</code> | ||
ЕдиныйАгент сохраняет настройки конфиденциальности и автоматически применяет их при перезапуске приложения. Кроме того, ЕдиныйАгент создает новый сеанс всякий раз, когда параметры конфиденциальности изменяются с помощью этого <code>Astromkey.applyUserPrivacyOptions</code>метода. | |||
Вы также можете получить настройки конфиденциальности с помощью <code> | Вы также можете получить настройки конфиденциальности с помощью <code>Astromkey.getUserPrivacyOptions</code>метода. Однако этот метод следует использовать после запуска ЕдиногоАгента. | ||
''Конфиденциальность данных в | ''Конфиденциальность данных в ЕдиномАгенте для Android версии 8.189 и более ранних:'' | ||
ЕдиныйАгент для Android версии 8.189 и более ранних версий | |||
С помощью этого <code> | С помощью этого <code>Astromkey.setCrashReportingOptedIn(boolean)</code>метода вы можете активировать или деактивировать отчеты о сбоях. Уровень сбора данных можно изменить с помощью <code>Astromkey.setDataCollectionLevel(DataCollectionLevel)</code>метода. | ||
Вы можете получить настройки конфиденциальности с помощью методов <code> | Вы можете получить настройки конфиденциальности с помощью методов <code>Astromkey.getDataCollectionLevel()</code>и <code>Astromkey.isCrashReportingOptedIn()</code>. Используйте методы API конфиденциальности после запуска ЕдиногоАгента. | ||
== Настройка гибридных приложений == | == Настройка гибридных приложений == | ||
Для гибридных приложений, использующих RUM JavaScript внутри <code>WebView</code>(Android) или <code>WKWebView</code>(iOS), файлы cookie должны быть установлены для каждого инструментированного домена или сервера, с которым взаимодействует приложение. Когда функция мониторинга гибридных приложений включена, | Для гибридных приложений, использующих RUM JavaScript внутри <code>WebView</code>(Android) или <code>WKWebView</code>(iOS), файлы cookie должны быть установлены для каждого инструментированного домена или сервера, с которым взаимодействует приложение. Когда функция мониторинга гибридных приложений включена, ЕдиныйАгент создает эти файлы cookie для каждого указанного домена и сохраняет их в файлах <code>CookieManager</code>. | ||
=== Включить мониторинг гибридных приложений === | === Включить мониторинг гибридных приложений === | ||
Строка 953: | Строка 953: | ||
==== <code>withMonitoredDomains</code>метод ==== | ==== <code>withMonitoredDomains</code>метод ==== | ||
'''Java:''' | '''Java:''' | ||
< | <new AstromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconURL>") | ||
.withHybridMonitoring(true) | .withHybridMonitoring(true) | ||
.withMonitoredDomains("<domain1>", "<domain2>") | .withMonitoredDomains("<domain1>", "<domain2>") | ||
.buildConfiguration();</code> | .buildConfiguration();</code> | ||
'''Kotlin:''' | '''Kotlin:''' | ||
< | <AstromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconURL>") | ||
.withHybridMonitoring(true) | .withHybridMonitoring(true) | ||
.withMonitoredDomains("<domain1>", "<domain2>") | .withMonitoredDomains("<domain1>", "<domain2>") | ||
Строка 964: | Строка 964: | ||
==== <code>withMonitoredHttpsDomains</code>метод ==== | ==== <code>withMonitoredHttpsDomains</code>метод ==== | ||
ЕдиныйАгент для Android версии 8.237+ | |||
АппОптима позволяет добавить <code>Secure</code>атрибут cookie для всех файлов cookie, установленных АппОптима. Это гарантирует, что браузер отправляет эти файлы cookie только через защищенные соединения. | |||
'''Java:''' | '''Java:''' | ||
< | <new AstromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconURL>") | ||
.withHybridMonitoring(true) | .withHybridMonitoring(true) | ||
.withMonitoredHttpsDomains("https://<domain1>", "https://<domain2>") | .withMonitoredHttpsDomains("https://<domain1>", "https://<domain2>") | ||
.buildConfiguration();</code> | .buildConfiguration();</code> | ||
'''Kotlin:''' | '''Kotlin:''' | ||
< | <AstromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconURL>") | ||
.withHybridMonitoring(true) | .withHybridMonitoring(true) | ||
.withMonitoredHttpsDomains("https://<domain1>", "https://<domain2>") | .withMonitoredHttpsDomains("https://<domain1>", "https://<domain2>") | ||
Строка 980: | Строка 980: | ||
=== Инструмент<code>WebView</code> === | === Инструмент<code>WebView</code> === | ||
Чтобы обеспечить обмен данными между RUM JavaScript и | Чтобы обеспечить обмен данными между RUM JavaScript и ЕдиныйАгент для Android, <code>WebView</code>перед загрузкой URL-адреса все объекты необходимо обработать с помощью <code>WebView.loadUrl(String)</code>. Инструментируйте <code>Astromkey.instrumentWebView</code>метод для каждого <code>WebView</code>, который содержит RUM JavaScript. Без этого данные мониторинга не могут быть связаны с одним и тем же сеансом. | ||
'''Java:''' | '''Java:''' | ||
< | <WebView myWebView = (WebView) findViewById(R.id.webview); | ||
Astromkey.instrumentWebView(myWebView); | |||
myWebView.loadUrl("<nowiki>http://www.example.com</nowiki>");</code> | myWebView.loadUrl("<nowiki>http://www.example.com</nowiki>");</code> | ||
'''Kotlin:''' | '''Kotlin:''' | ||
< | <val myWebView: WebView = findViewById(R.id.webview) | ||
Astromkey.instrumentWebView(myWebView) | |||
myWebView.loadUrl("<nowiki>http://www.example.com</nowiki>")</code> | myWebView.loadUrl("<nowiki>http://www.example.com</nowiki>")</code> | ||
Из соображений безопасности этот вызов API игнорируется на устройствах с версиями API 15 и 16. | Из соображений безопасности этот вызов API игнорируется на устройствах с версиями API 15 и 16. | ||
=== Сохраняйте файлы cookie | === Сохраняйте файлы cookie АппОптима === | ||
Для гибридных приложений важно убедиться, что файлы cookie | Для гибридных приложений важно убедиться, что файлы cookie АппОптима не удалены. Без этих файлов cookie АппОптима не может объединить данные мониторинга из RUM JavaScript и ЕдиныйАгент для Android в один сеанс. | ||
Когда вы удаляете файлы cookie с помощью <code>CookieManager#removeAllCookies(ValueCallback)</code>или <code>CookieManager#removeSessionCookies(ValueCallback)</code>, вы также должны вызвать <code>restoreCookies</code>метод для восстановления файлов cookie | Когда вы удаляете файлы cookie с помощью <code>CookieManager#removeAllCookies(ValueCallback)</code>или <code>CookieManager#removeSessionCookies(ValueCallback)</code>, вы также должны вызвать <code>restoreCookies</code>метод для восстановления файлов cookie АппОптима. | ||
'''Java:''' | '''Java:''' | ||
< | <CookieManager.getInstance().removeAllCookies(null); | ||
Astromkey.restoreCookies();</code> | |||
'''Kotlin:''' | '''Kotlin:''' | ||
< | <CookieManager.getInstance().removeAllCookies(null) | ||
Astromkey.restoreCookies()</code> | |||
== Включить балансировку нагрузки == | == Включить балансировку нагрузки == | ||
ЕдиныйАгент позволяет включить балансировку нагрузки на стороне клиента, что помогает избежать несбалансированной нагрузки на сервер, когда несколько ЕдиныыхАгентов одновременно устанавливают соединение с АктивномШлюзе. | |||
'''Java:''' | '''Java:''' | ||
< | <new AstromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconURL>") | ||
.withStartupLoadBalancing(true) | .withStartupLoadBalancing(true) | ||
.buildConfiguration();</code> | .buildConfiguration();</code> | ||
'''Kotlin:''' | '''Kotlin:''' | ||
< | <AstromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconURL>") | ||
.withStartupLoadBalancing(true) | .withStartupLoadBalancing(true) | ||
.buildConfiguration()</code> | .buildConfiguration()</code> |
Текущая версия от 03:39, 21 декабря 2024
Используйте ЕдиныйАгент SDK для Android, чтобы сообщать дополнительные сведения о сеансах пользователей в своем мобильном приложении. ЕдиныйАгент SDK для Android позволяет создавать настраиваемые действия, сообщать об ошибках, отмечать конкретных пользователей и т. д. В разделах ниже объясняется, как включить эти возможности.
Вы можете использовать ЕдиныйАгент SDK в Java и Kotlin.
Запустить ЕдиныйАгент
Если вы отключили автоматический запуск с помощью autoStart.enabled
свойства или используете автономное ручное инструментирование вместо автоматического, запустите ЕдиныйАгент вручную в Application.onCreate
методе. Используйте astromkey.startup(Application, Configuration)
метод API.
Java:
<public class YourApplication extends Application { @Override public void onCreate() { super.onCreate(); // provide the application context as parameter astromkey.startup(this, new astromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconUrl>") ... // additional configuration .buildConfiguration()); } }
Kotlin:
<class YourApplication : Application() { override fun onCreate() { super.onCreate() // provide the application context as parameter astromkey.startup(this, astromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconUrl>") ... // additional configuration .buildConfiguration()) } }
Если вам нужно запустить ЕдиныйАгент на более позднем этапе, используйте astromkey.startup(Activity, Configuration)
метод API. Вы должны предоставить актив Activity
в качестве параметра, чтобы ЕдиныйАгент мог немедленно отслеживать его.
Java:
<astromkey.startup(yourActiveActivity, new astromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconUrl>") ... // additional configuration .buildConfiguration());
Kotlin:
<astromkey.startup(yourActiveActivity, astromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconUrl>") ... // additional configuration .buildConfiguration())
Запустите ЕдиныйАгент в ЕдиныйАгент для Android версии 8.229 и более ранних версий.
ЕдиныйАгент для Android версии 8.229 и более ранних версий
Если вы отключили автоматический запуск с помощью autoStart.enabled
свойства или используете автономное ручное инструментирование вместо автоматического, запустите ЕдиныйАгент вручную в Application.onCreate
методе.
Java:
<public class YourApplication extends Application { @Override public void onCreate() { super.onCreate(); astromkey.startup(this, new astromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconUrl>") ... // additional configuration .buildConfiguration()); } }
Kotlin:
<class YourApplication : Application() { override fun onCreate() { super.onCreate() astromkey.startup(this, astromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconUrl>") ... // additional configuration .buildConfiguration()) } }
Если ваше приложение поддерживает прямую загрузку, убедитесь, что astromkey.startup
оно никогда не вызывается из компонента, поддерживающего прямую загрузку. Также см. раздел Настройка связи с ЕдиныйАгент SDK для Android , чтобы убедиться, что ЕдиныйАгент может передавать данные в кластер АппОптима.
Настроить ЕдиныйАгент
Используйте класс astromkeyConfigurationBuilder для настройки параметров ЕдиногоАгента.
Java:
<new astromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconURL>") .withUserOptIn(true) .withCrashReporting(true) .buildConfiguration();
Kotlin:
<AstromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconURL>") .withUserOptIn(true) .withCrashReporting(true) .buildConfiguration()
Если вы используете комбинацию ручного и автоматического инструментирования, автоматическое инструментирование вводит вызов Astromkey.startup
в Application.onCreate
метод. В этом случае введенный Astromkey.startup
вызов вызывается перед вашим ручным Astromkey.startup
вызовом, поэтому ваша ручная настройка игнорируется.
Используйте это autoStart.enabled
свойство, чтобы деактивировать функцию автозапуска из автоинструментации. Затем вы можете определить ручной Astromkey.startup
вызов . В этом случае вы можете переопределить значения, предварительно настроенные из автоинструментации.
Мониторинг действий пользователя
С помощью мониторинга действий пользователя вы можете определять и сообщать о пользовательских действиях. Затем вы можете дополнить эти настраиваемые действия, используя следующие операции мониторинга:
- Создать дочернее действие
- Сообщить о событии
- Сообщить значение
- Сообщить об ошибке
- Прикрепите веб-запрос к действию пользователя
Пользовательские действия отличаются от действий пользователя, созданных с помощью плагина Astromkey для Android Gradle. ЕдиныйАгент не добавляет автоматически дополнительные события, такие как веб-запросы, в настраиваемые действия или закрытие настраиваемых действий. Однако, когда ЕдиныйАгент завершает работу или должен начать новый сеанс, он закрывает все открытые дополнительные действия.
Создание настраиваемых действий
Вы можете создавать собственные действия и дополнять их дополнительной информацией. Если настраиваемые действия не закрыты явно, ЕдиныйАгент закрывает их и отправляет в кластерАппОптима.
Вызов enterAction
для запуска пользовательского действия и leaveAction
закрытия пользовательского действия. Время измеряется автоматически.
Java:
<// start a custom action DTXAction action = Astromkey.enterAction("Tap on Search"); // ...do some work here... // end a custom action action.leaveAction();
Kotlin:
<// start a custom action val action = Astromkey.enterAction("Tap on Search") // ...do some work here... // end a custom action action.leaveAction()
Для пользовательского мобильного действия или мобильного действия пользователя, сгенерированного автоматически, максимальная длина имени составляет 250 символов.
Максимальная продолжительность пользовательского действия для мобильных устройств составляет 9 минут.
Если пользовательское действие занимает более 9 минут и не закрывается, такое действие отбрасывается и не сообщается АппОптима.
Создание дочерних действий
Дочерние действия аналогичны родительским действиям. Когда родительское действие закрывается, ЕдиныйАгент автоматически закрывает все дочерние действия родительского действия.
Создайте дочерние действия с помощью Astromkey.enterAction(String, DTXAction)
метода.
Java:
<// start a parent custom action DTXAction parentAction = Astromkey.enterAction("Tap on Search"); // ...do some work here... // start a child action DTXAction childAction = Astromkey.enterAction("Tap on Confirm", parentAction); // ...do some work here... // end a child action childAction.leaveAction(); // ...do some work here... // end a parent custom action parentAction.leaveAction();
Kotlin:
<// start a parent custom action val parentAction = Astromkey.enterAction("Tap on Search") // ...do some work here... // start a child action val childAction = Astromkey.enterAction("Tap on Confirm", parentAction) // ...do some work here... // end a child action childAction.leaveAction() // ...do some work here... // end a parent custom action parentAction.leaveAction()
Для пользовательского мобильного действия или мобильного действия пользователя, сгенерированного автоматически, максимальная длина имени составляет 250 символов.
Отменить дополнительные действия
ЕдиныйАгент для Android версии 8.231+
Если вам нужно отменить уже созданное, но еще не выполненное пользовательское действие, используйте DTXAction#cancel()
вызов API.
При отмене действия удаляются все связанные с ним данные: все сообщаемые значения отбрасываются, а все дочерние действия отменяются. Также обратите внимание, что вы не можете отменить завершенное действие.
Java:
<// create a custom action DTXAction action = Astromkey.enterAction("Tap on Purchase"); try { // ...do some work here... performWork(); // close the custom action. All associated data is stored and sent to Astromkey action.leaveAction(); } catch(Exception e) { // cancel the custom action. All associated data is discarded. action.cancel(); }
Kotlin:
<// create a custom action val action = Astromkey.enterAction("Tap on Purchase") try { // ...do some work here... performWork() // close the custom action. All associated data is stored and sent to Astromkey action.leaveAction() } catch (e: Exception) { // cancel the custom action. All associated data is discarded. action.cancel() }
Определить состояние пользовательского действия
ЕдиныйАгент для Android версии 8.231+
Иногда полезно знать, открыто ли пользовательское действие и может ли оно использоваться для отчета о данных.
Чтобы проверить состояние пользовательского действия, используйте DTXAction#isFinished()
метод.
Пользовательское действие завершается, когда оно:
- Завершено через
DTXAction#leaveAction()
, или - Отменено через
DTXAction#cancel()
, или - Прервано ЕдинымАгентом(например, при завершении работы ЕдиногоАгента)
Обратите внимание, что вы не должны взаимодействовать с готовым пользовательским действием.
Образец кода пользовательского действия
В следующем фрагменте кода показан пример инструментирования вымышленного метода поиска, который отправляет веб-запрос на инструментированный сервер и анализирует полученный результат. Следующие инструментальные действия являются частью фрагмента кода:
- Создает пользовательское действие
- Сообщает значение
- Сообщает об ошибке
- Отслеживает веб-запрос
- Создает дочернее действие
Java:
<public boolean search(String query) { // [1a] start a parent custom action DTXAction searchAction = Astromkey.enterAction("Tap on Search"); // [2] report a value searchAction.reportValue("query", query); URL url; try { url = new URL("https://www.example.com/?query=" + query); } catch (MalformedURLException e) { // [3] report an error searchAction.reportError("invalid url", e); // [1b] end a parent custom action searchAction.leaveAction(); return false; } // [4.1] Generate a new unique tag associated with the custom action "Tap on Search" String uniqueRequestTag = searchAction.getRequestTag(); // [4.2] Generate a WebRequestTiming object based on the unique tag WebRequestTiming timing = Astromkey.getWebRequestTiming(uniqueRequestTag); Request request = new Request.Builder() .url(url) // [4.3] Place the Astromkey HTTP header on your web request .addHeader(Astromkey.getRequestTagHeader(), uniqueRequestTag) .build(); // [4.4] Start web request timing before the HTTP request is sent timing.startWebRequestTiming(); try (Response response = client.newCall(request).execute()) { if (!response.isSuccessful()) { // [4.5] Stop web request timing when a connection exception occurs timing.stopWebRequestTiming(url, response.code(), response.message()); return false; } String body = response.body().string(); // [4.5] Stop web request timing when the HTTP response is received and the response body is obtained timing.stopWebRequestTiming(url, response.code(), response.message()); // [5a] start a child action DTXAction parseAction = Astromkey.enterAction("Parse result", searchAction); parseResult(body); // [5b] end a child action parseAction.leaveAction(); return true; } catch (IOException e) { // [4.5] Stop web request timing when a connection exception occurs timing.stopWebRequestTiming(url, -1, e.toString()); return false; } finally { // [1b] end a parent custom action searchAction.leaveAction(); } }
Kotlin:
<fun search(query: String): Boolean { // [1a] start a parent custom action val searchAction = Astromkey.enterAction("Tap on Search") // [2] report a value searchAction.reportValue("query", query) var url: URL? = null try { url = URL("https://www.example.com/?query=$query") } catch (e: MalformedURLException) { // [3] report an error searchAction.reportError("invalid url", e) // [1b] end a parent custom action searchAction.leaveAction() return false } // [4.1] Generate a new unique tag associated with the custom action "Tap on Search" val uniqueRequestTag = searchAction.requestTag // [4.2] Generate a WebRequestTiming object based on the unique tag val timing = Astromkey.getWebRequestTiming(uniqueRequestTag) val request = Request.Builder() .url(url) // [4.3] Place the Astromkey HTTP header on your web request .addHeader(Astromkey.getRequestTagHeader(), uniqueRequestTag) .build() try { // [4.4] Start web request timing before the HTTP request is sent timing.startWebRequestTiming() client.newCall(request).execute().use { response -> if (!response.isSuccessful) { // [4.5] Stop web request timing when a connection exception occurs timing.stopWebRequestTiming(url, response.code, response.message) return false } val body = response.body!!.string() // [4.5] Stop web request timing when the HTTP response is received and the response body was obtained timing.stopWebRequestTiming(url, response.code, response.message) // [5a] start a child action val parseAction = Astromkey.enterAction("Parse result", searchAction) parseResult(body) // [5b] end a child action parseAction.leaveAction() } return true } catch (e: IOException) { // [4.5] Stop web request timing when a connection exception occurs timing.stopWebRequestTiming(url, -1, e.toString()) return false } finally { // [1b] end a parent custom action searchAction.leaveAction() } }
Отчеты о пользовательских значениях
Используя ЕдиныйАгент SDK для Android, вы можете сообщать о событиях, значениях и ошибках. Сообщенные события, значения и ошибки, которые являются частью действия пользователя, затем отображаются в каскадном анализе действий пользователя. Сообщенные ошибки (как отдельные, так и «прикрепленные» к действию пользователя) также отображаются на странице сведений о сеансе пользователя и многомерной странице анализа действий пользователя .
Сообщить о событии
С помощью reportEvent
вы можете сообщить о конкретном событии. Сообщаемое событие должно быть частью действия пользователя.
Java:
action.reportEvent("event_name");
Kotlin:
action.reportEvent("event_name")
Если вы хотите сообщать об отдельных событиях с большим количеством дополнительной информации, см. раздел Отчеты о бизнес-событиях .
Сообщить значение
Метод reportValue
позволяет вам сообщать свои собственные показатели. Эти показатели должны быть частью действия пользователя.
ЕдиныйАгент SDK позволяет сообщать показатели со следующими типами значений:
int
long
double
string
Метрики с типом long
поддерживаются для ЕдиныйАгент SDK версии 8.197+.
Java:
<// report int action.reportValue("int_metrics_name", 5); // report long action.reportValue("long_metrics_name", 5L); // report double action.reportValue("double_metrics_name", 5.6); // report string action.reportValue("string_metrics_name", "exampleValue");
Kotlin:
<// report int action.reportValue("int_metrics_name", 5) // report long action.reportValue("long_metrics_name", 5L) // report double action.reportValue("double_metrics_name", 5.6) // report string action.reportValue("string_metrics_name", "exampleValue")
Сообщить об ошибке
Метод reportError
отличается от reportValue
метода, поскольку он конкретно идентифицируется как событие типа ошибки.
ЕдиныйАгент SDK позволяет вам сообщать о следующем:
- Коды ошибок . Используйте
reportError(String, int)
метод. - Обработанные исключения . Используйте
reportError(String, Throwable)
метод.
Существует два варианта сообщения об ошибке. Вы можете сообщить об ошибке как о части действия пользователя или как об отдельной ошибке, которая генерируется как глобальное событие, не привязанное к конкретному действию пользователя.
Ошибка в действии пользователя
Java:
<// report an error code action.reportError("error_code_name", -1); // report an exception action.reportError("exception_name", exception);
Kotlin:
<// report an error code action.reportError("error_code_name", -1) // report an exception action.reportError("exception_name", exception)
Автономная ошибка
Вы можете сообщать об отдельных событиях ошибок через Astromkey
класс.
Java:
<// report an error code Astromkey.reportError("error_code_name", -1); // report an exception Astromkey.reportError("exception_name", exception);
Kotlin:
<// report an error code Astromkey.reportError("error_code_name", -1) // report an exception Astromkey.reportError("exception_name", exception)
Отчет о бизнес-событиях
ЕдиныйАгент для Android версии 8.253+
С помощью sendBizEvent
вы можете сообщать о деловых событиях. Это автономные события, поскольку ЕдиныйАгент отправляет их отдельно от действий пользователя или сеансов пользователя.
Дополнительные сведения о бизнес-событиях см. в разделе Бизнес-аналитика в Astromkey .
Java:
<JSONObject attributes = new JSONObject(); try { attributes.put("event.name", "Confirmed Booking"); attributes.put("screen", "booking-confirmation"); attributes.put("product", "Danube Anna Hotel"); attributes.put("amount", 358.35); attributes.put("currency", "USD"); attributes.put("reviewScore", 4.8); attributes.put("arrivalDate", "2022-11-05"); attributes.put("departureDate", "2022-11-15"); attributes.put("journeyDuration", 10); attributes.put("adultTravelers", 2); attributes.put("childrenTravelers", 0); Astromkey.sendBizEvent("com.easytravel.funnel.booking-finished", attributes); } catch (JSONException e) { // handle exception }
Kotlin:
<try { JSONObject().apply { put("event.name", "Confirmed Booking") put("screen", "booking-confirmation") put("product", "Danube Anna Hotel") put("amount", 358.35) put("currency", "USD") put("reviewScore", 4.8) put("arrivalDate", "2022-11-05") put("departureDate", "2022-11-15") put("journeyDuration", 10) put("adultTravelers", 2) put("childrenTravelers", 0) }.also { jsonObject-> Astromkey.sendBizEvent("com.easytravel.funnel.booking-finished", jsonObject) } } catch (e: JSONException) { // handle exception }
Мониторинг жизненного цикла
ЕдиныйАгент для Android версии 8.223+
При мониторинге жизненного цикла ЕдиныйАгент собирает следующие данные:
- Отображение активности : измеряет временной интервал от
Activity.onCreate(Bundle)
доActivity.onPostResume()
и сообщает время каждого введенного состояния жизненного цикла активности. - Повторное отображение действия : измеряет время, необходимое для повторного отображения ранее созданного действия, и сообщает время каждого состояния жизненного цикла действия, которое было введено до тех пор, пока действие снова не станет видимым.
Мониторинг жизненного цикла активности включен по умолчанию, но вы можете отключить его с помощью withActivityMonitoring
метода.
Java:
<new AstromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconURL>") .withActivityMonitoring(false) .buildConfiguration();
Kotlin:
<AstromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconURL>") .withActivityMonitoring(false) .buildConfiguration()
Мониторинг веб-запросов
Плагин Astromkey для Android Gradle автоматически обрабатывает большинство веб-запросов. Однако вам придется вручную обрабатывать запросы в следующих случаях:
- Когда запросы стороннего фреймворка не инструментированы
- Когда вам нужно сообщать о запросах, отличных от HTTP(S)
- Если вы отключили мониторинг веб-запросов
Для запросов HTTP(S) никогда не сочетайте автоматическую и ручную инструментацию веб-запросов. Однако вы можете использовать автоматическое инструментирование для HTTP(S)-запросов и ручное инструментирование для не-HTTP(S)-запросов .
Чтобы отслеживать веб-запросы, добавьте x-astromkey
заголовок HTTP с уникальным значением в веб-запрос. Это необходимо для сопоставления данных мониторинга на стороне сервера с соответствующим мобильным веб-запросом. Кроме того, необходимо измерить значения синхронизации с мобильной стороны.
Мониторинг веб-запроса
- Создайте новый уникальный тег.
- Создайте
WebRequestTiming
объект на основе тега. - Поместите HTTP-заголовок Astromkey в свой веб-запрос.
- Начать отсчет времени веб-запроса до отправки HTTP-запроса.
- Остановить синхронизацию веб-запросов.
- Получен HTTP-ответ и тело ответа.
- Возникает исключение соединения.
Существует два типа веб-запросов с точки зрения их иерархии:
- Запросы, прикрепленные к действию пользователя
- Автономные запросы . Для этих запросов ЕдиныйАгент автоматически пытается найти подходящее действие пользователя. Если он находит его, веб-запрос прикрепляется к действию пользователя. Веб-запрос сообщается как отдельный веб-запрос только в том случае, если не найдено подходящего действия пользователя. В настоящее время вы не можете просматривать отдельные запросы в сегментации сеансов .
Прикрепите веб-запрос к действию пользователя
Чтобы прикрепить веб-запрос к действию пользователя, сгенерируйте уникальный тег с помощью DTXAction.getRequestTag()
метода.
В следующем примере показано, как присоединить синхронный OkHttp
веб-запрос к "Search request"
действию пользователя.
Java:
<URL url = new URL("https://www.example.com"); // First, create a custom action DTXAction webAction = Astromkey.enterAction("Search request"); // [1] Generate a new unique tag associated with the user action String uniqueRequestTag = webAction.getRequestTag(); // [2] Generate a WebRequestTiming object based on the unique tag WebRequestTiming timing = Astromkey.getWebRequestTiming(uniqueRequestTag); // Define your OkHttp request. This varies greatly depending on your implementation Request request = new Request.Builder() .url(url) // Define your headers for the OkHttp request .addHeader(yourKey1, yourValue1) .addHeader(yourKey2, yourValue2) // [3] Place the Astromkey HTTP header on your web request .addHeader(Astromkey.getRequestTagHeader(), uniqueRequestTag) .build(); // [4] Start web request timing before the HTTP request is sent timing.startWebRequestTiming(); try (Response response = client.newCall(request).execute()) { if (response.isSuccessful()) { // handle response String body = response.body().string(); } // [5.1] Stop web request timing when the HTTP response is received and the response body was obtained timing.stopWebRequestTiming(url, response.code(), response.message()); } catch (IOException e) { // [5.2] Stop web request timing when a connection exception occurs timing.stopWebRequestTiming(url, -1, e.toString()); // user-defined exception handling } finally { // Lastly, end the custom action webAction.leaveAction(); }
Kotlin:
<val url = URL("https://www.example.com") // First, create a custom action val webAction = Astromkey.enterAction("Search request") // [1] Generate a new unique tag associated with the user action val uniqueRequestTag = webAction.requestTag // [2] Generate a WebRequestTiming object based on the unique tag val timing = Astromkey.getWebRequestTiming(uniqueRequestTag) // Define your OkHttp request. This varies greatly depending on your implementation val request = Request.Builder() .url(url) // Define your headers for the OkHttp request .addHeader(yourKey1, yourValue1) .addHeader(yourKey2, yourValue2) // [3] Place the Astromkey HTTP header on your web request .addHeader(Astromkey.getRequestTagHeader(), uniqueRequestTag) .build() try { // [4] Start web request timing before the HTTP request is sent timing.startWebRequestTiming() client.newCall(request).execute().use { response -> if (response.isSuccessful) { // handle response val body = response.body!!.string() } // [5.1] Stop web request timing when the HTTP response is received and the response body was obtained timing.stopWebRequestTiming(url, response.code, response.message) } } catch (e: IOException) { // [5.2] Stop web request timing when a connection exception occurs timing.stopWebRequestTiming(url, -1, e.toString()) // user-defined exception handling } finally { // Lastly, end the custom action webAction.leaveAction() }
Прикрепите асинхронный веб-запрос OkHttp к действию пользователя.
Java:
<final URL url = new URL("https://www.example.com"); // First, create a custom action final DTXAction webAction = Astromkey.enterAction("Search request"); // [1] Generate a new unique tag associated with the user action String uniqueRequestTag = webAction.getRequestTag(); // [2] Generate a WebRequestTiming object based on the unique tag final WebRequestTiming timing = Astromkey.getWebRequestTiming(uniqueRequestTag); // Define your OkHttp request. This varies greatly depending on your implementation Request request = new Request.Builder() .url(url) // Define your headers for the OkHttp request .addHeader(yourKey1, yourValue1) .addHeader(yourKey2, yourValue2) // [3] Place the Astromkey HTTP header on your web request .addHeader(Astromkey.getRequestTagHeader(), uniqueRequestTag) .build(); // [4] Call startWebRequestTiming to begin the timing, and then handle the response body from the OkHttp call timing.startWebRequestTiming(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { // [5.2] Stop web request timing when a connection exception occurs timing.stopWebRequestTiming(url, -1, e.toString()); // user-defined exception handling // [8] Lastly, end the custom action webAction.leaveAction(); } @Override public void onResponse(Call call, Response response) throws IOException { try (ResponseBody responseBody = response.body()) { if (response.isSuccessful()) { // handle response String body = response.body().string(); } // [5.1] Stop web request timing when the HTTP response is received and the response body was obtained timing.stopWebRequestTiming(url, response.code(), response.message()); // Lastly, end the custom action webAction.leaveAction(); } } });
Kotlin:
<val url = URL("https://www.example.com") // First, create a custom action val webAction = Astromkey.enterAction("Search request") // [1] Generate a new unique tag associated with the user action val uniqueRequestTag = webAction.requestTag // [2] Generate a WebRequestTiming object based on the unique tag val timing = Astromkey.getWebRequestTiming(uniqueRequestTag) // Define your OkHttp request. This varies greatly depending on your implementation val request = Request.Builder() .url(url) // Define your headers for the OkHttp request .addHeader(yourKey1, yourValue1) .addHeader(yourKey2, yourValue2) // [3] Place the Astromkey HTTP header on your web request .addHeader(Astromkey.getRequestTagHeader(), uniqueRequestTag) .build() // [4] Call startWebRequestTiming to begin the timing, and then handle the response body from the OkHttp call timing.startWebRequestTiming() client.newCall(request).enqueue(objectq: Callback { override fun onFailure(call: Call, e: IOException) { // [5.2] Stop web request timing when a connection exception occurs timing.stopWebRequestTiming(url, -1, e.toString()) // user-defined exception handling // [8] Lastly, end the custom action webAction.leaveAction() } @Throws(IOException::class) override fun onResponse(call: Call, response: Response) { response.use { if (response.isSuccessful) { // handle response val body = response.body!!.string() } // [5.1] Stop web request timing when the HTTP response is received and the response body was obtained timing.stopWebRequestTiming(url, response.code, response.message) // Lastly, end the custom action webAction.leaveAction() } } })
Мониторинг автономного веб-запроса
Чтобы отслеживать веб-запрос как отдельный запрос, создайте уникальный тег с помощью Astromkey.getRequestTag()
метода.
В следующем примере показано, как отслеживать синхронный OkHttp
веб-запрос.
Java:
<URL url = new URL("https://www.example.com"); // [1] Generate a new unique tag String uniqueRequestTag = Astromkey.getRequestTag(); // [2] Generate a WebRequestTiming object based on the unique tag WebRequestTiming timing = Astromkey.getWebRequestTiming(uniqueRequestTag); // Define your OkHttp request. This varies greatly depending on your implementation Request request = new Request.Builder() .url(url) // Define your headers for the OkHttp request .addHeader(yourKey1, yourValue1) .addHeader(yourKey2, yourValue2) // [3] Place the Astromkey HTTP header on your web request .addHeader(Astromkey.getRequestTagHeader(), uniqueRequestTag) .build(); // [4] Start web request timing before the HTTP request is sent timing.startWebRequestTiming(); try (Response response = client.newCall(request).execute()) { if (response.isSuccessful()) { // handle response String body = response.body().string(); } // [5.1] Stop web request timing when the HTTP response is received and the response body was obtained timing.stopWebRequestTiming(url, response.code(), response.message()); } catch (IOException e) { // [5.2] Stop web request timing when a connection exception occurs timing.stopWebRequestTiming(url, -1, e.toString()); // user-defined exception handling }
Kotlin:
<val url = URL("https://www.example.com") // [1] Generate a new unique tag val uniqueRequestTag = Astromkey.getRequestTag() // [2] Generate a WebRequestTiming object based on the unique tag val timing = Astromkey.getWebRequestTiming(uniqueRequestTag) // Define your OkHttp request. This varies greatly depending on your implementation val request = Request.Builder() .url(url) // Define your headers for the OkHttp request .addHeader(yourKey1, yourValue1) .addHeader(yourKey2, yourValue2) // [3] Place the Astromkey HTTP header on your web request .addHeader(Astromkey.getRequestTagHeader(), uniqueRequestTag) .build() try { // [4] Start web request timing before the HTTP request is sent timing.startWebRequestTiming() client.newCall(request).execute().use { response -> if (response.isSuccessful) { // handle response val body = response.body!!.string() } // [5.1] Stop web request timing when the HTTP response is received and the response body was obtained timing.stopWebRequestTiming(url, response.code, response.message) } } catch (e: IOException) { // [5.2] Stop web request timing when a connection exception occurs timing.stopWebRequestTiming(url, -1, e.toString()) // user-defined exception handling }
Мониторинг запросов, отличных от HTTP(S)
ЕдиныйАгент для Android версии 8.249+
Мониторинг соединений WebSocket доступен начиная с ЕдиногоАгента для Android версии 8.239. Мониторинг всех не-HTTP(S) запросов доступен начиная с ЕдиногоАгента для Android версии 8.249.
ЕдиныйАгент для Android не поддерживает автоматическую обработку запросов, отличных от HTTP(S). Если вам нужно сообщить о таких запросах, как запрос WebSocket (начинается с ws://
или wss://
), проверьте приведенные ниже примеры кода.
- Используйте
stopWebRequestTiming(URI requestUri, int respCode, String respPhrase)
метод API для ручной обработки запросов, отличных от HTTP(S). - Обязательно передайте исходный URI. Не извлекайте URI из
OkHttp
объекта, так как это не возвращает исходный URI. - Этот подход подходит только для соединений WebSocket, которые открыты примерно до 9 минут. О более длительных соединениях может не сообщаться.
- Если у вас есть только не-HTTP(S) запросы, вы можете при желании отключить мониторинг веб-запросов .
- Если у вас есть как HTTP(S), так и не-HTTP(S) запросы, и HTTP(S) запросы автоматически инструментируются, не отключайте мониторинг веб-запросов.
Java:
<final URI uri = URI.create("wss://websocket.example.com"); // First, create a custom action DTXAction webSocketAction = Astromkey.enterAction("WebSocket"); // Generate a WebRequestTiming object based on the unique request tag WebRequestTiming timing = Astromkey.getWebRequestTiming(webSocketAction.getRequestTag()); // Define your OkHttp request. This varies greatly depending on your implementation Request request = new Request.Builder() .url(uri.toString()) .build(); // Start web request timing when you are about to open a WebSocket connection timing.startWebRequestTiming(); WebSocket webSocket = client.newWebSocket(request, new WebSocketListener() { @Override public void onClosing(@NonNull WebSocket webSocket, int code, @NonNull String reason) { // Stop web request timing when the webSocket connection closes // Don't retrieve the URI from the OkHttp object because it always replaces wss:// with https:// timing.stopWebRequestTiming(uri, code, reason); // end the action webSocketAction.leaveAction(); } @Override public void onFailure(@NonNull WebSocket webSocket, @NonNull Throwable t, @Nullable Response response) { // Stop web request timing when the webSocket connection fails and customize the return code and message // Don't retrieve the URI from the OkHttp object because it always replaces wss:// with https:// timing.stopWebRequestTiming(uri, 1011, "ERROR"); // end the action webSocketAction.leaveAction(); } });
Kotlin:
<val uri = URI.create("wss://websocket.example.com") // First, create a custom action val webSocketAction = Astromkey.enterAction("WebSocket") // Generate a WebRequestTiming object based on the unique request tag val webRequestTiming = Astromkey.getWebRequestTiming(webSocketAction.requestTag) // Define your OkHttp request. This varies greatly depending on your implementation val request = Request.Builder() .url(uri.toString()) .build() // Start web request timing when you are about to open a WebSocket connection webRequestTiming.startWebRequestTiming() val webSocket = client.newWebSocket(request, objectq: WebSocketListener() { override fun onClosing(webSocket: WebSocket, code: Int, reason: String) { // Stop web request timing when the webSocket connection closes // Don't retrieve the URI from the OkHttp object because it always replaces wss:// with https:// webRequestTiming.stopWebRequestTiming(uri, code, reason) // end the action webSocketAction.leaveAction() } override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) { // Stop web request timing when the webSocket connection fails // Don't retrieve the URI from the OkHttp object because it always replaces wss:// with https:// webRequestTiming.stopWebRequestTiming(uri, 1011, "ERROR") // end the action webSocketAction.leaveAction() } })
Отчеты о сбоях
ЕдиныйАгент фиксирует все необработанные исключения и ошибки и немедленно отправляет отчет о сбое на сервер. Отчет о сбое Android включает время возникновения и полную трассировку стека исключения.
Вы можете отключить отчеты о сбоях, используя withCrashReporting
метод:
Java:
<new AstromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconURL>") .withCrashReporting(false) .buildConfiguration();
Kotlin:
<AstromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconURL>") .withCrashReporting(false) .buildConfiguration()
Отметить конкретных пользователей
Вы можете пометить каждого пользователя своих мобильных приложений уникальным именем пользователя. Это позволяет вам искать и фильтровать определенные сеансы пользователей и анализировать поведение отдельных пользователей с течением времени.
Следующие шаги объясняют, как пометить отдельного пользователя с помощью АппОптима API.
Java:
Astromkey.identifyUser("john.doe@example.com");
Kotlin:
Astromkey.identifyUser("john.doe@example.com")
ЕдиныйАгент для Android версии 237+
ЕдиныйАгент для Android версии 237+Сеансы, разделенные из-за простоя или тайм-аута продолжительности, автоматически повторно помечаются.
Когда ЕдиныйАгент завершает помеченный сеанс из-за того, что продолжительность сеанса достигла установленного предела, или из-за бездействия пользователя, последующий сеанс автоматически повторно помечается. Вам не нужно повторно предоставлять идентификационную информацию пользователя.
Однако обратите внимание, что ЕдиныйАгент не повторно помечает последующий сеанс в следующих случаях:
- Когда вы явно завершаете помеченный пользовательский сеанс через
endVisit
- Когда пользователь или мобильная операционная система закрывает или принудительно останавливает приложение
- Когда ЕдиныйАгент завершает текущий сеанс пользователя и создает новый сеанс после изменения настроек конфиденциальности.
См. Сеансы пользователей > Завершение сеанса , чтобы узнать, когда ЕдиныйАгент завершает сеанс мобильного пользователя.
Завершить сеанс
Вы можете принудительно завершить сеанс с помощью АппОптима API. Это также закрывает все открытые действия и запускает новый сеанс.
Java:
Astromkey.endVisit();
Kotlin:
Astromkey.endVisit()
Настроить конфиденциальность данных
В режиме согласия пользователя для мобильных приложений вы можете динамически настраивать параметры конфиденциальности данных и создавать свои приложения в соответствии с законами и нормами о защите данных.
Чтобы активировать режим согласия пользователя, включите userOptIn
флаг через DSL из плагина Astromkey Android Gradle или используйте ConfigurationBuilder.withUserOptIn
метод.
С помощью этого Astromkey.applyUserPrivacyOptions
метода вы можете настроить параметры конфиденциальности в зависимости от решения пользователя.
Java:
<Astromkey.applyUserPrivacyOptions(UserPrivacyOptions.builder() .withDataCollectionLevel(DataCollectionLevel.USER_BEHAVIOR) .withCrashReportingOptedIn(true) .build() );
Kotlin:
<Astromkey.applyUserPrivacyOptions(UserPrivacyOptions.builder() .withDataCollectionLevel(DataCollectionLevel.USER_BEHAVIOR) .withCrashReportingOptedIn(true) .build() )
ЕдиныйАгент сохраняет настройки конфиденциальности и автоматически применяет их при перезапуске приложения. Кроме того, ЕдиныйАгент создает новый сеанс всякий раз, когда параметры конфиденциальности изменяются с помощью этого Astromkey.applyUserPrivacyOptions
метода.
Вы также можете получить настройки конфиденциальности с помощью Astromkey.getUserPrivacyOptions
метода. Однако этот метод следует использовать после запуска ЕдиногоАгента.
Конфиденциальность данных в ЕдиномАгенте для Android версии 8.189 и более ранних:
ЕдиныйАгент для Android версии 8.189 и более ранних версий
С помощью этого Astromkey.setCrashReportingOptedIn(boolean)
метода вы можете активировать или деактивировать отчеты о сбоях. Уровень сбора данных можно изменить с помощью Astromkey.setDataCollectionLevel(DataCollectionLevel)
метода.
Вы можете получить настройки конфиденциальности с помощью методов Astromkey.getDataCollectionLevel()
и Astromkey.isCrashReportingOptedIn()
. Используйте методы API конфиденциальности после запуска ЕдиногоАгента.
Настройка гибридных приложений
Для гибридных приложений, использующих RUM JavaScript внутри WebView
(Android) или WKWebView
(iOS), файлы cookie должны быть установлены для каждого инструментированного домена или сервера, с которым взаимодействует приложение. Когда функция мониторинга гибридных приложений включена, ЕдиныйАгент создает эти файлы cookie для каждого указанного домена и сохраняет их в файлах CookieManager
.
Включить мониторинг гибридных приложений
Вы можете активировать функцию мониторинга гибридных приложений с помощью withHybridMonitoring
метода. Укажите все используемые домены, хосты и IP-адреса с помощью метода withMonitoredDomains
или withMonitoredHttpsDomains
. Начинайте домены и поддомены с точки ( .
).
withMonitoredDomains
метод
Java:
<new AstromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconURL>") .withHybridMonitoring(true) .withMonitoredDomains("<domain1>", "<domain2>") .buildConfiguration();
Kotlin:
<AstromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconURL>") .withHybridMonitoring(true) .withMonitoredDomains("<domain1>", "<domain2>") .buildConfiguration()
withMonitoredHttpsDomains
метод
ЕдиныйАгент для Android версии 8.237+
АппОптима позволяет добавить Secure
атрибут cookie для всех файлов cookie, установленных АппОптима. Это гарантирует, что браузер отправляет эти файлы cookie только через защищенные соединения.
Java:
<new AstromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconURL>") .withHybridMonitoring(true) .withMonitoredHttpsDomains("https://<domain1>", "https://<domain2>") .buildConfiguration();
Kotlin:
<AstromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconURL>") .withHybridMonitoring(true) .withMonitoredHttpsDomains("https://<domain1>", "https://<domain2>") .buildConfiguration()
ИнструментWebView
Чтобы обеспечить обмен данными между RUM JavaScript и ЕдиныйАгент для Android, WebView
перед загрузкой URL-адреса все объекты необходимо обработать с помощью WebView.loadUrl(String)
. Инструментируйте Astromkey.instrumentWebView
метод для каждого WebView
, который содержит RUM JavaScript. Без этого данные мониторинга не могут быть связаны с одним и тем же сеансом.
Java:
<WebView myWebView = (WebView) findViewById(R.id.webview); Astromkey.instrumentWebView(myWebView); myWebView.loadUrl("http://www.example.com");
Kotlin:
<val myWebView: WebView = findViewById(R.id.webview) Astromkey.instrumentWebView(myWebView) myWebView.loadUrl("http://www.example.com")
Из соображений безопасности этот вызов API игнорируется на устройствах с версиями API 15 и 16.
Сохраняйте файлы cookie АппОптима
Для гибридных приложений важно убедиться, что файлы cookie АппОптима не удалены. Без этих файлов cookie АппОптима не может объединить данные мониторинга из RUM JavaScript и ЕдиныйАгент для Android в один сеанс.
Когда вы удаляете файлы cookie с помощью CookieManager#removeAllCookies(ValueCallback)
или CookieManager#removeSessionCookies(ValueCallback)
, вы также должны вызвать restoreCookies
метод для восстановления файлов cookie АппОптима.
Java:
<CookieManager.getInstance().removeAllCookies(null); Astromkey.restoreCookies();
Kotlin:
<CookieManager.getInstance().removeAllCookies(null) Astromkey.restoreCookies()
Включить балансировку нагрузки
ЕдиныйАгент позволяет включить балансировку нагрузки на стороне клиента, что помогает избежать несбалансированной нагрузки на сервер, когда несколько ЕдиныыхАгентов одновременно устанавливают соединение с АктивномШлюзе.
Java:
<new AstromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconURL>") .withStartupLoadBalancing(true) .buildConfiguration();
Kotlin:
<AstromkeyConfigurationBuilder("<YourApplicationID>", "<ProvidedBeaconURL>") .withStartupLoadBalancing(true) .buildConfiguration()