大數(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使用靈活的通知機制欧芽,允許用戶為幾乎任何事件配置基于郵件的告警新蟆。這樣可以快速反饋服務(wù)器的問題训柴「妆簦基于已存儲的數(shù)據(jù)宝惰,Zabbix提供了出色的報告和數(shù)據(jù)可視化功能植榕。

image.png

2.2 組件

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

2.3 部署

  1. 每臺安裝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ù)庫

    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é)點的/etc/zabbix/zabbix_server.conf配置文件中修改

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

    php_value date.timezone Asia/Shanghai
    
  1. 啟動Zabbix

    • bigdata1啟動:

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

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

      sudo systemctl enable/disable zabbix-server zabbix-agent httpd
      
    • bigdata2/3啟動:

      sudo systemctl start/stop zabbix-agent 
      

      設(shè)置開機自啟:

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

2.4 實現(xiàn)進程監(jiān)控

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

  2. 配置監(jiān)控項
    創(chuàng)建完主機后竞端,點擊監(jiān)控項進行監(jiān)控項的創(chuàng)建
    如監(jiān)控datanode進行是否正常運行


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


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


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


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


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


    image.png

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


三仇穗、Prometheus

3.1 特點

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

3.1.1 易于管理

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

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

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

image.png

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

?? 所有采集的監(jiān)控數(shù)據(jù)均以指標(biāo)(metric)的形式保存在內(nèi)置的時間序列數(shù)據(jù)庫當(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...]

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

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

3.1.4 強大的查詢語言PromQL

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

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

3.1.5 高效

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

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

3.1.6 可擴展

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

3.1.7 易于集成

?? 使用Prometheus可以快速搭建監(jiān)控服務(wù)肠缨,并且可以非常方便地在應(yīng)用程序中進行集成。目前支持:Java盏阶,JMX晒奕,Python,Go名斟,Ruby脑慧,.Net,Node.js等等語言的客戶端SDK砰盐,基于這些SDK可以快速讓應(yīng)用程序納入到 Prometheus的監(jiān)控當(dāng)中闷袒,或者開發(fā)自己的監(jiān)控數(shù)據(jù)收集程序。
?? 同時這些客戶端收集的監(jiān)控數(shù)據(jù)岩梳,不僅僅支持 Prometheus囊骤,還能支持Graphite這些其他的監(jiān)控工具。
?? 同時Prometheus還支持與其他的監(jiān)控系統(tǒng)進行集成:Graphite冀值, Statsd也物, Collected, Scollector列疗, muini滑蚯, Nagios等。 Prometheus社區(qū)還提供了大量第三方實現(xiàn)的監(jiān)控數(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蹋嵌,可以方便地直接對數(shù)據(jù)進行查詢育瓜,并且支持直接以圖形化的形式展示數(shù)據(jù)。同時Prometheus還提供了一個獨立的基于Ruby On Rails的Dashboard解決方案 Promdash栽烂。
  • 最新的Grafana可視化工具也已經(jīng)提供了完整的Prometheus支持躏仇,基于Grafana可以創(chuàng)建更加精美的監(jiān)控圖標(biāo)。
  • 基于Prometheus提供的API還可以實現(xiàn)自己的監(jiān)控可視化UI腺办。

3.1.9 開放性

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


3.2 Prometheus的架構(gòu)

image.png

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

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

3.2.2 架構(gòu)理解

1. 存儲計算層

  • Prometheus Server李皇,里面包含了存儲引擎和計算引擎削茁。
  • Retrieval組件為取數(shù)組件宙枷,它會主動從Pushgateway或者Exporter拉取指標(biāo)數(shù)據(jù)。
  • Service discovery茧跋,可以動態(tài)發(fā)現(xiàn)要監(jiān)控的目標(biāo)慰丛。
  • TSDB,數(shù)據(jù)核心存儲與查詢瘾杭。
  • HTTP server诅病,對外提供HTTP服務(wù)。

2. 采集層

采集層分為兩類粥烁,一類是生命周期較短的作業(yè)贤笆,還有一類是生命周期較長的作業(yè)。

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

3. 應(yīng)用層

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

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

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


3.3 安裝

3.3.1 安裝Prometheus Server

Prometheus基于Golang編寫郑叠,編譯后的軟件包,不依賴于任何的第三方依賴明棍。只需要下載對應(yī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. 啟動服務(wù)
    nohup ./prometheus --config.file=./prometheus.yml 1>./prometheus.log 2>&1 &

prometheus啟動命令添加參數(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. 啟動服務(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. 啟動服務(wù) ./node_exporter

3.3.4 安裝process-exporter

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

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

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

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é)點

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é)點

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í)行文件的基本名稱笑撞,即第二個字段 /proc/<pid>/stat
{{.ExeBase}} 包含可執(zhí)行文件的基名
{{.ExeFull}} 包含可執(zhí)行文件的完全限定路徑
{{.Username}} 包含有效用戶的用戶名
{{.Matches}} map包含應(yīng)用cmdline regexps產(chǎn)生的所有匹配項

例:

[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中的進程完成信息
{{.Username}} groupname="redis" 使用進程所屬的用戶進行分組
{{.Matches}} groupname="map[:redis]" 表示配置到關(guān)鍵字“redis”
  1. 啟動進程 process-exporter -config.path process_config.yml
    啟動后可以通過執(zhí)行命令 curl 192.168.101.79:9256/metrics 來獲取監(jiān)控數(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è)置開機自啟動

以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ù)實際情況修改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è)為開機自啟動
    systemctl enable node_exporter.service

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


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

下載Flume_exporter炉爆,解壓后進行安裝

# 首先安裝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啟動了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 &'卧晓;

啟動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 &

啟動后可以查看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)以及對應(yīng)的一組標(biāo)簽(labelset)唯一定義一條時間序列。指標(biāo)名稱反映了監(jiān)控樣本的基本標(biāo)識胜宇,而label則在這個基本特征上為采集到的數(shù)據(jù)提供了多種特征維度耀怜。用戶可以基于這些特征維度過濾,聚合桐愉,統(tǒng)計從而產(chǎn)生新的計算后的一條時間序列财破。PromQL是Prometheus內(nèi)置的數(shù)據(jù)查詢語言,其提供對時間序列數(shù)據(jù)豐富的查詢从诲,聚合以及邏輯運算能力的支持左痢。并且被廣泛應(yīng)用在Prometheus的日常應(yīng)用當(dāng)中,包括對數(shù)據(jù)查詢系洛、可視化俊性、告警處理當(dāng)中。

3.4.1基本用法

3.4.1.1查詢時間序列

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

當(dāng)我們直接使用監(jiān)控指標(biāo)名稱查詢時,可以查詢該指標(biāo)下的所有時間序列绽诚。如:

prometheus_http_requests_total

等同于:

prometheus_http_requests_total{}

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

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ù)時間序列的標(biāo)簽匹配模式來對時間序列進行過濾拯勉,目前主要支持兩種匹配模式:完全匹配和正則匹配。



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

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

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

prometheus_http_requests_total{instance="localhost:9090"}

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

prometheus_http_requests_total{instance!="localhost:9090"}



PromQL還可以支持使用正則表達式作為匹配條件,多個表達式之間使用 | 進行分離:

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

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

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表達式httprequeststotal查詢時間序列時蚣旱,返回值中只會包含該時間序列中的最新的一個樣本值,這樣的返回結(jié)果我們稱之為瞬時向量檐盟。而相應(yīng)的這樣的表達式稱之為__瞬時向量表達式

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

prometheus_http_request_total{}[5m]

該表達式將會返回查詢到的時間序列中最近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ū)間向量表達式查詢到的結(jié)果我們稱為區(qū)間向量。 除了使用m表示分鐘以外磕昼,PromQL的時間范圍選擇器支持其它時間單位:

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

3.4.1.3 時間位移操作

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

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

3.4.1.4 使用聚合操作

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

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

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

# 按照主機查詢各個主機的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)量和字符串

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

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

3.4.1.6 合法的PromQL表達式

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

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

而如下表達式,則不合法:

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

同時擎浴,除了使用 {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除了能夠方便的按照查詢和過濾時間序列以外,PromQL還支持豐富的操作符贮预,用戶可以使用這些操作符對進一步的對事件序列進行二次加工贝室。這些操作符包括:數(shù)學(xué)運算符,邏輯運算符萌狂,布爾運算符等等档玻。

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

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

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

3.4.2.2

Prometheus支持以下布爾運算符如下:

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

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

prometheus_http_requests_total > bool 1000 

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

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 

同時需要注意的是挟伙,如果是在兩個標(biāo)量之間使用布爾運算楼雹,則必須使用bool修飾符

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

3.4.2.3 使用集合運算符

使用瞬時向量表達式能夠獲取到一個包含多個時間序列的集合,我們稱為瞬時向量尖阔。 通過集合運算贮缅,可以在兩個瞬時向量與瞬時向量之間進行相應(yīng)的集合操作。
目前介却,Prometheus支持以下集合運算符:

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

vector1 and vector2 會產(chǎn)生一個由vector1的元素組成的新的向量谴供。該向量包含vector1中完全匹配vector2 中的元素組成。
vector1 or vector2 會產(chǎn)生一個新的向量齿坷,該向量包含vector1中所有的樣本數(shù)據(jù)桂肌,以及vector2中沒有與 vector1匹配到的樣本數(shù)據(jù)。
vector1 unless vector2 會產(chǎn)生一個新的向量永淌,新向量中的元素由vector1中沒有與vector2匹配的元素組成崎场。

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

對于復(fù)雜類型的表達式,需要了解運算操作的運行優(yōu)先級遂蛀。例如照雁,查詢主機的CPU使用率,可以使用表達式:

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

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

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

3.4.2.5 PromQL聚合操作

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

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

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

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

sum(prometheus_http_requests_total) without (instance) 

等價于

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

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

sum(prometheus_http_requests_total) 

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

count_values("count", prometheus_http_requests_total) 

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

topk(5, prometheus_http_requests_total)

quantile用于計算當(dāng)前樣本數(shù)據(jù)值的分布情況quantile(φ, express)其中0 ≤ φ ≤ 1稚铣。
例如,當(dāng)φ為0.5時墅垮,即表示找到當(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)。由于集群運行后很難發(fā)現(xiàn)內(nèi)部的實際狀況噩斟,跑得慢或快曹锨,是否異常等,開發(fā)人員無法實時查看所有的 Task 日志剃允。比如作業(yè)很大或者有很多作業(yè)的情況下沛简,該如何處理?此時 Metrics 可以很好的幫助開發(fā)人員了解作業(yè)的當(dāng)前狀況斥废。

Flink官方支持Prometheus椒楣,并且提供了對接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配置

方式一
進入到Flink的conf目錄,修改flink-conf.yaml

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

添加如下配置:

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

方式二
在啟動Flink時指定

./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ù)會一直存在除非手動刪除;這意味著如果flink程序宕機了毛俏,那么prometheus還是可以從pushgateway上pull到flink宕機前的數(shù)據(jù)炭庙,但是prometheus上該數(shù)據(jù)的時間卻是最新的時間。flink可以通過設(shè)置metrics.reporter.promgateway.deleteOnShutdown=true來主動刪除pushgateway上的數(shù)據(jù)煌寇,但是并不保證一定能刪除成功焕蹄。
這里可以執(zhí)行一個腳本在pushgateway中實現(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時間EXPIRATION_SECONDS即可阀溶。刪除是通過curl -s -X DELETE "$PGW_URL/metrics/job/${metricJob}"實現(xiàn)的腻脏。路徑需要轉(zhuǎn)缺匹配數(shù)據(jù)的標(biāo)簽,如存在instance银锻,則請求curl -s -X DELETE "$PGW_URL/metrics/job/${metricJob}/instance/${metricInstance}"進行刪除永品。

除了通過org.apache.flink.metrics.prometheus.PrometheusPushGatewayReporter主動推送metrics到pushgateway中,還可以使用org.apache.flink.metrics.prometheus.PrometheusReporter開放一個端口供prometheus主動訪問并拉取metrics击纬,這種方式不好維護端口鼎姐,推薦使用上述PrometheusPushGatewayReporter方式實現(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/

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

  1. 設(shè)置為服務(wù)并開機自啟
    編輯腳本 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

啟動服務(wù)systemctl start grafana

開機自啟systemctl enable grafana

4.2 集成

4.2.1 集成Prometheus

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

點擊 Configuration->Data Sources->Add data source殃饿,找到Prometheus并點擊Select谋作。

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

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

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

點擊左邊欄 Create -> Dashboard -> Add an empty panel 即可進入儀表盤編輯頁面遵蚜。
點擊Metrics browser即可在其中選擇或編輯 PromQL語句,將數(shù)據(jù)以圖表的形式顯示奈惑】跃唬可以配置多個監(jiān)控項。

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

以Flink監(jiān)控為例:
這一個指標(biāo)監(jiān)控主要是基于flink_jobmanager_job_uptime 這個指標(biāo)進行了監(jiān)控肴甸。原理是在job任務(wù)存活時寂殉,會按照配置metrics.reporter.promgateway.interval上報頻率遞增≡冢基于這個特點友扰,當(dāng)任務(wù)失敗后這個數(shù)值就不會改變,就能監(jiān)控到任務(wù)失敗庶柿。

添加監(jiān)控項:

image.png

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

配置告警:
在Panel頁面中點擊 Alert -> Create Alert 即可進入告警配置頁面

image.png

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

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

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

添加監(jiān)控項:

image.png

配置告警規(guī)則:

image.png

重啟次數(shù)

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

image.png

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

添加告警規(guī)則:

image.png

4.2.1.3 添加模板

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

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

添加Node_export模板

搜索一個高贊,更新時間比較新且適合項目需求的模板儿惫,點擊Download JSON將json腳本下載到本地澡罚。

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

image.png

可以修改該Panel的名稱和所屬組,選擇數(shù)據(jù)源為Prometheus铛铁,點擊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中點擊enable激活插件。
隨后就可以在Add Data Source中找到zabbix插件萌业。

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

點擊 Save&test 即可添加數(shù)據(jù)源坷襟。

4.3 告警通知

Granfana從Prometheus獲取數(shù)據(jù)并按用戶配置的告警規(guī)則向告警模塊發(fā)送告警信息,然后由這些模塊對告警信息進行管理生年,包括去重婴程、分組、靜音抱婉、抑制档叔、聚合,最終通過電子郵件蒸绩、webhook等方式將告警信息通知路由給對應(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  #你登錄郵箱的賬號
password =  NUJPIDR*********  #你郵箱賬號的密碼
from_address = 188****3029@163.com   #發(fā)郵件的賬號
from_name = Grafana #自定義的名字

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

  1. 配置Notification channels
    在 Alerting->Notification channels 中選擇 add channel步藕,type選擇Email惦界,
    配置完成后點擊保存Channel。

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

image.png

然后添加Alert

image.png

可以通過Test rule來測試當(dāng)前條件下是否會發(fā)送報警信息沾歪。

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

如果需要配置重復(fù)報警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組件實現(xiàn)告警

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

  2. 編輯配置文件 alertmanager.yml

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

配置參數(shù)route說明:Prometheus的告警最先到達根路由(route)洋只,是所有告警的入口點,不能包含任何匹配項昼捍。另外识虚,根路由需要配置一個接收器(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)默認支持企業(yè)微信了.
    receivers:
    - name: 'wechat'
      wechat_configs:
      - corp_id: 'xxx' #企業(yè)微信賬號唯一 ID, 可以在我的企業(yè)中查看
        to_party: '1' #需要發(fā)送的組
        agent_id: '1000002' #第三方企業(yè)應(yīng)用的 ID郊闯,可以在自己創(chuàng)建的第三方企業(yè)應(yīng)用詳情頁面查看
        api_secret: 'xxxx' #第三方企業(yè)應(yīng)用的密鑰,可以在自己創(chuàng)建的第三方企業(yè)應(yīng)用詳情頁面查看
        send_resolved: true  #發(fā)送恢復(fù)通知
    
  1. 啟動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é)點,如192.168.101.174:9093谨履。
    配置完成后點擊保存Channel欢摄。

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

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

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

  1. 注冊睿象云賬戶并登錄

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

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

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


五佩捞、附

5.1 UI界面

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

5.2 端口

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

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

zabbix作為服務(wù)運行蕾哟,不是java程序一忱。
Prometheus和Grafana以docker容器形式啟動莲蜘。
Ganlia同樣以docker容器形式啟動。

5.4 命令相關(guān)

Zabbix

  • bigdata1啟動:

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

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

    sudo systemctl enable/disable zabbix-server zabbix-agent httpd
    
  • bigdata2/3啟動:

    sudo systemctl start/stop zabbix-agent 
    

    設(shè)置開機自啟:

    sudo systemctl enable/disable zabbix-agent
    

5.5 組件啟停腳本

#!/bin/bash
case $1 in
"start"){
  echo '----- 啟動 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 '----- 啟動 pushgateway -----'
  nohup /opt/module/pushgateway-1.4.2/pushgateway --web.listen-address :9091 > /opt/module/pushgateway-1.4.2/pushgateway.log 2>&1 &
  echo '----- 啟動 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)容合作請聯(lián)系作者
  • 序言:七十年代末掀潮,一起剝皮案震驚了整個濱河市菇夸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌仪吧,老刑警劉巖庄新,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異薯鼠,居然都是意外死亡择诈,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門出皇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來羞芍,“玉大人,你說我怎么就攤上這事郊艘『煽疲” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵纱注,是天一觀的道長畏浆。 經(jīng)常有香客問我,道長狞贱,這世上最難降的妖魔是什么刻获? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮瞎嬉,結(jié)果婚禮上蝎毡,老公的妹妹穿的比我還像新娘。我一直安慰自己氧枣,他們只是感情好沐兵,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著便监,像睡著了一般痒筒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上茬贵,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天簿透,我揣著相機與錄音,去河邊找鬼解藻。 笑死老充,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的螟左。 我是一名探鬼主播啡浊,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼觅够,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了巷嚣?” 一聲冷哼從身側(cè)響起喘先,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎廷粒,沒想到半個月后窘拯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡坝茎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年涤姊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗤放。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡思喊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出次酌,到底是詐尸還是另有隱情恨课,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布岳服,位于F島的核電站庄呈,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏派阱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一斜纪、第九天 我趴在偏房一處隱蔽的房頂上張望贫母。 院中可真熱鬧,春花似錦盒刚、人聲如沸腺劣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽橘原。三九已至,卻和暖如春涡上,著一層夾襖步出監(jiān)牢的瞬間趾断,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工吩愧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芋酌,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓雁佳,卻偏偏與公主長得像脐帝,于是被迫代替她去往敵國和親同云。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

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