本次分享的內容是監控報警系統搭建,以及基於開源組件的二次開發。自從接受了公司監控報警系統二期開發需求以來,咱們完成了監控數據的補全完善、報警系統搭建調試和報警規則配置界面的開發。下圖是監控報警系統的架構圖,除了業務數據收集器外,其他所有基於原生開源組件或二次開發完成,整個系統採用TICK(telegraf + influxdb + chronograf + kapacitor)架構,使用go語言實現。php
influxdb數據庫是一個時間序列數據庫,他會爲每行數據打上時間戳,即便數據被併發寫入,也會按照時間前後順序存儲。同時它也是一個關係型數據庫,能夠經過sql語言進行增刪改查,學習成本低。官方提供了一個簡單實用的web界面,很是地人性化。在工程實踐中,咱們發現了它的一個坑,在大數據量查詢時會crash,重啓後才能恢復,這個問題仍待研究。沒必要擔憂的是,由於監控系統中不存在特別大數據量的查詢,生產環境下influxdb的性能表現十分良好。mysql
telegraf是一個數據收集器,負責收集全部的原始數據,格式化後存入influxdb。telegraf內置了大量的數據輸入、輸出和分析插件,可以收集php-fpm、nginx、access log、mysql、redis等組件的監控數據。telegraf的擴展性很強,開源社區也十分活躍,來自世界各地的開發者們會源源不斷地貢獻新的插件。咱們基於它的插件架構開發了redis queue input plugin和access log parser plugin,用於收集和分析Laravel框架隊列和access log數據。nginx
collector是整個系統中惟一自研的組件。因爲業務監控數據查詢規則複雜多變,咱們開發了這個組件,用於從MySQL中查詢業務數據,支持配置sql語句、收集頻率、時間延遲等,而且按照influxdb的格式發送給telegraf數據收集器。git
kapacitor是一個能夠按照預先編寫好的規則,實時地訂閱influxdb數據或者批量查詢數據,並進行報警(郵件、短信、日誌、exec等方式)的工具。官方爲它設計了一個tickscript語言,能夠方便地編寫規則腳本。咱們的主要工做是tickscript的學習調試、報警規則的設計、報警週期(every字段)的調整和數據窗口(period字段)的調整。咱們將報警腳本的修改重啓、報警腳本運行狀態的查詢和influxdb數據訂閱狀態的查詢等命令編寫成了shell腳本,便於後期維護和自動化。github
grafana是一個數據可視化的組件,相似著名ELK架構中的kibana組件,支持多種數據源(influxdb、zabbix、elasticsearch等),還有不少插件可供安裝,在最新版本中加入了簡單的alert、電視模式等新功能。特別須要分享的是某些監控數據是隨時間不斷累加的,在展現時要應用聚合函數(difference、max、min等)進行處理。同時還能夠爲單個圖表配置超連接,加強交互性和可用性。還有不少有趣的功能,留待你們研究發現。web
chronograf是influxdata官方提供的一個數據可視化組件,可視化功能不如grafana強大,亮點是附帶了kapacitor組件的web界面,能夠方便地配置報警規則,自動生成並啓用tickscript,還能夠查詢報警歷史。咱們對它進行了修改,美化了報警郵件的模板,增長了報警週期(every字段)和報警時間段的配置,讓郵件內容更加友好,而且能夠自由調整報警週期。redis
綜上,咱們在TICK開源架構上,結合咱們自身業務特色和需求,研發了一整套包含數據採集格式化、可視化監控、自動化報警功能的監控報警系統,從此還將不斷調整優化,更好地爲公司業務發展和技術研發團隊服務。sql