Docker部署Prometheus實(shí)現(xiàn)微信郵件報(bào)警

Prometheus 組成及架構(gòu)

Prometheus 生態(tài)圈中包含了多個(gè)組件,其中許多組件是可選的:

  • Prometheus Server: 用于收集和存儲時(shí)間序列數(shù)據(jù)。
  • Client Library: 客戶端庫,為需要監(jiān)控的服務(wù)生成相應(yīng)的 metrics 并暴露給 Prometheus server。當(dāng) Prometheus server 來 pull 時(shí),直接返回實(shí)時(shí)狀態(tài)的 metrics。
  • Push Gateway: 主要用于短期的 jobs。由于這類 jobs 存在時(shí)間較短,可能在 Prometheus 來 pull 之前就消失了。為此,這次 jobs 可以直接向 Prometheus server 端推送它們的 metrics。這種方式主要用于服務(wù)層面的 metrics,對于機(jī)器層面的 metrices,需要使用 node exporter。
  • Exporters: 用于暴露已有的第三方服務(wù)的 metrics 給 Prometheus。
  • Alertmanager: 從 Prometheus server 端接收到 alerts 后,會進(jìn)行去除重復(fù)數(shù)據(jù),分組,并路由到對應(yīng)的接收方式,發(fā)出報(bào)警。常見的接收方式有:電子郵件,pagerduty,OpsGenie, webhook 等。

Prometheus 官方文檔中的架構(gòu)圖:

unmin.club

從上圖可以看出,Prometheus 的主要模塊包括:Prometheus server, exporters, Pushgateway, PromQL, Alertmanager 以及圖形界面。

其大概的工作流程是:

  1. Prometheus server 定期從配置好的 jobs 或者 exporters 中拉 metrics,或者接收來自 Pushgateway 發(fā)過來的 metrics,或者從其他的 Prometheus server 中拉 metrics。
  2. Prometheus server 在本地存儲收集到的 metrics,并運(yùn)行已定義好的 alert.rules,記錄新的時(shí)間序列或者向 Alertmanager 推送警報(bào)。
  3. Alertmanager 根據(jù)配置文件,對接收到的警報(bào)進(jìn)行處理,發(fā)出告警。
  4. 在圖形界面中,可視化采集數(shù)據(jù)。

Prometheus官網(wǎng):https://prometheus.io/

1. Prometheus安裝及配置

192.168.16.251      Prometheus,grafana,alertmanager,Node-exporter
192.168.16.252      Node-exporter,Jmx-exporter,Cadvisor

創(chuàng)建Prometheus配置文件prometheus.yml
本地宿主機(jī)/root/prometheus/conf/下創(chuàng)建

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.
alerting:       #指定alertmanager報(bào)警組件地址
  alertmanagers:
  - static_configs:
    - targets: [ '192.168.16.251:9093']

rule_files:  #指定報(bào)警規(guī)則文件
  - "rules.yml"

scrape_configs:
  - job_name: 'nodehost'   
    static_configs:
      - targets: ['192.168.16.251:9100']
        labels:
          appname: 'Node1'
 static_configs:
      - targets: ['192.168.16.252:9100']
        labels:
          appname: 'Node2'
  - job_name: 'tomcat'
    static_configs:
      - targets: ['192.168.16.173:12345']
        labels:
          appname: 'mytest'
  - job_name: 'cadvisor'
    static_configs:
      - targets: [ '192.168.16.251:8080','192.168.16.252:8080','192.168.16.173:8080']
        labels:
          appname: 'cadvisor'
  - job_name: 'prometheus'
    static_configs:
      - targets: [ '192.168.16.251:9090']
        labels:
          appname: 'prometheus'

上面我們使用靜態(tài)的方式指定了各Metris的地址,但后面應(yīng)用數(shù)量越來越多,手動的添加就不太現(xiàn)實(shí)了,Prometheus支持服務(wù)發(fā)現(xiàn)等多種方式
Consul服務(wù)發(fā)現(xiàn)配置下篇:http://www.lxweimin.com/p/085edb535070
具體信息移步官網(wǎng) https://prometheus.io/docs/prometheus/latest/configuration/configuration/

創(chuàng)建Prometheus規(guī)則文件rules.yml
本地宿主機(jī)/root/prometheus/conf/下創(chuàng)建
下面監(jiān)控宿主機(jī)和容器的內(nèi)存,CPU,磁盤等狀態(tài)

groups:
- name: example #定義規(guī)則組
  rules:
  - alert: InstanceDown  #定義報(bào)警名稱
    expr: up == 0   #Promql語句,觸發(fā)規(guī)則
    for: 1m            # 一分鐘
    labels:       #標(biāo)簽定義報(bào)警的級別和主機(jī)
      name: instance
      severity: Critical
    annotations:  #注解
      summary: " {{ $labels.appname }}" #報(bào)警摘要,取報(bào)警信息的appname名稱
      description: " 服務(wù)停止運(yùn)行 "   #報(bào)警信息
      value: "{{ $value }}%"  # 當(dāng)前報(bào)警狀態(tài)值
- name: Host
  rules:
  - alert: HostMemory Usage
    expr: (node_memory_MemTotal_bytes - (node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes)) / node_memory_MemTotal_bytes * 100 >  80
    for: 1m
    labels:
      name: Memory
      severity: Warning
    annotations:
      summary: " {{ $labels.appname }} "
      description: "宿主機(jī)內(nèi)存使用率超過80%."
      value: "{{ $value }}"
  - alert: HostCPU Usage
    expr: sum(avg without (cpu)(irate(node_cpu_seconds_total{mode!='idle'}[5m]))) by (instance,appname) > 0.65
    for: 1m
    labels:
      name: CPU
      severity: Warning
    annotations:
      summary: " {{ $labels.appname }} "
      description: "宿主機(jī)CPU使用率超過65%."
      value: "{{ $value }}"
  - alert: HostLoad 
    expr: node_load5 > 4
    for: 1m
    labels:
      name: Load
      severity: Warning
    annotations:
      summary: "{{ $labels.appname }} "
      description: " 主機(jī)負(fù)載5分鐘超過4."
      value: "{{ $value }}"
  - alert: HostFilesystem Usage
    expr: 1-(node_filesystem_free_bytes / node_filesystem_size_bytes) >  0.8
    for: 1m
    labels:
      name: Disk
      severity: Warning
    annotations:
      summary: " {{ $labels.appname }} "
      description: " 宿主機(jī) [ {{ $labels.mountpoint }} ]分區(qū)使用超過80%."
      value: "{{ $value }}%"
  - alert: HostDiskio
    expr: irate(node_disk_writes_completed_total{job=~"Host"}[1m]) > 10
    for: 1m
    labels:
      name: Diskio
      severity: Warning
    annotations:
      summary: " {{ $labels.appname }} "
      description: " 宿主機(jī) [{{ $labels.device }}]磁盤1分鐘平均寫入IO負(fù)載較高."
      value: "{{ $value }}iops"
  - alert: Network_receive
    expr: irate(node_network_receive_bytes_total{device!~"lo|bond[0-9]|cbr[0-9]|veth.*|virbr.*|ovs-system"}[5m]) / 1048576  > 3 
    for: 1m
    labels:
      name: Network_receive
      severity: Warning
    annotations:
      summary: " {{ $labels.appname }} "
      description: " 宿主機(jī) [{{ $labels.device }}] 網(wǎng)卡5分鐘平均接收流量超過3Mbps."
      value: "{{ $value }}3Mbps"
  - alert: Network_transmit
    expr: irate(node_network_transmit_bytes_total{device!~"lo|bond[0-9]|cbr[0-9]|veth.*|virbr.*|ovs-system"}[5m]) / 1048576  > 3
    for: 1m
    labels:
      name: Network_transmit
      severity: Warning
    annotations:
      summary: " {{ $labels.appname }} "
      description: " 宿主機(jī) [{{ $labels.device }}] 網(wǎng)卡5分鐘內(nèi)平均發(fā)送流量超過3Mbps."
      value: "{{ $value }}3Mbps"
- name: Container
  rules:
  - alert: ContainerCPU Usage
    expr: (sum by(name,instance) (rate(container_cpu_usage_seconds_total{image!=""}[5m]))*100) > 60
    for: 1m
    labels:
      name: CPU
      severity: Warning
    annotations:
      summary: "{{ $labels.name }} "
      description: " 容器CPU使用超過60%."
      value: "{{ $value }}%"
  - alert: ContainerMem Usage
#    expr: (container_memory_usage_bytes - container_memory_cache)  / container_spec_memory_limit_bytes   * 100 > 10  
    expr:  container_memory_usage_bytes{name=~".+"}  / 1048576 > 1024
    for: 1m
    labels:
      name: Memory
      severity: Warning
    annotations:
      summary: "{{ $labels.name }} "
      description: " 容器內(nèi)存使用超過1GB."
      value: "{{ $value }}G"

部署Prometheus

docker run -d -p 9090:9090 --name=prometheus \
 -v  /root/prometheus/conf/:/etc/prometheus/  \
prom/prometheus 

上面采用的官方鏡像,因?yàn)閱訁?shù)沒有指定--web.enable-lifecycle,所以無法使用熱加載,時(shí)區(qū)也是相差八個(gè)小時(shí),我們可以通過官方提供的Dockerfile進(jìn)行修改
下載源碼包,制作Prometheus鏡像
https://github.com/prometheus/prometheus

FROM   centos:7
LABEL maintainer "The Prometheus Authors <prometheus-developers@googlegroups.com>, Custom by <leichen.china@gmail.com>"
COPY prometheus                             /bin/prometheus
COPY promtool                               /bin/promtool
COPY console_libraries/                     /usr/share/prometheus/console_libraries/
COPY consoles/                              /usr/share/prometheus/consoles/

WORKDIR    /prometheus
RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime
ENTRYPOINT [ "/bin/prometheus" ]
CMD        [ "--config.file=/etc/prometheus/prometheus.yml", \
             "--storage.tsdb.path=/prometheus", \
             "--web.console.libraries=/usr/share/prometheus/console_libraries", \
             "--web.enable-lifecycle", \
             "--web.console.templates=/usr/share/prometheus/consoles" ]

創(chuàng)建容器并運(yùn)行

docker build  -t prometheus:latest .
docker run -d -p 9090:9090 --name prometheus   -v  /root/prometheus/conf/:/etc/prometheus/    prometheus:latest

訪問prometheus的9090端口,可以查看監(jiān)控?cái)?shù)據(jù)


unmin.club

2. 部署Node-exporter

docker run -d -p 9100:9100   -v "/:/host:ro,rslave" quay.io/prometheus/node-exporter --path.rootfs /host

3. 部署Cadvisor-exporter

 docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --publish=8080:8080 --detach=true --name=cadvisor --net=host google/cadvisor:latest

訪問cadvisor的8080端口,可以看到容器的監(jiān)控指標(biāo)


unmin.club

4. 部署Jmx-exporter

下載jar :https://github.com/prometheus/jmx_exporter (jmx_prometheus_javaagent-0.11.0.jar )
配置文件: https://github.com/prometheus/jmx_exporter/tree/master/example_configs
中間件啟動參數(shù)添加:
CATALINA_OPTS="-javaagent:/app/tomcat-8.5.23/lib/jmx_prometheus_javaagent-0.11.0.jar=1234:/app/tomcat-8.5.23/conf/config.yaml"

具體查看http://www.unmin.club

5. Grafana安裝及配置

docker run -d -i -p 3000:3000 -e "GF_SERVER_ROOT_URL=http://grafana.server.name" -e "GF_SECURITY_ADMIN_PASSWORD=secret" --net=host grafana/grafana

web訪問 192.168.16.251:3000
user:admin,passwd:secret
首先我們添加數(shù)據(jù)源


unmin.club

import導(dǎo)入8919Node-exporter展示模板

unmin.club

針對容器和JMX的監(jiān)控模板,我們可以去https://grafana.com/dashboards自行查找。

6. 配置報(bào)警alertmanager

創(chuàng)建alertmanager.yml報(bào)警通知文件

global:
  resolve_timeout: 2m
  smtp_smarthost: smtp.163.com:25
  smtp_from: 12345678@163.com
  smtp_auth_username: 12345678@163.com
  smtp_auth_password: 123456 (授權(quán)碼)

templates:     ##消息模板
  - '/etc/alertmanager/template/wechat.tmpl'
route:
  group_by: ['alertname_wechat']
  group_wait: 30s
  group_interval: 60s
  receiver: 'wechat'    # 優(yōu)先使用wechat發(fā)送
  repeat_interval: 1h
  routes:  #子路由,使用email發(fā)送
  - receiver: email
    match_re: 
      serverity: email
receivers:
- name: 'email'
  email_configs:
  - to: '11111122@qq.com'
    send_resolved: true  # 發(fā)送已解決通知
- name: 'wechat'
  wechat_configs:
  - corp_id: 'wwd402ce40b1120f24' #企業(yè)ID
    to_party: '2'  # 通知組ID
    agent_id: '1000002'    
    api_secret: '9nmYa4pWq63sQ123kToCbh_oNc' # 生成的secret
    send_resolved: true

編寫微信通知模板

{{ define "wechat.default.message" }}
{{ range $i, $alert :=.Alerts }}
========監(jiān)控報(bào)警==========
告警狀態(tài):{{   .Status }}
告警級別:{{ $alert.Labels.severity }}
告警類型:{{ $alert.Labels.alertname }}
告警應(yīng)用:{{ $alert.Annotations.summary }}
告警主機(jī):{{ $alert.Labels.instance }}
告警詳情:{{ $alert.Annotations.description }}
觸發(fā)閥值:{{ $alert.Annotations.value }}
告警時(shí)間:{{ $alert.StartsAt.Format "2006-01-02 15:04:05" }}
========end=============
{{ end }}
{{ end }}

部署alertmanager

docker run -d -p 9093:9093 --name alertmanager  -v /root/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml -v /root/alertmanager/template:/etc/alertmanager/template docker.io/prom/alertmanager:latest

訪問alertmanager的9093端口,可以看到當(dāng)前報(bào)警狀態(tài)


unmin.club
unmin.club

unmin.club
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,517評論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,087評論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,521評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,493評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,207評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,603評論 1 325
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,624評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,813評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,364評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,110評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,305評論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,874評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,532評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,953評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,209評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,033評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,268評論 2 375