0%

使用 Sentry 收集錯誤並將訊息送至 Slack

前言

大家好,我是 Chatbot TW 的 NiJia

當產品開發完上線後難免會遇到可能是邏輯上的 Bug、例外錯誤或是想記錄使用上的錯誤,當沒有工具時都只能等錯誤出來時乖乖的去翻 Log 找問題,對於每次出錯要 Debug 的我就覺得很困擾 😭。

公司強者寫 APP 的同事他們都很開心的在使用 Crashlytics 幫他們將 APP 出問題時將錯誤訊息丟上去,看了實在時羨慕,但那們寫 Web 的朋友要怎麼辦!

最近就發現了Sentry這個玩意兒(應該是有段時間的產品了),支援了幾乎支持現在市場上主流的各種框架以及語言,且串接上也都很簡單就能實現,文件也都清楚解釋每個 API 的功能如何使用,以下就來介紹如何使用它吧 😎

這邊顯示較常用的語言,還有支援很多其他種類的框架及語言

說明

如何使用

首先先到 https://sentry.io/welcome/ Get start


這邊可以整合了GitHub或者Azure DevOps兩種 OAuth 的登入方式


接著就照著步驟來囉!


選擇自己所使用的語言,這邊我使用 Flask(python) 框架來實作


接著官方會有個簡單的文件告訴你要如何實作這塊,這邊就先使用pip在本地安裝套件

1
pip install --upgrade "sentry-sdk[flask]==0.13.2"

若是使用雲端服務的話需要將sentry-sdk[flask]==0.13.2放入 requirements.txt 中

將以下 init code 放入 api.py 裡,在 app = Flask(__name__) 之前

這邊我將 Sentry 的 DSN 放入 .env 裡,若有參考這部分的朋友需要注意環境變數的地方喔!

1
2
3
4
5
6
7
import sentry_sdk
from sentry_sdk.integrations.flask import FlaskIntegration

sentry_sdk.init(
dsn=os.environ.get('SENTRY_DSN'),
integrations=[FlaskIntegration()]
)


接著就開始丟錯誤上去看看狀態,我的專案上是串著 LINE Bot,功能只是當個應聲蟲,在這情況下只需要丟個貼圖給它就會出錯

當錯誤丟出來之後原本監聽的紅色燈號就會打勾囉 ✅

Sentry 預設都會寄信通知,所以若有錯誤記得看信箱哦!


點進去後就可以很清楚的看到程式是錯在第幾行,寫到這有種莫名的感動,平常都是在 LOG 海裡找看看到底報錯在哪邊,終於有個地方能幫我接下來了 🎉

到這邊基本串接已經完成了,但身為免費導向的工程師怎麼能讓 5000/月 限制我!接下來就要去過濾一下來的錯誤內容,若不是系統造成的錯誤就不上傳。

我選擇判斷 Log 達到Waring或是Internal就回報,並照著官方的指示新增以下內容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import sentry_sdk
from sentry_sdk.integrations.flask import FlaskIntegration
+ import logging
+ from http.client import HTTPException
+ from sentry_sdk.integrations.logging import LoggingIntegration


+ def strip_sensitive_data(event, hint):
+ if "exc_info" in hint:
+ instance = hint['exc_info'][1]
+ if isinstance(instance, HTTPException) and instance.code < 500:
+ return None
+ return event


+ sentry_logging = LoggingIntegration(
+ level=logging.INFO,
+ event_level=logging.WARNING
+ )

sentry_sdk.init(
dsn=os.environ.get('SENTRY_DSN'),
+ before_send=strip_sensitive_data,
+ integrations=[FlaskIntegration(), sentry_logging]
)
  • strip_sensitive_data: 過濾來自 Http 的 Exception 錯誤碼是否大於500,否則不回傳。
  • sentry_logging: 使用 SDK 的 LoggingIntegration 來定義 log 回傳事件時的層級到哪層才上傳錯誤訊息,這邊我設定Waring等級,並加入到 init 的 integrations 裡。

此時不管你打上都會將訊息送上 Sentry:

1
2
logging.waring("i am waring")
logging.error("i am error")

或者是

1
raise InternalServerError("Hi Error")

或者!!自己手殘讓程式崩潰也會送通知

到這基本上已經完成串接完成並能過濾錯誤訊息,接下來則為將服務串至 Slack 上。

Slack bot 串接

首先來到Settings按下Integrations會看到以下畫面,並安裝一下Slack


接著就要跟 Slack 連動囉


連動完成後再按下configure來設定以下內容


到了Alerts頁面後就開始設定以下內容囉,這部分參考官方文件


可以指定透過哪個group去傳送至哪個tag,我就直接送到預設的#general


測試就直接送出貼圖來讓 bot 報錯,結果就收到key的錯誤啦~

結論

最後就能透過sls deploy將專案部署到 AWS 上,透過這次的紀錄對 Sentry SDK 運作在框架上的問題更加了解,同時也找到了一個不僅可以紀錄錯誤還能通知我錯誤訊息的地方,可以在第一時間直接進去分析 log,若完成了可以直接在 slack 上按Reslove來完成這個 issue。

本來有在考慮要串接LINE Notify,不過看著 Sentry 對 Slack 的整合比較好,也就放棄了這個念頭了 🤣,但串接哪個平台其實就看公司的需求,Sentry 一樣可以透過 webhook 將錯誤訊息傳至 Server。

此外它一樣可以整合GithubGitLabAzure DevOps…等等,若錯誤處理好的話可以讓 Sentry 幫你送 Issue 上去,不僅整個超炫砲 😎,若是 open source 的專案也可以大家一起去修這個問題,真的是一舉兩得啊!!!