如何擴展分布式日志組件(Exceptionless)的Webhook事件通知類型?


寫在前面

從上一篇博客高並發、低延遲之C#玩轉CPU高速緩存(附示例)到現在又有幾個月沒寫博客了,啥也不說,變得越來越懶了,懶惰產生了拖延后遺症。
img

最近一周升級了微服務項目使用的分布式日志組件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鈎子;這樣就能夠實時地收到來自應用的推送信息,而不必要不斷地輪訓來請求信息。

一圖勝千言:

img

有了上面的鋪墊,那么與Exceptionless的集成就如下圖所示:

定義Exceptionless的web鈎子

從上圖可以看到,web鈎子就是一個能夠處理http post請求的web server后端,決定采用aspnet core來實現,首先調研了微軟的項目WebHooks,它並沒有對接Exceptionless,而且還是采用MVC開發,最終找到了另外一個開源項目,采用中間件攔截,我在其基礎上進行了如下擴展:

  1. 添加容器化部署腳本,支持docker、kubernetes,迎合雲原生。
  2. 擴展事件模型,添加環境、來源等信息,方便追溯。
  3. 升級項目為netcoreapp2.1。
  4. 優化httpclient使用方式。
  5. 本地化事件時間、容器時間、序列化時間。

並添加詳細的部署、配置說明。有興趣同學歡迎查看我的項目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感興趣的話可以關注我,我會定期的在博客分享我的學習心得。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM