รู้จัก Firebase Crash Reporting ตั้งแต่ Zero จนเป็น Hero

Jirawatee
Firebase Thailand

--

การเกิด crash หรือ force close ขึ้นในแอพ นั้นเป็นสาเหตุสำคัญที่ทำให้ผู้ใช้งานแอพของเรา ให้ rate แอพของเราน้อย หรือ uninstall แอพของเราออก ซึ่งนักพัฒนาทุกคนก็คงอยากรู้สาเหตุว่าแท้จริง crash นั้นมันเกิดจากอะไร เกิดขึ้นเมื่อไร ใช้ device รุ่นไหน และที่สำคัญก็ต้องทราบปัญหาได้อย่างรวดเร็ว เพื่อที่จะรีบแก้ไข ไม่ให้ปัญหาลุกลามไปในวงกว้าง ซึ่งนั่นก็คือสิ่งที่ Firebase Crash Reporting จะมาช่วยนักพัฒนา ให้สามารถตรวจสอบข้อผิดพลาดที่เกิดขึ้นในแอพของเราผ่าน dashboard แบบง่ายๆทุกลมหายใจ รองรับทั้ง Android และ iOS ฟรี!

วิดีโอแนะนำการทำงานของ Firebase Crash Reporting

ในการพัฒนา Firebase Crash Reporting ขอแยกออกเป็น 4 parts ดังนี้

  1. การ Set up Firebase และ Crash Reporting SDK
  2. การรายงานข้อผิดพลาด (Report Crashes)
  3. การกำหนด Event logs
  4. ติดตามและสังเกตการณ์ผ่าน Dashboard

เมื่อพร้อมแล้ว…ก็เปิด Android Studio ขึ้นมา โดยจะสร้างโปรเจคใหม่ หรือจะใช้โปรเจคเดิมก็ได้

Part 1 การ Set up Firebase และ Crash Reporting SDK

ถ้าสร้างโปรเจคใหม่ ให้ไปดูการ Set up Firebase ที่บทความนี้ก่อน

เมื่อ Set up Firebase เรียบร้อยแล้ว ก็ให้เพิ่ม Crash Reporting SDK ใน build.gradle ของ app-level แล้วกด Sync ก็เป็นอันจบส่วนที่ 1 ละ

dependencies {
compile 'com.google.firebase:firebase-crash:11.8.0'
}

Part 2 การรายงานข้อผิดพลาด (Report Crashes)

โดยปกติการรายงานข้อผิดพลาดจะเป็นแบบอัตโนมัติ(ไม่ต้องเขียน code เลยสักนิดเดียว) โดยจะเกิดขึ้นเมื่อมีข้อผิดพลาดร้ายแรงในแอพ และข้อผิดพลาดต่างๆจะถูกแบ่งกลุ่มรวมกัน(Cluster) ตามความคล้ายคลึงของข้อผิดพลาด จะแสดงผลใน dashboard ภายใน 1–2 นาที ว่าแล้วก็มาลองสร้างงานกันดีกว่า

mTextView.setTextColor(null);

จาก code ด้านบนนี้ run แล้วก็จะบึ้มทันที

ภาพที่ Android Developer คุ้นเคย

เมื่อบึ้มแล้ว 2 นาทีก็แวะไปดูที่ Firebase Console เลือกเมนู Crash ก็จะพบกับ error ดังกล่าว

Crash แบบร้ายแรง

จะสังเกตว่า จะมีข้อความว่า Fatal สีแดงๆ ซึ่งหมายความว่า crash ตัวนี้ มันร้ายแรงยิ่งนัก ทำให้ force close ได้

แต่กระนั้นเราก็สามารถรายงานข้อผิดพลาดเข้าไปได้เอง ด้วยการใช้คำสั่ง .report() ซึ่งค่าที่จะส่งเข้าไปในฟังก์ชันนี้จะต้องเป็น Throwable เช่นในกรณีที่เราดัก try catch ไว้เพื่อไม่ให้เกิด force close ตามตัวอย่างด้านล่าง

try {
throw new NullPointerException();
} catch (NullPointerException ex) {
FirebaseCrash.report(ex);
}

จากนั้นก็นับ 1 ถึง 3,000,000…นานไป๊!!! แล้วก็เข้าไปที่ Firebase Console เลือกเมนู Crash ก็จะพบกับ error ดังกล่าว

Crash แบบไม่ร้ายแรง

และจะสังเกตว่า มีจะคำว่า Non-fatal สีฟ้าอ่อนในรูป ที่หมายความว่า “ไม่ร้ายแรง” เพราะมันไม่ได้ทำให้ force close

Part 3 การกำหนด Event logs

ในการรายงานข้อผิดพลาด บางครั้งเราก็คงอยากรู้ว่า user journey เป็นอย่างไร และเกิดขึ้นกับใคร, สินค้าชิ้นไหน หรือ state ก่อนและหลังทำอะไรเป็นต้น ซึ่ง Firebase Crash Reporting ได้เตรียมสิ่งเหล่านี้ให้พวกเราแล้ว โดยจะขอแบ่งเป็นการกำหนด 2 รูปแบบดังนี้

3.1. Custom event logs (เพียวๆ)

การกำหนด event logs(เพียวๆ) นั้นเราสามารถกำหนดได้ดังใจ สร้างเนื้อเรื่องเป็นของตัวเองเพื่อให้ง่ายที่สุดในการเข้าใจปัญหาที่อาจเกิดขึ้น ผ่านฟังกชัน .log() ตัวอย่าง

// log ไว้ใน onCreate
FirebaseCrash.log("Activity created");
// แล้ว setOnClick กับปุ่มๆนึงเพื่อเปลี่ยนสี TextView
mTextView.setTextColor(null);

เมื่อเข้าไปดูผลลัพธ์ใน dashboard ก็ให้เลือก cluster ที่ต้องการจากนั้นก็กด VIEW DETAILS

พบว่า มี log โผล่ขึ้นมา 2 บรรทัดจริงๆด้วย

custom event logs

3.2. Custom event logs + logcat

แบบที่สองจะเหมือนแบบแรกทุกประการ โดยที่เพิ่มเติมมาคือ การแสดง log ใน logcat ไปด้วย โดย log ที่เกิดขึ้นใน logcat เราก็สามารถเลือกประเภทได้ตามใจเช่น DEBUG, INFO, WARN และ ERROR เป็นต้น มาดูตัวอย่างกัน

try {
throw new NullPointerException();
} catch (NullPointerException ex) {
FirebaseCrash.logcat(Log.ERROR, TAG, "NPE caught");
FirebaseCrash.report(ex);
}

จะเห็น ERROR log ใน logcat ขึ้นมาด้วยตามภาพเลย

ERROR log ใน logcat

และใน dashboard ก็มาเช่นกัน

Part 4 ติดตามและสังเกตการณ์ผ่าน Dashboard

เริ่มต้นก็ไปที่ Firebase Console แล้วเลือกเมนู Crash ก็จะพบกับ Dashboard ในนี้เราก็สามารถดูกราฟแสดงการเกิด error แบบแยกประเภทพและช่วงเวลาไว้ และเราสามารถ filter ได้ด้วยเช่น แอพเวอร์ชัน หรือ ประเภทความร้ายแรงของ error อีกทั้งแสดงจำนวน error ทั้งหมด จำนวนผู้ใช้ที่ได้รับผลกระทบ และกลุ่มของ error (cluster)

ถัดลงมาด้านล่างจะเจอกับ cluster ที่แบ่งกลุ่มของ error โดยเรียงลำดับจำนวนการเกิด และแสดงความร้ายแรง เพื่อให้เราสามารถจัดลำดับความสำคัญในการแก้ไขได้

จากนั้นก็ลองเลือก cluster มาสักตัวนึงโดยคลิกเข้าไป และกด VIEW DETAILS

คุณก็จะเจอรายละเอียดทั้งหมด และรายละเอียดก็แยกตามครั้งที่เกิดด้วย สามารถกดซ้ายขวาเพื่อดูได้

ข้อมูลถือว่าละเอียดเลยทีเดียว และข้อมูลก็เข้ามาเร็วเลยภายใน 1–3 นาที และมีการส่งอีเมลแจ้งเตือนแล้วด้วย แจ่ม!

ตัวอย่างอีเมลที่แจ้งเตือน crash ที่เกิดขึ้น

ท้ายบทความนี้

Firebase Crash Reporting บทความนี้น่าจะสั้นที่สุดตั้งแต่เขียนมาละ ง่ายสุดด้วย และเชื่อว่าจะช่วยให้คุณสามารถตรวจดูสุขภาพแอพของคุณได้ง่ายและรวดเร็ว พร้อมข้อมูลที่ละเอียดยิบสำหรับแอพของคุณได้ ใครอย่างดู sample code ก็สามารถไปโหลด source code ตัวอย่างจาก GitHub ได้เลยจ้า

สำหรับวันนี้ต้องลากันไปก่อน จนกว่าจะพบกันใหม่…ราตรีสวัสดิ์ พี่น้องชาวไทย

--

--

Jirawatee
Firebase Thailand

Technology Evangelist at LINE Thailand / Google Developer Expert in Firebase