大數(shù)據(jù)集群監(jiān)控框架

一、監(jiān)控框架

Bigdata1 Bigdata2 Bigdata3
Zabbix zabbix-server<br />zabbix-agent zabbix-agent zabbix-agent
Ganglia ganglia


二、Zabbix 4.2.8

2.1 概念

Zabbix是一款能夠監(jiān)控各種網(wǎng)絡(luò)參數(shù)以及服務(wù)器健康性和完整性的軟件。Zabbix使用靈活的通知機(jī)制,允許用戶為幾乎任何事件配置基于郵件的告警。這樣可以快速反饋服務(wù)器的問題。基于已存儲(chǔ)的數(shù)據(jù),Zabbix提供了出色的報(bào)告和數(shù)據(jù)可視化功能。

image.png

2.2 組件

  • 主機(jī)(Host)
    一臺(tái)你想監(jiān)控的網(wǎng)絡(luò)設(shè)備,用IP或域名表示。
  • 監(jiān)控項(xiàng)(Item)
    你想要接收的主機(jī)的特定數(shù)據(jù),一個(gè)度量數(shù)據(jù)。
  • 觸發(fā)器(Trigger)
    一個(gè)被用于定義問題閾值和“評(píng)估”監(jiān)控項(xiàng)接收到的數(shù)據(jù)的邏輯表達(dá)式。
  • 動(dòng)作(Action)
    一個(gè)對(duì)事件做出反應(yīng)的預(yù)定義的操作,比如郵件通知。

2.3 部署

  1. 每臺(tái)安裝yum的repo文件

    sudo rpm -Uvh https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-2.el7.noarch.rpm
    
  2. 將文件中的鏡像域名替換為阿里云

    sudo sed -i 's/http:\/\/repo.zabbix.com/https:\/\/mirrors.aliyun.com\/zabbix/g' /etc/yum.repos.d/zabbix.repo
    
  3. 安裝

    • bigdata1:

      sudo yum install -y zabbix-server-mysql zabbix-web-mysql zabbix-agent
      
    • bigdata2和bigdata3

      bigdata2: sudo yum install -y zabbix-agent
      bigdata3: sudo yum install -y zabbix-agent
      
  4. MySQL創(chuàng)建數(shù)據(jù)庫(kù)

    mysql -h 192.168.32.244 -uroot -phxr -e"create database zabbix charset utf8 collate utf8_bin";
    

    使用zabbix的建表腳本建表

    zcat /usr/share/doc/zabbix-server-mysql-4.0.29/create.sql.gz | mysql -h 192.168.32.244 -uroot -phxr zabbix
    
  5. 配置Zabbix_Server
    在bigdata1中的/etc/zabbix/zabbix_server.conf配置文件中添加

    DBHost=bigdata3
    DBName=zabbix
    DBUser=root
    DBPassword=hxr
    

    在所有節(jié)點(diǎn)的/etc/zabbix/zabbix_server.conf配置文件中修改

    # 修改
    Server=bigdata1
    # 注銷
    # ServerActive=127.0.0.1
    # Hostname=Zabbix server
    
  6. 配置Zabbix Web時(shí)區(qū)
    在/etc/httpd/conf.d/zabbix.conf文件中添加

    php_value date.timezone Asia/Shanghai
    
  1. 啟動(dòng)Zabbix

    • bigdata1啟動(dòng):

      sudo systemctl start/stop zabbix-server zabbix-agent httpd     (httpd是訪問html等頁(yè)面的入口)
      

      bigdata1設(shè)置開機(jī)自啟:

      sudo systemctl enable/disable zabbix-server zabbix-agent httpd
      
    • bigdata2/3啟動(dòng):

      sudo systemctl start/stop zabbix-agent 
      

      設(shè)置開機(jī)自啟:

      sudo systemctl enable/disable zabbix-agent
      
  1. 訪問頁(yè)面
    http://192.168.32.242/zabbix (默認(rèn)賬號(hào)密碼為 Admin/zabbix)
    在頁(yè)面中完成對(duì)Zabbix_Web的數(shù)據(jù)庫(kù)等配置
    如果配置出現(xiàn)錯(cuò)誤,可以在配置文件/etc/zabbix/web/zabbix.conf.php中進(jìn)行修改
    異常日志可以查看 cat /var/log/zabbix/zabbix_server.log

2.4 實(shí)現(xiàn)進(jìn)程監(jiān)控

  1. 配置主機(jī)
    在配置-> 主機(jī)-> 創(chuàng)建主機(jī) 中添加需要監(jiān)控的主機(jī)

  2. 配置監(jiān)控項(xiàng)
    創(chuàng)建完主機(jī)后,點(diǎn)擊監(jiān)控項(xiàng)進(jìn)行監(jiān)控項(xiàng)的創(chuàng)建
    如監(jiān)控datanode進(jìn)行是否正常運(yùn)行


    image.png
  3. 配置觸發(fā)器
    點(diǎn)擊觸發(fā)器進(jìn)行創(chuàng)建


    image.png
  4. 通知方式設(shè)置
    在管理-> 報(bào)警媒介類型 中進(jìn)行通知報(bào)警的配置


    image.png
  5. 創(chuàng)建動(dòng)作
    在配置-> 動(dòng)作中創(chuàng)建動(dòng)作,為觸發(fā)器設(shè)置動(dòng)作(發(fā)郵件)。


    image.png
image.png
  1. 為用戶配置郵箱
    在用戶的基本資料中配置


    image.png
  2. 使用模版為每個(gè)節(jié)點(diǎn)進(jìn)行配置
    默認(rèn)有很多框架的模板可以選擇,如MySQL、redis等。但是沒有hadoop的模板,需要自己配置。
    在配置-> 模板 中進(jìn)行模板配置,創(chuàng)建監(jiān)控項(xiàng)、觸發(fā)器,然后應(yīng)用到主機(jī)上。


    image.png

    注意需要修改動(dòng)作來為模板的觸發(fā)器綁定動(dòng)作。


三、Prometheus

3.1 特點(diǎn)

?? Prometheus是一個(gè)開源的完整監(jiān)控解決方案,其對(duì)傳統(tǒng)監(jiān)控系統(tǒng)的測(cè)試和告警模型進(jìn)行了徹底的顛覆,形成了基于中央化的規(guī)則計(jì)算、統(tǒng)一分析和告警的新模型。 相比于傳統(tǒng)監(jiān)控系統(tǒng),Prometheus具有以下優(yōu)點(diǎn):

3.1.1 易于管理

  • Prometheus核心部分只有一個(gè)單獨(dú)的二進(jìn)制文件,不存在任何的第三方依賴(數(shù)據(jù)庫(kù),緩存等等)。唯一需要的就是本地磁盤,因此不會(huì)有潛在級(jí)聯(lián)故障的風(fēng)險(xiǎn)。
  • Prometheus基于Pull模型的架構(gòu)方式,可以在任何地方(本地電腦,開發(fā)環(huán)境,測(cè)試環(huán)境)搭建我們的監(jiān)控系統(tǒng)。
  • 對(duì)于一些復(fù)雜的情況,還可以使用Prometheus服務(wù)發(fā)現(xiàn)(Service Discovery)的能力動(dòng)態(tài)管理監(jiān)控目標(biāo)。

3.1.2 監(jiān)控服務(wù)的內(nèi)部運(yùn)行狀態(tài)

?? Pometheus鼓勵(lì)用戶監(jiān)控服務(wù)的內(nèi)部狀態(tài),基于Prometheus豐富的Client庫(kù),用戶可以輕松的在應(yīng)用程序中添加對(duì)Prometheus的支持,從而讓用戶可以獲取服務(wù)和應(yīng)用內(nèi)部真正的運(yùn)行狀態(tài)。

image.png

3.1.3 強(qiáng)大的數(shù)據(jù)模型

?? 所有采集的監(jiān)控?cái)?shù)據(jù)均以指標(biāo)(metric)的形式保存在內(nèi)置的時(shí)間序列數(shù)據(jù)庫(kù)當(dāng)中(TSDB)。所有的樣本除了基本的指標(biāo)名稱以外,還包含一組用于描述該樣本特征的標(biāo)簽。如下所示:

http_request_status{code='200',content_path='/api/path',environment='produment'} => [value1@timestamp1,value2@timestamp2...] 
http_request_status{code='200',content_path='/api/path2',environment='produment'} => [value1@timestamp1,value2@timestamp2...]

每一條時(shí)間序列由指標(biāo)名稱(Metrics Name)以及一組標(biāo)簽(Labels)唯一標(biāo)識(shí)。每條時(shí)間序列按照時(shí)間的先后順序存儲(chǔ)一系列的樣本值。

  • http_request_status:指標(biāo)名稱(Metrics Name)
  • {code='200',content_path='/api/path',environment='produment'}:表示維度的標(biāo)簽,基于這些Labels我們可以方便地對(duì)監(jiān)控?cái)?shù)據(jù)進(jìn)行聚合,過濾,裁剪。
  • [value1@timestamp1,value2@timestamp2...]:按照時(shí)間的先后順序 存儲(chǔ)的樣本值。

3.1.4 強(qiáng)大的查詢語(yǔ)言PromQL

?? Prometheus內(nèi)置了一個(gè)強(qiáng)大的數(shù)據(jù)查詢語(yǔ)言PromQL。 通過PromQL可以實(shí)現(xiàn)對(duì)監(jiān)控?cái)?shù)據(jù)的查詢、聚合。同時(shí)PromQL也被應(yīng)用于數(shù)據(jù)可視化(如Grafana)以及告警當(dāng)中。
通過PromQL可以輕松回答類似于以下問題:

  • 在過去一段時(shí)間中95%應(yīng)用延遲時(shí)間的分布范圍?
  • 預(yù)測(cè)在4小時(shí)后,磁盤空間占用大致會(huì)是什么情況?
  • CPU占用率前5位的服務(wù)有哪些?(過濾)

3.1.5 高效

?? 對(duì)于監(jiān)控系統(tǒng)而言,大量的監(jiān)控任務(wù)必然導(dǎo)致有大量的數(shù)據(jù)產(chǎn)生。而Prometheus可以高效地處理這些數(shù)據(jù),對(duì)于單一Prometheus Server實(shí)例而言它可以處理:

  • 數(shù)以百萬的監(jiān)控指標(biāo)
  • 每秒處理數(shù)十萬的數(shù)據(jù)點(diǎn)

3.1.6 可擴(kuò)展

可以在每個(gè)數(shù)據(jù)中心、每個(gè)團(tuán)隊(duì)運(yùn)行獨(dú)立的Prometheus Sevrer。Prometheus對(duì)于聯(lián)邦集群的支持,可以讓多個(gè)Prometheus實(shí)例產(chǎn)生一個(gè)邏輯集群,當(dāng)單實(shí)例Prometheus Server處理的任務(wù)量過大時(shí),通過使用功能分區(qū)(sharding)+聯(lián)邦集群(federation)可以對(duì)其進(jìn)行擴(kuò)展。

3.1.7 易于集成

?? 使用Prometheus可以快速搭建監(jiān)控服務(wù),并且可以非常方便地在應(yīng)用程序中進(jìn)行集成。目前支持:Java,JMX,Python,Go,Ruby,.Net,Node.js等等語(yǔ)言的客戶端SDK,基于這些SDK可以快速讓應(yīng)用程序納入到 Prometheus的監(jiān)控當(dāng)中,或者開發(fā)自己的監(jiān)控?cái)?shù)據(jù)收集程序。
?? 同時(shí)這些客戶端收集的監(jiān)控?cái)?shù)據(jù),不僅僅支持 Prometheus,還能支持Graphite這些其他的監(jiān)控工具。
?? 同時(shí)Prometheus還支持與其他的監(jiān)控系統(tǒng)進(jìn)行集成:Graphite, Statsd, Collected, Scollector, muini, Nagios等。 Prometheus社區(qū)還提供了大量第三方實(shí)現(xiàn)的監(jiān)控?cái)?shù)據(jù)采集支持:JMX,CloudWatch,EC2,MySQL,PostgresSQL,Haskell,Bash,SNMP,Consul,Haproxy,Mesos,Bind,CouchDB,Django,Memcached,RabbitMQ,Redis,RethinkDB,Rsyslog等等。

3.1.8 可視化

  • Prometheus Server中自帶的Prometheus UI,可以方便地直接對(duì)數(shù)據(jù)進(jìn)行查詢,并且支持直接以圖形化的形式展示數(shù)據(jù)。同時(shí)Prometheus還提供了一個(gè)獨(dú)立的基于Ruby On Rails的Dashboard解決方案 Promdash。
  • 最新的Grafana可視化工具也已經(jīng)提供了完整的Prometheus支持,基于Grafana可以創(chuàng)建更加精美的監(jiān)控圖標(biāo)。
  • 基于Prometheus提供的API還可以實(shí)現(xiàn)自己的監(jiān)控可視化UI。

3.1.9 開放性

?? 通常來說當(dāng)我們需要監(jiān)控一個(gè)應(yīng)用程序時(shí),一般需要該應(yīng)用程序提供對(duì)相應(yīng)監(jiān)控系統(tǒng)協(xié)議的支持,因此應(yīng)用程序會(huì)與所選擇的監(jiān)控系統(tǒng)進(jìn)行綁定。為了減少這種綁定所帶來的限制,對(duì)于決策者而言要么你就直接在應(yīng)用中集成該監(jiān)控系統(tǒng)的支持,要么就在外部創(chuàng)建單獨(dú)的服務(wù)來適配不同的監(jiān)控系統(tǒng)。
?? 而對(duì)于Prometheus來說,使用Prometheus的client library的輸出格式不止支持Prometheus的格式化數(shù)據(jù),也可以輸出支持其它監(jiān)控系統(tǒng)的格式化數(shù)據(jù),比如Graphite。 因此你甚至可以在不使用Prometheus的情況下,采用Prometheus的client library來讓你的應(yīng)用程序支持監(jiān)控?cái)?shù)據(jù)采集。


3.2 Prometheus的架構(gòu)

image.png

3.2.1 Prometheus生態(tài)圈組件

  • Prometheus Server:主服務(wù)器,負(fù)責(zé)收集和存儲(chǔ)時(shí)間序列數(shù)據(jù)
  • client libraies:應(yīng)用程序代碼插樁,將監(jiān)控指標(biāo)嵌入到被監(jiān)控應(yīng)用程序中
  • Pushgateway:推送網(wǎng)關(guān),為支持short-lived作業(yè)提供一個(gè)推送網(wǎng)關(guān)
  • exporter:專門為一些應(yīng)用開發(fā)的數(shù)據(jù)攝取組件—exporter,例如:HAProxy、StatsD、Graphite等等。
  • Alertmanager:專門用于處理alert的組件

3.2.2 架構(gòu)理解

1. 存儲(chǔ)計(jì)算層

  • Prometheus Server,里面包含了存儲(chǔ)引擎和計(jì)算引擎。
  • Retrieval組件為取數(shù)組件,它會(huì)主動(dòng)從Pushgateway或者Exporter拉取指標(biāo)數(shù)據(jù)。
  • Service discovery,可以動(dòng)態(tài)發(fā)現(xiàn)要監(jiān)控的目標(biāo)。
  • TSDB,數(shù)據(jù)核心存儲(chǔ)與查詢。
  • HTTP server,對(duì)外提供HTTP服務(wù)。

2. 采集層

采集層分為兩類,一類是生命周期較短的作業(yè),還有一類是生命周期較長(zhǎng)的作業(yè)。

  • 短作業(yè):直接通過API,在退出時(shí)間指標(biāo)推送給Pushgateway。如Flink任務(wù)每次在不同節(jié)點(diǎn)上啟動(dòng)一個(gè)executor執(zhí)行短作業(yè),結(jié)束時(shí)推送給Pushgateway,Prometheus從Pushgateway獲取數(shù)據(jù)。
  • 長(zhǎng)作業(yè):Retrieval組件直接從Job或者Exporter拉取數(shù)據(jù)。

3. 應(yīng)用層

應(yīng)用層主要分為兩種,一種是AlertManager,另一種是數(shù)據(jù)可視化。

  • AlertManager
    對(duì)接Pagerduty,是一套付費(fèi)的監(jiān)控報(bào)警系統(tǒng)。可實(shí)現(xiàn)短信報(bào)警、5分鐘無人ack打電話通知、仍然無人ack,通知值班人員Manager...
    Emial,發(fā)送郵件
    ... ...
  • 數(shù)據(jù)可視化
    Prometheus build-in WebUI
    Grafana

其他基于API開發(fā)的客戶端


3.3 安裝

3.3.1 安裝Prometheus Server

Prometheus基于Golang編寫,編譯后的軟件包,不依賴于任何的第三方依賴。只需要下載對(duì)應(yīng)平臺(tái)的二進(jìn)制包,解壓并且添加基本的配置即可正常啟動(dòng)Prometheus Server。

  1. 解壓壓縮包 prometheus-2.30.3.linux-amd64.tar.gz
  2. 修改配置文件 prometheus.yml
# my global config
global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["192.168.101.174:9090"]

  - job_name: "pushgateway"
    static_configs:
      - targets: ['192.168.101.174:9091']
        labels: 
          instance: pushgateway

  - job_name: "node exporter"
    static_configs:
      - targets: ['192.168.101.179:9100','192.168.101.180:9100','192.168.101.181:9100']


  - job_name: "process exporter"
    static_configs:
      - targets: ['192.168.101.179:9256','192.168.101.180:9256','192.168.101.181:9256','192.168.101.176:9256']
  1. 啟動(dòng)服務(wù)
    nohup ./prometheus --config.file=./prometheus.yml 1>./prometheus.log 2>&1 &

prometheus啟動(dòng)命令添加參數(shù) --web.enable-lifecycle 然后熱重啟:curl -XPOST http://localhost:9090/-/reload
alertmanager熱重啟: curl -XPOST http://localhost:9093/-/reload

3.3.2 安裝Pushgateway

  1. 解壓壓縮包 pushgateway-1.4.2.linux-amd64.tar.gz
  2. 啟動(dòng)服務(wù) nohup ./pushgateway 1>/opt/module/pushgateway-1.4.2/pushgateway.log 2>&1 &

可以添加 --web.enable-admin-api 參數(shù),可以通過api刪除pushgateway的數(shù)據(jù)

3.3.3 安裝Node Exporter(選擇性安裝)

  1. 解壓壓縮包node_exporter-1.2.2.linux-amd64.tar.gz
  2. 啟動(dòng)服務(wù) ./node_exporter

3.3.4 安裝process-exporter

process-exporter 可以監(jiān)控應(yīng)用的運(yùn)行狀態(tài)(譬如監(jiān)控redis、mysql的進(jìn)程資源等)。

  1. 解壓壓縮包 process-exporter-0.7.8.linux-amd64

  2. 配置需要監(jiān)控的進(jìn)程的名稱,他會(huì)去搜索該進(jìn)程從而得到其需要的監(jiān)控信息,其實(shí)也就是我們常做的“ps -efl | grep xxx”命令來查看對(duì)應(yīng)的進(jìn)程。在各自節(jié)點(diǎn)創(chuàng)建配置文件process_config.yml,并配置如下,用于監(jiān)測(cè)大數(shù)據(jù)框架中主要進(jìn)程的狀況:
    bigdata1節(jié)點(diǎn)

process_names:
  - name: "{{.Matches}}"
    cmdline:
    - 'NameNode'
  - name: "{{.Matches}}"
    cmdline:
    - 'DataNode'
  - name: "{{.Matches}}"
    cmdline:
    - 'NodeManager'
  - name: "{{.Matches}}"
    cmdline:
    - 'QuorumPeerMain'
  - name: "{{.Matches}}"
    cmdline:
    - 'Kafka'
  - name: "{{.Matches}}"
    cmdline:
    - 'flume'
    - 'edb_order_kafka2hdfs.job'
  - name: "{{.Matches}}"
    cmdline:
    - 'AzkabanExecutorServer'
  - name: "{{.Matches}}"
    cmdline:
    - 'HiveServer2'
  - name: "{{.Matches}}"
    cmdline:
    - 'node_exporter'
  - name: "{{.Matches}}"
    cmdline:
    - 'rangerusersync'
  - name: "{{.Matches}}"
    cmdline:
    - 'rangeradmin'

bigdata2節(jié)點(diǎn)

process_names:
  - name: "{{.Matches}}"
    cmdline:
    - 'ResourceManager'
  - name: "{{.Matches}}"
    cmdline:
    - 'DataNode'
  - name: "{{.Matches}}"
    cmdline:
    - 'NodeManager'
  - name: "{{.Matches}}"
    cmdline:
    - 'QuorumPeerMain'
  - name: "{{.Matches}}"
    cmdline:
    - 'Kafka'
  - name: "{{.Matches}}"
    cmdline:
    - 'flume-1.7.0/job/youmeng_order_kafka2hdfs.job'
  - name: "{{.Matches}}"
    cmdline:
    - 'flume-1.7.0/job/youmeng_active_kafka2hdfs.job'
  - name: "{{.Matches}}"
    cmdline:
    - 'AzkabanExecutorServer'
  - name: "{{.Matches}}"
    cmdline:
    - 'AzkabanWebServer'
  - name: "{{.Matches}}"
    cmdline:
    - 'node_exporter'

bigdata3節(jié)點(diǎn)

process_names:
  - name: "{{.Matches}}"
    cmdline:
    - 'SecondaryNameNode'
  - name: "{{.Matches}}"
    cmdline:
    - 'DataNode'
  - name: "{{.Matches}}"
    cmdline:
    - 'NodeManager'
  - name: "{{.Matches}}"
    cmdline:
    - 'JobHistoryServer'
  - name: "{{.Matches}}"
    cmdline:
    - 'QuorumPeerMain'
  - name: "{{.Matches}}"
    cmdline:
    - 'Kafka'
  - name: "{{.Matches}}"
    cmdline:
    - 'AzkabanExecutorServer'
  - name: "{{.Matches}}"
    cmdline:
    - 'node_exporter'
name參數(shù) 說明
{{.Comm}} 包含原始可執(zhí)行文件的基本名稱,即第二個(gè)字段 /proc/<pid>/stat
{{.ExeBase}} 包含可執(zhí)行文件的基名
{{.ExeFull}} 包含可執(zhí)行文件的完全限定路徑
{{.Username}} 包含有效用戶的用戶名
{{.Matches}} map包含應(yīng)用cmdline regexps產(chǎn)生的所有匹配項(xiàng)

例:

[root@izx7dvghztbiorz process-exporter]# ps -ef | grep redis
redis 771 1 0 Jun05 ? 00:45:49 /usr/bin/redis-server *:6379
name參數(shù) 匹配關(guān)鍵詞 說明
{{.Comm}} groupname="redis-server" exe或者sh文件名稱
{{.ExeBase}} groupname="redis-server *:6379" /
{{.ExeFull}} groupname="/usr/bin/redis-server *:6379" ps中的進(jìn)程完成信息
{{.Username}} groupname="redis" 使用進(jìn)程所屬的用戶進(jìn)行分組
{{.Matches}} groupname="map[:redis]" 表示配置到關(guān)鍵字“redis”
  1. 啟動(dòng)進(jìn)程 process-exporter -config.path process_config.yml
    啟動(dòng)后可以通過執(zhí)行命令 curl 192.168.101.79:9256/metrics 來獲取監(jiān)控?cái)?shù)據(jù)。

  2. 將process-exporter添加到prometheus中。在prometheus.yml中添加

  - job_name: "process exporter"
    static_configs:
      - targets: ['192.168.101.179:9256','192.168.101.180:9256','192.168.101.181:9256']

重啟prometheus。

3.3.5 安裝alertmanager

3.3.6 設(shè)置開機(jī)自啟動(dòng)

以node_exporter和process_exporter為例:

  1. 編輯腳本
    ①node_exporter腳本
[Unit]
Description=node_export
Documentation=https://github.com/prometheus/node_exporter
After=network.target
 
[Service]
Type=simple
User=hxr
ExecStart=/opt/module/node_exporter-1.2.2/node_exporter
Restart=on-failure

[Install]
WantedBy=multi-user.target

根據(jù)實(shí)際情況修改Service中的User和ExecStart的屬性,然后將將本放到 /usr/lib/systemd/system/node_exporter.service 路徑下。

②process_exporter腳本

[Unit]
Description=process_exporter
Documentation=https://github.com/ncabatoff/process-exporter
After=network.target

[Service]
Type=simple
User=root
EnvironmentFile="CONFIG=-config.path /opt/module/process-exporter-0.5.0/process_config.yml"
ExecStart=/opt/module/process-exporter-0.5.0/process-exporter ${CONFIG}
Restart=on-failure

[Install]
WantedBy=multi-user.target
  1. 設(shè)為開機(jī)自啟動(dòng)
    systemctl enable node_exporter.service

  2. 啟動(dòng)服務(wù)
    systemctl start node_exporter.service


3.3.7 安裝Flume-exporter(監(jiān)控Flume)

下載Flume_exporter,解壓后進(jìn)行安裝

# 首先安裝Golang
yum -y install epel-release
yum -y install golang
# 解壓flume_exporter
tar -zxvf flume_exporter-0.0.2.tar.gz  -C /opt/module
cd /opt/module/flume_exporter-0.0.2/
# 編譯
make build

配置config.yml

# Example usage:
# Flume JSON Reporting metrics
agents:
- name: "flume-agents"
  enabled: true
# multiple urls can be separated by ,
  urls: ["http://localhost:36001/metrics","http://localhost:36002/metrics"]

需要保證flume啟動(dòng)了JSON Reporting,如sudo -i -u hxr bash -c 'nohup /opt/module/flume-1.7.0/bin/flume-ng agent -n a2 -c /opt/module/flume-1.7.0/conf -f /opt/module/flume-1.7.0/job/feiyan_model_kafka2hdfs.job -Dflume.root.logger=INFO,LOGFILE -Dflume.log.file=feiyan_model_kafka2hdfs.log -Xms512m -Xmx512m -Dflume.monitoring.type=http -Dflume.monitoring.port=36001 1>/dev/null 2>&1 &'

啟動(dòng)flume_exporter

nohup /opt/module/flume_exporter-master/flume_exporter-master --metric-file /opt/module/flume_exporter-master/metrics.yml --config-file=/opt/module/flume_exporter-master/config.yml 1>/opt/module/flume_exporter-master/flume_exporter-master.log 2>&1 &

啟動(dòng)后可以查看Flume的JSON Reporting,也可以查看Flume_exporter的日志

配置Prometheus拉取Flume_exporter日志信息

  - job_name: "flume exporter"
    static_configs:
      - targets: ['192.168.101.181:9360']
      - labels:
          job: flume
          alias: flume_feiyan_model

熱重啟Prometheus curl -X POST http://localhost:9090/-/reload,然后訪問Prometheus UI,輸入Flume某一參數(shù)查詢條件FLUME_CHANNEL_ChannelSize可以得到監(jiān)控到的值。

配置Grafana


3.4 PromQL

Prometheus通過指標(biāo)名稱(metrics name)以及對(duì)應(yīng)的一組標(biāo)簽(labelset)唯一定義一條時(shí)間序列。指標(biāo)名稱反映了監(jiān)控樣本的基本標(biāo)識(shí),而label則在這個(gè)基本特征上為采集到的數(shù)據(jù)提供了多種特征維度。用戶可以基于這些特征維度過濾,聚合,統(tǒng)計(jì)從而產(chǎn)生新的計(jì)算后的一條時(shí)間序列。PromQL是Prometheus內(nèi)置的數(shù)據(jù)查詢語(yǔ)言,其提供對(duì)時(shí)間序列數(shù)據(jù)豐富的查詢,聚合以及邏輯運(yùn)算能力的支持。并且被廣泛應(yīng)用在Prometheus的日常應(yīng)用當(dāng)中,包括對(duì)數(shù)據(jù)查詢、可視化、告警處理當(dāng)中。

3.4.1基本用法

3.4.1.1查詢時(shí)間序列

當(dāng)Prometheus通過Exporter采集到相應(yīng)的監(jiān)控指標(biāo)樣本數(shù)據(jù)后,我們就可以通過PromQL對(duì)監(jiān)控樣本數(shù)據(jù)進(jìn)行查詢。

當(dāng)我們直接使用監(jiān)控指標(biāo)名稱查詢時(shí),可以查詢?cè)撝笜?biāo)下的所有時(shí)間序列。如:

prometheus_http_requests_total

等同于:

prometheus_http_requests_total{}

該表達(dá)式會(huì)返回指標(biāo)名稱為prometheus_http_requests_total的所有時(shí)間序列:

prometheus_http_requests_total{code="200",handler="alerts",instance="localhost:9090",job="prometheus",method="get"}= (20889@1518096812.326)

prometheus_http_requests_total{code="200",handler="graph",instance="localhost:9090",job="prometheus",method="get"}= ([21287@1518096812.326](mailto:21287@1518096812.326))

PromQL還支持用戶根據(jù)時(shí)間序列的標(biāo)簽匹配模式來對(duì)時(shí)間序列進(jìn)行過濾,目前主要支持兩種匹配模式:完全匹配和正則匹配。



PromQL支持使用 = 和 != 兩種完全匹配模式:

  • 通過使用 label=value 可以選擇那些 標(biāo)簽滿足表達(dá)式定義的時(shí)間序列;
  • 反之使用 label!=value 則可以根據(jù)標(biāo)簽匹配排除時(shí)間序列;

例如,如果我們只需要查詢所有prometheus_http_requests_total時(shí)間序列中滿足標(biāo)簽instance為localhost:9090的時(shí)間 序列,則可以使用如下表達(dá)式:

prometheus_http_requests_total{instance="localhost:9090"}

反之使用 instance!="localhost:9090" 則可以排除這些時(shí)間序列:

prometheus_http_requests_total{instance!="localhost:9090"}



PromQL還可以支持使用正則表達(dá)式作為匹配條件,多個(gè)表達(dá)式之間使用 | 進(jìn)行分離:

  • 使用 label=~regx 表示選擇那些標(biāo)簽符合正則表達(dá)式定義的時(shí)間序列;
  • 反之使用 label!~regx 進(jìn)行排除;

例如,如果想查詢多個(gè)環(huán)節(jié)下的時(shí)間序列序列可以使用如下表達(dá)式:

prometheus_http_requests_total{environment=~"staging|testing|development",method!="GET"}

排除用法

prometheus_http_requests_total{environment!~"staging|testing|development",method!="GET"}

3.4.1.2 范圍查詢

直接通過類似于PromQL表達(dá)式httprequeststotal查詢時(shí)間序列時(shí),返回值中只會(huì)包含該時(shí)間序列中的最新的一個(gè)樣本值,這樣的返回結(jié)果我們稱之為瞬時(shí)向量。而相應(yīng)的這樣的表達(dá)式稱之為__瞬時(shí)向量表達(dá)式

而如果我們想過去一段時(shí)間范圍內(nèi)的樣本數(shù)據(jù)時(shí),我們則需要使用區(qū)間向量表達(dá)式。區(qū)間向量表達(dá)式和瞬時(shí)向量表達(dá)式之間的差異在于在區(qū)間向量表達(dá)式中我們需要定義時(shí)間選擇的范圍,時(shí)間范圍通過時(shí)間范圍選擇器 [] 進(jìn)行定義。 例如,通過以下表達(dá)式可以選擇最近5分鐘內(nèi)的所有樣本數(shù)據(jù):

prometheus_http_request_total{}[5m]

該表達(dá)式將會(huì)返回查詢到的時(shí)間序列中最近5分鐘的所有樣本數(shù)據(jù):

prometheus_http_requests_total{code="200",handler="alerts",instance="localhost:9090",job="prometheus",method="get"}=[ 
    1@1518096812.326
    1@1518096817.326
    1@1518096822.326
    1@1518096827.326
    1@1518096832.326
    1@1518096837.325
] 9. prometheus_http_requests_total{code="200",handler="graph",instance="localhost:9090",job="prometheus",method="get"}=[ 
    4@1518096812.326
    4@1518096817.326
    4@1518096822.326
    4@1518096827.326 
    4@1518096832.326
    4@1518096837.325
]

通過區(qū)間向量表達(dá)式查詢到的結(jié)果我們稱為區(qū)間向量。 除了使用m表示分鐘以外,PromQL的時(shí)間范圍選擇器支持其它時(shí)間單位:

  • s - 秒
  • m - 分鐘
  • h - 小時(shí)
  • d - 天
  • w - 周
  • y - 年

3.4.1.3 時(shí)間位移操作

在瞬時(shí)向量表達(dá)式或者區(qū)間向量表達(dá)式中,都是以當(dāng)前時(shí)間為基準(zhǔn):
http_request_total{} # 瞬時(shí)向量表達(dá)式,選擇當(dāng)前最新的數(shù)據(jù)
http_request_total{}[5m] # 區(qū)間向量表達(dá)式,選擇以當(dāng)前時(shí)間為基準(zhǔn),5分鐘內(nèi)的數(shù)據(jù)。
而如果我們想查詢,5分鐘前的瞬時(shí)樣本數(shù)據(jù),或昨天一天的區(qū)間內(nèi)的樣本數(shù)據(jù)呢? 這個(gè)時(shí)候我們就可以使用位移操作,位移操作的關(guān)鍵字為offset。 可以使用offset時(shí)間位移操作:

prometheus_http_request_total{} offset 5m
prometheus_http_request_total{}[1d] offset 1d

3.4.1.4 使用聚合操作

一般來說,如果描述樣本特征的標(biāo)簽(label)在并非唯一的情況下,通過PromQL查詢數(shù)據(jù),會(huì)返回多條滿足這些特征維度的時(shí)間序列。而PromQL提供的聚合操作可以用來對(duì)這些時(shí)間序列進(jìn)行處理,形成一條新的時(shí)間序列:

# 查詢系統(tǒng)所有http請(qǐng)求的總量
sum(prometheus_http_request_total)

# 按照mode計(jì)算主機(jī)CPU的平均使用時(shí)間
avg(node_cpu_seconds_total) by (mode)

# 按照主機(jī)查詢各個(gè)主機(jī)的CPU使用率
sum(sum(irate(node_cpu_seconds_total{mode!='idle'}[5m])) / sum(irate(node_cpu _ seconds_total [5m]))) by (instance) 

3.4.1.5 標(biāo)量和字符串

除了使用瞬時(shí)向量表達(dá)式和區(qū)間向量表達(dá)式以外,PromQL還直接支持用戶使用標(biāo)量(Scalar)和字符串(String)。

  • 標(biāo)量(Scalar):一個(gè)浮點(diǎn)型的數(shù)字值
    標(biāo)量只有一個(gè)數(shù)字,沒有時(shí)序。 例如:
    10
    需要注意的是,當(dāng)使用表達(dá)式count(prometheus_http_requests_total),返回的數(shù)據(jù)類型,依然是瞬時(shí)向量。用戶可以通過內(nèi)置函數(shù)scalar()將單個(gè)瞬時(shí)向量轉(zhuǎn)換為標(biāo)量。
  • 字符串(String):一個(gè)簡(jiǎn)單的字符串值
    直接使用字符串,作為PromQL表達(dá)式,則會(huì)直接返回字符串。
    "this is a string" 
    'these are unescaped: \n \\ \t' 
    `these are not unescaped: \n ' " \t` 
    

3.4.1.6 合法的PromQL表達(dá)式

所有的PromQL表達(dá)式都必須至少包含一個(gè)指標(biāo)名稱(例如http_request_total),或者一個(gè)不會(huì)匹配到空字符串的標(biāo)簽過濾器(例如{code=”200”})。
因此以下兩種方式,均為合法的表達(dá)式:

prometheus_http_request_total # 合法
prometheus_http_request_total{} # 合法
{method="get"} # 合法 

而如下表達(dá)式,則不合法:

{job=~".*"} # 不合法 

同時(shí),除了使用 {label=value} 的形式以外,我們還可以使用內(nèi)置的 name 標(biāo)簽來指定監(jiān)控指標(biāo)名稱:

{__name__=~"prometheus_http_request_total"} # 合法
{__name__=~"node_disk_bytes_read|node_disk_bytes_written"} # 合法

3.4.2 PromQL操作符

使用PromQL除了能夠方便的按照查詢和過濾時(shí)間序列以外,PromQL還支持豐富的操作符,用戶可以使用這些操作符對(duì)進(jìn)一步的對(duì)事件序列進(jìn)行二次加工。這些操作符包括:數(shù)學(xué)運(yùn)算符,邏輯運(yùn)算符,布爾運(yùn)算符等等。

3.4.2.1 數(shù)學(xué)運(yùn)算

PromQL支持的所有數(shù)學(xué)運(yùn)算符如下所示:

  • + (加法)
  • - (減法)
  • * (乘法)
  • / (除法)
  • % (求余)
  • ^ (冪運(yùn)算)

3.4.2.2

Prometheus支持以下布爾運(yùn)算符如下:

  • == (相等)
  • != (不相等)
  • >(大于)
  • < (小于)
  • >= (大于等于)
  • <= (小于等于)

使用bool修飾符改變布爾運(yùn)算符的行為
布爾運(yùn)算符的默認(rèn)行為是對(duì)時(shí)序數(shù)據(jù)進(jìn)行過濾。而在其它的情況下我們可能需要的是真正的布爾結(jié)果。例如,只需要 知道當(dāng)前模塊的HTTP請(qǐng)求量是否>=1000,如果大于等于1000則返回1(true)否則返回0(false)。這時(shí)可以使 用bool修飾符改變布爾運(yùn)算的默認(rèn)行為。 例如:

prometheus_http_requests_total > bool 1000 

使用bool修改符后,布爾運(yùn)算不會(huì)對(duì)時(shí)間序列進(jìn)行過濾,而是直接依次瞬時(shí)向量中的各個(gè)樣本數(shù)據(jù)與標(biāo)量的比較結(jié)果 0或者1。從而形成一條新的時(shí)間序列。

prometheus_http_requests_total{code="200",handler="query",instance="localhost:9090",job="prometheus",method="get"}  1 
prometheus_http_requests_total{code="200",handler="query_range",instance="localhost:9090",job="prometheus",method="get"}    0 

同時(shí)需要注意的是,如果是在兩個(gè)標(biāo)量之間使用布爾運(yùn)算,則必須使用bool修飾符

2 == bool 2 # 結(jié)果為1

3.4.2.3 使用集合運(yùn)算符

使用瞬時(shí)向量表達(dá)式能夠獲取到一個(gè)包含多個(gè)時(shí)間序列的集合,我們稱為瞬時(shí)向量。 通過集合運(yùn)算,可以在兩個(gè)瞬時(shí)向量與瞬時(shí)向量之間進(jìn)行相應(yīng)的集合操作。
目前,Prometheus支持以下集合運(yùn)算符:

  • and (并且)
  • or (或者)
  • unless (排除)

vector1 and vector2 會(huì)產(chǎn)生一個(gè)由vector1的元素組成的新的向量。該向量包含vector1中完全匹配vector2 中的元素組成。
vector1 or vector2 會(huì)產(chǎn)生一個(gè)新的向量,該向量包含vector1中所有的樣本數(shù)據(jù),以及vector2中沒有與 vector1匹配到的樣本數(shù)據(jù)。
vector1 unless vector2 會(huì)產(chǎn)生一個(gè)新的向量,新向量中的元素由vector1中沒有與vector2匹配的元素組成。

3.4.2.4 操作符優(yōu)先級(jí)

對(duì)于復(fù)雜類型的表達(dá)式,需要了解運(yùn)算操作的運(yùn)行優(yōu)先級(jí)。例如,查詢主機(jī)的CPU使用率,可以使用表達(dá)式:

100 * (1 - avg (irate(node_cpu_seconds_total{mode='idle'}[5m])) by(job) ) 

其中irate是PromQL中的內(nèi)置函數(shù),用于計(jì)算區(qū)間向量中時(shí)間序列每秒的即時(shí)增長(zhǎng)率。在PromQL操作符中優(yōu)先級(jí)由高到低依次為:

  • ^
  • *, /, %
  • +, -
  • ==, !=, <=, =, >
  • and, unless
  • or

3.4.2.5 PromQL聚合操作

Prometheus還提供了下列內(nèi)置的聚合操作符,這些操作符作用域瞬時(shí)向量。可以將瞬時(shí)表達(dá)式返回的樣本數(shù)據(jù)進(jìn)行 聚合,形成一個(gè)新的時(shí)間序列。

  • sum (求和)
  • min (最小值)
  • max (最大值)
  • avg (平均值)
  • stddev (標(biāo)準(zhǔn)差)
  • stdvar (標(biāo)準(zhǔn)差異)
  • count (計(jì)數(shù))
  • count_values (對(duì)value進(jìn)行計(jì)數(shù))
  • bottomk (后n條時(shí)序)
  • topk (前n條時(shí)序)
  • quantile (分布統(tǒng)計(jì))
    使用聚合操作的語(yǔ)法如下:
<aggr-op>([parameter,] <vector expression>) [without|by (<label list>)] 

其中只有 count_values , quantile , topk , bottomk 支持參數(shù)(parameter)。

without用于從計(jì)算結(jié)果中移除列舉的標(biāo)簽,而保留其它標(biāo)簽。by則正好相反,結(jié)果向量中只保留列出的標(biāo)簽,其余標(biāo)簽則移除。通過without和by可以按照樣本的問題對(duì)數(shù)據(jù)進(jìn)行聚合。
例如:

sum(prometheus_http_requests_total) without (instance) 

等價(jià)于

sum(prometheus_http_requests_total) by (code,handler,job,method) 

如果只需要計(jì)算整個(gè)應(yīng)用的HTTP請(qǐng)求總量,可以直接使用表達(dá)式:

sum(prometheus_http_requests_total) 

count_values用于時(shí)間序列中每一個(gè)樣本值出現(xiàn)的次數(shù)。count_values會(huì)
為每一個(gè)唯一的樣本值輸出一個(gè)時(shí)間序列,并且每一個(gè)時(shí)間序列包含一個(gè)額外的標(biāo)簽。 例如:

count_values("count", prometheus_http_requests_total) 

topk和bottomk則用于對(duì)樣本值進(jìn)行排序,返回當(dāng)前樣本值前n位,或者后n位的時(shí)間序列。
獲取HTTP請(qǐng)求數(shù)前5位的時(shí)序樣本數(shù)據(jù),可以使用表達(dá)式:

topk(5, prometheus_http_requests_total)

quantile用于計(jì)算當(dāng)前樣本數(shù)據(jù)值的分布情況quantile(φ, express)其中0 ≤ φ ≤ 1。
例如,當(dāng)φ為0.5時(shí),即表示找到當(dāng)前樣本數(shù)據(jù)中的中位數(shù):

quantile(0.5, prometheus_http_requests_total)


3.5 Flink的集成

Flink 提供的 Metrics 可以在 Flink 內(nèi)部收集一些指標(biāo),通過這些指標(biāo)讓開發(fā)人員更好地理解作業(yè)或集群的狀態(tài)。由于集群運(yùn)行后很難發(fā)現(xiàn)內(nèi)部的實(shí)際狀況,跑得慢或快,是否異常等,開發(fā)人員無法實(shí)時(shí)查看所有的 Task 日志。比如作業(yè)很大或者有很多作業(yè)的情況下,該如何處理?此時(shí) Metrics 可以很好的幫助開發(fā)人員了解作業(yè)的當(dāng)前狀況。

Flink官方支持Prometheus,并且提供了對(duì)接Prometheus的jar包,很方便就可以集成。

drwxr-xr-x. 2 hxr hxr 114 7月  23 11:53 external-resource-gpu
drwxr-xr-x. 2 hxr hxr  46 12月  2 2020 metrics-datadog
drwxr-xr-x. 2 hxr hxr  47 7月  23 11:53 metrics-graphite
drwxr-xr-x. 2 hxr hxr  47 7月  23 11:53 metrics-influx
drwxr-xr-x. 2 hxr hxr  42 7月  23 11:53 metrics-jmx
drwxr-xr-x. 2 hxr hxr  49 7月  23 11:53 metrics-prometheus
drwxr-xr-x. 2 hxr hxr  44 7月  23 11:53 metrics-slf4j
drwxr-xr-x. 2 hxr hxr  45 7月  23 11:53 metrics-statsd
-rwxr-xr-x. 1 hxr hxr 654 6月  18 2020 README.txt

3.5.1 拷貝jar包

將flink-metrics-prometheus-1.12.0.jar拷貝到 <flink_home>/lib目錄下

[root@bigdata1 metrics-prometheus]$ cp /opt/module/flink-1.12.0/plugins/metrics-prometheus/flink-metrics-prometheus-1.12.0.jar /opt/module/flink-1.12.0/lib/

Flink 的 Classpath 位于lib目錄下,所以插件的jar包需要放到該目錄下.

3.5.2 修改Flink配置

方式一
進(jìn)入到Flink的conf目錄,修改flink-conf.yaml

[root@bigdata1 conf]$ vim flink-conf.yaml

添加如下配置:

##### 與Prometheus集成配置 #####
metrics.reporter.promgateway.class: org.apache.flink.metrics.prometheus.PrometheusPushGatewayReporter
# PushGateway的主機(jī)名與端口號(hào)
metrics.reporter.promgateway.host: hadoop1
metrics.reporter.promgateway.port: 9091
# Flink metric在前端展示的標(biāo)簽(前綴)與隨機(jī)后綴
metrics.reporter.promgateway.instance: flink-metrics-
metrics.reporter.promgateway.randomJobNameSuffix: true
metrics.reporter.promgateway.deleteOnShutdown: false
metrics.reporter.promgateway.interval: 30 SECONDS

方式二
在啟動(dòng)Flink時(shí)指定

./flink run \
-s hdfs://192.168.101.193:8020/flink/checkpoint/msas/msas_device_exceptions/b6621ef2ee9414d04c0ce2abbfda7490/chk-7356/_metadata --allowNonRestoredState \
-m yarn-cluster -ynm ADS_DEVICE_MSAS_EXCEPTIONS_test -p 2 -ys 2 -yjm 1024 -ytm 2048m \
-d -c com.iotmars.compass.MsasDeviceExceptionsApp -yqu default \
-yD metrics.reporter.promgateway.class=org.apache.flink.metrics.prometheus.PrometheusPushGatewayReporter \
-yD metrics.reporter.promgateway.host=192.168.101.174 -yD metrics.reporter.promgateway.port=9091 \
-yD metrics.reporter.promgateway.instance=flink-metrics \
-yD metrics.reporter.promgateway.randomJobNameSuffix=true \
-yD metrics.reporter.promgateway.deleteOnShutdown=false \
-yD metrics.reporter.promgateway.groupingKey=instance=ADS_DEVICE_MSAS_EXCEPTIONS_test \
/opt/jar/ADS_DEVICE_MSAS_EXCEPTIONS-1.0-SNAPSHOT.jar

pushgateway上的數(shù)據(jù)會(huì)一直存在除非手動(dòng)刪除;這意味著如果flink程序宕機(jī)了,那么prometheus還是可以從pushgateway上pull到flink宕機(jī)前的數(shù)據(jù),但是prometheus上該數(shù)據(jù)的時(shí)間卻是最新的時(shí)間。flink可以通過設(shè)置metrics.reporter.promgateway.deleteOnShutdown=true來主動(dòng)刪除pushgateway上的數(shù)據(jù),但是并不保證一定能刪除成功。
這里可以執(zhí)行一個(gè)腳本在pushgateway中實(shí)現(xiàn)TTL功能,只需要修改

trap 'echo "got sigterm" ; exit 0' SIGTERM

EXPIRATION_SECONDS=${EXPIRATION_SECONDS:-900}
PGW_URL=${PGW_URL:-http://192.168.1.1:9091}

#function convert_to_standardnotation(){
#    # convert number from scientific notation to standar d( ie  '1.5383780136826127e+09' )
#    printf '%.0f' $1
#}

function convert_to_standardnotation() {
   # convert number from scientific notation to standard( ie  '1.5383780136826127e+09' )
   echo $1 | awk '{printf("%.0f", $1)}'
}

function extract_pushgateway_variable(){
local -r _METRIC=$1
local -r _VARNAME=$2
#echo 'push_time_seconds{instance="10.32.32.7",job="bk_jenkins"} 1.5383802210997093e+09' | sed -r 's/.*instance="([^"]*).*/\1/g'
echo $_METRIC | sed -r "s/.*${_VARNAME}=\"([^\"]*).*/\\1/g"
# sample usage :
# extract_pushgateway_variable 'push_time_seconds{instance="10.32.32.7",job="bk_jenkins"} 1.5383802210997093e+09' 'instance'
}

function check_metric_line(){
   local -r _line=$1
   METRIC_TIME=$(echo $_line | awk '{print $2}' )
   #echo "mtime = $_line -> $METRIC_TIME "
   METRIC_TIME=$(convert_to_standardnotation $METRIC_TIME)
   #echo "$CURRENT_TIME - $METRIC_TIME "
   METRIC_AGE_SECONDS=$((CURRENT_TIME-METRIC_TIME))

   if [ "$METRIC_AGE_SECONDS" -gt "$EXPIRATION_SECONDS" ]; then

       metricInstance=$(extract_pushgateway_variable "$_line" 'instance')
       metricJob=$(extract_pushgateway_variable "$_line" 'job')
   
       echo "[INFO] job should be deleted $metricJob  - $metricInstance  age: $METRIC_AGE_SECONDS "
       curl -s -X DELETE "$PGW_URL/metrics/job/${metricJob}/instance/${metricInstance}"
       curl -s -X DELETE "$PGW_URL/metrics/job/${metricJob}"
   fi


}


function check_expired_metric_loop(){

   export CURRENT_TIME=$(date +%s)
   METRICS_LIST=$(curl -s  $PGW_URL/metrics | egrep "^push_time_seconds")
   echo "$METRICS_LIST" | while  read -r line || [[ -n "$line" ]]; do
       check_metric_line "$line"
   done
   sleep $((EXPIRATION_SECONDS / 3 ))

}
while : ; do
check_expired_metric_loop
done 

只需要求改腳本中的pushgateway地址PGW_URL和ttl時(shí)間EXPIRATION_SECONDS即可。刪除是通過curl -s -X DELETE "$PGW_URL/metrics/job/${metricJob}"實(shí)現(xiàn)的。路徑需要轉(zhuǎn)缺匹配數(shù)據(jù)的標(biāo)簽,如存在instance,則請(qǐng)求curl -s -X DELETE "$PGW_URL/metrics/job/${metricJob}/instance/${metricInstance}"進(jìn)行刪除。

除了通過org.apache.flink.metrics.prometheus.PrometheusPushGatewayReporter主動(dòng)推送metrics到pushgateway中,還可以使用org.apache.flink.metrics.prometheus.PrometheusReporter開放一個(gè)端口供prometheus主動(dòng)訪問并拉取metrics,這種方式不好維護(hù)端口,推薦使用上述PrometheusPushGatewayReporter方式實(shí)現(xiàn)。


四、Grafana

Zabbix和Prometheus都可以集成Grafana。

4.1 部署

  1. 下載Grafana安裝包
wget https://dl.grafana.com/enterprise/release/grafana-enterprise-8.5.24.linux-amd64.tar.gz
  1. 使用rpm安裝Grafana
[hxr@bigdata3 software]$ tar -zxvf grafana-enterprise-8.5.24.linux-amd64.tar.gz -C /opt/module/

啟動(dòng)命令為
/opt/module/grafana-8.5.24/bin/grafana-server web 1>/opt/module/grafana-8.5.24/grafana.log 2>&1

  1. 設(shè)置為服務(wù)并開機(jī)自啟
    編輯腳本 grafana.service 如下,并將其放到目錄/usr/lib/systemd/system/下
[Unit]
Description=grafana
Documentation=https://github.com/grafana/grafana
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/opt/module/grafana-8.5.24
ExecStart=/opt/module/grafana-8.5.24/bin/grafana-server web 1>/opt/module/grafana-8.5.24/grafana.log 2>&1
Restart=on-failure

[Install]
WantedBy=multi-user.target

啟動(dòng)服務(wù)systemctl start grafana

開機(jī)自啟systemctl enable grafana

4.2 集成

4.2.1 集成Prometheus

4.2.1.1 配置數(shù)據(jù)源

點(diǎn)擊 Configuration->Data Sources->Add data source,找到Prometheus并點(diǎn)擊Select。

添加Prometheus數(shù)據(jù)源屬性如下
URL:http://192.168.101.174:9090

點(diǎn)擊下方的Save&Test,如果顯示成功則添加數(shù)據(jù)源成功。

4.2.1.2 手動(dòng)創(chuàng)建儀表盤

點(diǎn)擊左邊欄 Create -> Dashboard -> Add an empty panel 即可進(jìn)入儀表盤編輯頁(yè)面。
點(diǎn)擊Metrics browser即可在其中選擇或編輯 PromQL語(yǔ)句,將數(shù)據(jù)以圖表的形式顯示。可以配置多個(gè)監(jiān)控項(xiàng)。

任務(wù)失敗監(jiān)控

以Flink監(jiān)控為例:
這一個(gè)指標(biāo)監(jiān)控主要是基于flink_jobmanager_job_uptime 這個(gè)指標(biāo)進(jìn)行了監(jiān)控。原理是在job任務(wù)存活時(shí),會(huì)按照配置metrics.reporter.promgateway.interval上報(bào)頻率遞增。基于這個(gè)特點(diǎn),當(dāng)任務(wù)失敗后這個(gè)數(shù)值就不會(huì)改變,就能監(jiān)控到任務(wù)失敗。

添加監(jiān)控項(xiàng):

image.png

30秒為數(shù)據(jù)上報(bào)到 promgateway 頻率,除以100為了數(shù)據(jù)好看,當(dāng)job任務(wù)失敗后數(shù) flink上報(bào)的promgateway 的 flink_jobmanager_job_uptime指標(biāo)值不會(huì)變化。((flink_jobmanager_job_uptime)-(flink_jobmanager_job_uptime offset 30s))/100 值就會(huì)是0,可以配置告警。

配置告警:
在Panel頁(yè)面中點(diǎn)擊 Alert -> Create Alert 即可進(jìn)入告警配置頁(yè)面

image.png

在告警通知中可以郵件和webhook,webhook可以調(diào)用相關(guān)接口,執(zhí)行一些動(dòng)作。webhook需要提前配置,在這里配置告警時(shí)就可以直接引入。

網(wǎng)絡(luò)延時(shí)或任務(wù)重啟監(jiān)控

這個(gè)告警也是基于flink_jobmanager_job_uptime 指標(biāo),在出現(xiàn)網(wǎng)絡(luò)延時(shí)或者重啟后進(jìn)行監(jiān)控通知,監(jiān)控指標(biāo)如下:
((flink_jobmanager_job_uptime offset 30s)-(flink_jobmanager_job_uptime))/1000
1)延時(shí)會(huì)導(dǎo)致值突然小于-30(正常情況為-30)
2)重啟會(huì)導(dǎo)致flink_jobmanager_job_uptime指標(biāo)清零從新從0值上報(bào),導(dǎo)致查詢公式值突然大于0(正常情況為-30)

添加監(jiān)控項(xiàng):

image.png

配置告警規(guī)則:

image.png

重啟次數(shù)

基于flink_jobmanager_job_numRestarts 指標(biāo),表示flink job的重啟次數(shù)。一般設(shè)置重啟策略后,在任務(wù)異常重啟后這個(gè)數(shù)值會(huì)遞增+1。可以單純的監(jiān)控重啟次數(shù),也可以每次重啟都進(jìn)行告警(差值)。

image.png

利用當(dāng)前值減去30秒前的值,如果等于1證明重啟了一次。

添加告警規(guī)則:

image.png

4.2.1.3 添加模板

手動(dòng)一個(gè)個(gè)添加Dashboard比較繁瑣,Grafana社區(qū)鼓勵(lì)用戶分享Dashboard,通過https://grafana.com/dashboards網(wǎng)站,可以找到大量可直接使用的Dashboard模板。

Grafana中所有的Dashboard通過JSON進(jìn)行共享,下載并且導(dǎo)入這些JSON文件,就可以直接使用這些已經(jīng)定義好的Dashboard。

添加Node_export模板

搜索一個(gè)高贊,更新時(shí)間比較新且適合項(xiàng)目需求的模板,點(diǎn)擊Download JSON將json腳本下載到本地。

然后進(jìn)入Grafana UI ,點(diǎn)擊 Create -> Import -> Upload JSON file ,選擇下載的json腳本進(jìn)行導(dǎo)入。

image.png

可以修改該P(yáng)anel的名稱和所屬組,選擇數(shù)據(jù)源為Prometheus,點(diǎn)擊Import即可創(chuàng)建完成。

添加Flink模板

同理,搜索并選擇合適的Flink模板,將JSON腳本下載到本地,導(dǎo)入到Grafana中。

添加Process Exporter模版

官網(wǎng)推薦的模版為https://grafana.net/dashboards/249

添加Flume Exporter模板

Flume Exporter推薦使用 Grafana Dashboard ID: 10736

導(dǎo)入Grafana Dashboard ID為10736的模板


image.png

然后配置數(shù)據(jù)源為Prometheus。

4.2.2 集成Zabbix

需要先在grafana的UI界面中安裝zabbix:
在 Configuration -> plugins 中搜索zabbix插件,隨后install插件,安裝完成后在config中點(diǎn)擊enable激活插件。
隨后就可以在Add Data Source中找到zabbix插件。

添加Zabbix數(shù)據(jù)源屬性如下
Url:http://192.168.32.242/zabbix/api_jsonrpc.php
Username: Admin
Password:zabbix

點(diǎn)擊 Save&test 即可添加數(shù)據(jù)源。

4.3 告警通知

Granfana從Prometheus獲取數(shù)據(jù)并按用戶配置的告警規(guī)則向告警模塊發(fā)送告警信息,然后由這些模塊對(duì)告警信息進(jìn)行管理,包括去重、分組、靜音、抑制、聚合,最終通過電子郵件、webhook等方式將告警信息通知路由給對(duì)應(yīng)的聯(lián)系人。

4.3.1 直接使用Grafana發(fā)送告警信息

Grafana支持多種告警模式。
如果希望通過郵箱發(fā)送告警信息,則配置如下:

  1. 修改配置文件custom.ini,添加smtp信息
[smtp]
enabled = true
host = smtp.163.com:25 #smtp服務(wù)器的地址和端口
user = 188****3029@163.com  #你登錄郵箱的賬號(hào)
password =  NUJPIDR*********  #你郵箱賬號(hào)的密碼
from_address = 188****3029@163.com   #發(fā)郵件的賬號(hào)
from_name = Grafana #自定義的名字

如果發(fā)送郵件報(bào)錯(cuò)time out,可以嘗試其他端口如465

  1. 配置Notification channels
    在 Alerting->Notification channels 中選擇 add channel,type選擇Email,
    配置完成后點(diǎn)擊保存Channel。

  2. 配置發(fā)送告警
    我需要監(jiān)控大數(shù)據(jù)框架的進(jìn)程有沒有掉,可以先創(chuàng)建查詢(通過PromQL進(jìn)行查詢)

image.png

然后添加Alert

image.png

可以通過Test rule來測(cè)試當(dāng)前條件下是否會(huì)發(fā)送報(bào)警信息。

保存后就會(huì)將告警信息發(fā)送到配置的channel中,信息如下

如果需要配置重復(fù)報(bào)警repeat_interval間隔,可以在channel中設(shè)置。
如果無法顯示圖片,需要安裝插件Grafana Image Renderer。安裝完成之后通過命令ldd grafana-8.5.24/data/plugins/grafana-image-renderer/chrome-linux/chrome查看缺失的環(huán)境依賴并安裝。

4.3.2 集成AlterManager組件實(shí)現(xiàn)告警

  1. 解壓組件的壓縮包 alertmanager-0.23.0.linux-amd64.tar.gz

  2. 編輯配置文件 alertmanager.yml

global: #全局配置,主要配置告警方式,如郵件等
  resolve_timeout: 5m #解析的超時(shí)時(shí)間
  smtp_smarthost: 'smtp.163.com' #郵箱smtp地址
  smtp_from: '188****3029@163.com' #來自哪個(gè)郵箱發(fā)出的
  smtp_auth_username: '188****3029@163.com' #郵箱的用戶名
  smtp_auth_password: 'NUJPID**********'  #這里是郵箱的授權(quán)密碼,不是登錄密碼
  smtp_require_tls: false #是否啟用tls
route: #設(shè)置報(bào)警的分發(fā)策略,通過route實(shí)現(xiàn)告警的分配,所有的報(bào)警都會(huì)發(fā)送到receiver參數(shù)配置的接收器中
  group_by: ['alertname'] #采用哪個(gè)標(biāo)簽進(jìn)行分組,對(duì)告警通知按標(biāo)簽(label進(jìn)行分組),將具有相同標(biāo)簽或相同警告名稱(alertname)的告警通知聚合在一個(gè)組,然后作為一個(gè)通知發(fā)送
  group_wait: 30s #分組等待的時(shí)間,收到報(bào)警后并不是馬上發(fā)送出去,看看還有沒有alertname這個(gè)標(biāo)簽的報(bào)警發(fā)過來,如果有的話,一起發(fā)出報(bào)警
  group_interval: 5m #上一組報(bào)警與下一組報(bào)警的間隔時(shí)間
  repeat_interval: 1h #告警通知成功發(fā)送后,若問題一直未恢復(fù),需要再次發(fā)送的間隔
  receiver: 'email' #報(bào)警接收人
receivers:
- name: 'email' #誰來接收這個(gè)報(bào)警
  email_configs: #email的配置
  - to: '792965772@qq.com' #報(bào)警接收人的郵件地址
  - to: 'chenjie.sg@outlook.com' #可以寫多個(gè)郵件地址
    send_resolved: true  #發(fā)送恢復(fù)通知
inhibit_rules: #抑制規(guī)則,報(bào)警抑制角色,用于報(bào)警收斂,發(fā)送關(guān)鍵報(bào)警
  - source_match: #匹配到這個(gè)報(bào)警發(fā)生后,其它報(bào)警被抑制掉,
      severity: 'critical' #報(bào)警級(jí)別為critical
    target_match: #其它報(bào)警
      severity: 'warning' #報(bào)警級(jí)別為warning
    equal: ['alertname', 'dev', 'instance'] #對(duì)此處配置的標(biāo)簽進(jìn)行報(bào)警抑制

配置參數(shù)route說明:Prometheus的告警最先到達(dá)根路由(route),是所有告警的入口點(diǎn),不能包含任何匹配項(xiàng)。另外,根路由需要配置一個(gè)接收器(receiver),用來處理哪些沒有匹配到任何子路由的告警(如果沒有子路由,則全部由根路由發(fā)送告警)

Receiver支持的告警模式:

  • email_config:發(fā)送告警郵件
  • slack_config:發(fā)送告警信息到slack
  • webhook_config:訪問配置的url
  • pagerduty_config:發(fā)送告警信息到pagerduty
  • wechat_configs:發(fā)送告警信息到釘釘。Alertmanger 從 v0.12 開始已經(jīng)默認(rèn)支持企業(yè)微信了.
    receivers:
    - name: 'wechat'
      wechat_configs:
      - corp_id: 'xxx' #企業(yè)微信賬號(hào)唯一 ID, 可以在我的企業(yè)中查看
        to_party: '1' #需要發(fā)送的組
        agent_id: '1000002' #第三方企業(yè)應(yīng)用的 ID,可以在自己創(chuàng)建的第三方企業(yè)應(yīng)用詳情頁(yè)面查看
        api_secret: 'xxxx' #第三方企業(yè)應(yīng)用的密鑰,可以在自己創(chuàng)建的第三方企業(yè)應(yīng)用詳情頁(yè)面查看
        send_resolved: true  #發(fā)送恢復(fù)通知
    
  1. 啟動(dòng)alertmanager
alertmanager/alertmanager --config.file=/usr/local/alertmanager/grafana.yml --storage.path=/usr/local/alertmanager/data/  --log.level=debug
  1. 配置Grafana的Notification Channel
    在 Alerting->Notification channels 中選擇 add channel,type選擇Prometheus Alertmanager,Url寫alertmanager所在節(jié)點(diǎn),如192.168.101.174:9093。
    配置完成后點(diǎn)擊保存Channel。

    注意: prometheus 默認(rèn)時(shí)區(qū)為UTC且無法改變時(shí)區(qū),官方建議在用戶的web ui 中重新設(shè)置時(shí)區(qū),因此我們的報(bào)警時(shí)間應(yīng)該+8:00

  2. 配置Grafana的發(fā)送報(bào)警信息
    同理,只需要將Alert中的Send to添加為配置的alertmanager channel即可。

4.3.3 集成第三方平臺(tái)睿象云實(shí)現(xiàn)告警

  1. 注冊(cè)睿象云賬戶并登錄

  2. 點(diǎn)擊 智能告警平臺(tái) -> 集成,在其中創(chuàng)建Grafana應(yīng)用,創(chuàng)建完成后得到一個(gè)AppKey,可以拼接得到一個(gè)Url:http://api.aiops.com/alert/api/event/grafana/v1/${AppKey}

  3. Grafana添加新的channel,channel類型為Webhook,Url處填寫上一步得到的url。

  4. 在睿象云 [智能告警平臺(tái)] 的 [配置] 中點(diǎn)擊新建分派,和通知策略,保存完成后即可接收Grafana發(fā)送的告警信息,并通過配置的方式將信息轉(zhuǎn)發(fā)到指定的用戶。


五、附

5.1 UI界面

http://192.168.32.242/zabbix Zabbix(Admin:zabbix,報(bào)警郵箱792965772@qq.com)

5.2 端口

組件 端口號(hào) 說明
Zabbix 10051:Zabbix_Server通訊端口
Prometheus 9090:prometheus 9100:node-productor 9104:mysqld-exporter 3000:Grafana

5.3 各jps進(jìn)程名對(duì)應(yīng)的組件

zabbix作為服務(wù)運(yùn)行,不是java程序。
Prometheus和Grafana以docker容器形式啟動(dòng)。
Ganlia同樣以docker容器形式啟動(dòng)。

5.4 命令相關(guān)

Zabbix

  • bigdata1啟動(dòng):

    sudo systemctl start/stop zabbix-server zabbix-agent httpd     (httpd是訪問html等頁(yè)面的入口)
    

    bigdata1設(shè)置開機(jī)自啟:

    sudo systemctl enable/disable zabbix-server zabbix-agent httpd
    
  • bigdata2/3啟動(dòng):

    sudo systemctl start/stop zabbix-agent 
    

    設(shè)置開機(jī)自啟:

    sudo systemctl enable/disable zabbix-agent
    

5.5 組件啟停腳本

#!/bin/bash
case $1 in
"start"){
  echo '----- 啟動(dòng) prometheus -----'
  nohup /opt/module/prometheus-2.30.3/prometheus --web.enable-admin-api --config.file=/opt/module/prometheus-2.30.3/prometheus.yml > /opt/module/prometheus-2.30.3/prometheus.log 2>&1 &
  echo '----- 啟動(dòng) pushgateway -----'
  nohup /opt/module/pushgateway-1.4.2/pushgateway --web.listen-address :9091 > /opt/module/pushgateway-1.4.2/pushgateway.log 2>&1 &
  echo '----- 啟動(dòng) grafana -----'
  nohup /opt/module/grafana-8.5.24/bin/grafana-server --homepath /opt/module/grafana-8.5.24 web > /opt/module/grafana-8.5.24/grafana.log 2>&1 &
};;
"stop"){
  echo '----- 停止 grafana -----'
  pgrep -f grafana | xargs kill
  echo '----- 停止 pushgateway -----'
  pgrep -f pushgateway | xargs kill
  echo '----- 停止 prometheus -----'
  pgrep -f prometheus | xargs kill
};;
esac
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,572評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,071評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,409評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,569評(píng)論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,360評(píng)論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,895評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,979評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,123評(píng)論 0 286
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,643評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,559評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,742評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,250評(píng)論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 43,981評(píng)論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,363評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,622評(píng)論 1 280
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,354評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,707評(píng)論 2 370

推薦閱讀更多精彩內(nèi)容