Как получить пользовательские события Worklight 6.1 Analytics, работающие на iOS/Android/mobileWeb?
У меня возникают серьезные проблемы с работой пользовательских событий Worklight Analytics (WL v6.1).
Для моего окружения я использую последнюю версию 6.1.0.1 (0718). Мы установили Analytics на экземпляр AWS для разработки, и я указываю на это с помощью worklight.properties. Панель инструментов операционной аналитики доступна и показывает правильные базовые аналитические данные.
У меня проблемы в мобильных сетях (использую это только для разработчиков), iPhone и Android.
mobileWeb: размер очереди аналитики увеличивается навсегда и никогда не вызывает отправку. Я пробежал по коду в firebug, и он, похоже, использует устаревший метод WL.Client.isConnected(), который всегда возвращает false для mobileWeb. Так что я взломал это, чтобы вернуть true, и смог заставить mobileWeb работать должным образом: очередь очищается после 10 сообщений, и результат можно просмотреть в журнале консоли сервера Analytics. Это подтверждает, что сервер аналитики настроен как минимум правильно.
Симулятор iPhone: попытки отправки после того, как 10 сообщений были поставлены в очередь. Однако я получаю 400 от IHS на аналитическом сервере. Я попытался увеличить уровень журнала, но не смог произвести больше ничего:
<wl_server_ip> - - [11/Aug/2014:13:12:42 -0400] "POST /iwap/v1/events/_bulk HTTP/1.1" 400 335
Эмулятор Android: я вижу исключение TeaLeaf, когда вызывается отправка аналитики (после 10 сообщений в очереди):
08-11 13:32:16.970: E/UICAndroid(1748): TL Library Error: url:http://<analytics_ip>:80/iwap/v1/events/_bulk stream errorjava.util.zip.DataFormatException: stream error
08-11 13:32:16.970: E/UICAndroid(1748): at java.util.zip.Deflater.deflateImpl(Native Method)
08-11 13:32:16.970: E/UICAndroid(1748): at java.util.zip.Deflater.deflateImpl(Deflater.java:241)
08-11 13:32:16.970: E/UICAndroid(1748): at java.util.zip.Deflater.deflate(Deflater.java:232)
08-11 13:32:16.970: E/UICAndroid(1748): at java.util.zip.DeflaterOutputStream.flush(DeflaterOutputStream.java:193)
08-11 13:32:16.970: E/UICAndroid(1748): at com.tl.uic.util.HTTPUtil.createEntity(HTTPUtil.java:93)
08-11 13:32:16.970: E/UICAndroid(1748): at com.tl.uic.util.HTTPUtil.sendPost(HTTPUtil.java:181)
08-11 13:32:16.970: E/UICAndroid(1748): at com.tl.uic.util.HTTPUtil.sendHttpPost(HTTPUtil.java:115)
08-11 13:32:16.970: E/UICAndroid(1748): at com.tl.uic.util.PostTask.sendMessageFormat(PostTask.java:72)
08-11 13:32:16.970: E/UICAndroid(1748): at com.tl.uic.util.PostTask.doInBackground(PostTask.java:28)
08-11 13:32:16.970: E/UICAndroid(1748): at com.tl.uic.util.PostTask.doInBackground(PostTask.java:1)
08-11 13:32:16.970: E/UICAndroid(1748): at android.os.AsyncTask$2.call(AsyncTask.java:288)
08-11 13:32:16.970: E/UICAndroid(1748): at java.util.concurrent.FutureTask.run(FutureTask.java:237)
08-11 13:32:16.970: E/UICAndroid(1748): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
08-11 13:32:16.970: E/UICAndroid(1748): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
08-11 13:32:16.970: E/UICAndroid(1748): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
08-11 13:32:16.970: E/UICAndroid(1748): at java.lang.Thread.run(Thread.java:841)
Вот самый базовый вызов аналитики, по сути, вырезка / вставка из Инфоцентра WL 6.1:
function doBetterAnalyticsWork(i) {
WL.Analytics.log({hello: 'world ' + i}, 'test-analytics')
.always(function(wasQueueFlushed, errObj){
if (wasQueueFlushed) {
WL.Logger.debug('The queue was flushed');
} else {
WL.Logger.debug('The queue was NOT flushed');
}
if (typeof errObj === 'object') {
WL.Logger.error('Error trying to flush the queue', errObj);
}
});
WL.Logger.debug('WL.Analytics.state(): ' + JSON.stringify(WL.Analytics.state()));
}
Я повторяю это 10 раз в цикле for, чтобы инициировать отправку аналитики. Между прочим, я никогда не получаю сообщение "Очередь была сброшена", но, похоже, по крайней мере предпринимается попытка отправки на iPhone/Android.
Любая помощь приветствуется. Я могу предоставить больше информации по мере необходимости.
2 ответа
mobileWeb: я буду следить за необходимостью избегать использования WL.Client.isConnected
iOS: джнорти верен; клиент не должен знать URL-адрес сервера аналитики. Если в какой-то момент у вас был адрес в файле TLFConfigurableItems.plist, вы запустили свое приложение, а затем заменили значение в TLFConfigurableItems.plist на @USE_WORKLIGHT_DEFAULT@, старое жестко запрограммированное значение могло сохраниться, и вам следует удалить / переустановить приложение или очистите все данные и попробуйте снова.
Android: та же история, что и в iOS. Если файл TLFConfigurableItems.properties использовался с жестко заданным значением, это значение сохранялось, и вам потребуется удалить / переустановить приложение или удалить все данные и повторить попытку.
Кроме того, какую версию Android вы тестируете? Kitkat изменил поведение DeflaterOutputStream таким образом, что если вы вызываете flush() после finish(), генерируется исключение. Версия библиотеки Tealeaf, которая у вас есть, вероятно, делает именно это, и поэтому вам нужна более новая фиксированная версия библиотеки Tealeaf на Android, чтобы учесть изменение в поведении Android DeflaterOutputStream.
Редактировать:
После второго взгляда я вижу еще одну проблему:
Ошибка библиотеки TL: URL:http://:80/iwap/v1/events/_bulk stream errorjava.util.zip.DataFormatException: ошибка потока
а также
- - [11/Aug/2014:13:12:42 -0400] "POST /iwap/v1/events/_bulk HTTP/1.1" 400 335
Ваши клиенты отправляют данные напрямую в "/iwap/v1/events/_bulk"? Данные клиента никогда не должны идти напрямую на сервер аналитики. Он должен пройти через сервер рабочего освещения, а затем сервер рабочего освещения перенаправит его на сервер аналитики. Вы настроили свой клиентский код, чтобы он указывал на "/iwap/v1/events/_bulk"? Если вы удалите эту конфигурацию, она должна по умолчанию использовать правильное расположение, указывающее на сервер рабочего освещения.
Оригинал:
В Worklight 6.1 Worklight использует Tealeaf под крышками для сбора и отправки аналитических данных. Когда аналитические данные отправляются в Tealeaf в цикле, по какой-то причине они не выполняются. Вместо того чтобы делать вызовы в цикле, попробуйте вручную сделать вызов WL.Analytics.log с помощью кнопки.