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

Jirawatee
Firebase Thailand

--

เชื่อว่าผู้ใช้งานแอพทุกคนคงเคยเจอกับประสบการณ์การใช้งานแอพที่ช้า อืด โหลดแล้วก็โหลดอีก ไม่ว่าจะเป็นเพราะการพัฒนาแอพที่ไม่มีประสิทธิภาพ หรือ Network ซึ่งนั่นก็เป็นสาเหตุที่ทำให้ผู้ใช้ให้คะแนนแอพเราน้อย หรืออาจถอนแอพเราออกจากเครื่องไปเลย ทั้งนี้ในตอนพัฒนาแอพ นักพัฒนาอาจไม่ได้คำนึงถึง Fragmentation ที่มีมากมายสำหรับ Android และ การบริหารจัดการ Network ที่ดีในพื้นที่ต่างๆ

เราในฐานะนักพัฒนาจะรู้ได้อย่างไรว่า ส่วนใดในแอพของเราทำงานเชื่องช้าไม่มีประสิทธิภาพ หรือปัญหาเกิดขึ้นจาก Network และ Server หรือไม่ และนั่นคือภารกิจที่ทีม Firebase จะช่วยให้นักพัฒนาสามารถแก้ปัญหาดังกล่าวได้

Firebase Performance Monitoring

Firebase Performance Monitoring เป็นบริการตัวล่าสุดลำดับที่ 16 ที่เปิดตัวในงาน Google I/O ’17 ที่ผ่านมา โดยบริการนี้จะทำให้นักพัฒนาเข้าใจถึงประสิทธิภาพการทำงานของแอพ ทั้งเรื่องของ Code และการจัดการ Network ซึ่งข้อมูลของผู้ใช้ทั้งหมดจะส่งมาที่ Firebase Performance Monitoring เพื่อให้นักพัฒนาสามารถปรับปรุงแอพให้ดียิ่งขึ้นทั้ง Android และ iOS ผ่าน Firebase Console ได้ ฟรี!

Firebase Performance Monitoring ทำงานอย่างไร

Firebase Performance Monitoring จะคอยเฝ้าดูข้อมูลการทำงานของแอพเรา 2 เรื่องด้วยกันคือ Traces และ HTTP/S network requests

Traces

Traces เป็นข้อมูลระยะเวลาที่วัดจากจุดหนึ่งไปยังอีกจุดหนึ่งในแอพ โดยจะมีทั้งแบบวัดให้แบบอัตโนมัติ และ custom เอง

สำหรับ Automic Trace จะมี 3 ประเภท (ไม่ต้องเขียนโค้ด) ดังนี้

  • App start traces เป็น trace ที่วัดตั้งแต่เปิดแอพ จนกระทั่งแอพตอบสนอง
  • App in background traces เป็น trace ที่วัดในขณะที่แอพกำลังทำงานใน background
  • App in foreground traces เป็น trace ที่วัดในขณะที่แอพกำลังทำงานใน foreground

สำหรับ Custom Trace เป็นข้อมูลประสิทธิภาพที่เกี่ยวข้องกันจากโค้ดในแอพของเรา ซึ่งเราสามารถกำหนดจุดเริ่มและจุดสิ้นสุดในโค้ด กรณีที่เราต้องการรู้ประสิทธิภาพการทำงานของ event ที่เกี่ยวข้องกันในแอพ

HTTP/S network requests

HTTP/S network requests เป็นข้อมูลระยะเวลาที่วัดตั้งแต่แอพ request ไปยัง endpoint จนกระทั่งได้ response กลับมาโดยอัตโนมัติ(ไม่ต้องเขียนโค้ด) โดยทุกๆ request ที่เกิดขึ้นจะมีการเก็บข้อมูลดังนี้

  • Response time: เวลาตั้งแต่ request จนได้ response กลับมา
  • Payload size: จำนวน Byte ทั้งจากการ Download และ Upload
  • Success rate: เปอร์เซ็นของ response ที่สำเร็จเมื่อเทียบกับจำนวน response ทั้งหมด

โดยทั้งข้อมูลทั้ง Traces และ HTTP/S network requests จะถูกจัดหมวดหมู่ให้เราสามารถเอามา filter ได้ดังนี้

การติดตั้ง

การติดตั้ง Firebase Performance Monitoring เข้าไปใน Android app นั้นแสนง่าย เพียง 3 ขั้นตอน เร็วยิ่งกว่าต้มมาม่าแน่นอน มาเริ่มกันเลย

1. เปิดไฟล์ build.gradle ใน project-level จากนั้นเพิ่ม classpath ของ firebase-plugin ที่ buildscript -> dependencies

classpath 'com.android.tools.build:gradle:3.4.0'
classpath 'com.google.gms:google-services:4.2.0'
classpath 'com.google.firebase:firebase-plugins:1.2.1'

2. เปิดไฟล์ build.gradle ใน app-level จากนั้น plugin อีกตัวใต้ plugin ของ application

apply plugin: 'com.android.application'
apply plugin: 'com.google.firebase.firebase-perf'

3. เพิ่ม dependency ของ Firebase Performance Monitoring

compile 'com.google.firebase:firebase-perf:17.0.0'

การสร้าง Custom Trace

ในกรณีที่เราต้องการจะดักดูประสิทธิภาพการทำงานแบบเฉพาะเจาะจงในส่วนต่างๆของโค้ด เราสามารถสร้าง Custom trace ไปครอบโค้ดชุดที่เราต้องการได้ อีกทั้งยังสามารถใช้งาน counter เพื่อนับ event ที่เกี่ยวข้องได้

เริ่มต้นก็สร้าง trace ขึ้นมาโดยตั้งชื่อ trace ตัวอย่างว่า image_fetch เก็บในตัวแปร Trace ชื่อ myTrace

Trace myTrace = FirebasePerformance.getInstance().newTrace("image_fetch");

จากนั้นก็ให้เอา start trace ไปวางไว้ก่อนชุดโค้ดเป้าหมายที่ต้องการเฝ้าดู

myTrace.start();

เราสามารถใช้ counter เก็บ event ที่เกี่ยวข้องได้ จากตัวอย่างการโหลดข้อมูลแต่ละครั้งอยากทราบว่าโหลดจาก cache กี่ครั้ง ไม่โหลดจาก cache กี่ครั้ง

Item item = cache.fetch("item");
if (item != null) {
myTrace.incrementCounter("cache_hits");
} else {
myTrace.incrementCounter("cache_misses");
}

สุดท้ายให้เราหยุดการทำงานของ trace ในส่วนท้ายสุดของโค้ดที่เราต้องการเฝ้าดู

myTrace.stop();

เราสามารถสร้าง custom trace ได้หลายตัวในแอพ และ custom trace สามารถทำงานได้พร้อมกันหลายตัว

การเพิ่ม @AddTrace Annotation เพื่อดูประสิทธิภาพการทำงานของ Method

เราสามารถใส่ @AddTrace annotation พร้อมระบุชื่อ trace ไปกับ method ที่ต้องการ เพื่อดูประสิทธิภาพการทำงานตั้งแต่เริ่มต้นจน method นั้นทำงานเสร็จได้
ตัวอย่างจะสร้าง trace ชื่อ onCreateTrace เพื่อดูประสิทธิภาพการทำงานของ method onCreate

@Override
@AddTrace(name = "onCreateTrace", enabled = true)
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
}

Performance Monitoring ใน Firebase Console

เมื่อเข้าไปที่ Firebase Console ให้เราเลือกเมนู Performance จากด้านซ้าย หากแอพเราได้ติดตั้ง SDK ไปแล้ว และมีการใช้งานแล้ว เราก็จะพบว่าหน้า Dashboard จะมี Automic Traces ทั้ง 3 ตัวโผล่มาพร้อมค่าเฉลี่ยของเวลาที่ผู้ใช้ใช้งาน, มีกราฟ Network success rate แยกเป็นแต่ละวัน, มีแผนที่ให้เราดูว่า Network response latency ว่าแต่ละประเทศเป็นอย่างไร และ Network response MIME types ที่จะแยกให้เห็นว่า content ประเภทไหนใช้เยอะในแอพของเรา

เมื่อเราคลิกที่ tab ชื่อ Traces เราจะพบ 3 traces ที่ถูก track อัตโนมัติ

และหากเราได้สร้าง Custom Trace ไว้ ก็จะมีแสดงขึ้นมา ซึ่งเราสามารถคลิกเข้าไปดูข้อมูลของ trace แต่ละตัวได้

เมื่อเราคลิกที่ tab ชื่อ Network Request เราจะเจอ URL ที่แอพเราไป request โดย URL จะซ่อนสิ่งที่เป็น Sensitive ใน path ให้เราด้วย เช่น ID เป็นต้น นอกจากนั้นก็จะบอกเราว่าแต่ละ URL มี Response time เท่าไหร่, มี Success rate เท่าไร และมี Request เข้ามาที่ URL นั้นเท่าไร อีกทั้งจะตุ่มสีส้มเตือนเราในกรณีที่ URL นั้นมี Response time สูง หรือ Success rate ต่ำ เพื่อให้เราไปปรับปรุงต่อ

ตัวอย่างจากรูปเมื่อเราต้องการ deep dive ไปดูปัญหา success rate ที่ได้แค่ 87.95 เราก็สามารถคลิกไปที่ row นั้น

จะเห็นว่า Response time, Response payload และ payload size ปกติ แต่ทำไม Success rate ไม่เต็มร้อยหละ งั้นเรากด View More เข้าไปดูต่อ

เอาหละคราวนี้เราก็เจอปัญหาแล้วว่า เกิดจาก HTTP errors นี่เอง คราวนี้เราก็สามารถไปแก้ปัญหาให้ตรงจุดได้ละ

และไม่ว่าจะเป็น Traces หรือ Network Requests เราสามารถ filter ลงไปดูข้อมูลที่แยกออกเป็นหมวดหมู่ได้อีกทั้ง App version, Device, Country, OS Level, Carrier และ Network Radio เพื่อให้เราหาสาเหตุได้ง่ายขึ้น

ข้อจำกัดที่พบใน Android

  • Performance Monitoring จะรองรับ OkHttp version 3.x.x ในการเฝ้าดู HTTP/S network requests เท่านั้น
  • Payload size ใน HTTP/S network requests จะได้มาจากค่า http content-length header ซึ่งมันอาจจะไม่ตรงเป๊ะเสมอ
  • com.google.firebase.firebase-perf gradle plugin ไม่สามารถใช้งานร่วมกับ DexGuard ได้

สรุป

ณ วันที่เขียนบทความนี้ สถานะ Firebase Performance Monitoring ยังคงอยู่ในสถานะ Beta ดังนั้นเวลาในการแสดงผลข้อมูลบน Firebase Console มันก็จะช้าๆหน่อย ไม่เกิน 12 ชม. แต่หลังจากที่ผู้เขียนได้ลอง ทำให้ทราบว่าจุดไหนในแอพที่ช้าบ้าง และการ release แอพแต่ละครั้งมีจุดไหนเร็วขึ้นหรือช้าลงบ้าง ซึ่งเราสามารถ track หาสาเหตุได้ง่ายขึ้น ดังนั้นเราก็สามารถปรับปรุงแก้ไขแอพได้ง่ายขึ้นไปด้วย บริการตัวนี้แค่ติด ไม่ต้องเขียนโค้ด ก็คุ้มมากๆแล้ว ฟรีอีกด้วย ผู้เขียนแนะนำให้นักพัฒนาติดไว้เถอะ รับรองว่าดี สำหรับวันนี้ต้องลาไปก่อน ฝากติดตามบทความหน้าเรื่อง Phone Authentication กันด้วยนะครับ

--

--

Jirawatee
Firebase Thailand

Technology Evangelist at LINE Thailand / Google Developer Expert in Firebase