在微服務體系當中,監控是必不可少的。當系統環境超過指定的閥值以后,需要提醒指定的運維人員或開發人員進行有效的防范,從而降低系統宕機的風險。在CNCF雲計算平台中,Prometheus+Grafana是比較通用的解決方案,在SpringBoot2.0以后metrics默認與micrometer集成,而micrometer有關於Prometheus的MeterRegistry規范的實現,因此我們通過Micrometer這個橋梁能將SpringBoot的監控數據與Prometheus展示出來。然后通過Grafana提供的UI界面進行數據的實時展示。
Prometheus從對應的節點地址獲取度量數據並在本地存儲所有數據樣例根據相關規則將現有數據聚合並記錄新的時間序列(或者生成警報)。可以使用Grafana或其他API消費者來可視化收集的數據。
1. 編寫SpringBoot項目並用docker啟動
1.1 gradle依賴
compile 'org.springframework.boot:spring-boot-starter-actuator'
compile 'io.micrometer:micrometer-registry-prometheus:latest.release'
compile 'io.micrometer:micrometer-core:1.1.0'
1.2 開放prometheus的端點
在application.properties
中編輯如下配置
management.endpoints.web.exposure.include=prometheus,health,info
1.3 配置與grafana集成所需的bean
/**
* 為了和grafana集成,因此必須配置這個bean
* @return
*/
@Bean
MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
return registry -> registry.config().commonTags("application", "MYAPPNAME");
}
具體可以參考:micrometer
1.4 編寫docker-compose.yml文件啟動spring-boot應用
docker-compose.yml
version: '3'
services:
application:
image: java
working_dir: /apps
volumes:
- "${project.home}/build/libs:/apps"
container_name: app
networks:
- node1
hostname: application
entrypoint: java -jar spring-boot-project-0.0.1-SNAPSHOT.jar
ports:
- "8080:8080"
networks:
node1:
當啟動完畢后,我們可以運行如下命令來查看,是否有對應的信息輸出:
curl -G http://localhost:8080/actuator/prometheus
當這里得到如下結果時,證明我們的SpringBoot項目提供好與prometheus所需的數據了:
# HELP tomcat_global_request_max_seconds
# TYPE tomcat_global_request_max_seconds gauge
tomcat_global_request_max_seconds{application="spring-boot",name="http-nio-8080",} 0.0
# HELP tomcat_sessions_created_sessions_total
# TYPE tomcat_sessions_created_sessions_total counter
tomcat_sessions_created_sessions_total{application="spring-boot",} 0.0
# HELP jvm_gc_live_data_size_bytes Size of old generation memory pool after a full GC
# TYPE jvm_gc_live_data_size_bytes gauge
jvm_gc_live_data_size_bytes{application="spring-boot",} 1.9078616E7
# HELP process_files_open_files The open file descriptor count
# TYPE process_files_open_files gauge
process_files_open_files{application="spring-boot",} 38.0
# HELP tomcat_threads_current_threads
# TYPE tomcat_threads_current_threads gauge
tomcat_threads_current_threads{application="spring-boot",name="http-nio-8080",} 10.0
# HELP jvm_gc_max_data_size_bytes Max size of old generation memory pool
# TYPE jvm_gc_max_data_size_bytes gauge
jvm_gc_max_data_size_bytes{application="spring-boot",} 3.49700096E8
# HELP tomcat_servlet_request_seconds
# TYPE tomcat_servlet_request_seconds summary
tomcat_servlet_request_seconds_count{application="spring-boot",name="default",} 0.0
2 安裝Prometheus
我們可以借助於docker進行安裝,在這里由於springboot項目我也是使用docker進行部署的,因此我們保證Prometheus的容器與SpringBoot的容器保證在同一個網絡下:
docker run --name prom --link app:app --net spring-boot-project_node1 --hostname prom -p 9090:9090 -v /tmp/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
安裝完畢后,我們編輯/tmp/prometheus.yml文件進行配置:
global:
scrape_interval: 15s
evaluation_interval: 15s
rule_files:
# - "first.rules"
# - "second.rules"
scrape_configs:
- job_name: 'spring'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['application:8080']
在這里我們指定一個job,這個job會去指定的地址獲取監控數據,那么在這里targets指定的是我們SpringBoot項目的actutator的監控地址,application對應的是springboot容器的hostname。
啟動以后,我們運行http://localhost:9090 可以訪問Prometheus的界面:
當出現這種界面就說明 Prometheus已經可以監控到Springboot的提供的數據了
3 安裝Grafana
雖然Prometheus提供的有一個簡單的UI界面,但是使用起來不那么方便同時也並不好看。不過,我們可以利用Grafana來提供更直接更美觀的UI展示界面。同時,Grafana能夠提供多種數據源,讓我們進行不同類型的中間件或服務器監控。官網地址。同樣我們使用docker來構建grafana容器。grafana所有的配置都在conf/grafana.ini里進行設置。不過它能通過docker的環境變量參數-e進行覆蓋,它的基本格式為:GF_<SectionName>_<KeyName>
。例如:
$ docker run \
-d \
-p 3000:3000 \
--name=grafana \
--net=spring-boot-project_node1
--link=prom
-e "GF_SERVER_ROOT_URL=http://grafana.server.name" \
-e "GF_SECURITY_ADMIN_PASSWORD=secret" \
grafana/grafana
當啟動完畢后,我們可以訪問http://localhost:3000
可以訪問到對應的界面,其默認情況下都會跳轉至登錄界面,我們可以在登錄界面上輸入用戶名admin與密碼admin,這樣會以管理員身份進行登錄。接下來我們需要創建一個prometheus的數據源:
此處我們設置prometheus的地址,這里我的設置為http://prom:9090 用以連接prometheus的監控(注意prom是docker容器prometheus的hostname),剩余的一些設置比如說Auth,Advanced HTTP Settings請按需進行配置。此時我們需要在這個地址里下一個用於監控micrometer的Dashboard:
我們需要下載這個dashboard對應的json數據:
然后我們在grafana上傳json腳本:
當導入成功后我們即可以展示出如下監控界面:
3.1 報警信息配置
在這里我以qq郵箱為例,首先我們必須開啟smtp許可,在這里我們會收到安全碼用於將來的密碼設置。那么我們可以在docker啟動容器時設置環境變量來配置郵件服務的信息:
docker run
-p 3000:3000
--env GF_SMTP_ENABLED=true
--env GF_SMTP_HOST=smtp.qq.com:465
--env GF_SMTP_USER=xxxx(用戶名)
--env GF_SMTP_PASSWORD=(安全碼)
--env GF_SMTP_SKIP_VERIFY=true
--env GF_SMTP_FROM_ADDRESS=xxxxx@qq.com
--name grafana
grafana/grafana:latest
相關配置我們可以參考:地址,當我們啟動成功以后,我們可以參考如下界面進行配置:
收到測試郵件后,我們需要設置監控值,在這里我以內存監控舉例:
同時我們需要配置發送郵件具體內容:
最后我們保存我們設置的Dashboard即可,另外我們在metrics
選項卡里配置的表達式切記不可使用表達式,否則會報上述錯誤Template Variables are not supported in alert queries
的錯誤