一、監(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ù)可視化功能。
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 部署
-
每臺(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
-
將文件中的鏡像域名替換為阿里云
sudo sed -i 's/http:\/\/repo.zabbix.com/https:\/\/mirrors.aliyun.com\/zabbix/g' /etc/yum.repos.d/zabbix.repo
-
安裝
-
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
-
-
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
-
配置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
-
配置Zabbix Web時(shí)區(qū)
在/etc/httpd/conf.d/zabbix.conf文件中添加php_value date.timezone Asia/Shanghai
-
啟動(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
-
- 訪問頁(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)控
配置主機(jī)
在配置-> 主機(jī)-> 創(chuàng)建主機(jī) 中添加需要監(jiān)控的主機(jī)-
配置監(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 -
配置觸發(fā)器
點(diǎn)擊觸發(fā)器進(jìn)行創(chuàng)建
image.png -
通知方式設(shè)置
在管理-> 報(bào)警媒介類型 中進(jìn)行通知報(bào)警的配置
image.png -
創(chuàng)建動(dòng)作
在配置-> 動(dòng)作中創(chuàng)建動(dòng)作,為觸發(fā)器設(shè)置動(dòng)作(發(fā)郵件)。
image.png
-
為用戶配置郵箱
在用戶的基本資料中配置
image.png -
使用模版為每個(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)。
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)
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。
- 解壓壓縮包 prometheus-2.30.3.linux-amd64.tar.gz
- 修改配置文件 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']
- 啟動(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
- 解壓壓縮包 pushgateway-1.4.2.linux-amd64.tar.gz
- 啟動(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(選擇性安裝)
- 解壓壓縮包node_exporter-1.2.2.linux-amd64.tar.gz
- 啟動(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)程資源等)。
解壓壓縮包 process-exporter-0.7.8.linux-amd64
配置需要監(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” |
啟動(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ù)。將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為例:
- 編輯腳本
①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
設(shè)為開機(jī)自啟動(dòng)
systemctl enable node_exporter.service
啟動(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 部署
- 下載Grafana安裝包
wget https://dl.grafana.com/enterprise/release/grafana-enterprise-8.5.24.linux-amd64.tar.gz
- 使用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
- 設(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):
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è)面
在告警通知中可以郵件和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):
配置告警規(guī)則:
重啟次數(shù)
基于flink_jobmanager_job_numRestarts 指標(biāo),表示flink job的重啟次數(shù)。一般設(shè)置重啟策略后,在任務(wù)異常重啟后這個(gè)數(shù)值會(huì)遞增+1。可以單純的監(jiān)控重啟次數(shù),也可以每次重啟都進(jìn)行告警(差值)。
利用當(dāng)前值減去30秒前的值,如果等于1證明重啟了一次。
添加告警規(guī)則:
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)入。
可以修改該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的模板
然后配置數(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ā)送告警信息,則配置如下:
- 修改配置文件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
配置Notification channels
在 Alerting->Notification channels 中選擇 add channel,type選擇Email,
配置完成后點(diǎn)擊保存Channel。配置發(fā)送告警
我需要監(jiān)控大數(shù)據(jù)框架的進(jìn)程有沒有掉,可以先創(chuàng)建查詢(通過PromQL進(jìn)行查詢)
然后添加Alert
可以通過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)告警
解壓組件的壓縮包 alertmanager-0.23.0.linux-amd64.tar.gz
編輯配置文件 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ù)通知
- 啟動(dòng)alertmanager
alertmanager/alertmanager --config.file=/usr/local/alertmanager/grafana.yml --storage.path=/usr/local/alertmanager/data/ --log.level=debug
-
配置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
配置Grafana的發(fā)送報(bào)警信息
同理,只需要將Alert中的Send to添加為配置的alertmanager channel即可。
4.3.3 集成第三方平臺(tái)睿象云實(shí)現(xiàn)告警
注冊(cè)睿象云賬戶并登錄
點(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}
Grafana添加新的channel,channel類型為Webhook,Url處填寫上一步得到的url。
在睿象云 [智能告警平臺(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