一夺鲜、監(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ù)可視化功能植榕。
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 部署
-
每臺安裝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ù)庫
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é)點的/etc/zabbix/zabbix_server.conf配置文件中修改
# 修改 Server=bigdata1 # 注銷 # ServerActive=127.0.0.1 # Hostname=Zabbix server
-
配置Zabbix Web時區(qū)
在/etc/httpd/conf.d/zabbix.conf文件中添加php_value date.timezone Asia/Shanghai
-
啟動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
-
- 訪問頁面
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)控
配置主機
在配置-> 主機-> 創(chuàng)建主機 中添加需要監(jiān)控的主機-
配置監(jiān)控項
創(chuàng)建完主機后竞端,點擊監(jiān)控項進行監(jiān)控項的創(chuàng)建
如監(jiān)控datanode進行是否正常運行
-
配置觸發(fā)器
點擊觸發(fā)器進行創(chuàng)建
-
通知方式設(shè)置
在管理-> 報警媒介類型 中進行通知報警的配置
-
創(chuàng)建動作
在配置-> 動作中創(chuàng)建動作,為觸發(fā)器設(shè)置動作(發(fā)郵件)庙睡。
-
為用戶配置郵箱
在用戶的基本資料中配置
-
使用模版為每個節(jié)點進行配置
默認有很多框架的模板可以選擇事富,如MySQL、redis等乘陪。但是沒有hadoop的模板统台,需要自己配置。
在配置-> 模板 中進行模板配置啡邑,創(chuàng)建監(jiān)控項贱勃、觸發(fā)器,然后應(yīng)用到主機上。
注意需要修改動作來為模板的觸發(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)痕届。
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)
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。
- 解壓壓縮包 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']
- 啟動服務(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
- 解壓壓縮包 pushgateway-1.4.2.linux-amd64.tar.gz
- 啟動服務(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
- 啟動服務(wù)
./node_exporter
3.3.4 安裝process-exporter
process-exporter 可以監(jiān)控應(yīng)用的運行狀態(tài)(譬如監(jiān)控redis沸版、mysql的進程資源等)。
解壓壓縮包 process-exporter-0.7.8.linux-amd64
配置需要監(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” |
啟動進程
process-exporter -config.path process_config.yml
啟動后可以通過執(zhí)行命令curl 192.168.101.79:9256/metrics
來獲取監(jiān)控數(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è)置開機自啟動
以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ù)實際情況修改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è)為開機自啟動
systemctl enable node_exporter.service
啟動服務(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 部署
- 下載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/
啟動命令為
/opt/module/grafana-8.5.24/bin/grafana-server web 1>/opt/module/grafana-8.5.24/grafana.log 2>&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)控項:
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 即可進入告警配置頁面
在告警通知中可以郵件和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)控項:
配置告警規(guī)則:
重啟次數(shù)
基于flink_jobmanager_job_numRestarts 指標(biāo)没宾,表示flink job的重啟次數(shù)。一般設(shè)置重啟策略后沸柔,在任務(wù)異常重啟后這個數(shù)值會遞增+1循衰。可以單純的監(jiān)控重啟次數(shù)褐澎,也可以每次重啟都進行告警(差值)会钝。
利用當(dāng)前值減去30秒前的值,如果等于1證明重啟了一次工三。
添加告警規(guī)則:
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)入留搔。
可以修改該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的模板
然后配置數(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ā)送告警信息患亿,則配置如下:
- 修改配置文件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
配置Notification channels
在 Alerting->Notification channels 中選擇 add channel步藕,type選擇Email惦界,
配置完成后點擊保存Channel。配置發(fā)送告警
我需要監(jiān)控大數(shù)據(jù)框架的進程有沒有掉咙冗,可以先創(chuàng)建查詢(通過PromQL進行查詢)
然后添加Alert
可以通過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)告警
解壓組件的壓縮包 alertmanager-0.23.0.linux-amd64.tar.gz
編輯配置文件 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ù)通知
- 啟動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é)點,如192.168.101.174:9093谨履。
配置完成后點擊保存Channel欢摄。注意: prometheus 默認時區(qū)為UTC且無法改變時區(qū),官方建議在用戶的web ui 中重新設(shè)置時區(qū)笋粟,因此我們的報警時間應(yīng)該+8:00
配置Grafana的發(fā)送報警信息
同理怀挠,只需要將Alert中的Send to添加為配置的alertmanager channel即可。
4.3.3 集成第三方平臺睿象云實現(xiàn)告警
注冊睿象云賬戶并登錄
點擊 智能告警平臺 -> 集成害捕,在其中創(chuàng)建Grafana應(yīng)用绿淋,創(chuàng)建完成后得到一個AppKey,可以拼接得到一個Url:http://api.aiops.com/alert/api/event/grafana/v1/${AppKey}
Grafana添加新的channel尝盼,channel類型為Webhook吞滞,Url處填寫上一步得到的url。
在睿象云 [智能告警平臺] 的 [配置] 中點擊新建分派盾沫,和通知策略裁赠,保存完成后即可接收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