Spring Boot Actuator通過(guò)/metrics
端點(diǎn),以開(kāi)箱即用的方式為應(yīng)用程序的性能指標(biāo)與響應(yīng)統(tǒng)計(jì)提供了一個(gè)非常友好的監(jiān)控方式。
由于在集群化的彈性環(huán)境中,應(yīng)用程序的節(jié)點(diǎn)可以增長(zhǎng)、擴(kuò)展,并由非常大量的應(yīng)用實(shí)例所組成。對(duì)于孤立節(jié)點(diǎn)的監(jiān)控可能即費(fèi)力又沒(méi)有什么實(shí)際效果。所以,使用基于時(shí)間序列的數(shù)據(jù)聚合工具將獲得更好的效果。
本文的目標(biāo)在于找出一種僅需要通過(guò)工具和配置的方式就能實(shí)現(xiàn)的解決方案,來(lái)對(duì)Spring Boot Metrics實(shí)現(xiàn)基于時(shí)間序列的監(jiān)控。
像NewRelic, AppDynamics或DataDog這些APM系統(tǒng)都能很好地完成這樣的任務(wù),它們通過(guò)使用JVM和字節(jié)碼工具來(lái)生成自己的指標(biāo)、分析工具和相關(guān)事務(wù)。也可以通過(guò)使用@Timed
注釋方法來(lái)實(shí)現(xiàn)。但是,這些方法將忽略所有Spring Boot Actuator庫(kù)所提供的可用資源。另外,使用這些方法還有一個(gè)與保留數(shù)據(jù)相關(guān)的問(wèn)題,它們對(duì)于短時(shí)間窗口內(nèi)的監(jiān)控是相對(duì)模糊的。
spring-boot-admin
可以作為另外一個(gè)備選方案,因?yàn)樗梢赃B接到Spring Boot的實(shí)例、并且可以聚合節(jié)點(diǎn)等。但是, /metrics
端點(diǎn)并不是根據(jù)時(shí)間軸來(lái)進(jìn)行監(jiān)控的,同時(shí)在不同節(jié)點(diǎn)上的相同應(yīng)用模塊(水平擴(kuò)展)也沒(méi)有得到聚合。這意味著您將面對(duì)這兩種情況:沒(méi)有時(shí)間序列的監(jiān)控?cái)?shù)據(jù)、只有對(duì)孤立節(jié)點(diǎn)的監(jiān)控?cái)?shù)據(jù)快照。
jconsole
和visualvm
可能是另外一種選擇,它們通過(guò)RMI直接連接到JMX節(jié)點(diǎn)。Actuator存儲(chǔ)來(lái)自JMX的MBean內(nèi)的Metrics數(shù)據(jù)。另外,通過(guò)使用 Jolokiaopen in new window,MBeans以RESTful HTTP端點(diǎn)的方式暴露,/jolokia
。所以,相同的信息可以通過(guò)兩個(gè)端點(diǎn)來(lái)獲?。篔MX MBean Metrics和Rest HTTP Jolokia端點(diǎn)。然而,這種方式存在同樣的問(wèn)題,它們直接連接到集群環(huán)境中的單個(gè)節(jié)點(diǎn),另外還伴隨著痛苦的老式RMI協(xié)議。
繼續(xù)前進(jìn),我嘗試了一些可能可以解決這些問(wèn)題的現(xiàn)代化運(yùn)維工具:
- Prometheusopen in new window: 由SoundCloud編寫,它存儲(chǔ)一系列的監(jiān)控?cái)?shù)據(jù)并賦予漂亮的圖標(biāo)展現(xiàn)。Prometheus Gauges和Actuator Metrics并不完全兼容,所以人們寫了 一個(gè)數(shù)據(jù)轉(zhuǎn)換器open in new window。你也可以配置Prometheus來(lái)收集JMX數(shù)據(jù)。
- Sensuopen in new window: 作為Nagios和Zabbix的現(xiàn)代化替代品,它有一個(gè)插件可以直接連接到Spring Boot,但是這個(gè)倉(cāng)庫(kù)最近已經(jīng)不太更新了open in new window,所以我決定放棄它。
- StatsDopen in new window: Spring Boot有一篇文章是關(guān)于自定義導(dǎo)出數(shù)據(jù)給StatsDopen in new window。然而,你除了要為Spring Boot應(yīng)用安裝StatsD實(shí)例之外,還不得不實(shí)現(xiàn)一些存根來(lái)讓它工作起來(lái)。
- Graphiteopen in new window: You got to be a hero to install and get Graphiteopen in new window running. If you get there, you can configure it along StatsD to get metrics working in a chartopen in new window.
- OpenTSDBopen in new window: Spring Boot有一篇文章關(guān)于連接數(shù)據(jù)到OpenTSBDopen in new window. 然而,這種方式與StatsD類似,你必須實(shí)現(xiàn)和維護(hù)自定義的代碼來(lái)讓它工作起來(lái)。另外,OpenTSDB沒(méi)有開(kāi)箱即用的圖形可視化工具。
- JMXTransopen in new window: 可以用來(lái)提取數(shù)據(jù)并發(fā)送到其他的監(jiān)控工具,它也需要具體的實(shí)現(xiàn)。
- Gangliaopen in new window: 也是基于JVM上的工具,記錄所有Actuator資源。與之前所說(shuō)的APM有相同問(wèn)題。
經(jīng)過(guò)一番研究,我發(fā)現(xiàn)了一個(gè)更好的解決方案:通過(guò)InfluxDB 和Telegraf實(shí)現(xiàn),零編碼,只需要通過(guò)一些正確的配置。
- Jolokiaopen in new window: Spring Boot 認(rèn)可使用Jolokia來(lái)通過(guò)HTTP導(dǎo)出export JMX數(shù)據(jù)open in new window。你只需要在工程類路徑中增加一些依賴項(xiàng),一切都是開(kāi)箱即用的。不需要任何額外的實(shí)現(xiàn)。
- Telegrafopen in new window: Telegraf支持通過(guò)整合Jolokia來(lái)集成JMX數(shù)據(jù)的收集。它有一個(gè)預(yù)制的輸入插件open in new window,它是開(kāi)箱即用的。不需要任何額外的實(shí)現(xiàn)。只需要做一些配置即可。
- InfluxDBopen in new window: InfluxDB通過(guò) 輸出插件open in new window從Telegraf接收指標(biāo)數(shù)據(jù),它是開(kāi)箱即用的,不需要任何額外的實(shí)現(xiàn)。
- Grafanaopen in new window: Grafana通過(guò)連接InfluxDB作為數(shù)據(jù)源open in new window來(lái)渲染圖標(biāo)。它是開(kāi)箱即用的,不需要額外的實(shí)現(xiàn)。
簡(jiǎn)而言之,配置所有這些東西都非常的簡(jiǎn)單。