普羅米修斯監控
使用docker部署普羅米修斯監控
普羅米修斯的基本架構
Prometheus Server
Prometheus Server是Prometheus組件中的核心部分,負責實現對監控數據的獲取,存儲以及查詢。 Prometheus Server可以通過靜態配置管理監控目標,也可以配合使用Service Discovery的方式動態管理監控目標,並從這些監控目標中獲取數據。其次Prometheus Server需要對采集到的監控數據進行存儲,Prometheus Server本身就是一個時序數據庫,將采集到的監控數據按照時間序列的方式存儲在本地磁盤當中。最后Prometheus Server對外提供了自定義的PromQL語言,實現對數據的查詢以及分析。
Prometheus Server內置的Express Browser UI,通過這個UI可以直接通過PromQL實現數據的查詢以及可視化。
Prometheus Server的聯邦集群能力可以使其從其他的Prometheus Server實例中獲取數據,因此在大規模監控的情況下,可以通過聯邦集群以及功能分區的方式對Prometheus Server進行擴展。
Exporters
Exporter將監控數據采集的端點通過HTTP服務的形式暴露給Prometheus Server,Prometheus Server通過訪問該Exporter提供的Endpoint端點,即可獲取到需要采集的監控數據。
一般來說可以將Exporter分為2類:
- 直接采集:這一類Exporter直接內置了對Prometheus監控的支持,比如cAdvisor,Kubernetes,Etcd,Gokit等,都直接內置了用於向Prometheus暴露監控數據的端點。
- 間接采集:間接采集,原有監控目標並不直接支持Prometheus,因此我們需要通過Prometheus提供的Client Library編寫該監控目標的監控采集程序。例如: Mysql Exporter,JMX Exporter,Consul Exporter等
AlertManager
在Prometheus Server中支持基於PromQL創建告警規則,如果滿足PromQL定義的規則,則會產生一條告警,而告警的后續處理流程則由AlertManager進行管理。在AlertManager中我們可以與郵件,Slack等等內置的通知方式進行集成,也可以通過Webhook自定義告警處理方式。AlertManager即Prometheus體系中的告警處理中心。
如果遇到警告,普羅米修斯server把符合告警標准的數據推送給alertmanager,然后alertmanager通過插件prometheus-webhook-dingtalk 推送給釘釘
Grafana
負責以優雅的圖形化頁面來展示你所監控的數據 和他自帶的web ui 一樣通過promql來查詢數據顯示出來
一般可以使用自帶的官方模板 8919 就不錯
最后我會教 怎么導入模板
需求:現在有1000台服務器需要監控 而且要求數據持久化和普羅米修斯高可用
思路:
主備HA + 遠程存儲 + 聯邦集群 = 服務可用性 , 數據持久化 , 水平擴展。
同時AlertManager也需要高可用
目標1
1000台服務器: 安裝node_exporter 獲取信息。 !!測試的話 這一步可以忽略 !!
目標2
3台普羅米修斯聯邦集群:這三台需要獲取那1000台服務器的相關信息 然后將數據持久化。
目標3
若干普羅米修斯server: 從三台聯邦普羅米修斯獲取數據 不需要數據持久化。
目標1: !! 測試的話 這一步可以忽略 !!
通過ansible 給1000台服務器安裝node_exporter
node_exporter沒有必要去使用docker去部署 會產生不必要的性能浪費 一般使用軟件包部署
首先去下載 node_exporter 這里這個版本是服務我服務器的版本如果有需要別的版本去官方網站找找
官方網站https://github.com/prometheus/node_exporter/releases
然后用wget下載下來
wget https://github.com/prometheus/node_exporter/releases/download/v1.0.1/node_exporter-1.0.1.linux-amd64.tar.gz
將下載好的包用ansible傳到那1000台主機里 然后運行命令
創建目錄
mkdir /opt/exporter
解壓到剛剛創建的目錄
tar zxvf node_exporter-1.0.1.linux-amd64.tar.gz -C /opt/exporter
寫exporter的service文件
cat > /etc/systemd/system/export.service<< EOF
[Unit]
Description=Prometheus Server
After=network.target
[Service]
Restart=on-failure
WorkingDirectory=/opt/exporter/node_exporter-1.0.1.linux-amd64/
ExecStart=/opt/exporter/node_exporter-1.0.1.linux-amd64/node_exporter \
[Install]
WantedBy=multi-user.target
EOF
跟新systemctl配置
systemctl daemon-reload
啟動export測試
systemctl start export
開機自啟export
systemctl enable export
然后 curl http://本機ip:9100/metrics 看能不能獲取到監控信息 如果可以的話證明沒有問題
完成目標1
目標2
docker的yum源去清華大學開源站獲取然后將docker源里的官方地址改為清華大學地址
下載好docker后 添加docker鏡像加速去阿里雲的容器加速服務獲取自己的加速地址 他會告訴你怎么做
通過epel源 下載docker-compose , ok 安裝好docker和docker-compose后
創建/opt/prometheus/目錄
在目錄里添加下面三個文件
第一個:docker-compose.yml 文件
version: "3" #指定 docker-compose.yml 文件的寫法格式
networks: #定義一個名稱為 monitor 的網絡,由於networks是top-level(頂層級別,所以需要在頂層設置),而且driver內容不能省略
monitor:
driver: bridge # driver為bridge的網絡
services: #多個容器集合
prometheus:
image: prom/prometheus #指定服務所使用的鏡像
container_name: prometheus #定義啟動后容器的名字
hostname: prometheus #主機名
restart: always # 配置重啟,docker每次啟動時會啟動該服務
volumes: #卷掛載路徑 宿主機路徑:容器路徑 這里主要定義了 一會需要的配置文件
- /opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml 配置文件1
- /opt/prometheus/alertmanager-rule.yml:/etc/prometheus/alertmanager-rule.yml 配置文件2
- /etc/localtime:/etc/localtime 時間時區同步
ports: 定義宿主機端口和容器端口的映射,宿主機端口:容器端口
- "9090:9090"
networks: #加入到 monitor 網絡,實現容器間通信
- monitor
prometheus-webhook-alert:
image: quay.io/timonwong/prometheus-webhook-dingtalk
container_name: prometheus-webhook-alertmanagers
hostname: webhook-alertmanagers
restart: always
volumes:
- /etc/localtime:/etc/localtime
- /opt/webhook-dingtalk/default.tmpl:/usr/share/prometheus-webhook-dingtalk/template/default.tmpl 配置文件3
ports:
- "8060:8060"
entrypoint: /bin/prometheus-webhook-dingtalk --ding.profile="webhook1=這里是你的釘釘機器人API" --template.file=/usr/share/prometheus-webhook-dingtalk/template/default.tmpl
networks:
- monitor
grafana:
image: grafana/grafana
container_name: grafana
hostname: grafana
restart: always
volumes:
- /etc/localtime:/etc/localtime
ports:
- "3000:3000"
networks:
- monitor
exporter:
image: prom/node-exporter
container_name: node-exporter
hostname: node-exporter
restart: always
volumes:
- /proc:/host/proc:ro
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/host/sys:ro
- /etc/localtime:/etc/localtime
ports:
- "9100:9100"
networks:
- monitor
influxdb:
image: influxdb:latest
container_name: influxdb
hostname: influxdb
restart: always
volumes:
- /opt/influxdb/config:/etc/influxdb 配置文件4
- /opt/influxdb/data:/var/lib/influxdb/data
- /etc/localtime:/etc/localtime
ports:
- "8086:8086"
- "8083:8083"
environment:
- INFLUXDB_DB=prometheus
- INFLUXDB_ADMIN_ENABLED=true
- INFLUXDB_ADMIN_USER=admin
- INFLUXDB_ADMIN_PASSWORD=adminpwd
- INFLUXDB_USER=prometheus
- INFLUXDB_USER_PASSWORD=prometheuspwd
- INFLUXDB_CONFIG_PATH=/etc/influxdb/influxdb.conf
logging:
driver: "json-file"
options:
max-size: "1g"
networks:
- monitor
配置文件1 普羅米修斯主配置文件 :prometheus.yml
global: # 全局配置
scrape_interval: 15s #從exporter抓取數據周期,可用單位ms、smhdwy #設置每15s采集數據一次,默認1分鍾
evaluation_interval: 15s #計算規則的默認周期 # 每15秒計算一次告警規則,默認1分鍾
alerting: # Alertmanager相關配置
alertmanagers:
- static_configs:
- targets: ["改為本機ip:9093"] 這里指向alertmanager的服務端口
rule_files: # 告警規則文件
[ /etc/prometheus/alertmanager-rule.yml ] 這里指向了告警的配置文件
#這里因為遠程數據庫搭建在了本地所以填寫本地ip即可 就是docker-copose里的influxdb 用來實現數據持久化
remote_write: #寫數據庫
- url: "http://遠程數據庫ip:8086/api/v1/prom/write?db=prometheus&u=prometheus&p=prometheuspwd"
remote_read: #讀數據庫
- url: "http://遠程數據庫ip:8086/api/v1/prom/read?db=prometheus&u=prometheus&p=prometheuspwd"
#配置數據源,稱為target,每個target用job_name命名。又分為靜態配置和服務發現
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['改為本機ip:9090']
- job_name: 'node-1' 這里指向了被監控主機 把那1000台主機的地址添加在node-1這個job里
scrape_interval: 15s
static_configs:
- targets: ['監控主機ip:9100']
- targets: ['...']
- targets: ['...']
配置文件2 普羅米修斯告警配置文件:alertmanager-rule.yml
自定義告警需要學習promQL
當可以看懂promQL后可以根據grafana模板里面的設置 自行更改為可用的參數然后用到告警里
groups 默認在第一行
- name 為一組告警的名字
rules: 這個是必要的格式不加會報錯
- alert: 這個是此告警的名字
expr: 這里填寫 promql 當這里的promql符合要求時就會觸發告警
for: 可選參數當上面的告警持續多長時間后才觸發報警 當符合告警條件但是沒有到for時間時 此時這個告警處於不確定狀態
annotations:
summary: "自定義信息" 其中 $labels.instance 這個變量時普羅米修斯自帶變量為觸發告警的服務器ip
$value 當報警時 這個值具體為多少
groups:
- name: prod_base_monitor
rules:
- alert: InstenceDown
expr: up == 0
for: 2m
annotations:
summary: "!特大事件!{{ $labels.instance }} 宕機"
- name: mem
rules:
- alert: HighMemoryUsage1
expr: (1 - (node_memory_MemAvailable_bytes{job="node-1"} / (node_memory_MemTotal_bytes{job="node-1"})))* 100 > 70
for: 10m
annotations:
summary: "!一般事件!{{ $labels.instance }} 內存使用率>70%已經持續10分鍾\n報警值是: {{ $value }}"
- alert: HighMemoryUsage2
expr: (1 - (node_memory_MemAvailable_bytes{job="node-1"} / (node_memory_MemTotal_bytes{job="node-1"})))* 100 > 80
for: 10m
annotations:
summary: "!重要事件!{{ $labels.instance }} 內存使用率>80%已經持續10分鍾\n報警值是: {{ $value }}"
- alert: HighMemoryUsage3
expr: (1 - (node_memory_MemAvailable_bytes{job="node-1"} / (node_memory_MemTotal_bytes{job="node-1"})))* 100 > 90
for: 10m
annotations:
summary: "!特大事件!{{ $labels.instance }} 內存使用率>90%已經持續10分鍾\n報警值是: {{ $value }}"
- name: cpu
rules:
- alert: HightCPUUsage1
expr: 100 - (avg by (instance)(irate(node_cpu_seconds_total{mode="idle"}[5m]))) * 100 > 70
for: 10m
annotations:
summary: "!一般事件!{{ $labels.instance }} CPU 使用率 > 70已經持續10分鍾\n報警值是: {{ $value }}"
- alert: HightCPUUsage2
expr: 100 - (avg by (instance)(irate(node_cpu_seconds_total{mode="idle"}[5m]))) * 100 > 80
for: 10m
annotations:
summary: "!重要事件!{{ $labels.instance }} CPU 使用率 > 80已經持續10分鍾\n報警值是: {{ $value }}"
- alert: HightCPUUsage3
expr: 100 - (avg by (instance)(irate(node_cpu_seconds_total{mode="idle"}[5m]))) * 100 > 90
for: 10m
annotations:
summary: "!特大事件!{{ $labels.instance }} CPU 使用率 > 90已經持續10分鍾\n報警值是: {{ $value }}"
- name: disk
rules:
- alert: HightDiskUsage1
expr: (node_filesystem_size_bytes{job='node-1',mountpoint="/rootfs"}-node_filesystem_free_bytes{job='node-1',mountpoint="/rootfs"})*100 /(node_filesystem_avail_bytes {job='node-1',mountpoint="/rootfs"}+(node_filesystem_size_bytes{job='node-1',mountpoint="/rootfs"}-node_filesystem_free_bytes{job='node-1',mountpoint="/rootfs"})) > 70
for: 10m
annotations:
summary: "!一般事件!{{ $labels.instance }} 磁盤使用率 > 70\n報警值是: {{ $value }}"
- alert: HightDiskUsage2
expr: (node_filesystem_size_bytes{job='node-1',mountpoint="/rootfs"}-node_filesystem_free_bytes{job='node-1',mountpoint="/rootfs"})*100 /(node_filesystem_avail_bytes {job='node-1',mountpoint="/rootfs"}+(node_filesystem_size_bytes{job='node-1',mountpoint="/rootfs"}-node_filesystem_free_bytes{job='node-1',mountpoint="/rootfs"})) > 80
for: 10m
annotations:
summary: "!重要事件!{{ $labels.instance }} 磁盤使用率 > 80\n報警值是: {{ $value }}"
- alert: HightDiskUsage3
expr: (node_filesystem_size_bytes{job='node-1',mountpoint="/rootfs"}-node_filesystem_free_bytes{job='node-1',mountpoint="/rootfs"})*100 /(node_filesystem_avail_bytes {job='node-1',mountpoint="/rootfs"}+(node_filesystem_size_bytes{job='node-1',mountpoint="/rootfs"}-node_filesystem_free_bytes{job='node-1',mountpoint="/rootfs"})) > 90
for: 10m
annotations:
summary: "!特大事件!{{ $labels.instance }} 磁盤使用率 > 90\n報警值是: {{ $value }}"
配置文件3
創建/opt/webhook-dingtalk目錄
在目錄里創建default.tmpl 發送給釘釘告警的模板文件
{{ define "__subject" }}[{{ if eq .Status "firing" }}告警:{{ .Alerts.Firing | len }}{{ else }}恢復{{ end }}]{{ end }}
{{ define "__text_alert_list" }}
{{ if eq .Status "firing" }}
{{ range .Alerts.Firing }}
[告警時間]:{{ .StartsAt.Format "2006-01-02 15:04:05" }}
{{ range .Annotations.SortedPairs }} - {{ .Value | markdown | html }}
{{ end }}{{ end }}
{{ else if eq .Status "resolved" }}
{{ range .Alerts.Resolved }}
{{ range .Annotations.SortedPairs }} - {{ .Value | markdown | html }}
{{ end }}{{ end }}
{{ end }}
{{ end }}
{{ define "__alertmanagerURL" }}{{ end }}
{{ define "ding.link.title" }}{{ template "__subject" . }}{{ end }}
{{ define "ding.link.content" }}#### [{{ if eq .Status "firing" }}告警:{{ .Alerts.Firing | len }}{{ else }}恢復{{ end }}]
{{ template "__text_alert_list" . }}
{{ end }}
配置文件4
創建/opt/influxdb目錄
在目錄里創建 config 和 data 目錄
在config目錄里創建influxdb的配置文件 influxdb.conf
[meta]
dir = "/var/lib/influxdb/meta"
[data]
dir = "/var/lib/influxdb/data"
engine = "tsm1"
wal-dir = "/var/lib/influxdb/wal"
普羅米修斯需要通過alertmanager發送告警
如果你搭建普羅米修斯集群,不做alertmanager高可用的話,有一台服務器出現異常 而你有4個alertmanager 他就會發送4個一模一樣的告警 會很煩的
只有一個告警的話顯然時不適合生產環境使用的。。。但是我用docker做這個高可用時遇到了問題不會解決沒辦法 使用了軟件包直接部署在本機
總之只要功能實現了就ok
如果不需要alertmanager高可用的話在docker-compose里添加
alertmanager:
image: prom/alertmanager
container_name: alertmanager
hostname: alertmanager1
restart: always
volumes:
- /opt/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml 配置文件5
- /etc/localtime:/etc/localtime
ports:
- "9093:9093"
networks:
- monitor
如果需要alertmanager高可用 要用軟件包部署
wget https://github.com/prometheus/alertmanager/releases/download/v0.21.0/alertmanager-0.21.0.linux-amd64.tar.gz
將上面下載下來的包解壓縮 然后將里面的文件全部移動到/opt/alertmanager/
alertmanager.yml配置文件改為 下面的 配置文件5
然后就是他的啟動命令
--cluster.listen-address=自己的集群端口9094
--cluster.peer=需要進入集群的ip和端口9094
--config.file=配置文件路徑
nohup /opt/alertmanager/alertmanager --cluster.listen-address="0.0.0.0:9094" --cluster.peer=另一台集群ip:9094 --cluster.peer=另一台集群ip:9094 --cluster.peer=另一台集群ip:9094 --config.file=/opt/alertmanager/alertmanager.yml &> /dev/null &
配置文件 5
/opt/alertmanager/alertmanager.yml
global:
resolve_timeout: 1m
route:
group_by: ['alertname']
group_wait: 5s
group_interval: 10s
repeat_interval: 3h
receiver: 'webhook'
receivers:
- name: 'webhook'
webhook_configs:
- url: 'http://本機ip:8060/dingtalk/webhook1/send'
目標3
搭建若干普羅米修斯server 把上面的docker-compose文件里的
influxdb:
image: influxdb:latest
container_name: influxdb
hostname: influxdb
restart: always
volumes:
- /opt/influxdb/config:/etc/influxdb 配置文件4
- /opt/influxdb/data:/var/lib/influxdb/data
- /etc/localtime:/etc/localtime
ports:
- "8086:8086"
- "8083:8083"
environment:
- INFLUXDB_DB=prometheus
- INFLUXDB_ADMIN_ENABLED=true
- INFLUXDB_ADMIN_USER=admin
- INFLUXDB_ADMIN_PASSWORD=adminpwd
- INFLUXDB_USER=prometheus
- INFLUXDB_USER_PASSWORD=prometheuspwd
- INFLUXDB_CONFIG_PATH=/etc/influxdb/influxdb.conf
logging:
driver: "json-file"
options:
max-size: "1g"
networks:
- monitor
刪除
普羅米修斯主配置文件夾改為
global:
scrape_interval: 15s
evaluation_interval: 15s
alerting:
alertmanagers:
- static_configs:
- targets: ["本機ip:9093"]
rule_files:
[ /etc/prometheus/alertmanager-rule.yml ]
scrape_configs:
- job_name: 'federate'
scrape_interval: 15s
honor_labels: true
metrics_path: '/federate'
params:
'match[]':
- '{job="prometheus"}'
- '{job="node-1"}'
static_configs:
- targets:
- '聯邦普羅米修斯ip:9090'
然后去/opt/prometheus/
docker-compose up -d 啟動他就可以了
訪問grafana 地址 本機ip:3000
點擊添加第一個數據源
添加自己的ip:9090端口
點擊save & test 如果成功了即可
然后去導入模板文件
輸入8919 點load
因為我添加過了 所以會報錯
一個名字重復 一個隨機碼uid重復
選擇普羅米修斯
點擊import
點擊左上角logo返回首頁再點擊下面的監控項就可以查看了
http://本機ip:9090/targets 是否正常收取信息 還沒添加1000服務器
http://本機ip:9093/#/status alertmanager集群