一篇文章講透線上應(yīng)用監(jiān)控

“線上服務(wù)停了,要重啟一下”?久經(jīng)職場(chǎng)做研發(fā)的程序員,視線會(huì)逐漸轉(zhuǎn)移到線上應(yīng)用的運(yùn)行狀態(tài)。設(shè)想一下,如果你在半夜兩點(diǎn)正在酣眠美夢(mèng)時(shí),微信群里突然炸開(kāi)鍋:“服務(wù)停了,先重啟。。?!保瑢?duì)于有起床氣的你而言,美夢(mèng)終結(jié),是否能忍?


今天主要分三大塊:應(yīng)用狀態(tài)監(jiān)控、基于應(yīng)用日志的監(jiān)控、升華部分(老司機(jī),帶你飛),稍微聊一下應(yīng)用監(jiān)控相關(guān)的知識(shí)。


嚴(yán)重聲明:

1. 今天的貨相當(dāng)?shù)母?,今天的?nèi)容相當(dāng)?shù)臒X,請(qǐng)?zhí)崆昂茸懔鶄€(gè)核桃!

2. 但我相信堅(jiān)持閱讀到最后,你肯定不虛此行??!

01. 應(yīng)用服務(wù)狀態(tài)監(jiān)控

生產(chǎn)上應(yīng)用服務(wù)的運(yùn)行一般要求 7 x 24,穩(wěn)定運(yùn)行率達(dá)到 99.99%。其中除了保證應(yīng)用本身的健壯性外,當(dāng)然還需要依賴(lài)一些守護(hù)程序做監(jiān)控。不然一旦服務(wù)出現(xiàn)假死了怎么辦?

首先我們能想到的,便是通過(guò)寥寥幾行 linux 命令,組成一個(gè)小而精悍的 shell 文件,偶爾再配上 crontab 定時(shí)任務(wù),來(lái)完成應(yīng)用服務(wù)的進(jìn)程守護(hù)。不扯別的,打開(kāi)常用的 monitor.sh 腳本一探究竟(以 tomcat 為例)。

麻雀雖小五臟俱全,讓我們解剖一下麻雀。

如何判斷應(yīng)用處于假死?通過(guò)配置健康檢查 url,專(zhuān)門(mén)用于心跳檢測(cè),當(dāng)每次訪問(wèn)時(shí)正常返回 200 狀態(tài)碼,就認(rèn)為應(yīng)用還可以正常提供服務(wù)。如果返回的不是 200 狀態(tài)碼,則判斷應(yīng)用的進(jìn)程 ID 是否存在,存在則說(shuō)明處于假死狀態(tài)。

如何實(shí)現(xiàn)假死應(yīng)用重啟?通過(guò) ps -ef|grep "tomcat" | grep -w 'tomcat' | grep -v "grep" |awk '{print $2}' 獲取對(duì)應(yīng)的進(jìn)程 ID,如果進(jìn)程 ID 存在,則進(jìn)行 kill,然后調(diào)用啟動(dòng)命令進(jìn)行完成服務(wù)重啟。

上面的方式是在 shell 腳本中,實(shí)現(xiàn)每 60 秒檢查一次應(yīng)用服務(wù)狀態(tài)。另外我也經(jīng)常會(huì)用Linux 系統(tǒng)提供的 crontab,配置定時(shí)來(lái)調(diào)用監(jiān)控腳本,完成應(yīng)用監(jiān)控,還是以上面的 monitor.sh 腳本為例,稍作改動(dòng)注釋掉循環(huán)語(yǔ)句。


完成了腳本的編寫(xiě),接下來(lái)就是搭配 crontab 調(diào)度任務(wù)(第一次聽(tīng)說(shuō) crontab 這個(gè)詞的,請(qǐng)自行尋找谷歌、百度,惡補(bǔ)一下知識(shí))

*/1 * * * */app/script/monitor.sh > /dev/null 2>&1

如果你準(zhǔn)備采用上述方案試用時(shí),有兩個(gè)注意事項(xiàng):

注意一:請(qǐng)注意修改對(duì)應(yīng)的目錄,包括 tomcat 目錄、腳本目錄、心跳檢測(cè) url;

注意二:請(qǐng)注意針對(duì) shell 腳本賦上可執(zhí)行權(quán)限。

小腳本解決大問(wèn)題,所以別拿豆包不當(dāng)干糧,概有四兩撥千斤之勢(shì)。其實(shí)依據(jù)過(guò)往的經(jīng)歷,靜下來(lái)想一想,面對(duì)其它非 tomcat 服務(wù)監(jiān)控時(shí),又何嘗不是這種方案呢。到此最基本、最簡(jiǎn)單也最實(shí)用的應(yīng)用服務(wù)狀態(tài)監(jiān)控方案就說(shuō)完了。你 get 到了沒(méi)?


02. 基于應(yīng)用日志的監(jiān)控

接觸過(guò)金融項(xiàng)目的都知道,日志是解決系統(tǒng) Bug 的最后一盞阿拉丁神燈。在微服務(wù)發(fā)展如火如荼的今天,服務(wù)粒度越拆越細(xì)、模塊分工越來(lái)越明確,隨之而來(lái)的就是根據(jù)日志排查問(wèn)題就趨于繁瑣。那么是不是可以把微服務(wù)的日志進(jìn)行歸集到一起呢?業(yè)界已經(jīng)有很多成型的方案。那接下來(lái)就聊聊如何進(jìn)行日志歸集呢?歸集的日志如何進(jìn)行存儲(chǔ)呢?存儲(chǔ)的日志該如何展示呢?如何實(shí)現(xiàn)告警呢?

如何進(jìn)行日志歸集?

業(yè)界常見(jiàn)的日志歸集方案,莫非就分為兩種:一種是直采方式;另一種是 agent 方式。

所謂的直采方式,就是在應(yīng)用程序中將日志,直接上傳到存儲(chǔ)層或者服務(wù)端,例如 Log4j 的 appender 。

所謂的 agent 方式,相當(dāng)于在應(yīng)用機(jī)器上部署一個(gè) agent 服務(wù),專(zhuān)門(mén)用于采集日志,然后推送到存儲(chǔ)層或者服務(wù)端,應(yīng)用本身只負(fù)責(zé)產(chǎn)生日志。

直采方式適用于:在面對(duì)沒(méi)有額外的資源,可以獨(dú)立部署采集日志的 agent 時(shí),例如負(fù)載均衡設(shè)備,那就不得不考慮直采方式。

agent 方式適用于:只要應(yīng)用將日志以文件的形式輸出到磁盤(pán)上,agent 就可以將日志采集到,并且對(duì)應(yīng)用本身松耦合。與直采方式相比:可擴(kuò)展性、可維護(hù)性,agent采集方式更勝一籌。

業(yè)界常見(jiàn)的日志歸集工具有哪些呢?

一大堆輪子呼之欲出。Elastic 旗下的 Logstash、Elastic 旗下的 Filebeat、Apache 麾下的 Flume、Linux 系統(tǒng)提供的 Syslog/Rsyslog/Syslog-ng 堪稱(chēng) Syslog 一系列、Facebook 名下的 Scribe 等等等。

估計(jì)堅(jiān)持閱讀到此的你會(huì)一臉的懵逼,沒(méi)關(guān)系,就當(dāng)今天擴(kuò)展一下知識(shí)面吧。今天我主要提提我用過(guò)的兩款:Elastic 旗下的 Filebeat、Apache 麾下的 Flume。

Filebeat 是用 Go 語(yǔ)言開(kāi)發(fā),是一個(gè)二進(jìn)制文件,部署無(wú)依賴(lài),占用資源極少,輕量 3M 多,開(kāi)箱即用,親測(cè)使用特別方便。而且業(yè)界名聲也不小,是 ELK 架構(gòu)升級(jí)后的產(chǎn)物,請(qǐng)問(wèn)你是否聽(tīng)說(shuō)過(guò) ELK 呢(笑哭)?

Flume 是用 Java 語(yǔ)言開(kāi)發(fā),我用 Flume 主要是集成到項(xiàng)目框架中提供日志歸集的能力,主要針對(duì) Flume 去除了一些冗余,擴(kuò)展了部分功能,進(jìn)行了二次擴(kuò)展開(kāi)發(fā)(后續(xù)有時(shí)間專(zhuān)門(mén)寫(xiě)一篇 Flume 二次開(kāi)發(fā)的那些事兒,請(qǐng)期待)。


歸集的日志如何進(jìn)行存儲(chǔ)呢?

又一堆輪子呼之欲出。ElasticSearch、Mongodb、HDFS、時(shí)序數(shù)據(jù)庫(kù) influxdb、opentsdb、rrd等等。由于工作場(chǎng)景的需要,通過(guò)關(guān)鍵詞進(jìn)行定位查詢(xún),而elasticsearch 做查詢(xún)是最合適不過(guò)的了。因?yàn)槊總€(gè)輪子,有每個(gè)輪子的使用場(chǎng)景,在此就不做深入展開(kāi)。


有哪些日志分析可視化工具?


對(duì),你肯定猜到了,又一堆輪子呼之欲出?;?Node.js 開(kāi)發(fā)的展示工具,提供日志展示、匯總、搜索,分析儀表盤(pán)等功能的 kibana;基于 go 語(yǔ)言開(kāi)發(fā)的專(zhuān)注于根據(jù)CPU 和 IO 利用率之類(lèi)的特定指標(biāo)提供時(shí)間序列圖表的 Grafana。


如何實(shí)現(xiàn)告警呢?


萬(wàn)里長(zhǎng)征,只差一步。日志都?xì)w集到一起了,想看看有沒(méi)有某個(gè)關(guān)鍵字,例如 error、exception 等等,出現(xiàn)關(guān)鍵字就發(fā)個(gè)告警通知。

洋洋灑灑聊了這么多關(guān)于日志歸集的,我經(jīng)常用的是 ELK,后續(xù)找個(gè)時(shí)間詳細(xì)寫(xiě)一篇關(guān)于日志歸集的文章吧。


03. 升華一下,老司機(jī)帶你裝B,帶你飛

到目前為止,你已經(jīng)了解了如何實(shí)現(xiàn)應(yīng)用服務(wù)狀態(tài)的監(jiān)控,并且知道了如何基于日志做監(jiān)控的思路。那你曾經(jīng)有沒(méi)有糾結(jié)過(guò):一筆請(qǐng)求的調(diào)用關(guān)系呢?一筆請(qǐng)求大概穿越了多少個(gè)系統(tǒng)?一筆請(qǐng)求大概耗時(shí)都花費(fèi)那個(gè)節(jié)點(diǎn)?

先給大家拋個(gè)概念“APM 應(yīng)用性能監(jiān)控”(不懂的先自行填補(bǔ)一下知識(shí)空白),如果有時(shí)間的話,請(qǐng)你多重點(diǎn)關(guān)注以下三種 APM 組件。

第一種: Zipkin,是由 Twitter 公司開(kāi)源的分布式的跟蹤系統(tǒng),主要包括:數(shù)據(jù)的收集、存儲(chǔ)、查找和展現(xiàn)。

第二種:Pinpoint:由韓國(guó)人開(kāi)源的分布式跟蹤組件,是一款對(duì) Java 編寫(xiě)的大規(guī)模分布式系統(tǒng)的 APM 工具。

第三種:Skywalking:國(guó)產(chǎn)的優(yōu)秀 APM 組件,是一個(gè)對(duì) Java 分布式應(yīng)用的業(yè)務(wù)運(yùn)行情況進(jìn)行追蹤、告警和分析的系統(tǒng)。

輪子千萬(wàn)款,總有一款適合你。


04. 寫(xiě)在最后


互聯(lián)網(wǎng)寒冬下,大環(huán)境不好的情況下,你只能自強(qiáng)!自強(qiáng)??!自強(qiáng)?。?!

不知不覺(jué)碼了這么多字,不知道你 get 到了多少。如果感覺(jué)對(duì)你有點(diǎn)幫助,請(qǐng)多多推薦給身邊的朋友就很欣慰。

歡迎關(guān)注微信公眾號(hào)“一猿小講”了解更多精彩分享。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 作為 Zabbix 骨灰級(jí)粉絲,一直以來(lái)對(duì)第三方監(jiān)控(APM)都是拒絕的。一來(lái)覺(jué)得收費(fèi),二來(lái)?yè)?dān)心數(shù)據(jù)被人所知,三來(lái)...
    OneAPM閱讀 1,550評(píng)論 1 3
  • 閱讀目錄(Content) 一、Flume簡(jiǎn)介 二、Flume特點(diǎn) 三、Flume的一些核心概念 3.1、Agen...
    達(dá)微閱讀 4,878評(píng)論 0 9
  • 博客原文 翻譯作品,水平有限,如有錯(cuò)誤,煩請(qǐng)留言指正。原文請(qǐng)見(jiàn) 官網(wǎng)英文文檔 引言 概述 Apache Flume...
    rabbitGYK閱讀 11,708評(píng)論 13 34
  • 本文是對(duì)大數(shù)據(jù)組件Flume的一個(gè)學(xué)習(xí)總結(jié),共包括如下章節(jié)的內(nèi)容: 簡(jiǎn)介 核心概念 使用場(chǎng)景 快速起步 小結(jié) 一、...
    我是老薛閱讀 1,473評(píng)論 0 1
  • 這天見(jiàn)你,等你下班,看著你的笑容,很開(kāi)心。心里卻也在交叉著惦記與不舍。 走你回家的那一段路,盡管一遍又一遍,現(xiàn)在,...
    柒少年閱讀 934評(píng)論 0 7

友情鏈接更多精彩內(nèi)容