Статьи

Использование новой реликвии для мониторинга вашего Android-приложения

Как бы ни были интересны веб-приложения, они не единственная игра в городе. В наши дни мобильные приложения являются важной частью ландшафта разработки программного обеспечения. Как и в случае с веб-приложениями, мы хотим, чтобы код нашего мобильного приложения был производительным.

К счастью, в прошлом году или два, New Relic был сосредоточен на создание трудно найти решение для мониторинга производительности мобильных приложений . Сегодня мы рассмотрим, как вы можете начать использовать New Relic для мониторинга производительности приложения Android .

Самое замечательное в создании веб-приложения заключается в том, что вы всегда можете развернуть новую версию, мгновенно вынуждая всю пользовательскую базу использовать ваш новый код. Так что, если вы раньше не отслеживали свой код, вы можете легко подключить New Relic или взломать что-то нестандартное, запустить его и начать получать метрики в течение нескольких минут.

С мобильными приложениями вам не так повезло. Конечно, вы можете выпустить новую версию в любое время, но этот процесс потенциально более длительный — например, одобрение магазина приложений. И даже когда ваша новая версия уже там, вы не можете заставить своих пользователей обновиться. Поэтому важно подумать о любом виде мониторинга, который вы можете захотеть сделать, прежде чем выпускать первую версию своего приложения.

Даже если вам не нужно некоторое время беспокоиться о производительности вашего приложения, как только вы это сделаете, ваше решение для мониторинга уже будет на месте, вам просто нужно начать интерпретировать метрики.

Кроме того, в наши дни это редкое мобильное приложение, в котором нет веб-компонента. В наши дни практически каждое приложение отправляет HTTP-запросы к API, а зачастую и к множеству различных API.

Как известно, сетевые звонки не всегда самые надежные вещи . Было бы замечательно, если бы мы могли выяснить, как часто вызовы API терпят неудачу для наших пользователей и, что более важно, насколько медленные наши вызовы API в среднем. Это единственный способ узнать, имеют ли наши пользователи хороший опыт работы с нашим приложением или они расстроены отставанием.

Если вы не контролируете свое приложение, вы можете только догадываться об этом. Я не знаю как вы, но обычно мне намного легче с холодными данными.

Есть много других важных вопросов, на которые может помочь хорошее решение по мониторингу, но мы можем ответить на них, работая с нашим Android-приложением, так что давайте начнем.

Как правило, для вводной статьи, подобной этой, я бы хотел сосредоточиться на данной теме — в данном случае на New Relic для мобильных устройств — и оставить остальную часть кода как Hello World, насколько это возможно.

Создать приложение Hello World для Android легко, у Google даже есть учебник по этому вопросу . К сожалению, это приложение слишком простое. Он не выполняет сетевых вызовов, а это значит, что мы не сможем посмотреть большую часть того, что New Relic предлагает для мониторинга мобильных приложений. Итак, мы немного изменим наше основное приложение.

Наше приложение будет иметь два экрана, на первом экране мы сможем ввести дескриптор Twitter и отправить его. На этом этапе наше приложение перейдет на второй экран и отобразит текст-заполнитель. Тем временем наше приложение выйдет в Twitter и загрузит последний твит для этой ручки. Как только твит станет доступен, мы обновим второй экран, чтобы отобразить его. Приложение все еще довольно простое, но, надеюсь, оно достаточно сложное, чтобы мы могли получить некоторые интересные данные из New Relic.

Я не собираюсь проходить настройку всего приложения, но вот интересные части. В соответствии с руководством Google , когда мы нажимаем кнопку на первом экране, она передает значение текстового поля на второй экран, но в нашем случае это будет дескриптор Twitter:

1
2
3
4
5
6
7
public void sendMessage(View view) {
    Intent intent = new Intent(this, DisplayMessageActivity.class);
    EditText editText = (EditText) findViewById(R.id.edit_message);
    String message = editText.getText().toString();
    intent.putExtra(EXTRA_MESSAGE, message);
    startActivity(intent);
}

На втором экране мы хотим получить последний твит для этой ручки. Но мы не можем сделать это на UIThread , нам нужен AsyncTask . Мы создадим один и onCreate методе onCreate второго действия:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_display_message);
    setupActionBar();
     
    String handle = getIntent().getStringExtra(MainActivity.EXTRA_MESSAGE);
 
    TextView textView = new TextView(this);
    textView.setTextSize(40);
     
    new FetchLatestTweetTask(textView, handle).execute();
 
    // Set the text view as the activity layout
    setContentView(textView);
}

Фактическая задача выглядит так:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class FetchLatestTweetTask extends AsyncTask<Void, Void, String> {
    private TextView textView;
    private String handle;
 
    public FetchLatestTweetTask(TextView textView, String handle) {
        this.textView = textView;
        this.handle = handle;
    }
 
    @Override
    protected String doInBackground(Void… args) {
        Twitter twitter = new TwitterFactory().getInstance();
 
        String status = null;
 
        try {
            User user = twitter.showUser(handle);
            status = user.getStatus().getText();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return status;
    }
 
    protected void onPreExecute() {
        textView.setText(String.format(«Fetching tweet by @%s …», handle));
    }
 
    protected void onPostExecute(String tweet) {
        textView.setText(tweet);
    }
}

Мы отображаем некоторый текст-заполнитель перед извлечением твита и обновляем текст-заполнитель содержимым твита после его получения. Мы используем Twitter4J для общения с Twitter API. Чтобы библиотека API работала, я поместил файл twitter4j.properties в папку / src проекта, чтобы он оказался в пути к классам в соответствии с документацией .

Файл свойств содержит ключ потребителя OAuth , секрет потребителя, ключ токена доступа и секрет токена доступа для приложения Twitter, которое я настроил только для этого.

Это весь интересный код в нашем приложении, остальное — это просто стандартный шаблон согласно вводному руководству Google .

Настроить New Relic для мониторинга вашего Android-приложения очень просто. В вашей новой учетной записи Relic, нажмите на Mobile в меню. Именно здесь будут жить все ваши мобильные приложения, точно так же, как веб-приложения живут в пункте меню « Приложения» .

Теперь нажмите кнопку Добавить новое приложение :

Это приведет вас к другому экрану, где New Relic проведет вас через настройку нового приложения:

Мы нажимаем на Android и даем имя нашему приложению. После того, как вы дали имя своему приложению, вам нужно нажать Продолжить, чтобы New Relic сгенерировал новый ключ API для вашего приложения.

Далее нам нужно установить агент New Relic. Я использую Eclipse, поэтому я иду в « Справка»> «Установить новое программное обеспечение» и добавляю «New Relic» в качестве сайта:

Нажмите Next и подождите, пока Eclipse сделает свое дело. Как только это будет сделано, вам нужно перезапустить Eclipse. На этом этапе вы должны иметь возможность щелкнуть правой кнопкой мыши свой проект в Eclipse, и там должна быть опция меню Install New Relic . Когда мы щелкаем по нему, jar агента New Relic окажется в папке / libs нашего проекта.

Кстати, если появляется новая версия агента New Relic, вы обновляете ее таким же образом. Сначала выполните « Справка»> «Проверить наличие обновлений», чтобы получить последние обновления. После этого просто щелкните правой кнопкой мыши по вашему проекту, и появится меню « Обновить новую реликвию» , которое будет обновлять банку с новой реликвией при нажатии:

Теперь нам нужно предоставить нашим приложениям разрешения для INTERNET и ACCESS_NETWORK_STATE поскольку New Relic потребуется отправлять данные обратно на их серверы. Наш AndroidManifest.xml будет выглядеть так:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
<?xml version=»1.0″ encoding=»utf-8″?>
<manifest xmlns:android=»http://schemas.android.com/apk/res/android»
    package=»com.tutsplus.helloworld»
    android:versionCode=»1″
    android:versionName=»1.0″ >
     
    <uses-permission android:name=»android.permission.INTERNET» />
    <uses-permission android:name=»android.permission.ACCESS_NETWORK_STATE» />
 
    <uses-sdk android:minSdkVersion=»8″ android:targetSdkVersion=»19″ />
 
    …
 
</manifest>

Теперь нам просто нужно запустить агент. В нашем MainActivity.java мы импортируем New Relic:

1
import com.newrelic.agent.android.NewRelic;

Затем мы запускаем агент внутри метода onCreate :

1
2
3
4
5
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    NewRelic.withApplicationToken(«XXXXXXXXXXXXXXXXXXX»).start(this.getApplication());
}

Обратите внимание на токен приложения. Если вы нажали « Продолжить», когда указали имя для своей заявки, она должна быть предварительно заполнена. Как только ваше приложение запущено и запущено, вы всегда можете найти его снова в меню « Настройки» вашего приложения.

После этого шага мы строим проект и разворачиваем его на эмуляторе или физическом устройстве. Я предпочитаю развертывание на тестовом устройстве, так как оно работает быстрее, быстрее и проще в работе. Я буду использовать свой Nexus 4 .

Если мы посмотрим на вкладку LogCat при развертывании приложения, мы увидим вывод, похожий на этот:

1
2
3
4
02-23 17:25:17.004: I/com.newrelic.agent.android(25592): Loaded configuration: HarvestConfiguration{collect_network_errors=true, cross_process_id=’null’, data_report_period=60, data_token=[0, 0], error_limit=50, report_max_transaction_age=600, report_max_transaction_count=1000, response_body_limit=2048, server_timestamp=0, stack_trace_limit=100, activity_trace_max_size=65534, activity_trace_max_report_attempts=1, activity_trace_min_utilization=0.30000001192092896, at_capture=ActivityTraceConfiguration{maxTotalTraceCount=1}}
02-23 17:25:17.054: I/com.newrelic.agent.android(25592): Application state monitor has started
02-23 17:25:17.104: I/com.newrelic.agent.android(25592): Measurement Engine initialized.
02-23 17:25:17.114: I/com.newrelic.agent.android(25592): New Relic Agent v3.264.0

Вот как мы знаем, что New Relic загрузился. После этого, если мы будем продолжать смотреть на LogCat, мы будем видеть что-то подобное каждую минуту или около того:

1
2
3
4
02-23 17:55:40.410: I/com.newrelic.agent.android(31413): Harvester: connected
02-23 17:55:40.410: I/com.newrelic.agent.android(31413): Harvester: Sending 2 HTTP transactions.
02-23 17:55:40.410: I/com.newrelic.agent.android(31413): Harvester: Sending 0 HTTP errors.
02-23 17:55:40.410: I/com.newrelic.agent.android(31413): Harvester: Sending 0 activity traces.

Это новая реликвия, звонящая домой, чтобы отправить данные Если мы теперь вернемся к пользовательскому интерфейсу New Relic, мы должны начать видеть данные.

Когда вы посмотрите на свое приложение в New Relic, вы сначала попадете на экран Overview . Подобно экрану обзора веб-приложения, он отображает несколько важных показателей о вашем приложении, таких как время отклика Http , Slowest Interactions и т. Д.

Действия на этих графиках носят эпизодический характер, поскольку у нас есть только один клиент, отправляющий данные назад, и мы только сделали пару взаимодействий.

Итак, что вы можете увидеть в New Relic для своего мобильного приложения? Ну, есть вкладка App> Devices, которая показывает, на каких устройствах люди используют ваше приложение. Это интересно, так как вы можете сразу увидеть, какие телефоны / таблицы использует большинство пользователей. Люди в основном на старых устройствах или на новых? Они в основном на планшетах или телефонах? Это ценные данные.

Вы можете углубиться в каждое устройство и посмотреть, насколько хорошо там работает ваше приложение. Время взаимодействия для этого устройства медленнее, чем вы ожидаете? Как насчет времени ответа Http? Сколько активных пользователей в настоящее время используют ваше приложение на устройстве такого типа? В нашем случае:

Есть только одно устройство, так что не так много, чтобы увидеть. Но если бы большая часть вашей пользовательской базы находилась на устройстве, где ваше приложение работало не очень хорошо, вы бы сразу это увидели и смогли бы решить проблему.

Как и на вкладке « Устройства », есть вкладка « Версии ОС », которая разбивает использование вашего приложения по версии Android, установленной вашими пользователями:

Вы можете сказать, нужно ли вам уделять больше внимания новым версиям Android или большая часть вашей пользовательской базы все еще работает на более старых версиях.

Тогда есть вкладка Сеть и ее дочерние элементы. На вкладке « Карта » вы можете увидеть, к каким API подключается ваше приложение и насколько хорошо работает каждый из них. Какова пропускная способность, время отклика и частота ошибок:

В нашем случае у нас есть только API Twitter, и он довольно медленный. Возможно, мы могли бы рассмотреть возможность кэширования некоторых ответов в течение определенного периода времени.

На вкладке « Сети»> «Запросы Http » мы можем перейти к каждой конечной точке каждого API, который мы используем, аналогично тому, как мы углубляемся в устройства и версии ОС. Мы можем выяснить, какие конечные точки используются чаще всего, а какие самые медленные. Это дает нам солидные указания относительно того, куда направлять наши усилия по оптимизации. Это особенно верно, если мы также контролируем используемые API.

На вкладке « Сеть»> «География » вы можете указать, откуда приходит большинство ваших пользователей, а на вкладке « Операторы » вы можете увидеть, какое подключение к Интернету имеют ваши пользователи. В нашем случае я нахожусь на Wi-Fi:

Очень важно знать, использует ли ваша пользовательская база Wi-Fi, 3G или 4G, поскольку ваши усилия по оптимизации могут быть совершенно разными в зависимости от разбивки.

В разделе «Настройки»> «Предупреждения» вы также можете задать некоторые условия для ваших внешних API для New Relic, чтобы уведомлять вас, если время ответа превышает определенный порог или если уровень ошибок превышает определенный процент.

Это потенциально менее ценно для API, которые вы не контролируете, но все же является хорошим индикатором, если используемый вами API нестабилен или не очень эффективен.

Последние два интересных из них: « Использование»> «Версии» и « Использование»> «Ежемесячные уникальности» . Первый показывает, какие версии вашего приложения используются в дикой природе. Это позволяет вам сказать, насколько охотно пользователи загружают обновления вашего приложения. Он также показывает, насколько хорошо работает каждая версия вашего приложения на устройстве. Новая версия использует больше памяти, чем предыдущая версия?

Ежемесячные уникальности в основном дают вам представление о том, взаимодействуют ли люди с вашим приложением. У вас может быть 10 миллионов загрузок, но если количество ежемесячных уникальных записей невелико, то все будет не так хорошо, как кажется.

Это базовый обзор некоторых, но не всех, интересных функций приложений New Relic для Android. Сами по себе ни одна из этих функций не является поразительной, но это хорошие достоверные данные, которые для мобильного приложения вы не можете найти другим способом.

То, как ваше приложение используется и на каких устройствах, насколько эффективны ваши сетевые вызовы при медленном соединении, это тип данных, который заставляет вас перестать гадать и принимать обоснованные решения о том, как улучшить ваше приложение и дать вашим пользователям лучший опыт.

Помните, что производительность для мобильных приложений так же важна, как и для веб-приложений, и нет никаких оснований догадываться о том, что замедляет работу вашего приложения, когда есть гораздо лучший доступный способ.