目錄
- docker安裝prometheus和grafana
- 概念簡述
- 安裝prometheus
- 第一步:確保安裝有docker
- 第二步:拉取鏡像
- 第三步:準備相關掛載目錄及文件
- 第四步:啟動容器
- 第五步:訪問測試
- 安裝grafana
- 第一步:確保安裝有docker
- 第二步:拉取鏡像
- 第三步:準備相關掛載目錄及文件
- 第四步:啟動容器
- 第五步:訪問測試
- 第六步:使用測試
- 安裝exporter監控采集程序,采集數據進prometheus
- node-exporter
- 安裝alertmanager,集成進prometheus
- 安裝alertmanager
- 集成進prometheus
- 相關資料
docker安裝prometheus和grafana
概念簡述
- prometheus(普羅米修斯):天生為采集存儲監控數據而生的時序數據庫。prometheus通過各種Exporter采集到監控數據,然后存儲進prometheus中,以供查詢展示
- grafana:一個監控儀表系統。grafana的數據來源可以有很多(如:Prometheus、Graphite、OpenTSDB、InfluxDB、MySQL/PostgreSQL、Microsoft SQL Serve等等),其中用得最多的數據源是prometheus
- 注:prometheus也有自己的UI,不過功能沒有grafana強大
安裝prometheus
第一步:確保安裝有docker
查看docker版本
docker -v
第二步:拉取鏡像
# 你也可以直接拉docker pull prom/prometheus, 即拉取最新的鏡像docker pull prom/prometheus:lastest docker pull prom/prometheus:v2.41.0
第三步:準備相關掛載目錄及文件
準備目錄
# /opt/prometheus/data目錄,準備用來掛載放置prometheus的數據 # /opt/prometheus/config目錄,準備用來放置prometheus的配置文件 # /opt/prometheus/rules目錄,準備用來掛載放置prometheus的規則文件 mkdir -p /opt/prometheus/{data,config,rules} # 授權相關文件夾權限 chmod -R 777 /opt/prometheus/data chmod -R 777 /opt/prometheus/config chmod -R 777 /opt/prometheus/rules
準備文件
# 配置文件 cat > /opt/prometheus/config/prometheus.yml << \EOF global: # 數據采集間隔 scrape_interval: 45s # 告警檢測間隔 evaluation_interval: 45s # 告警規則 rule_files: # 這里匹配指定目錄下所有的.rules文件 - /prometheus/rules/*.rules # 采集配置 scrape_configs: # 采集項(prometheus) - job_name: 'prometheus' static_configs: # prometheus自帶了對自身的exporter監控程序,所以不需額外安裝exporter就可配置采集項 - targets: ['localhost:9090'] EOF # 查看一下配置文件 cat /opt/prometheus/config/prometheus.yml
prometheus配置項說明
- global:全局配置 (如果有內部單獨設定,會覆蓋這個參數)
- alerting:告警插件定義。這里會設定alertmanager這個報警插件
- rule_files:告警規則。 按照設定參數進行掃描加載,用于自定義報警規則,其報警媒介和route路由由alertmanager插件實現
- scrape_configs:采集配置。配置數據源,包含分組job_name以及具體target。又分為靜態配置和服務發現
- remote_write:用于遠程存儲寫配置
- remote_read:用于遠程讀配置
第四步:啟動容器
# 啟動prometheus # config.file:指定容器中,配置文件的位置 # web.enable-lifecycle:啟動此項后,當配置文件發生變化后,可通過HTTP API 發送 post 請求到 /-/reload,實現熱加載,如:curl -X POST http://47.105.39.189:9090/-/reload # -v /etc/localtime:/etc/localtime:ro表示讓容器使用宿主機的時間, :ro表示只讀(注:此方式只針對宿主機和容器的時區文件均為/etc/localtime) docker run --name prometheus -d \ -p 9090:9090 \ -v /etc/localtime:/etc/localtime:ro \ -v /opt/prometheus/data:/prometheus/data \ -v /opt/prometheus/config:/prometheus/config \ -v /opt/prometheus/rules:/prometheus/rules \ prom/prometheus:v2.41.0 --config.file=/prometheus/config/prometheus.yml --web.enable-lifecycle
第五步:訪問測試
訪問
{ip}:9090
即可
安裝grafana
第一步:確保安裝有docker
查看docker版本
docker -v
第二步:拉取鏡像
鏡像有哪些版本,可以通過查看一個docker鏡像有哪些版本查看
# 你也可以直接拉docker pull grafana/grafana, 即拉取最新的鏡像docker pull grafana/grafana:lastest docker pull grafana/grafana:9.3.2
第三步:準備相關掛載目錄及文件
準備目錄
# /opt/grafana/data目錄,準備用來掛載放置grafana的數據 # /opt/grafana/plugins目錄,準備用來放置grafana的插件 # /opt/grafana/config目錄,準備用來掛載放置grafana的配置文件 mkdir -p /opt/grafana/{data,plugins,config} # 授權相關文件夾權限 chmod -R 777 /opt/grafana/data chmod -R 777 /opt/grafana/plugins chmod -R 777 /opt/grafana/config
準備配置文件
# 先臨時啟動一個容器 docker run --name grafana-tmp -d -p 3000:3000 grafana/grafana:9.3.2 # 將容器中默認的配置文件拷貝到宿主機上 docker cp grafana-tmp:/etc/grafana/grafana.ini /opt/grafana/config/grafana.ini # 移除臨時容器 docker stop grafana-tmp docker rm grafana-tmp # 修改配置文件(需要的話) # vim /opt/grafana/config/grafana.ini
第四步:啟動容器
# 啟動prometheus # 環境變量GF_SECURITY_ADMIN_PASSWORD:指定admin的密碼 # 環境變量GF_INSTALL_PLUGINS:指定啟動時需要安裝得插件 # grafana-clock-panel代表時間插件 # grafana-simple-json-datasource代表json數據源插件 # grafana-piechart-panel代表餅圖插件 docker run -d \ -p 3000:3000 \ --name=grafana \ -v /etc/localtime:/etc/localtime:ro \ -v /opt/grafana/data:/var/lib/grafana \ -v /opt/grafana/plugins/:/var/lib/grafana/plugins \ -v /opt/grafana/config/grafana.ini:/etc/grafana/grafana.ini \ -e "GF_SECURITY_ADMIN_PASSWORD=admin" \ -e "GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-simple-json-datasource,grafana-piechart-panel" \ grafana/grafana:9.3.2
第五步:訪問測試
訪問
{ip}:3000
即可,使用賬密admin/admin進行登錄即可
第六步:使用測試
添加數據源
選擇普羅米修斯作為數據源
制作(或導入)儀表盤
grafana官網提供了很多模板,選擇你喜歡的樣式,直接輸入Dashboard Id即可直接導入
這里列出幾個本人使用的Dashboard Id
12633:Linux主機詳情
此時,界面就出來了
提示:這會兒還沒有數據,是因為prometheus里面本來就沒有數據,后面我們只需要使用相應的exporter往prometheus錄入一些監控數據(如:安裝node-exporter),這里就會顯示出來了
安裝exporter監控采集程序,采集數據進prometheus
node-exporter
官方不建議通過Docekr方式部署node-exporter,因為它需要訪問主機系統
node-exporter 可以采集機器(物理機、虛擬機、云主機等)的監控指標數據,能夠采集到的指標包括 CPU, 內存,磁盤,網絡,文件數等信息
安裝node-exporter
# 下載 wget https://github.com/prometheus/node_exporter/releases/download/v1.1.2/node_exporter-1.1.2.linux-amd64.tar.gz # 解壓 tar -xvf node_exporter-1.1.2.linux-amd64.tar.gz cd node_exporter-1.1.2.linux-amd64 # 啟動 nohup ./node_exporter --web.listen-address=":9100" &
訪問一下,確保node-exporter已正常啟動
或者直接
curl 47.105.39.189:9100
進行驗證也可
在prometheus中配置當前采集項
編輯配置文件
vim /opt/prometheus/config/prometheus.yml
增加當前采集項目
使得最新的prometheus配置生效
你可以重啟prometheus或者使用熱加載使新配置生效,這里我們使用熱加載的方式
# 前提條件:啟動prometheus時,啟用了web.enable-lifecycle # 發送post請求到prometheus的/-/reload下觸發熱加載配置 curl -X POST http://47.105.39.189:9090/-/reload
注:若你觸發熱加載后,過個一會兒還沒看到監控的變化, 那么你可以使用docker logs {prometheus容器}
查看prometheus日志,看到底是否觸發了熱加載
驗證一下
此時,我們再在grafana上看監控面板,就會發現有數據了
安裝alertmanager,集成進prometheus
安裝alertmanager
第一步:確保安裝有docker
查看docker版本
docker -v
第二步:拉取鏡像
鏡像有哪些版本,可以通過查看一個docker鏡像有哪些版本查看
# 你也可以直接拉docker pull prom/alertmanager, 即拉取最新的鏡像docker pull prom/alertmanager:lastest docker pull prom/alertmanager:v0.25.0
第三步:準備相關掛載目錄及文件
準備目錄
# /opt/alertmanager/config目錄,準備用來放置alertmanager的配置文件 # /opt/alertmanager/template目錄,準備用來掛載放置alertmanager的模板文件 mkdir -p /opt/alertmanager/{config,template} # 授權相關文件夾權限 chmod -R 777 /opt/alertmanager/config chmod -R 777 /opt/alertmanager/template
準備配置文件
# 配置文件 cat > /opt/alertmanager/config/alertmanager.yml << \EOF global: resolve_timeout: 5m # 發件人 smtp_from: '1612513157@qq.com' # 郵箱服務器的 POP3/SMTP 主機配置 smtp.qq.com 端口為 465 或 587 smtp_smarthost: 'smtp.qq.com:465' # 用戶名 smtp_auth_username: '1612513157@qq.com' # 授權碼 或 密碼 smtp_auth_password: '你的qq授權碼' smtp_require_tls: false smtp_hello: 'qq.com' templates: # 指定預警內容模板 - '/etc/alertmanager/template/email.tmpl' route: # 指定通過什么字段進行告警分組(如:alertname=A和alertname=B的將會被分導兩個組里面) group_by: ['alertname'] # 在組內等待所配置的時間,如果同組內,5 秒內出現相同報警,在一個組內出現 group_wait: 5s # 如果組內內容不變化,合并為一條警報信息,5 分鐘后發送 group_interval: 5m # 發送告警間隔時間 s/m/h,如果指定時間內沒有修復,則重新發送告警 repeat_interval: 5m # 默認的receiver。 如果一個報警沒有被任何一個route匹配,則發送給默認的接收器 receiver: 'justrydeng163email' #子路由(上面所有的route屬性都由所有子路由繼承,并且可以在每個子路由上進行覆蓋) routes: # 當觸發當前預警的prometheus規則滿足:標簽alarmClassify的為normal時(標簽名、標簽值可以自定義,只要和編寫的prometheus的rule里面設置的標簽呼應上即可),往justrydeng163email發送郵件 - receiver: justrydeng163email match_re: alarmClassify: normal # 當觸發當前預警的prometheus規則滿足:標簽alarmClassify的值為special時(標簽名、標簽值可以自定義,只要和編寫的prometheus的rule里面設置的標簽呼應上即可),往justrydengQQemail發送郵件 - receiver: justrydengQQemail match_re: alarmClassify: special receivers: - name: 'justrydeng163email' email_configs: # 如果想發送多個人就以 ',' 做分割 - to: '13548417409@163.com' send_resolved: true # 接收郵件的標題 headers: {Subject: "alertmanager報警郵件"} - name: 'justrydengQQemail' email_configs: # 如果想發送多個人就以 ',' 做分割 - to: '1249823187@qq.com' send_resolved: true # 接收郵件的標題 headers: {Subject: "alertmanager報警郵件"} inhibit_rules: - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['alertname', 'dev', 'instance'] EOF # 查看一下配置文件 cat /opt/alertmanager/config/alertmanager.yml
準備預警內容模板文件
# 因為我們進行了掛載,所以我們只需編輯宿主機上的模板文件即可 cat > /opt/alertmanager/template/email.tmpl << \EOF {{ define "email.html" }} <table border="1"> <tr> <td>報警項</td> <td>實例</td> <td>報警閥值</td> <td>開始時間</td> <td>告警信息</td> </tr> {{ range $i, $alert := .Alerts }} <tr> <td>{{ index $alert.Labels "alertname" }}</td> <td>{{ index $alert.Labels "instance" }}</td> <td>{{ index $alert.Annotations "value" }}</td> <td>{{ $alert.StartsAt }}</td> <td>{{ index $alert.Annotations "description" }}</td> </tr> {{ end }} </table> {{ end }} EOF # 查看一下模板文件 cat /opt/alertmanager/template/email.tmpl
提示:模板文件中,占位符取值,取的是prometheus的rules文件中對應的值,你可以先寫好prometheus的規則文件后,再來編寫模板文件
第四步:啟動容器
# 啟動alertmanager (啟動后docker ps檢查一下,確保alertmanager起來了即可) docker run -d --name=alertmanager \ -p 9093:9093 \ -v /etc/localtime:/etc/localtime:ro \ -v /opt/alertmanager/config/alertmanager.yml:/etc/alertmanager/alertmanager.yml \ -v /opt/alertmanager/template:/etc/alertmanager/template \ prom/alertmanager:v0.25.0
第五步:確保alertmanager正常啟動
# 查看一下docker容器 docker ps | grep alertmanager # 再看一下alertmanager的日志 docker logs --tail=50 alertmanager
集成進prometheus
第一步:啟用alertmanager
編輯配置文件
vim /opt/prometheus/config/prometheus.yml
啟用alertmanager
# 啟用alertmanager alerting: alertmanagers: - static_configs: - targets: # alertmanager的地址 - 172.31.113.186:9093
第二步:增加prometheus預警規則
提示:prometheus的rules機制,即便不集成alertmanager也是可以用的
# 因為我們啟動prometheus時,是掛載了宿主機的/opt/prometheus/rules目錄到/prometheus/rules下,且配置了/prometheus/rules目錄下所有的.rules文件都會被作為規則文件的 # 所以我們只需要將規則文件創建到宿主機的/opt/prometheus/rules目錄下即可 cat > /opt/prometheus/rules/os.rules << \EOF groups: - name: os rules: # prometheus是通過對應exporter的metric指標查詢接口獲取到被監測對象的數據的。當這個接口調用不通(或調用出錯時),會認為up == 0,當持續時間滿足for時,會發出對應的節點宕機預警 # 實際上,exporter的指標查詢接口調不通,也可能是因為超時或者其它什么導致的,并不一定是被監控節點down機了 - alert: instance不可用(宕機或忙)告警 expr: up == 0 for: 1m labels: alarmClassify: normal annotations: summary: "監控程序{{ $labels.job }}所監控機器不可用" description: "監控程序 {{ $labels.job }}(監控程序地址為{{ $labels.instance }}) down機超過1分鐘了" - alert: CPU告警 expr: 100-(avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by(instance)* 100) > 90 for: 5m labels: alarmClassify: normal annotations: summary: "CPU告警:CPU使用大于90%(目前使用:{{$value}}%)" description: "CPU告警:監控程序{{$labels.instance}}所監控機器的CPU使用大于90%(目前使用:{{$value}}%). 已經持續5分鐘了" - alert: 內存告警 expr: 100 - ((node_memory_MemAvailable_bytes * 100) / node_memory_MemTotal_bytes) > 90 for: 30m labels: alarmClassify: normal annotations: summary: "內存告警:內存使用大于80%(目前使用:{{$value}}%)" description: "內存告警:監控程序{{$labels.instance}}所監控機器的內存使用大于80%(目前使用:{{$value}}%)" - alert: 磁盤分區使用率報警 expr: 100 - ((node_filesystem_avail_bytes{fstype=~"rootfs|xfs",mountpoint=~"/|/etc/hosts"} * 100) / node_filesystem_size_bytes{fstype=~"rootfs|xfs",mountpoint=~"/|/etc/hosts"}) > 80 for: 1m labels: alarmClassify: normal annotations: summary: "磁盤分區告警:{{$labels.mountpoint}} 磁盤分區使用大于80%(目前使用:{{$value}}%)" description: "磁盤分區告警:監控程序{{$labels.instance}}所監控機器的磁盤分區使用量大于80%(目前使用:{{$value}}%). 其它信息:device:{{$labels.device}}, mount:{{$labels.mountpoint}} " - alert: 掛載磁盤分區使用率報警 expr: 100 - ((node_filesystem_avail_bytes{mountpoint=~"/rootfs/newDisk|/backup"} * 100) / node_filesystem_size_bytes{mountpoint=~"/rootfs/newDisk|/backup"}) > 80 for: 1m labels: alarmClassify: normal annotations: summary: "掛載磁盤分區告警:{{$labels.mountpoint}} 掛載磁盤分區使用大于80%(目前使用:{{$value}}%)" description: "掛載磁盤分區告警:監控程序{{$labels.instance}}所監控機器的掛載磁盤分區使用量大于80%(目前使用:{{$value}}%). 其它信息:device:{{$labels.device}}, mount:{{$labels.mountpoint}} " - alert: IO性能 expr: ((irate(node_disk_io_time_seconds_total[30m]))* 100) > 95 for: 1m labels: alarmClassify: normal annotations: summary: "{{$labels.mountpoint}} 流入磁盤IO使用率過高" description: "監控程序{{$labels.instance}}所監控機器的{{$labels.mountpoint }}流入磁盤IO大于95%(目前使用:({{$value}}))" - alert: 網絡(入) expr: ((sum(rate (node_network_receive_bytes_total{device!~'tap.*|veth.*|br.*|docker.*|virbr*|lo*'}[5m])) by (instance)) / 100) > 10240 for: 5m labels: alarmClassify: normal annotations: summary: "{{$labels.mountpoint}} 流入網絡帶寬過高" description: "監控程序{{$labels.instance}}所監控機器的 {{$labels.mountpoint }} 流入網絡帶寬持續5分鐘高于10M. RX帶寬使用率{{$value}}" - alert: 網絡(出) expr: ((sum(rate (node_network_transmit_bytes_total{device!~'tap.*|veth.*|br.*|docker.*|virbr*|lo*'}[5m])) by (instance)) / 100) > 10240 for: 5m labels: alarmClassify: normal annotations: summary: "{{$labels.mountpoint}} 流出網絡帶寬過高" description: "監控程序{{$labels.instance}}所監控機器的 {{$labels.mountpoint }} 流出網絡帶寬持續5分鐘高于10M. RX帶寬使用率{{$value}}" EOF # 查看一下os.rules規則 cat /opt/prometheus/rules/os.rules
- 一條告警規則主要由以下幾部分組成
- alert:告警規則的名稱
- expr:基于PromQL表達式告警觸發條件,用于計算是否有時間序列滿足該條件
- for:評估等待時間,可選參數。用于表示只有當觸發條件持續一段時間后才發送告警。在等待期間新產生告警的狀態為pending
- labels:自定義標簽,允許用戶指定要附加到告警上的一組附加標簽(注:如果自定義的標簽名與prometheus.yml下內置的或配置的標簽名一樣,則會以這里設置的標簽為主)
注:labels下默認有這些標簽
- alertname:告警規則的名稱(即:alert指定的名稱)
- device:機器設備
- fstype:文件系統類型
- mountpoint:掛載點
- job:采集任務名。(即:當前預警所屬采集任務名,假設prometheus.yml如下所示,采集項aliyun-node預警了,那么這里對應的job值為:xxx)
- instance:采集對象。(即:當前預警所屬采集項地址,假設prometheus.yml如下所示,采集項aliyun-node預警了,那么這里對應的instance值為:47.105.39.189:9100)
global: 。。。省略 alerting: 。。。省略 rule_files: 。。。省略 scrape_configs: # 采集任務 - job_name: 'xxx' static_configs: - targets: ['47.105.39.189:9100'] # 設置采集任務標簽 (注:如果預警規則里面設置有同名標簽的話,預警時則會覆蓋此標簽) labels: env: prod name: justrydeng instance: xxx-instance group: 'ds'
annotations:用于指定一組附加信息,比如用于描述告警詳細信息的文字等,annotations的內容在告警產生時會一同作為參數發送到Alertmanager
占位符
{{$xxx}}
,用于取值xxx對應的值如:{{$labels.instance}},取當前規則文件下,instance標簽的值
如:在annotations中,使用{{$value}}取觸發當前預警的預警值
檢查預警規則文件是否正確
# 進入容器 # docker exec -it {容器id 或 容器名} /bin/sh docker exec -it prometheus /bin/sh # 使用promtool 工具,執行check指令 # promtool check rules {規則文件,后綴名隨意都可以} promtool check rules /prometheus/rules/os.rules
第三步:使得最新的prometheus配置生效
因為這里啟用了alertmanager,為保險起見,本人這里選擇重啟prometheus(而不是使用prometheus的熱加載)來使生效
# 重啟容器prometheus docker restart prometheus # 查看日志 docker logs --tail=50 prometheus
第四步:驗證預警生效
訪問prometheus,查看預警規則是否有了
預警狀態說明:
- Inactive:未觸發預警
- Pending:滿足預警規則里面的預警表達式expr了,但是持續時間不滿足預警規則里面的for,尚未發送預警信息
- Firing:觸發預警且已發送預警信息
查看郵箱,發現收到了預警消息
注:因為本人后來優化了上面的rule規則的配置內容,所以這里email里面的截圖和上面的配置有點出入
相關資料
docker安裝prometheus+grafana安裝詳細教程
AlertManager簡介與告警模板