แจ้งเตือน Crash จาก Crashlytics ผ่าน LINE Notify ด้วย Cloud Functions for Firebase v1.0.x

Jirawatee
Jirawatee
Apr 14, 2018 · 4 min read

ผมคิดว่านักพัฒนาแอปทั้ง Android และ iOS ในบ้านเราส่วนมากน่าจะใช้บริการ Crashlytics ซึ่งเป็น crash reporter อันดับหนึ่งในโลกตอนนี้ และเมื่อเดือนมีนาคมที่ผ่านมาทีม Firebase ก็เพิ่งจะได้ประกาศว่าบริการตัวนี้ได้ออกจากสถานะ Beta และเข้าสู่สถานะ GA แล้ว สำหรับใครที่ยังไม่รู้จักก็สามารถไปทำความรู้จัก Firebase Crashlytics ได้ที่บทความนี้เลย

โดยการรายงาน crash ของ Firebase Crashlytics นั้น ก็จะส่งอีเมลแจ้งเมื่อมี crash เกิดขึ้นในแอปของเรา 3 รูปแบบด้วยกันคือ

  1. New Issue: crash ที่เกิดขึ้นใหม่(ยังไม่เคยเจอมาก่อน)
  2. Regressed Issue: crash ที่เราเคยแจ้งปิดไป แล้วมันกลับมาอีก(กรณีที่เราแก้แล้ว สามารถไปกดแจ้งปิดใน Console ได้ เพื่อไม่ให้ทีมสับสันว่าแก้ไปแล้วหรือยัง)
  3. Velocity Alert: crash ที่เกิดขึ้นอย่างมากมายในเวลาอันรวดเร็ว ส่งผลกระทบกับผู้ใช้จำนวนมาก(สัญญาณเตือนให้รีบแก้ ไม่ก็ rollback โดยด่วน)

แต่การรายงาน crash ผ่านอีเมลนั้น นักพัฒนาก็อาจจะเข้าถึงได้ไม่รวดเร็วนัก เพราะนักพัฒนาบางท่านก็อาจไม่ค่อยได้เปิดอีเมลเท่าไร(โดยเฉพาะอีเมลบริษัท 555+) ดังนั้นเราจะแจ้งเตือนผ่านอะไรดีหละ โจทย์ของเราคือ ต้องอัตโนมัติ, เป็นช่องทางที่นักพัฒนา active, รวดเร็ว และฟรี!…ติ๊ก ตอก ติ๊ก ตอก…ใช่หมองนั่งมาธิ…ปิ๊ง…งั้นผ่านแอป LINE ละกัน เพราะคนไทยที่มีสมา์ทโฟนใช้ LINE กันกว่า 95%


รู้จักกับ LINE Notify

LINE Notify เป็น Official Account(OA) ตัวหนึ่งที่ได้จัดเตรียม APIs ให้นักพัฒนาสามารถที่จะส่งข้อความเข้าไปได้ และจะแจ้ง notifications ให้กับบุคคลแบบ 1 ต่อ 1 หรือแบบกลุ่มก็ได้ ถึงตรงนี้ให้ผู้อ่านจินตนาการไปก่อนเลยว่า จะมีกลุ่ม LINE ของนักพัฒนาในทีม หรือในบริษัท(กรณีต้องการ ฆ่าน้อง ฟ้องนาย ขายเพื่อน) ที่พร้อม standby รอรับการแจ้งเตือน crash ผ่าน LINE

เริ่มแรกให้เราทำการเพิ่มตัว OA ที่ชื่อ LINE Notify กันก่อน โดยจะใช้ LINE แสกน QR จากรูปนี้ หรือจะค้นคำว่า LINE Notify จาก OA ก็ได้

เจอตัวละ ก็กด add ไปแบบเบาๆ แต่เดี๋ยวก่อน ผมชอบ short description ของ OA ตัวนี้จัง “Connect Everything” ขอให้ชื่อไทยว่า “เชื่อมต่อทุกสรรพสิ่ง” เพราะมี use case ในการใช้ LINE Notify ในโลกเยอะมากทั้ง รายงานหุ้น, สภาพอากาศ, หวย, บอล หรือรายงานสถานะต่างๆจากอุปกรณ์ IoT แต่โจทย์ของเราในวันนี้คือ จะช่วยให้ชีวิตนักพัฒนาดีขึ้น(คิดการใหญ่ ใจต้องนิ่ง หวะฮะฮา)

ลำดับถัดไป ก็เข้าไปที่เว็บ https://notify-bot.line.me/en/ แล้วให้กด Log in ที่มุมขวาบน ระบุอีเมลและรหัสผ่านของเราให้เรียบร้อย แล้วกด Log in ต่อไปเลย

เมื่อ Log in ผ่านแล้วก็เลือกเมนู My page จาก dropdown ที่มุมบนขวา จะเจอหน้าที่ให้ generate access token ละ ให้กดตุ่ม Generate token

หลังจากนั้นจะมี popup แสดงขึ้นมา ตรงจุดนี้ให้ตั้งชื่อ token เพื่อที่จะแสดงให้รู้ว่า notification อันนี้มาจากเรื่องอะไร(กรณีสร้างไว้หลายตัว) และถัดลงมาเราจะมีทางเลือก 2 ทางคือ ให้ notify แบบ 1 ต่อ 1 มาให้เราเพียงผู้เดียว กับอีกทางเลือกคือ กลุ่มที่เราต้องการ notify ไป ซึ่งในที่นี่ผมจะเลือกกลุ่ม “Healthy ยันหว่าง” (กลุ่มคนขี้โรคที่กลับใจคิดจะออกกำลังกาย ย้ำว่าแค่คิด)

เฉพาะกรณีที่เลือกแบบ กลุ่ม ให้เราไป invite ตัว LINE Notify เข้ากลุ่มด้วย

เฉพาะสร้าง token แบบกลุ่มให้ invite ตัว LINE Notify เข้ากลุ่มด้วย

จากนั้นก็กด Generate token ได้เลย

ให้กด Copy ตัว token เอาไว้ให้มั่น เพราะเราจะได้เจอมันแค่ครั้งเดียวต่อการสร้างหนึ่งครั้ง

LINE Notify ก็มีข้อความแจ้งเตือนว่าได้มีการสร้าง access token แล้ว อย่าลืมไป invite ตัว LINE Notify เข้ากลุ่ม “Healthy ยันหว่าง” ด้วย

เอาหละถึงขั้นตอนนี้เราก็จะพร้อม coding กันแล้ว


รู้จักกับ LINE Notify API เพื่อส่งข้อความ Notification

รายละเอียดมีดังนี้

การระบุตัวแปร imageThumbnail จะต้องระบุ imageFullsize ด้วยเสมอ เช่นเดียวกับการระบุตัวแปร stickerPackageId จะต้องระบุ stickerId ด้วย

คราวนี้เรามาลองดูตัวอย่างผ่าน Postman กันก่อนดีกว่า

จากตัวอย่างจะส่งทั้งข้อความ, สติ๊กเกอร์, และรูปภาพในครั้งเดียวกัน

อัยยะ! ยิงปุ๊บเข้าปั๊บเลย ไม่ต้องรอจนเคี้ยวหมากแหลก แต่เอ๊ะ ตอน response ส่งกลับมามีค่าบางอย่างแนบมาใน Headers ด้วย

จริงๆแล้วมันคือตัวที่บอก limit การใช้งานนั่นเอง ซึ่งเขาคิดกันเป็นชั่วโมง แปลว่าครบชั่วโมงก็จะ reset เริ่มใหม่ มาดูกันว่ามีอะไรบ้าง

  • X-RateLimit-Limit: จำนวนครั้งในการเรียก API โดยปกติอยู่ที่ 1,000 ครั้ง
  • X-RateLimit-Remaining: จำนวนครั้งที่ยังสามารถเรียก API ได้ภายใน 1 ชม.
  • X-RateLimit-ImageLimit: จำนวนครั้งในการอัพโหลดรูปภาพไปที่ server ของ LINE ซึ่งตอนนี้อยู่ที่ 50 ครั้ง
  • X-RateLimit-ImageRemaining: จำนวนครั้งที่เหลือในการอัพโหลดรูปได้ภายใน 1 ชม.
  • X-RateLimit-Reset: เวลาที่จะ reset โควต้ากลับมาใหม่ หน่วยเป็น Unix Time

การ Integrate ระหว่าง Crashlytics กับ LINE Notify

ในการที่จะทำให้บริการทั้ง 2 สนิทสนมและทำงานกันอย่างกลมเกลียวได้นั้น เราจะต้องมีพ่อสื่อแม่ชักเข้ามาช่วย ซึ่งเขาก็คือ Cloud Functions for Firebase นั่นเอง ความสามารถของ Cloud Functions ก็คือรอรับ trigger จากบริการของ Firebase จากนั้นก็ run ฟังก์ชันที่เขียนด้วย Node.js ในฝั่ง server ให้ทำงาน และเมื่อวันที่ 3 เมษานี้เอง ทีม Firebase ก็เพิ่งจะประกาศเวอร์ชัน 1.0 สำหรับ Cloud Funtions อย่างเป็นทางการ และที่สำคัญคือโค้ดมีการเปลี่ยนแปลงอย่างมีนัยสำคัญ กล่าวคือใครจะใช้ Cloud Functions v1.0.x จะต้องทำการ migrate โค้ดเดิมด้วย และสำหรับใครที่ยังไม่รู้จักบริการตัวนี้ ก็แนะนำให้ไปอ่านบทความนี้ก่อน

เอาหละ คราวนี้จินตนาการต่อเลยว่าแอปเรา crash ปุ๊บ ตัว Crashlytics ก็จะดักจับไว้ และ trigger ให้ Cloud Functions ส่งข้อมูล crash ไปที่ LINE Notify…เมื่อจินตนาการเสร็จแล้ว มาดูโค้ดที่เป็น Node.js กันเลย

จากโค้ดด้านบนจะเป็นเขียนรอรับ trigger จาก Crashlytics สำหรับการแจ้งเตือนทั้ง 3 รูปแบบตามที่ได้อธิบายไว้ตั้งแต่ตอนต้นรายการ โดยจะส่งข้อความกับ sticker ไปที่ LINE Notify แตกต่างกันทั้ง 3 รูปแบบ ที่สำคัญใครจะเอาโค้ดชุดนี้ไปใช้อย่าลืมเปลี่ยน YOUR_ACCESS_TOKEN ไปเป็นของตัวเอง และไป config ค่า url ที่ชี้ไปยังหน้ารายละเอียดของ crash ด้วยหละ

ซึ่งตัวอย่างข้อความที่ผมปั้น url จะใช้ตัวแปร ${functions.config().crashlytics.url}${issueId} ซึ่งสามารถตั้งค่าได้จาก Firebase CLI ผ่านคำสั่ง

Crash URL มีรูปแบบตามนี้ https://console.firebase.google.com/project/<YOUR_PROJECT_ID>/crashlytics/app/<YOUR_APP_BUNDLE>/issues/<IssueId>

ตัวอย่าง https://console.firebase.google.com/project/jirawatee-12345/crashlytics/app/android:com.example.crashlytics/issues/59fad89f61b02d480da03e45

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

ก่อนจะจากกันไปเรามีข่าวดีจะแจ้งให้ผู้อ่านทราบ เมื่อเดือนที่ผ่านมาทีม Firebase ได้ส่งเมลให้นักพัฒนาทุกคน ซึ่งเนื้อหาในเมลก็คือใครที่ใช้ Blaze plan จะได้โควต้าการใช้ฟรีของ Spark plan มาด้วย นั้นแปลว่า หากใช้ไม่เกิน Spark plan ก็ไม่มีค่าใช้จ่าย

และที่ต้องแจ้งเพราะ Cloud Functions for Firebase จะอนุญาตให้นักพัฒนาไปเรียก API ภายนอกได้ก็ต่อเมื่อใช้ Blaze plan เท่านั้น ส่วนเรื่องราวของ LINE Notify ก็ยังไม่จบแต่เพียงเท่านี้ เดี๋ยวจะมีบทความภาค 2 ตามมาอีกเร็วๆนี้ โดยบทความหน้าจะ advance กว่านิดนึง คือเราจะสามารถส่ง notification ไปหาผู้ใช้เป็นรายบุคคลได้ ลองนึกภาพว่าเราซื้อสินค้าออนไลน์ แล้วมี notification ผ่าน LINE มาแจ้งสถานะการส่งสินค้าเป็นต้น สำหรับบทความนี้ก็คงมีแต่เพียงเท่านี้ ขอให้ทุกท่านสนุกกับการ Integrate ระหว่าง LINE และ Firebase นะครับ

LINE Developers Thailand

Closing the distance. Our mission is to bring people, information and services closer together

Jirawatee

Written by

Jirawatee

Technology Evangelist at LINE Thailand / Google Developer Expert - 🔥Firebase

LINE Developers Thailand

Closing the distance. Our mission is to bring people, information and services closer together

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade