Docker+Prometheus+Grafana監控SpringBoot健康信息

在微服務體系當中,監控是必不可少的。當系統環境超過指定的閥值之後,須要提醒指定的運維人員或開發人員進行有效的防範,從而下降系統宕機的風險。在CNCF雲計算平臺中,Prometheus+Grafana是比較通用的解決方案,在SpringBoot2.0之後metrics默認與micrometer集成,而micrometer有關於Prometheus的MeterRegistry規範的實現,所以咱們經過Micrometer這個橋樑能將SpringBoot的監控數據與Prometheus展現出來。而後經過Grafana提供的UI界面進行數據的實時展現。java

architecture

Prometheus從對應的節點地址獲取度量數據並在本地存儲全部數據樣例根據相關規則將現有數據聚合並記錄新的時間序列(或者生成警報)。可使用Grafana或其餘API消費者來可視化收集的數據。node

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中編輯以下配置web

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");
        }

具體能夠參考:micrometerspring

1.4 編寫docker-compose.yml文件啓動spring-boot應用

docker-compose.ymldocker

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:

當啓動完畢後,咱們能夠運行以下命令來查看,是否有對應的信息輸出:json

curl -G http://localhost:8080/actuator/prometheus

當這裏獲得以下結果時,證實咱們的SpringBoot項目提供好與prometheus所需的數據了:tomcat

# 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文件進行配置:springboot

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的界面:

3FEC9656_C230_4545_9AB9_59BBE455C565

F1E50B67_CBE1_4114_9CDE_DC86602E7CAB

當出現這種界面就說明 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的數據源:

datasource

此處咱們設置prometheus的地址,這裏個人設置爲http://prom:9090 用以鏈接prometheus的監控(注意prom是docker容器prometheus的hostname),剩餘的一些設置好比說Auth,Advanced HTTP Settings請按需進行配置。此時咱們須要在這個地址裏下一個用於監控micrometer的Dashboard:
micrometer
咱們須要下載這個dashboard對應的json數據:
download

而後咱們在grafana上傳json腳本:

upload

當導入成功後咱們便可以展現出以下監控界面:
grafana

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

相關配置咱們能夠參考:地址,當咱們啓動成功之後,咱們能夠參考以下界面進行配置:
notification
收到測試郵件後,咱們須要設置監控值,在這裏我之內存監控舉例:
alert_details
同時咱們須要配置發送郵件具體內容:
notify

最後咱們保存咱們設置的Dashboard便可

相關文章
相關標籤/搜索