Prometheus + Grafana (1) 監控

簡介

Micrometer/Prometheus/Grafana體系是當前最成熟的低成本Java監控解決方案,而且通過其他的Prometheus exporter,還可以進行諸如我們可能需要的Windows操作系統監控/Mysql/Kakfka等常用組件的監控、

Prometheus

Prometheus(普羅米修斯)是一套比較完備的監控報警系統,其主要架構設計如圖:

主要是由以下組件構成:

  • Prometheus server:服務中心,主要負責拉取和存儲時序書庫(Prometheus有自帶的時序數據庫)
  • Client Libraries:客戶端庫,主要用於和具體的服務進行集成,採集監控數據,例如Micrometer
  • Push gateway:另外一種數據push的採集方式(Prometheus默認使用pull的方式主動採集應用數據),用於適配一些沒有長期穩定的進程的服務
  • Exporter:用於針對某些特定服務的數據採集工具,例如mysql/kafka/HA等
  • Alert Manager:Prometheus的監控告警工具,主要通過webhook和其他告警系統進行集成告警,能夠進行告警規則的配置
  • 其他工具

同時,Prometheus也有一套自己的查詢語法,用於已經採集的數據的結果查詢,具體可以參考:
https://prometheus.io/docs/prometheus/latest/querying/basics/

或者中文翻譯: https://www.jianshu.com/p/3bdc4cfa08da

Micrometer

Micrometer是Java的指標監控工具,而且建立了一套獨立的數據模型,能夠和大部分常見的監控工具進行整合,簡單快速的建立指標監控體系

Micrometer提供了包括Timer , Counter , Gauge ,
DistributionSummary , LongTaskTimer , FunctionCounter , FunctionTimer , TimeGauge等不同的監控工具,以適應不同的場景,例如Timer用於監控一個操作的消耗時間,並能在這個基礎上統計例如minx/max/avg/tp等指標

Grafana

Grafana是一個開源的度量分析與可視化套件。經常被用作基礎設施的時間序列數據和應用程序分析的可視化,它在其他領域也被廣泛的使用包括工業傳感器、家庭自動化、天氣和過程控制等。

Grafana支持許多不同的數據源。每個數據源都有一個特定的查詢編輯器,該編輯器定製的特性和功能是公開的特定數據來源。

其工作模式主要分爲三步:

  • 設置數據源:可視化的基礎數據來源,例如從數據庫/Prometheus/ElasticSearch
  • 配置數據抽取方式:例如通過數據庫的SQL/Prometheus的ProQuery等進行數據查詢
  • 數據面板配置:Grafana支持多樣的數據呈現方式,例如折線圖/直方圖/熱力圖等等,通過簡單的配置,即可通過多樣化的數據呈現方式去展示監控數據

使用流程

Prometheus部署

寫在前面:默認的訪問地址 http://127.0.0.1:9090

PS: 下方有docker方式部署

開源的Prometheus是單節點模式,部署非常簡單,這裏以Windows下爲例,首先在Prometheus官方下載文件包,例如當前最新的Windows64版本爲:
https://github.com/prometheus/prometheus

下載完畢後解壓其目錄結構如下:

data爲Prometheus是自帶時序數據庫持久化的目錄,pometheus.yml爲整個Prometheus的配置文件,pometheus.exe爲服務啓動應用,默認可以直接啓動,這個時候Prometheus會使用最基本的默認配置,運行在本地9090端口,採集自身的運行的數據並持久化到時序數據

prometheus.yml的配置規則參考文檔:

https://prometheus.io/docs/prometheus/latest/configuration/configuration/

當Prometheus啓動完畢後,本地瀏覽器訪問
http://127.0.0.1:9090即可查看到Prometheus的查詢工具

值得注意的是,如果要啓用restful接口支持熱加載配置,需要在啓動的命令行增加參數: --web.enable-lifecycle ,這在生產環境中不停機更新非常重要

例如:cmd下執行:prometheus.exe --web.enable-lifecycle

CentOS下安裝

wget https://github.com/prometheus/prometheus/releases/download/v2.22.0/prometheus-2.22.0.linux-amd64.tar.gz

tar -zxvf prometheus-2.5.0.linux-amd64.tar.gz

// --config.file="prometheus/prometheus.yml": 指定配置文件,不寫爲默認
nohup /dimples/soft/prometheus-2.22.0/prometheus --config.file="/dimples/soft/prometheus-2.22.0/prometheus.yml" &

// 關閉
ps -aux | grep prometheus
kill -s 9 24204(上一步查詢出來的pid)

查看Prometheus監控的應用(Prometheus啓動時,默認監控的是自己)

此時我們可以看到,在Prometheus中只有一個自己的服務被監控了,那麼我們怎麼去將自己的服務加入監控呢?請往下看。

Grafana部署

寫在前面:默認的訪問地址 http://127.0.0.1:3000/login

Grafana的部署和Prometheus的部署類似,也非常簡單,這裏也以Windows爲例,首先需要從官方網站下載最新的安裝包:

https://grafana.com/grafana/download

這裏以zip包爲例,解壓後目錄結構爲:

配置文件路徑爲 conf/defaults.ini,這裏可以修改默認端口,配置持久化方式,默認用戶名和密碼

啓動執行文件爲 bin/grafana-server.exe,雙擊即可啓動。(默認端口爲3000,默認用戶名和密碼均爲admin)

啓動後瀏覽器訪問即可登錄使用,http://127.0.0.1:3000/login 第一次使用會強制修改密碼

CentOS下安裝

wget https://dl.grafana.com/oss/release/grafana-6.4.4-1.x86_64.rpm
yum install -y grafana-6.4.4-1.x86_64.rpm
yum clean all

// 安裝後需要手動啓動
service grafana-server start

service grafana-server stop
  • 配置文件位於/etc/grafana/grafana.ini,這裏暫時保持默認配置即可
  • 設置開機啓動
systemctl enable grafana-server
systemctl start grafana-server

配置第一個監控面板 - Prometheus

當Prometheus和Grafana部署完成之後,默認Prometheus就已經在開始採集自身的監控數據,所以我們就可以開始配置Prometheus的監控界面,首先需要登錄Grafana,在左側的設置界面配置數據源:

點擊 Add data source添加第一個數據源,由於我們這裏主要是以Prometheus作爲數據源,所以直接選擇Prometheus即可:

Name爲這個數據源的別稱,用於在多個數據源的時候進行區分,url爲Prometheus的restful接口地址,例如這裏就爲剛剛部署完畢的本地Prometheus服務,最後點擊最下的Save&Test即可添加成功,然後點擊back返回上一步即可查看到已經添加的數據源:

添加完畢數據源之後,則可以開始進行監控面板的設計了,這裏考慮到監控面板設計有一定的門檻,所以建議直接使用官方提供的監控面板模板,具體可以從官方的模板倉庫下載:https://grafana.com/grafana/dashboards

例如我們這裏需要進行Prometheus本身的監控,我們搜索 Prometheus stat:

此處可以選擇編號 1 的編號導入或者使用編號 2 ,下載JSON文件使用,此處我們使用下載json文件的方式

下載完畢之後,則可以導入到Grafana:

配置panel,有三種方式(編號 1、2、3 任選一種):上傳JOSN文件、填寫ID(然後點擊Load)、填寫JSON配置內容(然後點擊Load),此處我們選擇方便的填寫ID的方式,然後點擊對應框後的Load按鈕進入下一步

點擊import之前需要配置別名和選擇一個數據源,所以在import之前必須至少配置一個數據源,點擊import後即可看到監控窗口

到此,我們已經學會了啓動Grafana和Prometheus,同時學會了配置一個簡單的監控服務,即監控Prometheus本身。我們已經瞭解到其工作的一個基礎的流程,以後我們就要去配置監控 Java服務、MySQL、Redis數據庫等各種複雜的服務

監控第一個Java程序

在上面們簡單的將Prometheus採集的對於自身的數據通過Grafana進行了展示,而我們的核心是通過Prometheus去採集Java應用的數據,這就需要針對前面提到的通過Prometheus的pull模式定時去拉取SpringBoot通過Actuator暴露的Micrometer採集的監控指標

  • 首先需要的做的是完成Java應用的Micrometer集成,訪問actuator/prometheus或者/prometheus能夠正常的返回Micrometer採集的數據指標
  • 進入部署Prometheus的文件目錄,打prometheus.yml進行拉取節點的配置,這裏以我自己部署的java應用爲例,在配置文件的scrape_configs節點添加針對java的配置

SpringBoot 集成Micrometer

Micrometer的集成主要依託於SpringBoot的Actuator,Micrometer會默認採集JVM以及一些其他常用組件(例如HikariCP/Http/Tomcat/Logback)的各項指標,然後通過Actuator輸出,供Prometheus pull進行數據採集

由於歷史的原因,Micrometer的Java集成和SpringBoot版本有關

SpringBoot 2.x

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

激活配置:

management.endpoints.web.exposure.include=prometheus,health
management.metrics.tags.application=${spring.application.name}
spring.application.name= demo-project

SpringBoot 1.5.x

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-spring-legacy</artifactId>
    <version>1.0.3</version>
</dependency>
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
    <version>1.0.3</version>
</dependency>

必須配置:

spring.application.name=dimples-demo-project
management.security.enabled=false
spring.metrics.export.includes=health,prometheus

公共配置

@Bean
MeterRegistryCustomizer<MeterRegistry> metricsCommonTags(@Value("${spring.application.name}") String application) {
    return registry -> registry.config().commonTags("application", application);
}

激活後啓動程序,通過IDEA查看是否已經包含/actuator/prometheus端點:

訪問

http://${hostname}😒{port}/actuator/prometheus (2.x)

或者 http://${hostname}😒{port}/prometheus (1.5.x)

配置 Prometheus 監控

打開 Prometheus 的 prometheus.yml 文件,這裏我們配置一個Java服務

global:
  scrape_interval:     15s 
  evaluation_interval: 15s 
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093

rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

scrape_configs:
  - job_name: 'prometheus'
    # metrics_path defaults to '/metrics'
    static_configs:
    - targets: ['localhost:9090']
  - job_name: 'demo'
    metrics_path: '/actuator/prometheus'
    static_configs:
    - targets: ['127.0.0.1:8080']     # []表示數組,我們可以配置多個服務

修改配置並保存之後,通過Prometheus的restful接口熱加載配置:

http://localhost:9090/-/reload

請求接口後返回 Lifecycle API is not enabled. 那麼就是啓動的時候沒有開啓熱更新配置,需要在啓動的命令行增加參數: --web.enable-lifecycle

這裏返回200表示執行成功,否則會提示錯誤信息(這裏需要post/put請求,所以這裏使用了postman來發起請求,如果Linux可以使用 curl -X POST http://localhost:9090/-/reload發起請求

更新指令執行成功之後,可以在web界面進行確認:

如果想驗證是否確實採集到數據,可以返回首頁的查詢界面:

隨意選擇一個jvm指標,點擊execute即可查詢對應的指標數據:

可以看到對應的指標已經有數據採集到,然後我們則可以到grafana進行監控面板的配置,同樣我們先下載一個面板模板:

導入之後選擇之前配置的數據源之後即可看到監控面板:

到此一個簡易的java監控則已經完成

配置服務器監控

這裏以監控Java程序爲例。需要使用到Windows-exporter的插件來隊windows操作系統進行數據採集,首先需要下載最新的exporter:

https://github.com/prometheus-community/windows_exporter/releases

例如我這裏下載的是 https://github.com/prometheus-community/windows_exporter/releases/download/v0.14.0/windows_exporter-0.14.0-amd64.msi

安裝完畢後,瀏覽器訪問: http://localhost:9182/metrics 即可查看到採集的數據指標,在windows的服務中也能看到有windows_exporter啓動:

然後我們需要在Prometheus中配置採集節點,參考Java的配置模式:

同樣的需要刷新加載 http://localhost:9090/-/reload

同樣選擇一個Grafana模板,導入即可查看到具體的監控信息:

本節只是簡單的整合 Prometheus + Grafana 在監控Java服務方面的使用,但是在我們的微服務業務中,常常還有包括 MySQL、Redis、docker、微服務端點等應用,同時應用發生異常時,還需要發送預警短信或者郵件。那麼這些功能如何實現呢?請繼續閱讀第二章 -《Prometheus + Grafana (2) mysql、redis、Docker容器、服務端點以及預警》。


附錄 - 自定義監控面板

Grafana提供不同樣式的基礎數據層呈現樣式,大多數情況下默認的模板即可滿足我們的日常需求,如果我們需要進行自定義的面板設計,也可以非常簡單的完成的目標,這裏建議從已經存在的模板做參考開始,例如JVM的監控面板,隨機找一個面板:

選擇edit即可以查看是如何配置才能達到當前的效果:

需要配置的內容有:

  • 數據源,例如這裏選擇的是Prometheus
  • Metrics:查詢表達式,例如這裏是Prometheus的表達式,如果是用數據庫做數據源,這裏應該是SQL
  • Legend:數據標題,這裏可以用表達式類似{{name}}這樣的格式
  • Visualization:可視化樣式,這裏是Graph,也就是折線圖,也可以選擇其他的樣例其他的一些配置可以自己多嘗試看看效果
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章