47
Реалтайм статистика скорости работы нативных и веб-приложений у реальных пользователей Pavel Dovbush @

Jinba - frontendconf.ru/2015

Embed Size (px)

Citation preview

Page 1: Jinba - frontendconf.ru/2015

Реалтайм статистика скорости работы нативных и веб-приложений у

реальных пользователей

Pavel Dovbush@

Page 2: Jinba - frontendconf.ru/2015

RUMReal User Monitoring

Реальный UX

Page 3: Jinba - frontendconf.ru/2015

● DOMContentLoaded, onLoad

● W3C Navigation Timing● W3C Resource Timing● W3C User Timing

● Нативные приложения

Что

Page 4: Jinba - frontendconf.ru/2015

W3C Navigation Timing

Page 5: Jinba - frontendconf.ru/2015

W3C Resource Timing

Page 6: Jinba - frontendconf.ru/2015

Load time - 32s

Page 8: Jinba - frontendconf.ru/2015

Что такое UX?

VS.

Page 9: Jinba - frontendconf.ru/2015

● performance.mark(name)

● performance.measure(name, mark1, mark2)

W3C User Timing

Page 10: Jinba - frontendconf.ru/2015

WebSite hit

Page 11: Jinba - frontendconf.ru/2015

WebApp hit

Page 12: Jinba - frontendconf.ru/2015

Android hit

Page 13: Jinba - frontendconf.ru/2015

Как собрать данные?

Специализированные

Всё-в-одном

Page 14: Jinba - frontendconf.ru/2015

Собираем сами

WEB cluster

Хранилище

Графики

Приложение

Page 15: Jinba - frontendconf.ru/2015

github.com/dpp-name/jinba

tiny.cc/jinba

Jinba

Page 16: Jinba - frontendconf.ru/2015

● Микро-библиотека○ JavaScript○ Android○ iOS○ Windows phone

● Набор соглашений

● Инфраструктура○ Сбор○ Визуализация○ Аналитика

Jinba

Page 17: Jinba - frontendconf.ru/2015

npm install jinba-js-client

var Jinba = require('jinba-js-client');

var r = new Jinba.Request(location.pathname, { app_label: 'example' });

r.startMeasurement('some-id', 'init');doInit(function callback() { r.stopMeasurement('some-id');});

r.end();

Пример

Page 18: Jinba - frontendconf.ru/2015

[ { name: '/', value: 321, tags: { app_label: 'example', errorStatus: 0 }, measurements: [ { name: 'init', value: 275 }, …. { name: 'foo-1', value: 0 }, { name: 'bar-2', value: 17 }, ….

Данные

Page 19: Jinba - frontendconf.ru/2015

● Отфильтровать мусор

● Защитить от паразитного трафика

● Записать в хранилище

● Как можно быстрее!

Прием данных

Page 20: Jinba - frontendconf.ru/2015

● Быстрая вставка

● Разные “срезы”

● Возможность считать перцентили

● Хранить данные годами

Требования к хранилищу

Page 21: Jinba - frontendconf.ru/2015

● MySQL

● Syslog

● Hadoop

● InfluxDB

● StatsD

Хранилище

Page 22: Jinba - frontendconf.ru/2015

● MySQL engine

● Данные в памяти (за N минут)

● UDP вставка

● Отчеты по тэгам

● Реалтайм!

pinba.org

Page 23: Jinba - frontendconf.ru/2015

● tagN_info - отчеты по многим тэгам

● Перцентили

● Гистограммы

● Фильтрация по тегам реквеста

Pinba для Jinba

Page 24: Jinba - frontendconf.ru/2015

Pinba

1.4M

25K

RPS

TPS

Page 25: Jinba - frontendconf.ru/2015

CREATE TABLE v2_jinba_country ( ...) ENGINE=PINBA COMMENT='tagN_info:timer,mode,country::75,95';

pinbaSchema.createReport({ mysqlClient: mysqlClient, tablePrefix: 'v2_jinba', name: 'country', tags: ['timer', 'mode', 'country']});

Создание отчета

Page 26: Jinba - frontendconf.ru/2015

mysql> desc v2_jinba_country;+--------------+--------------+| Field | Type |+--------------+--------------+| timer | varchar(64) || mode | varchar(64) || country | varchar(64) || req_count | int(11) || req_per_sec | float || hit_count | int(11) || hit_per_sec | float || timer_value | float || timer_median | float || index_value | varchar(256) || p75 | float || p95 | float |+--------------+--------------+

Создание отчета

Page 27: Jinba - frontendconf.ru/2015

mysql> select timer, mode, hit_per_sec, timer_value/hit_count as timer_avg, timer_median, p75, p95from v2_jinba where mode='webapp-badoo' and timer='usable' \G*************************** 1. row ***************************

timer: usable mode: webapp-badoo hit_per_sec: 739.025 timer_avg: 0.898577200534488timer_median: 0.589789 p75: 0.854372 p95: 2.18598

Создание отчета

Page 28: Jinba - frontendconf.ru/2015

Гистограмма

% of hits

time

Page 29: Jinba - frontendconf.ru/2015

● Pinba - последние 5 - 10 - 15 минут

● История - RRD (в перспективе InfluxDB)

Хранение истории

Page 30: Jinba - frontendconf.ru/2015

pinba2influxdb

createDB(influxClient, dbName)

selectData(mysqlClient, dbName, tags)

insertData(influxClient, dbName, result)

InfluxDB

Page 31: Jinba - frontendconf.ru/2015

Как рисовать?

Page 32: Jinba - frontendconf.ru/2015

grafanaUtils

createReportDashboard(url, grafanaKey, schema, name)

"domain_country": { "rows_by": "timer", "tags": [ "mode", "timer", "domain", "country" ] }

Grafana

Page 33: Jinba - frontendconf.ru/2015

Как рисовать?

Page 34: Jinba - frontendconf.ru/2015

Что получилось

➔ JinbaClient

➔ JinbaServer

➔ Pinba

➔ JinbaScripts

➔ InfluxDB

➔ Grafana

Page 35: Jinba - frontendconf.ru/2015

● Тип запроса

● Таймер

● Страница / Экран

● Страна

● Браузер / Устройство

Аналитика

Page 36: Jinba - frontendconf.ru/2015

● Тип запроса

● Таймер

● Страница / Экран

● Страна

● Браузер / Устройство

Аналитика

9

31

40

50

10

5.5 M

Page 37: Jinba - frontendconf.ru/2015

WebSite

Page 38: Jinba - frontendconf.ru/2015

WebApp

Page 39: Jinba - frontendconf.ru/2015

Android

Page 40: Jinba - frontendconf.ru/2015

Среднее и перцентили

Page 41: Jinba - frontendconf.ru/2015

Результаты оптимизации

Page 42: Jinba - frontendconf.ru/2015

Последствия редизайна

Page 43: Jinba - frontendconf.ru/2015

Сравнение стран

Page 44: Jinba - frontendconf.ru/2015

Сравнение браузеров

Page 45: Jinba - frontendconf.ru/2015

Сравнение страниц

Page 46: Jinba - frontendconf.ru/2015

● Только вы можете определить `usable`

● Юзабилити важнее технических метрик

● Не смешивайте типы запросов

● Выделяйте общие группы

● Перцентили, а не среднее

Итого

Page 47: Jinba - frontendconf.ru/2015

Павел Довбуш<[email protected]>

Jinbagithub.com/dpp-name/jinba

Pinbahttp://pinba.org/

Вопросы?