背景
本人Java開(kāi)發(fā)工程師一枚,主攻后端,需要搭建一套Prometheus+Grafana的監(jiān)控系統(tǒng),采用企業(yè)微信告警通知。在網(wǎng)上各種查閱資料的同時(shí),發(fā)現(xiàn)很多資料都大致相通且不完整,踩坑無(wú)數(shù),經(jīng)過(guò)多日鉆研后,最終完成了整個(gè)搭建任務(wù),特此記錄下整個(gè)安裝操作過(guò)程,希望能幫助各位。同時(shí)也請(qǐng)各位大神指導(dǎo)并提出意見(jiàn),在此只能傻瓜式的記錄下操作過(guò)程,如果有幸有哪位運(yùn)維大神看到,還請(qǐng)指正不足之處,感激不盡[抱拳]
一、Prometheus下載安裝
Promethus官網(wǎng)下載地址:https://prometheus.io/download/

Xshell連接服務(wù)器依次執(zhí)行以下命令:
進(jìn)入local目錄下
cd /usr/local
上傳下載好的文件包prometheus-2.36.2.linux-amd64.tar.gz (輸入以下命令后回車)
rz
解壓文件
tar -zxvf prometheus-2.36.2.linux-amd64.tar.gz
將解壓后的文件夾重命名為prometheus
mv prometheus-2.36.2.linux-amd64 /usr/local/prometheus
進(jìn)入prometheus目錄下
cd prometheus/
編輯配置文件
vim prometheus.yml
追加以下配置 (注意格式、注意修改自己的ip)
- job_name: 'mysql'
static_configs:
- targets: ['自己的ip:9104']
強(qiáng)制保存并退出 (點(diǎn)擊鍵盤Esc按鍵 → 輸入命令 :wq! → 點(diǎn)擊回車)
Esc → :wq! → 回車
校驗(yàn)修改后的配置文件格式是否正確
./promtool check config prometheus.yml
校驗(yàn)配置文件正常結(jié)果展示(非命令操作)
SUCCESS: prometheus.yml is valid prometheus config file syntax
封裝Prometheus啟動(dòng)文件(輸入以下命令后回車)
vim start.sh
輸入以下內(nèi)容
nohup ./prometheus --config.file=prometheus.yml &
強(qiáng)制保存并退出 (點(diǎn)擊鍵盤Esc按鍵 → 輸入命令 :wq! → 點(diǎn)擊回車)
Esc → :wq! → 回車
給啟動(dòng)文件執(zhí)行權(quán)限(輸入以下命令后回車)
chmod +x start.sh
啟動(dòng)Prometheus
./start.sh
二、mysqld_exporter下載安裝(mysql監(jiān)控插件)
mysqld_exporter插件官網(wǎng)下載地址:https://prometheus.io/download/

Xshell連接服務(wù)器依次執(zhí)行以下命令:
進(jìn)入local目錄下
cd /usr/local
上傳下載好的文件包mysqld_exporter-0.12.1.linux-amd64.tar.gz(輸入以下命令后回車)
rz
解壓文件
tar -zxvf mysqld_exporter-0.12.1.linux-amd64.tar.gz
將解壓后的文件夾重命名為mysqld_exporter
mv mysqld_exporter-0.12.1.linux-amd64 mysqld_exporter
登錄mysql的root賬戶(回車后輸入密碼,此操作需在已安裝mysql的前提下執(zhí)行)
mysql -uroot -p
設(shè)置mysql密碼策略:密碼長(zhǎng)度為6
set global validate_password_length=6;
創(chuàng)建用戶名為my的賬戶 密碼為Abc@12 (此密碼必須根據(jù)上邊設(shè)置的策略長(zhǎng)度為6,否則重新設(shè)置策略)
CREATE USER 'my'@'%' IDENTIFIED BY 'Abc@12' WITH MAX_USER_CONNECTIONS 3;
設(shè)置my賬戶的權(quán)限
GRANT ALL PRIVILEGES ON *.* TO 'my'@'%' IDENTIFIED BY 'Abc@12';
刷新權(quán)限
flush privileges;
退出mysql數(shù)據(jù)庫(kù)編輯 (輸入exit后點(diǎn)擊回車)
exit → 回車
進(jìn)入mysqld_exporter目錄下
cd mysqld_exporter
創(chuàng)建配置文件my.cnf
vim my.cnf
輸入以下內(nèi)容 (注意修改自己的ip,host、port為mysql鏈接,user、password為mysql的賬號(hào)密碼 ) 復(fù)制粘貼命令為Shift+Insert
[client]
host=自己的ip
port=3306
user=root
password=root
強(qiáng)制保存并退出 (點(diǎn)擊鍵盤Esc按鍵 → 輸入命令 :wq! → 點(diǎn)擊回車)
Esc -> :wq! -> 回車
進(jìn)入/usr/lib/systemd/system/目錄下
cd /usr/lib/systemd/system/
創(chuàng)建mysqld_exporter啟動(dòng)腳本
vi mysqld_exporter.service
輸入以下內(nèi)容
[Unit]
Description=mysqld_exporter
Documentation=https://prometheus.io
Wants=network-online.target
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/mysqld_exporter/mysqld_exporter --config.my-cnf=/usr/local /mysqld_exporter/my.cnf
Restart=on-failure
[Install]
WantedBy=multi-user.target
強(qiáng)制保存并退出 (點(diǎn)擊鍵盤Esc按鍵 → 輸入命令 :wq! → 點(diǎn)擊回車)
Esc -> :wq! -> 回車
重新加載配置文件
systemctl daemon-reload
啟動(dòng)mysqld_exporter服務(wù) (停止命令:systemctl stop mysqld_exporter.service)
systemctl start mysqld_exporter.service
查看mysqld_exporter服務(wù)狀態(tài)
systemctl status mysqld_exporter.service
設(shè)置開(kāi)機(jī)啟動(dòng)
systemctl enable mysqld_exporter.service
訪問(wèn) IP:9104 地址 (下方圖示)

點(diǎn)擊 Metrics (下方圖示為安裝成功)

訪問(wèn)http://ip:9090/targets (如下圖示mysql監(jiān)控成功)

注:如沒(méi)有任何展示可重啟Prometheus(查看9090端口進(jìn)程,kill干掉進(jìn)程后,進(jìn)入prometheus目錄下執(zhí)行./start.sh)
三、Grafana 安裝
Grafana官網(wǎng)(版本8.3.3):https://grafana.com/grafana/download/8.3.3?pg=get&plcmt=selfmanaged-box1-cta1

Xshell連接服務(wù)器依次執(zhí)行以下命令:
進(jìn)入local目錄下
cd /usr/local
執(zhí)行下載命令,等待下載完成
wget https://dl.grafana.com/enterprise/release/grafana-enterprise-8.3.3-1.x86_64.rpm
執(zhí)行安裝
sudo yum install grafana-enterprise-8.3.3-1.x86_64.rpm
進(jìn)入/etc/grafana目錄下
cd /etc/grafana
編輯grafana.ini配置文件
vim grafana.ini
修改以下內(nèi)容
data目錄位置配置:
[paths]
# Path to where grafana can store temp files, sessions, and the sqlite3 db (if that is used)
data = /opt/grafana/data
# Temporary files in `data` directory older than given duration will be removed
temp_data_lifetime = 240h
# Directory where grafana can store logs
logs = /opt/grafana/logs
database配置:
[database]
# You can configure the database connection by specifying type, host, name, user and password
# as separate properties or as on string using the url properties.
# Either "mysql", "postgres" or "sqlite3", it's your choice
type = mysql
host = 自己的ip:3306
name = grafana
user = root
# If the password contains # or ; you have to wrap it with triple quotes. Ex"""#password;"""
password = root
smpt配置:
[smtp]
;enabled = false
;host = smtphz.qiye.163.com
;user = 發(fā)送郵件賬號(hào)
# If the password contains # or ; you have to wrap it with triple quotes. Ex"""#password;"""
;password = 發(fā)送郵件賬號(hào)密碼
;cert_file =
;key_file =
;skip_verify = false
;from_address = admin@grafana.localhost
;from_name = Grafana
# EHLO identity in SMTP dialog (defaults to instance_name)
;ehlo_identity = dashboard.example.com
# SMTP startTLS policy (defaults to 'OpportunisticStartTLS')
;startTLS_policy = NoStartTLS
[emails]
;welcome_email_on_sign_up = false
;templates_pattern = emails/*.html, emails/*.txt
;content_types = text/html
啟動(dòng)Grafana服務(wù)
systemctl restart grafana-server.service
設(shè)置開(kāi)機(jī)啟動(dòng)grafana-server
systemctl enable grafana-server.service
瀏覽器訪問(wèn) IP:3000 默認(rèn)用戶密碼都為admin


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




導(dǎo)入mysql dashboards


四、java項(xiàng)目監(jiān)控 & 企業(yè)微信告警
Prometheus官網(wǎng)下載alertmanager:https://prometheus.io/download/

Xshell連接服務(wù)器依次執(zhí)行以下命令:
進(jìn)入local目錄下
cd /usr/local
上傳下載好的安裝包alertmanager-0.24.0.linux-amd64.tar.gz(輸入以下命令后回車)
rz
解壓
tar -zxvf alertmanager-0.24.0.linux-amd64.tar.gz
將解壓后的文件夾更名為alertmanager
mv alertmanager-0.24.0.linux-amd64 alertmanager
進(jìn)入alertmanager目錄下
cd alertmanager
創(chuàng)建grafana.yml配置文件
vim grafana.yml
輸入以下內(nèi)容 (獲取corp_id、agent_id、api_secret、to_party信息方式:http://www.itdecent.cn/p/5704622052de)
global:
resolve_timeout: 5m
templates:
- '/usr/local/alertmanager/wechat.tmpl' #微信模板,同級(jí)目錄下wechat.tmpl
route:
group_by: ['alertname']
group_wait: 5s
#同一組內(nèi)警報(bào),等待group_interval時(shí)間后,再繼續(xù)等待repeat_interval時(shí)間
group_interval: 1m
#當(dāng)group_interval時(shí)間到后,再等待repeat_interval時(shí)間后,才進(jìn)行報(bào)警
repeat_interval: 5m
receiver: 'wechat'
receivers:
- name: 'wechat'
wechat_configs:
- corp_id: 'xxxxxxxxxxxxx' #企業(yè)微信ID
agent_id: 'xxxxxxx' #應(yīng)用ID
api_secret: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' #應(yīng)用密碼
to_party: 'xxxxxx' #部門id(部門所屬人員均可接收到) 單個(gè)賬號(hào)發(fā)送: to_user: 'xxxxx' #多人“,”逗號(hào)隔開(kāi)
send_resolved: true
強(qiáng)制保存并退出 (點(diǎn)擊鍵盤Esc按鍵 → 輸入命令 :wq! → 點(diǎn)擊回車)
Esc -> :wq! -> 回車
在/usr/local/alertmanager/創(chuàng)建上面配置文件中使用到的wechat.tmpl模板
vim wechat.tmpl
輸入以下內(nèi)容
{{ define "wechat.default.message" }}
{{- if gt (len .Alerts.Firing) 0 -}}
{{- range $index, $alert := .Alerts -}}
{{- if eq $index 0 }}
==========異常告警==========
告警類型: {{ $alert.Labels.alertname }}
告警級(jí)別: {{ $alert.Labels.severity }}
告警詳情: {{ $alert.Annotations.message }}{{ $alert.Annotations.description}};{{$alert.Annotations.summary}}
故障時(shí)間: {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
{{- if gt (len $alert.Labels.instance) 0 }}
實(shí)例信息: {{ $alert.Labels.instance }}
{{- end }}
{{- if gt (len $alert.Labels.namespace) 0 }}
命名空間: {{ $alert.Labels.namespace }}
{{- end }}
{{- if gt (len $alert.Labels.node) 0 }}
節(jié)點(diǎn)信息: {{ $alert.Labels.node }}
{{- end }}
{{- if gt (len $alert.Labels.pod) 0 }}
實(shí)例名稱: {{ $alert.Labels.pod }}
{{- end }}
============END============
{{- end }}
{{- end }}
{{- end }}
{{- if gt (len .Alerts.Resolved) 0 -}}
{{- range $index, $alert := .Alerts -}}
{{- if eq $index 0 }}
==========異?;謴?fù)==========
告警類型: {{ $alert.Labels.alertname }}
告警級(jí)別: {{ $alert.Labels.severity }}
告警詳情: {{ $alert.Annotations.message }}{{ $alert.Annotations.description}};{{$alert.Annotations.summary}}
故障時(shí)間: {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
恢復(fù)時(shí)間: {{ ($alert.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
{{- if gt (len $alert.Labels.instance) 0 }}
實(shí)例信息: {{ $alert.Labels.instance }}
{{- end }}
{{- if gt (len $alert.Labels.namespace) 0 }}
命名空間: {{ $alert.Labels.namespace }}
{{- end }}
{{- if gt (len $alert.Labels.node) 0 }}
節(jié)點(diǎn)信息: {{ $alert.Labels.node }}
{{- end }}
{{- if gt (len $alert.Labels.pod) 0 }}
實(shí)例名稱: {{ $alert.Labels.pod }}
{{- end }}
============END============
{{- end }}
{{- end }}
{{- end }}
{{- end }}
強(qiáng)制保存并退出 (點(diǎn)擊鍵盤Esc按鍵 → 輸入命令 :wq! → 點(diǎn)擊回車)
Esc -> :wq! -> 回車
在當(dāng)前目錄下(/usr/local/alertmanager/)封裝Grafana啟動(dòng)文件(輸入以下命令后回車)
vim start.sh
輸入以下內(nèi)容
nohup ./alertmanager --config.file=grafana.yml --storage.path=data/ --log.level=debug &
強(qiáng)制保存并退出 (點(diǎn)擊鍵盤Esc按鍵 → 輸入命令 :wq! → 點(diǎn)擊回車)
Esc → :wq! → 回車
給啟動(dòng)文件執(zhí)行權(quán)限(輸入以下命令后回車)
chmod +x start.sh
啟動(dòng)Grafana
./start.sh
訪問(wèn) IP:9093/#/status 以下圖示為成功

五、node_exporter下載安裝(CPU監(jiān)控插件)
Prometheus官網(wǎng)下載node_exporter:https://prometheus.io/download/

Xshell連接服務(wù)器依次執(zhí)行以下命令:
進(jìn)入local目錄下
cd /usr/local
上傳下載好的安裝包node_exporter-1.3.1.linux-amd64.tar.gz(輸入以下命令后回車)
rz
解壓
tar -zxvf node_exporter-1.3.1.linux-amd64.tar.gz
將解壓后的文件夾更名為node_exporter
mv node_exporter-1.3.1.linux-amd64.tar.gz node_exporter
進(jìn)入node_exporter目錄下
cd node_exporter
在當(dāng)前目錄下(/usr/local/node_exporter/)封裝node_exporter啟動(dòng)文件(輸入以下命令后回車)
vim start.sh
輸入以下內(nèi)容
nohup ./node_exporter & > node.log
強(qiáng)制保存并退出 (點(diǎn)擊鍵盤Esc按鍵 → 輸入命令 :wq! → 點(diǎn)擊回車)
Esc → :wq! → 回車
給啟動(dòng)文件執(zhí)行權(quán)限(輸入以下命令后回車)
chmod +x start.sh
啟動(dòng)node_exporter
./start.sh
訪問(wèn) IP:9100/metrics 以下圖示為成功

六、添加JMX配置,并修改項(xiàng)目啟動(dòng)方式添加JMX(所有服務(wù)器運(yùn)行;端口可變,這里使用3010)
Xshell連接服務(wù)器依次執(zhí)行以下命令:
進(jìn)入local目錄下
cd /usr/local
創(chuàng)建jmx文件夾
mkdir jmx
進(jìn)入jmx文件夾下
cd jmx
下載jmx_prometheus_javaagent-0.12.0.jar文件包
wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.12.0/jmx_prometheus_javaagent-0.12.0.jar
創(chuàng)建配置文件(輸入以下命令后回車)
vim config.yml
輸入以下內(nèi)容
lowercaseOutputLabelNames: true
lowercaseOutputName: true
whitelistObjectNames: ["java.lang:type=OperatingSystem"]
blacklistObjectNames: []
rules:
- pattern: 'java.lang<type=OperatingSystem><>(committed_virtual_memory|free_physical_memory|free_swap_space|total_physical_memory|total_swap_space)_size:'
name: os_$1_bytes
type: GAUGE
attrNameSnakeCase: true
- pattern: 'java.lang<type=OperatingSystem><>((?!process_cpu_time)\w+):'
name: os_$1
type: GAUGE
強(qiáng)制保存并退出(點(diǎn)擊鍵盤Esc按鍵 → 輸入命令 :wq! → 點(diǎn)擊回車)
Esc -> :wq! -> 回車
創(chuàng)建java文件夾
mkdir java
進(jìn)入java文件夾
cd java
上傳要運(yùn)行的java項(xiàng)目jar包(輸入以下命令后回車,需先安裝java環(huán)境jdk)
rz
在當(dāng)前目錄下( /usr/local/jmx/java/)封裝java項(xiàng)目啟動(dòng)文件(輸入以下命令后回車)
vim start.sh
輸入以下內(nèi)容(注意修改jar包名稱, 注意3010為jmx_prometheus_javaagent端口號(hào),非項(xiàng)目端口號(hào))
nohup java -javaagent:/usr/local/jmx/jmx_prometheus_javaagent-0.12.0.jar=3010:/usr/local/jmx/config.yml -Xms100m -Xmx1024m -Dfile.encoding=utf-8 -jar /usr/local/jmx/java/上傳的java項(xiàng)目包名稱.jar
強(qiáng)制保存并退出 (點(diǎn)擊鍵盤Esc按鍵 → 輸入命令 :wq! → 點(diǎn)擊回車)
Esc → :wq! → 回車
給啟動(dòng)文件執(zhí)行權(quán)限(輸入以下命令后回車)
chmod +x start.sh
啟動(dòng)項(xiàng)目
./start.sh
訪問(wèn) IP::3010 以下圖示為成功

七、配置node_exporter和jmx到Prometheus并啟動(dòng)
進(jìn)入到prometheus目錄下
cd /usr/local/prometheus
編輯配置文件
vim prometheus.yml
追加以下內(nèi)容(注意修改自己的ip)
- job_name: 'node'
static_configs:
- targets: ['自己的ip:9100']
- job_name: 'java'
static_configs:
- targets: ['自己的ip:3010']
強(qiáng)制保存并退出(點(diǎn)擊鍵盤Esc按鍵 → 輸入命令 :wq! → 點(diǎn)擊回車)
Esc -> :wq! -> 回車
查看prometheus進(jìn)程(回車后可查看進(jìn)程的PID。lsof命令可能需要安裝,百度查看下怎樣安裝很簡(jiǎn)單。)
lsof -i:9090
干掉進(jìn)程(注意修改進(jìn)程的PID)
kill 進(jìn)程的PID
在當(dāng)前目錄下(/usr/local/prometheus)啟動(dòng)Prometheus
./start.sh
訪問(wèn) IP:9090 以下圖示為node_exporter和jmx配置成功(輸入 JVM 和 node查看)


八、Grafana配置企業(yè)微信報(bào)警








九、測(cè)試消息接收
在企業(yè)微信【應(yīng)用管理 → 引用】添加信任ip地址

查看運(yùn)行的java進(jìn)程(上邊設(shè)置的端口是3010) 記錄進(jìn)程PID
lsof -i:3010
干掉進(jìn)程
kill 進(jìn)程PID
企業(yè)微信接收消息下方圖示(可能會(huì)有延遲,幾分鐘或十幾分鐘不等)

進(jìn)入jar目錄下
cd /usr/local/jmx/java/
再次啟動(dòng)項(xiàng)目
./start.sh
企業(yè)微信收到以下信息
