Spring Boot快速接入Prometheus監(jiān)控
最近跟幾個(gè)粉絲聊天吹水,說最近公司裁員嚴(yán)重,不僅裁掉了大部分的人,也裁掉了大部分的業(yè)務(wù);之前公司有錢賺,什么產(chǎn)品都愿意做,無論行不行都會試一試,一堆沒有什么流量的系統(tǒng)都在線上跑著,但是沒有上級發(fā)話,一個(gè)也不敢停掉。站著資源不說,關(guān)鍵還得保證活著,基本就是運(yùn)維人員要和系統(tǒng)同在,搞得我們這些運(yùn)維苦不堪言。
公司高層領(lǐng)導(dǎo)突然變得雷厲風(fēng)行,貌似是撐不下去了,不賺錢的業(yè)務(wù)開發(fā)人員全部裁掉,一個(gè)不留,對應(yīng)的系統(tǒng)直接下線;運(yùn)維人員只留下一部分,內(nèi)部活水幾個(gè)開發(fā)人員過來,部門從此改名為 DevOps 團(tuán)隊(duì),大多數(shù)系統(tǒng)已經(jīng)沒有了,云上資源迅速收縮了一半。日?,嵤禄緵]了,以前 KPI 寫保證 xx 個(gè)系統(tǒng)穩(wěn)定運(yùn)行,現(xiàn)在沒得寫了,基本是多個(gè)人保證 1 個(gè)系統(tǒng)運(yùn)行。沒什么辦法,領(lǐng)導(dǎo)發(fā)話,要精細(xì)化運(yùn)營,不清楚有沒有用,先活下去再說。
但是他們大多數(shù)人都是運(yùn)維,語言層面 python、golang、sql 運(yùn)用還算可以,日常云原生常見組件一些 Prometheus 語法之類的東西都能夠熟練使用,但是有些服務(wù)壓根就沒有提供指標(biāo).... 對于抽象和封裝太完美 Java 應(yīng)用系統(tǒng)真是不清楚怎么上手,更不知道如何添加監(jiān)控,問一些開發(fā)人員,多數(shù)對于 Prometheus 指標(biāo)沒有特別清晰的概念,侵入太多,就不愿意改,說來說去,只能看看 CPU、內(nèi)存以及 nginx 上的 qps 和延遲。
如何為應(yīng)用程序添加監(jiān)控
之所以造成如上局面,主要是運(yùn)維人員對于一些開發(fā)生態(tài)不了解導(dǎo)致的,其實(shí)對于常見 Java 應(yīng)用程序基本都是基于 Spring 開發(fā),而 Spring 本身就是封裝和繼承做到特別好,好到你根本不用了解他就可以在他的基礎(chǔ)上做開發(fā),這就是 Crud 程序員盛行的原因。而對于 Sring 監(jiān)控也是一樣的,也是非常簡單,下面我以 SpringBoot 2.x 為例演示下對系統(tǒng)中所有接口以及中間件的監(jiān)控。
第一步添加一個(gè) jar 依賴到應(yīng)用程序中:
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
添加配置項(xiàng):
management.endpoints.web.exposure.include=prometheus
spring.application.name=spring-petclinic-compose
management.server.port=8091
management.metrics.tags.application=${spring.application.name}
啟動應(yīng)用程序,訪問:http://127.0.0.1:8091/actuator/prometheus
所有指標(biāo)都有了,只要有了指標(biāo),其它一切都好說了,只要采集到指標(biāo),計(jì)算好展示出來,超過閾值進(jìn)行告警。
運(yùn)行 Prometheus,并添加抓取配置:
scrape_configs:
- job_name: 'application'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['application:8091']
添加查詢:
rate(http_server_requests_seconds_count[5m])
其實(shí)到這里也就差不多了,我上次在群里也是跟網(wǎng)友這么說的,但是反饋說根本不行,服務(wù)跑不起來,為了防止出現(xiàn)類似問題,我這里給出了我的一個(gè)源碼 Demo 鏈接,只要 Java 開發(fā)環(huán)境配置好,導(dǎo)入到本地,就可以運(yùn)行https://github.com/strictnerd/spring-petclinic-compose
目的達(dá)到了,運(yùn)維人員到這里就可以止步了;如果是開發(fā)人員還可以繼續(xù)了解下如何自定義指標(biāo)收集,具體代碼也已經(jīng)上傳到 github 具體可以參考https://github.com/strictnerd/spring-petclinic-compose。
自定義指標(biāo)
集成之后大家反饋的第一個(gè)問題就是指標(biāo)太多,目前 io.micrometer? 基本進(jìn)行常見 http、tomcat、jetty、kafka、cache、redis、JVM CPU MEM、GC、logback...等等監(jiān)控,具體自行查看 Spring 官網(wǎng)介紹 https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#actuator.metrics
如何關(guān)閉所有指標(biāo),并打開想要的指標(biāo)?
management.metrics.enable.all=false
management.metrics.enable.http=false
management.metrics.enable.jvm=true
如上配置,我可以關(guān)閉所有的配置,但是唯獨(dú)打開 jvm 的指標(biāo),如下所示:
這個(gè)自己根據(jù)需要進(jìn)行監(jiān)控指標(biāo)采集和展示。
如何添加自己的指標(biāo)維度
有些服務(wù)是隔離的,同一份代碼但是在不同的地區(qū)部署,這個(gè)底層庫已經(jīng)留好了擴(kuò)展結(jié)點(diǎn),舉個(gè)例子,比如我們需要在各個(gè)指標(biāo)中加入一個(gè) region 維度,添加如下代碼即可,支持多個(gè)。
@Bean
MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
return registry -> registry.config().commonTags("region", "us-east-1");
}
這樣每個(gè)指標(biāo)中就會多出一個(gè)維度。
如何對部分沒有監(jiān)控的接口添加切面
雖然 io.micrometer 覆蓋了服務(wù)中的大多數(shù)場景,但是根據(jù)業(yè)務(wù)實(shí)際情況,肯定有組件覆蓋不到的地方,怎么辦?那就使用 Timed 自定義處理。
Timed 注解不會被 Spring 框架掃描,所以需要添加如下代碼:
@Bean
TimedAspect timedAspect(MeterRegistry registry) {
return new TimedAspect(registry);
}
在需要監(jiān)控的代碼片段上添加注解:
查看指標(biāo):
總結(jié)
看完上面的介紹,你會發(fā)現(xiàn)簡單、簡單、還是 tmd 簡單,但是公司系統(tǒng)為什么沒有類似指標(biāo)等可用性的監(jiān)控。好聽點(diǎn)說是公司沒人推行此類技術(shù);難聽點(diǎn)說,系統(tǒng)不重要,可有可無或者說即便出了問題也會不了了知。