監控指標
機器維度
機器維度的監控指標包括CPU、Load、內存、網絡、IO、磁盤等相關指標,詳細指標可以參考Liux監控命令對應的指標數據:https://linux.cn/article-9373-1.html?pr (主要可以參見top、vmstat 、free、iostat、netstat 、iptraf等命令相關的核心指標)。
應用維度
應用維度的監控指標包括JVM使用情況、線程池使用情況:JVM情況主要包括YGC次數、時間,FullGC次數、時間,新生代老年代占比;線程池情況主要包括的線程池大小、最大線程數、活躍線程數、隊列大小等。
服務維度
服務維度的監控指標包括error日志報錯情況、服務接口調用量、耗時、成功率,調用接口調用量、耗時、成功率,dal層操作調用量、耗時、成功率。
外部依賴維度
外部依賴維度主要指應用系統常見的外部依賴的監控情況,主要包括數據庫、緩存、消息隊列等,這些一般情況都會獨立進行部署,對應的機器監控同上面列舉的機器維度監控;另外數據庫還需要關注連接數、內存使用、SQL調用量、耗時、成功率,慢SQL等;緩存需要關注調用量、成功率,命中率、內存使用等;消息隊列需要關注調用量、成功率,隊列積壓情況、死信隊列等
整體監控維度
整體上的監控指標包括可用性監控(服務是否可用)、訪問量監控(PV/UV)、負載監控(限流、熔斷情況)、自定義的業務監控(異常業務場景、服務統計等)
監控系統設計
實現思路
要想實現完整的監控系統設計應該包括如下幾步:數據采集—》數據整理存儲—》數據展示;
其中數據采集可以通過在機器上安裝客戶端或者應用中引入客戶端方式進行采集,應用日志可以使用統一的AOP攔截方式進行打印,然后通過獨立線程定時掃描上傳到服務端,上傳方式可以使用消息中間件進行數據傳輸,服務端消費隊列消息進行數據的整理存儲;
監控服務端接收到上送的監控數據后,應該對數據進行清洗,然后對數據進行存儲;由于監控數據會比較龐雜且是非結構化數據,這里最好使用非關系數據庫進行存儲,并對數據建立合適的索引,以便于監控數據的查詢展示;
監控數據存儲好后還需要有個便于監控數據查看,界面友好的展示系統進行數據的可視化報圖表展示,而且這個圖表最好可以支持自定義的格式配置。
注意事項
系統監控除了常規監控外,還需要支持可配置的監控指標,例如自定義日志告警、成功率告警等
數據展示除了常規數據展示外,還需要支持自定義的監控數據展示,例如數據的各種組合圖表、統計圖表等
分布式系統監控發現問題,還需要能夠快速定位,這個時候就需要應用有分布式追蹤的實現,另外日志盡量有統一規范格式便于解析
具體實現
現有開源的常見監控系統實現有zabbix,ELK(ElasticSearch+Logstash+Kibana ),大眾點評的CAT,另外在監控快速定位問題這塊大廠的實現有Google的Drapper、阿里的鷹眼、京東的hydra、Twitter的OpenZipkin,詳細介紹可見網上博文《各大廠分布式鏈路跟蹤系統架構對比》