ログ管理でウキウキandroid life (log management in android)

37
ログ管理でウキウキ Android Life 2014/11/20 Mercari Inc. 今井智章

Upload: tomoaki-imai

Post on 10-Jul-2015

2.104 views

Category:

Software


2 download

TRANSCRIPT

Page 1: ログ管理でウキウキAndroid Life (Log Management in Android)

ログ管理でウキウキAndroid Life

2014/11/20 Mercari Inc. 今井智章

Page 2: ログ管理でウキウキAndroid Life (Log Management in Android)

自己紹介• 株式会社メルカリ Android エンジニア(2014.3~)

!

!

!

!

!

!

• 以前はSIerでインフラ系DBエンジニア(たまにjava開発)2

twitter: tomoaki_imai github: tomoima525 qiita: tomoima525

フリマアプリの機能開発、USアプリ開発

Page 3: ログ管理でウキウキAndroid Life (Log Management in Android)

Agenda

• ウキウキするエラー系ログ管理のお話

• ウキウキする分析系ログ管理のお話

3

Page 4: ログ管理でウキウキAndroid Life (Log Management in Android)

エラーログとは

Page 5: ログ管理でウキウキAndroid Life (Log Management in Android)

ユーザーの声にならない 叫び

Page 6: ログ管理でウキウキAndroid Life (Log Management in Android)

ユーザーの声として上がるのはほんの一部です

Page 7: ログ管理でウキウキAndroid Life (Log Management in Android)

エラーログ、見ましょう バグ、駆逐しましょう

Page 8: ログ管理でウキウキAndroid Life (Log Management in Android)

メルカリでのエラー監視

• Google Developer Console

• Crashlytics

• 自前でのリアルタイムエラーレポート

8

Page 9: ログ管理でウキウキAndroid Life (Log Management in Android)

Google Developer Console• apkをGoogle playに上げる時に時のアレ

• アプリがクラッシュし、ユーザーがエラーレポート送付してくれた内容が見られる

- なので大体氷山の一角

• Crashlyticsで拾えないネイティブクラッシュが確認できる

9

Page 10: ログ管理でウキウキAndroid Life (Log Management in Android)

Crashlytics

• 言わずと知れた有名エラーレポートサービス

• 導入が超簡単。レポートも詳細。

• テスト配信機能も有り

• 最近はアカウント作成待ちの行列ができてる10

Page 11: ログ管理でウキウキAndroid Life (Log Management in Android)

使い方• 一番最初に起動するActivityで呼ぶだけ

!

!

• クラッシュ時の情報を添付することもできる

11

@Override public void onCreate(Bundle savedInstanceState) { com.crashlytics.android.Crashlytics.start(this); }

com.crashlytics.android.Crashlytics.setString( "last_activity", this.getClass().getName());

Page 12: ログ管理でウキウキAndroid Life (Log Management in Android)

使い方

!

• メルカリではdev,stg,productでパッケージ名を分け、それぞれでログ監視

• テスト、QAレベルでエラーログを拾う12

Page 13: ログ管理でウキウキAndroid Life (Log Management in Android)

自前エラーレポート• エラー用Apiでクラッシュ時に送信

• より詳細に状況を把握し、バグ解消に活かす

• 以下の3点が実装のポイント

13

①予期せずエラーが起きてもレポートを飛ばす仕組み

②既知のバグの発生条件を調査できる仕組み

③レポートを貯めて送る仕組み

Page 14: ログ管理でウキウキAndroid Life (Log Management in Android)

仕組み①予期せずエラーが起きてもレポートを飛ばす仕組み

14

public class ThisApplication extends Application implements Thread.UncaughtExceptionHandler { @Override public void uncaughtException(Thread thread, final Throwable ex) { new Thread() { public void run() { ByteArrayOutputStream b = new ByteArrayOutputStream(); ex.printStackTrace(new PrintStream(b)); String errMessage = b.toString(); gotoErrorActivityAndReport(errMessage); //エラーレポートをAPIに送る System.exit(1); }; }.start(); }

Applicationクラス内でThread.UncaughtExceptionHandlerを実装

Page 15: ログ管理でウキウキAndroid Life (Log Management in Android)

仕組み②既知のバグの発生条件を調査できる仕組み

15

try { return BitmapFactory.decodeFileDescriptor(fileDescriptor, null, options); } catch (OutOfMemoryError ooe) { postErrorReport(getCurrentActivity().getClass().getName() , options.inSampleSize , options.outWidth , reqWidth);     //画像処理系で画像サイズ情報を送信 }

すでにErrorが発生すると判明している部分で、try/catchし、 catch内で調査に必要な情報を送る

Page 16: ログ管理でウキウキAndroid Life (Log Management in Android)

public void sendErrorReportInternal(final JSONObject errReport) { String errMessage = JSONUtil.getString(errReport, S.message); if (errMessage != null) { Api.process(errReport, new responseListener<JSONObject>() { @Override public void onResponse(JSONObject response) {} @Override public void onErrorResponse(JSONObject response) { ErrorStore.addErrReport(errReport); //プリファレンスに保存 } //以下略

仕組み③レポートを貯めて送る仕組み

16

レポートをプリファレンスに保存し、レポート送信前にクラッシュ したり通信できなくても、次回起動時に送付できるようにする

public void onResume() { sendOldErrorReports(); //以前のレポートがあった場合は送信 }

Page 17: ログ管理でウキウキAndroid Life (Log Management in Android)

まとめ• Crashlyticsで届かないかゆいところに自前エラーレポートを組み合わせるとバグ駆逐が捗る

17

Google Analytics Crashlytics 自前

ログのわかりやすさ △ ◯ ◎

カスタマイズ性 ☓ △ ◎

導入容易性 default ◯ △

Page 18: ログ管理でウキウキAndroid Life (Log Management in Android)

ウキウキしましたか?

Page 19: ログ管理でウキウキAndroid Life (Log Management in Android)

続いて、分析ログの話

Page 20: ログ管理でウキウキAndroid Life (Log Management in Android)

What is 分析ログ?• インストール率, DAU, 売上, A/B testing etc. を分析するためのログ

• 用途によって様々なサービスがある

20

Page 21: ログ管理でウキウキAndroid Life (Log Management in Android)

分析ログ(サービス)の問題点

• それぞれの分析サービスのApiに標準性がない

- 似たようなトラッキングコードをひたすら書かされる

- その割にApiごとに癖があって実装に困る

- 新しいライブラリを追加する度に導入の調査が必要になる

21

Page 22: ログ管理でウキウキAndroid Life (Log Management in Android)

そうだ、Segment 使おう

Page 23: ログ管理でウキウキAndroid Life (Log Management in Android)

Segment• 複数の分析サービスを統合できる

• シンプルなAPIで導入が簡単

• けどかなり詳細に分析データを送信できる!

23

Page 24: ログ管理でウキウキAndroid Life (Log Management in Android)

Segment• SegmentのApiで多くの分析サービスをカバー

• ユーザーはコンソールから分析サービスを選ぶだけ

24

Page 25: ログ管理でウキウキAndroid Life (Log Management in Android)

実装例• 事前準備

- アカウントの用意

- https://segment.com/

- プロジェクトの作成

- 組織単位でproject作成が可能

- API keyを確認

25

こちらにまとめました↓http://qiita.com/tomoima525/items/bab086d341b686b9f8a1

Page 26: ログ管理でウキウキAndroid Life (Log Management in Android)

実装例• gradleのdependencies追加(Android Studio)

!

!

!

!

• AndroidManifest.xmlへの設定

26

dependencies { compile('com.segment.analytics.android:core:+@aar') { transitive = true } //必要なライブラリのみ追加 compile 'com.google.android.gms:play-services:+' compile ‘com.mixpanel.android:mixpanel-android:+@aar' }

<uses-permission android:name=“android.permission.INTERNET”/>   //必須 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.READ_LOGS"/> <uses-permission android:name="android.permission.GET_TASKS"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

Eclipse向けにjarファイルもある(ただしバージョンは古い)

Page 27: ログ管理でウキウキAndroid Life (Log Management in Android)

実装例• res/values/analytics.xmlにAPI keyを設定

27

<resources> <string name="analytics_write_key">YOUR_WRITE_KEY</string> <string name="analytics_logging">true</string> <integer name="analytics_queue_size">20</integer> </resources>

analytics_write_key:    コンソールで確認したApi key analytics_logging:    logに送信データが出力    うまく確認できなかった。iOSでは見られる? analytics_queue_size:    一度のキューで送信するイベントの数    キューがたまらなくても一定時間で送信されている様子

Page 28: ログ管理でウキウキAndroid Life (Log Management in Android)

代表的なトラッキングメソッド• identify

Analytics.with(context).identify(new Traits().putName(“Moge Hoge")); Analytics.with(context).identify( new Traits().putEmail([email protected]"));

Analytics.with(context).identify(user_id);

アプリユーザーのIDを設定する

複数のTraits(特徴)を設定することも可能

Traitsはage, gender等多数あり、分析サービスに応じて設定可能

https://segment.com/docs/api/tracking/identify/#special-traits

Page 29: ログ管理でウキウキAndroid Life (Log Management in Android)

代表的なトラッキングメソッド• Alias

会員登録前後のIDを紐つけ、会員登録前のイベントを関連付けする

※Segmentのエンジニア曰く統合がまだ十分でないらしく、 今後も変わる可能性あり

Analytics.with(context).alias(uuid, new_id); //会員登録前のIDがない場合はSegment内のanonymousIDが紐付けられる

Mixpanel、Flurryといった分析サービスで利用

Page 30: ログ管理でウキウキAndroid Life (Log Management in Android)

代表的なトラッキングメソッド• Track

あらゆるイベントにプロパティ、トラック名をつけてトラックする

プロパティは任意のキーを設定できる

Properties properties = new Properties() .putValue("price", price) .putValue("category", CategoryId); //オブジェクト型を設定できる Analytics.with(context).track(trackName, properties);

Page 31: ログ管理でウキウキAndroid Life (Log Management in Android)

デバッガー• コンソールデバッガーで値を確認できる

{ "messageId": "09361829-c11c-451d-83d0-d1e2e9fc9063", "type": "track", "anonymousId": "d6c327e4-76c3-418c-907e-4b0eba89ec40", // 中略 "timestamp": "2014-11-19T11:34:54.000Z", "event": "Eat Curry", "properties": { "price": 1200, "category": "Indian", "condition": "good", }, }

値はjsonでも取得可能

Page 32: ログ管理でウキウキAndroid Life (Log Management in Android)

分析• コンソールから分析サービスを選ぶ

それぞれの分析サービスに必要なIDやkeyを設定するだけ

Page 33: ログ管理でウキウキAndroid Life (Log Management in Android)

分析ツールの追加があってもライブラリ、ソースコードの追加は(ほとんど)不要

Page 34: ログ管理でウキウキAndroid Life (Log Management in Android)

スッキリ

Page 35: ログ管理でウキウキAndroid Life (Log Management in Android)

ちょっと注意

• 成長中のサービスなので、開発がさかん

• Documentの記述が食い違っている所もある

• ソースコードが食い違っている所がある(!)

• オープンソースなのでおかしかったら迷わずPR

35

Page 36: ログ管理でウキウキAndroid Life (Log Management in Android)

まとめ

• エラーログ管理はカスタマイズするとバグ駆逐が捗ってウキウキ

• 分析ログはSegment使うと楽ちん、スッキリでウキウキ

36

Page 37: ログ管理でウキウキAndroid Life (Log Management in Android)

メルカリではAndroid/iOSエンジニア募集中!