寫在前面
從上一篇博客高並發、低延遲之C#玩轉CPU高速緩存(附示例)到現在又有幾個月沒寫博客了,啥也不說,變得越來越懶了,懶惰產生了拖延后遺症。
最近一周升級了微服務項目使用的分布式日志組件Exceptionless到最新的版本,隨着項目的不斷迭代上線,我們總是想要第一時間知曉線上程序是否正常運行,特別是采用微服務架構的項目,不然心里總感覺有一塊石頭不知道啥時候落地。前期都是人工時不時地查看,其中有一次,異常都報了幾個小時了,但是由於當時我正在專注地做另外的事情,直到線上出現服務不可用時才發現,於是決定暫時放下手頭所有的事情,接入Exceptionless的事件通知機制,當拋出異常、或者發生錯誤的日志時,發送消息了釘釘辦公群,做到實時感知運維報警提醒,所以需要接入Exceptionless的Webhook通知類型,
什么是webhook?
WebHook,是一種HTTP交互的增強模式,是用戶定義的http回調,這些回調由第三方的用戶、開發人員自己定義、維護、管理,就好像允許別人掛載一條帶鈎的線到你的Web網站或者應用程序的上,然后通過這條線實時地給你推送信息,這條帶鈎的線就叫web鈎子。 也可以將webhook看作是一種簡潔的Sub/pub模式,只不過此時事件的載體是一個Http Post請求。
一言以蔽之,web鈎子就是一種http回調,由於一般都采用post的方式來推送信息,更直接、簡單地說web鈎子就是一種http post回調。
正是由於它的簡潔性,很多主流的Saas系統都暴露有自己的Webhook,其中包括Dropbox, GitHub, GitLab, Instagram, MailChimp, PayPal, Slack, Trello等等,例如,我們可以為github代碼提交定義一個web鈎子;為Paypal的支付狀態定義一個Web鈎子;這樣就能夠實時地收到來自應用的推送信息,而不必要不斷地輪訓來請求信息。
一圖勝千言:
有了上面的鋪墊,那么與Exceptionless的集成就如下圖所示:
定義Exceptionless的web鈎子
從上圖可以看到,web鈎子就是一個能夠處理http post請求的web server后端,決定采用aspnet core來實現,首先調研了微軟的項目WebHooks,它並沒有對接Exceptionless,而且還是采用MVC開發,最終找到了另外一個開源項目,采用中間件攔截,我在其基礎上進行了如下擴展:
- 添加容器化部署腳本,支持docker、kubernetes,迎合雲原生。
- 擴展事件模型,添加環境、來源等信息,方便追溯。
- 升級項目為netcoreapp2.1。
- 優化httpclient使用方式。
- 本地化事件時間、容器時間、序列化時間。
並添加詳細的部署、配置說明。有興趣同學歡迎查看我的項目exceptionless-webhooks 。
最終的釘釘群消息:
今日正題
完成了上面的准備工作,現在開始進入正題,擴展Exceptionless的通知類型。
淺析Exception工作機制
Exceptionless邏輯上采用完全異步化的設計,當收到日志事件時,首先寫到緩存隊列(redis),然后再啟動各種job來消費消息,最終寫到elasticsearch數據庫,所以說Exceptionless是一個准實時的分布式日志組件,事件的處理管道如圖所示:
首先對事件進行守衛檢查、分配到Stack(分類聚合事件)、打標記(比如:關鍵錯誤)等,然后保存事件,更新統計信息,最后發送各種通知,大致流程就是這樣子。那么自然而然與通知(包括Email、Slack即時通訊、Web鈎子等)相關的處理邏輯就在都在步驟070中。
擴展新的事件通知類型:
- Error
未知的異常 - LogError
錯誤的日志信息
1. 添加新的事件類型元數據。
2. 添加新的事件類型擴展方法。
3. 修改步驟070中的邏輯。
到目前為止,Exceptionless的后端修改工作圓滿完成,接下來修改它的Argular前端,具體的修改代碼就不貼了,最終的界面如下:
到這里所有的工作都已經完成了,通過選擇配置項控制Webhook的事件通知類型,達到了預期目的。
總結
本篇我們先以白話文的方式講解了什么是webhook,為后面與Exceptionless的集成做好鋪墊,然后編寫了web鈎子程序,最后通過為Exceptionless擴展新的事件通知類型來滿足我們的需求,希望把從分析到最后完工的整個過程分享給大家。
最新的代碼
后端:https://github.com/justmine66/Exceptionless。
前端:https://github.com/justmine66/Exceptionless.UI。
寫在最后
如果有什么疑問和見解,歡迎評論區交流。
如果你覺得本篇文章對您有幫助的話,感謝您的【推薦】。
如果你也對Exceptionless感興趣的話可以關注我,我會定期的在博客分享我的學習心得。