《運維開發實踐:基于Sentry搭建錯誤日志監控系統》要點:
本文介紹了運維開發實踐:基于Sentry搭建錯誤日志監控系統,希望對您有用。如果有疑問,可以聯系我們。
錯誤日志監控也可稱為業務邏輯監控, 旨在對業務系統運行過程中產生的錯誤日志進行收集歸納和監控告警.似乎有那么點曾相識?沒錯… 就是上一篇文章提到的“APM應用性能監控”.但它又與APM不同,APM系統主要注重應用層的行為分析,收集的更多是運營方向的數據.而sentry所做的是收集應用底層代碼的崩潰信息,便于碼儂們排查代碼異常.簡單來說它就是一個面向技術碼儂的排障工具.
隨著運維自動化流程的推進, 各類運維工具和系統也像雨后春筍般涌現. 目前我們自主開發的運維系統的數量已經接近兩位數. 這些系統部署在多臺機器上, 通常還配套一批后臺運行的腳本. web端如果出現異常, 開發人員可以及時得到反饋進行修復. 而腳本因為沒有交互, 可能會出現發生重大故障時才定位到問題的情況.
最終整合的通知郵件如圖
上面的操作部分解決了腳本運行狀態監控盲區的問題, 但還存在如下問題
鑒于此, 我們了解了一些日志收集和監控方案, 選擇了sentry.
sentry是一個現代化的錯誤日志記錄和聚合平臺.支持幾乎所有主流開發語言和平臺, 并提供了現代化UI, 如圖
與ELK, splunk不同, sentry專注于應用程序產生的錯誤日志的聚合和監控. 官方提供了多個語言的SDK.
多達30種集成方式
讓開發者第一時間獲悉錯誤信息, 并方便的整合進自己和團隊的工作流中.
為了直觀的展示sentry的強大, 這里模擬一個常見的場景, 如有雷同, 純屬巧合.
接入sentry前
接入后
接入sentry前
接入后
sentry官方提供了詳細的部署文檔, 網上也可以搜索到中文的安裝教程, 安裝過程不贅述. 想要嘗鮮的小伙伴也可以直接使用sentry官方提供的saas, 免費版支持每天5000個event. 地址是 https://sentry.io
使用sentry, 需要弄清楚幾個概念:
sentry服務端的配置主要是名稱, 告警規則等, 至于被監控項目是前端還是后端區別不大.
告警規則的配置相當靈活, 且可以對多個條件進行與或判斷
郵件服務器的配置請參考官方文檔, 自己搭建的sentry服務器如果發現集成類型很少, 可以安裝官方或第三方插件進行擴展
在服務端配置結束后, 可以開始配置客戶端.
因為我們的系統主要用python開發, 在此以python為例.
python接入sentry十分簡單. 官方提供了十幾種python環境(框架)下使用sentry的例子, 比如在celery中
from raven import Client from raven.contrib.celery import register_signal, register_logger_signal client = Client(DSN) # register a custom filter to filter out duplicate logs register_logger_signal(client) # The register_logger_signal function can also take an optional argument # `loglevel` which is the level used for the handler created. # Defaults to `logging.ERROR` register_logger_signal(client, loglevel=logging.INFO) # hook into the Celery error handler register_signal(client) # The register_signal function can also take an optional argument # `ignore_expected` which causes exception classes specified in Task.throws # to be ignored register_signal(client, ignore_expected=True)
個人推薦借鑒logging使用的例子, 原因是通常開發者會根據logging模塊定制自己的日志配置, 不直接使用框架內的日志模塊. 如果你在應用程序中只用了logging模塊, 那么接入sentry對已存在的代碼來說是透明的, 無需多加修改.
用logging模塊接入sentry只需兩步:
pip install raven
在應用程序的入口文件(tornado中的app.py等)中, 或者自定義的日志模塊中, 插入如下代碼
from raven.handlers.logging import SentryHandler from raven.conf import setup_logging handler = SentryHandler(DSN) handler.setLevel(logging.ERROR) setup_logging(handler)
完成了這兩步操作之后, 就可以像之前那樣使用logging模塊
import logging logger = logging.getLogger(__name__) logger.info(‘This is a test message’)
當上面的代碼被執行時, 除了原有的打log操作之外, raven還會向sentry服務器發送日志內容, 并向標準輸出添加
Sending message of length xxx to https://xxxx
如果希望向sentry發送更多上下文信息, 可以帶上extra參數
logger.error(‘This is a test message’, extra={‘stack’: True})
最終顯示在后臺的日志信息如圖
包含了日志級別, python環境信息, SDK信息, 棧調用, 前后n次日志輸出, 相關的其他事件等等, 如果是未捕獲的異常或帶上extra參數, 還會顯示中間變量的值, 很方便的定位到出錯的位置和數據, 無需再去代碼埋點.
前端的接入相對來說復雜一些
第一, 需要對sentry服務器的域名進行解析. 內部的系統, 后端監控可以給線上機器添加hosts指定sentry服務器的IP. 而前端, 因為錯誤日志是從用戶瀏覽器發出的, 需要用戶能自動解析sentry服務器的域名
第二, 如果前端項目用到了打包工具, 而通常打包工具會對代碼進行壓縮甚至混淆, 就會出現sentry收集到的日志無法準確定位問題代碼的情況 所幸, sentry支持導入sourcemap自動解析和還原代碼, 讓開發者在后臺能看到development環境一樣詳細的棧調用. (當然如果沒有用打包工具可以忽略這一步)
前端的接入這里以reactjs為例
npm i raven-js –save
在index.js文件(入口文件)中,
import Raven from ‘raven-js’; # 在適當的地方加入, 盡可能讓它早執行 Raven.config(DSN(public)).install();
其他前端框架的接入請參考官方文檔
https://docs.sentry.io/clients/javascript
提前生成好sourcemap文件, 實測source-map級別可以完美工作, cheap-source-map能定位到, 但顯示不友好. 當然, 最推薦的是cheap-module-source-map
# 安裝 npm i -g sentry-cli-binary # 登錄sentry sentry-cli –url SENTRY_URL login # SENTRY_URL指自建服務或官方saas地址, 執行命令后會訪問API TOKEN創建頁面, 生成一個TOKEN, 拷貝進來, 成功后TOKEN會被保留到系統用戶某個配置目錄下, 后續的請求都會重復使用這個TOKEN # 創建一個release sentry-cli releases -o sentry -p 7d04f2c51f32 new test01 –finalize # 這里的sentry 和7d04f2c51f32 是指 組織名稱和項目名稱, 均指*簡稱*, 與sentry頁面上默認顯示的不同, 需要到配置頁面查看 # 上傳dist目錄下的文件 sentry-cli releases -o sentry -p 7d04f2c51f32 files test01 upload-sourcemaps dist # 刪除舊的release下的所有文件 sentry-cli releases -o sentry -p 7d04f2c51f32 files test01 delete –all # 當然這個命令是不想要release上的文件的時候執行的
注意, 生成的map文件與上傳的相對路徑需要一致. 比如, dist目錄是打包后的文件存放目錄, map文件為sourcemap/[file].map, 則sentry-cli上傳目錄應該是dist, 這樣map文件才會顯示在sentry后臺的~/sourcemap/目錄下.
這樣的webpack配置
devtool = ‘source-map’; output.path: ‘dist’; output.sourceMapFilename = ‘sourcemap/[file].map’;
則對應這樣的命令
sentry-cli releases -o sentry -p 7d04f2c51f32 files test02 upload-sourcemaps dist
另外, sentry-cli提供了一個參數–url-prefix, 可以為上傳的map文件添加前綴, 默認是~/, 有興趣的同學可以試試看
再補充一點, sentry需要根據js文件的sourceMappingURL來解析map文件路徑, 所以sourcemap級別不能用hide-source-map或者類似的.
代碼上傳完畢后, 在版本->工件頁面可以看到該release上的文件, 如圖
最終錯誤日志效果如圖
篇幅所限, sentry后臺的使用簡要講幾點
第一,自定義過濾?
sentry提供了豐富的過濾選項, 默認過濾條件是”Unresolved Issues”, 用戶也可以自己組合過濾條件, 并保存成個人或團隊的默認選項
第二,頁面實時更新?
上圖中間的按鈕可以開啟或關閉issues頁面的實時刷新,
第三,統計和概覽
上圖是系統管理員頁面, 可以看到系統調用, 等待中的任務隊列等的情況, 在個人帳號首頁也能看到項目的統計信息.
文章來自微信公眾號:運維軍團
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/1963.html